From aa34dce1d371dd7d6901801db312ea275bae7dd4 Mon Sep 17 00:00:00 2001 From: Dylan Beattie Date: Wed, 28 Aug 2024 17:18:14 +0200 Subject: [PATCH] Copy all code from old rockstar repo to new satriani archive repo --- .github/workflows/pegjs-and-test.yml | 32 + .gitignore | 332 + .obsidian/app.json | 1 + .obsidian/appearance.json | 3 + .obsidian/core-plugins-migration.json | 30 + .obsidian/core-plugins.json | 20 + .obsidian/workspace.json | 151 + CODE_OF_CONDUCT.md | 58 + CONTRIBUTING.md | 60 + LICENSE | 21 + README.md | 76 +- design-decisions.md | 10 + examples/99_beers.rock | 13 + examples/README.md | 14 + examples/The-Final-Stand.rock | 40 + examples/decimal_to_binary_converter.rock | 24 + examples/factorization.rock | 24 + examples/fizzbuzz-using-stacks-and-cast.rock | 48 + examples/fizzbuzz.rock | 25 + examples/fizzbuzz_minimalist.rock | 25 + examples/hello-world.rock | 31 + examples/isPalindrome.rock | 46 + examples/mandelbrot.rock | 50 + examples/nth-fibonacci.rock | 21 + examples/pi_approx.rock | 27 + examples/primes_with_input.rock | 45 + examples/primes_with_input_v2.rock | 46 + examples/rock_wine.rock | 109 + examples/rock_wine_minimalist.rock | 82 + examples/rot13.rock | 35 + rockstar-2.md | 304 + satriani/.gitignore | 2 + satriani/LICENSE | 21 + satriani/README.md | 118 + satriani/package-lock.json | 3258 ++ satriani/package.json | 36 + satriani/rockstar.js | 41 + satriani/rockstar.peg | 472 + satriani/satriani.interpreter.js | 440 + satriani/satriani.js | 18 + satriani/satriani.parser.cache.js | 6952 +++ satriani/test/comparison.js | 43 + satriani/test/test.js | 67 + satriani/yarn.lock | 1373 + spec.md | 657 + tests/README.md | 9 + tests/failures/invalid_comments.rock | 1 + tests/failures/invalid_comments.rock.err | 1 + tests/failures/reserved_definitely_maybe.rock | 1 + tests/failures/reserved_maybe.rock | 1 + tests/fixtures/arrays/array_functions.rock | 47 + .../fixtures/arrays/array_functions.rock.out | 25 + tests/fixtures/arrays/arrayalike.rock | 12 + tests/fixtures/arrays/arrayalike.rock.out | 8 + tests/fixtures/arrays/arrays.rock | 9 + tests/fixtures/arrays/arrays.rock.out | 5 + tests/fixtures/arrays/hash.rock | 18 + tests/fixtures/arrays/hash.rock.out | 8 + tests/fixtures/arrays/join.rock | 15 + tests/fixtures/arrays/join.rock.out | 4 + tests/fixtures/arrays/split.rock | 14 + tests/fixtures/arrays/split.rock.out | 10 + tests/fixtures/arrays/split_delimiters.rock | 15 + .../fixtures/arrays/split_delimiters.rock.out | 10 + .../assignment/compound_assignments.rock | 22 + .../assignment/compound_assignments.rock.out | 5 + tests/fixtures/assignment/lets.rock | 39 + tests/fixtures/assignment/lets.rock.out | 11 + .../fixtures/comments/chordpro_comments.rock | 11 + .../comments/chordpro_comments.rock.out | 3 + tests/fixtures/comments/complex_comments.rock | 15 + .../comments/complex_comments.rock.out | 5 + tests/fixtures/comments/simpleComments.rock | 7 + .../fixtures/comments/simpleComments.rock.out | 3 + tests/fixtures/comments/simple_comment.rock | 2 + tests/fixtures/conditionals/empty_if.rock | 3 + tests/fixtures/conditionals/empty_if.rock.out | 1 + .../conditionals/simpleConditionals.rock | 28 + .../conditionals/simpleConditionals.rock.out | 7 + .../fixtures/conditionals/truthinessTest.rock | 27 + .../conditionals/truthinessTest.rock.out | 4 + tests/fixtures/constants/constants.rock | 5 + tests/fixtures/constants/constants.rock.out | 2 + .../fixtures/control-flow/indented_else.rock | 11 + .../control-flow/indented_else.rock.out | 4 + tests/fixtures/control-flow/nested_loops.rock | 12 + .../control-flow/nested_loops.rock.out | 42 + tests/fixtures/control-flow/simpleLoops.rock | 9 + .../control-flow/simpleLoops.rock.out | 11 + tests/fixtures/equality/arrays.rock | 33 + tests/fixtures/equality/arrays.rock.out | 5 + tests/fixtures/equality/booleans.rock | 4 + tests/fixtures/equality/booleans.rock.out | 4 + .../fixtures/equality/equalityComparison.rock | 142 + .../equality/equalityComparison.rock.out | 110 + tests/fixtures/equality/mysterious.rock | 5 + tests/fixtures/equality/mysterious.rock.out | 5 + tests/fixtures/equality/negation.rock | 15 + tests/fixtures/equality/negation.rock.out | 15 + tests/fixtures/equality/nothing.rock | 9 + tests/fixtures/equality/nothing.rock.out | 8 + tests/fixtures/equality/null.rock | 5 + tests/fixtures/equality/null.rock.out | 5 + tests/fixtures/equality/numbers.rock | 17 + tests/fixtures/equality/numbers.rock.out | 17 + tests/fixtures/equality/strings.rock | 27 + tests/fixtures/equality/strings.rock.out | 27 + tests/fixtures/examples/99_beers.rock | 11 + tests/fixtures/examples/99_beers.rock.out | 396 + tests/fixtures/examples/factorial.rock | 11 + tests/fixtures/examples/factorial.rock.out | 2 + tests/fixtures/examples/fibonacci.rock | 9 + tests/fixtures/examples/fibonacci.rock.out | 1 + .../fixtures/examples/fizzbuzz-idiomatic.rock | 27 + .../examples/fizzbuzz-idiomatic.rock.out | 100 + .../examples/fizzbuzz-minimalist.rock | 26 + .../examples/fizzbuzz-minimalist.rock.out | 100 + tests/fixtures/examples/hello-world.rock | 31 + tests/fixtures/examples/hello-world.rock.out | 1 + .../fixtures/functions/aliases_for_takes.rock | 15 + .../functions/aliases_for_takes.rock.out | 2 + tests/fixtures/functions/array_arguments.rock | 13 + .../functions/array_arguments.rock.out | 8 + tests/fixtures/functions/functionCalls.rock | 30 + .../fixtures/functions/functionCalls.rock.out | 6 + .../functions/nested_function_scopes.rock | 14 + .../functions/nested_function_scopes.rock.out | 2 + .../fixtures/functions/nested_functions.rock | 16 + .../functions/nested_functions.rock.out | 2 + tests/fixtures/functions/recursion.rock | 8 + tests/fixtures/functions/recursion.rock.out | 1 + tests/fixtures/functions/simpleFunctions.rock | 24 + .../functions/simpleFunctions.rock.out | 8 + tests/fixtures/io/hello_number.rock | 5 + tests/fixtures/io/hello_number.rock.out | 5 + tests/fixtures/io/hello_world.rock | 3 + tests/fixtures/io/hello_world.rock.out | 3 + tests/fixtures/io/inputTest.rock | 8 + tests/fixtures/io/inputTest.rock.in | 5 + tests/fixtures/io/inputTest.rock.out | 2 + tests/fixtures/io/inputTest2.rock | 4 + tests/fixtures/io/inputTest2.rock.in | 4 + tests/fixtures/io/inputTest2.rock.out | 1 + tests/fixtures/literals/literalAliases.rock | 23 + .../fixtures/literals/literalAliases.rock.out | 19 + tests/fixtures/literals/literalstrings.rock | 2 + .../fixtures/literals/literalstrings.rock.out | 2 + tests/fixtures/literals/poeticLiterals.rock | 44 + .../fixtures/literals/poeticLiterals.rock.out | 17 + tests/fixtures/literals/poeticNumbers.rock | 20 + .../fixtures/literals/poeticNumbers.rock.out | 7 + tests/fixtures/math/operator_aliases.rock | 16 + tests/fixtures/math/operator_aliases.rock.out | 11 + tests/fixtures/math/operator_precedence.rock | 6 + .../math/operator_precedence.rock.out | 5 + tests/fixtures/math/operators.rock | 14 + tests/fixtures/math/operators.rock.out | 14 + tests/fixtures/math/rounding.rock | 32 + tests/fixtures/math/rounding.rock.out | 8 + tests/fixtures/math/rounding_pronouns.rock | 15 + .../fixtures/math/rounding_pronouns.rock.out | 4 + tests/fixtures/operators/addOperator.rock | 24 + tests/fixtures/operators/addOperator.rock.out | 14 + tests/fixtures/operators/andTest.rock | 15 + tests/fixtures/operators/andTest.rock.out | 9 + tests/fixtures/operators/booleans.rock | 12 + tests/fixtures/operators/booleans.rock.out | 7 + .../fixtures/operators/divisionOperator.rock | 4 + .../operators/divisionOperator.rock.out | 4 + .../operators/incrementAndDecrement.rock | 41 + .../operators/incrementAndDecrement.rock.out | 17 + .../list_expressions_arithmetic.rock | 37 + .../list_expressions_arithmetic.rock.out | 7 + .../operators/multiplicationOperator.rock | 7 + .../operators/multiplicationOperator.rock.out | 7 + tests/fixtures/operators/notTest.rock | 10 + tests/fixtures/operators/notTest.rock.out | 9 + tests/fixtures/operators/orNorTest.rock | 19 + tests/fixtures/operators/orNorTest.rock.out | 18 + .../operators/orderingComparison.rock | 94 + .../operators/orderingComparison.rock.out | 86 + .../fixtures/operators/subtractOperator.rock | 5 + .../operators/subtractOperator.rock.out | 4 + tests/fixtures/queues/pop.rock | 18 + tests/fixtures/queues/pop.rock.out | 10 + tests/fixtures/queues/push.rock | 25 + tests/fixtures/queues/push.rock.out | 16 + tests/fixtures/queues/queues.rock | 14 + tests/fixtures/queues/queues.rock.out | 9 + tests/fixtures/queues/string_queues.rock | 18 + tests/fixtures/queues/string_queues.rock.out | 6 + tests/fixtures/types/parsing.rock | 14 + tests/fixtures/types/parsing.rock.out | 5 + .../fixtures/variables/common_variables.rock | 85 + .../variables/common_variables.rock.out | 54 + tests/fixtures/variables/globalVariables.rock | 25 + .../variables/globalVariables.rock.out | 4 + tests/fixtures/variables/poeticStrings.rock | 17 + .../fixtures/variables/poeticStrings.rock.out | 6 + tests/fixtures/variables/pronouns.rock | 19 + tests/fixtures/variables/pronouns.rock.out | 7 + .../fixtures/variables/proper_variables.rock | 13 + .../variables/proper_variables.rock.out | 6 + tests/fixtures/variables/simple_pronouns.rock | 26 + .../variables/simple_pronouns.rock.out | 21 + .../fixtures/variables/simple_variables.rock | 44 + .../variables/simple_variables.rock.out | 23 + tests/fixtures/variables/umlauts.rock | 11 + tests/fixtures/variables/umlauts.rock.out | 3 + tests/fixtures/variables/writeGlobal.rock | 20 + tests/fixtures/variables/writeGlobal.rock.out | 4 + .../whitespace/apostrophesIgnored.rock | 10 + .../whitespace/apostrophesIgnored.rock.out | 3 + .../whitespace/leading_blank_lines.rock | 4 + .../whitespace/leading_blank_lines.rock.out | 1 + .../whitespace/leading_empty_lines.rock | 4 + .../whitespace/leading_empty_lines.rock.out | 1 + .../whitespace/leading_whitespace.rock | 6 + .../whitespace/leading_whitespace.rock.out | 27 + .../whitespace/no_newline_at_eof.rock | 2 + .../whitespace/no_newline_at_eof.rock.out | 1 + .../whitespace/trailing_blank_lines.rock | 3 + .../whitespace/trailing_blank_lines.rock.out | 1 + .../whitespace/trailing_empty_lines.rock | 3 + .../whitespace/trailing_empty_lines.rock.out | 1 + tools/example.rock | 31 + tools/index.html | 51 + tools/pegjs.org/css/benchmark.css | 34 + tools/pegjs.org/css/common.css | 8 + tools/pegjs.org/css/content.css | 343 + tools/pegjs.org/css/layout-default.css | 52 + tools/pegjs.org/css/layout-online.css | 100 + tools/pegjs.org/css/test.css | 323 + tools/pegjs.org/development/benchmark | 91 + tools/pegjs.org/development/test | 77 + tools/pegjs.org/documentation | 644 + tools/pegjs.org/favicon.ico | Bin 0 -> 318 bytes .../pegjs.org/img/spinner-16x16-progress.gif | Bin 0 -> 2227 bytes tools/pegjs.org/img/spinner-48x48.gif | Bin 0 -> 6354 bytes tools/pegjs.org/index.html | 100 + tools/pegjs.org/js/benchmark-bundle.js | 5917 +++ tools/pegjs.org/js/online.js | 222 + tools/pegjs.org/js/test-bundle.js | 38063 ++++++++++++++++ tools/pegjs.org/online.html | 105 + .../vendor/codemirror/codemirror.css | 1 + .../pegjs.org/vendor/codemirror/codemirror.js | 17 + tools/pegjs.org/vendor/jsdump/jsDump.js | 196 + tools/pegjs.org/vendor/pegjs/peg.js | 12 + tools/server.py | 14 + yarn.lock | 4 + 250 files changed, 64862 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/pegjs-and-test.yml create mode 100644 .gitignore create mode 100644 .obsidian/app.json create mode 100644 .obsidian/appearance.json create mode 100644 .obsidian/core-plugins-migration.json create mode 100644 .obsidian/core-plugins.json create mode 100644 .obsidian/workspace.json create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 design-decisions.md create mode 100644 examples/99_beers.rock create mode 100644 examples/README.md create mode 100644 examples/The-Final-Stand.rock create mode 100644 examples/decimal_to_binary_converter.rock create mode 100644 examples/factorization.rock create mode 100644 examples/fizzbuzz-using-stacks-and-cast.rock create mode 100644 examples/fizzbuzz.rock create mode 100644 examples/fizzbuzz_minimalist.rock create mode 100644 examples/hello-world.rock create mode 100644 examples/isPalindrome.rock create mode 100644 examples/mandelbrot.rock create mode 100644 examples/nth-fibonacci.rock create mode 100644 examples/pi_approx.rock create mode 100644 examples/primes_with_input.rock create mode 100644 examples/primes_with_input_v2.rock create mode 100644 examples/rock_wine.rock create mode 100644 examples/rock_wine_minimalist.rock create mode 100644 examples/rot13.rock create mode 100644 rockstar-2.md create mode 100644 satriani/.gitignore create mode 100644 satriani/LICENSE create mode 100644 satriani/README.md create mode 100644 satriani/package-lock.json create mode 100644 satriani/package.json create mode 100644 satriani/rockstar.js create mode 100644 satriani/rockstar.peg create mode 100644 satriani/satriani.interpreter.js create mode 100644 satriani/satriani.js create mode 100644 satriani/satriani.parser.cache.js create mode 100644 satriani/test/comparison.js create mode 100644 satriani/test/test.js create mode 100644 satriani/yarn.lock create mode 100644 spec.md create mode 100644 tests/README.md create mode 100644 tests/failures/invalid_comments.rock create mode 100644 tests/failures/invalid_comments.rock.err create mode 100644 tests/failures/reserved_definitely_maybe.rock create mode 100644 tests/failures/reserved_maybe.rock create mode 100644 tests/fixtures/arrays/array_functions.rock create mode 100644 tests/fixtures/arrays/array_functions.rock.out create mode 100644 tests/fixtures/arrays/arrayalike.rock create mode 100644 tests/fixtures/arrays/arrayalike.rock.out create mode 100644 tests/fixtures/arrays/arrays.rock create mode 100644 tests/fixtures/arrays/arrays.rock.out create mode 100644 tests/fixtures/arrays/hash.rock create mode 100644 tests/fixtures/arrays/hash.rock.out create mode 100644 tests/fixtures/arrays/join.rock create mode 100644 tests/fixtures/arrays/join.rock.out create mode 100644 tests/fixtures/arrays/split.rock create mode 100644 tests/fixtures/arrays/split.rock.out create mode 100644 tests/fixtures/arrays/split_delimiters.rock create mode 100644 tests/fixtures/arrays/split_delimiters.rock.out create mode 100644 tests/fixtures/assignment/compound_assignments.rock create mode 100644 tests/fixtures/assignment/compound_assignments.rock.out create mode 100644 tests/fixtures/assignment/lets.rock create mode 100644 tests/fixtures/assignment/lets.rock.out create mode 100644 tests/fixtures/comments/chordpro_comments.rock create mode 100644 tests/fixtures/comments/chordpro_comments.rock.out create mode 100644 tests/fixtures/comments/complex_comments.rock create mode 100644 tests/fixtures/comments/complex_comments.rock.out create mode 100644 tests/fixtures/comments/simpleComments.rock create mode 100644 tests/fixtures/comments/simpleComments.rock.out create mode 100644 tests/fixtures/comments/simple_comment.rock create mode 100644 tests/fixtures/conditionals/empty_if.rock create mode 100644 tests/fixtures/conditionals/empty_if.rock.out create mode 100644 tests/fixtures/conditionals/simpleConditionals.rock create mode 100644 tests/fixtures/conditionals/simpleConditionals.rock.out create mode 100644 tests/fixtures/conditionals/truthinessTest.rock create mode 100644 tests/fixtures/conditionals/truthinessTest.rock.out create mode 100644 tests/fixtures/constants/constants.rock create mode 100644 tests/fixtures/constants/constants.rock.out create mode 100644 tests/fixtures/control-flow/indented_else.rock create mode 100644 tests/fixtures/control-flow/indented_else.rock.out create mode 100644 tests/fixtures/control-flow/nested_loops.rock create mode 100644 tests/fixtures/control-flow/nested_loops.rock.out create mode 100644 tests/fixtures/control-flow/simpleLoops.rock create mode 100644 tests/fixtures/control-flow/simpleLoops.rock.out create mode 100644 tests/fixtures/equality/arrays.rock create mode 100644 tests/fixtures/equality/arrays.rock.out create mode 100644 tests/fixtures/equality/booleans.rock create mode 100644 tests/fixtures/equality/booleans.rock.out create mode 100644 tests/fixtures/equality/equalityComparison.rock create mode 100644 tests/fixtures/equality/equalityComparison.rock.out create mode 100644 tests/fixtures/equality/mysterious.rock create mode 100644 tests/fixtures/equality/mysterious.rock.out create mode 100644 tests/fixtures/equality/negation.rock create mode 100644 tests/fixtures/equality/negation.rock.out create mode 100644 tests/fixtures/equality/nothing.rock create mode 100644 tests/fixtures/equality/nothing.rock.out create mode 100644 tests/fixtures/equality/null.rock create mode 100644 tests/fixtures/equality/null.rock.out create mode 100644 tests/fixtures/equality/numbers.rock create mode 100644 tests/fixtures/equality/numbers.rock.out create mode 100644 tests/fixtures/equality/strings.rock create mode 100644 tests/fixtures/equality/strings.rock.out create mode 100644 tests/fixtures/examples/99_beers.rock create mode 100644 tests/fixtures/examples/99_beers.rock.out create mode 100644 tests/fixtures/examples/factorial.rock create mode 100644 tests/fixtures/examples/factorial.rock.out create mode 100644 tests/fixtures/examples/fibonacci.rock create mode 100644 tests/fixtures/examples/fibonacci.rock.out create mode 100644 tests/fixtures/examples/fizzbuzz-idiomatic.rock create mode 100644 tests/fixtures/examples/fizzbuzz-idiomatic.rock.out create mode 100644 tests/fixtures/examples/fizzbuzz-minimalist.rock create mode 100644 tests/fixtures/examples/fizzbuzz-minimalist.rock.out create mode 100644 tests/fixtures/examples/hello-world.rock create mode 100644 tests/fixtures/examples/hello-world.rock.out create mode 100644 tests/fixtures/functions/aliases_for_takes.rock create mode 100644 tests/fixtures/functions/aliases_for_takes.rock.out create mode 100644 tests/fixtures/functions/array_arguments.rock create mode 100644 tests/fixtures/functions/array_arguments.rock.out create mode 100644 tests/fixtures/functions/functionCalls.rock create mode 100644 tests/fixtures/functions/functionCalls.rock.out create mode 100644 tests/fixtures/functions/nested_function_scopes.rock create mode 100644 tests/fixtures/functions/nested_function_scopes.rock.out create mode 100644 tests/fixtures/functions/nested_functions.rock create mode 100644 tests/fixtures/functions/nested_functions.rock.out create mode 100644 tests/fixtures/functions/recursion.rock create mode 100644 tests/fixtures/functions/recursion.rock.out create mode 100644 tests/fixtures/functions/simpleFunctions.rock create mode 100644 tests/fixtures/functions/simpleFunctions.rock.out create mode 100644 tests/fixtures/io/hello_number.rock create mode 100644 tests/fixtures/io/hello_number.rock.out create mode 100644 tests/fixtures/io/hello_world.rock create mode 100644 tests/fixtures/io/hello_world.rock.out create mode 100644 tests/fixtures/io/inputTest.rock create mode 100644 tests/fixtures/io/inputTest.rock.in create mode 100644 tests/fixtures/io/inputTest.rock.out create mode 100644 tests/fixtures/io/inputTest2.rock create mode 100644 tests/fixtures/io/inputTest2.rock.in create mode 100644 tests/fixtures/io/inputTest2.rock.out create mode 100644 tests/fixtures/literals/literalAliases.rock create mode 100644 tests/fixtures/literals/literalAliases.rock.out create mode 100644 tests/fixtures/literals/literalstrings.rock create mode 100644 tests/fixtures/literals/literalstrings.rock.out create mode 100644 tests/fixtures/literals/poeticLiterals.rock create mode 100644 tests/fixtures/literals/poeticLiterals.rock.out create mode 100644 tests/fixtures/literals/poeticNumbers.rock create mode 100644 tests/fixtures/literals/poeticNumbers.rock.out create mode 100644 tests/fixtures/math/operator_aliases.rock create mode 100644 tests/fixtures/math/operator_aliases.rock.out create mode 100644 tests/fixtures/math/operator_precedence.rock create mode 100644 tests/fixtures/math/operator_precedence.rock.out create mode 100644 tests/fixtures/math/operators.rock create mode 100644 tests/fixtures/math/operators.rock.out create mode 100644 tests/fixtures/math/rounding.rock create mode 100644 tests/fixtures/math/rounding.rock.out create mode 100644 tests/fixtures/math/rounding_pronouns.rock create mode 100644 tests/fixtures/math/rounding_pronouns.rock.out create mode 100644 tests/fixtures/operators/addOperator.rock create mode 100644 tests/fixtures/operators/addOperator.rock.out create mode 100644 tests/fixtures/operators/andTest.rock create mode 100644 tests/fixtures/operators/andTest.rock.out create mode 100644 tests/fixtures/operators/booleans.rock create mode 100644 tests/fixtures/operators/booleans.rock.out create mode 100644 tests/fixtures/operators/divisionOperator.rock create mode 100644 tests/fixtures/operators/divisionOperator.rock.out create mode 100644 tests/fixtures/operators/incrementAndDecrement.rock create mode 100644 tests/fixtures/operators/incrementAndDecrement.rock.out create mode 100644 tests/fixtures/operators/list_expressions_arithmetic.rock create mode 100644 tests/fixtures/operators/list_expressions_arithmetic.rock.out create mode 100644 tests/fixtures/operators/multiplicationOperator.rock create mode 100644 tests/fixtures/operators/multiplicationOperator.rock.out create mode 100644 tests/fixtures/operators/notTest.rock create mode 100644 tests/fixtures/operators/notTest.rock.out create mode 100644 tests/fixtures/operators/orNorTest.rock create mode 100644 tests/fixtures/operators/orNorTest.rock.out create mode 100644 tests/fixtures/operators/orderingComparison.rock create mode 100644 tests/fixtures/operators/orderingComparison.rock.out create mode 100644 tests/fixtures/operators/subtractOperator.rock create mode 100644 tests/fixtures/operators/subtractOperator.rock.out create mode 100644 tests/fixtures/queues/pop.rock create mode 100644 tests/fixtures/queues/pop.rock.out create mode 100644 tests/fixtures/queues/push.rock create mode 100644 tests/fixtures/queues/push.rock.out create mode 100644 tests/fixtures/queues/queues.rock create mode 100644 tests/fixtures/queues/queues.rock.out create mode 100644 tests/fixtures/queues/string_queues.rock create mode 100644 tests/fixtures/queues/string_queues.rock.out create mode 100644 tests/fixtures/types/parsing.rock create mode 100644 tests/fixtures/types/parsing.rock.out create mode 100644 tests/fixtures/variables/common_variables.rock create mode 100644 tests/fixtures/variables/common_variables.rock.out create mode 100644 tests/fixtures/variables/globalVariables.rock create mode 100644 tests/fixtures/variables/globalVariables.rock.out create mode 100644 tests/fixtures/variables/poeticStrings.rock create mode 100644 tests/fixtures/variables/poeticStrings.rock.out create mode 100644 tests/fixtures/variables/pronouns.rock create mode 100644 tests/fixtures/variables/pronouns.rock.out create mode 100644 tests/fixtures/variables/proper_variables.rock create mode 100644 tests/fixtures/variables/proper_variables.rock.out create mode 100644 tests/fixtures/variables/simple_pronouns.rock create mode 100644 tests/fixtures/variables/simple_pronouns.rock.out create mode 100644 tests/fixtures/variables/simple_variables.rock create mode 100644 tests/fixtures/variables/simple_variables.rock.out create mode 100644 tests/fixtures/variables/umlauts.rock create mode 100644 tests/fixtures/variables/umlauts.rock.out create mode 100644 tests/fixtures/variables/writeGlobal.rock create mode 100644 tests/fixtures/variables/writeGlobal.rock.out create mode 100644 tests/fixtures/whitespace/apostrophesIgnored.rock create mode 100644 tests/fixtures/whitespace/apostrophesIgnored.rock.out create mode 100644 tests/fixtures/whitespace/leading_blank_lines.rock create mode 100644 tests/fixtures/whitespace/leading_blank_lines.rock.out create mode 100644 tests/fixtures/whitespace/leading_empty_lines.rock create mode 100644 tests/fixtures/whitespace/leading_empty_lines.rock.out create mode 100644 tests/fixtures/whitespace/leading_whitespace.rock create mode 100644 tests/fixtures/whitespace/leading_whitespace.rock.out create mode 100644 tests/fixtures/whitespace/no_newline_at_eof.rock create mode 100644 tests/fixtures/whitespace/no_newline_at_eof.rock.out create mode 100644 tests/fixtures/whitespace/trailing_blank_lines.rock create mode 100644 tests/fixtures/whitespace/trailing_blank_lines.rock.out create mode 100644 tests/fixtures/whitespace/trailing_empty_lines.rock create mode 100644 tests/fixtures/whitespace/trailing_empty_lines.rock.out create mode 100644 tools/example.rock create mode 100644 tools/index.html create mode 100644 tools/pegjs.org/css/benchmark.css create mode 100644 tools/pegjs.org/css/common.css create mode 100644 tools/pegjs.org/css/content.css create mode 100644 tools/pegjs.org/css/layout-default.css create mode 100644 tools/pegjs.org/css/layout-online.css create mode 100644 tools/pegjs.org/css/test.css create mode 100644 tools/pegjs.org/development/benchmark create mode 100644 tools/pegjs.org/development/test create mode 100644 tools/pegjs.org/documentation create mode 100644 tools/pegjs.org/favicon.ico create mode 100644 tools/pegjs.org/img/spinner-16x16-progress.gif create mode 100644 tools/pegjs.org/img/spinner-48x48.gif create mode 100644 tools/pegjs.org/index.html create mode 100644 tools/pegjs.org/js/benchmark-bundle.js create mode 100644 tools/pegjs.org/js/online.js create mode 100644 tools/pegjs.org/js/test-bundle.js create mode 100644 tools/pegjs.org/online.html create mode 100644 tools/pegjs.org/vendor/codemirror/codemirror.css create mode 100644 tools/pegjs.org/vendor/codemirror/codemirror.js create mode 100644 tools/pegjs.org/vendor/jsdump/jsDump.js create mode 100644 tools/pegjs.org/vendor/pegjs/peg.js create mode 100644 tools/server.py create mode 100644 yarn.lock diff --git a/.github/workflows/pegjs-and-test.yml b/.github/workflows/pegjs-and-test.yml new file mode 100644 index 0000000..ee2a34b --- /dev/null +++ b/.github/workflows/pegjs-and-test.yml @@ -0,0 +1,32 @@ +# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Build parser and run tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + # node-version: [12.x, 14.x, 16.x] + node-version: [16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + # cache: 'npm' + - name: Yarn all the things + working-directory: ./satriani + run: | + yarn install + yarn pegjs + yarn test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b631be6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,332 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +._* \ No newline at end of file diff --git a/.obsidian/app.json b/.obsidian/app.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json new file mode 100644 index 0000000..c8c365d --- /dev/null +++ b/.obsidian/appearance.json @@ -0,0 +1,3 @@ +{ + "accentColor": "" +} \ No newline at end of file diff --git a/.obsidian/core-plugins-migration.json b/.obsidian/core-plugins-migration.json new file mode 100644 index 0000000..436f43c --- /dev/null +++ b/.obsidian/core-plugins-migration.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json new file mode 100644 index 0000000..9405bfd --- /dev/null +++ b/.obsidian/core-plugins.json @@ -0,0 +1,20 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "bookmarks", + "outline", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json new file mode 100644 index 0000000..fcbb245 --- /dev/null +++ b/.obsidian/workspace.json @@ -0,0 +1,151 @@ +{ + "main": { + "id": "0ccb4f25a00d801e", + "type": "split", + "children": [ + { + "id": "b446a303a064afa7", + "type": "tabs", + "children": [ + { + "id": "2628a240602d50df", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "rockstar-2.md", + "mode": "source", + "source": false + } + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "f690222422428971", + "type": "split", + "children": [ + { + "id": "0d09fb9a066e2e1b", + "type": "tabs", + "children": [ + { + "id": "d63958cb6777fd12", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "edfaaca8776d8fca", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "42df576a0b3c3273", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "d9851b42a3243e36", + "type": "split", + "children": [ + { + "id": "8bcd16d8bb3a85be", + "type": "tabs", + "children": [ + { + "id": "831e26003812585b", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "rockstar-2.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "947fceb37d61fad5", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "rockstar-2.md", + "linksCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "d9df56ca7c325aba", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + }, + { + "id": "6aacb9c7afabddf1", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "rockstar-2.md" + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "left-ribbon": { + "hiddenItems": { + "switcher:Open quick switcher": false, + "graph:Open graph view": false, + "canvas:Create new canvas": false, + "daily-notes:Open today's daily note": false, + "templates:Insert template": false, + "command-palette:Open command palette": false + } + }, + "active": "2628a240602d50df", + "lastOpenFiles": [] +} \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..242f8f6 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,58 @@ +## Rockstar: Contributor Code of Conduct + +### TL;DR + +* Be excellent to each other. + +### Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +### Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +### A Note about Rockstar + +Rockstar is a little different to most open source software projects. For starters, it's a joke. A joke with a formal specification and multiple implementations, but please remember - we're doing this for a laugh. Please don't spoil the fun. + +Rockstar is also directly influenced by rock and heavy metal music, which puts this project in an unusual position. Rock music itself is rife with 'sexualized language and imagery', 'derogatory comments', 'political attacks', and all sorts of behaviour and material which would be 'considered inappropriate in a professional setting'. + +This is not a licence to be deliberately provocative or offensive, and we won't tolerate harassment, bullying or personal attacks. But if you find the sort of themes and imagery used in rock and metal music offensive, or you work in an environment where these things could cause a problem, please be warned that this project might contain material you find objectionable. + +### Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +### Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +### Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [hello@codewithrockstar.com](mailto:hello@codewithrockstar.com). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..31cf7e5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,60 @@ +# How to contribute to Rockstar + +> "Rockstar was never intended to be more than a joke - a parody spec that I threw together in a couple +of hours in a bar one evening. The amount of interest and enthusiasm that this project has generated +has been astonishing, and wonderful, but – perhaps inevitably – there are a LOT of things in the initial Rockstar spec that +made perfect sense when it was a joke spec but have proved incredibly difficult to actually implement. +> +> "Over the last six months, the entire Rockstar project has been through a sort of massive red/green/refactor cycle - +> creating tests to validate core language features, building implementations that pass those tests, and then looking +> at ways to clean up and harmonise those implementations. +> +> Thanks to the ongoing efforts of Rockstar developers around the world, we've ironed out most of the contradictions, +> resolved dozens of ambiguities and gotchas in the original spec, and come up with something that's probably good +> enough to call a 'release candidate'. But I have a funny feeling like this is still only the beginning. :) +> +>         - @dylanbeattie, January 2019 + +## Ways you can contribute + +First, make sure you've read the [code of conduct](CODE_OF_CONDUCT.md). TL;DR: be excellent to each other. Be calm, be +kind, help make Rockstar a community where new faces feel welcome and old hands feel appreciated. + +* Report a bug. If you've found something that doesn't work, let us know. +* Suggest a new feature. +* Write a great Rockstar program we can add to our examples +* Create your own implementation of Rockstar + +### Reporting bugs + +If you've found a bug in the specification or in the Satriani implementation, let us know about it. +* Search the [Issues](https://github.com/rockstarlang/rockstar/issues) to check we're not already tracking it. +* If you can't find an open issue that describes your problem, [open a new one](https://github.com/RockstarLang/rockstar/issues/new). + * Include a **title and clear description** + * Describe: + * What you did (ideally with a code sample) + * What you expected to happen + * What actually happened, including any error messages or program output. + +### Fixing Bugs + +If you've fixed an open bug - awesome! You're a true Rockstar developer. +* Open a new GitHub pull request with your patch. Pull requests should include: + * The fix itself + * One or more test cases in the form of `.rock` programs demonstrating the bug, that + should FAIL on an unpatched implementation and PASS with your patch in place. + * Updates to any associated documentation or examples + +### Contributing Features + +If you've got a great idea for a Rockstar language feature, start by checking +[issues](https://github.com/rockstarlang/rockstar/issues) to check we're not already tracking it, or that your idea +hasn't already been rejected. + +If not, start by [opening an issue](https://github.com/RockstarLang/rockstar/issues/new) that describes your idea. If +you want to chat to some of the core team about it first, hop onto the +[Rockstar Developers channel on Discord](https://discordapp.com/invite/xsQK7UU) and tell us what you're thinking. + +Remember, a good Rockstar feature is one that extends the capabilities of the language *and* allows developers the +kind of lyrical creativity that makes for great Rockstar programs. + \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a2401e4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Dylan Beattie + +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.md b/README.md index de3f609..ffdfe76 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,74 @@ -# satriani -JavaScript interpreter for Rockstar 1.0 +``` + _____ _____ ______ ___ ______________ ____ ______ +| _ \ / _ \ / ___/ /| / / / ______ _// || _ \ +| |_) )/ / \ \/ / / |/ / ( (___ | | / || |_) ) +| /( ( ) ( | \ \____ \ | |/ /| || / +| |\ \ \ \_/ /\ \___ | |\ \ _____) )| // / | || |\ \ +|__| \ \ \_____/ \_____||__| \__\\______/ |//__/ |__||__| \__\ + \ | ------------------------------------------------------ + \ | h t t p s : // c o d e w i t h r o c k s t a r . c o m + \| ------------------------------------------------------ +``` + +Rockstar is a dynamically typed computer programming language, designed for creating programs that are also song lyrics. Rockstar is heavily influenced by the lyrical conventions of 1980s hard rock and power ballads. + +### But why? + +Mainly because if we make Rockstar a real (and completely pointless) programming language, then recruiters and hiring managers won't be able to talk about 'rockstar developers' any more. + +Also 'cos it's kinda fun and any language based on the idea of compiling Meatloaf lyrics has to be worth a look, right? + +Plus we can make stickers. Who doesn't want a sticker on their laptop saying 'CERTIFIED ROCKSTAR DEVELOPER'? + +## What's here? + +* The [Rockstar language specification](spec.md) +* How to [contribute to Rockstar](CONTRIBUTING.md) +* Some [examples of Rockstar programs](examples/README.md) + +## Implementations + +The official reference implementation is [Satriani](https://github.com/RockstarLang/rockstar/tree/master/satriani) - written in JavaScript, it runs in browsers and supports NodeJS for server-side and larger projects. + +[Rocky](https://github.com/gaborsch/rocky) is a fully spec-compliant Rockstar implementation written in Java, and is currently the only Rockstar implementation that includes support for the DEC64 numeric type that was described in the original language specification. + +Other implementations: + +* [rockstar-js](https://github.com/wolfgang42/rockstar-js) - Rockstar-to-JavaScript transpiler +* [rockstar-lexer](https://github.com/aitorres/rockstar-lexer) - Rockstar lexer written in Haskell with Alex +* [rockstar-java](https://github.com/nbrevu/rockstar-java) - Rockstar interpreter in Java +* [rockstar-ml](https://github.com/lkwq007/rockstar-ml) - Rockstar interpreter in OCaml +* [rockstar-py](https://github.com/yanorestes/rockstar-py) - Rockstar-to-Python transpiler +* [kaiser-ruby](https://github.com/marcinruszkiewicz/kaiser-ruby) - Rockstar to Ruby transpiler +* [sublime-rockstar-syntax](https://github.com/paxromana96/sublime-rockstar-syntax) - Syntax highlighter for Sublime Text 3 +* [language-rockstar](https://github.com/thestd/language-rockstar) - Syntax highlighter for Atom +* [maiden](https://github.com/palfrey/maiden) - Rockstar interpreter in Rust ([online version using WebAssembly](https://palfrey.github.io/maiden/)) +* [thrash](https://github.com/young-steveo/thrash) - Rockstar implementation in Go +* [rockstar-webpiler](https://github.com/cwfitzgerald/rockstar-webpiler) - Online Rockstar Parser and Transpiler. [rockstar.connorwfitzgerald.com](https://rockstar.connorwfitzgerald.com) +* [wasm-rocks](https://github.com/boyanio/wasm-rocks) - Online Rockstar-to-WebAssembly compiler +* [vim-rockstar](https://github.com/sirosen/vim-rockstar) - Syntax highlighting for vim +* [vscode-rockstar-language](https://github.com/ra100/vscode-rockstar-language) - Syntax highlighting for VSCode +* [chirp](https://github.com/Suloch/chirp) - Rockstar interpreter in C using flex and yacc +* [rockstar-feat-csharp](https://github.com/theolivenbaum/rockstar-feat-csharp) - Embed Rockstar on your C# code using source-code generators +* [sellout](https://github.com/davidadsit/sellout) - Rockstar to C# (dotnet core) transpiler +* [native-rockstar](https://github.com/gillesdami/native-rockstar) - Rockstar to C++ transpiler in javascript. +* [rokkstar](https://github.com/ascheja/rokkstar) - Rockstar parser and interpreter written in Kotlin. + +## Social Spaces +* [Rockstar on Rosetta Code](http://www.rosettacode.org/wiki/Category:Rockstar) +* [/r/RockstarDevs](https://www.reddit.com/r/RockstarDevs/) - Subreddit +* [Rockstar Developers](https://discordapp.com/invite/xsQK7UU) - Discord Group + +## Media Coverage +* [Meet the boffin behind a computer programming language based on power ballads](https://www.loudersound.com/features/meet-the-boffin-behind-a-computer-programming-language-based-on-power-ballads) in Classic Rock magazine. +* [Rockstar article on BoingBoing](https://boingboing.net/2018/07/25/hello-cleveland-world.html) +* [Rockstar on HackerNews](https://news.ycombinator.com/item?id=17585589) +* [Rockstar on /r/ProgrammerHumor](https://www.reddit.com/r/ProgrammerHumor/comments/934uvw/why_yes_i_am_a_certified_rockstar_developer/) +* [Rockstar on dice.com](https://insights.dice.com/2018/07/27/rockstar-programming-language-developers/) +* [The Rockstar Programming Language | Mitigated Frenzy](https://bparsia.wordpress.com/2018/09/11/the-rockstar-programming-language/) - see also their solution to the [Rainfall problem](https://bparsia.wordpress.com/2018/09/12/rockstar-rainfall-problem/#comment-1624) +* [Rockstar reference on Coding Blocks Podcast](https://www.codingblocks.net/podcast/lightning-talks/) +* [Rockstar on .NET Rocks! Podcast](https://www.dotnetrocks.com/?show=1636) + +## See Also + +* [Enterprise™](https://github.com/joaomilho/Enterprise) - "The world is not made only of Rockstar programmers. For all the non hipsters out there, now there's Enterprise™" diff --git a/design-decisions.md b/design-decisions.md new file mode 100644 index 0000000..93d5b46 --- /dev/null +++ b/design-decisions.md @@ -0,0 +1,10 @@ +Rockstar .NET interpreter - Design Decisions + +Names + +Use good names. If the name you want conflicts with part of the .NET namespace or a built-in type, use a heavy metal umlaut + +`Program` => `Prögram` + +`String` => `Strïng` + diff --git a/examples/99_beers.rock b/examples/99_beers.rock new file mode 100644 index 0000000..d391465 --- /dev/null +++ b/examples/99_beers.rock @@ -0,0 +1,13 @@ +{Title: 99 Bottles of Beer} +{Artist: Traditional} + +[D]Your heart says bottles of beer on the wall +[G]Your soul says bottles of beer +[A]Carol says Take one down, pass it around +[G]The beers were numbering fa'too'many +[D]While the beers ain't nothing +[G]Say it with your heart +[A]Say it with your soul +[D]Say Carol, +[A]Knock the beers down +[D]Say it with your heart diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..89d2efa --- /dev/null +++ b/examples/README.md @@ -0,0 +1,14 @@ +## Examples of Rockstar Code + +Rockstar is specifically designed to allow the programmer to express the same set of operations in many different ways - that's part of what makes it fun; the challenge of coming up with programs that also look like vaguely plausible rock lyrics. + +This can make it kinda hard to work out exactly what's going on, so for examples, we tend to use two different styles of Rockstar code. One is what we call *minimalist Rockstar*, which avoids the more esoteric features of the language in favour of something that's clear and succint, with copious use of comments to explain what's going on. + +The other is known as *idiomatic Rockstar*, where we encourage developers to use all the capabilities of the language to create programs that are also rock songs. + +### Examples + +* Fizzbuzz in [idiomatic Rockstar](fizzbuzz.rock) | [minimalist Rockstar](fizzbuzz_minimalist.rock) + +Want to contribute your own examples? Go for it - fork this repo, add your samples to the `examples` folder, and open a pull request. + diff --git a/examples/The-Final-Stand.rock b/examples/The-Final-Stand.rock new file mode 100644 index 0000000..742c30c --- /dev/null +++ b/examples/The-Final-Stand.rock @@ -0,0 +1,40 @@ +Listen to the mountain. +It says "I am their hearts!" +Shout it! + +The wind is whispering. +It says "I am their breaths!" +Shout it! + +The call is deafening. +Fear is slowly overcoming us. +My eyes are full of rage. +Let them be silent. + +Soon is the final day coming. +They are waiting to give their lives. +Let it be over soon. + +The dawn is upon us. +The march is shaking the ground. +The spears are like trees. +My brothers are silent. + +Scream my brothers! +Rage is just! +Rage is true! +Rage! + +The spears is what I will last see. +The march is what I will last hear. +The dawn is what will last caress me. + +My name is the mountain! +My breath is the wind! +My faith is my name without my breath! +My story is my faith! +My life is my story! + +Roll my life into a book. +Let the title be "The Final Stand" +Shout the title! diff --git a/examples/decimal_to_binary_converter.rock b/examples/decimal_to_binary_converter.rock new file mode 100644 index 0000000..4e5ea03 --- /dev/null +++ b/examples/decimal_to_binary_converter.rock @@ -0,0 +1,24 @@ +Pain takes Cause and Effect +while Cause is as high as Effect +Put Cause minus Effect into Cause + +Give back Cause + +Listen to Your Passion +Rock God +Their Power is earthshaking +The World is everything +while Your Passion is higher than The World +Put Pain taking Your Passion & Their Power into Courage +Rock God with Courage +Let Your Passion be over Their Power +turn down Your Passion + +The Devil is 666 +Let the Devil be without 666 +Let the Devil be with God +Knock the Devil down + +while the Devil is as high as The World +shout God at the Devil +Knock the Devil down diff --git a/examples/factorization.rock b/examples/factorization.rock new file mode 100644 index 0000000..08a42b8 --- /dev/null +++ b/examples/factorization.rock @@ -0,0 +1,24 @@ +Depression takes your hope and your light +While your hope is as high as your light +Put your hope without your light into your hope + +If your hope is gone +Give back yes + +Give back lies + + +Listen to your heart +My world is selflessness +Your faith is forgiveness +While your heart is bigger than your faith and depression taking your heart, my world +Whisper my world +Put your heart over my world into your heart + +Build my world up +While your heart is bigger than your faith +While your heart is bigger than your faith and depression taking your heart, my world +Scream my world +Put your heart over my world into your heart + +Build my world up, up diff --git a/examples/fizzbuzz-using-stacks-and-cast.rock b/examples/fizzbuzz-using-stacks-and-cast.rock new file mode 100644 index 0000000..c3d1e65 --- /dev/null +++ b/examples/fizzbuzz-using-stacks-and-cast.rock @@ -0,0 +1,48 @@ +Eternity takes the pain. +The prize is silence +Until the pain is nothing, +Roll the pain into violence, +Cast violence into your lies, +Let the prize be with your lies. + +Give back the prize + +Midnight takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart + +Give back your heart + +My dreams are diamond nightmares +My suffering is the sea +My screams are hollow hatred +Your love is meaningless to me + +Rock my dreams like a razorblade smile +Rock my dreams with your love, your love +Rock my screams like a switchblade missile +Rock my screams with your love, your love. + +Cast my suffering into starlight +Let surrender be eternity taking my dreams +Let salvation be eternity taking my screams + +Desire is a lovestruck ladykiller +My world is nothing +Fire is ice +Hate is water +Until my world is desire, +Build my world up +If midnight taking my world, fire is nothing and midnight taking my world, hate is nothing +Shout surrender with salvation with starlight +Take it to the top + +If midnight taking my world, fire is nothing +Shout surrender with starlight +Take it to the top + +If midnight taking my world, hate is nothing +Shout salvation with starlight +Take it to the top + +Whisper my world diff --git a/examples/fizzbuzz.rock b/examples/fizzbuzz.rock new file mode 100644 index 0000000..4c56df8 --- /dev/null +++ b/examples/fizzbuzz.rock @@ -0,0 +1,25 @@ +Midnight takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart + +Give back your heart + +Desire is a lovestruck ladykiller +My world is nothing +Fire is ice +Hate is water +Until my world is Desire, +Build my world up +If Midnight taking my world, Fire is nothing and Midnight taking my world, Hate is nothing +Shout "FizzBuzz!" +Take it to the top + +If Midnight taking my world, Fire is nothing +Shout "Fizz!" +Take it to the top + +If Midnight taking my world, Hate is nothing +Say "Buzz!" +Take it to the top + +Whisper my world diff --git a/examples/fizzbuzz_minimalist.rock b/examples/fizzbuzz_minimalist.rock new file mode 100644 index 0000000..d318a7a --- /dev/null +++ b/examples/fizzbuzz_minimalist.rock @@ -0,0 +1,25 @@ +Modulus takes Number and Divisor +While Number is as high as Divisor +Put Number minus Divisor into Number + (blank line ending While block) +Give back Number + (blank line ending function declaration) +Limit is 100 +Counter is 0 +Fizz is 3 +Buzz is 5 +Until Counter is Limit +Build Counter up +If Modulus taking Counter, Fizz is 0 and Modulus taking Counter, Buzz is 0 +Say "FizzBuzz!" +Continue + (blank line ending 'If' Block) +If Modulus taking Counter and Fizz is 0 +Say "Fizz!" +Continue + (blank line ending 'If' Block) +If Modulus taking Counter and Buzz is 0 +Say "Buzz!" +Continue + (blank line ending 'If' Block) +Say Counter (Note that the EOF terminates the `Until` block.) \ No newline at end of file diff --git a/examples/hello-world.rock b/examples/hello-world.rock new file mode 100644 index 0000000..0da43f3 --- /dev/null +++ b/examples/hello-world.rock @@ -0,0 +1,31 @@ +Eternity takes the pain. +The prize is silence +Until the pain is nothing, +Roll the pain into violence, +Cast violence into your lies, +Let the prize be with your lies. + +Give back the prize + +The night is calling me +Rock the night like a colourcast tranquility +The dawn is a spellbound moonbeam +Rock the night with the dawn, the dawn, +Your fire is a neverending aftereffect +Rock the night with your fire + +The spirit is electric thunder +Rock the spirit with your fire +Rock the spirit like a thunderbolt fist +Rock the spirit with the dawn +Rock the spirit like a chamaeleon stormcloud + +Let fear be eternity taking the night +Let hope be eternity taking the spirit + +Time is all up +Cast it into the void +Let fear be with the void +Let fear be with hope + +Shout fear diff --git a/examples/isPalindrome.rock b/examples/isPalindrome.rock new file mode 100644 index 0000000..f888249 --- /dev/null +++ b/examples/isPalindrome.rock @@ -0,0 +1,46 @@ +My soul is on fire +The mystery's of my heart desire +My soul is on fire +Listen to my heart +Cut her into pieces +Put her into the fire +Let my ire be her +My soul is ice cold + +Love is a liar +Hate is a fool +Put hate without love into the fire +My blood is ice cold + +Desire is lust within +Lust is a fools tool +Let your desire be the fire +My blood is ice cold + +Let lust be love with hate +Knock your desire down +Let my soul be my soul at your desire +My blood is ice cold + +Lust is for fools +The fools are dancing in the parade +Let pieces be pieces with your desire +The fools are blood that flows ice cold + +While my ire is stronger than the fire +Let the flames be my heart at pieces +Let my soul be with the flames +Knock my ire down +Let pieces be pieces with your desire + +My ire is ice cold +Let my blood be with my heart +Blood is burning with flames +Thin is the ice +My heart was melted + +If my soul is my blood +Shout "Love is true" + +If my soul ain't my blood +Shout "Hate runs through" \ No newline at end of file diff --git a/examples/mandelbrot.rock b/examples/mandelbrot.rock new file mode 100644 index 0000000..82a561a --- /dev/null +++ b/examples/mandelbrot.rock @@ -0,0 +1,50 @@ +Eddy wants your dedication, and a hug +The goal is not so incredible +The expectations are incredible +The hope is incredible +The fear is real +Let something be nothing +Let anything be nothing +While the expectations are lower than the goal and the hope is lower than the fear +Let love be something +Let love be something of it +Let your head be anything +Let your head be anything of it +Let the summit be love without your head plus your dedication +A million is insufficient +Let anything be a million times something times anything plus a hug +Let something be the summit +Let the hope be something of something with anything of anything +Build the expectations up + +The world is only scared +Cast the world into your thoughts +Happiness is a fire +Let your need be the world without happiness +Cast your need into your anger +If the expectations are weaker than the goal +Let the answer be your anger, +Else let the answer be your thoughts +Give the answer + +Peace takes time +The war is gone +Knock the war down, down +Your dreams are incredible. Yeah! +Your spirit is incredible. Incredible, aah! +While the war is weaker than your dreams +Let the war be the war with your spirit +Let love be the war +Rock our universe with Eddy taking love 'n' time + +Join our universe +Send them back + +Our lives are impossible +Knock our lives down +Our souls are incredible +Build our souls up +While our lives are weaker than our souls +The moon is a light +Let our lives be our lives with our souls over the moon +Whisper peace taking our lives diff --git a/examples/nth-fibonacci.rock b/examples/nth-fibonacci.rock new file mode 100644 index 0000000..e1e6a59 --- /dev/null +++ b/examples/nth-fibonacci.rock @@ -0,0 +1,21 @@ +The spiral takes my soul +The moon is all over me +Let my life be the moon over the moon +The night was gone +If my soul is my life +Give back the night + +The circle is me +If my soul is the circle +Give back my life + +Until the circle is my soul +Let the moon be the night +Let the night be my life +Put the moon with my life into my life +Build the circle up + +Give back the night with my life + +Listen to the nature +Shout the spiral taking the nature diff --git a/examples/pi_approx.rock b/examples/pi_approx.rock new file mode 100644 index 0000000..0122804 --- /dev/null +++ b/examples/pi_approx.rock @@ -0,0 +1,27 @@ +My life was a mushroom cloud, then + it was nothing +Sin is unquenchable +My cell was empty + +Your love was a jackhammer shaking the bars +Your life is a fungus +Your love is mycorrhizal +My life was empty without your love + +Until your life is my life, + build my life up +Put your love into Me +Put my life into the song, + until your love is stronger than the song +Put the song of Me into Me +Knock the song down + +Put your love into You +Put it with my life of Sin into the song, + until your love is stronger than the song +Put the song of You into You +Knock the song down, down + +Put my cell into the song +Put it with Me over You into my cell +Scream my cell of Sin diff --git a/examples/primes_with_input.rock b/examples/primes_with_input.rock new file mode 100644 index 0000000..5b70162 --- /dev/null +++ b/examples/primes_with_input.rock @@ -0,0 +1,45 @@ +Midnight takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart + +Give back your heart + +This Life takes my hopes and my dreams +While my dreams ain't gone +Let my love be my dreams +Put Midnight taking my hopes 'n' my dreams into my mind +Put my mind into my dreams +Put my love into my hopes + +Give back my hopes + +This Love takes my hand +My heart was up +My love was true +Let your heart be my hand +If Midnight taking your heart 'n' my heart is empty and my hand without my heart is not empty +My love was lies +Give back my love + +Put my hand over my heart into my hand +While my hand without my heart is bigger than nothing +Put This Life taking your heart 'n' my heart into the world +Knock the world down +If the world ain't nothing +My love was lies +Break it down + +Build my heart up + +Give back my love + + +Listen to my voice +My mind is gone +Build my mind up +Build my mind up +Until my mind is as strong as my voice +If This Love taking my mind ain't gone +Shout my mind + +Build my mind up diff --git a/examples/primes_with_input_v2.rock b/examples/primes_with_input_v2.rock new file mode 100644 index 0000000..64d58aa --- /dev/null +++ b/examples/primes_with_input_v2.rock @@ -0,0 +1,46 @@ +The World takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart + +Give back your heart + +War takes your life +Your blood is ice +Their Fight is up +Knock it down +If your life without your blood is as low as gone +Give back your life is stronger than Their Fight + +Your time is up +Put The World taking your life & your time into Their Place +Build your time up +Put The World taking your life & your time into Your Place +If Their Place is empty or Your Place is empty +Your path was wrong +Give back your path + +Build your time up +Build your time up +Their Time is up +Your blood is ice +Until your time of your time is greater than your life +Put The World taking your life & your time into Their Place +Put your time with Their Time into your mind +Put The World taking your life & your mind into your place +If Their Place is empty or your place is empty +Your path was wrong +Give back your path + +Put your time with your blood with your blood into your time + +Your path was right +Give back your path + + +Listen to the crowd +My voice is gone +Build my voice up +Until my voice is as strong as the crowd +Build my voice up +If War taking my voice +Shout my voice diff --git a/examples/rock_wine.rock b/examples/rock_wine.rock new file mode 100644 index 0000000..0963e30 --- /dev/null +++ b/examples/rock_wine.rock @@ -0,0 +1,109 @@ +guilt says guilt +lover says lover +longing says longing +reason says reason +hope says hope +desire says desire +fans says fans +therapist says therapist +uncle says uncle +craving says craving +wife says wife +frenzy says frenzy +friend says friend +grandma says grandma +doubt says doubt +confidant says confidant +calling says calling +knowledge says knowledge +will says will +dentist says dentist +angst says angst +wisdom says wisdom +foolishness says foolishness +anger says anger +mind says mind +resolve says resolve +desperation says desperation +my guilt says my fear is unforgivable +my lover says my thirst is unquenchable +my longing says my world is "nothing without your love" +my reason says it's misleading +my hope says let my world be without my fear +my desire says let my dreams be my world over my fear +my fans says my song says , +my therapist says the fear says says +my uncle says the worst says my +my craving says the night says whisper your love taking my +my wife says your love takes my soul, the heart +my frenzy says if my fear is my thirst +my friend says put the heart with the fear, and the heart into my soul +my grandma says (yeah, yeah, yeah,...) +my doubt says if my fear ain't my thirst +my confidant says put the worst of my fear with the heart of my fear with the fear of my fear with my soul into my soul +my calling says (oooh) +my knowledge says if my fear is my dreams +my will says put the night with the heart with my song, and the heart into my soul +my dentist says (aaaah) +my angst says give back my soul +my wisdom says (incomprehensible mumbling) +my foolishness says While my fear is as strong as my world +my anger says if my fear is my world +my mind says say "knock my fear down" +my resolve says break it down +my desperation says (solo) +my fear is unforgivable +my thirst is unquenchable +my world is "nothing without your love" +it's misleading +let my world be without my fear +let my dreams be my world over my fear +my song says , +the fear says says +the worst says my +the night says whisper your love taking my +your love takes my soul, the heart +if my fear is my thirst +put the heart with the fear, and the heart into my soul +(yeah, yeah, yeah,...) +if my fear ain't my thirst +put the worst of my fear with the heart of my fear with the fear of my fear with my soul into my soul +(oooh) +if my fear is my dreams +put the night with the heart with my song, and the heart into my soul +(aaaah) +give back my soul +(incomprehensible mumbling) +While my fear is as strong as my world +if my fear is my world +say "knock my fear down" +break it down +(solo) +whisper your love taking my guilt, guilt +whisper your love taking my lover, lover +whisper your love taking my longing, longing +whisper your love taking my reason, reason +whisper your love taking my hope, hope +whisper your love taking my desire, desire +whisper your love taking my fans, fans +whisper your love taking my therapist, therapist +whisper your love taking my uncle, uncle +whisper your love taking my craving, craving +whisper your love taking my wife, wife +whisper your love taking my frenzy, frenzy +whisper your love taking my friend, friend +whisper your love taking my grandma, grandma +whisper your love taking my doubt, doubt +whisper your love taking my confidant, confidant +whisper your love taking my calling, calling +whisper your love taking my knowledge, knowledge +whisper your love taking my will, will +whisper your love taking my dentist, dentist +whisper your love taking my angst, angst +whisper your love taking my wisdom, wisdom +whisper your love taking my foolishness, foolishness +whisper your love taking my anger, anger +whisper your love taking my mind, mind +whisper your love taking my resolve, resolve +whisper your love taking my desperation, desperation +knock my fear down \ No newline at end of file diff --git a/examples/rock_wine_minimalist.rock b/examples/rock_wine_minimalist.rock new file mode 100644 index 0000000..24411d6 --- /dev/null +++ b/examples/rock_wine_minimalist.rock @@ -0,0 +1,82 @@ +(This comment makes the program not a quine. It is here mainly to discourage the use of the minimalistic version as an examle of rockstar code, since this greatly reduces the code singability) +b says b +c says c +d says d +e says e +f says f +g says g +h says h +i says i +j says j +k says k +l says l +m says m +n says n +o says o +p says p +q says q +r says r +s says s +t says t +u says u +my b says my number is 2 +my c says my y says says +my d says my w says my +my e says your love takes my x, my z +my f says if my number is 2 +my g says put my z with my y with my z into my x +my h says (yeah, yeah, yeah) +my i says if my number ain't 2 +my j says put my w of my number with my z of my number with my y of my number with my x into my x +my k says (oooh) +my l says if my number is -1 +my m says put "say your love taking my " with my z with ", " with my z into my x +my n says (yeah, yeah, yeah,...) +my o says give back my x +my p says (aaah) +my q says While my number is as high as -2 +my r says if my number is -2 +my s says say "knock my number down" +my t says break it down +my u says (solo) +my number is 2 +my y says says +my w says my +your love takes my x, my z +if my number is 2 +put my z with my y with my z into my x +(yeah, yeah, yeah) +if my number ain't 2 +put my w of my number with my z of my number with my y of my number with my x into my x +(oooh) +if my number is -1 +put "say your love taking my " with my z with ", " with my z into my x +(yeah, yeah, yeah,...) +give back my x +(aaah) +While my number is as high as -2 +if my number is -2 +say "knock my number down" +break it down +(solo) +say your love taking my b, b +say your love taking my c, c +say your love taking my d, d +say your love taking my e, e +say your love taking my f, f +say your love taking my g, g +say your love taking my h, h +say your love taking my i, i +say your love taking my j, j +say your love taking my k, k +say your love taking my l, l +say your love taking my m, m +say your love taking my n, n +say your love taking my o, o +say your love taking my p, p +say your love taking my q, q +say your love taking my r, r +say your love taking my s, s +say your love taking my t, t +say your love taking my u, u +knock my number down \ No newline at end of file diff --git a/examples/rot13.rock b/examples/rot13.rock new file mode 100644 index 0000000..1148f96 --- /dev/null +++ b/examples/rot13.rock @@ -0,0 +1,35 @@ +Music takes fantasy and skill +The world is my heaven +Put fantasy without skill into oblivion +If she is less than nothing or she is as big as the world +Give back fantasy + +Fear is a lie +If oblivion is weaker than fear +Let fantasy be with the world + +Let fantasy be without fear +Give back fantasy + +Dreams were bloody great +Chords were on brain waves +While chords ain't gone +Cast chords into a guitar +Put music taking chords & dreams into shape +A song is necessary comfort +Let harmony be music taking shape, a song +Cast harmony into magic +Let the chords at a guitar be magic +Knock chords down + +Your will is tremendous +Listen to your dreams +Shatter them into feel +While your will ain't feel +Put feel at your will into a guitar +Let magic be the chords at a guitar +Let feel at your will be magic +Build your will up + +Join feel into the music +Shout it diff --git a/rockstar-2.md b/rockstar-2.md new file mode 100644 index 0000000..8c0d3a3 --- /dev/null +++ b/rockstar-2.md @@ -0,0 +1,304 @@ +# Rockstar 2 + +Rockstar was invented in a bar, as a joke. It was a parody spec. I thought people might read it, laugh, and move on. I didn't think anybody would implement it, and I certainly didn't think that more than five years later people would still be using it, creating their own implementations, and filing issues when they found inconsistencies in the spec. + +Douglas Adams once said about Zaphod Beeblebrox that he gave the character two heads and three arms because on the radio that's a cheap throwaway gag... but when it came to adapting *The Hitch-Hikers Guide to the Galaxy* for television and film, that throwaway gag turned into an expensive nightmare for the production designers. + +Bits of the original Rockstar spec were like that. `Take it to the top` as a `continue` statement was daft. Poetic literals were, and are, a lovely idea, but the way they were specified made a lot of other things unnecessarily difficult. Using `mysterious` to denote an uninitialised variable caused a few giggles and a lot of headaches. + +**It's time for Rockstar 2.** + +The fundamental premise of Rockstar remains the same: it's a language in which your computer programs can also be songs, so **every feature of the language** has to be expressible in a form that wouldn't look out of place in the lyrics to a rock song. + +There is another really important consideration, though: Rockstar only exists because it's fun. It should be a fun language to use, and a fun language to maintain... and at some point, working around all the stupid hacks and throwaway gags in the original spec stopped being fun. + +**That means there will be breaking changes.** Rockstar 1 programs probably won't run on Rockstar 2, and I have no intention to support a "legacy mode". Rockstar 2 will be a complete overhaul. Some programs might run with minimal modifications, but at this point I'm far more interested in the folks who might consider using it for the next Advent of Code than the folks who used it for the last one. + +## So what's going to break? + +### Poetic literals + +Rockstar 1 used the `is` and `was` keywords to initialise a variable based on a poetic literal: + +`Desire is a lovestruck ladykiller` + +would initialise the variable `desire` to the value `100`. This was the only place in the language that allowed poetic literals - and meant the `is` keyword couldn't be used for ordinary assignment. Rockstar 2 will introduce the keyword `like` to denote a poetic literal expression, and poetic literal expressions can be used anywhere. `Desire is like a lovestruck ladykiller` (initialise `Desire` with the value `100`) + +`If your smile is like a sledgehammer` - a Boolean expression which is true if `your smile` is equal to `12` + +This frees up `is` and `was` for assignment. + +``` +X is 5 +Y is X +Z is X with Y +``` + +Poetic literals will use the ellipsis `...` (or the Unicode equivalent U+2026 `…`) as a decimal separator: + +```rockstar +My dreams were like ice... a life unfulfilled, wakin' everybody up, taking booze and pills. +``` + +### Statements and block syntax. + +In Rockstar 1, statements ended with a newline, and the only way to terminate a block was a blank line. + +In Rockstar 2, a statement ends with a **new line** or a **terminal punctuation mark** `.`, `!`, `?`. (These are punctuation marks which would end a sentence in written English.) + +#### Line continuations + +If the last non-whitespace character on a line is a **continuation punctuation mark** `-`, `,`, `;`, `.`, the subsequent newline is ignored. This allows Rockstar statements to span multiple lines: + +``` +My dreams were like ice... a life unfulfilled, +wakin' everybody up, taking booze and pills. +``` + +```rockstar +My pain is like a diamond. +Until my pain is nothing, shout it, tear it down, yeah. +``` + +In Rockstar 2, the block terminators `whoa`, `oh`, `yeah` and `baby` indicate the end of a code block. + +To end multiple nested blocks, you can use `ooh` (ends two blocks), `oooh` (three blocks), `ooooh` (ends four blocks), `yeeah`, `yeeeah`, `baaby`, `baaaaby`, `whooa`, `whoooa`. *(how easy is this to implement? I have literally no idea.)* + +A block terminator includes **all adjacent whitespace and punctuation characters**. `, yeah!` is equivalent to `yeah` + +```rockstar +Midnight takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart +Ooh, give back your heart, yeah. +``` + +Declaring functions + +```rockstar +wants, takes, needs, craves, longs for + +The sum takes w, x, y and z +Give back w with x with y with z + +Search wants a needle and a haystack +(todo: implement search) +``` + +Calling functions + +``` +My heart is the sum taking 4, 5, 6 and 7 +``` + +## The Rockstar Wishlist + +### Better equality / comparisons + +Truthiness and falsiness are a good idea most of the time. Decrementing a number until it's falsy (zero), chopping characters out of a string until it's falsy (empty string) - they're useful for writing lyrical code. + +I propose the `exactly` keyword (alias `really`, `actually`) + +```rockstar +My dreams are nothing +My heart is silence +If my heart is my dreams (returns true because 0 ~= "") +If my heart is really my dreams (returns false because 0 !== "") +``` + +### A native interpreter (rockstar.exe, /bin/rockstar) + +For Rockstar 2.0, I'm porting the parser and interpreter to .NET. + +.NET 8 supports native ahead-of-time compilation for just about every platform out there - Windows, macOS, Linux, on both Intel and ARM architectures - as well as WebAssembly, so it should be possible to produce native binaries for folks who want to run Rockstar locally, and a WASM version which will replace the Satriani JS interpreter used on codewithrockstar.com + +### An improved online editor and AST visualiser + +When I was building Satriani, I used a hacky web app I built which rendered the parser output and syntax tree based on a grammar definition and program input. Something like this could be really useful for other folks writing and debugging Rockstar programs. Details TBC but it'll be cool. + +### Better VS Code support + +Syntax highlighting, an AST visualiser... anybody want to build a Rockstar language server? :) + +*(Yes, this is a ridiculous amount of effort to put into a joke language... but programming is fun and I like building things.)* + +### Filesystem and network IO + +This one's always been a bit controversial because supporting any kind of filesystem or network access means implementing features that won't work in a web-based interpreter. Some sort of HTTP client might be a nice way to allow Rockstar to connect to external resources without tying it to any kind of filesystem. + +Here's one possible syntax that might work: + +``` +The file is "input.txt" +Open the file (note that this replaces the variable: the file name is now a file handle) +Read the file into the line +Say "this is another line" into the file + + +``` + + + +### Modules, packages, imports, libraries... + +I'm still undecided as to whether we need this. Partly because, along with filesystems, it's a reasonable guarantee that people can't use Rockstar to build anything important. + +But it's worth considering. As well as concerns around coupling Rockstar to specific filesystems, the big challenge with modules and imports is that I have no idea what the syntax for this might look like. + +One idea that I've had floating around for a while is to use the list of "musicians" as the imports and possessive apostrophes to denote namespacing. + +**Minimalist:** + +``` +(math.rock) +Modulus takes x and y +While x is as high as y +put x without y into x +End +Give back x +End +``` + +```rockstar +(program.rock) +Math: M + +The result is M's modulus taking 5 and 3 +Shout the result +``` + +**Idiomatic:** + +``` +(vocals.rock) +Revenge takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart +Whoa, give back your heart, yeah +``` + +```rockstar +Vocals: Stevie +Guitar: Kelly +Bass: Nik + +Fire is like ice, hate is like water +My world is nothing +The answer is Stevie's revenge taking my world, fire +``` + +### Random numbers + +Idea: the `shuffle` keyword. `Shuffle x` returns a random integer between zero and `x`. `Shuffle my array` randomises the array order in place; `shuffle my array into the result` leaves the `my array` intact and puts the shuffled version into `the result` + +### The system clock + +I think `now` returning the current UTC timestamp JS new Date().valueOf())? + +## The Silly Stuff + +### Meat Loaf Conditionals + +There is an [old suggestion on the Rockstar repo from jimbobbennett](https://github.com/RockstarLang/rockstar/issues/68): + +> For `if` blocks, Rockstar should support Meatloaf syntax: +> `I would do for But I won't do ` + This syntax would evaluate the ``, and if it is `true`, then call ``, else it will call ``. + +I have no plans to implement this one incredibly specific scenario. + +But... wouldn't it be cool if some combination of structures and statements meant this was valid Rockstar? +### Bill & Ted + +We should parse expression like: + +```rockstar +That is totally non non non non non NON heinous +``` + +### Real songs as Rockstar programs ("Rock You Like A Hurricane") + +I think that Scorpions' "[Rock You Like A Hurricane](https://www.google.com/search?q=scorpions+rock+you+like+a+hurricane+lyric)" is the best candidate for an actual rock song which will cleanly compile in Rockstar, and I'd like to see if I can implement new language features in such a way that the whole song is syntactically valid. +## Timeline + +The [Copenhagen Developers Festival](https://cphdevfest.com/) is happening in August. It's a great event -- a mashup of a software developer conference and a music festival -- and sounds like a great excuse to throw a Rockstar 2.0 launch party. + +Time to get to work. + +### Developer Diary + +Keywords with spaces in them. + +OK, this is going to cause all kinds of fun. + +Here are two expressions: + +``` +x is greater than y +x is y is greater than z +``` + +The first parses to: + +``` +binary: + op: greater_than + lhs: x + rhs: y +``` + +The second to: + +``` +binary: + op: equality + lhs: x + rhs: binary + op: greater_than + lhs: y + rhs: z +``` + +## Types vs Expressions + +#### Option 1: Number : Type : Expression + +Pros: +* No repetition - there is only one thing called Number +* Parser captures literals as actual types + +Cons: + +* Results of evaluations will have empty line/column/lexeme (is this bad?) + * what if we replace this with a Source property that tells us where it came from? + * If Source is null - it didn't come from source code +#### Option 2: Number Type AND Number Expression + +Pros: + +* Type doesn't contain any unnecessary metadata +* Eval() returns a Type, not an Expression + * so Eval() will ALWAYS result in a Number/String/Boolean/Symbol/Function/Reference? + * ...but this still works even if Type : Expression + + + + +x is 5 +y is 7 +the total is x with y + +# Breaking changes +Stuff that works differently in rockstar 2.0 + +* Boolean operators now behave like JavaScript: `true && x` will return x, `false || foo` will return foo +* + +CONDITIONALS + +"foo" = !"bar" +"foo" != "bar" => true + +a = !b +a != b + diff --git a/satriani/.gitignore b/satriani/.gitignore new file mode 100644 index 0000000..570a527 --- /dev/null +++ b/satriani/.gitignore @@ -0,0 +1,2 @@ +satriani.parser.js +satriani.standalone.js diff --git a/satriani/LICENSE b/satriani/LICENSE new file mode 100644 index 0000000..7fcdcda --- /dev/null +++ b/satriani/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Dylan Beattie + +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/satriani/README.md b/satriani/README.md new file mode 100644 index 0000000..67f5c93 --- /dev/null +++ b/satriani/README.md @@ -0,0 +1,118 @@ +# Satriani + +Satriani is a JavaScript interpreter for the Rockstar programming language. Satriani has been created to act as a reference implementation for managing changes to the Rockstar language specification. + +## Usage + +To run Satriani using nodeJS from the command line: +``` +git clone https://github.com/RockstarLang/rockstar +cd rockstar/satriani +yarn install +yarn pegjs +node rockstar .rock +``` + +To run the test suite: + +``` +git clone https://github.com/RockstarLang/rockstar +cd rockstar/satriani +yarn test +``` + +To run Satriani from your own JavaScript code: + +``` +const satriani = require('./satriani.js'); + +// Required to support reading from stdin +const readlineSync = require('readline-sync'); + +let rockstar = new satriani.Interpreter(); +let program = "Shout Hello World!\nGive back 1\n"; +let ast = rockstar.parse(program); + +// Draw the abstract syntax tree (AST) to the console as a JSON object +console.log(JSON.stringify(ast, null, 2)) + +let output = console.log +let input = readlineSync.question +let result = rockstar.run(ast, input, output) +console.log(result); +``` + +To run Satriani in a browser, use `browserify` to bundle it: + +``` +git clone https://github.com/RockstarLang/rockstar +cd rockstar/satriani +yarn browserify +``` + +This will create a single JS file, `satriani.standalone.js`, containing the Satriani parser and interpreter, which +you can use in web pages: + +``` + + + + + + + + +``` +## How it works + +Satriani uses `pegjs`, a parser generator for JavaScript. The language +grammar is defined in **[rockstar.peg](rockstar.peg)**. + +We use the `pegjs` command line to generate `rockstar.parser.js`, which is the parser itself: + +``` +$ pegjs -o rockstar.parser.js rockstar.peg +``` + +This is also defined as a yarn build task, so you can build the parser using: + +``` +$ yarn run pegjs +``` + +**[rockstar.parser.js](rockstar.parser.js)** exports a function `parse(input, options)`, where `input` +is a string containing the source code of your Rockstar program and `options` is the +optional [pegjs parser options](https://pegjs.org/documentation#using-the-parser). + +`parse` will return an **abstract syntax tree** (AST) containing your program. The +AST is a JSON object representing your program as a tree of operations. + +**[rockstar.interpreter.js](satriani.interpreter.js)** is a runtime interpreter that can take the AST created by the parser and evaluate it. It's pluggable +so you can override the I/O mechanisms. + +The test suite is runnable using [Mocha](https://mochajs.org/) - each 'test' is defined as a .rock source file and an .rock.out output file, so the test suite is completely platform-agnostic. + +## Acknowledgements + +I've basically had to teach myself how to build compilers again to create this - it's been a long, long time since University... :) + +HUGE thanks to Wolfgang Faust for https://github.com/wolfgang42/rockstar-js - I've been using his grammar +as a reference throughout and have reused bits of it directly, and it's been invaluable. + +Mihai Bazon's fantastic series of articles on building recursive descent compilers in JavaScript has also been +really useful: http://lisperator.net/pltut/ + + + + + + + + diff --git a/satriani/package-lock.json b/satriani/package-lock.json new file mode 100644 index 0000000..582550e --- /dev/null +++ b/satriani/package-lock.json @@ -0,0 +1,3258 @@ +{ + "name": "satriani", + "version": "0.9.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "satriani", + "version": "0.9.0", + "license": "ISC", + "dependencies": { + "browserify": "^16.2.3", + "chai": "^4.2.0", + "gh-pages": "^2.0.1", + "pegjs": "^0.10.0", + "readline-sync": "^1.4.9" + }, + "devDependencies": { + "mocha": "^5.2.0" + } + }, + "node_modules/acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", + "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "node_modules/bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dependencies": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + }, + "bin": { + "browser-pack": "bin/cmd.js" + } + }, + "node_modules/browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dependencies": { + "resolve": "1.1.7" + } + }, + "node_modules/browser-resolve/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/browserify": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz", + "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==", + "dependencies": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "browserify": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dependencies": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dependencies": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "node_modules/buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + }, + "node_modules/chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "engines": { + "node": "*" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "dependencies": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, + "node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "node_modules/deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "dependencies": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + }, + "bin": { + "deps-sort": "bin/cmd.js" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "node_modules/filename-reserved-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filenamify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", + "dependencies": { + "filename-reserved-regex": "^1.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/filenamify-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz", + "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=", + "dependencies": { + "filenamify": "^1.0.0", + "humanize-url": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "engines": { + "node": "*" + } + }, + "node_modules/gh-pages": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.1.1.tgz", + "integrity": "sha512-yNW2SFp9xGRP/8Sk2WXuLI/Gn92oOL4HBgudn6PsqAnuWT90Y1tozJoTfX1WdrDSW5Rb90kLVOf5mm9KJ/2fDw==", + "dependencies": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify-url": "^1.0.0", + "fs-extra": "^7.0.0", + "globby": "^6.1.0", + "graceful-fs": "^4.1.11", + "rimraf": "^2.6.2" + }, + "bin": { + "gh-pages": "bin/gh-pages.js", + "gh-pages-clean": "bin/gh-pages-clean.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "node_modules/humanize-url": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz", + "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=", + "dependencies": { + "normalize-url": "^1.0.0", + "strip-url-auth": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "dependencies": { + "source-map": "~0.5.3" + } + }, + "node_modules/insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "dependencies": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + }, + "bin": { + "insert-module-globals": "bin/cmd.js" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "dependencies": { + "jsonify": "~0.0.0" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "engines": { + "node": "*" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "dependencies": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "node_modules/mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "node_modules/mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "dependencies": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mocha/node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/module-deps": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz", + "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==", + "dependencies": { + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + }, + "bin": { + "module-deps": "bin/cmd.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "node_modules/pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "node_modules/parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "dependencies": { + "path-platform": "~0.11.15" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "dependencies": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/pegjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=", + "bin": { + "pegjs": "bin/pegjs" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resolve": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "dependencies": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "node_modules/shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "node_modules/simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "dependencies": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-http": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", + "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-url-auth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", + "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dependencies": { + "minimist": "^1.1.0" + } + }, + "node_modules/supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "dependencies": { + "acorn-node": "^1.2.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "dependencies": { + "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", + "bin": { + "umd": "bin/cli.js" + } + }, + "node_modules/undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "dependencies": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + } + }, + "dependencies": { + "acorn": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", + "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "acorn-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", + "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "requires": { + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "JSONStream": "^1.0.3", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + } + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "browserify": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz", + "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==", + "requires": { + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "JSONStream": "^1.0.3", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^3.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "buffer": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", + "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", + "requires": { + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "dash-ast": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + }, + "deps-sort": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", + "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", + "requires": { + "JSONStream": "^1.0.3", + "shasum-object": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" + } + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "email-addresses": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz", + "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "events": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "filename-reserved-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz", + "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=" + }, + "filenamify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz", + "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=", + "requires": { + "filename-reserved-regex": "^1.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + } + }, + "filenamify-url": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz", + "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=", + "requires": { + "filenamify": "^1.0.0", + "humanize-url": "^1.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "gh-pages": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.1.1.tgz", + "integrity": "sha512-yNW2SFp9xGRP/8Sk2WXuLI/Gn92oOL4HBgudn6PsqAnuWT90Y1tozJoTfX1WdrDSW5Rb90kLVOf5mm9KJ/2fDw==", + "requires": { + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", + "filenamify-url": "^1.0.0", + "fs-extra": "^7.0.0", + "globby": "^6.1.0", + "graceful-fs": "^4.1.11", + "rimraf": "^2.6.2" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "humanize-url": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz", + "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=", + "requires": { + "normalize-url": "^1.0.0", + "strip-url-auth": "^1.0.0" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", + "requires": { + "source-map": "~0.5.3" + } + }, + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", + "requires": { + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "JSONStream": "^1.0.3", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "requires": { + "jsonify": "~0.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "labeled-stream-splicer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", + "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", + "requires": { + "inherits": "^2.0.1", + "stream-splicer": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "module-deps": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz", + "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==", + "requires": { + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.2", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "JSONStream": "^1.0.3", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + }, + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", + "requires": { + "path-platform": "~0.11.15" + } + }, + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "requires": { + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "pegjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz", + "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "requires": { + "readable-stream": "^2.0.2" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "readline-sync": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz", + "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==" + }, + "resolve": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz", + "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", + "requires": { + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" + } + }, + "shasum-object": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", + "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", + "requires": { + "fast-safe-stringify": "^2.0.7" + } + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "requires": { + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", + "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^3.0.6", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "stream-splicer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", + "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "strip-url-auth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz", + "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=" + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "requires": { + "minimist": "^1.1.0" + } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "requires": { + "acorn-node": "^1.2.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "timers-browserify": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "requires": { + "process": "~0.11.0" + } + }, + "trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "requires": { + "escape-string-regexp": "^1.0.2" + } + }, + "tty-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" + }, + "undeclared-identifiers": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", + "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", + "requires": { + "acorn-node": "^1.3.0", + "dash-ast": "^1.0.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + } + } +} diff --git a/satriani/package.json b/satriani/package.json new file mode 100644 index 0000000..c51abe1 --- /dev/null +++ b/satriani/package.json @@ -0,0 +1,36 @@ +{ + "name": "satriani", + "version": "0.9.0", + "description": "JS interpreter for Rockstar", + "main": "satriani.js", + "directories": { + "test": "tests" + }, + "dependencies": { + "browserify": "^16.2.3", + "chai": "^4.2.0", + "gh-pages": "^2.0.1", + "pegjs": "^0.10.0", + "readline-sync": "^1.4.9" + }, + "devDependencies": { + "mocha": "^5.2.0" + }, + "scripts": { + "browserify": "yarn pegjs && node node_modules/browserify/bin/cmd.js satriani.js --standalone Satriani -o satriani.standalone.js", + "deploy": "node_modules/gh-pages/bin/gh-pages.js -u 'CircleCI ' -r git@github.com:RockstarLang/codewithrockstar.com.git --add --src docs/js/satriani.js -m 'Updated js/satriani.js from main repo' -b master -d deploy", + "serve": "python -m SimpleHTTPServer 8000", + "pegjs": "node node_modules/pegjs/bin/pegjs --cache -o satriani.parser.js rockstar.peg", + "test": "yarn pegjs && mocha test/*.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/RockstarLang/rockstar.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/dylanbeattie/satriani/issues" + }, + "homepage": "https://github.com/dylanbeattie/satriani#readme" +} diff --git a/satriani/rockstar.js b/satriani/rockstar.js new file mode 100644 index 0000000..0964819 --- /dev/null +++ b/satriani/rockstar.js @@ -0,0 +1,41 @@ +const fs = require('fs'); +const satriani = require('./satriani.js'); +var readlineSync = require('readline-sync'); + +var sourceFilePath = process.argv[2]; +var watch = process.argv.filter(x => x.toLowerCase() === "--watch").length > 0; + +function execute() { + var rockstar = new satriani.Interpreter(); + fs.readFile(sourceFilePath, 'utf8', (err, data) => { + if (err) throw err; + try { + let tree = rockstar.parse(data); + let input = readlineSync.question; + let output = console.log; + let result = rockstar.run(tree, input, output) + console.log(result ? result : "(program returned no output)"); + } catch (e) { + if (e.location && e.location.start) { + let lines = data.split(/\n/); + console.log(lines[e.location.start.line - 1]); + console.log(' '.repeat(e.location.start.column - 1) + '^'); + console.log(e.message); + console.log(sourceFilePath + " line " + e.location.start.line + " col " + e.location.start.column); + } else { + console.log(e); + } + + } + }); +} + +if (!sourceFilePath) { + console.log('No source file specified'); + console.log('Usage: node rockstar.js program.rock'); +} else { + execute(); + if (watch) { + fs.watch(sourceFilePath, execute); + } +} \ No newline at end of file diff --git a/satriani/rockstar.peg b/satriani/rockstar.peg new file mode 100644 index 0000000..058298c --- /dev/null +++ b/satriani/rockstar.peg @@ -0,0 +1,472 @@ +/* +PEG grammar for Rockstar (https://codewithrockstar.com) +Created using PEG.js https://pegjs.org +After updating, run pegjs -o rockstar-parser.js rockstar.peg +*/ + +{ + /* initialiser code - this is JS that runs before the parser is generated */ + + const keywords = new Set([ + // common variable prefixes + 'a', 'an', 'the', 'my', 'your', 'our', + + // pronouns + 'it', 'he', 'she', 'him', 'her', 'they', 'them', 'ze', 'hir', 'zie', 'zir', 'xe', 'xem', 've', 'ver', + + // literal values + 'mysterious', + 'null', 'nothing', 'nowhere', 'nobody', 'gone', + 'true', 'right', 'yes', 'ok', + 'false', 'wrong', 'no', 'lies', + 'maybe', 'definitely', // reserved for future use + 'empty', 'silent', 'silence', + + // assignment + 'let', 'be', 'put', 'into', 'in', // expression + 'is', 'are', 'was', 'were', 'say', 'says', 'said', // poetic + + // operations + 'at', 'rock', 'with', 'roll', 'into', 'push', 'pop', 'like', // arrays + 'cut', 'split', 'shatter', 'join', 'unite', 'cast', 'burn', // strings + 'build', 'up', 'knock', 'down', // increment/decrement + 'plus', 'with', 'minus', 'without', 'times', 'of', 'over', 'between', // arithmetic + 'and', // list arithmetic + 'turn', 'up', 'down', 'round', 'around', // rounding + 'and', 'or', 'nor', 'not', // logical + + // comparison + 'is', "isn't", 'isnt', "ain't", 'aint', + 'arent', "aren't", 'wasnt', "wasn't", 'werent', "weren't", + 'not', + 'than', + 'higher', 'greater', 'bigger', 'stronger', + 'lower', 'less', 'smaller', 'weaker', + 'as', + 'high', 'great', 'big', 'strong', + 'low', 'little', 'small', 'weak', + + // input/output + 'listen', 'to', + 'say', 'shout', 'whisper', 'scream', + + // control flow + 'if', 'else', + 'while', 'until', + 'break', 'continue', + 'break', 'it', 'down', + 'take', 'it', 'to', 'the', 'top', + 'take', + + // functions + 'takes', 'wants', + 'give', 'return', 'send', 'back', + 'taking', + ]) + + function isKeyword(string) { + return keywords.has(string.toLowerCase()); + } +} + +program = p:line * { return { list: p.filter(item => item) } } + +line = _* s:statement (EOL+ / EOF) { return s } + / + EOL { return null } + +whitespace = [ \t] +comment = '(' [^)]* ')' / '{' [^\}]* '}' / '[' [^\]]* ']' +_ = (whitespace / comment)+ + +noise = (_ / [;,?!&.]) +EOL = noise* '\r'? '\n' +EOF = !. + +ignore_rest_of_line = (_[^\n]*)? + +statement = _* s:(break / continue / function / function_call + / function_return / loop / conditional / operation / expression) { return s } + +break = 'break'i ignore_rest_of_line { + return { 'break' : {} } +} + +continue = ('continue'i ignore_rest_of_line / 'take it to the top'i) { + return { 'continue' : {} } +} + +takes = ('takes'i / 'wants'i) +function = name:variable _ takes _ args:variable_list EOL body:block EOL + { return { 'function': { + name: name, + args: args.map(arg => arg), + body: body + } } } + + +expression_list_separator = (_? ', and'i _ / _?('&' / ',' / "'n'"i)_?) + +variable_list_separator = expression_list_separator / _ 'and'i _ + +variable_list = head:variable variable_list_separator tail:variable_list + { return [head].concat(tail) } + / arg:variable { return [arg] } + +function_call = name:variable _ 'taking'i _ args:expression_list + { return { 'call': { name: name, args: Array.isArray(args) ? args : [args] } } } + +expression_list = head:simple_expression expression_list_separator tail:expression_list + { return [head].concat(tail) } + / arg:simple_expression { return [arg] } + +return = 'return'i / 'give back'i / 'send'i / 'give'i + +function_return = return _ e:expression (_ 'back'i)? + { return { 'return': { 'expression' : e } } } + +operation = readline / output / crement / mutation / assignment / rounding + +readline + = 'listen to'i _ target:assignable + { return { assign: { expression: { listen : ''}, target: target } } } + / 'listen'i + { return { 'listen' : ''} } + +continuation = EOL _* s:statement { return s }; + +block = head:statement tail:(continuation)+ + { + return { list : [head].concat(tail) } + } + / s:statement { return s } + +consequent = _ s:statement { return s } + / EOL s:block { return s } + +alternate = _ 'else'i _ a:statement { return a } + / EOL+ _* 'else'i _ a:statement { return a } + / EOL+ _* 'else'i EOL a:block { return a } + / EOL { return null } + +conditional = 'if'i _ e:expression c:consequent? a:alternate? { + return { + 'conditional': { + 'condition' : e, + 'consequent' : c, + 'alternate' : a + } + }; + } + +loopable = _ s:statement { return s } + / EOL s:block EOL { return s } + +loop = 'while'i _ e:expression c:loopable + { return { 'while_loop': { + 'condition': e, + 'consequent': c + } }; } + / + 'until'i _ e:expression c:loopable + { return { 'until_loop': { + 'condition': e, + 'consequent': c + } }; } + +output = ('say'i/'shout'i/'whisper'i/'scream'i) _ e:expression + {return {'output': e}} + +simple_expression = function_call / constant / lookup / literal / pronoun + +literal = constant / number / string + +constant = null / true / false / empty_string / mysterious + +true = ('true'i / 'ok'i / 'right'i / 'yes'i) !letter { return { constant: true } } + +false = ('false'i / 'lies'i / 'wrong'i / 'no'i) !letter { return { constant: false } } + +null = ('null'i / 'nothing'i / 'nowhere'i / 'nobody'i / 'gone'i) { return { constant: null } } + +empty_string = ('empty'i / 'silent'i / 'silence'i) { return { constant: "" } } + +mysterious = 'mysterious'i { return '__MYSTERIOUS__' } + +number = n:$('-'?[0-9]+ ('.' [0-9]+)?) '.'? + { return {number: parseFloat(n)} } + / + n:$('.' [0-9]+) + { return {number: parseFloat(n) } } + + +string = '"' s:$[^"]* '"' + { return {string: s}} + +expression = boolean + +boolean = nor + +nor = lhs:or _ 'nor'i _ rhs:nor { + return { 'binary' : { op: 'nor', lhs: lhs, rhs: rhs } } } + / or + +or = lhs:and _ 'or'i _ rhs:or { + return { 'binary': { + op: 'or', + lhs: lhs, + rhs: rhs + } } + } + /and + +and = lhs:equality_check _ 'and'i _ rhs:and { + return { 'binary': { + op: 'and', + lhs: lhs, + rhs: rhs + } } + } + / + equality_check + +eq = isnt { return 'ne' } + / is { return 'eq' } + +equality_check = lhs:not c:eq rhs:equality_check + { + return { + comparison: { + comparator: c, + lhs: lhs, + rhs: rhs + } + }; + } + / + not + + not = 'not'i _ e:not { return { 'not': { expression: e} } } + / comparison + +comparison = lhs:arithmetic c:comparator rhs:comparison + { + return { + comparison: { + comparator: c, + lhs: lhs, + rhs: rhs + } + }; + } + / + arithmetic + +greater = ('higher'i / 'greater'i / 'bigger'i / 'stronger'i) +smaller = ('lower'i / 'less'i / 'smaller'i / 'weaker'i) +great = ('high'i / 'great'i / 'big'i / 'strong'i) +small = ('low'i / 'little'i / 'small'i / 'weak'i) + +comparator = is greater _ 'than'i _ { return 'gt' } + / is smaller _ 'than'i _ { return 'lt' } + / is 'as'i _ great _ 'as'i _ { return 'ge' } + / is 'as'i _ small _ 'as'i _ { return 'le' } + + +arithmetic = first:product_simple rest:((add / subtract) product_expression_list)+ + { return rest.reduce(function(memo, curr) { + return { binary: { op: curr[0], lhs: memo, rhs: curr[1]} }; + }, first); } + / product_simple + +product = first:simple_expression rest:((multiply / divide) expression_list)+ + { return rest.reduce(function(memo, curr) { + return { binary: { op: curr[0], lhs: memo, rhs: curr[1]} }; + }, first); } + +product_simple = product / simple_expression + +product_expression_list = product / expression_list + +// Note that operator aliases explicitly include a trailing space, +// otherwise 'with' is a prefix code for 'without' and confuses the parser. +add = _* ('+' / 'plus 'i / 'with 'i) _* { return '+' } +subtract = _* ('-' / 'minus 'i / 'without 'i) _* { return '-' } +multiply = _* ('*' / 'times 'i / 'of 'i) _* { return '*' } +divide = _* ('/' / 'over 'i / 'between 'i) _* { return '/' } + +compoundable_operator = add / subtract / multiply / divide + +pronoun = pronoun:( + 'they'i / 'them'i + / 'she'i / 'him'i / 'her'i / 'hir'i / 'zie'i / 'zir'i / 'xem'i / 'ver'i + / 'ze'i / 've'i / 'xe'i / 'it'i / 'he'i + ) &(is / _ / EOL / EOF) + { return { pronoun: pronoun.toLowerCase() } } + +common_prefix = ( 'an'i / 'a'i / 'the'i / 'my'i / 'your'i / 'our'i) + +uppercase_letter = [A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĸĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ] +lowercase_letter = [a-zàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷÿźżžʼnß] + +letter = uppercase_letter / lowercase_letter + +common_variable = prefix:common_prefix _ name:$(letter+) + { return (prefix + '_' + name).toLowerCase() }; + +is = ("'s"i / "'re"i / _ ('=' / 'is'i / 'was'i / 'are'i / 'were'i)) _ + +isnt = _ ( + 'isnt'i / "isn't"i / + 'aint'i / "ain't"i / + 'arent'i / "aren't"i / + 'wasnt'i / "wasn't"i / + 'werent'i / "weren't"i + ) _ + +push = ('rock'i / 'push'i ) +pop = ('roll'i / 'pop'i) +into = _ ('into'i / 'in'i) _ + +delist = pop _ v:variable + { return { delist: { variable: v } }; } + +lookup + = d:delist { return d; } + / v:variable _ 'at'i _ i:expression + { return { lookup: { variable: v, index: i } }; } + / v:variable + { return { lookup: { variable: v } }; } + +indexer = _ 'at'i _ i:expression { return i }; + +assignable + = v:variable i:indexer? + { return { variable: v, index: i }; } + +assignment = target:assignable is _* e:(literal / poetic_number) + { return { assign: { target: target, expression: e} }; } + + / target:assignable _ ('says 'i / 'say 'i / 'said 'i) e:poetic_string + { return { assign: { target: target, expression: e} }; } + + / 'put'i _ e:expression into target:assignable + { return { assign: { target: target, expression: e} }; } + + + / 'let'i _ target:assignable _ 'be'i o:compoundable_operator e:(expression_list / expression) { + return { assign: { + target: target, + expression: { binary: { op: o, lhs: { lookup: target }, rhs: e } } + } }; + } + + / 'let'i _ t:assignable _ 'be'i _ e:expression + { return { assign: { target: t, expression: e} }; } + + / push _ e:expression into v:variable + { return { enlist: { variable: v, expression: e } }; } + + / push _ v:variable _ 'like'i _ e:(literal / poetic_number) + { return { enlist: { variable: v, expression: e } }; } + + / push _ v:variable (_ 'with'i)? _ e:(expression_list / expression) + { return { enlist: { variable: v, expression: e } }; } + + / push _ v:variable + { return { enlist: { variable: v } }; } + + / e:delist into target:assignable + { return { assign: { target: target, expression: e } }; } + +poetic_string = s:$[^\r\n]* + { return { string: s} } + +poetic_number = poetic_digit_separator* n:poetic_digits poetic_digit_separator* d:poetic_decimal? poetic_digit_separator* + + { return { number: parseFloat(d?n+'.'+d:n)}} + +poetic_decimal = '.' poetic_decimal_digit_separator* d:poetic_decimal_digits poetic_decimal_digit_separator* {return d} + / + '.' poetic_decimal_digit_separator* + +poetic_digit_separator = ( _ / [0-9\',;:?!+_/] ) + +poetic_digits = + poetic_digit_separator* head:poetic_digit poetic_digit_separator+ tail:poetic_digits + { return head + tail } + / + d: poetic_digit + { return d } + +poetic_decimal_digit_separator = ( _ / poetic_digit_separator / '.') +poetic_decimal_digits = + poetic_decimal_digit_separator* head:poetic_digit poetic_decimal_digit_separator+ tail:poetic_decimal_digits + { return head + tail } + / + d: poetic_digit + { return d } + +poetic_digit = t:[A-Za-z\-']+ + { return (t.filter(c => /[A-Za-z\-]/.test(c)).length%10).toString()} + +variable = common_variable / proper_variable / pronoun / simple_variable + +simple_variable = name:$(letter letter*) !{ return isKeyword(name) } { return name.toLowerCase() } + +proper_noun = noun:$(uppercase_letter letter*) !{ return isKeyword(noun) } { return noun } + +proper_variable = head:$(proper_noun (' ' $proper_noun)*) + { return head.replace(/ /g, '_').toLowerCase() } + +crement = increment / decrement + +increment = 'build'i _ v:variable _ t:('up'i noise*)+ + { return { + increment: { + variable: v, + multiple: t.length + } + }; } + +decrement = 'knock'i _ v:variable _ t:('down'i noise*)+ + { return { + decrement: { + variable: v, + multiple: t.length + } + }; } + + +split = ('cut'i / 'split'i / 'shatter'i) { return 'split' } +cast = ('cast'i / 'burn'i) { return 'cast' } +join = ('join'i / 'unite'i) { return 'join' } + +mutator = split / cast / join +modifier = _ ('with'i / 'using'i) _ m:expression { return m } + +mutation + = op:mutator _ s:expression into t:assignable m:modifier? + { return { assign: { target: t, expression: { mutation: { type: op, source: s, modifier: m } } } } ; } + / op:mutator _ s:assignable m:modifier? + { return { assign: { target: s, expression: { mutation: { type: op, source: { lookup: s }, modifier: m } } } } ; } + +rounding = floor / ceil / math_round + +floor + = 'turn'i _ v:variable _ 'down'i + { return { rounding: { variable: v, direction: 'down' } }; } + / 'turn'i _ 'down'i _ v:variable + { return { rounding: { variable: v, direction: 'down' } }; } + +ceil + = 'turn'i _ v:variable _ 'up'i + { return { rounding: { variable: v, direction: 'up' } }; } + / 'turn'i _ 'up'i _ v:variable + { return { rounding: { variable: v, direction: 'up' } }; } + +math_round + = 'turn'i _ v:variable _ ('round'i/'around'i) + { return { rounding: { variable: v, direction: 'nearest' } }; } + / 'turn'i _ ('round'i/'around'i) _ v:variable + { return { rounding: { variable: v, direction: 'nearest' } }; } \ No newline at end of file diff --git a/satriani/satriani.interpreter.js b/satriani/satriani.interpreter.js new file mode 100644 index 0000000..abb498b --- /dev/null +++ b/satriani/satriani.interpreter.js @@ -0,0 +1,440 @@ +module.exports = { + Environment: Environment, + eq: eq +} + +const MYSTERIOUS = '__MYSTERIOUS__'; + +function Environment(parent) { + this.vars = Object.create(parent ? parent.vars : null); + this.parent = parent; + this.output = (parent && parent.output ? parent.output : console.log); + // Because nodeJS is based on asynchronous IO, there is no built-in console.readline or similar + // so by default, any input will yield an empty string. + this.input = (parent && parent.input ? parent.input : () => "") +} + +Environment.prototype = { + extend: function () { return new Environment(this) }, + + exists: function (name) { + return (name in this.vars); + }, + + lookup: function (name, index) { + if (name in this.vars == false) { + throw new Error("Undefined variable " + name); + } + let variable = this.vars[name]; + if (Array.isArray(variable)) { + if (typeof (index) == 'undefined' || index == null) { + return variable; + } + return variable[index]; + } + if (typeof (variable) == 'string' && typeof (index) == 'number') { + return (variable[index]); + } + return variable; + }, + + assign: function (name, value, index, local) { + let container = (!local && typeof (value) != "function" && this.parent && name in this.parent.vars) ? this.parent.vars : this.vars; + if (typeof (index) == 'undefined' || index == null) return container[name] = value; + if (name in container) { + if (!Array.isArray(container[name])) throw new Error(`Can't assign ${name} at ${index} - ${name} is not an indexed variable.`); + } else { + container[name] = new Array(); + } + return container[name][index] = value; + }, + + run: function (program) { + let result = evaluate(program, this); + return (result ? result.value : undefined); + }, + + dealias: function (expr) { + if (expr.variable.pronoun) return this.pronoun_alias; + return (expr.variable); + }, + + pronoun_alias: null, +} + +function toScalar(value) { + if (Array.isArray(value)) { + return value.length; + } + return value; +} + +function evaluate(tree, env) { + if (tree == MYSTERIOUS || typeof (tree) == 'undefined') return undefined; + if (tree == null) return null; + let list = Object.entries(tree) + for (let i = 0; i < list.length; i++) { + let node = list[i]; + let type = node[0]; + let expr = node[1]; + switch (type) { + case "action": return (tree); + case "list": + let result = null; + for (let i = 0; i < expr.length; i++) { + let next = expr[i]; + result = evaluate(next, env); + if (result && result.action) return (result); + } + return result; + case "conditional": + if (toScalar(evaluate(expr.condition, env))) { + return evaluate(expr.consequent, env); + } else if (expr.alternate) { + return evaluate(expr.alternate, env); + } + return; + case 'break': + return { 'action': 'break' }; + case 'continue': + return { 'action': 'continue' }; + case "return": + return { 'action': 'return', 'value': evaluate(expr.expression, env) }; + case "number": + case "string": + case "constant": + return (expr); + case "output": + let printable = toScalar(evaluate(expr, env)); + if (typeof (printable) == 'undefined') printable = "mysterious"; + env.output(printable); + return; + case "listen": + return env.input(); + case "binary": + return binary(expr, env); + case "lookup": + return lookup(expr, env); + case "assign": + return assign(expr, env); + case "pronoun": + return env.lookup(env.pronoun_alias); + case "blank": + return; + case "rounding": + return rounding(expr, env); + case "mutation": + return mutation(expr, env); + case "increment": + let increment_name = env.dealias(expr); + let old_increment_value = env.lookup(increment_name); + switch (typeof (old_increment_value)) { + case "boolean": + if (expr.multiple % 2 != 0) env.assign(increment_name, !old_increment_value); + return; + default: + env.assign(increment_name, (old_increment_value + expr.multiple)); + return; + } + case "decrement": + let decrement_name = env.dealias(expr); + let old_decrement_value = env.lookup(decrement_name); + switch (typeof (old_decrement_value)) { + case "boolean": + if (expr.multiple % 2 != 0) env.assign(decrement_name, !old_decrement_value); + return; + default: + env.assign(decrement_name, (old_decrement_value - expr.multiple)); + return; + } + case "while_loop": + while_outer: while (toScalar(evaluate(expr.condition, env))) { + let result = evaluate(expr.consequent, env); + if (result) switch (result.action) { + case 'continue': + continue while_outer; + case 'break': + break while_outer; + case 'return': + return (result); + } + } + return; + case "until_loop": + until_outer: while (!toScalar(evaluate(expr.condition, env))) { + let result = evaluate(expr.consequent, env); + if (result) switch (result.action) { + case 'continue': + continue until_outer; + case 'break': + break until_outer; + case 'return': + return (result); + } + } + return; + case "comparison": + let lhs = evaluate(expr.lhs, env); + let rhs = evaluate(expr.rhs, env); + switch (expr.comparator) { + case "eq": + return eq(lhs, rhs); + case "ne": + return !eq(lhs, rhs); + case "lt": + return (toScalar(lhs) < toScalar(rhs)); + case "le": + return (toScalar(lhs) <= toScalar(rhs)); + case "ge": + return (toScalar(lhs) >= toScalar(rhs)); + case "gt": + return (toScalar(lhs) > toScalar(rhs)); + default: + throw new Error(`Unknown comparison operator ${expr.comparator}`); + } + case "not": + return (!toScalar(evaluate(expr.expression, env))); + case "function": + env.assign(expr.name, make_lambda(expr, env)); + return; + case "call": + let func = env.lookup(expr.name); + let func_result = func.apply(null, expr.args.map(arg => { + let value = evaluate(arg, env); + // If the arg is an array, we shallow-copy it when passing it to a function call + return (value && value.map ? value.map(e => e) : value); + })); + return (func_result ? func_result.value : undefined); + case "enlist": + return enlist(expr, env); + case "delist": + return delist(expr, env); + default: + if (Array.isArray(tree) && tree.length == 1) return (evaluate(tree[0], env)); + throw new Error("Sorry - I don't know how to evaluate this: " + JSON.stringify(tree)) + } + } +} + +function mutation(expr, env) { + let source = evaluate(expr.source, env); + let modifier = evaluate(expr.modifier, env); + switch (expr.type) { + case "split": + return source.toString().split(modifier || ""); + case "cast": + if (typeof (source) == 'string') return parseInt(source, modifier); + if (typeof (source) == 'number') return String.fromCharCode(source); + if (Array.isArray(source)) return String.fromCharCode(toScalar(source)); + throw new Error(`I don't know how to cast ${source}`); + case "join": + if (Array.isArray(source)) { + let joiner = (typeof (modifier) == 'undefined' || modifier == null) ? '' : modifier; + return source.join(joiner); + } + throw new Error("I don't know how to join that."); + } +} + +function lookup(expr, env) { + let lookup_name = env.dealias(expr); + let index = evaluate(expr.index, env); + return env.lookup(lookup_name, index); +} + +function assign(expr, env) { + let target = expr.target; + let index = evaluate(target.index, env); + let alias = (target.variable.pronoun ? env.pronoun_alias : target.variable); + let value = evaluate(expr.expression, env); + env.assign(alias, value, index); + if (!target.variable.pronoun) env.pronoun_alias = alias; + return value; +} + +function enlist(expr, env) { + + let array_value; + let array_name = env.dealias(expr); + + if (env.exists(array_name)) { + array_value = env.lookup(array_name, null, true); + if (!Array.isArray(array_value)) array_value = [array_value]; + } else { + array_value = []; + } + if (expr.expression) { + let elements_to_enlist = (expr.expression.map ? expr.expression : [expr.expression]); + array_value = array_value.concat(elements_to_enlist.map(e => evaluate(e, env))); + } + env.assign(array_name, array_value); + return array_value; + + // let alias = ""; + // let target = expr.target; + // let index = evaluate(target.index, env); + // if (target.variable.pronoun) { + // alias = env.pronoun_alias; + // } else { + // alias = target.variable; + // env.pronoun_alias = alias; + // } + + // let value; + // if (env.exists(alias)) { + // value = env.lookup(alias); + // if (!Array.isArray(value)) value = [value]; + // } else { + // value = []; + // } + // if (expr.expression) { + // let values = (expr.expression.map ? expr.expression : [expr.expression]); + // value = value.concat(values.map(e => evaluate(e, env))); + // } + // env.assign(alias, value, index); + // return value; +} + +function delist(expr, env) { + let name = env.dealias(expr); + let source = env.lookup(name, null) + let result = (source.shift && source.shift()); + return result; +} + +function rounding(expr, env) { + let variable_name = env.dealias(expr); + let variable_value = env.lookup(variable_name); + switch (expr.direction) { + case "up": + return env.assign(variable_name, Math.ceil(variable_value)); + case "down": + return env.assign(variable_name, Math.floor(variable_value)); + default: + return env.assign(variable_name, Math.round(variable_value)); + } +} + +function demystify(expr, env) { + let result = evaluate(expr, env); + if (typeof (result) == 'undefined') return ('mysterious'); + return (result); +} + +function eq(lhs, rhs) { + if (Array.isArray(lhs)) return (eq_array(lhs, rhs)); + if (Array.isArray(rhs)) return (eq_array(rhs, lhs)); + + if (is_nothing(lhs) && is_nothing(rhs)) return (true); + // if (typeof (lhs) == 'undefined') return (typeof (rhs) == 'undefined'); + // if (typeof (rhs) == 'undefined') return (typeof (lhs) == 'undefined'); + + if (typeof (lhs) == 'boolean') return (eq_boolean(lhs, rhs)); + if (typeof (rhs) == 'boolean') return (eq_boolean(rhs, lhs)); + + if (typeof (lhs) == 'number') return (eq_number(lhs, rhs)); + if (typeof (rhs) == 'number') return (eq_number(rhs, lhs)); + + if (typeof (lhs) == 'string') return (eq_string(lhs, rhs)); + if (typeof (rhs) == 'string') return (eq_string(rhs, lhs)); + + return lhs == rhs; +} + +function is_nothing(thing) { + return ( + typeof (thing) == 'undefined' + || + thing === null + || + thing === "" + || + thing == 0 + || + thing == false + ); +} + +function eq_array(array, other) { + if (Array.isArray(other)) return ((array.length == other.length) && array.every((el, ix) => eq(el, other[ix]))); + if (other == null || other == 0 || other == "") return (array.length == 0); + return (false); +} + +function eq_string(string, other) { + if (other == null || typeof (other) == 'undefined') return (string === ""); + return (other == string); +} + +function eq_number(number, other) { + if (other == null || typeof (other) == 'undefined') return (number === 0); + return (other == number); +} + +function eq_boolean(bool, other) { + // false equals null in Rockstar + if (other == null) other = false; + // false equals zero in Rockstar + if (typeof (other) == 'number') other = (other !== 0); + if (typeof (other) == 'string') other = (other !== ""); + return (bool == other); +} + +function make_lambda(expr, env) { + function lambda() { + let names = expr.args; + if (names.length != arguments.length) throw ('Wrong number of arguments supplied to function ' + expr.name + ' (' + expr.args + ')'); + let scope = env.extend(); + for (let i = 0; i < names.length; ++i) scope.assign(names[i], arguments[i], null, 1) + return evaluate(expr.body, scope); + } + + return lambda; +} + +function binary(b, env) { + switch (b.op) { + case "and": return (toScalar(evaluate(b.lhs, env)) && toScalar(evaluate(b.rhs, env))); + case "nor": return (!toScalar(evaluate(b.lhs, env)) && !toScalar(evaluate(b.rhs, env))); + case "or": return (toScalar(evaluate(b.lhs, env)) || toScalar(evaluate(b.rhs, env))); + case '+': return add(b.lhs, b.rhs, env); + case '-': return subtract(b.lhs, b.rhs, env); + case '/': return divide(b.lhs, b.rhs, env); + case '*': return multiply(b.lhs, b.rhs, env); + } +} + +function add(lhs, rhs, env) { + return (rhs.reduce ? rhs : [rhs]).reduce((acc, val) => acc += toScalar(demystify(val, env)), toScalar(demystify(lhs, env))); +} + +function subtract(lhs, rhs, env) { + return (rhs.reduce ? rhs : [rhs]).reduce((acc, val) => acc -= toScalar(evaluate(val, env)), toScalar(evaluate(lhs, env))); +} + +function divide(lhs, rhs, env) { + return (rhs.reduce ? rhs : [rhs]).reduce((acc, val) => acc /= toScalar(evaluate(val, env)), toScalar(evaluate(lhs, env))); +} + +function multiply(lhs, rhs, env) { + return (rhs.reduce ? rhs : [rhs]) + .map(expr => toScalar(evaluate(expr, env))) + .reduce(multiply_reduce, toScalar(evaluate(lhs, env))); +} + +function multiply_reduce(acc, val, idx, src) { + // Null, nothing, noone, nowhere, etc. are all zero for multiplication purposes. + if (acc == null) acc = 0; + if (val == null) val = 0; + // Mu ltiplying numbers just works. + if (typeof (acc) == 'number' && typeof (val) == 'number') return (acc * val); + // Multiplying strings by numbers does repeated concatenation + if (typeof (acc) == 'string' && typeof (val) == 'number') return multiply_string(acc, val); + if (typeof (acc) == 'number' && typeof (val) == 'string') return multiply_string(val, acc); +} + +function multiply_string(s, n) { + let result = Array(); + while (--n >= 0) result.push(s); + return (result.join('')); +} diff --git a/satriani/satriani.js b/satriani/satriani.js new file mode 100644 index 0000000..2f8ec4c --- /dev/null +++ b/satriani/satriani.js @@ -0,0 +1,18 @@ +const parser = require('./satriani.parser.js'); +const interpreter = require('./satriani.interpreter.js'); + +module.exports = { + Interpreter : function() { + this.run = function(program, input, output) { + if (typeof(program) == 'string') program = this.parse(program); + let env = new interpreter.Environment(); + env.output = output || console.log; + env.input = input || (() => ""); + return env.run(program); + } + + this.parse = function(program) { + return parser.parse(program); + } + } +}; diff --git a/satriani/satriani.parser.cache.js b/satriani/satriani.parser.cache.js new file mode 100644 index 0000000..36f2842 --- /dev/null +++ b/satriani/satriani.parser.cache.js @@ -0,0 +1,6952 @@ +/* + * Generated by PEG.js 0.10.0. + * + * http://pegjs.org/ + */ + +"use strict"; + +function peg$subclass(child, parent) { + function ctor() { this.constructor = child; } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); +} + +function peg$SyntaxError(message, expected, found, location) { + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; + + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, peg$SyntaxError); + } +} + +peg$subclass(peg$SyntaxError, Error); + +peg$SyntaxError.buildMessage = function(expected, found) { + var DESCRIBE_EXPECTATION_FNS = { + literal: function(expectation) { + return "\"" + literalEscape(expectation.text) + "\""; + }, + + "class": function(expectation) { + var escapedParts = "", + i; + + for (i = 0; i < expectation.parts.length; i++) { + escapedParts += expectation.parts[i] instanceof Array + ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1]) + : classEscape(expectation.parts[i]); + } + + return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; + }, + + any: function(expectation) { + return "any character"; + }, + + end: function(expectation) { + return "end of input"; + }, + + other: function(expectation) { + return expectation.description; + } + }; + + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + + function literalEscape(s) { + return s + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\0/g, '\\0') + .replace(/\t/g, '\\t') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); + } + + function classEscape(s) { + return s + .replace(/\\/g, '\\\\') + .replace(/\]/g, '\\]') + .replace(/\^/g, '\\^') + .replace(/-/g, '\\-') + .replace(/\0/g, '\\0') + .replace(/\t/g, '\\t') + .replace(/\n/g, '\\n') + .replace(/\r/g, '\\r') + .replace(/[\x00-\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) + .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x' + hex(ch); }); + } + + function describeExpectation(expectation) { + return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); + } + + function describeExpected(expected) { + var descriptions = new Array(expected.length), + i, j; + + for (i = 0; i < expected.length; i++) { + descriptions[i] = describeExpectation(expected[i]); + } + + descriptions.sort(); + + if (descriptions.length > 0) { + for (i = 1, j = 1; i < descriptions.length; i++) { + if (descriptions[i - 1] !== descriptions[i]) { + descriptions[j] = descriptions[i]; + j++; + } + } + descriptions.length = j; + } + + switch (descriptions.length) { + case 1: + return descriptions[0]; + + case 2: + return descriptions[0] + " or " + descriptions[1]; + + default: + return descriptions.slice(0, -1).join(", ") + + ", or " + + descriptions[descriptions.length - 1]; + } + } + + function describeFound(found) { + return found ? "\"" + literalEscape(found) + "\"" : "end of input"; + } + + return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; +}; + +function peg$parse(input, options) { + options = options !== void 0 ? options : {}; + + var peg$FAILED = {}, + + peg$startRuleFunctions = { program: peg$parseprogram }, + peg$startRuleFunction = peg$parseprogram, + + peg$c0 = function(p) { return { list: p.filter(item => item) } }, + peg$c1 = function(s) { return s }, + peg$c2 = function() { return null }, + peg$c3 = /^[ \t]/, + peg$c4 = peg$classExpectation([" ", "\t"], false, false), + peg$c5 = "(", + peg$c6 = peg$literalExpectation("(", false), + peg$c7 = /^[^)]/, + peg$c8 = peg$classExpectation([")"], true, false), + peg$c9 = ")", + peg$c10 = peg$literalExpectation(")", false), + peg$c11 = /^[;,?!&.]/, + peg$c12 = peg$classExpectation([";", ",", "?", "!", "&", "."], false, false), + peg$c13 = "\n", + peg$c14 = peg$literalExpectation("\n", false), + peg$c15 = peg$anyExpectation(), + peg$c16 = /^[^\n]/, + peg$c17 = peg$classExpectation(["\n"], true, false), + peg$c18 = "break", + peg$c19 = peg$literalExpectation("break", true), + peg$c20 = function() { + return { 'break' : {} } + }, + peg$c21 = "continue", + peg$c22 = peg$literalExpectation("continue", true), + peg$c23 = "take it to the top", + peg$c24 = peg$literalExpectation("take it to the top", true), + peg$c25 = function() { + return { 'continue' : {} } + }, + peg$c26 = "takes", + peg$c27 = peg$literalExpectation("takes", true), + peg$c28 = function(name, args, body) { return { 'function': { + name: name, + args: args.map(arg => arg), + body: body + } } }, + peg$c29 = ", and", + peg$c30 = peg$literalExpectation(", and", false), + peg$c31 = "&", + peg$c32 = peg$literalExpectation("&", false), + peg$c33 = ",", + peg$c34 = peg$literalExpectation(",", false), + peg$c35 = "'n'", + peg$c36 = peg$literalExpectation("'n'", false), + peg$c37 = "and", + peg$c38 = peg$literalExpectation("and", false), + peg$c39 = function(head, tail) { return [head].concat(tail) }, + peg$c40 = function(arg) { return [arg] }, + peg$c41 = "taking", + peg$c42 = peg$literalExpectation("taking", true), + peg$c43 = function(name, args) { return { 'call': { name: name, args: Array.isArray(args) ? args : [args] } } }, + peg$c44 = function(arg) { return arg }, + peg$c45 = "return", + peg$c46 = peg$literalExpectation("return", true), + peg$c47 = "give back", + peg$c48 = peg$literalExpectation("give back", true), + peg$c49 = function(e) { return { 'return': { 'expression' : e } } }, + peg$c50 = "listen to", + peg$c51 = peg$literalExpectation("listen to", true), + peg$c52 = function(target) { return { assign: { expression: { listen : ''}, target: target } } }, + peg$c53 = "listen", + peg$c54 = peg$literalExpectation("listen", true), + peg$c55 = function() { return { 'listen' : ''} }, + peg$c56 = function(head, tail) { + return { list : [head].concat(tail) } + }, + peg$c57 = "else", + peg$c58 = peg$literalExpectation("else", true), + peg$c59 = function(a) { return a }, + peg$c60 = "if", + peg$c61 = peg$literalExpectation("if", true), + peg$c62 = function(e, c, a) { + return { + 'conditional': { + 'condition' : e, + 'consequent' : c, + 'alternate' : a + } + }; + }, + peg$c63 = "while", + peg$c64 = peg$literalExpectation("while", true), + peg$c65 = function(e, c) { return { 'while_loop': { + 'condition': e, + 'consequent': c + } }; }, + peg$c66 = "until", + peg$c67 = peg$literalExpectation("until", true), + peg$c68 = function(e, c) { return { 'until_loop': { + 'condition': e, + 'consequent': c + } }; }, + peg$c69 = "say", + peg$c70 = peg$literalExpectation("say", true), + peg$c71 = "shout", + peg$c72 = peg$literalExpectation("shout", true), + peg$c73 = "whisper", + peg$c74 = peg$literalExpectation("whisper", true), + peg$c75 = "scream", + peg$c76 = peg$literalExpectation("scream", true), + peg$c77 = function(e) {return {'output': e}}, + peg$c78 = "true", + peg$c79 = peg$literalExpectation("true", true), + peg$c80 = "ok", + peg$c81 = peg$literalExpectation("ok", true), + peg$c82 = "right", + peg$c83 = peg$literalExpectation("right", true), + peg$c84 = "yes", + peg$c85 = peg$literalExpectation("yes", true), + peg$c86 = function() { return { constant: true } }, + peg$c87 = "false", + peg$c88 = peg$literalExpectation("false", true), + peg$c89 = "lies", + peg$c90 = peg$literalExpectation("lies", true), + peg$c91 = "wrong", + peg$c92 = peg$literalExpectation("wrong", true), + peg$c93 = "no", + peg$c94 = peg$literalExpectation("no", true), + peg$c95 = function() { return { constant: false } }, + peg$c96 = "null", + peg$c97 = peg$literalExpectation("null", true), + peg$c98 = "nothing", + peg$c99 = peg$literalExpectation("nothing", true), + peg$c100 = "nowhere", + peg$c101 = peg$literalExpectation("nowhere", true), + peg$c102 = "nobody", + peg$c103 = peg$literalExpectation("nobody", true), + peg$c104 = "empty", + peg$c105 = peg$literalExpectation("empty", true), + peg$c106 = "gone", + peg$c107 = peg$literalExpectation("gone", true), + peg$c108 = function() { return { constant: null } }, + peg$c109 = "mysterious", + peg$c110 = peg$literalExpectation("mysterious", false), + peg$c111 = function() { return '__MYSTERIOUS__' }, + peg$c112 = "-", + peg$c113 = peg$literalExpectation("-", false), + peg$c114 = /^[0-9]/, + peg$c115 = peg$classExpectation([["0", "9"]], false, false), + peg$c116 = ".", + peg$c117 = peg$literalExpectation(".", false), + peg$c118 = function(n) { return {number: parseFloat(n)} }, + peg$c119 = function(n) { return {number: parseFloat(n) } }, + peg$c120 = "\"", + peg$c121 = peg$literalExpectation("\"", false), + peg$c122 = /^[^"]/, + peg$c123 = peg$classExpectation(["\""], true, false), + peg$c124 = function(s) { return {string: s}}, + peg$c125 = "nor", + peg$c126 = peg$literalExpectation("nor", false), + peg$c127 = function(lhs, rhs) { + return { 'binary' : { op: 'nor', lhs: lhs, rhs: rhs } } }, + peg$c128 = "or", + peg$c129 = peg$literalExpectation("or", false), + peg$c130 = function(lhs, rhs) { + return { 'binary': { + op: 'or', + lhs: lhs, + rhs: rhs + } } + }, + peg$c131 = function(lhs, rhs) { + return { 'binary': { + op: 'and', + lhs: lhs, + rhs: rhs + } } + }, + peg$c132 = "aint", + peg$c133 = peg$literalExpectation("aint", true), + peg$c134 = "ain't", + peg$c135 = peg$literalExpectation("ain't", true), + peg$c136 = function() { return 'ne' }, + peg$c137 = "is", + peg$c138 = peg$literalExpectation("is", true), + peg$c139 = function() { return 'eq' }, + peg$c140 = function(lhs, c, rhs) { + return { + comparison: { + comparator: c, + lhs: lhs, + rhs: rhs + } + }; + }, + peg$c141 = "not", + peg$c142 = peg$literalExpectation("not", false), + peg$c143 = function(e) { return { 'not': { expression: e} } }, + peg$c144 = "higher", + peg$c145 = peg$literalExpectation("higher", true), + peg$c146 = "greater", + peg$c147 = peg$literalExpectation("greater", true), + peg$c148 = "bigger", + peg$c149 = peg$literalExpectation("bigger", true), + peg$c150 = "stronger", + peg$c151 = peg$literalExpectation("stronger", true), + peg$c152 = "lower", + peg$c153 = peg$literalExpectation("lower", true), + peg$c154 = "less", + peg$c155 = peg$literalExpectation("less", true), + peg$c156 = "smaller", + peg$c157 = peg$literalExpectation("smaller", true), + peg$c158 = "weaker", + peg$c159 = peg$literalExpectation("weaker", true), + peg$c160 = "high", + peg$c161 = peg$literalExpectation("high", true), + peg$c162 = "great", + peg$c163 = peg$literalExpectation("great", true), + peg$c164 = "big", + peg$c165 = peg$literalExpectation("big", true), + peg$c166 = "strong", + peg$c167 = peg$literalExpectation("strong", true), + peg$c168 = "low", + peg$c169 = peg$literalExpectation("low", true), + peg$c170 = "small", + peg$c171 = peg$literalExpectation("small", true), + peg$c172 = "weak", + peg$c173 = peg$literalExpectation("weak", true), + peg$c174 = "than", + peg$c175 = peg$literalExpectation("than", true), + peg$c176 = function() { return 'gt' }, + peg$c177 = function() { return 'lt' }, + peg$c178 = "as", + peg$c179 = peg$literalExpectation("as", true), + peg$c180 = function() { return 'ge' }, + peg$c181 = function() { return 'le' }, + peg$c182 = function(first, rest) { return rest.reduce(function(memo, curr) { + return { binary: { op: curr[0], lhs: memo, rhs: curr[1]} }; + }, first); }, + peg$c183 = function(first, rest) { return rest.reduce(function(memo, curr) { + return { binary: { op: curr[0], lhs: memo, rhs: curr[1]} }; + }, first); }, + peg$c184 = "+", + peg$c185 = peg$literalExpectation("+", false), + peg$c186 = "plus ", + peg$c187 = peg$literalExpectation("plus ", false), + peg$c188 = "with ", + peg$c189 = peg$literalExpectation("with ", false), + peg$c190 = function() { return '+' }, + peg$c191 = "minus ", + peg$c192 = peg$literalExpectation("minus ", false), + peg$c193 = "without ", + peg$c194 = peg$literalExpectation("without ", false), + peg$c195 = function() { return '-' }, + peg$c196 = "*", + peg$c197 = peg$literalExpectation("*", false), + peg$c198 = "times ", + peg$c199 = peg$literalExpectation("times ", false), + peg$c200 = "of ", + peg$c201 = peg$literalExpectation("of ", false), + peg$c202 = function() { return '*' }, + peg$c203 = "/", + peg$c204 = peg$literalExpectation("/", false), + peg$c205 = "over ", + peg$c206 = peg$literalExpectation("over ", false), + peg$c207 = "between ", + peg$c208 = peg$literalExpectation("between ", false), + peg$c209 = function() { return '/' }, + peg$c210 = "they", + peg$c211 = peg$literalExpectation("they", true), + peg$c212 = "them", + peg$c213 = peg$literalExpectation("them", true), + peg$c214 = "she", + peg$c215 = peg$literalExpectation("she", true), + peg$c216 = "him", + peg$c217 = peg$literalExpectation("him", true), + peg$c218 = "her", + peg$c219 = peg$literalExpectation("her", true), + peg$c220 = "hir", + peg$c221 = peg$literalExpectation("hir", true), + peg$c222 = "zie", + peg$c223 = peg$literalExpectation("zie", true), + peg$c224 = "zir", + peg$c225 = peg$literalExpectation("zir", true), + peg$c226 = "xem", + peg$c227 = peg$literalExpectation("xem", true), + peg$c228 = "ver", + peg$c229 = peg$literalExpectation("ver", true), + peg$c230 = "ze", + peg$c231 = peg$literalExpectation("ze", true), + peg$c232 = "ve", + peg$c233 = peg$literalExpectation("ve", true), + peg$c234 = "xe", + peg$c235 = peg$literalExpectation("xe", true), + peg$c236 = "it", + peg$c237 = peg$literalExpectation("it", true), + peg$c238 = "he", + peg$c239 = peg$literalExpectation("he", true), + peg$c240 = function(pronoun) { return { pronoun: pronoun.toLowerCase() } }, + peg$c241 = "at", + peg$c242 = peg$literalExpectation("at", true), + peg$c243 = function(v, i) { return { lookup: { variable: v, index: i } }; }, + peg$c244 = function(v) { return { lookup: { variable: v } }; }, + peg$c245 = "an", + peg$c246 = peg$literalExpectation("an", true), + peg$c247 = "a", + peg$c248 = peg$literalExpectation("a", true), + peg$c249 = "the", + peg$c250 = peg$literalExpectation("the", true), + peg$c251 = "my", + peg$c252 = peg$literalExpectation("my", true), + peg$c253 = "your", + peg$c254 = peg$literalExpectation("your", true), + peg$c255 = /^[A-Z\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0138\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D]/, + peg$c256 = peg$classExpectation([["A", "Z"], "\xC0", "\xC1", "\xC2", "\xC3", "\xC4", "\xC5", "\xC6", "\xC7", "\xC8", "\xC9", "\xCA", "\xCB", "\xCC", "\xCD", "\xCE", "\xCF", "\xD0", "\xD1", "\xD2", "\xD3", "\xD4", "\xD5", "\xD6", "\xD8", "\xD9", "\xDA", "\xDB", "\xDC", "\xDD", "\xDE", "\u0100", "\u0102", "\u0104", "\u0106", "\u0108", "\u010A", "\u010C", "\u010E", "\u0110", "\u0112", "\u0114", "\u0116", "\u0118", "\u011A", "\u011C", "\u011E", "\u0120", "\u0122", "\u0124", "\u0126", "\u0128", "\u012A", "\u012C", "\u012E", "\u0130", "\u0132", "\u0134", "\u0136", "\u0138", "\u0139", "\u013B", "\u013D", "\u013F", "\u0141", "\u0143", "\u0145", "\u0147", "\u014A", "\u014C", "\u014E", "\u0150", "\u0152", "\u0154", "\u0156", "\u0158", "\u015A", "\u015C", "\u015E", "\u0160", "\u0162", "\u0164", "\u0166", "\u0168", "\u016A", "\u016C", "\u016E", "\u0170", "\u0172", "\u0174", "\u0176", "\u0178", "\u0179", "\u017B", "\u017D"], false, false), + peg$c257 = /^[a-z\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\xFF\u017A\u017C\u017E\u0149\xDF]/, + peg$c258 = peg$classExpectation([["a", "z"], "\xE0", "\xE1", "\xE2", "\xE3", "\xE4", "\xE5", "\xE6", "\xE7", "\xE8", "\xE9", "\xEA", "\xEB", "\xEC", "\xED", "\xEE", "\xEF", "\xF0", "\xF1", "\xF2", "\xF3", "\xF4", "\xF5", "\xF6", "\xF8", "\xF9", "\xFA", "\xFB", "\xFC", "\xFD", "\xFE", "\u0101", "\u0103", "\u0105", "\u0107", "\u0109", "\u010B", "\u010D", "\u010F", "\u0111", "\u0113", "\u0115", "\u0117", "\u0119", "\u011B", "\u011D", "\u011F", "\u0121", "\u0123", "\u0125", "\u0127", "\u0129", "\u012B", "\u012D", "\u012F", "\u0131", "\u0133", "\u0135", "\u0137", "\u0138", "\u013A", "\u013C", "\u013E", "\u0140", "\u0142", "\u0144", "\u0146", "\u0148", "\u014B", "\u014D", "\u014F", "\u0151", "\u0153", "\u0155", "\u0157", "\u0159", "\u015B", "\u015D", "\u015F", "\u0161", "\u0163", "\u0165", "\u0167", "\u0169", "\u016B", "\u016D", "\u016F", "\u0171", "\u0173", "\u0175", "\u0177", "\xFF", "\u017A", "\u017C", "\u017E", "\u0149", "\xDF"], false, false), + peg$c259 = function(prefix, name) { return (prefix + '_' + name).toLowerCase() }, + peg$c260 = "'s", + peg$c261 = peg$literalExpectation("'s", false), + peg$c262 = "=", + peg$c263 = peg$literalExpectation("=", false), + peg$c264 = "is ", + peg$c265 = peg$literalExpectation("is ", true), + peg$c266 = "was ", + peg$c267 = peg$literalExpectation("was ", true), + peg$c268 = "are ", + peg$c269 = peg$literalExpectation("are ", true), + peg$c270 = "were ", + peg$c271 = peg$literalExpectation("were ", true), + peg$c272 = "into", + peg$c273 = peg$literalExpectation("into", true), + peg$c274 = function(t) { return t }, + peg$c275 = function(i) { return i }, + peg$c276 = function(v, i) { return { variable: v, index: i }; }, + peg$c277 = function(target, e) { return { assign: { target: target, expression: e} }; }, + peg$c278 = "says ", + peg$c279 = peg$literalExpectation("says ", true), + peg$c280 = "put", + peg$c281 = peg$literalExpectation("put", true), + peg$c282 = function(e, target) { return { assign: { target: target, expression: e} }; }, + peg$c283 = "let", + peg$c284 = peg$literalExpectation("let", true), + peg$c285 = "be", + peg$c286 = peg$literalExpectation("be", true), + peg$c287 = function(target, o, e) { + return { assign: { + target: target, + expression: { binary: { op: o, lhs: { lookup: target }, rhs: e } } + } }; + }, + peg$c288 = function(s) { return { string: s} }, + peg$c289 = function(n, d) { return { number: parseFloat(d?n+'.'+d:n)}}, + peg$c290 = function(d) {return d}, + peg$c291 = /^[0-9',;:?!+_\-\/]/, + peg$c292 = peg$classExpectation([["0", "9"], "'", ",", ";", ":", "?", "!", "+", "_", "-", "/"], false, false), + peg$c293 = function(head, tail) { return head + tail }, + peg$c294 = function(d) { return d }, + peg$c295 = /^[A-Za-z']/, + peg$c296 = peg$classExpectation([["A", "Z"], ["a", "z"], "'"], false, false), + peg$c297 = function(t) { return (t.filter(c => /[A-Za-z]/.test(c)).length%10).toString()}, + peg$c298 = function(name) { return isKeyword(name) }, + peg$c299 = function(name) { return name }, + peg$c300 = function(noun) { return isKeyword(noun) }, + peg$c301 = function(noun) { return noun }, + peg$c302 = " ", + peg$c303 = peg$literalExpectation(" ", false), + peg$c304 = function(head) { return head.replace(/ /g, '_').toLowerCase() }, + peg$c305 = "build", + peg$c306 = peg$literalExpectation("build", true), + peg$c307 = "up", + peg$c308 = peg$literalExpectation("up", true), + peg$c309 = function(v, t) { return { + increment: { + variable: v, + multiple: t.length + } + }; }, + peg$c310 = "knock", + peg$c311 = peg$literalExpectation("knock", true), + peg$c312 = "down", + peg$c313 = peg$literalExpectation("down", true), + peg$c314 = function(v, t) { return { + decrement: { + variable: v, + multiple: t.length + } + }; }, + peg$c315 = "cut", + peg$c316 = peg$literalExpectation("cut", true), + peg$c317 = "split", + peg$c318 = peg$literalExpectation("split", true), + peg$c319 = "shatter", + peg$c320 = peg$literalExpectation("shatter", true), + peg$c321 = function() { return 'split' }, + peg$c322 = "cast", + peg$c323 = peg$literalExpectation("cast", true), + peg$c324 = "burn", + peg$c325 = peg$literalExpectation("burn", true), + peg$c326 = function() { return 'cast' }, + peg$c327 = "join", + peg$c328 = peg$literalExpectation("join", true), + peg$c329 = "unite", + peg$c330 = peg$literalExpectation("unite", true), + peg$c331 = function() { return 'join' }, + peg$c332 = "with", + peg$c333 = peg$literalExpectation("with", true), + peg$c334 = function(m) { return m }, + peg$c335 = function(op, s, m) { return { assign: { target: s, expression: { mutation: { type: op, source: { lookup: s }, modifier: m } } } } ; }, + peg$c336 = function(op, s, t, m) { return { assign: { target: t, expression: { mutation: { type: op, source: s, modifier: m } } } } ; }, + peg$c337 = "turn", + peg$c338 = peg$literalExpectation("turn", true), + peg$c339 = function(v) { return { rounding: { variable: v, direction: 'down' } }; }, + peg$c340 = function(v) { return { rounding: { variable: v, direction: 'up' } }; }, + peg$c341 = function(v) { return { rounding: { variable: v, direction: 'up' } }; }, + peg$c342 = "round", + peg$c343 = peg$literalExpectation("round", true), + peg$c344 = "around", + peg$c345 = peg$literalExpectation("around", true), + peg$c346 = function(v) { return { rounding: { variable: v, direction: 'nearest' } }; }, + + peg$currPos = 0, + peg$savedPos = 0, + peg$posDetailsCache = [{ line: 1, column: 1 }], + peg$maxFailPos = 0, + peg$maxFailExpected = [], + peg$silentFails = 0, + + peg$resultsCache = {}, + + peg$result; + + if ("startRule" in options) { + if (!(options.startRule in peg$startRuleFunctions)) { + throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + } + + peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; + } + + function text() { + return input.substring(peg$savedPos, peg$currPos); + } + + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } + + function expected(description, location) { + location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) + + throw peg$buildStructuredError( + [peg$otherExpectation(description)], + input.substring(peg$savedPos, peg$currPos), + location + ); + } + + function error(message, location) { + location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos) + + throw peg$buildSimpleError(message, location); + } + + function peg$literalExpectation(text, ignoreCase) { + return { type: "literal", text: text, ignoreCase: ignoreCase }; + } + + function peg$classExpectation(parts, inverted, ignoreCase) { + return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; + } + + function peg$anyExpectation() { + return { type: "any" }; + } + + function peg$endExpectation() { + return { type: "end" }; + } + + function peg$otherExpectation(description) { + return { type: "other", description: description }; + } + + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos], p; + + if (details) { + return details; + } else { + p = pos - 1; + while (!peg$posDetailsCache[p]) { + p--; + } + + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column + }; + + while (p < pos) { + if (input.charCodeAt(p) === 10) { + details.line++; + details.column = 1; + } else { + details.column++; + } + + p++; + } + + peg$posDetailsCache[pos] = details; + return details; + } + } + + function peg$computeLocation(startPos, endPos) { + var startPosDetails = peg$computePosDetails(startPos), + endPosDetails = peg$computePosDetails(endPos); + + return { + start: { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }, + end: { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column + } + }; + } + + function peg$fail(expected) { + if (peg$currPos < peg$maxFailPos) { return; } + + if (peg$currPos > peg$maxFailPos) { + peg$maxFailPos = peg$currPos; + peg$maxFailExpected = []; + } + + peg$maxFailExpected.push(expected); + } + + function peg$buildSimpleError(message, location) { + return new peg$SyntaxError(message, null, null, location); + } + + function peg$buildStructuredError(expected, found, location) { + return new peg$SyntaxError( + peg$SyntaxError.buildMessage(expected, found), + expected, + found, + location + ); + } + + function peg$parseprogram() { + var s0, s1, s2; + + var key = peg$currPos * 95 + 0, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parseline(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parseline(); + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c0(s1); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseline() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 1, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parse_(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parse_(); + } + if (s1 !== peg$FAILED) { + s2 = peg$parsestatement(); + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parseEOL(); + if (s4 !== peg$FAILED) { + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parseEOL(); + } + } else { + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = peg$parseEOF(); + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c1(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseEOL(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c2(); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsewhitespace() { + var s0; + + var key = peg$currPos * 95 + 2, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (peg$c3.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecomment() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 3, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 40) { + s1 = peg$c5; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c6); } + } + if (s1 !== peg$FAILED) { + s2 = []; + if (peg$c7.test(input.charAt(peg$currPos))) { + s3 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c8); } + } + while (s3 !== peg$FAILED) { + s2.push(s3); + if (peg$c7.test(input.charAt(peg$currPos))) { + s3 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c8); } + } + } + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s3 = peg$c9; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c10); } + } + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parse_() { + var s0, s1; + + var key = peg$currPos * 95 + 4, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = []; + s1 = peg$parsewhitespace(); + if (s1 === peg$FAILED) { + s1 = peg$parsecomment(); + } + if (s1 !== peg$FAILED) { + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parsewhitespace(); + if (s1 === peg$FAILED) { + s1 = peg$parsecomment(); + } + } + } else { + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsenoise() { + var s0; + + var key = peg$currPos * 95 + 5, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parse_(); + if (s0 === peg$FAILED) { + if (peg$c11.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c12); } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseEOL() { + var s0, s1, s2; + + var key = peg$currPos * 95 + 6, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parsenoise(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parsenoise(); + } + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 10) { + s2 = peg$c13; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c14); } + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseEOF() { + var s0, s1; + + var key = peg$currPos * 95 + 7, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + peg$silentFails++; + if (input.length > peg$currPos) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c15); } + } + peg$silentFails--; + if (s1 === peg$FAILED) { + s0 = void 0; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseignore_rest_of_line() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 8, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + s2 = []; + if (peg$c16.test(input.charAt(peg$currPos))) { + s3 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c17); } + } + while (s3 !== peg$FAILED) { + s2.push(s3); + if (peg$c16.test(input.charAt(peg$currPos))) { + s3 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c17); } + } + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = null; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsestatement() { + var s0, s1, s2; + + var key = peg$currPos * 95 + 9, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parse_(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parse_(); + } + if (s1 !== peg$FAILED) { + s2 = peg$parsebreak(); + if (s2 === peg$FAILED) { + s2 = peg$parsecontinue(); + if (s2 === peg$FAILED) { + s2 = peg$parsefunction(); + if (s2 === peg$FAILED) { + s2 = peg$parsefunction_call(); + if (s2 === peg$FAILED) { + s2 = peg$parsefunction_return(); + if (s2 === peg$FAILED) { + s2 = peg$parseloop(); + if (s2 === peg$FAILED) { + s2 = peg$parseconditional(); + if (s2 === peg$FAILED) { + s2 = peg$parseoperation(); + if (s2 === peg$FAILED) { + s2 = peg$parsenor(); + } + } + } + } + } + } + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c1(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsebreak() { + var s0, s1, s2; + + var key = peg$currPos * 95 + 10, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c18) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c19); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseignore_rest_of_line(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c20(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecontinue() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 11, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$currPos; + if (input.substr(peg$currPos, 8).toLowerCase() === peg$c21) { + s2 = input.substr(peg$currPos, 8); + peg$currPos += 8; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c22); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parseignore_rest_of_line(); + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 18).toLowerCase() === peg$c23) { + s1 = input.substr(peg$currPos, 18); + peg$currPos += 18; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c24); } + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c25(); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsefunction() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; + + var key = peg$currPos * 95 + 12, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsevariable(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c26) { + s3 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c27); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parsevariable_list(); + if (s5 !== peg$FAILED) { + s6 = peg$parseEOL(); + if (s6 !== peg$FAILED) { + s7 = peg$parseblock(); + if (s7 !== peg$FAILED) { + s8 = peg$parseEOL(); + if (s8 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c28(s1, s5, s7); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseexpression_list_separator() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 13, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 === peg$FAILED) { + s1 = null; + } + if (s1 !== peg$FAILED) { + if (input.substr(peg$currPos, 5) === peg$c29) { + s2 = peg$c29; + peg$currPos += 5; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c30); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 === peg$FAILED) { + s1 = null; + } + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 38) { + s2 = peg$c31; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c32); } + } + if (s2 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s2 = peg$c33; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c34); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c35) { + s2 = peg$c35; + peg$currPos += 3; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c36); } + } + } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsevariable_list_separator() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 14, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parseexpression_list_separator(); + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c37) { + s2 = peg$c37; + peg$currPos += 3; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c38); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsevariable_list() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 15, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsevariable(); + if (s1 !== peg$FAILED) { + s2 = peg$parsevariable_list_separator(); + if (s2 !== peg$FAILED) { + s3 = peg$parsevariable_list(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c39(s1, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsevariable(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c40(s1); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsefunction_call() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 16, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsevariable(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c41) { + s3 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c42); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parseexpression_list(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c43(s1, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseexpression_list() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 17, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsesimple_expression(); + if (s1 !== peg$FAILED) { + s2 = peg$parseexpression_list_separator(); + if (s2 !== peg$FAILED) { + s3 = peg$parseexpression_list(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c39(s1, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsesimple_expression(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c44(s1); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsereturn() { + var s0; + + var key = peg$currPos * 95 + 18, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c45) { + s0 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c46); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 9).toLowerCase() === peg$c47) { + s0 = input.substr(peg$currPos, 9); + peg$currPos += 9; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c48); } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsefunction_return() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 19, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsereturn(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsenor(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c49(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseoperation() { + var s0; + + var key = peg$currPos * 95 + 20, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parsereadline(); + if (s0 === peg$FAILED) { + s0 = peg$parseoutput(); + if (s0 === peg$FAILED) { + s0 = peg$parsecrement(); + if (s0 === peg$FAILED) { + s0 = peg$parsemutation(); + if (s0 === peg$FAILED) { + s0 = peg$parseassignment(); + if (s0 === peg$FAILED) { + s0 = peg$parserounding(); + } + } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsereadline() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 21, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 9).toLowerCase() === peg$c50) { + s1 = input.substr(peg$currPos, 9); + peg$currPos += 9; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c51); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parseassignable(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c52(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c53) { + s1 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c54); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c55(); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecontinuation() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 22, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parseEOL(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parse_(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parse_(); + } + if (s2 !== peg$FAILED) { + s3 = peg$parsestatement(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c1(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseblock() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 23, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsestatement(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsecontinuation(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsecontinuation(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c56(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsestatement(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c1(s1); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseconsequent() { + var s0, s1, s2; + + var key = peg$currPos * 95 + 24, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + s2 = peg$parsestatement(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c1(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseEOL(); + if (s1 !== peg$FAILED) { + s2 = peg$parseblock(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c1(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsealternate() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 25, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c57) { + s2 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c58); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s4 = peg$parsestatement(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c59(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = []; + s2 = peg$parseEOL(); + if (s2 !== peg$FAILED) { + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parseEOL(); + } + } else { + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c57) { + s2 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c58); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s4 = peg$parsestatement(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c59(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = []; + s2 = peg$parseEOL(); + if (s2 !== peg$FAILED) { + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parseEOL(); + } + } else { + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c57) { + s2 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c58); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parseEOL(); + if (s3 !== peg$FAILED) { + s4 = peg$parseblock(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c59(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseEOL(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c2(); + } + s0 = s1; + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseconditional() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 26, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c60) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c61); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsenor(); + if (s3 !== peg$FAILED) { + s4 = peg$parseconsequent(); + if (s4 === peg$FAILED) { + s4 = null; + } + if (s4 !== peg$FAILED) { + s5 = peg$parsealternate(); + if (s5 === peg$FAILED) { + s5 = null; + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c62(s3, s4, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseloopable() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 27, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + s2 = peg$parsestatement(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c1(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseEOL(); + if (s1 !== peg$FAILED) { + s2 = peg$parseblock(); + if (s2 !== peg$FAILED) { + s3 = peg$parseEOL(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c1(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseloop() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 28, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c63) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c64); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsenor(); + if (s3 !== peg$FAILED) { + s4 = peg$parseloopable(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c65(s3, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c66) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c67); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsenor(); + if (s3 !== peg$FAILED) { + s4 = peg$parseloopable(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c68(s3, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseoutput() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 29, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c69) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c70); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c71) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c72); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 7).toLowerCase() === peg$c73) { + s1 = input.substr(peg$currPos, 7); + peg$currPos += 7; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c74); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c75) { + s1 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c76); } + } + } + } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsenor(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c77(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsesimple_expression() { + var s0; + + var key = peg$currPos * 95 + 30, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parsefunction_call(); + if (s0 === peg$FAILED) { + s0 = peg$parseconstant(); + if (s0 === peg$FAILED) { + s0 = peg$parselookup(); + if (s0 === peg$FAILED) { + s0 = peg$parseliteral(); + if (s0 === peg$FAILED) { + s0 = peg$parsepronoun(); + } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseliteral() { + var s0; + + var key = peg$currPos * 95 + 31, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parseconstant(); + if (s0 === peg$FAILED) { + s0 = peg$parsenumber(); + if (s0 === peg$FAILED) { + s0 = peg$parsestring(); + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseconstant() { + var s0; + + var key = peg$currPos * 95 + 32, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parsenull(); + if (s0 === peg$FAILED) { + s0 = peg$parsetrue(); + if (s0 === peg$FAILED) { + s0 = peg$parsefalse(); + if (s0 === peg$FAILED) { + s0 = peg$parsemysterious(); + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsetrue() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 33, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c78) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c79); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c80) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c81); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c82) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c83); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c84) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c85); } + } + } + } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseletter(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c86(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsefalse() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 34, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c87) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c88); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c89) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c90); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c91) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c92); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c93) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c94); } + } + } + } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseletter(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c95(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsenull() { + var s0, s1; + + var key = peg$currPos * 95 + 35, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c96) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c97); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 7).toLowerCase() === peg$c98) { + s1 = input.substr(peg$currPos, 7); + peg$currPos += 7; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c99); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 7).toLowerCase() === peg$c100) { + s1 = input.substr(peg$currPos, 7); + peg$currPos += 7; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c101); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c102) { + s1 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c103); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c104) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c105); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c106) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c107); } + } + } + } + } + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c108(); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsemysterious() { + var s0, s1; + + var key = peg$currPos * 95 + 36, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 10) === peg$c109) { + s1 = peg$c109; + peg$currPos += 10; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c110); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c111(); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsenumber() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; + + var key = peg$currPos * 95 + 37, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 45) { + s3 = peg$c112; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + s4 = []; + if (peg$c114.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s5 !== peg$FAILED) { + while (s5 !== peg$FAILED) { + s4.push(s5); + if (peg$c114.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + } + } else { + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 46) { + s6 = peg$c116; + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c117); } + } + if (s6 !== peg$FAILED) { + s7 = []; + if (peg$c114.test(input.charAt(peg$currPos))) { + s8 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s8 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s8 !== peg$FAILED) { + while (s8 !== peg$FAILED) { + s7.push(s8); + if (peg$c114.test(input.charAt(peg$currPos))) { + s8 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s8 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + } + } else { + s7 = peg$FAILED; + } + if (s7 !== peg$FAILED) { + s6 = [s6, s7]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + if (s5 === peg$FAILED) { + s5 = null; + } + if (s5 !== peg$FAILED) { + s3 = [s3, s4, s5]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 46) { + s2 = peg$c116; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c117); } + } + if (s2 === peg$FAILED) { + s2 = null; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c118(s1); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 46) { + s3 = peg$c116; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c117); } + } + if (s3 !== peg$FAILED) { + s4 = []; + if (peg$c114.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s5 !== peg$FAILED) { + while (s5 !== peg$FAILED) { + s4.push(s5); + if (peg$c114.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + } + } else { + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s3 = [s3, s4]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c119(s1); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsestring() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 38, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 34) { + s1 = peg$c120; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c121); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + if (peg$c122.test(input.charAt(peg$currPos))) { + s4 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c123); } + } + while (s4 !== peg$FAILED) { + s3.push(s4); + if (peg$c122.test(input.charAt(peg$currPos))) { + s4 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c123); } + } + } + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 34) { + s3 = peg$c120; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c121); } + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c124(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsenor() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 39, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parseor(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c125) { + s3 = peg$c125; + peg$currPos += 3; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c126); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parsenor(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c127(s1, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseor(); + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseor() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 40, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parseand(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c128) { + s3 = peg$c128; + peg$currPos += 2; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c129); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parseor(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c130(s1, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseand(); + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseand() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 41, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parseequality_check(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c37) { + s3 = peg$c37; + peg$currPos += 3; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c38); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parseand(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c131(s1, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseequality_check(); + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseeq() { + var s0, s1; + + var key = peg$currPos * 95 + 42, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c132) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c133); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c134) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c135); } + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c136(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c138); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c139(); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseequality_check() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 43, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsenot(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parseeq(); + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parseequality_check(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c140(s1, s3, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parsenot(); + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsenot() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 44, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c141) { + s1 = peg$c141; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c142); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsenot(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c143(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parsecomparison(); + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecomparison() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 45, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsearithmetic(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsecomparator(); + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parsecomparison(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c140(s1, s3, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parsearithmetic(); + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsegreater() { + var s0; + + var key = peg$currPos * 95 + 46, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c144) { + s0 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c145); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 7).toLowerCase() === peg$c146) { + s0 = input.substr(peg$currPos, 7); + peg$currPos += 7; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c147); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c148) { + s0 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c149); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 8).toLowerCase() === peg$c150) { + s0 = input.substr(peg$currPos, 8); + peg$currPos += 8; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c151); } + } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsesmaller() { + var s0; + + var key = peg$currPos * 95 + 47, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c152) { + s0 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c153); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c154) { + s0 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c155); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 7).toLowerCase() === peg$c156) { + s0 = input.substr(peg$currPos, 7); + peg$currPos += 7; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c157); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c158) { + s0 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c159); } + } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsegreat() { + var s0; + + var key = peg$currPos * 95 + 48, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c160) { + s0 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c161); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c162) { + s0 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c163); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c164) { + s0 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c165); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c166) { + s0 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c167); } + } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsesmall() { + var s0; + + var key = peg$currPos * 95 + 49, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c168) { + s0 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c169); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c170) { + s0 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c171); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c172) { + s0 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c173); } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecomparator() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + var key = peg$currPos * 95 + 50, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c138); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsegreater(); + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c174) { + s5 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c175); } + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c176(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c138); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsesmaller(); + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c174) { + s5 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c175); } + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c177(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c138); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c178) { + s3 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c179); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parsegreat(); + if (s5 !== peg$FAILED) { + s6 = peg$parse_(); + if (s6 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c178) { + s7 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c179); } + } + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c180(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c138); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c178) { + s3 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c179); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parsesmall(); + if (s5 !== peg$FAILED) { + s6 = peg$parse_(); + if (s6 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c178) { + s7 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c179); } + } + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c181(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsearithmetic() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 51, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parseproduct(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parseadd(); + if (s4 === peg$FAILED) { + s4 = peg$parsesubtract(); + } + if (s4 !== peg$FAILED) { + s5 = peg$parseproduct(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parseadd(); + if (s4 === peg$FAILED) { + s4 = peg$parsesubtract(); + } + if (s4 !== peg$FAILED) { + s5 = peg$parseproduct(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c182(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseproduct(); + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseproduct() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 52, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsesimple_expression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parsemultiply(); + if (s4 === peg$FAILED) { + s4 = peg$parsedivide(); + } + if (s4 !== peg$FAILED) { + s5 = peg$parseexpression_list(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parsemultiply(); + if (s4 === peg$FAILED) { + s4 = peg$parsedivide(); + } + if (s4 !== peg$FAILED) { + s5 = peg$parseexpression_list(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c183(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseexpression_list(); + if (s0 === peg$FAILED) { + s0 = peg$parsesimple_expression(); + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseadd() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 53, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parse_(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parse_(); + } + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 43) { + s2 = peg$c184; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c185); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 5) === peg$c186) { + s2 = peg$c186; + peg$currPos += 5; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c187); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 5) === peg$c188) { + s2 = peg$c188; + peg$currPos += 5; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c189); } + } + } + } + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parse_(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parse_(); + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c190(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsesubtract() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 54, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parse_(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parse_(); + } + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 45) { + s2 = peg$c112; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 6) === peg$c191) { + s2 = peg$c191; + peg$currPos += 6; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c192); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 8) === peg$c193) { + s2 = peg$c193; + peg$currPos += 8; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c194); } + } + } + } + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parse_(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parse_(); + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c195(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsemultiply() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 55, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parse_(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parse_(); + } + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 42) { + s2 = peg$c196; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c197); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 6) === peg$c198) { + s2 = peg$c198; + peg$currPos += 6; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c199); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c200) { + s2 = peg$c200; + peg$currPos += 3; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c201); } + } + } + } + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parse_(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parse_(); + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c202(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsedivide() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 56, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parse_(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parse_(); + } + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 47) { + s2 = peg$c203; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c204); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 5) === peg$c205) { + s2 = peg$c205; + peg$currPos += 5; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c206); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 8) === peg$c207) { + s2 = peg$c207; + peg$currPos += 8; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c208); } + } + } + } + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parse_(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parse_(); + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c209(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecompoundable_operator() { + var s0; + + var key = peg$currPos * 95 + 57, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parseadd(); + if (s0 === peg$FAILED) { + s0 = peg$parsesubtract(); + if (s0 === peg$FAILED) { + s0 = peg$parsemultiply(); + if (s0 === peg$FAILED) { + s0 = peg$parsedivide(); + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsepronoun() { + var s0, s1; + + var key = peg$currPos * 95 + 58, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c210) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c211); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c212) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c213); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c214) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c215); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c216) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c217); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c218) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c219); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c220) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c221); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c222) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c223); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c224) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c225); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c226) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c227); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c228) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c230) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c231); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c232) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c233); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c234) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c235); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c236) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c237); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c238) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c240(s1); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parselookup() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 59, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsevariable(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c241) { + s3 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c242); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parsenor(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c243(s1, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsevariable(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c244(s1); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecommon_prefix() { + var s0; + + var key = peg$currPos * 95 + 60, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c245) { + s0 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 1).toLowerCase() === peg$c247) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c248); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c249) { + s0 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c250); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c251) { + s0 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c252); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c253) { + s0 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c254); } + } + } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseuppercase_letter() { + var s0; + + var key = peg$currPos * 95 + 61, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (peg$c255.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c256); } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parselowercase_letter() { + var s0; + + var key = peg$currPos * 95 + 62, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (peg$c257.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c258); } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseletter() { + var s0; + + var key = peg$currPos * 95 + 63, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parseuppercase_letter(); + if (s0 === peg$FAILED) { + s0 = peg$parselowercase_letter(); + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecommon_variable() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 64, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsecommon_prefix(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parse_(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = []; + s5 = peg$parseletter(); + if (s5 !== peg$FAILED) { + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$parseletter(); + } + } else { + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s3 = input.substring(s3, peg$currPos); + } else { + s3 = s4; + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c259(s1, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseis() { + var s0, s1, s2; + + var key = peg$currPos * 95 + 65, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + if (input.substr(peg$currPos, 2) === peg$c260) { + s0 = peg$c260; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c261); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = []; + s2 = peg$parse_(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parse_(); + } + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 61) { + s2 = peg$c262; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c263); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c264) { + s2 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c265); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c266) { + s2 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c267); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c268) { + s2 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c269); } + } + if (s2 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c270) { + s2 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c271); } + } + } + } + } + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsetarget() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 66, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c272) { + s2 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c273); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s4 = peg$parseassignable(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c274(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseindexer() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 67, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c241) { + s2 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c242); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s4 = peg$parsenor(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c275(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseassignable() { + var s0, s1, s2; + + var key = peg$currPos * 95 + 68, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsevariable(); + if (s1 !== peg$FAILED) { + s2 = peg$parseindexer(); + if (s2 === peg$FAILED) { + s2 = null; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c276(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseassignment() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + var key = peg$currPos * 95 + 69, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parseassignable(); + if (s1 !== peg$FAILED) { + s2 = peg$parseis(); + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parse_(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parse_(); + } + if (s3 !== peg$FAILED) { + s4 = peg$parseliteral(); + if (s4 === peg$FAILED) { + s4 = peg$parsepoetic_number(); + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c277(s1, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseassignable(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parse_(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c278) { + s3 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c279); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parsepoetic_string(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c277(s1, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c280) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c281); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parse_(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parsenor(); + if (s3 !== peg$FAILED) { + s4 = peg$parsetarget(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c282(s3, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c283) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c284); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parse_(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseassignable(); + if (s3 !== peg$FAILED) { + s4 = []; + s5 = peg$parse_(); + if (s5 !== peg$FAILED) { + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$parse_(); + } + } else { + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c285) { + s5 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c286); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parsecompoundable_operator(); + if (s6 !== peg$FAILED) { + s7 = peg$parsenor(); + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c287(s3, s6, s7); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c283) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c284); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parse_(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseassignable(); + if (s3 !== peg$FAILED) { + s4 = []; + s5 = peg$parse_(); + if (s5 !== peg$FAILED) { + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$parse_(); + } + } else { + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c285) { + s5 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c286); } + } + if (s5 !== peg$FAILED) { + s6 = []; + s7 = peg$parse_(); + if (s7 !== peg$FAILED) { + while (s7 !== peg$FAILED) { + s6.push(s7); + s7 = peg$parse_(); + } + } else { + s6 = peg$FAILED; + } + if (s6 !== peg$FAILED) { + s7 = peg$parsenor(); + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c277(s3, s7); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsepoetic_string() { + var s0, s1, s2, s3; + + var key = peg$currPos * 95 + 70, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = []; + if (peg$c16.test(input.charAt(peg$currPos))) { + s3 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c17); } + } + while (s3 !== peg$FAILED) { + s2.push(s3); + if (peg$c16.test(input.charAt(peg$currPos))) { + s3 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c17); } + } + } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c288(s1); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsepoetic_number() { + var s0, s1, s2, s3, s4, s5, s6; + + var key = peg$currPos * 95 + 71, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parsepoetic_digit_separator(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parsepoetic_digit_separator(); + } + if (s1 !== peg$FAILED) { + s2 = peg$parsepoetic_digits(); + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parsepoetic_digit_separator(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parsepoetic_digit_separator(); + } + if (s3 !== peg$FAILED) { + s4 = peg$parsepoetic_decimal(); + if (s4 === peg$FAILED) { + s4 = null; + } + if (s4 !== peg$FAILED) { + s5 = []; + s6 = peg$parsepoetic_digit_separator(); + while (s6 !== peg$FAILED) { + s5.push(s6); + s6 = peg$parsepoetic_digit_separator(); + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c289(s2, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsepoetic_decimal() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 72, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 46) { + s1 = peg$c116; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c117); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsepoetic_decimal_digit_separator(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsepoetic_decimal_digit_separator(); + } + if (s2 !== peg$FAILED) { + s3 = peg$parsepoetic_decimal_digits(); + if (s3 !== peg$FAILED) { + s4 = []; + s5 = peg$parsepoetic_decimal_digit_separator(); + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$parsepoetic_decimal_digit_separator(); + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c290(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 46) { + s1 = peg$c116; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c117); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parsepoetic_decimal_digit_separator(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parsepoetic_decimal_digit_separator(); + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsepoetic_digit_separator() { + var s0; + + var key = peg$currPos * 95 + 73, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parse_(); + if (s0 === peg$FAILED) { + if (peg$c291.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c292); } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsepoetic_digits() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 74, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parsepoetic_digit_separator(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parsepoetic_digit_separator(); + } + if (s1 !== peg$FAILED) { + s2 = peg$parsepoetic_digit(); + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parsepoetic_digit_separator(); + if (s4 !== peg$FAILED) { + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parsepoetic_digit_separator(); + } + } else { + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s4 = peg$parsepoetic_digits(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c293(s2, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsepoetic_digit(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c294(s1); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsepoetic_decimal_digit_separator() { + var s0; + + var key = peg$currPos * 95 + 75, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parse_(); + if (s0 === peg$FAILED) { + s0 = peg$parsepoetic_digit_separator(); + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 46) { + s0 = peg$c116; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c117); } + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsepoetic_decimal_digits() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 76, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + s2 = peg$parsepoetic_decimal_digit_separator(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parsepoetic_decimal_digit_separator(); + } + if (s1 !== peg$FAILED) { + s2 = peg$parsepoetic_digit(); + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parsepoetic_decimal_digit_separator(); + if (s4 !== peg$FAILED) { + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parsepoetic_decimal_digit_separator(); + } + } else { + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s4 = peg$parsepoetic_decimal_digits(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c293(s2, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsepoetic_digit(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c294(s1); + } + s0 = s1; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsepoetic_digit() { + var s0, s1, s2; + + var key = peg$currPos * 95 + 77, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = []; + if (peg$c295.test(input.charAt(peg$currPos))) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c296); } + } + if (s2 !== peg$FAILED) { + while (s2 !== peg$FAILED) { + s1.push(s2); + if (peg$c295.test(input.charAt(peg$currPos))) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c296); } + } + } + } else { + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c297(s1); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsevariable() { + var s0; + + var key = peg$currPos * 95 + 78, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parsecommon_variable(); + if (s0 === peg$FAILED) { + s0 = peg$parseproper_variable(); + if (s0 === peg$FAILED) { + s0 = peg$parsepronoun(); + if (s0 === peg$FAILED) { + s0 = peg$parsesimple_variable(); + } + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsesimple_variable() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 79, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$currPos; + s3 = peg$parseletter(); + if (s3 !== peg$FAILED) { + s4 = []; + s5 = peg$parseletter(); + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$parseletter(); + } + if (s4 !== peg$FAILED) { + s3 = [s3, s4]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + peg$savedPos = peg$currPos; + s2 = peg$c298(s1); + if (s2) { + s2 = peg$FAILED; + } else { + s2 = void 0; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c299(s1); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseproper_noun() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 80, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$currPos; + s3 = peg$parseuppercase_letter(); + if (s3 !== peg$FAILED) { + s4 = []; + s5 = peg$parseletter(); + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$parseletter(); + } + if (s4 !== peg$FAILED) { + s3 = [s3, s4]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + peg$savedPos = peg$currPos; + s2 = peg$c300(s1); + if (s2) { + s2 = peg$FAILED; + } else { + s2 = void 0; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c301(s1); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseproper_variable() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; + + var key = peg$currPos * 95 + 81, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$currPos; + s3 = peg$parseproper_noun(); + if (s3 !== peg$FAILED) { + s4 = []; + s5 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 32) { + s6 = peg$c302; + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c303); } + } + if (s6 !== peg$FAILED) { + s7 = peg$currPos; + s8 = peg$parseproper_noun(); + if (s8 !== peg$FAILED) { + s7 = input.substring(s7, peg$currPos); + } else { + s7 = s8; + } + if (s7 !== peg$FAILED) { + s6 = [s6, s7]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + while (s5 !== peg$FAILED) { + s4.push(s5); + s5 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 32) { + s6 = peg$c302; + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c303); } + } + if (s6 !== peg$FAILED) { + s7 = peg$currPos; + s8 = peg$parseproper_noun(); + if (s8 !== peg$FAILED) { + s7 = input.substring(s7, peg$currPos); + } else { + s7 = s8; + } + if (s7 !== peg$FAILED) { + s6 = [s6, s7]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } + if (s4 !== peg$FAILED) { + s3 = [s3, s4]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c304(s1); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecrement() { + var s0; + + var key = peg$currPos * 95 + 82, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parseincrement(); + if (s0 === peg$FAILED) { + s0 = peg$parsedecrement(); + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseincrement() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + var key = peg$currPos * 95 + 83, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c305) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c306); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsevariable(); + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = []; + s6 = peg$currPos; + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c307) { + s7 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c308); } + } + if (s7 !== peg$FAILED) { + s8 = []; + s9 = peg$parsenoise(); + while (s9 !== peg$FAILED) { + s8.push(s9); + s9 = peg$parsenoise(); + } + if (s8 !== peg$FAILED) { + s7 = [s7, s8]; + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 !== peg$FAILED) { + while (s6 !== peg$FAILED) { + s5.push(s6); + s6 = peg$currPos; + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c307) { + s7 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c308); } + } + if (s7 !== peg$FAILED) { + s8 = []; + s9 = peg$parsenoise(); + while (s9 !== peg$FAILED) { + s8.push(s9); + s9 = peg$parsenoise(); + } + if (s8 !== peg$FAILED) { + s7 = [s7, s8]; + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } + } else { + s5 = peg$FAILED; + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c309(s3, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsedecrement() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + var key = peg$currPos * 95 + 84, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c310) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c311); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsevariable(); + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = []; + s6 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c312) { + s7 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c313); } + } + if (s7 !== peg$FAILED) { + s8 = []; + s9 = peg$parsenoise(); + while (s9 !== peg$FAILED) { + s8.push(s9); + s9 = peg$parsenoise(); + } + if (s8 !== peg$FAILED) { + s7 = [s7, s8]; + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 !== peg$FAILED) { + while (s6 !== peg$FAILED) { + s5.push(s6); + s6 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c312) { + s7 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c313); } + } + if (s7 !== peg$FAILED) { + s8 = []; + s9 = peg$parsenoise(); + while (s9 !== peg$FAILED) { + s8.push(s9); + s9 = peg$parsenoise(); + } + if (s8 !== peg$FAILED) { + s7 = [s7, s8]; + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } + } else { + s5 = peg$FAILED; + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c314(s3, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsesplit() { + var s0, s1; + + var key = peg$currPos * 95 + 85, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3).toLowerCase() === peg$c315) { + s1 = input.substr(peg$currPos, 3); + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c316); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c317) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c318); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 7).toLowerCase() === peg$c319) { + s1 = input.substr(peg$currPos, 7); + peg$currPos += 7; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c320); } + } + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c321(); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsecast() { + var s0, s1; + + var key = peg$currPos * 95 + 86, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c322) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c323); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c324) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c325); } + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c326(); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsejoin() { + var s0, s1; + + var key = peg$currPos * 95 + 87, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c327) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c328); } + } + if (s1 === peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c329) { + s1 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c330); } + } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c331(); + } + s0 = s1; + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsemutator() { + var s0; + + var key = peg$currPos * 95 + 88, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parsesplit(); + if (s0 === peg$FAILED) { + s0 = peg$parsecast(); + if (s0 === peg$FAILED) { + s0 = peg$parsejoin(); + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsemodifier() { + var s0, s1, s2, s3, s4; + + var key = peg$currPos * 95 + 89, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c332) { + s2 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c333); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s4 = peg$parsenor(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c334(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsemutation() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 90, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + s1 = peg$parsemutator(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parseassignable(); + if (s3 !== peg$FAILED) { + s4 = peg$parsemodifier(); + if (s4 === peg$FAILED) { + s4 = null; + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c335(s1, s3, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parsemutator(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsenor(); + if (s3 !== peg$FAILED) { + s4 = peg$parsetarget(); + if (s4 !== peg$FAILED) { + s5 = peg$parsemodifier(); + if (s5 === peg$FAILED) { + s5 = null; + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c336(s1, s3, s4, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parserounding() { + var s0; + + var key = peg$currPos * 95 + 91, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$parsefloor(); + if (s0 === peg$FAILED) { + s0 = peg$parseceil(); + if (s0 === peg$FAILED) { + s0 = peg$parsemath_round(); + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsefloor() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 92, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c338); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsevariable(); + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c312) { + s5 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c313); } + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c339(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c338); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c312) { + s3 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c313); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parsevariable(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c339(s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parseceil() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 93, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c338); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsevariable(); + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c307) { + s5 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c308); } + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c340(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c338); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c307) { + s3 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c308); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parsevariable(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c341(s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + function peg$parsemath_round() { + var s0, s1, s2, s3, s4, s5; + + var key = peg$currPos * 95 + 94, + cached = peg$resultsCache[key]; + + if (cached) { + peg$currPos = cached.nextPos; + + return cached.result; + } + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c338); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsevariable(); + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c342) { + s5 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c343); } + } + if (s5 === peg$FAILED) { + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c344) { + s5 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c345); } + } + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c346(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) { + s1 = input.substr(peg$currPos, 4); + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c338); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 5).toLowerCase() === peg$c342) { + s3 = input.substr(peg$currPos, 5); + peg$currPos += 5; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c343); } + } + if (s3 === peg$FAILED) { + if (input.substr(peg$currPos, 6).toLowerCase() === peg$c344) { + s3 = input.substr(peg$currPos, 6); + peg$currPos += 6; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c345); } + } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse_(); + if (s4 !== peg$FAILED) { + s5 = peg$parsevariable(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c346(s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 }; + + return s0; + } + + + /* initialiser code - this is JS that runs before the parser is generated */ + const keywords = [ + 'mysterious', + 'stronger','continue', + 'between','greater','nothing','nowhere','smaller','whisper','without', + 'ain\'t','around','bigger','listen','nobody','return','scream','taking','weaker','higher', 'strong', + 'break','build','empty','false','great','knock','lower','right','round','shout', + 'small','take','takes','times','until','unite','while','wrong','minus', + 'aint','back','cast','burn','join','down','else','give','gone','high','into','less','lies','null','plus','says','than','them','they','true','weak','were','your','over','with', + 'and','big','her','him','hir','it ','low','nor','not','put','say','she','the','top','ver','was','xem','yes','zie','zir', + 'an','as','at','he','if','is','it','my','no','of','ok','or','to','up','ve', 'xe','ze', + 'a' + ] + + function isKeyword(string) { + return keywords.includes(string.toLowerCase()); + } + + + peg$result = peg$startRuleFunction(); + + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$fail(peg$endExpectation()); + } + + throw peg$buildStructuredError( + peg$maxFailExpected, + peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, + peg$maxFailPos < input.length + ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) + : peg$computeLocation(peg$maxFailPos, peg$maxFailPos) + ); + } +} + +module.exports = { + SyntaxError: peg$SyntaxError, + parse: peg$parse +}; diff --git a/satriani/test/comparison.js b/satriani/test/comparison.js new file mode 100644 index 0000000..c97a1c4 --- /dev/null +++ b/satriani/test/comparison.js @@ -0,0 +1,43 @@ +const interpreter = require('../satriani.interpreter.js'); +const assert = require('chai').assert; + +let tests = [ + [true, true, true], + [true, false, false], + [false, true, false], + [false, false, true], + ["5", 5, true], + ["05.0", 5, true], + ["5.0", 5, true], + ["-10", -10, true], + [false, null, true], + [true, null, false], + [0, null, true], + [1, null, false], + [undefined, undefined, true], + [undefined, 1, false], + [undefined, 0, true], + [undefined, null, true], + [false,5,false], + [5,false,false], + [false,0,true], + [0,false,true], + ["true", true, true], + ["lies", true, true], + ["false", true, true], + ["", false, true], + ["", true, false], + ["hello", "hello", true], + ["hello","world", false] +]; + +describe('comparison tests', function() { + tests.forEach(test => { + let lhs = test[0]; + let rhs = test[1]; + let out = test[2]; + it(typeof (lhs) + ':' + JSON.stringify(lhs) + ' ' + (out ? '==' : '!=') + ' ' + typeof (rhs) + ':' + JSON.stringify(rhs), function () { + assert.equal(interpreter.eq(lhs, rhs), test[2]); + }); + }); +}); \ No newline at end of file diff --git a/satriani/test/test.js b/satriani/test/test.js new file mode 100644 index 0000000..4a3f8f8 --- /dev/null +++ b/satriani/test/test.js @@ -0,0 +1,67 @@ +const assert = require('chai').assert; +const path = require('path'); +const fs = require('fs'); +const satriani = require('../satriani.js'); +const util = require('util'); + +describe('failure tests', function() { + test_directory('../tests/failures/', execute_and_compare_error); +}); + +describe('feature tests', function() { + var fixtures = fs.readdirSync('../tests/fixtures'); + fixtures.forEach(fixture => { + test_directory(path.join('../tests/fixtures/', fixture), execute_and_compare_output); + }); +}); + +function test_directory(directory, predicate) { + describe(directory, function () { + var files = fs.readdirSync(directory); + files.forEach(file => { + if (/^\._/.test(file)) return; // skip ._ files that macOS drops all over some filesystems. + if (! /\.rock$/.test(file)) return; + it(file, function() { + predicate(path.join(directory,file)); + }); + }); + }); +} + +function execute(source, inputs) { + let result = ""; + // We pass arrays to util.inspect() here because we're looking for parity + // with console.log so we can run nodejs on the console to verify + // test behaviour. + let output = function(s) { result += (Array.isArray(s) ? util.inspect(s) : String(s)) + "\n"; }; + let input = function() { return inputs.shift(); }; + let rockstar = new satriani.Interpreter(); + rockstar.run(source, input, output); + return result; +} + +function execute_and_compare_output(file) { + let source = fs.readFileSync(file, 'utf8'); + let inputs = []; + ['.in', '.in\''].forEach(ext => { + let inputsFile = file + ext; + if (fs.existsSync(inputsFile)) { + inputs = fs.readFileSync(inputsFile, 'utf8').split(/\n/g); + return; + } + }); + + let targetFile = file + '.out'; + let target = fs.existsSync(targetFile) ? fs.readFileSync(targetFile, 'utf8') : ''; + let actual = execute(source, inputs); + target = target.replace(/\r/g, ''); + actual = actual.replace(/\r/g, ''); + assert.equal(actual, target); +} + +function execute_and_compare_error(file) { + let source = fs.readFileSync(file, 'utf8'); + let targetFile = file + '.err'; + let target = fs.existsSync(targetFile) ? fs.readFileSync(targetFile, 'utf8') : ''; + assert.throws(function() { execute(source) }, Error, target); +} diff --git a/satriani/yarn.lock b/satriani/yarn.lock new file mode 100644 index 0000000..067c7ad --- /dev/null +++ b/satriani/yarn.lock @@ -0,0 +1,1373 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"acorn-node@^1.2.0", "acorn-node@^1.3.0", "acorn-node@^1.5.2", "acorn-node@^1.6.1": + "integrity" "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==" + "resolved" "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" + "version" "1.8.2" + dependencies: + "acorn" "^7.0.0" + "acorn-walk" "^7.0.0" + "xtend" "^4.0.2" + +"acorn-walk@^7.0.0": + "integrity" "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==" + "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz" + "version" "7.0.0" + +"acorn@^7.0.0": + "integrity" "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz" + "version" "7.1.0" + +"array-union@^1.0.1": + "integrity" "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=" + "resolved" "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "array-uniq" "^1.0.1" + +"array-uniq@^1.0.1": + "integrity" "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "resolved" "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + "version" "1.0.3" + +"asn1.js@^4.0.0": + "integrity" "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==" + "resolved" "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz" + "version" "4.10.1" + dependencies: + "bn.js" "^4.0.0" + "inherits" "^2.0.1" + "minimalistic-assert" "^1.0.0" + +"assert@^1.4.0": + "integrity" "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==" + "resolved" "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz" + "version" "1.5.0" + dependencies: + "object-assign" "^4.1.1" + "util" "0.10.3" + +"assertion-error@^1.1.0": + "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + "resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + "version" "1.1.0" + +"async@^2.6.1": + "integrity" "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==" + "resolved" "https://registry.npmjs.org/async/-/async-2.6.3.tgz" + "version" "2.6.3" + dependencies: + "lodash" "^4.17.14" + +"balanced-match@^1.0.0": + "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" + "version" "1.0.0" + +"base64-js@^1.0.2": + "integrity" "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz" + "version" "1.3.1" + +"bn.js@^4.0.0", "bn.js@^4.1.0", "bn.js@^4.1.1": + "integrity" "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz" + "version" "4.11.8" + +"bn.js@^4.11.9": + "integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz" + "version" "4.12.0" + +"brace-expansion@^1.1.7": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "^1.0.0" + "concat-map" "0.0.1" + +"brorand@^1.0.1", "brorand@^1.1.0": + "integrity" "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + "resolved" "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + "version" "1.1.0" + +"browser-pack@^6.0.1": + "integrity" "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==" + "resolved" "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "combine-source-map" "~0.8.0" + "defined" "^1.0.0" + "JSONStream" "^1.0.3" + "safe-buffer" "^5.1.1" + "through2" "^2.0.0" + "umd" "^3.0.0" + +"browser-resolve@^1.11.0", "browser-resolve@^1.7.0": + "integrity" "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==" + "resolved" "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz" + "version" "1.11.3" + dependencies: + "resolve" "1.1.7" + +"browser-stdout@1.3.1": + "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" + "version" "1.3.1" + +"browserify-aes@^1.0.0", "browserify-aes@^1.0.4": + "integrity" "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==" + "resolved" "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "buffer-xor" "^1.0.3" + "cipher-base" "^1.0.0" + "create-hash" "^1.1.0" + "evp_bytestokey" "^1.0.3" + "inherits" "^2.0.1" + "safe-buffer" "^5.0.1" + +"browserify-cipher@^1.0.0": + "integrity" "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==" + "resolved" "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "browserify-aes" "^1.0.4" + "browserify-des" "^1.0.0" + "evp_bytestokey" "^1.0.0" + +"browserify-des@^1.0.0": + "integrity" "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==" + "resolved" "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "cipher-base" "^1.0.1" + "des.js" "^1.0.0" + "inherits" "^2.0.1" + "safe-buffer" "^5.1.2" + +"browserify-rsa@^4.0.0": + "integrity" "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=" + "resolved" "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "bn.js" "^4.1.0" + "randombytes" "^2.0.1" + +"browserify-sign@^4.0.0": + "integrity" "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=" + "resolved" "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz" + "version" "4.0.4" + dependencies: + "bn.js" "^4.1.1" + "browserify-rsa" "^4.0.0" + "create-hash" "^1.1.0" + "create-hmac" "^1.1.2" + "elliptic" "^6.0.0" + "inherits" "^2.0.1" + "parse-asn1" "^5.0.0" + +"browserify-zlib@~0.2.0": + "integrity" "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==" + "resolved" "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "pako" "~1.0.5" + +"browserify@^16.2.3": + "integrity" "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==" + "resolved" "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz" + "version" "16.5.0" + dependencies: + "assert" "^1.4.0" + "browser-pack" "^6.0.1" + "browser-resolve" "^1.11.0" + "browserify-zlib" "~0.2.0" + "buffer" "^5.0.2" + "cached-path-relative" "^1.0.0" + "concat-stream" "^1.6.0" + "console-browserify" "^1.1.0" + "constants-browserify" "~1.0.0" + "crypto-browserify" "^3.0.0" + "defined" "^1.0.0" + "deps-sort" "^2.0.0" + "domain-browser" "^1.2.0" + "duplexer2" "~0.1.2" + "events" "^2.0.0" + "glob" "^7.1.0" + "has" "^1.0.0" + "htmlescape" "^1.1.0" + "https-browserify" "^1.0.0" + "inherits" "~2.0.1" + "insert-module-globals" "^7.0.0" + "JSONStream" "^1.0.3" + "labeled-stream-splicer" "^2.0.0" + "mkdirp" "^0.5.0" + "module-deps" "^6.0.0" + "os-browserify" "~0.3.0" + "parents" "^1.0.1" + "path-browserify" "~0.0.0" + "process" "~0.11.0" + "punycode" "^1.3.2" + "querystring-es3" "~0.2.0" + "read-only-stream" "^2.0.0" + "readable-stream" "^2.0.2" + "resolve" "^1.1.4" + "shasum" "^1.0.0" + "shell-quote" "^1.6.1" + "stream-browserify" "^2.0.0" + "stream-http" "^3.0.0" + "string_decoder" "^1.1.1" + "subarg" "^1.0.0" + "syntax-error" "^1.1.1" + "through2" "^2.0.0" + "timers-browserify" "^1.0.1" + "tty-browserify" "0.0.1" + "url" "~0.11.0" + "util" "~0.10.1" + "vm-browserify" "^1.0.0" + "xtend" "^4.0.0" + +"buffer-from@^1.0.0": + "integrity" "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" + "version" "1.1.1" + +"buffer-xor@^1.0.3": + "integrity" "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + "resolved" "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + "version" "1.0.3" + +"buffer@^5.0.2": + "integrity" "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==" + "resolved" "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz" + "version" "5.4.3" + dependencies: + "base64-js" "^1.0.2" + "ieee754" "^1.1.4" + +"builtin-status-codes@^3.0.0": + "integrity" "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + "resolved" "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" + "version" "3.0.0" + +"cached-path-relative@^1.0.0", "cached-path-relative@^1.0.2": + "integrity" "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==" + "resolved" "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz" + "version" "1.0.2" + +"chai@^4.2.0": + "integrity" "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==" + "resolved" "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz" + "version" "4.2.0" + dependencies: + "assertion-error" "^1.1.0" + "check-error" "^1.0.2" + "deep-eql" "^3.0.1" + "get-func-name" "^2.0.0" + "pathval" "^1.1.0" + "type-detect" "^4.0.5" + +"check-error@^1.0.2": + "integrity" "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + "version" "1.0.2" + +"cipher-base@^1.0.0", "cipher-base@^1.0.1", "cipher-base@^1.0.3": + "integrity" "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==" + "resolved" "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "inherits" "^2.0.1" + "safe-buffer" "^5.0.1" + +"combine-source-map@^0.8.0", "combine-source-map@~0.8.0": + "integrity" "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=" + "resolved" "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz" + "version" "0.8.0" + dependencies: + "convert-source-map" "~1.1.0" + "inline-source-map" "~0.6.0" + "lodash.memoize" "~3.0.3" + "source-map" "~0.5.3" + +"commander@^2.18.0": + "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + "version" "2.20.3" + +"commander@2.15.1": + "integrity" "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + "resolved" "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz" + "version" "2.15.1" + +"concat-map@0.0.1": + "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"concat-stream@^1.6.0", "concat-stream@^1.6.1", "concat-stream@~1.6.0": + "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==" + "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + "version" "1.6.2" + dependencies: + "buffer-from" "^1.0.0" + "inherits" "^2.0.3" + "readable-stream" "^2.2.2" + "typedarray" "^0.0.6" + +"console-browserify@^1.1.0": + "integrity" "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "resolved" "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz" + "version" "1.2.0" + +"constants-browserify@~1.0.0": + "integrity" "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + "resolved" "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" + "version" "1.0.0" + +"convert-source-map@~1.1.0": + "integrity" "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=" + "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz" + "version" "1.1.3" + +"core-util-is@~1.0.0": + "integrity" "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + "version" "1.0.2" + +"create-ecdh@^4.0.0": + "integrity" "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==" + "resolved" "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "bn.js" "^4.1.0" + "elliptic" "^6.0.0" + +"create-hash@^1.1.0", "create-hash@^1.1.2": + "integrity" "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==" + "resolved" "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "cipher-base" "^1.0.1" + "inherits" "^2.0.1" + "md5.js" "^1.3.4" + "ripemd160" "^2.0.1" + "sha.js" "^2.4.0" + +"create-hmac@^1.1.0", "create-hmac@^1.1.2", "create-hmac@^1.1.4": + "integrity" "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==" + "resolved" "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz" + "version" "1.1.7" + dependencies: + "cipher-base" "^1.0.3" + "create-hash" "^1.1.0" + "inherits" "^2.0.1" + "ripemd160" "^2.0.0" + "safe-buffer" "^5.0.1" + "sha.js" "^2.4.8" + +"crypto-browserify@^3.0.0": + "integrity" "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==" + "resolved" "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz" + "version" "3.12.0" + dependencies: + "browserify-cipher" "^1.0.0" + "browserify-sign" "^4.0.0" + "create-ecdh" "^4.0.0" + "create-hash" "^1.1.0" + "create-hmac" "^1.1.0" + "diffie-hellman" "^5.0.0" + "inherits" "^2.0.1" + "pbkdf2" "^3.0.3" + "public-encrypt" "^4.0.0" + "randombytes" "^2.0.0" + "randomfill" "^1.0.3" + +"dash-ast@^1.0.0": + "integrity" "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + "resolved" "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz" + "version" "1.0.0" + +"debug@3.1.0": + "integrity" "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==" + "resolved" "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "ms" "2.0.0" + +"deep-eql@^3.0.1": + "integrity" "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==" + "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "type-detect" "^4.0.0" + +"defined@^1.0.0": + "integrity" "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" + "resolved" "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" + "version" "1.0.0" + +"deps-sort@^2.0.0": + "integrity" "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==" + "resolved" "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "JSONStream" "^1.0.3" + "shasum-object" "^1.0.0" + "subarg" "^1.0.0" + "through2" "^2.0.0" + +"des.js@^1.0.0": + "integrity" "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==" + "resolved" "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "inherits" "^2.0.1" + "minimalistic-assert" "^1.0.0" + +"detective@^5.0.2": + "integrity" "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==" + "resolved" "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz" + "version" "5.2.0" + dependencies: + "acorn-node" "^1.6.1" + "defined" "^1.0.0" + "minimist" "^1.1.1" + +"diff@3.5.0": + "integrity" "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + "resolved" "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" + "version" "3.5.0" + +"diffie-hellman@^5.0.0": + "integrity" "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==" + "resolved" "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz" + "version" "5.0.3" + dependencies: + "bn.js" "^4.1.0" + "miller-rabin" "^4.0.0" + "randombytes" "^2.0.0" + +"domain-browser@^1.2.0": + "integrity" "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + "resolved" "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz" + "version" "1.2.0" + +"duplexer2@^0.1.2", "duplexer2@~0.1.0", "duplexer2@~0.1.2": + "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=" + "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz" + "version" "0.1.4" + dependencies: + "readable-stream" "^2.0.2" + +"elliptic@^6.0.0": + "integrity" "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==" + "resolved" "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz" + "version" "6.5.4" + dependencies: + "bn.js" "^4.11.9" + "brorand" "^1.1.0" + "hash.js" "^1.0.0" + "hmac-drbg" "^1.0.1" + "inherits" "^2.0.4" + "minimalistic-assert" "^1.0.1" + "minimalistic-crypto-utils" "^1.0.1" + +"email-addresses@^3.0.1": + "integrity" "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==" + "resolved" "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz" + "version" "3.1.0" + +"escape-string-regexp@^1.0.2", "escape-string-regexp@1.0.5": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"events@^2.0.0": + "integrity" "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==" + "resolved" "https://registry.npmjs.org/events/-/events-2.1.0.tgz" + "version" "2.1.0" + +"evp_bytestokey@^1.0.0", "evp_bytestokey@^1.0.3": + "integrity" "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==" + "resolved" "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "md5.js" "^1.3.4" + "safe-buffer" "^5.1.1" + +"fast-safe-stringify@^2.0.7": + "integrity" "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + "resolved" "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz" + "version" "2.0.7" + +"filename-reserved-regex@^1.0.0": + "integrity" "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=" + "resolved" "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz" + "version" "1.0.0" + +"filenamify-url@^1.0.0": + "integrity" "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=" + "resolved" "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "filenamify" "^1.0.0" + "humanize-url" "^1.0.0" + +"filenamify@^1.0.0": + "integrity" "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=" + "resolved" "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "filename-reserved-regex" "^1.0.0" + "strip-outer" "^1.0.0" + "trim-repeated" "^1.0.0" + +"fs-extra@^7.0.0": + "integrity" "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==" + "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "graceful-fs" "^4.1.2" + "jsonfile" "^4.0.0" + "universalify" "^0.1.0" + +"fs.realpath@^1.0.0": + "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"function-bind@^1.1.1": + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + "version" "1.1.1" + +"get-assigned-identifiers@^1.2.0": + "integrity" "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==" + "resolved" "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz" + "version" "1.2.0" + +"get-func-name@^2.0.0": + "integrity" "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + "resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + "version" "2.0.0" + +"gh-pages@^2.0.1": + "integrity" "sha512-yNW2SFp9xGRP/8Sk2WXuLI/Gn92oOL4HBgudn6PsqAnuWT90Y1tozJoTfX1WdrDSW5Rb90kLVOf5mm9KJ/2fDw==" + "resolved" "https://registry.npmjs.org/gh-pages/-/gh-pages-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "async" "^2.6.1" + "commander" "^2.18.0" + "email-addresses" "^3.0.1" + "filenamify-url" "^1.0.0" + "fs-extra" "^7.0.0" + "globby" "^6.1.0" + "graceful-fs" "^4.1.11" + "rimraf" "^2.6.2" + +"glob@^7.0.3", "glob@^7.1.0", "glob@^7.1.3": + "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + "version" "7.1.6" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.0.4" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"glob@7.1.2": + "integrity" "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" + "version" "7.1.2" + dependencies: + "fs.realpath" "^1.0.0" + "inflight" "^1.0.4" + "inherits" "2" + "minimatch" "^3.0.4" + "once" "^1.3.0" + "path-is-absolute" "^1.0.0" + +"globby@^6.1.0": + "integrity" "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=" + "resolved" "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz" + "version" "6.1.0" + dependencies: + "array-union" "^1.0.1" + "glob" "^7.0.3" + "object-assign" "^4.0.1" + "pify" "^2.0.0" + "pinkie-promise" "^2.0.0" + +"graceful-fs@^4.1.11", "graceful-fs@^4.1.2", "graceful-fs@^4.1.6": + "integrity" "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz" + "version" "4.2.3" + +"growl@1.10.5": + "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" + "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" + "version" "1.10.5" + +"has-flag@^3.0.0": + "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + +"has@^1.0.0": + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "function-bind" "^1.1.1" + +"hash-base@^3.0.0": + "integrity" "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=" + "resolved" "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "inherits" "^2.0.1" + "safe-buffer" "^5.0.1" + +"hash.js@^1.0.0", "hash.js@^1.0.3": + "integrity" "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==" + "resolved" "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz" + "version" "1.1.7" + dependencies: + "inherits" "^2.0.3" + "minimalistic-assert" "^1.0.1" + +"he@1.1.1": + "integrity" "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "resolved" "https://registry.npmjs.org/he/-/he-1.1.1.tgz" + "version" "1.1.1" + +"hmac-drbg@^1.0.1": + "integrity" "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=" + "resolved" "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "hash.js" "^1.0.3" + "minimalistic-assert" "^1.0.0" + "minimalistic-crypto-utils" "^1.0.1" + +"htmlescape@^1.1.0": + "integrity" "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=" + "resolved" "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz" + "version" "1.1.1" + +"https-browserify@^1.0.0": + "integrity" "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + "resolved" "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz" + "version" "1.0.0" + +"humanize-url@^1.0.0": + "integrity" "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=" + "resolved" "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "normalize-url" "^1.0.0" + "strip-url-auth" "^1.0.0" + +"ieee754@^1.1.4": + "integrity" "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz" + "version" "1.1.13" + +"inflight@^1.0.4": + "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "once" "^1.3.0" + "wrappy" "1" + +"inherits@^2.0.1", "inherits@^2.0.3", "inherits@^2.0.4", "inherits@~2.0.1", "inherits@~2.0.3", "inherits@2": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"inherits@2.0.1": + "integrity" "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + "version" "2.0.1" + +"inherits@2.0.3": + "integrity" "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + "version" "2.0.3" + +"inline-source-map@~0.6.0": + "integrity" "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=" + "resolved" "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz" + "version" "0.6.2" + dependencies: + "source-map" "~0.5.3" + +"insert-module-globals@^7.0.0": + "integrity" "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==" + "resolved" "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz" + "version" "7.2.0" + dependencies: + "acorn-node" "^1.5.2" + "combine-source-map" "^0.8.0" + "concat-stream" "^1.6.1" + "is-buffer" "^1.1.0" + "JSONStream" "^1.0.3" + "path-is-absolute" "^1.0.1" + "process" "~0.11.0" + "through2" "^2.0.0" + "undeclared-identifiers" "^1.1.2" + "xtend" "^4.0.0" + +"is-buffer@^1.1.0": + "integrity" "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "version" "1.1.6" + +"is-plain-obj@^1.0.0": + "integrity" "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + "version" "1.1.0" + +"isarray@~1.0.0": + "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "version" "1.0.0" + +"json-stable-stringify@~0.0.0": + "integrity" "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=" + "resolved" "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz" + "version" "0.0.1" + dependencies: + "jsonify" "~0.0.0" + +"jsonfile@^4.0.0": + "integrity" "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=" + "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" + "version" "4.0.0" + optionalDependencies: + "graceful-fs" "^4.1.6" + +"jsonify@~0.0.0": + "integrity" "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + "resolved" "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + "version" "0.0.0" + +"jsonparse@^1.2.0": + "integrity" "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + "resolved" "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" + "version" "1.3.1" + +"JSONStream@^1.0.3": + "integrity" "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==" + "resolved" "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" + "version" "1.3.5" + dependencies: + "jsonparse" "^1.2.0" + "through" ">=2.2.7 <3" + +"labeled-stream-splicer@^2.0.0": + "integrity" "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==" + "resolved" "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "inherits" "^2.0.1" + "stream-splicer" "^2.0.0" + +"lodash.memoize@~3.0.3": + "integrity" "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=" + "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz" + "version" "3.0.4" + +"lodash@^4.17.14": + "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + "version" "4.17.21" + +"md5.js@^1.3.4": + "integrity" "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==" + "resolved" "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz" + "version" "1.3.5" + dependencies: + "hash-base" "^3.0.0" + "inherits" "^2.0.1" + "safe-buffer" "^5.1.2" + +"miller-rabin@^4.0.0": + "integrity" "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==" + "resolved" "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "bn.js" "^4.0.0" + "brorand" "^1.0.1" + +"minimalistic-assert@^1.0.0", "minimalistic-assert@^1.0.1": + "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + "version" "1.0.1" + +"minimalistic-crypto-utils@^1.0.1": + "integrity" "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + "resolved" "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + "version" "1.0.1" + +"minimatch@^3.0.4", "minimatch@3.0.4": + "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "brace-expansion" "^1.1.7" + +"minimist@^1.1.0", "minimist@^1.1.1": + "integrity" "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + "version" "1.2.0" + +"minimist@0.0.8": + "integrity" "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version" "0.0.8" + +"mkdirp@^0.5.0", "mkdirp@0.5.1": + "integrity" "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + "version" "0.5.1" + dependencies: + "minimist" "0.0.8" + +"mocha@^5.2.0": + "integrity" "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==" + "resolved" "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz" + "version" "5.2.0" + dependencies: + "browser-stdout" "1.3.1" + "commander" "2.15.1" + "debug" "3.1.0" + "diff" "3.5.0" + "escape-string-regexp" "1.0.5" + "glob" "7.1.2" + "growl" "1.10.5" + "he" "1.1.1" + "minimatch" "3.0.4" + "mkdirp" "0.5.1" + "supports-color" "5.4.0" + +"module-deps@^6.0.0": + "integrity" "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==" + "resolved" "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz" + "version" "6.2.1" + dependencies: + "browser-resolve" "^1.7.0" + "cached-path-relative" "^1.0.2" + "concat-stream" "~1.6.0" + "defined" "^1.0.0" + "detective" "^5.0.2" + "duplexer2" "^0.1.2" + "inherits" "^2.0.1" + "JSONStream" "^1.0.3" + "parents" "^1.0.0" + "readable-stream" "^2.0.2" + "resolve" "^1.4.0" + "stream-combiner2" "^1.1.1" + "subarg" "^1.0.0" + "through2" "^2.0.0" + "xtend" "^4.0.0" + +"ms@2.0.0": + "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + "version" "2.0.0" + +"normalize-url@^1.0.0": + "integrity" "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=" + "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz" + "version" "1.9.1" + dependencies: + "object-assign" "^4.0.1" + "prepend-http" "^1.0.0" + "query-string" "^4.1.0" + "sort-keys" "^1.0.0" + +"object-assign@^4.0.1", "object-assign@^4.1.0", "object-assign@^4.1.1": + "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "version" "4.1.1" + +"once@^1.3.0": + "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "wrappy" "1" + +"os-browserify@~0.3.0": + "integrity" "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + "resolved" "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz" + "version" "0.3.0" + +"pako@~1.0.5": + "integrity" "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==" + "resolved" "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz" + "version" "1.0.10" + +"parents@^1.0.0", "parents@^1.0.1": + "integrity" "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=" + "resolved" "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "path-platform" "~0.11.15" + +"parse-asn1@^5.0.0": + "integrity" "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==" + "resolved" "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz" + "version" "5.1.5" + dependencies: + "asn1.js" "^4.0.0" + "browserify-aes" "^1.0.0" + "create-hash" "^1.1.0" + "evp_bytestokey" "^1.0.0" + "pbkdf2" "^3.0.3" + "safe-buffer" "^5.1.1" + +"path-browserify@~0.0.0": + "integrity" "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + "resolved" "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz" + "version" "0.0.1" + +"path-is-absolute@^1.0.0", "path-is-absolute@^1.0.1": + "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"path-parse@^1.0.6": + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + "version" "1.0.7" + +"path-platform@~0.11.15": + "integrity" "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=" + "resolved" "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz" + "version" "0.11.15" + +"pathval@^1.1.0": + "integrity" "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + "resolved" "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz" + "version" "1.1.0" + +"pbkdf2@^3.0.3": + "integrity" "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==" + "resolved" "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz" + "version" "3.0.17" + dependencies: + "create-hash" "^1.1.2" + "create-hmac" "^1.1.4" + "ripemd160" "^2.0.1" + "safe-buffer" "^5.0.1" + "sha.js" "^2.4.8" + +"pegjs@^0.10.0": + "integrity" "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=" + "resolved" "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz" + "version" "0.10.0" + +"pify@^2.0.0": + "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + "version" "2.3.0" + +"pinkie-promise@^2.0.0": + "integrity" "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" + "resolved" "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "pinkie" "^2.0.0" + +"pinkie@^2.0.0": + "integrity" "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + "resolved" "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + "version" "2.0.4" + +"prepend-http@^1.0.0": + "integrity" "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "resolved" "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" + "version" "1.0.4" + +"process-nextick-args@~2.0.0": + "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + "version" "2.0.1" + +"process@~0.11.0": + "integrity" "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + "resolved" "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + "version" "0.11.10" + +"public-encrypt@^4.0.0": + "integrity" "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==" + "resolved" "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "bn.js" "^4.1.0" + "browserify-rsa" "^4.0.0" + "create-hash" "^1.1.0" + "parse-asn1" "^5.0.0" + "randombytes" "^2.0.1" + "safe-buffer" "^5.1.2" + +"punycode@^1.3.2": + "integrity" "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "version" "1.4.1" + +"punycode@1.3.2": + "integrity" "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + "version" "1.3.2" + +"query-string@^4.1.0": + "integrity" "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=" + "resolved" "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" + "version" "4.3.4" + dependencies: + "object-assign" "^4.1.0" + "strict-uri-encode" "^1.0.0" + +"querystring-es3@~0.2.0": + "integrity" "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + "resolved" "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" + "version" "0.2.1" + +"querystring@0.2.0": + "integrity" "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + "resolved" "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + "version" "0.2.0" + +"randombytes@^2.0.0", "randombytes@^2.0.1", "randombytes@^2.0.5": + "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" + "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "safe-buffer" "^5.1.0" + +"randomfill@^1.0.3": + "integrity" "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==" + "resolved" "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "randombytes" "^2.0.5" + "safe-buffer" "^5.1.0" + +"read-only-stream@^2.0.0": + "integrity" "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=" + "resolved" "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "readable-stream" "^2.0.2" + +"readable-stream@^2.0.2", "readable-stream@^2.2.2", "readable-stream@~2.3.6": + "integrity" "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" + "version" "2.3.6" + dependencies: + "core-util-is" "~1.0.0" + "inherits" "~2.0.3" + "isarray" "~1.0.0" + "process-nextick-args" "~2.0.0" + "safe-buffer" "~5.1.1" + "string_decoder" "~1.1.1" + "util-deprecate" "~1.0.1" + +"readable-stream@^3.0.6": + "integrity" "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz" + "version" "3.4.0" + dependencies: + "inherits" "^2.0.3" + "string_decoder" "^1.1.1" + "util-deprecate" "^1.0.1" + +"readline-sync@^1.4.9": + "integrity" "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==" + "resolved" "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz" + "version" "1.4.10" + +"resolve@^1.1.4", "resolve@^1.4.0": + "integrity" "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==" + "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz" + "version" "1.13.1" + dependencies: + "path-parse" "^1.0.6" + +"resolve@1.1.7": + "integrity" "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz" + "version" "1.1.7" + +"rimraf@^2.6.2": + "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + "version" "2.7.1" + dependencies: + "glob" "^7.1.3" + +"ripemd160@^2.0.0", "ripemd160@^2.0.1": + "integrity" "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==" + "resolved" "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "hash-base" "^3.0.0" + "inherits" "^2.0.1" + +"safe-buffer@^5.0.1", "safe-buffer@^5.1.0", "safe-buffer@^5.1.1", "safe-buffer@^5.1.2", "safe-buffer@~5.2.0": + "integrity" "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz" + "version" "5.2.0" + +"safe-buffer@~5.1.0", "safe-buffer@~5.1.1": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"sha.js@^2.4.0", "sha.js@^2.4.8", "sha.js@~2.4.4": + "integrity" "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==" + "resolved" "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz" + "version" "2.4.11" + dependencies: + "inherits" "^2.0.1" + "safe-buffer" "^5.0.1" + +"shasum-object@^1.0.0": + "integrity" "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==" + "resolved" "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "fast-safe-stringify" "^2.0.7" + +"shasum@^1.0.0": + "integrity" "sha1-5wEjENj0F/TetXEhUOVni4euVl8=" + "resolved" "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "json-stable-stringify" "~0.0.0" + "sha.js" "~2.4.4" + +"shell-quote@^1.6.1": + "integrity" "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + "resolved" "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz" + "version" "1.7.2" + +"simple-concat@^1.0.0": + "integrity" "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + "resolved" "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz" + "version" "1.0.0" + +"sort-keys@^1.0.0": + "integrity" "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=" + "resolved" "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" + "version" "1.1.2" + dependencies: + "is-plain-obj" "^1.0.0" + +"source-map@~0.5.3": + "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + "version" "0.5.7" + +"stream-browserify@^2.0.0": + "integrity" "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==" + "resolved" "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "inherits" "~2.0.1" + "readable-stream" "^2.0.2" + +"stream-combiner2@^1.1.1": + "integrity" "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=" + "resolved" "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "duplexer2" "~0.1.0" + "readable-stream" "^2.0.2" + +"stream-http@^3.0.0": + "integrity" "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==" + "resolved" "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "builtin-status-codes" "^3.0.0" + "inherits" "^2.0.1" + "readable-stream" "^3.0.6" + "xtend" "^4.0.0" + +"stream-splicer@^2.0.0": + "integrity" "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==" + "resolved" "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "inherits" "^2.0.1" + "readable-stream" "^2.0.2" + +"strict-uri-encode@^1.0.0": + "integrity" "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + "resolved" "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" + "version" "1.1.0" + +"string_decoder@^1.1.1": + "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + "version" "1.3.0" + dependencies: + "safe-buffer" "~5.2.0" + +"string_decoder@~1.1.1": + "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "safe-buffer" "~5.1.0" + +"strip-outer@^1.0.0": + "integrity" "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==" + "resolved" "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "escape-string-regexp" "^1.0.2" + +"strip-url-auth@^1.0.0": + "integrity" "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=" + "resolved" "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz" + "version" "1.0.1" + +"subarg@^1.0.0": + "integrity" "sha1-9izxdYHplrSPyWVpn1TAauJouNI=" + "resolved" "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "minimist" "^1.1.0" + +"supports-color@5.4.0": + "integrity" "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz" + "version" "5.4.0" + dependencies: + "has-flag" "^3.0.0" + +"syntax-error@^1.1.1": + "integrity" "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==" + "resolved" "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "acorn-node" "^1.2.0" + +"through@>=2.2.7 <3": + "integrity" "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + "version" "2.3.8" + +"through2@^2.0.0": + "integrity" "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==" + "resolved" "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + "version" "2.0.5" + dependencies: + "readable-stream" "~2.3.6" + "xtend" "~4.0.1" + +"timers-browserify@^1.0.1": + "integrity" "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=" + "resolved" "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz" + "version" "1.4.2" + dependencies: + "process" "~0.11.0" + +"trim-repeated@^1.0.0": + "integrity" "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=" + "resolved" "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "escape-string-regexp" "^1.0.2" + +"tty-browserify@0.0.1": + "integrity" "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + "resolved" "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz" + "version" "0.0.1" + +"type-detect@^4.0.0", "type-detect@^4.0.5": + "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + "version" "4.0.8" + +"typedarray@^0.0.6": + "integrity" "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + "version" "0.0.6" + +"umd@^3.0.0": + "integrity" "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==" + "resolved" "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz" + "version" "3.0.3" + +"undeclared-identifiers@^1.1.2": + "integrity" "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==" + "resolved" "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "acorn-node" "^1.3.0" + "dash-ast" "^1.0.0" + "get-assigned-identifiers" "^1.2.0" + "simple-concat" "^1.0.0" + "xtend" "^4.0.1" + +"universalify@^0.1.0": + "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + "version" "0.1.2" + +"url@~0.11.0": + "integrity" "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=" + "resolved" "https://registry.npmjs.org/url/-/url-0.11.0.tgz" + "version" "0.11.0" + dependencies: + "punycode" "1.3.2" + "querystring" "0.2.0" + +"util-deprecate@^1.0.1", "util-deprecate@~1.0.1": + "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"util@~0.10.1": + "integrity" "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==" + "resolved" "https://registry.npmjs.org/util/-/util-0.10.4.tgz" + "version" "0.10.4" + dependencies: + "inherits" "2.0.3" + +"util@0.10.3": + "integrity" "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=" + "resolved" "https://registry.npmjs.org/util/-/util-0.10.3.tgz" + "version" "0.10.3" + dependencies: + "inherits" "2.0.1" + +"vm-browserify@^1.0.0": + "integrity" "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "resolved" "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz" + "version" "1.1.2" + +"wrappy@1": + "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"xtend@^4.0.0", "xtend@^4.0.1", "xtend@^4.0.2", "xtend@~4.0.1": + "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + "version" "4.0.2" diff --git a/spec.md b/spec.md new file mode 100644 index 0000000..f7a7de6 --- /dev/null +++ b/spec.md @@ -0,0 +1,657 @@ +## The Rockstar Language Specification + +Rockstar is intended to give the programmer an unprecedented degree of poetic license when it comes to the composition and structure of their programs. + +### File format + +Rockstar programs are [UTF-8](https://en.wikipedia.org/wiki/UTF-8) files with the `.rock` file extension. *(Given that for everything included in the current Rockstar specification, UTF-8 is indistinguishable from 7-bit ASCII, that's a fancy way of saying they're plain text files.)* + +### Comments + +The use of comments in Rockstar programs is strongly discouraged. This is rock'n'roll; it's up to the audience to find their own meaning. If you absolutely insist on commenting your Rockstar programs, comments should be contained in parentheses (). Yes, this means you can't use brackets in arithmetic expressions and may need to decompose complex expressions into multiple evaluations and assignments. + +There is, however, a good use for comments - to mark up your code so people know how to play it! Comment delimiters "{}" and "[]" are now available, as well. These are used by the [ChordPro](https://www.chordpro.org/) musical notation system. + +Rockstar developers are not into that whole [brevity thing](https://www.urbandictionary.com/define.php?term=Brevity%20Thing). + +``` +(Initialise Tommy = 1337) +Tommy was a big bad brother. +``` + +### Variables + +Rockstar supports three kinds of variable names. + +**Simple variables** are valid identifiers that are not language keywords. A simple variable name must contain only letters, and cannot contain spaces. Note that Rockstar does not allow numbers or underscores in variable names - remember the golden rule of Rockstar syntax: if you can't sing it, you can't have it. Simple variables are case-insensitive. + +``` +Variable is 1 +Tommy is a rockstar +X is 2 +Y is 3 +Put x plus y into result +``` + +**Common variables** consist of one of the keywords `a`, `an`, `the`, `my`, `your` or `our` followed by whitespace and a unique variable name, which must contain only lowercase ASCII letters a-z. The keyword is part of the variable name, so `a boy` is a different variable from `the boy`. Common variables are case-insensitive. + +``` +My variable is 5 +Your variable is 4 + +Put my variable plus your variable into the total +Shout the total +``` + +**Proper variables** are multi-word proper nouns - words that aren't language keywords, each starting with an uppercase letter, separated by spaces. (Single-word variables are always simple variables.) Whilst some developers may use this feature to create variables with names like `Customer ID`, `Tax Rate` or `Distance In KM`, we recommend you favour idiomatic variable names such as `Doctor Feelgood`, `Mister Crowley`, `Tom Sawyer`, and `Billie Jean`. + +(Although not strictly idiomatic, `Eleanor Rigby`, `Peggy Sue`, `Black Betty`, and `Johnny B Goode` would also all be valid variable names in Rockstar.) + +As in Ruby, Python and VBScript, variables are dynamically typed and you don't need to declare variables before use. + +If a variable is defined outside of a function, it is in global scope. Global scope variables are available everywhere below their first initialization. If a variable is defined inside of a function, it is in local scope. Local scope variables are available from their initialization until the end of the function they are defined in. + +While within a function, if you write to a variable that has been defined in global scope, you write to that variable; you do not define a new local variable. + +#### A note on case sensitivity in Rockstar + +Rockstar keywords and variable names are all case-insensitive, with the exception of proper variables. Proper variables are case-insensitive **apart from the first letter of each word, which must be a capital letter.** + +* `TIME`, `time`, `tIMe`, `TIMe` are all equivalent. Simple variables are case-insensitive. +* `MY HEART`, `my heart`, `My Heart` - are all equivalent; the keyword `my` triggers **common variable** behaviour +* `Tom Sawyer`, `TOM SAWYER`, `TOm SAWyer` - are all equivalent; the capital `S` on `Sawyer` triggers **proper variable** behaviour +* `DOCTOR feelgood` is not a valid Rockstar variable; the lowercase `f` on `feelgood` does not match any valid variable naming style and so the variable name is not valid. + +#### Pronouns + +The keywords `it`, `he`, `she`, `him`, `her`, `they`, `them`, `ze`, `hir`, `zie`, `zir`, `xe`, `xem`, `ve`, and `ver` refer to the variable which was most recently assigned a value. + +(Please don't file issues pointing out that 80s rockers were a bunch of misogynists and gender-inclusive pronouns aren't really idiomatic. You're right, we know, and we've all learned a lot since then. Besides, [*Look What The Cat Dragged In*](https://en.wikipedia.org/wiki/Look_What_the_Cat_Dragged_In) was recorded by four cishet guys who spent more money on lipgloss and hairspray than they did on studio time, and it's an absolute classic.) + +### Types + +Rockstar uses a similar type system to that defined by the [ECMAScript type system](http://www.ecma-international.org/ecma-262/5.1/#sec-8), except `undefined` doesn't sound very rock'n'roll so we use `mysterious` instead. + +* **Mysterious** - the value of any variable that hasn't been assigned a value, denoted by the keyword `mysterious` +* **Null** - the null type. Evaluates as equal to zero and equal to false. The keywords `nothing`, `nowhere`, `nobody`, and `gone` are defined as aliases for `null` +* **Boolean** - a logical entity having two values `true` and `false`. *(The keywords `maybe` and `definitely maybe` are reserved for future use)* + * `right`, `yes` and `ok` are valid aliases for `true` + * `wrong`, `no` and `lies` are valid aliases for `false` +* **Number** - Numbers in Rockstar are double-precision floating point numbers, stored according to the [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) standard. *(An earlier version of this spec proposed that Rockstar used the [DEC64](http://www.dec64.com/) numeric type. This is a perfect example of something that seemed like a great idea after a couple of beers but turns out to be prohibitively difficult to implement...)* +* **String** - Rockstar strings are sequences of 16-bit unsigned integer values representing UTF-16 code units. `empty`, `silent`, and `silence` are aliases for the empty string (`""`). + +Functions and function identifiers are not strictly part of the type system in Rockstar 1.0. + +## Arrays + +Rockstar supports JavaScript-style arrays. Arrays are zero-based, and dynamically +allocated when values are assigned using numeric indexes. + +```$rockstar +Let the array at 0 be "zero" +Let the array at 1 be "one" +Let the array at 255 be "big" +Shout the array at 0 +Shout the array at 255 +``` + +Returning an array in a scalar context will return the current length of the array: + +```$rockstar +Let my array at 255 be "some value" +Shout my array (will print the value 256) +``` + +Rockstar also supports non-numeric array keys, so it is valid to say: + +``` +let my array at "some_key" be "some_value" +Shout my array at "some_key" +``` + +You can mix string and numeric keys within the same array. The array length property +ignores any non-numeric keys: + +``` +Let my array at "some_key" be "some_value" +Shout my array (will print 0, since there are no numeric indexes) +Let my array at 7 be "some other value" +Shout my array (will now print 8, since assigning my array at 7 modifies the array length) +``` + +You can also use array index syntax to read (but not write) specific characters from a string + +```$ +Let my string be "abcdefg" +Shout my string at 0 (will print "a") +Shout my string at 1 (will print "b") +Let the character be my string at 2 +``` + +### Queue operations + +Rockstar arrays can also be created and manipulated by the queue operations `rock` and `roll`. (The aliases `push` and `pop` are supported for Rockstar developers who are into 80s dance music.) + +#### Pushing elements onto an array + +To create a new empty array, `rock` the name of the array: + +``` +Rock the array (the array is now []) +``` + +To push an element onto the end of an array: + +``` +Rock the array with the element +``` + +This supports list expressions, so you can push multiple elements onto the end of an array: + +``` +Rock ints with 1, 2, 3 (ints is now [1, 2, 3]) +Rock the array with the first, the second, and the third +``` + +Remember the `with` keyword is context-sensitive, so in this example: + +``` +Rock ints with 1, 2 with 3, 4, 5 + ^ ^ + | +-- this 'with' is the binary addition operator + | + +------------ this 'with' is part of the array push syntax + +(ints is now [ 1, 5, 4, 5 ]) +``` + +Rockstar supports a special syntax for pushing poetic literals onto a queue: + +```rockstar +Rock the array like the poetic literal (the array is now [ 367 ]) +Rock the array like a wolf (the array is now [ 367, 14 ]) +``` + +This syntax is very useful for initialising strings without using string literals - see below. It also means that the following line is valid Rockstar: + +``` +Rock you like a hurricane (you is now [ 19 ]) +``` + +#### Popping elements from an array + +The `roll` keyword will remove the first element from an array and return the element that was removed. + +``` +Rock ints with 1, 2, 3 +Roll ints (returns 1; ints is now [ 2, 3 ]) +Roll ints (returns 2; ints is now [ 3 ]) +Roll ints (returns 3; ints is now [] ) +Roll ints (returns mysterious; ints is now []) +``` + +`roll` can be used in assignments: + +``` +Rock ints with 1, 2, 3 +Let the first be roll ints +Let the second be roll ints +Let the third be roll ints +Shout the first (outputs 1) +Shout the second (outputs 2) +Shout the third (outputs 3) +``` + +Rockstar also supports a special `roll x into y` syntax for removing the first element from an array and assigning it to a variable: + +``` +Rock the list with 4, 5, 6 +Roll the list into foo +Roll the list into bar +Roll the list into baz +Shout foo (will output 4) +Shout bar (will output 5) +Shout baz (will output 6) +``` + +### Splitting strings and type conversions + +#### A note about mutations + +Some operations in Rockstar will either act in-place, modifying the variable passed to them, or will leave the +source variable unmodified and place their output into a target variable. These operations are known as mutation +operations, and they all have the following syntax: + +* `Modify X` - acts in-place +* `Modify X into Y` - leave `X` alone and put modified output into `Y` +* `Modify X with Z` - modify `X` in-place, with optional parameter `Z` +* `Modify X into Y with Z` - modify `X`, using parameter `Z`, and put results in `Y` + +Note that in-place mutations are **only valid where the first argument is a variable**: + +#### Splitting Strings + +To split a string in Rockstar, use the `cut` mutation (aliases `split` and `shatter`) + +String splitting can either operate in-place, or place results into an output variable. +You can specify an optional delimiter; if no delimiter is provided, the string is split +into a character array. + +``` +Split "a,b,c" into the array (the array is ["a", ",", "b", ",", "c"]) +Split "a,b,c" into the array with "," (the array is ["a", "b", "c"]) +Split my string (my string will split in-place to an array of characters) +Split my string with x (split my string in-place using the current value of x as a delimiter) + +Cut my life into pieces + (split my life, put the resulting array in pieces) + +Cut your cake with my knife + (modify your cake in-place, by splitting it using my knife as a delimiter) + +Shatter my heart into pieces with your lies + (Split my heart, using your lies as a delimiter, and put the result into pieces) +``` + +In-place string splitting is only valid when the first argument is a variable; the +following would be invalid (because where would the result actually go?) + +```$ +Split "a,b,c,d,e" with "," (NOT VALID - nowhere to place the output) +Split "a,b,c,d,e" into tokens with "," (valid - tokens now contains ["a","b","c","d","e"]) +``` + +#### Joining Arrays + +To join an array in Rockstar, use the `join` mutation, or the alias `unite` + +``` +Let the string be "abcde" +Split the string into tokens +Join tokens with ";" + (the tokens now contains "a;b;c;d;e") + +The input says hey now hey now now +Split the input into words with " " +Unite words into the output with "! " + (the output now contains "hey! now! hey! now! now!") +``` + +#### Parsing numbers and character codes + +Use the `cast` mutation (alias `burn`) to parse strings into numbers, or to convert numbers into their corresponding Unicode characters. + +```$rockstar +Let X be "123.45" +Cast X + (X now contains the numeric value 123.45) +Let X be "ff" +Cast X with 16 + (X now contains the numeric value 255 - OxFF) +Cast "12345" into result + (result now contains the number 12345) +Cast "aa" into result with 16 + (result now contains the number 170 - 0xAA) + +Cast 65 into result + (result now contains the string "A" - ASCII code 65) + +Cast 1046 into result + (result now contains the Cyrillic letter "Ж" - Unicode code point 1046) +``` + +### Truthiness + +The results of comparisons often rely on a concept called 'truthiness'. If the value is truthy, it will be implicitly converted to true. If it is falsy, it will be implicitly converted to false. + +- Mysterious - Falsy +- Null - Falsy +- Boolean - Truthy if True, Falsy if False +- Number - If equal to zero, falsy. Otherwise, truthy. +- String - Truthy (null is the falsy equivalent) + +### Constants vs Keywords + +Words that are used to construct a literal of a certain type are referred to as **constants** and words that are used to construct various syntax constructs are referred to as **keywords** + +| Constant | Aliases | +| ------------ | -------------------------------------- | +| `mysterious` | - | +| `null` | `nothing`, `nowhere`, `nobody`, `gone` | +| `true` | `right`, `yes`, `ok` | +| `false` | `wrong`, `no`, `lies` | +| `empty` | `silent`, `silence` | + +### Literals and Assignment + +String literals in Rockstar use double quotes. + +* `"Hello San Francisco"` + +Numeric literals in Rockstar are written as decimal numbers + +* `123` +* `3.141592654` + +Assignment is done using either `put into ` or `let be `: + + +* `Put 123 into X` will assign the value `123` to the variable `X` +* `Put "Hello San Francisco" into the message` will assign the value `"Hello San Francisco"` to the variable `the message` +* `Let my balance be 1000000` will store the value `1000000` in the variable `my balance` +* `Let the survivors be the brave without the fallen` will subtract `the fallen` from `the brave` and store the result in `the survivors` + +The keyword `in` is an alias for `into`. + +#### Single Quotes + +Given Rockstar's intriguing ancestral mixture of computer programming, creative English and idiomatic rock'n'roll, the single quote character presents all sorts of challenges. + +Most programming languages use the single quote for quoting literal strings - `'like this'`. English, when written using the basic ASCII character set, often uses the single quote to stand in for the apostrophe to denote contractions or possessives - `you're, she's, he's, shouldn't, rock'n'roll`. Rock'n'roll uses the apostrophe apparently at random - `sweet child o' mine`, `ain't talkin' 'bout love`, `guns n' roses`. + +Given three such dramatically different influences, here's how Rockstar interprets single quotes. + +1. The sequence `'s` or `'re` appearing at the end of a word is equivalent to ` is`, except when used in poetic literals. + + * This allows `Janie's got a gun` (initialises `Janie` with the value `313`) and `Union's been on strike` (initialises `Union` with the value `426`) as valid variable declarations. `We're here to see the show` initialises `We` with the value `42334`. + * You can also use `'s` and `'re` in comparisons: `If Janie's gone` tests whether `Janie` is `null`. + +2. All other single quotes are then ignored. `ain't` is equivalent to `aint`, `wakin'` has five letters, and `'''''` is equal to the empty string. This means you can use single quotes freely throughout your program to punctuate, adjust word lengths and generally channel the spirit of rock'n'roll without worrying about compiler errors. + +`The fire's burning Tommy's feet` initialises `the fire` with the value `764`. + +#### Increment and Decrement + +Increment and decrement are supported by the `Build {variable} up` and `Knock {variable} down` statements. Adding more than one `up` or `down` in the statement will increment or decrement the same amount of times as you have `up`s or `down`s in the statement. There may be a comma between each `up` and `down`. + +* `Build my world up` will increment the value stored in `my world` by 1. +* `Knock the walls down` will decrement the value stored in `the walls` by 1 +* `Knock the walls down, down` will decrement the value stored in `the walls` by 2 + +#### Operators + +Rockstar supports the infix arithmetic operators `+`, `-`, `*` and `/`. The language includes aliases for each operator so you can write lyrically pleasing expressions. + +| Operator | Operation | Aliases | +| -------- | ----------------- | ------------------ | +| + | addition | `plus`, `with` . | +| - | subtraction | `minus`, `without` | +| * | multiplication | `times`, `of` | +| / | division | `over`, `between` | + +The alias `by` has been explicitly rejected because of disagreements between the colloquial English `ten by four` (i.e. `10*4 = 40`) and `ten (divided) by four` (i.e. `10/4 = 2.5`) + +Examples: + +* `Put the whole of your heart into my hands` - multiply `your heart` by `the whole` and assign the result to `my hands` + +* `My world is nothing without your love` - Initialize `my world` with the result of subtracting `your love` from 0 + +* `If the tears of a child are nothing` - check whether `the tears` * `a child` = 0 + +* `My heart over the moon` - Returns `my heart` divided by `the moon` + +#### Compound Assignment Operators + +As in many C-style languages, Rockstar supports compound assignment operators, providing a terser syntax for storing the result of an operation. This is done using the `let` keyword. + +* `Let X be with 10` - add `10` to `X` and store the result in `X`. (Equivalent to `X += 10`) +* `Let the children be without fear` - subtract `fear` from `the children` and store the result in `the children` +* `Let my heart be over the moon` - equivalent to `my heart /= the moon` + +#### Arithmetic Rounding + +Rounding in Rockstar is performed by the `turn` keyword. `Turn up` will round up (i.e. towards positive infinity), to the nearest integer; `turn down` will round down (towards negative infinity) to the nearest integer, and `turn round` will round to the nearest integer. Bonnie Tyler enthusiasts will be pleased to note that Rockstar accepts `turn around` as a valid alias. + +Turn operations act in-place: they modify the variable directly, and will return the rounded value. + +``` +X is 1.2 +Turn up X +Shout X (will print 2) + +X is 1.2 +Turn down X +Shout X (will print 1) + +The radio's playing. The night has just begun. + (initialises the radio with 7.35345) +Turn up the radio +Say the radio (will print 8) +``` +Rounding supports variable [pronouns](#pronouns), so you can write phrases like: + +``` +My heart is on fire. Aflame with desire. +Turn it up. +Shout it. +``` + +which will print the value 25 (obviously). + +#### List Arithmetic + +Rockstar operators support a list of expressions on the right-hand side of the operator. (Imagine explaining in English that, say, "the restaurant bill is the food, plus the drinks, the service, and the tax" - same idea.) + +* `Let X be 1 with 2, 3, 4` - shorthand for `X = 1 + 2 + 3 + 4` +* `Let X be "foo" with "bar", and "baz"` - X will be `"foo" + "bar" + "baz"` + +You can combine list arithmetic with compound assignment, as with this example: + +``` +The wolf is hungry, out on the street (initialise the_wolf = 63236) +Fear is the mind killer (fear = 346) +Fury is the demon child (fury = 355) +Hate is the only truth (hate = 345) +Let the wolf be without fear, fury, and hate (the_wolf = the_wolf - 346 - 355 - 345) +Shout the wolf (output 62190) +``` + +List arithmetic is only possible where the result type supports further operations. + +* `Let X be "foo" times 2, 2, 2` - OK; X is `"foofoofoofoofoofoofoofoo"` +* `Let X be 2 times "foo", "bar"` - is `mysterious` (because `2 * foo = "foofoo"`, and `"foofoo" * "bar"` is undefined) + +#### Poetic Literals + +Rockstar also supports a unique language feature known as **poetic literals**. Inspired by the [here-document](https://en.wikipedia.org/wiki/Here_document) syntax supported by many scripting languages, poetic literals allow the programmer to simultaneously initialize a variable and express their innermost angst. + +##### Poetic Constant Literals + +A poetic constant literal is a single line consisting of a variable name, the `is` keyword, or the aliases `are`, `was` or `were`, and a constant signifying the value the variable will be set to. + +* `My heart is true` - initialises the variable `my heart` with the Boolean value `true` +* `Tommy is nobody` - initialises the variable `Tommy` with the value `null` using the `nobody` alias +* `Tommy is mysterious` - initialises the variable `Tommy` with the value `mysterious`. + +##### Poetic String Literals + +A poetic string literal assignment starts with a variable name, followed by one of the keywords `say`, `says` or `said` followed by a single space. The rest of the line up to the `\n` terminator is treated as an unquoted string literal. + +* `Peter says Hello San Francisco!\n` will initialise the variable `Peter` with the string literal `"Hello San Francisco!"`. +* `San Francisco says Hello back\n` will initialise the variable `San Francisco` with the string literal `Hello back`. +* `You say I'm no good for you\n` will initialise the variable `You` with the string literal `I'm no good for you`. +* `My parents said we'd never make it\n` will initialise the variable `My parents` with the string literal `we'd never make it`. + +#### Poetic Number Literals + +A poetic number literal begins with a variable name, followed by the keyword `is`, or the aliases `are`, `was` or `were`. As long as the next symbol is not a Literal Word, the rest of the line is treated as a decimal number in which the values of consecutive digits are given by the lengths of the subsequent barewords, up until the end of the line. To allow the digit zero, and to compensate for a lack of suitably rock'n'roll 1- and 2-letter words, word lengths are parsed modulo 10. A period (.) character denotes a decimal place. Other than the first period, any non-alphabetical characters are ignored. + +* `Tommy was a lovestruck ladykiller` initialises `Tommy` with the value `100` +* `Sweet Lucy was a dancer` - initialises `Sweet Lucy` with the value 16 +* `A killer is on the loose` - initialises `a killer` with the value 235. +* `My dreams were ice. A life unfulfilled; wakin' everybody up, taking booze and pills` - initialises `my dreams` with the value `3.1415926535` +* `Tommy was without` initialises `Tommy` with the value `7` because `without` is a Reserved Keyword, but not a Literal Word. + * Note that poetic literals **can** include Reserved Keywords, as with `taking` in this example. + * The hyphen (`-`) is counted as a letter – so you can use terms like 'all-consuming' (13 letters > 3) and + 'power-hungry' (12 letters > 2) instead of having to think of 12- and 13-letter words. + * The semi-colon, comma, apostrophe and any other non-alphabetical characters are ignored. + +### Comparison + +Similar to the single-equals operator in Visual Basic and some scripting languages, the `is` keyword in Rockstar is interpreted differently depending whether it appears as part of a statement or as part of an expression. `isn't` is the logical negation of the `is` keyword. + +Comparison in Rockstar can only be done within an expression. + +* `Tommy is nobody` initialises the variable `Tommy` with the value `nobody` +* `If Tommy is nobody` - will execute the following block if, and only if, the variable `Tommy` is equal to `nobody` + +Comparison can also be done with any alias of `is`: + +* `If he's gone` +* `If we are the future` +* `If the cat was mysterious` +* `If dreams were real` + +The keyword `ain't` (which is reduced to `aint` by Rockstar) is an alias for `isn't`. This usage runs contrary to idiomatic English, where "Tommy isn't anybody", "Tommy ain't nobody" and "Tommy ain't not nobody" somehow mean exactly the same thing. + +`aren't`, `wasn't`, and `weren't` are also aliases for `isn't`. + +Rockstar also supports the following comparison syntax: + +* `is higher/greater/bigger/stronger than` to denote 'greater than' +* `is lower/less/smaller/weaker than` to denote 'less than' +* `is as high/great/big/strong as` to denote 'greater than or equal to' +* `is as low/little/small/weak as` to denote 'less than or equal to' + +### Logical Operations + +Rockstar has 4 different logical operators that first convert their operand(s) to a boolean by truthiness. + +* `A and B` returns the [Conjunction](https://en.wikipedia.org/wiki/AND_gate) +* `A or B` returns the [Disjunction](https://en.wikipedia.org/wiki/OR_gate) +* `A nor B` returns the [Joint Denial](https://en.wikipedia.org/wiki/NOR_gate) +* `not A` returns the [Negation](https://en.wikipedia.org/wiki/Inverter_(logic_gate)) of its single argument. + +All logical operators are short circuiting. This means if evaluating the first argument to the operator guarantees a result, the other argument is not evaluated. `false and 1 over 0` is `false` and does not produce an error for dividing by zero. + +### Input/Output + +Use the `Listen` keyword to read one line of input from `STDIN`. Use `Listen to` to capture the input into a named variable. + +* `Listen to your heart` - read one line of input from `STDIN` and store it in `your heart` + +Use the `Say` keyword to write the value of a variable to `STDOUT`. + +* `Say Tommy` - will output the value stored in `Tommy` to `STDOUT` + +Rockstar defines `Shout`, `Whisper` and `Scream` as aliases for `Say` + +The following examples all use c style syntax for explaining what things do. + +### Types Continued + +#### Operator Precedence + +The higher, the tighter the binding. This is the precedence we generally expect from our math. + +1. Function Call (greedy arguments) +2. Logical NOT (right-associative) +3. Multiplication and Division (left-associative) +4. Addition and Subtraction (left-associative) +5. Comparison operators (left-associative) +6. `and`, `or`, and `nor` (left-associative) + +##### Examples + +- `A taking B times C plus not D times E and F` is equivalent to `((A(B) * C) + (!D * E)) && F` + +#### Binary Comparison + +Equality comparisons (`is`, `ain't`, `is not`) are allowed between types if they are the same type or they can be compared by the rules below. Two arrays are equal if their elements are equal. + +Ordering comparisons (`is higher than`, `is lower than`, `is as high as`, and `is as low as`) are only allowed if the operands are both Numbers or both Strings or they are converted to such an arrangement according to the rules below. Numbers are compared as expected. Strings are compared lexicographically. + +- \ \ Mysterious =\> Equal. +- \ \ Mysterious =\> Non equal. +- String \ Number =\> Convert the string to a number using base 10 with leading zeros ignored. If it fails, return false. +- String \ Boolean =\> Convert the string to a boolean. The empty string is false; all other strings are true. +- String \ Null =\> Non equal. +- Number \ Boolean =\> Convert number to boolean by "truthiness". +- Number \ Null =\> Convert null to 0. +- Boolean \ Null =\> Convert null to false. + +##### Examples + +- `"1" is 1` evaluates to true because `"1"` gets converted to the number `1` +- `"2" ain't Mysterious` evaluates to true because all types are non equal to mysterious, besides mysterious itself. +- `"02" < "10"` is true because the lexicographical comparison between `0` and `1` shows that the first string is less than the second string. +- `True < 10` is an error because `10` gets coerced into `True` due to the comparison with a boolean and there are no allowed ordering comparisons between booleans. + +#### Increment and Decrement Operators + +- \ String =\> Error +- \ Boolean =\> Invert Boolean +- \ Null =\> coerce to zero (`My world is nothing / build my world up` can be used to initialise a counter loop, for example.) +- \ Mysterious =\> Error + +#### Binary Operators + +Conversions other than those listed are errors. + +- String \ Number =\> Convert the number to a base-10 string, retaining all precision, but removing unnecessary digits. A leading zero is considered necessary for numbers with no whole part, eg. `00.1000` gets serialized to `0.1` +- String \ Boolean =\> Convert the boolean to `true` or `false` +- String \ Null =\> Convert the null to `"null"` +- String \ Mysterious =\> Convert the mysterious to `"mysterious"` +- String \ Number =\> String gets repeated \ times + +### Flow Control and Block Syntax + +#### Conditionals + +Conditional expressions start with the `If` keyword, followed by an expression. If the expression evaluates to `true`, then the subsequent code block is executed. Optionally, an `Else` block can be written after an `If` block. The code block following the `Else` keyword would be executed if the `If` expression evaluated to `false`. + +For the purpose of conditional expressions, 0, `mysterious`, `null`, `false`, and the empty string all evaluate to `false`, and everything else to `true`. + +#### Loops + +Similar to the `If` statement, a loop is denoted by the `While` or `Until` keyword, which will cause the subsequent code block to be executed repeatedly whilst the expression is satisfied: + +``` +Tommy was a dancer +While Tommy ain't nothing, +Knock Tommy down +``` + +That'll initialize Tommy with the value 16 (using the poetic number literal syntax) and then loop, decrementing Tommy by 1 each time until Tommy equals zero (i.e `ain't nothing` returns false). + + +The `break` and `continue` statements work as they do in most block-based languages. Rockstar defines `Break it down` as an alias for `break` and `Take it to the top` as an alias for `continue` + +#### Blocks + +A block in Rockstar starts with an `If`, `Else`, `While` or `Until` statement, and is terminated by a blank line or the end-of-file. EOF ends all open code blocks + +``` +Tommy was a dancer +While Tommy ain't nothing +Shout it +Knock it down + +``` + +### Functions + +Functions are declared with a variable name followed by the `takes` keyword (alias `wants`) and a list of arguments separated by one of the following: `and` `,` `&` `, and` `'n'` + +* `Multiply takes X and Y` +* `Search takes Needle and Haystack` +* `Polly wants a cracker` + +The function body is a list of statements with no separating blank lines. A blank line denotes the end of a function body. Functions in Rockstar always have a return value, specified by the `return` keyword and its aliases `give` and `send`. For historical reasons, `give back` is also supported as an alias for `return`, and the return statement can be followed by the keyword `back` (which has no effect but can make code more lyrical). + +``` +(This function adds 9 to its input and returns the result) +Polly wants a cracker +Cheese is delicious +Put a cracker with cheese into your mouth +Give it back +``` + +Functions are called using the 'taking' keyword and must have at least one argument. Multiple arguments are separated with one of the following: `,` `&` `, and` `'n'`. + +Arguments may be any valid expression, including literals, arithmetic expressions and function calls. + +* `Multiply taking 3, 5` is an expression returning (presumably) 15 +* `Search taking "hands", "lay your hands on me"` +* `Put Multiply taking 3, 5, and 9 into Large` will set Large to `3 * 5 * 9` **NOT** `(3 * 5) && 9`. diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..7f3edce --- /dev/null +++ b/tests/README.md @@ -0,0 +1,9 @@ +# The Rockstar Test Suite + +The test suite is a set of Rockstar programs and their expected output. + +It is completely implementation agnostic. To validate your own Rockstar implementation against the +official test suite, run each Rockstar program in the suite and compare the output with the associated `.rock.out` +file. + +For programs that read input from the console, your test harness should read input from the `.rock.in` file. \ No newline at end of file diff --git a/tests/failures/invalid_comments.rock b/tests/failures/invalid_comments.rock new file mode 100644 index 0000000..950e260 --- /dev/null +++ b/tests/failures/invalid_comments.rock @@ -0,0 +1 @@ +(nested comments (like this) don't work) \ No newline at end of file diff --git a/tests/failures/invalid_comments.rock.err b/tests/failures/invalid_comments.rock.err new file mode 100644 index 0000000..6f6fbac --- /dev/null +++ b/tests/failures/invalid_comments.rock.err @@ -0,0 +1 @@ +Expected \ No newline at end of file diff --git a/tests/failures/reserved_definitely_maybe.rock b/tests/failures/reserved_definitely_maybe.rock new file mode 100644 index 0000000..2abddb7 --- /dev/null +++ b/tests/failures/reserved_definitely_maybe.rock @@ -0,0 +1 @@ +Definitely maybe is reserved for future use diff --git a/tests/failures/reserved_maybe.rock b/tests/failures/reserved_maybe.rock new file mode 100644 index 0000000..917eea1 --- /dev/null +++ b/tests/failures/reserved_maybe.rock @@ -0,0 +1 @@ +Maybe is reserved for future use diff --git a/tests/fixtures/arrays/array_functions.rock b/tests/fixtures/arrays/array_functions.rock new file mode 100644 index 0000000..7a3cac1 --- /dev/null +++ b/tests/fixtures/arrays/array_functions.rock @@ -0,0 +1,47 @@ +Shout "function that does nothing" + +The void takes something +Give back nothing + +Rock a list with nothing +Shout a list +Shout a list at 0 +Let me be the void taking nothing +Shout a list +Shout a list at 0 + +Whisper empty + +Shout "function that multiplies elements in an array" + +Multiplier takes the array +The product is 1 +Until the array is nothing +Roll the array into the variable +Shout the variable +Let the product be the product of the variable + +Give back the product + +Rock the list with 3,4,5,6,7,8,9,10 +Let the answer be multiplier taking the list +Shout the answer +Shout the list + +Whisper empty + +Say "function that returns an array" + +Rock collection +Shout collection +Shout collection at 0 + +Append takes the array and the arg +Rock the array with the arg +Give back the array + +Let expansion be append taking collection, "hello" +Shout collection +Shout collection at 0 +Shout expansion +Shout expansion at 0 diff --git a/tests/fixtures/arrays/array_functions.rock.out b/tests/fixtures/arrays/array_functions.rock.out new file mode 100644 index 0000000..5088d84 --- /dev/null +++ b/tests/fixtures/arrays/array_functions.rock.out @@ -0,0 +1,25 @@ +function that does nothing +1 +null +1 +null + +function that multiplies elements in an array +3 +4 +5 +6 +7 +8 +9 +10 +1814400 +8 + +function that returns an array +0 +mysterious +0 +mysterious +1 +hello diff --git a/tests/fixtures/arrays/arrayalike.rock b/tests/fixtures/arrays/arrayalike.rock new file mode 100644 index 0000000..8374bce --- /dev/null +++ b/tests/fixtures/arrays/arrayalike.rock @@ -0,0 +1,12 @@ +Let my array at 10000000 be "large" +Shout my array +Shout my array at 9999999 +Shout my array at 10000000 + +Let my string be "abc" +Shout my string at 0 +Shout my string at 1 +Shout my string at 2 +Shout my string at 3 +Shout my string + diff --git a/tests/fixtures/arrays/arrayalike.rock.out b/tests/fixtures/arrays/arrayalike.rock.out new file mode 100644 index 0000000..a91531f --- /dev/null +++ b/tests/fixtures/arrays/arrayalike.rock.out @@ -0,0 +1,8 @@ +10000001 +mysterious +large +a +b +c +mysterious +abc diff --git a/tests/fixtures/arrays/arrays.rock b/tests/fixtures/arrays/arrays.rock new file mode 100644 index 0000000..f5da2d4 --- /dev/null +++ b/tests/fixtures/arrays/arrays.rock @@ -0,0 +1,9 @@ +Let my array at 0 be "foo" +Let my array at 1 be "bar" +Let my array at 2 be "baz" +Let my array at "key" be "value" +Shout my array at 0 +Shout my array at 1 +Shout my array at 2 +Shout my array at "key" +Shout my array diff --git a/tests/fixtures/arrays/arrays.rock.out b/tests/fixtures/arrays/arrays.rock.out new file mode 100644 index 0000000..6f22509 --- /dev/null +++ b/tests/fixtures/arrays/arrays.rock.out @@ -0,0 +1,5 @@ +foo +bar +baz +value +3 diff --git a/tests/fixtures/arrays/hash.rock b/tests/fixtures/arrays/hash.rock new file mode 100644 index 0000000..4846bfa --- /dev/null +++ b/tests/fixtures/arrays/hash.rock @@ -0,0 +1,18 @@ +Let my hash at "key" be "value" +Shout my hash at "key" +Let my hash at "key" be "hello" +Shout my hash at "key" +Shout my hash +Let my hash at 0 be "zero" +Shout my hash + +Midnight says abc +Daylight says def +Let your hash at midnight be daylight +Shout your hash at midnight +Shout daylight +Shout your hash +Moonlight is sweet sorrow +Let your hash at moonlight be nothing +Shout your hash + diff --git a/tests/fixtures/arrays/hash.rock.out b/tests/fixtures/arrays/hash.rock.out new file mode 100644 index 0000000..8c1ab14 --- /dev/null +++ b/tests/fixtures/arrays/hash.rock.out @@ -0,0 +1,8 @@ +value +hello +0 +1 +def +def +0 +57 diff --git a/tests/fixtures/arrays/join.rock b/tests/fixtures/arrays/join.rock new file mode 100644 index 0000000..24b6620 --- /dev/null +++ b/tests/fixtures/arrays/join.rock @@ -0,0 +1,15 @@ +Let the array at 0 be "a" +Let the array at 1 be "b" +Let the array at 2 be "c" +Join the array into ResultA +Shout ResultA + +Join the array into ResultB with "-" +Shout ResultB + +Join the array +Shout the array + +Split "abcde" into tokens +Join tokens with ";" +Shout tokens diff --git a/tests/fixtures/arrays/join.rock.out b/tests/fixtures/arrays/join.rock.out new file mode 100644 index 0000000..99b8339 --- /dev/null +++ b/tests/fixtures/arrays/join.rock.out @@ -0,0 +1,4 @@ +abc +a-b-c +abc +a;b;c;d;e diff --git a/tests/fixtures/arrays/split.rock b/tests/fixtures/arrays/split.rock new file mode 100644 index 0000000..1bbf2a8 --- /dev/null +++ b/tests/fixtures/arrays/split.rock @@ -0,0 +1,14 @@ +Say "IN-PLACE" +Let the string be "abc" +Split the string +Say the string at 0 +Say the string at 1 +Say the string at 2 +Say the string at 3 + +Say "LITERAL" +Split "wxyz" into digits +Say digits at 0 +Say digits at 1 +Say digits at 2 +Say digits at 3 diff --git a/tests/fixtures/arrays/split.rock.out b/tests/fixtures/arrays/split.rock.out new file mode 100644 index 0000000..bed1e78 --- /dev/null +++ b/tests/fixtures/arrays/split.rock.out @@ -0,0 +1,10 @@ +IN-PLACE +a +b +c +mysterious +LITERAL +w +x +y +z diff --git a/tests/fixtures/arrays/split_delimiters.rock b/tests/fixtures/arrays/split_delimiters.rock new file mode 100644 index 0000000..fa75455 --- /dev/null +++ b/tests/fixtures/arrays/split_delimiters.rock @@ -0,0 +1,15 @@ +Say "IN-PLACE WITH DELIMITER" +Let the string be "a,b,c" +Split the string with "," +Say the string +Say the string at 0 +Say the string at 1 +Say the string at 2 + +Say "OUTPUT WITH DELIMITER" +Let the line be "livin' on a prayer" +Split the line into words with " " +Say words at 0 +Say words at 1 +Say words at 2 +Say words at 3 diff --git a/tests/fixtures/arrays/split_delimiters.rock.out b/tests/fixtures/arrays/split_delimiters.rock.out new file mode 100644 index 0000000..d0a3c57 --- /dev/null +++ b/tests/fixtures/arrays/split_delimiters.rock.out @@ -0,0 +1,10 @@ +IN-PLACE WITH DELIMITER +3 +a +b +c +OUTPUT WITH DELIMITER +livin' +on +a +prayer diff --git a/tests/fixtures/assignment/compound_assignments.rock b/tests/fixtures/assignment/compound_assignments.rock new file mode 100644 index 0000000..7bc275e --- /dev/null +++ b/tests/fixtures/assignment/compound_assignments.rock @@ -0,0 +1,22 @@ +Let X be 1 +Let X be with 1 +Shout X (2) + +Let Y be 2 +Let Y be without 1 +Shout Y (1) + + +Y is a variable +Let it be 2 +Shout it + +Ozzy is always creeping up on you +My heart is alone in the darkness +Let it be with Ozzy +Shout it + +Your spirit is flying free +The moon is up +Let your spirit be over the moon +Shout it \ No newline at end of file diff --git a/tests/fixtures/assignment/compound_assignments.rock.out b/tests/fixtures/assignment/compound_assignments.rock.out new file mode 100644 index 0000000..cedd349 --- /dev/null +++ b/tests/fixtures/assignment/compound_assignments.rock.out @@ -0,0 +1,5 @@ +2 +1 +2 +73461 +32 diff --git a/tests/fixtures/assignment/lets.rock b/tests/fixtures/assignment/lets.rock new file mode 100644 index 0000000..3a8358a --- /dev/null +++ b/tests/fixtures/assignment/lets.rock @@ -0,0 +1,39 @@ +Let X be 1 +Let Y be 2 +Let Z be X plus Y + +Shout X +Shout Y +Shout Z + +Your salvation is pure +Let my sword be your salvation +Shout my sword + +My variable is 10 +Bad Boy Billy is 5 +Let the answer be my variable without Bad Boy Billy +Shout the answer + +Let simple be 6 +Shout simple + +Let the variable be 7 +Shout the variable + +Let Proper Variable be 2 plus 2 plus 2 plus 2 +Shout Proper Variable + +Let the price be nothing +Shout the price + +Variable is 0 +Let it be 1 +Shout it + + +The brave are without number +The fallen are always remembered +Let the heroes be the brave without the fallen +Shout the heroes (76 - 60 = 16) + diff --git a/tests/fixtures/assignment/lets.rock.out b/tests/fixtures/assignment/lets.rock.out new file mode 100644 index 0000000..1a9a1e3 --- /dev/null +++ b/tests/fixtures/assignment/lets.rock.out @@ -0,0 +1,11 @@ +1 +2 +3 +4 +5 +6 +7 +8 +null +1 +16 diff --git a/tests/fixtures/comments/chordpro_comments.rock b/tests/fixtures/comments/chordpro_comments.rock new file mode 100644 index 0000000..9df987f --- /dev/null +++ b/tests/fixtures/comments/chordpro_comments.rock @@ -0,0 +1,11 @@ +{Title: Chordpro Comments} +{Artist: theGleep} + +{Verse} +[C]One Line is fine +[G]Two Lines are more than one +[D: quiet]Put Two Lines with One Line into All Lines +[G: loud]Knock it down +[C]shout All Lines +[C]Shout Two Lines +[C]Shout One Line \ No newline at end of file diff --git a/tests/fixtures/comments/chordpro_comments.rock.out b/tests/fixtures/comments/chordpro_comments.rock.out new file mode 100644 index 0000000..1200149 --- /dev/null +++ b/tests/fixtures/comments/chordpro_comments.rock.out @@ -0,0 +1,3 @@ +446 +443 +4 diff --git a/tests/fixtures/comments/complex_comments.rock b/tests/fixtures/comments/complex_comments.rock new file mode 100644 index 0000000..3b6523a --- /dev/null +++ b/tests/fixtures/comments/complex_comments.rock @@ -0,0 +1,15 @@ +say "pass 1" (trailing comment) + +(leading comment) say "pass 2" + +say (inline comment) "pass 3" + +( +multiline +comments +are +also +supported +) say "pass 4" + +(((((((( multiple opening brackets are just part of the comment) say "pass 5" diff --git a/tests/fixtures/comments/complex_comments.rock.out b/tests/fixtures/comments/complex_comments.rock.out new file mode 100644 index 0000000..1bb0d82 --- /dev/null +++ b/tests/fixtures/comments/complex_comments.rock.out @@ -0,0 +1,5 @@ +pass 1 +pass 2 +pass 3 +pass 4 +pass 5 diff --git a/tests/fixtures/comments/simpleComments.rock b/tests/fixtures/comments/simpleComments.rock new file mode 100644 index 0000000..51d862b --- /dev/null +++ b/tests/fixtures/comments/simpleComments.rock @@ -0,0 +1,7 @@ +(comment on it's own) + +say "the words" (comment at the end of a line) + +say (comment between items) "you want to say" + +(comment before items) say "whatever you want" diff --git a/tests/fixtures/comments/simpleComments.rock.out b/tests/fixtures/comments/simpleComments.rock.out new file mode 100644 index 0000000..a87a45e --- /dev/null +++ b/tests/fixtures/comments/simpleComments.rock.out @@ -0,0 +1,3 @@ +the words +you want to say +whatever you want diff --git a/tests/fixtures/comments/simple_comment.rock b/tests/fixtures/comments/simple_comment.rock new file mode 100644 index 0000000..53eecbd --- /dev/null +++ b/tests/fixtures/comments/simple_comment.rock @@ -0,0 +1,2 @@ +(this is a comment) +(this) (is) (lots) (of) (comments) diff --git a/tests/fixtures/conditionals/empty_if.rock b/tests/fixtures/conditionals/empty_if.rock new file mode 100644 index 0000000..44e7a84 --- /dev/null +++ b/tests/fixtures/conditionals/empty_if.rock @@ -0,0 +1,3 @@ +if false +else +say "pass" diff --git a/tests/fixtures/conditionals/empty_if.rock.out b/tests/fixtures/conditionals/empty_if.rock.out new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/tests/fixtures/conditionals/empty_if.rock.out @@ -0,0 +1 @@ +pass diff --git a/tests/fixtures/conditionals/simpleConditionals.rock b/tests/fixtures/conditionals/simpleConditionals.rock new file mode 100644 index 0000000..bf81d90 --- /dev/null +++ b/tests/fixtures/conditionals/simpleConditionals.rock @@ -0,0 +1,28 @@ +if true +say "hello" +say "world" +else +say "goodbye" +say "everyone" +(end block) + +if false +say "hello" +say "world" +else +say "goodbye" +say "everyone" +(end block) + +if true +say "hello" +say "world" +(end block) + +if true +if false +say "1" +else +say "2" +else +say "3" diff --git a/tests/fixtures/conditionals/simpleConditionals.rock.out b/tests/fixtures/conditionals/simpleConditionals.rock.out new file mode 100644 index 0000000..be572f8 --- /dev/null +++ b/tests/fixtures/conditionals/simpleConditionals.rock.out @@ -0,0 +1,7 @@ +hello +world +goodbye +everyone +hello +world +2 diff --git a/tests/fixtures/conditionals/truthinessTest.rock b/tests/fixtures/conditionals/truthinessTest.rock new file mode 100644 index 0000000..a3afa0d --- /dev/null +++ b/tests/fixtures/conditionals/truthinessTest.rock @@ -0,0 +1,27 @@ +if "" +say "this should not print since empty strings are false" + +if "hello" +say "this should print since non-empty strings are true" + +if 0 +say "this should not print since 0 is false" + +if 1 +say "this should print since non-zero numbers are true" + +if -3 +say "this should print since non-zero numbers, including negatives, are true" + +if mysterious +say "this should not print since mysterious is false" + +if null +say "this should not print since null is false" + +F takes X +give back X + +if F +say "this should print since function references are objects which are truthy" + diff --git a/tests/fixtures/conditionals/truthinessTest.rock.out b/tests/fixtures/conditionals/truthinessTest.rock.out new file mode 100644 index 0000000..077626c --- /dev/null +++ b/tests/fixtures/conditionals/truthinessTest.rock.out @@ -0,0 +1,4 @@ +this should print since non-empty strings are true +this should print since non-zero numbers are true +this should print since non-zero numbers, including negatives, are true +this should print since function references are objects which are truthy diff --git a/tests/fixtures/constants/constants.rock b/tests/fixtures/constants/constants.rock new file mode 100644 index 0000000..6e6321f --- /dev/null +++ b/tests/fixtures/constants/constants.rock @@ -0,0 +1,5 @@ +my heart is true +say my heart + +my love is false +say my love diff --git a/tests/fixtures/constants/constants.rock.out b/tests/fixtures/constants/constants.rock.out new file mode 100644 index 0000000..da29283 --- /dev/null +++ b/tests/fixtures/constants/constants.rock.out @@ -0,0 +1,2 @@ +true +false diff --git a/tests/fixtures/control-flow/indented_else.rock b/tests/fixtures/control-flow/indented_else.rock new file mode 100644 index 0000000..c42cbac --- /dev/null +++ b/tests/fixtures/control-flow/indented_else.rock @@ -0,0 +1,11 @@ +My dream is a thought +My hope is a dream +While my hope is less than my dream + Knock my dream down + Shout my dream + If my dream is my hope + Shout "No" + + Else + Shout "Yes" + diff --git a/tests/fixtures/control-flow/indented_else.rock.out b/tests/fixtures/control-flow/indented_else.rock.out new file mode 100644 index 0000000..6f44a28 --- /dev/null +++ b/tests/fixtures/control-flow/indented_else.rock.out @@ -0,0 +1,4 @@ +16 +Yes +15 +No diff --git a/tests/fixtures/control-flow/nested_loops.rock b/tests/fixtures/control-flow/nested_loops.rock new file mode 100644 index 0000000..292a537 --- /dev/null +++ b/tests/fixtures/control-flow/nested_loops.rock @@ -0,0 +1,12 @@ +Say "begin" +X is 10 +While X is greater than nothing +Y is 0 +While Y is less than 3 +Build Y up +Say Y + +Knock X down +Say X + +Say "end" diff --git a/tests/fixtures/control-flow/nested_loops.rock.out b/tests/fixtures/control-flow/nested_loops.rock.out new file mode 100644 index 0000000..e167bcc --- /dev/null +++ b/tests/fixtures/control-flow/nested_loops.rock.out @@ -0,0 +1,42 @@ +begin +1 +2 +3 +9 +1 +2 +3 +8 +1 +2 +3 +7 +1 +2 +3 +6 +1 +2 +3 +5 +1 +2 +3 +4 +1 +2 +3 +3 +1 +2 +3 +2 +1 +2 +3 +1 +1 +2 +3 +0 +end diff --git a/tests/fixtures/control-flow/simpleLoops.rock b/tests/fixtures/control-flow/simpleLoops.rock new file mode 100644 index 0000000..78dd33c --- /dev/null +++ b/tests/fixtures/control-flow/simpleLoops.rock @@ -0,0 +1,9 @@ +put 10 into I +while I +say I +knock I down +(end loop) +until I +say I +build I up +(end loop) diff --git a/tests/fixtures/control-flow/simpleLoops.rock.out b/tests/fixtures/control-flow/simpleLoops.rock.out new file mode 100644 index 0000000..30b148d --- /dev/null +++ b/tests/fixtures/control-flow/simpleLoops.rock.out @@ -0,0 +1,11 @@ +10 +9 +8 +7 +6 +5 +4 +3 +2 +1 +0 diff --git a/tests/fixtures/equality/arrays.rock b/tests/fixtures/equality/arrays.rock new file mode 100644 index 0000000..8ade6bb --- /dev/null +++ b/tests/fixtures/equality/arrays.rock @@ -0,0 +1,33 @@ +rock first with 0, 1, 2 +rock second with 3, 4, 5 + +if first ain't second +say "arrays of the same length but different contents are not equal" + +ArrayCopy takes source +rock dest +let i be 0 +let len be source + 0 +while i is less than len +let dest at i be source at i +build i up + +return dest + +let First Copy be ArrayCopy taking first +if First Copy is first +say "element-wise-copied arrays are equal" + +let Second Copy be second +if Second Copy is second +say "assignment-copied arrays are equal" + +rock First Nested with first, second +rock Second Nested with first, second +if First Nested is Second Nested +say "nested arrays with the same contents are equal" + +rock Third Nested with first, second +rock Fourth Nested with second, first +if Third Nested ain't Fourth Nested +say "nested arrays with different contents are not equal" diff --git a/tests/fixtures/equality/arrays.rock.out b/tests/fixtures/equality/arrays.rock.out new file mode 100644 index 0000000..dc46c3c --- /dev/null +++ b/tests/fixtures/equality/arrays.rock.out @@ -0,0 +1,5 @@ +arrays of the same length but different contents are not equal +element-wise-copied arrays are equal +assignment-copied arrays are equal +nested arrays with the same contents are equal +nested arrays with different contents are not equal diff --git a/tests/fixtures/equality/booleans.rock b/tests/fixtures/equality/booleans.rock new file mode 100644 index 0000000..c486c94 --- /dev/null +++ b/tests/fixtures/equality/booleans.rock @@ -0,0 +1,4 @@ +say true is true +say true is false +say false is false +say false is true diff --git a/tests/fixtures/equality/booleans.rock.out b/tests/fixtures/equality/booleans.rock.out new file mode 100644 index 0000000..2cdda45 --- /dev/null +++ b/tests/fixtures/equality/booleans.rock.out @@ -0,0 +1,4 @@ +true +false +true +false diff --git a/tests/fixtures/equality/equalityComparison.rock b/tests/fixtures/equality/equalityComparison.rock new file mode 100644 index 0000000..307d8f8 --- /dev/null +++ b/tests/fixtures/equality/equalityComparison.rock @@ -0,0 +1,142 @@ +say "Checking for mysterious equalities" +say mysterious is mysterious +say mysterious is true +say mysterious is "hello world" +say mysterious is null +say mysterious is 5 +say "" +say "Checking for true v false equalities" +say true is true +say true is false +say false is false +say false is true +say "" +say "Checking for true/number" +say true is 5 +say 5 is true +say 0 is true +say true is 0 +say "" +say "Checking for false/number" +say false is 5 +say 5 is false +say 0 is false +say false is 0 +say "" +say "Checking for nulls" +say 5 is null +say 0 is null +say true is null +say false is null +say null is null +say "" +say "Checking boolean strings" +say true is "true" +say true is "RIGht" +say true is "lies" +say true is "hello" +say "true" is true +say "lies" is true +Say "" +Say "Checking false things" +say false is "false" +say false is "WROng" +say false is "true" +say false is "hello" +say "false" is false +say "true" is false +Say "" +say "Checking numbers" +say 5 is 5 +say 0.26 is 0.26 +say 4 is 3 +say "" +say "Checking number/string" +say "5" is 5 +say 5 is "05.0" +say 5 is "3" +say 5 is "hello" +say "" +say "Checking strings" +say "hello" is "hello" +say "hello" is "world" +say "" +say "Checking negation" +say true is not false +say true isn't false +say true is not true +say true isn't true +say "" + +say "Aliases for is" +say "simple variable" +value is 1 +say value is 1 +value's 2 +say value's 2 +values are 3 +say values are 3 +values're 3 +say values're 3 +value was 5 +say value was 5 +values were 6 +say values were 6 + +say "common variable" +the value is 1 +say the value is 1 +the value's 2 +say the value's 2 +the values are 3 +say the values are 3 +the values're 4 +say the values're 4 +the value was 5 +say the value was 5 +the values were 6 +say the values were 6 + +say "proper variable" +Proper Value is 1 +say Proper VALUE IS 1 +PROPER VALUE'S 2 +say Proper Value's 2 +Proper Values are 3 +say Proper Values are 3 +PROPER VALUES'RE 4 +say Proper Values're 4 +Proper Value was 5 +say Proper Value was 5 +Proper Values were 6 +say Proper Values were 6 + +say "pronoun" +Pronoun Value is 0 +it is 1 +say it is 1 +it's 2 +say it's 2 +they are 3 +say they are 3 +they're 4 +say they're 4 +it was 5 +say it was 5 +they were 6 +say they were 6 + +say "" + +say "Aliases for isn't" +value is 1 +say value isn't 2 +say value isnt 2 +say value ain't 2 +say value aint 2 +say value aren't 2 +say value arent 2 +say value wasn't 2 +say value wasnt 2 +say value weren't 2 +say value werent 2 diff --git a/tests/fixtures/equality/equalityComparison.rock.out b/tests/fixtures/equality/equalityComparison.rock.out new file mode 100644 index 0000000..73c6408 --- /dev/null +++ b/tests/fixtures/equality/equalityComparison.rock.out @@ -0,0 +1,110 @@ +Checking for mysterious equalities +true +false +false +true +false + +Checking for true v false equalities +true +false +true +false + +Checking for true/number +true +true +false +false + +Checking for false/number +false +false +true +true + +Checking for nulls +false +true +false +true +true + +Checking boolean strings +true +true +true +true +true +true + +Checking false things +false +false +false +false +false +false + +Checking numbers +true +true +false + +Checking number/string +true +true +false +false + +Checking strings +true +false + +Checking negation +true +true +false +false + +Aliases for is +simple variable +true +true +true +true +true +true +common variable +true +true +true +true +true +true +proper variable +true +true +true +true +true +true +pronoun +true +true +true +true +true +true + +Aliases for isn't +true +true +true +true +true +true +true +true +true +true diff --git a/tests/fixtures/equality/mysterious.rock b/tests/fixtures/equality/mysterious.rock new file mode 100644 index 0000000..170656d --- /dev/null +++ b/tests/fixtures/equality/mysterious.rock @@ -0,0 +1,5 @@ +say mysterious is mysterious +say mysterious is true +say mysterious is "hello world" +say mysterious is null +say mysterious is 5 diff --git a/tests/fixtures/equality/mysterious.rock.out b/tests/fixtures/equality/mysterious.rock.out new file mode 100644 index 0000000..363db97 --- /dev/null +++ b/tests/fixtures/equality/mysterious.rock.out @@ -0,0 +1,5 @@ +true +false +false +true +false diff --git a/tests/fixtures/equality/negation.rock b/tests/fixtures/equality/negation.rock new file mode 100644 index 0000000..f090617 --- /dev/null +++ b/tests/fixtures/equality/negation.rock @@ -0,0 +1,15 @@ +say true is not false +say true isn't false +say true ain't false +say true aint false +say true isn't not true +say true ain't not true +say not true is not true +say "" +say true is not true +say true isn't true +say true ain't true +say true aint true +say true isn't not false +say true ain't not false +say not true is not false diff --git a/tests/fixtures/equality/negation.rock.out b/tests/fixtures/equality/negation.rock.out new file mode 100644 index 0000000..abd1acf --- /dev/null +++ b/tests/fixtures/equality/negation.rock.out @@ -0,0 +1,15 @@ +true +true +true +true +true +true +true + +false +false +false +false +false +false +false diff --git a/tests/fixtures/equality/nothing.rock b/tests/fixtures/equality/nothing.rock new file mode 100644 index 0000000..c6d55c3 --- /dev/null +++ b/tests/fixtures/equality/nothing.rock @@ -0,0 +1,9 @@ +Say 0 is nothing +Say false is nothing +Say nobody is nothing +Say null is nothing +Say "" is nothing + +Say 1 is nothing +Say true is nothing +Say "hello" is nothing diff --git a/tests/fixtures/equality/nothing.rock.out b/tests/fixtures/equality/nothing.rock.out new file mode 100644 index 0000000..aabb84c --- /dev/null +++ b/tests/fixtures/equality/nothing.rock.out @@ -0,0 +1,8 @@ +true +true +true +true +true +false +false +false diff --git a/tests/fixtures/equality/null.rock b/tests/fixtures/equality/null.rock new file mode 100644 index 0000000..3e6ce2c --- /dev/null +++ b/tests/fixtures/equality/null.rock @@ -0,0 +1,5 @@ +say true is null +say false is null +say null is null +say 0 is null +say 1 is null diff --git a/tests/fixtures/equality/null.rock.out b/tests/fixtures/equality/null.rock.out new file mode 100644 index 0000000..8ef5add --- /dev/null +++ b/tests/fixtures/equality/null.rock.out @@ -0,0 +1,5 @@ +false +true +true +true +false diff --git a/tests/fixtures/equality/numbers.rock b/tests/fixtures/equality/numbers.rock new file mode 100644 index 0000000..2a60652 --- /dev/null +++ b/tests/fixtures/equality/numbers.rock @@ -0,0 +1,17 @@ +say true is 5 +say 5 is true +say 0 is false +say false is 0 +say 0 is null +say 5 is 5 +say 5 is 5.0 +say 0.26 is 0.26 +say "5" is 5 +say 5 is "05.0" +say "" +say true is 0 +say 0 is true +say 1 is false +say false is 1 +say 1 is null +say 5 is 4 diff --git a/tests/fixtures/equality/numbers.rock.out b/tests/fixtures/equality/numbers.rock.out new file mode 100644 index 0000000..e31029f --- /dev/null +++ b/tests/fixtures/equality/numbers.rock.out @@ -0,0 +1,17 @@ +true +true +true +true +true +true +true +true +true +true + +false +false +false +false +false +false diff --git a/tests/fixtures/equality/strings.rock b/tests/fixtures/equality/strings.rock new file mode 100644 index 0000000..2dca845 --- /dev/null +++ b/tests/fixtures/equality/strings.rock @@ -0,0 +1,27 @@ +say "true" is true +say "yes" is true +say "OK" is true +say "" +say true is "true" +say true is "RIGht" +say "yes" is true +say "OK" is true +say false is "false" +say false is "WROng" +say "lies" is false +say "" +say true is "hello" +say "true" is true +say "" +say 5 is "3" +say 5 is "hello" +say "" +say true is "lies" +say "lies" is true +say false is "true" +say false is "hello" +say "false" is false +say "true" is false +say "" +say "hello" is "hello" +say "hello" is "world" diff --git a/tests/fixtures/equality/strings.rock.out b/tests/fixtures/equality/strings.rock.out new file mode 100644 index 0000000..8283a82 --- /dev/null +++ b/tests/fixtures/equality/strings.rock.out @@ -0,0 +1,27 @@ +true +true +true + +true +true +true +true +false +false +false + +true +true + +false +false + +true +true +false +false +false +false + +true +false diff --git a/tests/fixtures/examples/99_beers.rock b/tests/fixtures/examples/99_beers.rock new file mode 100644 index 0000000..12a0cf7 --- /dev/null +++ b/tests/fixtures/examples/99_beers.rock @@ -0,0 +1,11 @@ +Love is " bottles of beer on the wall" +Problems are " bottles of beer" +Carol says Take one down, pass it around +The beers were numbering fa'too'many +While the beers ain't nothing +Shout it with Love +Shout it with Problems +Say Carol, +Knock the beers down +Say it with Love + diff --git a/tests/fixtures/examples/99_beers.rock.out b/tests/fixtures/examples/99_beers.rock.out new file mode 100644 index 0000000..209f242 --- /dev/null +++ b/tests/fixtures/examples/99_beers.rock.out @@ -0,0 +1,396 @@ +99 bottles of beer on the wall +99 bottles of beer +Take one down, pass it around +98 bottles of beer on the wall +98 bottles of beer on the wall +98 bottles of beer +Take one down, pass it around +97 bottles of beer on the wall +97 bottles of beer on the wall +97 bottles of beer +Take one down, pass it around +96 bottles of beer on the wall +96 bottles of beer on the wall +96 bottles of beer +Take one down, pass it around +95 bottles of beer on the wall +95 bottles of beer on the wall +95 bottles of beer +Take one down, pass it around +94 bottles of beer on the wall +94 bottles of beer on the wall +94 bottles of beer +Take one down, pass it around +93 bottles of beer on the wall +93 bottles of beer on the wall +93 bottles of beer +Take one down, pass it around +92 bottles of beer on the wall +92 bottles of beer on the wall +92 bottles of beer +Take one down, pass it around +91 bottles of beer on the wall +91 bottles of beer on the wall +91 bottles of beer +Take one down, pass it around +90 bottles of beer on the wall +90 bottles of beer on the wall +90 bottles of beer +Take one down, pass it around +89 bottles of beer on the wall +89 bottles of beer on the wall +89 bottles of beer +Take one down, pass it around +88 bottles of beer on the wall +88 bottles of beer on the wall +88 bottles of beer +Take one down, pass it around +87 bottles of beer on the wall +87 bottles of beer on the wall +87 bottles of beer +Take one down, pass it around +86 bottles of beer on the wall +86 bottles of beer on the wall +86 bottles of beer +Take one down, pass it around +85 bottles of beer on the wall +85 bottles of beer on the wall +85 bottles of beer +Take one down, pass it around +84 bottles of beer on the wall +84 bottles of beer on the wall +84 bottles of beer +Take one down, pass it around +83 bottles of beer on the wall +83 bottles of beer on the wall +83 bottles of beer +Take one down, pass it around +82 bottles of beer on the wall +82 bottles of beer on the wall +82 bottles of beer +Take one down, pass it around +81 bottles of beer on the wall +81 bottles of beer on the wall +81 bottles of beer +Take one down, pass it around +80 bottles of beer on the wall +80 bottles of beer on the wall +80 bottles of beer +Take one down, pass it around +79 bottles of beer on the wall +79 bottles of beer on the wall +79 bottles of beer +Take one down, pass it around +78 bottles of beer on the wall +78 bottles of beer on the wall +78 bottles of beer +Take one down, pass it around +77 bottles of beer on the wall +77 bottles of beer on the wall +77 bottles of beer +Take one down, pass it around +76 bottles of beer on the wall +76 bottles of beer on the wall +76 bottles of beer +Take one down, pass it around +75 bottles of beer on the wall +75 bottles of beer on the wall +75 bottles of beer +Take one down, pass it around +74 bottles of beer on the wall +74 bottles of beer on the wall +74 bottles of beer +Take one down, pass it around +73 bottles of beer on the wall +73 bottles of beer on the wall +73 bottles of beer +Take one down, pass it around +72 bottles of beer on the wall +72 bottles of beer on the wall +72 bottles of beer +Take one down, pass it around +71 bottles of beer on the wall +71 bottles of beer on the wall +71 bottles of beer +Take one down, pass it around +70 bottles of beer on the wall +70 bottles of beer on the wall +70 bottles of beer +Take one down, pass it around +69 bottles of beer on the wall +69 bottles of beer on the wall +69 bottles of beer +Take one down, pass it around +68 bottles of beer on the wall +68 bottles of beer on the wall +68 bottles of beer +Take one down, pass it around +67 bottles of beer on the wall +67 bottles of beer on the wall +67 bottles of beer +Take one down, pass it around +66 bottles of beer on the wall +66 bottles of beer on the wall +66 bottles of beer +Take one down, pass it around +65 bottles of beer on the wall +65 bottles of beer on the wall +65 bottles of beer +Take one down, pass it around +64 bottles of beer on the wall +64 bottles of beer on the wall +64 bottles of beer +Take one down, pass it around +63 bottles of beer on the wall +63 bottles of beer on the wall +63 bottles of beer +Take one down, pass it around +62 bottles of beer on the wall +62 bottles of beer on the wall +62 bottles of beer +Take one down, pass it around +61 bottles of beer on the wall +61 bottles of beer on the wall +61 bottles of beer +Take one down, pass it around +60 bottles of beer on the wall +60 bottles of beer on the wall +60 bottles of beer +Take one down, pass it around +59 bottles of beer on the wall +59 bottles of beer on the wall +59 bottles of beer +Take one down, pass it around +58 bottles of beer on the wall +58 bottles of beer on the wall +58 bottles of beer +Take one down, pass it around +57 bottles of beer on the wall +57 bottles of beer on the wall +57 bottles of beer +Take one down, pass it around +56 bottles of beer on the wall +56 bottles of beer on the wall +56 bottles of beer +Take one down, pass it around +55 bottles of beer on the wall +55 bottles of beer on the wall +55 bottles of beer +Take one down, pass it around +54 bottles of beer on the wall +54 bottles of beer on the wall +54 bottles of beer +Take one down, pass it around +53 bottles of beer on the wall +53 bottles of beer on the wall +53 bottles of beer +Take one down, pass it around +52 bottles of beer on the wall +52 bottles of beer on the wall +52 bottles of beer +Take one down, pass it around +51 bottles of beer on the wall +51 bottles of beer on the wall +51 bottles of beer +Take one down, pass it around +50 bottles of beer on the wall +50 bottles of beer on the wall +50 bottles of beer +Take one down, pass it around +49 bottles of beer on the wall +49 bottles of beer on the wall +49 bottles of beer +Take one down, pass it around +48 bottles of beer on the wall +48 bottles of beer on the wall +48 bottles of beer +Take one down, pass it around +47 bottles of beer on the wall +47 bottles of beer on the wall +47 bottles of beer +Take one down, pass it around +46 bottles of beer on the wall +46 bottles of beer on the wall +46 bottles of beer +Take one down, pass it around +45 bottles of beer on the wall +45 bottles of beer on the wall +45 bottles of beer +Take one down, pass it around +44 bottles of beer on the wall +44 bottles of beer on the wall +44 bottles of beer +Take one down, pass it around +43 bottles of beer on the wall +43 bottles of beer on the wall +43 bottles of beer +Take one down, pass it around +42 bottles of beer on the wall +42 bottles of beer on the wall +42 bottles of beer +Take one down, pass it around +41 bottles of beer on the wall +41 bottles of beer on the wall +41 bottles of beer +Take one down, pass it around +40 bottles of beer on the wall +40 bottles of beer on the wall +40 bottles of beer +Take one down, pass it around +39 bottles of beer on the wall +39 bottles of beer on the wall +39 bottles of beer +Take one down, pass it around +38 bottles of beer on the wall +38 bottles of beer on the wall +38 bottles of beer +Take one down, pass it around +37 bottles of beer on the wall +37 bottles of beer on the wall +37 bottles of beer +Take one down, pass it around +36 bottles of beer on the wall +36 bottles of beer on the wall +36 bottles of beer +Take one down, pass it around +35 bottles of beer on the wall +35 bottles of beer on the wall +35 bottles of beer +Take one down, pass it around +34 bottles of beer on the wall +34 bottles of beer on the wall +34 bottles of beer +Take one down, pass it around +33 bottles of beer on the wall +33 bottles of beer on the wall +33 bottles of beer +Take one down, pass it around +32 bottles of beer on the wall +32 bottles of beer on the wall +32 bottles of beer +Take one down, pass it around +31 bottles of beer on the wall +31 bottles of beer on the wall +31 bottles of beer +Take one down, pass it around +30 bottles of beer on the wall +30 bottles of beer on the wall +30 bottles of beer +Take one down, pass it around +29 bottles of beer on the wall +29 bottles of beer on the wall +29 bottles of beer +Take one down, pass it around +28 bottles of beer on the wall +28 bottles of beer on the wall +28 bottles of beer +Take one down, pass it around +27 bottles of beer on the wall +27 bottles of beer on the wall +27 bottles of beer +Take one down, pass it around +26 bottles of beer on the wall +26 bottles of beer on the wall +26 bottles of beer +Take one down, pass it around +25 bottles of beer on the wall +25 bottles of beer on the wall +25 bottles of beer +Take one down, pass it around +24 bottles of beer on the wall +24 bottles of beer on the wall +24 bottles of beer +Take one down, pass it around +23 bottles of beer on the wall +23 bottles of beer on the wall +23 bottles of beer +Take one down, pass it around +22 bottles of beer on the wall +22 bottles of beer on the wall +22 bottles of beer +Take one down, pass it around +21 bottles of beer on the wall +21 bottles of beer on the wall +21 bottles of beer +Take one down, pass it around +20 bottles of beer on the wall +20 bottles of beer on the wall +20 bottles of beer +Take one down, pass it around +19 bottles of beer on the wall +19 bottles of beer on the wall +19 bottles of beer +Take one down, pass it around +18 bottles of beer on the wall +18 bottles of beer on the wall +18 bottles of beer +Take one down, pass it around +17 bottles of beer on the wall +17 bottles of beer on the wall +17 bottles of beer +Take one down, pass it around +16 bottles of beer on the wall +16 bottles of beer on the wall +16 bottles of beer +Take one down, pass it around +15 bottles of beer on the wall +15 bottles of beer on the wall +15 bottles of beer +Take one down, pass it around +14 bottles of beer on the wall +14 bottles of beer on the wall +14 bottles of beer +Take one down, pass it around +13 bottles of beer on the wall +13 bottles of beer on the wall +13 bottles of beer +Take one down, pass it around +12 bottles of beer on the wall +12 bottles of beer on the wall +12 bottles of beer +Take one down, pass it around +11 bottles of beer on the wall +11 bottles of beer on the wall +11 bottles of beer +Take one down, pass it around +10 bottles of beer on the wall +10 bottles of beer on the wall +10 bottles of beer +Take one down, pass it around +9 bottles of beer on the wall +9 bottles of beer on the wall +9 bottles of beer +Take one down, pass it around +8 bottles of beer on the wall +8 bottles of beer on the wall +8 bottles of beer +Take one down, pass it around +7 bottles of beer on the wall +7 bottles of beer on the wall +7 bottles of beer +Take one down, pass it around +6 bottles of beer on the wall +6 bottles of beer on the wall +6 bottles of beer +Take one down, pass it around +5 bottles of beer on the wall +5 bottles of beer on the wall +5 bottles of beer +Take one down, pass it around +4 bottles of beer on the wall +4 bottles of beer on the wall +4 bottles of beer +Take one down, pass it around +3 bottles of beer on the wall +3 bottles of beer on the wall +3 bottles of beer +Take one down, pass it around +2 bottles of beer on the wall +2 bottles of beer on the wall +2 bottles of beer +Take one down, pass it around +1 bottles of beer on the wall +1 bottles of beer on the wall +1 bottles of beer +Take one down, pass it around +0 bottles of beer on the wall diff --git a/tests/fixtures/examples/factorial.rock b/tests/fixtures/examples/factorial.rock new file mode 100644 index 0000000..c319f82 --- /dev/null +++ b/tests/fixtures/examples/factorial.rock @@ -0,0 +1,11 @@ +Factorial takes X +if X is nothing +Give back 1 +else +put X minus 1 into NewX +Give back X times Factorial taking NewX +(end if) +(end func) +say Factorial taking 4 +say Factorial taking 10 + diff --git a/tests/fixtures/examples/factorial.rock.out b/tests/fixtures/examples/factorial.rock.out new file mode 100644 index 0000000..e4c331d --- /dev/null +++ b/tests/fixtures/examples/factorial.rock.out @@ -0,0 +1,2 @@ +24 +3628800 diff --git a/tests/fixtures/examples/fibonacci.rock b/tests/fixtures/examples/fibonacci.rock new file mode 100644 index 0000000..3194f67 --- /dev/null +++ b/tests/fixtures/examples/fibonacci.rock @@ -0,0 +1,9 @@ +Fib takes N +if N is smaller than 2 +give back N +(end if) +put N without 1 into OneBefore +put N without 2 into TwoBefore +give back Fib taking OneBefore plus Fib taking TwoBefore +(end fib) +say Fib taking 10 diff --git a/tests/fixtures/examples/fibonacci.rock.out b/tests/fixtures/examples/fibonacci.rock.out new file mode 100644 index 0000000..c3f407c --- /dev/null +++ b/tests/fixtures/examples/fibonacci.rock.out @@ -0,0 +1 @@ +55 diff --git a/tests/fixtures/examples/fizzbuzz-idiomatic.rock b/tests/fixtures/examples/fizzbuzz-idiomatic.rock new file mode 100644 index 0000000..fa48848 --- /dev/null +++ b/tests/fixtures/examples/fizzbuzz-idiomatic.rock @@ -0,0 +1,27 @@ +Midnight takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart + +Give back your heart + + +Desire is a lovestruck ladykiller +My world is nothing +Fire is ice +Hate is water +Until my world is Desire, +Build my world up +If Midnight taking my world, Fire is nothing and Midnight taking my world, Hate is nothing +Shout "FizzBuzz!" +Take it to the top + +If Midnight taking my world, Fire is nothing +Shout "Fizz!" +Take it to the top + +If Midnight taking my world, Hate is nothing +Say "Buzz!" +Take it to the top + +Whisper my world + diff --git a/tests/fixtures/examples/fizzbuzz-idiomatic.rock.out b/tests/fixtures/examples/fizzbuzz-idiomatic.rock.out new file mode 100644 index 0000000..0b645ed --- /dev/null +++ b/tests/fixtures/examples/fizzbuzz-idiomatic.rock.out @@ -0,0 +1,100 @@ +1 +2 +Fizz! +4 +Buzz! +Fizz! +7 +8 +Fizz! +Buzz! +11 +Fizz! +13 +14 +FizzBuzz! +16 +17 +Fizz! +19 +Buzz! +Fizz! +22 +23 +Fizz! +Buzz! +26 +Fizz! +28 +29 +FizzBuzz! +31 +32 +Fizz! +34 +Buzz! +Fizz! +37 +38 +Fizz! +Buzz! +41 +Fizz! +43 +44 +FizzBuzz! +46 +47 +Fizz! +49 +Buzz! +Fizz! +52 +53 +Fizz! +Buzz! +56 +Fizz! +58 +59 +FizzBuzz! +61 +62 +Fizz! +64 +Buzz! +Fizz! +67 +68 +Fizz! +Buzz! +71 +Fizz! +73 +74 +FizzBuzz! +76 +77 +Fizz! +79 +Buzz! +Fizz! +82 +83 +Fizz! +Buzz! +86 +Fizz! +88 +89 +FizzBuzz! +91 +92 +Fizz! +94 +Buzz! +Fizz! +97 +98 +Fizz! +Buzz! diff --git a/tests/fixtures/examples/fizzbuzz-minimalist.rock b/tests/fixtures/examples/fizzbuzz-minimalist.rock new file mode 100644 index 0000000..f443069 --- /dev/null +++ b/tests/fixtures/examples/fizzbuzz-minimalist.rock @@ -0,0 +1,26 @@ +Modulus takes Number and Divisor +While Number is as high as Divisor +Put Number minus Divisor into Number + (blank line ending While block) +Give back Number + (blank line ending function declaration) +Limit is 100 +Counter is 0 +Fizz is 3 +Buzz is 5 +Until Counter is Limit +Build Counter up +If Modulus taking Counter, Fizz is 0 and Modulus taking Counter, Buzz is 0 +Say "FizzBuzz!" +Continue + (blank line ending 'If' Block) +If Modulus taking Counter & Fizz is 0 +Say "Fizz!" +Continue + (blank line ending 'If' Block) +If Modulus taking Counter & Buzz is 0 +Say "Buzz!" +Continue + (blank line ending 'If' Block) +Say Counter + (EOL ending Until block) diff --git a/tests/fixtures/examples/fizzbuzz-minimalist.rock.out b/tests/fixtures/examples/fizzbuzz-minimalist.rock.out new file mode 100644 index 0000000..0b645ed --- /dev/null +++ b/tests/fixtures/examples/fizzbuzz-minimalist.rock.out @@ -0,0 +1,100 @@ +1 +2 +Fizz! +4 +Buzz! +Fizz! +7 +8 +Fizz! +Buzz! +11 +Fizz! +13 +14 +FizzBuzz! +16 +17 +Fizz! +19 +Buzz! +Fizz! +22 +23 +Fizz! +Buzz! +26 +Fizz! +28 +29 +FizzBuzz! +31 +32 +Fizz! +34 +Buzz! +Fizz! +37 +38 +Fizz! +Buzz! +41 +Fizz! +43 +44 +FizzBuzz! +46 +47 +Fizz! +49 +Buzz! +Fizz! +52 +53 +Fizz! +Buzz! +56 +Fizz! +58 +59 +FizzBuzz! +61 +62 +Fizz! +64 +Buzz! +Fizz! +67 +68 +Fizz! +Buzz! +71 +Fizz! +73 +74 +FizzBuzz! +76 +77 +Fizz! +79 +Buzz! +Fizz! +82 +83 +Fizz! +Buzz! +86 +Fizz! +88 +89 +FizzBuzz! +91 +92 +Fizz! +94 +Buzz! +Fizz! +97 +98 +Fizz! +Buzz! diff --git a/tests/fixtures/examples/hello-world.rock b/tests/fixtures/examples/hello-world.rock new file mode 100644 index 0000000..0da43f3 --- /dev/null +++ b/tests/fixtures/examples/hello-world.rock @@ -0,0 +1,31 @@ +Eternity takes the pain. +The prize is silence +Until the pain is nothing, +Roll the pain into violence, +Cast violence into your lies, +Let the prize be with your lies. + +Give back the prize + +The night is calling me +Rock the night like a colourcast tranquility +The dawn is a spellbound moonbeam +Rock the night with the dawn, the dawn, +Your fire is a neverending aftereffect +Rock the night with your fire + +The spirit is electric thunder +Rock the spirit with your fire +Rock the spirit like a thunderbolt fist +Rock the spirit with the dawn +Rock the spirit like a chamaeleon stormcloud + +Let fear be eternity taking the night +Let hope be eternity taking the spirit + +Time is all up +Cast it into the void +Let fear be with the void +Let fear be with hope + +Shout fear diff --git a/tests/fixtures/examples/hello-world.rock.out b/tests/fixtures/examples/hello-world.rock.out new file mode 100644 index 0000000..557db03 --- /dev/null +++ b/tests/fixtures/examples/hello-world.rock.out @@ -0,0 +1 @@ +Hello World diff --git a/tests/fixtures/functions/aliases_for_takes.rock b/tests/fixtures/functions/aliases_for_takes.rock new file mode 100644 index 0000000..897e6b8 --- /dev/null +++ b/tests/fixtures/functions/aliases_for_takes.rock @@ -0,0 +1,15 @@ +Polly wants a cracker +Cheese is delicious +Put a cracker with cheese in your mouth +Give it back + +Shout Polly taking 100 + +Mama wants a word +A kiss says more +Put a word with a kiss into a letter +Send it back + +A child says never +Put mama taking a child into the wild +Shout the wild diff --git a/tests/fixtures/functions/aliases_for_takes.rock.out b/tests/fixtures/functions/aliases_for_takes.rock.out new file mode 100644 index 0000000..9ebb625 --- /dev/null +++ b/tests/fixtures/functions/aliases_for_takes.rock.out @@ -0,0 +1,2 @@ +109 +nevermore diff --git a/tests/fixtures/functions/array_arguments.rock b/tests/fixtures/functions/array_arguments.rock new file mode 100644 index 0000000..f8c1f2f --- /dev/null +++ b/tests/fixtures/functions/array_arguments.rock @@ -0,0 +1,13 @@ +the function takes array +shout "The parameters that were passed:" +shout array at 0 +shout array at 1 +shout array + +let param at 0 be 3 +let param at 1 be 4 +shout "The parameters to be passed:" +shout param at 0 +shout param at 1 +shout param +the function taking param diff --git a/tests/fixtures/functions/array_arguments.rock.out b/tests/fixtures/functions/array_arguments.rock.out new file mode 100644 index 0000000..3d79bec --- /dev/null +++ b/tests/fixtures/functions/array_arguments.rock.out @@ -0,0 +1,8 @@ +The parameters to be passed: +3 +4 +2 +The parameters that were passed: +3 +4 +2 diff --git a/tests/fixtures/functions/functionCalls.rock b/tests/fixtures/functions/functionCalls.rock new file mode 100644 index 0000000..e631a45 --- /dev/null +++ b/tests/fixtures/functions/functionCalls.rock @@ -0,0 +1,30 @@ +Say "functions" +Adder takes X, and Y +say X plus Y +(end function) + +Adder taking 1, 2 + +Subtractor takes X, Y +say X minus Y +(end function) + +Subtractor taking 2, 1 + +Multiplier takes X & Y +say X times Y +(end function) + +Multiplier taking 2 & 3 + +Divisor takes X'n'Y +say X over Y +(end function) + +Divisor taking 4'n'2 + +ThreeMultiplier takes X, Y, and Z +say X times Y times Z +(end function) + +ThreeMultiplier taking 2, 3, and 4 diff --git a/tests/fixtures/functions/functionCalls.rock.out b/tests/fixtures/functions/functionCalls.rock.out new file mode 100644 index 0000000..2961ec1 --- /dev/null +++ b/tests/fixtures/functions/functionCalls.rock.out @@ -0,0 +1,6 @@ +functions +3 +1 +6 +2 +24 diff --git a/tests/fixtures/functions/nested_function_scopes.rock b/tests/fixtures/functions/nested_function_scopes.rock new file mode 100644 index 0000000..e9961b5 --- /dev/null +++ b/tests/fixtures/functions/nested_function_scopes.rock @@ -0,0 +1,14 @@ +OuterFunction takes X and Y +SameNameFunction takes X +Give back X with "NESTED" + +Put SameNameFunction taking X into ResultX +Put SameNameFunction taking Y into ResultY +Put ResultX with ResultY into ResultXY +Give back ResultXY + +SameNameFunction takes X +Give back X with "GLOBAL" + +Shout OuterFunction taking "foo", "bar" (should print "fooNESTEDbarNESTED") +Shout SameNameFunction taking "foo" (should print "fooGLOBAL") diff --git a/tests/fixtures/functions/nested_function_scopes.rock.out b/tests/fixtures/functions/nested_function_scopes.rock.out new file mode 100644 index 0000000..97b19b9 --- /dev/null +++ b/tests/fixtures/functions/nested_function_scopes.rock.out @@ -0,0 +1,2 @@ +fooNESTEDbarNESTED +fooGLOBAL diff --git a/tests/fixtures/functions/nested_functions.rock b/tests/fixtures/functions/nested_functions.rock new file mode 100644 index 0000000..447f19f --- /dev/null +++ b/tests/fixtures/functions/nested_functions.rock @@ -0,0 +1,16 @@ +OuterFunction takes X, Y, and Z +InnerFunction takes X +Give back X with X + +Put InnerFunction taking X into ResultX +Put InnerFunction taking Y into ResultY +Put InnerFunction taking Z into ResultZ +Put ResultX with ResultY with ResultZ into ResultXYZ +Give back ResultXYZ + +Put OuterFunction taking "foo", "bar", and "baz" into Result +Shout Result (should print "foofoobarbarbazbaz") + +Put OuterFunction taking 1, 2, and 3 into Result +Shout Result (should print 12 = 1+1+2+2+3+3) + diff --git a/tests/fixtures/functions/nested_functions.rock.out b/tests/fixtures/functions/nested_functions.rock.out new file mode 100644 index 0000000..5f7f0c8 --- /dev/null +++ b/tests/fixtures/functions/nested_functions.rock.out @@ -0,0 +1,2 @@ +foofoobarbarbazbaz +12 diff --git a/tests/fixtures/functions/recursion.rock b/tests/fixtures/functions/recursion.rock new file mode 100644 index 0000000..4a80092 --- /dev/null +++ b/tests/fixtures/functions/recursion.rock @@ -0,0 +1,8 @@ +Decrement takes X +If X is nothing +Give back X +Else +Put X minus 1 into NewX +Give back Decrement taking NewX + +Say Decrement taking 5 diff --git a/tests/fixtures/functions/recursion.rock.out b/tests/fixtures/functions/recursion.rock.out new file mode 100644 index 0000000..573541a --- /dev/null +++ b/tests/fixtures/functions/recursion.rock.out @@ -0,0 +1 @@ +0 diff --git a/tests/fixtures/functions/simpleFunctions.rock b/tests/fixtures/functions/simpleFunctions.rock new file mode 100644 index 0000000..2662166 --- /dev/null +++ b/tests/fixtures/functions/simpleFunctions.rock @@ -0,0 +1,24 @@ +Echo takes X +say X +(end function) +Echo taking true +Echo taking "hello world" +put 5 into Temp +Echo taking Temp + +AddAndPrint takes X, and Y +put X plus Y into Value +say Value +Give back Value +(end function) +say AddAndPrint taking 3, 4 + +AddOrSub takes X, and B +if B +Give Back X plus 1 +(end if) +say "else" +Give Back X minus 1 +(end function) +say AddOrSub taking 4, true +say AddOrSub taking 4, false diff --git a/tests/fixtures/functions/simpleFunctions.rock.out b/tests/fixtures/functions/simpleFunctions.rock.out new file mode 100644 index 0000000..0889a2f --- /dev/null +++ b/tests/fixtures/functions/simpleFunctions.rock.out @@ -0,0 +1,8 @@ +true +hello world +5 +7 +7 +5 +else +3 diff --git a/tests/fixtures/io/hello_number.rock b/tests/fixtures/io/hello_number.rock new file mode 100644 index 0000000..9ae772e --- /dev/null +++ b/tests/fixtures/io/hello_number.rock @@ -0,0 +1,5 @@ +say -123.45 +say -1 +say 0 +say 1 +say 123.45 diff --git a/tests/fixtures/io/hello_number.rock.out b/tests/fixtures/io/hello_number.rock.out new file mode 100644 index 0000000..8711c22 --- /dev/null +++ b/tests/fixtures/io/hello_number.rock.out @@ -0,0 +1,5 @@ +-123.45 +-1 +0 +1 +123.45 diff --git a/tests/fixtures/io/hello_world.rock b/tests/fixtures/io/hello_world.rock new file mode 100644 index 0000000..a99b73b --- /dev/null +++ b/tests/fixtures/io/hello_world.rock @@ -0,0 +1,3 @@ +Say "hello world" +Say "Hello World" +SAY "HELLO WORLD" diff --git a/tests/fixtures/io/hello_world.rock.out b/tests/fixtures/io/hello_world.rock.out new file mode 100644 index 0000000..0a35266 --- /dev/null +++ b/tests/fixtures/io/hello_world.rock.out @@ -0,0 +1,3 @@ +hello world +Hello World +HELLO WORLD diff --git a/tests/fixtures/io/inputTest.rock b/tests/fixtures/io/inputTest.rock new file mode 100644 index 0000000..23f5814 --- /dev/null +++ b/tests/fixtures/io/inputTest.rock @@ -0,0 +1,8 @@ +("listen to" stores a line of input into a variable and "listen" reads a line of input without storing it) + +listen to my heartbeat +whisper my heartbeat +listen +listen +listen to the wind +shout the wind diff --git a/tests/fixtures/io/inputTest.rock.in b/tests/fixtures/io/inputTest.rock.in new file mode 100644 index 0000000..134920b --- /dev/null +++ b/tests/fixtures/io/inputTest.rock.in @@ -0,0 +1,5 @@ +first line +skip +skip +second line +extra diff --git a/tests/fixtures/io/inputTest.rock.out b/tests/fixtures/io/inputTest.rock.out new file mode 100644 index 0000000..06fcdd7 --- /dev/null +++ b/tests/fixtures/io/inputTest.rock.out @@ -0,0 +1,2 @@ +first line +second line diff --git a/tests/fixtures/io/inputTest2.rock b/tests/fixtures/io/inputTest2.rock new file mode 100644 index 0000000..b9cdd92 --- /dev/null +++ b/tests/fixtures/io/inputTest2.rock @@ -0,0 +1,4 @@ +(nothing breaks when extra lines of input are provided) + +listen to my heartbeat +whisper my heartbeat diff --git a/tests/fixtures/io/inputTest2.rock.in b/tests/fixtures/io/inputTest2.rock.in new file mode 100644 index 0000000..9da2670 --- /dev/null +++ b/tests/fixtures/io/inputTest2.rock.in @@ -0,0 +1,4 @@ +first line +second line +third line +many many lines diff --git a/tests/fixtures/io/inputTest2.rock.out b/tests/fixtures/io/inputTest2.rock.out new file mode 100644 index 0000000..08fe272 --- /dev/null +++ b/tests/fixtures/io/inputTest2.rock.out @@ -0,0 +1 @@ +first line diff --git a/tests/fixtures/literals/literalAliases.rock b/tests/fixtures/literals/literalAliases.rock new file mode 100644 index 0000000..c79faa6 --- /dev/null +++ b/tests/fixtures/literals/literalAliases.rock @@ -0,0 +1,23 @@ +(all aliases for literals work) +say mysterious +say "aliases for null" +say null +say nothing +say nowhere +say nobody +say gone + +say "aliases for empty string" +say empty + +say "aliases for true" +say true +say right +say yes +say ok + +say "aliases for false" +say false +say wrong +say no +say lies diff --git a/tests/fixtures/literals/literalAliases.rock.out b/tests/fixtures/literals/literalAliases.rock.out new file mode 100644 index 0000000..7ec2294 --- /dev/null +++ b/tests/fixtures/literals/literalAliases.rock.out @@ -0,0 +1,19 @@ +mysterious +aliases for null +null +null +null +null +null +aliases for empty string + +aliases for true +true +true +true +true +aliases for false +false +false +false +false diff --git a/tests/fixtures/literals/literalstrings.rock b/tests/fixtures/literals/literalstrings.rock new file mode 100644 index 0000000..9bcc18f --- /dev/null +++ b/tests/fixtures/literals/literalstrings.rock @@ -0,0 +1,2 @@ +Shout "What is not denied is permitted!" +Shout "This ain't not allowed!" diff --git a/tests/fixtures/literals/literalstrings.rock.out b/tests/fixtures/literals/literalstrings.rock.out new file mode 100644 index 0000000..3ab630a --- /dev/null +++ b/tests/fixtures/literals/literalstrings.rock.out @@ -0,0 +1,2 @@ +What is not denied is permitted! +This ain't not allowed! diff --git a/tests/fixtures/literals/poeticLiterals.rock b/tests/fixtures/literals/poeticLiterals.rock new file mode 100644 index 0000000..2a9ddcc --- /dev/null +++ b/tests/fixtures/literals/poeticLiterals.rock @@ -0,0 +1,44 @@ +(poetic assignments to booleans, null, mysterious, number literals, and string literals all work) +my heart is true +say my heart + +your word is lies +say your word + +Tommy is mysterious +say Tommy + +the money is gone +say the money + +the total is 100 +say the total + +the password is "open sesame" +say the password + +the facts are right +say the facts + +the answers are nowhere +say the answers + +say "case sensitivity" + +variable is 1 +say variable +Variable Is 2 +say variable +variable iS 3 +say variable +VARIABLE IS 4 +say variable + +variables are 1 +say variables +Variables Are 2 +say variables +variables aRe 3 +say variables +VARIABLES ARE 4 +say variables diff --git a/tests/fixtures/literals/poeticLiterals.rock.out b/tests/fixtures/literals/poeticLiterals.rock.out new file mode 100644 index 0000000..f402a8b --- /dev/null +++ b/tests/fixtures/literals/poeticLiterals.rock.out @@ -0,0 +1,17 @@ +true +false +mysterious +null +100 +open sesame +true +null +case sensitivity +1 +2 +3 +4 +1 +2 +3 +4 diff --git a/tests/fixtures/literals/poeticNumbers.rock b/tests/fixtures/literals/poeticNumbers.rock new file mode 100644 index 0000000..f3392c1 --- /dev/null +++ b/tests/fixtures/literals/poeticNumbers.rock @@ -0,0 +1,20 @@ +Tommy was a lovestruck ladykiller +say Tommy + +Sweet Lucy was a dancer +say Sweet Lucy + +A killer is on the loose +whisper a killer + +My dreams were ice. A life unfulfilled; wakin' everybody up, taking booze and pills +shout My dreams + +Sweet Lucy's a danger to society +say Sweet Lucy + +my number is a 57 + true 43 +say my number + +The streets are lonely +say the streets diff --git a/tests/fixtures/literals/poeticNumbers.rock.out b/tests/fixtures/literals/poeticNumbers.rock.out new file mode 100644 index 0000000..29cf4c1 --- /dev/null +++ b/tests/fixtures/literals/poeticNumbers.rock.out @@ -0,0 +1,7 @@ +100 +16 +235 +3.1415926535 +1627 +14 +6 diff --git a/tests/fixtures/math/operator_aliases.rock b/tests/fixtures/math/operator_aliases.rock new file mode 100644 index 0000000..3484b26 --- /dev/null +++ b/tests/fixtures/math/operator_aliases.rock @@ -0,0 +1,16 @@ +say "addition" +say 2 plus 2 +say 2 with 2 + +say "subtraction" +say 5 minus 3 +say 5 without 3 + +say "multiplication" +say 5 times 5 +say 5 of 5 + +say "division" +say 4 over 2 + + diff --git a/tests/fixtures/math/operator_aliases.rock.out b/tests/fixtures/math/operator_aliases.rock.out new file mode 100644 index 0000000..1ba866f --- /dev/null +++ b/tests/fixtures/math/operator_aliases.rock.out @@ -0,0 +1,11 @@ +addition +4 +4 +subtraction +2 +2 +multiplication +25 +25 +division +2 diff --git a/tests/fixtures/math/operator_precedence.rock b/tests/fixtures/math/operator_precedence.rock new file mode 100644 index 0000000..dc3e056 --- /dev/null +++ b/tests/fixtures/math/operator_precedence.rock @@ -0,0 +1,6 @@ +say 1 + 1 * 2 (= 3) +say 1 * 2 + 1 (= 5) +say 1 / 2 * 3 + 4 +say 5-2*3 +say 2*3 - 5 + diff --git a/tests/fixtures/math/operator_precedence.rock.out b/tests/fixtures/math/operator_precedence.rock.out new file mode 100644 index 0000000..ece5c43 --- /dev/null +++ b/tests/fixtures/math/operator_precedence.rock.out @@ -0,0 +1,5 @@ +3 +3 +5.5 +-1 +1 diff --git a/tests/fixtures/math/operators.rock b/tests/fixtures/math/operators.rock new file mode 100644 index 0000000..b0fa20c --- /dev/null +++ b/tests/fixtures/math/operators.rock @@ -0,0 +1,14 @@ +say "addition" +say 1 + 1 +say 5 + 10 +say 2.5 + 2.5 +say 1 + 0.2 + 0.03 +say "subtraction" +say 2 - 1 +say 0 - 1 +say 1 - 0.5 +say "multiplication" +say 1 * 0 +say 1 * 1 +say 1 * 2 +say 2 * 2 diff --git a/tests/fixtures/math/operators.rock.out b/tests/fixtures/math/operators.rock.out new file mode 100644 index 0000000..cf4d152 --- /dev/null +++ b/tests/fixtures/math/operators.rock.out @@ -0,0 +1,14 @@ +addition +2 +15 +5 +1.23 +subtraction +1 +-1 +0.5 +multiplication +0 +1 +2 +4 diff --git a/tests/fixtures/math/rounding.rock b/tests/fixtures/math/rounding.rock new file mode 100644 index 0000000..fe3a778 --- /dev/null +++ b/tests/fixtures/math/rounding.rock @@ -0,0 +1,32 @@ +The radio is 1.1 +Turn down the radio +Shout the radio + +The radio is 1.1 +Turn the radio down +Shout the radio + +The radio is 1.1 +Turn up the radio +Shout the radio + +The radio is 1.1 +Turn the radio up +Shout the radio + +The radio is 1.1 +Turn the radio around +Shout the radio + +The radio is 1.1 +Turn around the radio +Shout the radio + + +The radio is 1.1 +Turn the radio round +Shout the radio + +The radio is 1.1 +Turn round the radio +Shout the radio \ No newline at end of file diff --git a/tests/fixtures/math/rounding.rock.out b/tests/fixtures/math/rounding.rock.out new file mode 100644 index 0000000..5ca6b62 --- /dev/null +++ b/tests/fixtures/math/rounding.rock.out @@ -0,0 +1,8 @@ +1 +1 +2 +2 +1 +1 +1 +1 diff --git a/tests/fixtures/math/rounding_pronouns.rock b/tests/fixtures/math/rounding_pronouns.rock new file mode 100644 index 0000000..cc899c6 --- /dev/null +++ b/tests/fixtures/math/rounding_pronouns.rock @@ -0,0 +1,15 @@ +The radio is 1.1 +Turn it down +Shout the radio + +The radio is 1.1 +Turn it up +Shout the radio + +The radio is 1.1 +Turn it around +Shout the radio + +The radio is 1.1 +Turn it round +Shout the radio \ No newline at end of file diff --git a/tests/fixtures/math/rounding_pronouns.rock.out b/tests/fixtures/math/rounding_pronouns.rock.out new file mode 100644 index 0000000..541800d --- /dev/null +++ b/tests/fixtures/math/rounding_pronouns.rock.out @@ -0,0 +1,4 @@ +1 +2 +1 +1 diff --git a/tests/fixtures/operators/addOperator.rock b/tests/fixtures/operators/addOperator.rock new file mode 100644 index 0000000..4fe143a --- /dev/null +++ b/tests/fixtures/operators/addOperator.rock @@ -0,0 +1,24 @@ +say 5 with 8 +put 5 into my left +put 8 into my right +say my left plus my right +say 5 plus 8 plus 10.5 +say 5 plus nothing + +(string concatenation) +say "hello" plus " " plus "world" + +(string + number) +say "hello" plus " " plus 0.85 +say "hello" plus " " plus 5 +say "hello" plus " " plus .11 +say 5.5 plus " " plus "hello" + +(string + boolean) +say "your words are " plus lies +say "your words are " plus True +say true plus ", you are." + +(string + null) +say null plus " and void" +say "void and " plus nothing diff --git a/tests/fixtures/operators/addOperator.rock.out b/tests/fixtures/operators/addOperator.rock.out new file mode 100644 index 0000000..a26d012 --- /dev/null +++ b/tests/fixtures/operators/addOperator.rock.out @@ -0,0 +1,14 @@ +13 +13 +23.5 +5 +hello world +hello 0.85 +hello 5 +hello 0.11 +5.5 hello +your words are false +your words are true +true, you are. +null and void +void and null diff --git a/tests/fixtures/operators/andTest.rock b/tests/fixtures/operators/andTest.rock new file mode 100644 index 0000000..210c43e --- /dev/null +++ b/tests/fixtures/operators/andTest.rock @@ -0,0 +1,15 @@ +TrueFunc takes Ignored +Give back True +(end function) +SayHiAndReturn takes V +say "Hi" +Give back V +(end function) +say true and true +say true and false +say false and true +say false and false +say TrueFunc taking nothing and TrueFunc taking nothing +say false and 1 over 0 is 0 +say true and SayHiAndReturn taking true +say false and SayHiAndReturn taking true diff --git a/tests/fixtures/operators/andTest.rock.out b/tests/fixtures/operators/andTest.rock.out new file mode 100644 index 0000000..18c2505 --- /dev/null +++ b/tests/fixtures/operators/andTest.rock.out @@ -0,0 +1,9 @@ +true +false +false +false +true +false +Hi +true +false diff --git a/tests/fixtures/operators/booleans.rock b/tests/fixtures/operators/booleans.rock new file mode 100644 index 0000000..5cde7d3 --- /dev/null +++ b/tests/fixtures/operators/booleans.rock @@ -0,0 +1,12 @@ +X is true +Y is false +say X (true) +say X and Y (false) +say X or Y (true) +say not X (false) +say not X and not Y (false) +say not X or not Y (true) +say not X and not Y and not X or not Y (true) + + + diff --git a/tests/fixtures/operators/booleans.rock.out b/tests/fixtures/operators/booleans.rock.out new file mode 100644 index 0000000..6ecc72a --- /dev/null +++ b/tests/fixtures/operators/booleans.rock.out @@ -0,0 +1,7 @@ +true +false +true +false +false +true +true diff --git a/tests/fixtures/operators/divisionOperator.rock b/tests/fixtures/operators/divisionOperator.rock new file mode 100644 index 0000000..0d9572e --- /dev/null +++ b/tests/fixtures/operators/divisionOperator.rock @@ -0,0 +1,4 @@ +say 5 over 2 +say 2 over 2 +say 4 over 2 over 2 +say nothing over 2 diff --git a/tests/fixtures/operators/divisionOperator.rock.out b/tests/fixtures/operators/divisionOperator.rock.out new file mode 100644 index 0000000..df706b0 --- /dev/null +++ b/tests/fixtures/operators/divisionOperator.rock.out @@ -0,0 +1,4 @@ +2.5 +1 +1 +0 diff --git a/tests/fixtures/operators/incrementAndDecrement.rock b/tests/fixtures/operators/incrementAndDecrement.rock new file mode 100644 index 0000000..4e83ffc --- /dev/null +++ b/tests/fixtures/operators/incrementAndDecrement.rock @@ -0,0 +1,41 @@ +say "integers" +(increment and decrement works on integers) +put 5 into my world +put my world into my temp +build my world up +say my world +say my temp + +say "multiples" +(multi increment and decrements, with optional commas) +put 5 into my world +build my world up, up, up up up, up +say my world +knock my world down down, down down down down +say my world + +say "decimals" +(increment and decrement works on decimals) +put 2.25 into Other Variable +knock Other Variable down +say Other Variable + +say "booleans" +(increment and decrement flip the value of booleans) +my test is true +knock my test down +say my test +knock my test down +say my test +build my test up +say my test +build my test up +say my test +build my test up up up up +say my test +build my test up up up +say my test +knock my test down down down down +say my test +knock my test down down down +say my test diff --git a/tests/fixtures/operators/incrementAndDecrement.rock.out b/tests/fixtures/operators/incrementAndDecrement.rock.out new file mode 100644 index 0000000..56484db --- /dev/null +++ b/tests/fixtures/operators/incrementAndDecrement.rock.out @@ -0,0 +1,17 @@ +integers +6 +5 +multiples +11 +5 +decimals +1.25 +booleans +false +true +false +true +true +false +false +true diff --git a/tests/fixtures/operators/list_expressions_arithmetic.rock b/tests/fixtures/operators/list_expressions_arithmetic.rock new file mode 100644 index 0000000..9cc8289 --- /dev/null +++ b/tests/fixtures/operators/list_expressions_arithmetic.rock @@ -0,0 +1,37 @@ +Let X be 1 +Let Y be X with 2, 3, 4 +Shout Y + +Tommy says we gotta hold on +Let Tommy be with " to", " what", " we've", " got" +Shout Tommy + +My life is always cold +Now is nothing +Build it up, up +Let my life be over now, now, now, now +Shout my life + +The wolf is hungry, out on the street +Fear is the mind killer +Fury is the demon child +Hate is the only truth +Let the wolf be without fear, fury, and hate +Shout the wolf + +Let Factorial be 6 times 5, 4, 3, 2, 1 +Shout Factorial + +Let chant be "Hey! " times 2, 2, 2 +Shout chant + +The songs are long forgotten, +Longing is exquisite, +Beauty is a memory, +Temptation is a lie +Let the songs be of beauty, and temptation, and longing +Whisper the songs + +(49 * 9 * 16 * 13 = 91728) + + diff --git a/tests/fixtures/operators/list_expressions_arithmetic.rock.out b/tests/fixtures/operators/list_expressions_arithmetic.rock.out new file mode 100644 index 0000000..dfe33b0 --- /dev/null +++ b/tests/fixtures/operators/list_expressions_arithmetic.rock.out @@ -0,0 +1,7 @@ +10 +we gotta hold on to what we've got +4 +62190 +720 +Hey! Hey! Hey! Hey! Hey! Hey! Hey! Hey! +91728 diff --git a/tests/fixtures/operators/multiplicationOperator.rock b/tests/fixtures/operators/multiplicationOperator.rock new file mode 100644 index 0000000..e23d75e --- /dev/null +++ b/tests/fixtures/operators/multiplicationOperator.rock @@ -0,0 +1,7 @@ +say 5 of 5 +say 2 of 4 +say 4 of 3 of 2 of 1 +say -3 of 2 +say nothing times 5 +say "hello" times 2 +say "hello" times "world" diff --git a/tests/fixtures/operators/multiplicationOperator.rock.out b/tests/fixtures/operators/multiplicationOperator.rock.out new file mode 100644 index 0000000..206885b --- /dev/null +++ b/tests/fixtures/operators/multiplicationOperator.rock.out @@ -0,0 +1,7 @@ +25 +8 +24 +-6 +0 +hellohello +mysterious diff --git a/tests/fixtures/operators/notTest.rock b/tests/fixtures/operators/notTest.rock new file mode 100644 index 0000000..9c9e4b1 --- /dev/null +++ b/tests/fixtures/operators/notTest.rock @@ -0,0 +1,10 @@ +say not True +say not 5 +say not "hello" +say not 0 +say not mysterious +say not null +(verify 5 is not 4 isn't the same as 5 is [not 4]) +say 5 ain't 4 +say false is not 4 +say not not not true diff --git a/tests/fixtures/operators/notTest.rock.out b/tests/fixtures/operators/notTest.rock.out new file mode 100644 index 0000000..49ef1ed --- /dev/null +++ b/tests/fixtures/operators/notTest.rock.out @@ -0,0 +1,9 @@ +false +false +false +true +true +true +true +true +false diff --git a/tests/fixtures/operators/orNorTest.rock b/tests/fixtures/operators/orNorTest.rock new file mode 100644 index 0000000..c0aa4de --- /dev/null +++ b/tests/fixtures/operators/orNorTest.rock @@ -0,0 +1,19 @@ +SayAndReturn takes B +say "Hi" +give back B +(end function) +say true or true +say true or false +say false or true +say false or false +say true or SayAndReturn taking false +say false or SayAndReturn taking false +say false or SayAndReturn taking true + +say true nor true +say true nor false +say false nor true +say false nor false +say true nor SayAndReturn taking false +say false nor SayAndReturn taking false +say false nor SayAndReturn taking true diff --git a/tests/fixtures/operators/orNorTest.rock.out b/tests/fixtures/operators/orNorTest.rock.out new file mode 100644 index 0000000..20c3bde --- /dev/null +++ b/tests/fixtures/operators/orNorTest.rock.out @@ -0,0 +1,18 @@ +true +true +true +false +true +Hi +false +Hi +true +false +false +false +true +false +Hi +true +Hi +false diff --git a/tests/fixtures/operators/orderingComparison.rock b/tests/fixtures/operators/orderingComparison.rock new file mode 100644 index 0000000..75e5c89 --- /dev/null +++ b/tests/fixtures/operators/orderingComparison.rock @@ -0,0 +1,94 @@ +say 5 is lower than 6 +say 6 is lower than 5 +say 5 is as low as 6 +say 6 is as low as 5 +say 5 is as low as 5 +say 6 is higher than 5 +say 5 is higher than 6 +say 6 is as high as 5 +say 5 is as high as 6 +say 6 is as high as 6 +say "" +say -3 is lower than nothing +say 3 is lower than nothing +say nothing is lower than nothing +say nothing is as low as null +say "" +say "a" is lower than "b" +say "b" is lower than "a" +say "a" is as low as "b" +say "b" is as low as "a" +say "a" is as low as "a" +say "b" is higher than "a" +say "a" is higher than "b" +say "b" is as high as "a" +say "a" is as high as "b" +say "a" is as high as "a" +say "abcd" is lower than "abce" +say "" +say "-123" is lower than 123 +say 123 is higher than "-123" +say "" + +say "Aliases" +ten is 10 + +say "is" +say ten is higher than 9 +say ten is greater than 9 +say ten is bigger than 9 +say ten is stronger than 9 +say ten is lower than 11 +say ten is less than 11 +say ten is smaller than 11 +say ten is weaker than 11 + +say "'s" +say ten's higher than 9 +say ten's greater than 9 +say ten's bigger than 9 +say ten's stronger than 9 +say ten's lower than 11 +say ten's less than 11 +say ten's smaller than 11 +say ten's weaker than 11 + +say "are" +say ten are higher than 9 +say ten are greater than 9 +say ten are bigger than 9 +say ten are stronger than 9 +say ten are lower than 11 +say ten are less than 11 +say ten are smaller than 11 +say ten are weaker than 11 + +say "'re" +say ten're higher than 9 +say ten're greater than 9 +say ten're bigger than 9 +say ten're stronger than 9 +say ten're lower than 11 +say ten're less than 11 +say ten're smaller than 11 +say ten're weaker than 11 + +say "was" +say ten was higher than 9 +say ten was greater than 9 +say ten was bigger than 9 +say ten was stronger than 9 +say ten was lower than 11 +say ten was less than 11 +say ten was smaller than 11 +say ten was weaker than 11 + +say "were" +say ten were higher than 9 +say ten were greater than 9 +say ten were bigger than 9 +say ten were stronger than 9 +say ten were lower than 11 +say ten were less than 11 +say ten were smaller than 11 +say ten were weaker than 11 diff --git a/tests/fixtures/operators/orderingComparison.rock.out b/tests/fixtures/operators/orderingComparison.rock.out new file mode 100644 index 0000000..d84cc9c --- /dev/null +++ b/tests/fixtures/operators/orderingComparison.rock.out @@ -0,0 +1,86 @@ +true +false +true +false +true +true +false +true +false +true + +true +false +false +true + +true +false +true +false +true +true +false +true +false +true +true + +true +true + +Aliases +is +true +true +true +true +true +true +true +true +'s +true +true +true +true +true +true +true +true +are +true +true +true +true +true +true +true +true +'re +true +true +true +true +true +true +true +true +was +true +true +true +true +true +true +true +true +were +true +true +true +true +true +true +true +true diff --git a/tests/fixtures/operators/subtractOperator.rock b/tests/fixtures/operators/subtractOperator.rock new file mode 100644 index 0000000..459c172 --- /dev/null +++ b/tests/fixtures/operators/subtractOperator.rock @@ -0,0 +1,5 @@ +say .5 without 0.25 +say 0 minus 3 +say nothing minus 3 +put 5 without 2 without 1 into X +say X diff --git a/tests/fixtures/operators/subtractOperator.rock.out b/tests/fixtures/operators/subtractOperator.rock.out new file mode 100644 index 0000000..84091c6 --- /dev/null +++ b/tests/fixtures/operators/subtractOperator.rock.out @@ -0,0 +1,4 @@ +0.25 +-3 +-3 +2 diff --git a/tests/fixtures/queues/pop.rock b/tests/fixtures/queues/pop.rock new file mode 100644 index 0000000..55cdc9c --- /dev/null +++ b/tests/fixtures/queues/pop.rock @@ -0,0 +1,18 @@ +Shout "assignment:" +Rock ints with 1, 2, 3 +Let the first be roll ints +Let the second be roll ints +Shout the first (outputs 1) +Shout the second (outputs 2) +Shout roll ints (outputs 3) + +Shout "roll into variables:" +Rock the list with 4, 5, 6 +Roll the list into foo +Roll the list into bar +Shout foo (outputs 4) +Shout bar (outputs 5) +Shout the list (outputs 1) +Roll the list +Shout the list (outputs 0) +Shout roll the list (outputs mysterious) diff --git a/tests/fixtures/queues/pop.rock.out b/tests/fixtures/queues/pop.rock.out new file mode 100644 index 0000000..7c5ed27 --- /dev/null +++ b/tests/fixtures/queues/pop.rock.out @@ -0,0 +1,10 @@ +assignment: +1 +2 +3 +roll into variables: +4 +5 +1 +0 +mysterious diff --git a/tests/fixtures/queues/push.rock b/tests/fixtures/queues/push.rock new file mode 100644 index 0000000..68b9f53 --- /dev/null +++ b/tests/fixtures/queues/push.rock @@ -0,0 +1,25 @@ +Say "empty arrays:" +Rock steady +Shout steady + +say "in-place array coercion:" +Jazz is 123 +Rock jazz +Shout jazz (jazz is now a one-element array, so should output 1) +Shout jazz at 0 (should output 12345) +Shout jazz at 1 (should output mysterious) + +say "push list expressions:" +Rock ints 7, 8, 9 +Shout ints +Shout ints at 0 +Shout ints at 1 +Shout ints at 2 +Shout ints at 3 + +say "hurricane:" +You are my destiny +Rock you like a hurricane +Shout you +Shout you at 0 +Shout you at 1 \ No newline at end of file diff --git a/tests/fixtures/queues/push.rock.out b/tests/fixtures/queues/push.rock.out new file mode 100644 index 0000000..183a084 --- /dev/null +++ b/tests/fixtures/queues/push.rock.out @@ -0,0 +1,16 @@ +empty arrays: +0 +in-place array coercion: +1 +123 +mysterious +push list expressions: +3 +7 +8 +9 +mysterious +hurricane: +2 +27 +19 diff --git a/tests/fixtures/queues/queues.rock b/tests/fixtures/queues/queues.rock new file mode 100644 index 0000000..db5c5b3 --- /dev/null +++ b/tests/fixtures/queues/queues.rock @@ -0,0 +1,14 @@ +rock queue with 1 +rock queue with 2 +rock queue with 3 +shout roll queue +shout roll queue +shout roll queue +shout roll queue +shout queue + +rock the list with "first" +rock the list with "second", "third" +rock the list with "fourth" +while the list ain't nothing +shout roll the list diff --git a/tests/fixtures/queues/queues.rock.out b/tests/fixtures/queues/queues.rock.out new file mode 100644 index 0000000..e69fa6c --- /dev/null +++ b/tests/fixtures/queues/queues.rock.out @@ -0,0 +1,9 @@ +1 +2 +3 +mysterious +0 +first +second +third +fourth diff --git a/tests/fixtures/queues/string_queues.rock b/tests/fixtures/queues/string_queues.rock new file mode 100644 index 0000000..36da610 --- /dev/null +++ b/tests/fixtures/queues/string_queues.rock @@ -0,0 +1,18 @@ +My dream is diamond nightmares +Your love is meaningless to me +Rock my dream like a razorblade smile +Rock my dream with your love, your love +Shout my dream at 0 +Shout my dream at 1 +Shout my dream at 2 +Shout my dream at 3 +Shout my dream at 4 + +The night is empty +Until my dream is nothing +Roll my dream into the dark +Cast the dark into the fire +Let the night be the night with the fire + +Shout the night + diff --git a/tests/fixtures/queues/string_queues.rock.out b/tests/fixtures/queues/string_queues.rock.out new file mode 100644 index 0000000..37cf511 --- /dev/null +++ b/tests/fixtures/queues/string_queues.rock.out @@ -0,0 +1,6 @@ +70 +105 +122 +122 +mysterious +Fizz diff --git a/tests/fixtures/types/parsing.rock b/tests/fixtures/types/parsing.rock new file mode 100644 index 0000000..4f9041c --- /dev/null +++ b/tests/fixtures/types/parsing.rock @@ -0,0 +1,14 @@ +Say "parsing ints with cast" +Let X be "123" +Let Y be "456" +Let Z be X with Y +Shout Z (123456) +Cast X +Cast Y +Let Z be X with Y +Shout Z (579) + +Say "creating chars with cast" +Let X be 65 +Cast X +Shout X (A) diff --git a/tests/fixtures/types/parsing.rock.out b/tests/fixtures/types/parsing.rock.out new file mode 100644 index 0000000..20d2837 --- /dev/null +++ b/tests/fixtures/types/parsing.rock.out @@ -0,0 +1,5 @@ +parsing ints with cast +123456 +579 +creating chars with cast +A diff --git a/tests/fixtures/variables/common_variables.rock b/tests/fixtures/variables/common_variables.rock new file mode 100644 index 0000000..d27b36c --- /dev/null +++ b/tests/fixtures/variables/common_variables.rock @@ -0,0 +1,85 @@ +a variable is 1 +an variable is 2 +the variable is 3 +my variable is 4 +your variable is 5 +our variable is 6 + +say a variable +say an variable +say the variable +say my variable +say your variable +say our variable + +a variables are 11 +an variables are 12 +the variables are 13 +my variables are 14 +your variables are 15 +our variables are 16 + +say a variables +say an variables +say the variables +say my variables +say your variables +say our variables + +say "expressions" +say a variable with the variable +say my variable with your variable + +say "case insensitivity" +THE TIME is 1 +say THE TIME +say THE time +say The Time +say tHe tImE +say the Time +say the time + +THE time is 2 +say THE TIME +say THE time +say The Time +say tHe tImE +say the Time +say the time + +The Time is 3 +say THE TIME +say THE time +say The Time +say tHe tImE +say the Time +say the time + +tHe tImE is 4 +say THE TIME +say THE time +say The Time +say tHe tImE +say the Time +say the time + +the Time is 5 +say THE TIME +say THE time +say The Time +say tHe tImE +say the Time +say the time + +the time is 6 +say THE TIME +say THE time +say The Time +say tHe tImE +say the Time +say the time + +the times are 7 +say the times +the times aRE 8 +say the times diff --git a/tests/fixtures/variables/common_variables.rock.out b/tests/fixtures/variables/common_variables.rock.out new file mode 100644 index 0000000..252d2b5 --- /dev/null +++ b/tests/fixtures/variables/common_variables.rock.out @@ -0,0 +1,54 @@ +1 +2 +3 +4 +5 +6 +11 +12 +13 +14 +15 +16 +expressions +4 +9 +case insensitivity +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +2 +2 +3 +3 +3 +3 +3 +3 +4 +4 +4 +4 +4 +4 +5 +5 +5 +5 +5 +5 +6 +6 +6 +6 +6 +6 +7 +8 diff --git a/tests/fixtures/variables/globalVariables.rock b/tests/fixtures/variables/globalVariables.rock new file mode 100644 index 0000000..7ee3b60 --- /dev/null +++ b/tests/fixtures/variables/globalVariables.rock @@ -0,0 +1,25 @@ +put 5 into Global + +MyFunc takes X +Give back X plus Global +(end func) + +say MyFunc taking 2 + +MyFuncTwo takes X +Give back X plus GlobalTwo +(end func) + +put 6 into GlobalTwo +say MyFuncTwo taking 2 + +(variables defined globally can be changed from functions) + +SetGlobal takes X +put X into Global +(end func) + +put 1 into Global +say Global +SetGlobal taking 2 +say Global diff --git a/tests/fixtures/variables/globalVariables.rock.out b/tests/fixtures/variables/globalVariables.rock.out new file mode 100644 index 0000000..6b12799 --- /dev/null +++ b/tests/fixtures/variables/globalVariables.rock.out @@ -0,0 +1,4 @@ +7 +8 +1 +2 diff --git a/tests/fixtures/variables/poeticStrings.rock b/tests/fixtures/variables/poeticStrings.rock new file mode 100644 index 0000000..dee9632 --- /dev/null +++ b/tests/fixtures/variables/poeticStrings.rock @@ -0,0 +1,17 @@ +my girlfriend says hello to Rockstar! +shout my girlfriend + +Albert Einstein says he's got a new theory to share +whisper Albert Einstein + +the darkness says Mysterious +whisper the darkness + +my world says this. Contains a period. Or three. +shout my world + +Somebody say something! +shout somebody + +They said I'd never amount to anything. Well I showed them! +shout they diff --git a/tests/fixtures/variables/poeticStrings.rock.out b/tests/fixtures/variables/poeticStrings.rock.out new file mode 100644 index 0000000..a86e029 --- /dev/null +++ b/tests/fixtures/variables/poeticStrings.rock.out @@ -0,0 +1,6 @@ +hello to Rockstar! +he's got a new theory to share +Mysterious +this. Contains a period. Or three. +something! +I'd never amount to anything. Well I showed them! diff --git a/tests/fixtures/variables/pronouns.rock b/tests/fixtures/variables/pronouns.rock new file mode 100644 index 0000000..341f230 --- /dev/null +++ b/tests/fixtures/variables/pronouns.rock @@ -0,0 +1,19 @@ +my heart is true +say my heart + +it is false +say my heart +say it + +put 1 into Epic Music +put 2 into my car +put Epic Music plus my car into it +say Epic Music +say my car + +Thomas is true +put "yes" into him +say Thomas + +put 5 into Da Way Da World Turns +say it diff --git a/tests/fixtures/variables/pronouns.rock.out b/tests/fixtures/variables/pronouns.rock.out new file mode 100644 index 0000000..f142fd6 --- /dev/null +++ b/tests/fixtures/variables/pronouns.rock.out @@ -0,0 +1,7 @@ +true +false +false +1 +3 +yes +5 diff --git a/tests/fixtures/variables/proper_variables.rock b/tests/fixtures/variables/proper_variables.rock new file mode 100644 index 0000000..ed69dfe --- /dev/null +++ b/tests/fixtures/variables/proper_variables.rock @@ -0,0 +1,13 @@ +Dr Feelgood is 1 +say Dr Feelgood + +JOHNNY B GOODE is 2 +say Johnny B Goode + +say "case sensitivity" +(Proper variables are case-insensitive apart from + the first letter of each word, which must be a capital letter.) +Tom Sawyer is 3 +say Tom Sawyer +say TOM SAWYER +say ToM SaWyEr diff --git a/tests/fixtures/variables/proper_variables.rock.out b/tests/fixtures/variables/proper_variables.rock.out new file mode 100644 index 0000000..fb550c6 --- /dev/null +++ b/tests/fixtures/variables/proper_variables.rock.out @@ -0,0 +1,6 @@ +1 +2 +case sensitivity +3 +3 +3 diff --git a/tests/fixtures/variables/simple_pronouns.rock b/tests/fixtures/variables/simple_pronouns.rock new file mode 100644 index 0000000..09ca51b --- /dev/null +++ b/tests/fixtures/variables/simple_pronouns.rock @@ -0,0 +1,26 @@ +The message is "pass" +say it +say it plus "!" + +Gina is 25 +Say her +Shout her +Whisper her +Scream her + +Test Case is "message" +say it plus " it" +say he plus " he" +say she plus " she" +say him plus " him" +say her plus " her" +say they plus " they" +say them plus " them" +say ze plus " ze" +say hir plus " hir" +say zie plus " zie" +say zir plus " zir" +say xe plus " xe" +say xem plus " xem" +say ve plus " ve" +say ver plus " ver" diff --git a/tests/fixtures/variables/simple_pronouns.rock.out b/tests/fixtures/variables/simple_pronouns.rock.out new file mode 100644 index 0000000..2d4e678 --- /dev/null +++ b/tests/fixtures/variables/simple_pronouns.rock.out @@ -0,0 +1,21 @@ +pass +pass! +25 +25 +25 +25 +message it +message he +message she +message him +message her +message they +message them +message ze +message hir +message zie +message zir +message xe +message xem +message ve +message ver diff --git a/tests/fixtures/variables/simple_variables.rock b/tests/fixtures/variables/simple_variables.rock new file mode 100644 index 0000000..4952460 --- /dev/null +++ b/tests/fixtures/variables/simple_variables.rock @@ -0,0 +1,44 @@ +Variable is 1 +Say variable + +Value is 1 +say value with value + +X is 1 +Y is 2 +Say x plus y +Alpha says r +Beta says o +Gamma says c +Delta says k +Say alpha with beta with gamma with delta + +Let themes be 10 (variable name beginning with pronoun 'the') +Let italics be true (variable name beginning with pronoun 'it') +Shout themes +Shout italics + +say "case insensitivity" +TIME is 1 +say TIME +say time +say tIMe +say TIMe + +time is 2 +say TIME +say time +say tIMe +say TIMe + +tIMe is 3 +say TIME +say time +say tIMe +say TIMe + +TIMe is 4 +say TIME +say time +say tIMe +say TIMe diff --git a/tests/fixtures/variables/simple_variables.rock.out b/tests/fixtures/variables/simple_variables.rock.out new file mode 100644 index 0000000..dd61123 --- /dev/null +++ b/tests/fixtures/variables/simple_variables.rock.out @@ -0,0 +1,23 @@ +1 +2 +3 +rock +10 +true +case insensitivity +1 +1 +1 +1 +2 +2 +2 +2 +3 +3 +3 +3 +4 +4 +4 +4 diff --git a/tests/fixtures/variables/umlauts.rock b/tests/fixtures/variables/umlauts.rock new file mode 100644 index 0000000..e16022c --- /dev/null +++ b/tests/fixtures/variables/umlauts.rock @@ -0,0 +1,11 @@ +(umlauts should work as parts of common variable names) +The mētäl is true +Shout the mētäl + +(proper variable names should allow umlauts too) +Ÿëstërdäÿ is ours +Say it + +(umlauts should be allowed in a literal string) +Anna says she lïkes her ümlaüts +Whisper Anna diff --git a/tests/fixtures/variables/umlauts.rock.out b/tests/fixtures/variables/umlauts.rock.out new file mode 100644 index 0000000..bc5cd3d --- /dev/null +++ b/tests/fixtures/variables/umlauts.rock.out @@ -0,0 +1,3 @@ +true +4 +she lïkes her ümlaüts diff --git a/tests/fixtures/variables/writeGlobal.rock b/tests/fixtures/variables/writeGlobal.rock new file mode 100644 index 0000000..6972778 --- /dev/null +++ b/tests/fixtures/variables/writeGlobal.rock @@ -0,0 +1,20 @@ +global is 0 + +CheckGlobal takes x +say global +(end of function) + +SetGlobal takes x +let global be x +put CheckGlobal taking 0 into dummy +(end of function) + +CheckGlobalWithSameName takes global +say global +(end of function) + +put SetGlobal taking 1 into dummy +say global + +put CheckGlobalWithSameName taking 5 into dummy +say global diff --git a/tests/fixtures/variables/writeGlobal.rock.out b/tests/fixtures/variables/writeGlobal.rock.out new file mode 100644 index 0000000..5dccec0 --- /dev/null +++ b/tests/fixtures/variables/writeGlobal.rock.out @@ -0,0 +1,4 @@ +1 +1 +5 +1 diff --git a/tests/fixtures/whitespace/apostrophesIgnored.rock b/tests/fixtures/whitespace/apostrophesIgnored.rock new file mode 100644 index 0000000..c3f8e2c --- /dev/null +++ b/tests/fixtures/whitespace/apostrophesIgnored.rock @@ -0,0 +1,10 @@ +('s is valid in poetic assignments with the apostrophe ignored) + +my soul is the Devil's to take +shout my soul + +my soul is the Devil'sto take +shout my soul + +my soul is the Devil 's to take +shout my soul diff --git a/tests/fixtures/whitespace/apostrophesIgnored.rock.out b/tests/fixtures/whitespace/apostrophesIgnored.rock.out new file mode 100644 index 0000000..2db02e2 --- /dev/null +++ b/tests/fixtures/whitespace/apostrophesIgnored.rock.out @@ -0,0 +1,3 @@ +3624 +384 +35124 diff --git a/tests/fixtures/whitespace/leading_blank_lines.rock b/tests/fixtures/whitespace/leading_blank_lines.rock new file mode 100644 index 0000000..b926026 --- /dev/null +++ b/tests/fixtures/whitespace/leading_blank_lines.rock @@ -0,0 +1,4 @@ + + +(this file tests that parsers can handle BLANK leading lines) +say "pass" diff --git a/tests/fixtures/whitespace/leading_blank_lines.rock.out b/tests/fixtures/whitespace/leading_blank_lines.rock.out new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/tests/fixtures/whitespace/leading_blank_lines.rock.out @@ -0,0 +1 @@ +pass diff --git a/tests/fixtures/whitespace/leading_empty_lines.rock b/tests/fixtures/whitespace/leading_empty_lines.rock new file mode 100644 index 0000000..3639ca3 --- /dev/null +++ b/tests/fixtures/whitespace/leading_empty_lines.rock @@ -0,0 +1,4 @@ + + +(this file tests that parsers can handle EMPTY leading lines) +say "pass" diff --git a/tests/fixtures/whitespace/leading_empty_lines.rock.out b/tests/fixtures/whitespace/leading_empty_lines.rock.out new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/tests/fixtures/whitespace/leading_empty_lines.rock.out @@ -0,0 +1 @@ +pass diff --git a/tests/fixtures/whitespace/leading_whitespace.rock b/tests/fixtures/whitespace/leading_whitespace.rock new file mode 100644 index 0000000..ba22297 --- /dev/null +++ b/tests/fixtures/whitespace/leading_whitespace.rock @@ -0,0 +1,6 @@ +Rockstar is a big bad monster truck +While Rockstar is greater than nothing + Shout Rockstar + Put Rockstar without 500 into Rockstar + + diff --git a/tests/fixtures/whitespace/leading_whitespace.rock.out b/tests/fixtures/whitespace/leading_whitespace.rock.out new file mode 100644 index 0000000..aa267a1 --- /dev/null +++ b/tests/fixtures/whitespace/leading_whitespace.rock.out @@ -0,0 +1,27 @@ +13375 +12875 +12375 +11875 +11375 +10875 +10375 +9875 +9375 +8875 +8375 +7875 +7375 +6875 +6375 +5875 +5375 +4875 +4375 +3875 +3375 +2875 +2375 +1875 +1375 +875 +375 diff --git a/tests/fixtures/whitespace/no_newline_at_eof.rock b/tests/fixtures/whitespace/no_newline_at_eof.rock new file mode 100644 index 0000000..27014cd --- /dev/null +++ b/tests/fixtures/whitespace/no_newline_at_eof.rock @@ -0,0 +1,2 @@ +(test whether parser can cope with a file that does not end with a new line) +say "pass" \ No newline at end of file diff --git a/tests/fixtures/whitespace/no_newline_at_eof.rock.out b/tests/fixtures/whitespace/no_newline_at_eof.rock.out new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/tests/fixtures/whitespace/no_newline_at_eof.rock.out @@ -0,0 +1 @@ +pass diff --git a/tests/fixtures/whitespace/trailing_blank_lines.rock b/tests/fixtures/whitespace/trailing_blank_lines.rock new file mode 100644 index 0000000..7efc283 --- /dev/null +++ b/tests/fixtures/whitespace/trailing_blank_lines.rock @@ -0,0 +1,3 @@ +say "pass" +(test we can cope with blank lines at the end of a file) + diff --git a/tests/fixtures/whitespace/trailing_blank_lines.rock.out b/tests/fixtures/whitespace/trailing_blank_lines.rock.out new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/tests/fixtures/whitespace/trailing_blank_lines.rock.out @@ -0,0 +1 @@ +pass diff --git a/tests/fixtures/whitespace/trailing_empty_lines.rock b/tests/fixtures/whitespace/trailing_empty_lines.rock new file mode 100644 index 0000000..6ea7e04 --- /dev/null +++ b/tests/fixtures/whitespace/trailing_empty_lines.rock @@ -0,0 +1,3 @@ +say "pass" +(test we can cope with EMPTY lines - i.e. multiple newlines - at the end of a file) + diff --git a/tests/fixtures/whitespace/trailing_empty_lines.rock.out b/tests/fixtures/whitespace/trailing_empty_lines.rock.out new file mode 100644 index 0000000..2ae2839 --- /dev/null +++ b/tests/fixtures/whitespace/trailing_empty_lines.rock.out @@ -0,0 +1 @@ +pass diff --git a/tools/example.rock b/tools/example.rock new file mode 100644 index 0000000..0da43f3 --- /dev/null +++ b/tools/example.rock @@ -0,0 +1,31 @@ +Eternity takes the pain. +The prize is silence +Until the pain is nothing, +Roll the pain into violence, +Cast violence into your lies, +Let the prize be with your lies. + +Give back the prize + +The night is calling me +Rock the night like a colourcast tranquility +The dawn is a spellbound moonbeam +Rock the night with the dawn, the dawn, +Your fire is a neverending aftereffect +Rock the night with your fire + +The spirit is electric thunder +Rock the spirit with your fire +Rock the spirit like a thunderbolt fist +Rock the spirit with the dawn +Rock the spirit like a chamaeleon stormcloud + +Let fear be eternity taking the night +Let hope be eternity taking the spirit + +Time is all up +Cast it into the void +Let fear be with the void +Let fear be with hope + +Shout fear diff --git a/tools/index.html b/tools/index.html new file mode 100644 index 0000000..2ee9d04 --- /dev/null +++ b/tools/index.html @@ -0,0 +1,51 @@ + + + + rockstar web demo + + + +pegjs +

SOURCE

+ + +

OUTPUT:

+ + + + + + + + \ No newline at end of file diff --git a/tools/pegjs.org/css/benchmark.css b/tools/pegjs.org/css/benchmark.css new file mode 100644 index 0000000..adb079b --- /dev/null +++ b/tools/pegjs.org/css/benchmark.css @@ -0,0 +1,34 @@ +body { + margin: 2em 4em; + font-family: "Trebuchet MS", lucida, sans-serif; + line-height: 1.5; + color: black; background-color: white; +} + +h1 { margin: 0 0 .75em 0; text-align: center; font-size: 200%; } + +table { width: 48em; margin: 0 auto; border-spacing: 0; border-collapse: collapse; } +table td, table th { border: 1px solid silver; padding: .25em 1em; } +table td .unit { font-size: 75%; color: gray; } +table td.no-results { padding: 1em; text-align: center; } +table td.input-size { text-align: right; } +table td.parse-time { text-align: right; } +table td.parse-speed { text-align: right; } +table tr.columns th { border-color: #404040; color: white; background-color: #404040; } +table tr.heading th { background-color: #e0e0e0; } +table tr.benchmark-total td { font-weight: bold; } +table tr.total td { background-color: #ffff80; font-weight: bold; } +table tr.total td .unit { color: #808000; } +table tr.total td.parse-speed .value { font-size: 175%; } + +a, a:visited { color: #3d586c; } + +#options { + width: 45em; + margin: 2em auto; border-radius: .5em; -moz-border-radius: .5em; padding: .5em 1.5em; + background-color: #f0f0f0; +} +#options #run-count { width: 3em; } +#options #cache { margin-left: 2em; } +#options label[for=optimize] { margin-left: 2em; } +#options #run { float:right; width: 5em; } diff --git a/tools/pegjs.org/css/common.css b/tools/pegjs.org/css/common.css new file mode 100644 index 0000000..1d05280 --- /dev/null +++ b/tools/pegjs.org/css/common.css @@ -0,0 +1,8 @@ +body { + margin: 0; + font-family: "Trebuchet MS", lucida, sans-serif; + line-height: 1.5; + color: black; background-color: white; +} +aside, footer, header, nav { display: block; } /* HTML5 */ +a img { border: none; } diff --git a/tools/pegjs.org/css/content.css b/tools/pegjs.org/css/content.css new file mode 100644 index 0000000..b2d13a1 --- /dev/null +++ b/tools/pegjs.org/css/content.css @@ -0,0 +1,343 @@ +#content h1 { + margin: 0 0 .75em 0; + font-size: 200%; +} + +#content h2 { + margin: 1.5em 0 .75em 0; + border-bottom: 2pt dotted silver; + font-size: 150%; +} + +#content h3 { + margin: 1.5em 0 .5em 0; + font-size: 125%; +} + +#content li { + margin: .5em 0; +} + +#content dt { + font-weight: bold; +} + +#content dd { + margin-top: 1em; + margin-bottom: 1em; +} + +#content aside.info { + margin: 1em 0 1em 2em; + color: gray; +} + +#content pre { + overflow: auto; + padding: .5em 1em; + border-left: 5px solid silver; + background-color: #f0f0f0; + font-family: "Consolas"; + font-size: 0.75em; +} + +#content table { + border-spacing: 0; +} + +#content a { + text-decoration: none; + color: #1A0BF1; +} + +#content a:hover { + text-decoration: underline; + color: #9D0BF1; +} + +#content .center { + text-align: center; +} + +/* Home */ + +#content #sidebar { + float: right; + width: 17em; + font-size: 80%; + text-align: center; +} + +#content #sidebar a { + font-weight: bold; + text-decoration: none; + color: #006000; +} + +#content #sidebar a:hover { + text-decoration: underline; +} + +#content #sidebar a.try { + display: block; + padding: .75em; + border-radius: .6em; + -moz-border-radius: .6em; + font-size: 140%; + color: #e0ffe0; + background-color: #499149; +} + +#content #sidebar a.try:hover { + text-decoration: none; + background-color: #006000; +} + +#content #sidebar .install { + padding: .75em; + border: 1px solid #499149; + border-radius: .7em; + -moz-border-radius: .7em; + font-family: "Consolas", "Lucida Console", fixed, monospace; + font-size: 120%; + color: #2c572c; + background-color: #e0ffe0; +} + +#content #sidebar .label { + margin-left: 2.6em; + text-align: left; + color: #606060; +} + +#content #sidebar #download { + color: gray; + font-size: 120%; +} + +#content #sidebar .separator { + color: gray; + margin: 1.5em 0 1em 0; +} + +#content #left-column { + margin-right: 17em; +} + +/* Online Version */ + +#content .message { + border-radius: .5em; + -moz-border-radius: .5em; + padding: .5em 1em; + font-size: 0.75em; +} + +#content .message.info { + background-color: #c0ffc0; +} + +#content .message.info a.download { + display: block; + float: right; +} + +#content .message.info .size-and-time { + visibility: hidden; + float: right; + font-size: 70%; + margin: .3em 0; + color: #80c080; +} + +#content .message.info:hover .size-and-time { + visibility: visible; +} + +#content .message.error { + background-color: orange; +} + +#content .message.progress { + padding-left: 40px; + /* Spinner image generated by http://www.loadinfo.net/. */ + background: #ffff80 url("../img/spinner-16x16-progress.gif") 14px center no-repeat; +} + +#content .message.disabled { + color: gray; + background-color: #f0f0f0; +} + +#content table.online { + table-layout: fixed; +} + +; +#content table.form { + width: 100%; +} + +#content table.form td, +table.form th { + padding: .5em 1em; +} + +#content table.form td:first-child, +table.form th:first-child { + padding-left: 0; +} + +#content table.form td:last-child, +table.form th:last-child { + padding-right: 0; +} + +#content table.form th { + text-align: left; + font-weight: normal; +} + +#content h2.suggestion { + border: none; +} + +#content h2.suggestion.top { + margin-top: 0; +} + +#content h2.suggestion .step-number { + display: block; + float: left; + width: 1.5em; + border-radius: .4em; + -moz-border-radius: .4em; + text-align: center; + color: white; + background-color: black; +} + +#content h2.suggestion .step-title { + margin-left: 2.5em; +} + +#content textarea.code { + width: 100%; + height: 20em; + border: 1px solid gray; + font-family: "Consolas", "Lucida Console", fixed, monospace; + min-height: 150pt; +} + +#content .textarea-wrapper { + padding-right: 6px; +} + +#content #columns { + width: 100%; + height: 100%; + border-spacing: 1em; +} + +#content #columns td { + width: 50%; +} + +#content table.column { + width: 100%; + height: 100%; +} + +#content table.column td { + vertical-align: top; +} + +/* Browsers will enlarge the |.content-height| cells to fit the contents. */ + +#content table.column td.content-height { + height: 1px; +} + +#content .CodeMirror { + border: 1px solid gray; +} + +#content .CodeMirror pre { + overflow: visible; + padding: 0px 0px 0px 2px; + border: none; + background-color: inherit; +} + +#content #output-header { + margin: 1.25em 0 0 0; + border: none; + padding: .25em 1.2em .25em 1.2em; + font-size: 80%; + color: white; + background-color: silver; +} + +#content #output { + overflow: auto; + max-height: 20em; + margin: 0; + padding: .5em 1em; + border: 2px solid silver; + border-top: none; + background-color: #f0f0f0; +} + +#content #output.disabled { + color: gray; +} + +#content #settings { + padding: .5em 0; +} + +#content #settings label { + padding-right: 1em; +} + +#content #settings label[for=option-optimize] { + padding-left: 2em; +} + +#content #parser-var { + width: 15em; +} + +#content #options { + padding-top: 1em; +} + +#content #parser-download { + float: right; + width: 10em; + margin-top: 2em; + border-width: 0; + padding: .5em; + border-radius: .4em; + -moz-border-radius: .4em; + font-family: "Trebuchet MS", lucida, sans-serif; + font-size: 1em; + line-height: 1.5; + text-align: center; + text-decoration: none; + color: #e0ffe0; + background-color: #499149; +} + +#content #parser-download:hover { + background-color: #006000; +} + +#content #parser-download.disabled { + color: #e0e0e0; + background-color: gray; +} + +#output { + max-width: 50vw; +} \ No newline at end of file diff --git a/tools/pegjs.org/css/layout-default.css b/tools/pegjs.org/css/layout-default.css new file mode 100644 index 0000000..5b9a5e0 --- /dev/null +++ b/tools/pegjs.org/css/layout-default.css @@ -0,0 +1,52 @@ +#header { margin: 2em 0; text-align: center; } +#header h1 { + margin: 0; padding: .05em 0; + border-top-left-radius: .2em; -moz-border-radius-topleft: .2em; + border-top-right-radius: .2em; -moz-border-radius-topright: .2em; + font-size: 400%; text-shadow: black 0 0 5px; + background-color: #234d6b; color: white; +} +#header h1 a { display: block; text-decoration: none; color: white; } +#header h2 { + margin: 0; padding: .25em 0; + border-bottom-left-radius: .666em; -moz-border-radius-bottomleft: .666em; + border-bottom-right-radius: .666em; -moz-border-radius-bottomright: .666em; + font-size: 120%; text-shadow: black 0 0 2px; + background-color: #2c5f85; color: white; +} +#main { width: 50em; margin: 0 auto; } + +#menu { + border-radius: .8em; -moz-border-radius: .8em; padding: .5em 1em; + text-align: center; + background-color: #e5ecf2; +} +#menu a, #menu a:visited { + padding: .2em 1em; + text-decoration: none; + color: #3d586c; +} +#menu a.current { + border-radius: .4em; -moz-border-radius: .4em; + color: #e5ecf2; background-color: #8da6b8; +} +#menu a:hover { + border-radius: .4em; -moz-border-radius: .4em; + color: #e5ecf2; background-color: #3d586c; +} + +#content { margin: 2em 0 4em 0; } + +#footer { + margin-bottom: 2em; + text-align: center; font-size: 75%; + color: #3d586c; +} +#footer a { + text-decoration: none; + color: #1A0BF1; +} +#footer a:hover { + text-decoration: underline; + color: #9D0BF1; +} diff --git a/tools/pegjs.org/css/layout-online.css b/tools/pegjs.org/css/layout-online.css new file mode 100644 index 0000000..90627d2 --- /dev/null +++ b/tools/pegjs.org/css/layout-online.css @@ -0,0 +1,100 @@ +#header { + position: absolute; + top: 1em; + left: 1em; +} + +#header h1 { + float: left; + width: 3em; + margin: 0; + padding: .5em 1.5em; + border-top-left-radius: .5em; + -moz-border-radius-topleft: .5em; + border-bottom-left-radius: .5em; + -moz-border-radius-bottomleft: .5em; + font-size: 100%; + text-shadow: black 0 0 1.25px; + text-align: center; + background-color: #234d6b; + color: white; +} + +#header h1 a { + display: block; + margin: -.5em -1.5em; + padding: .5em 1.5em; + text-decoration: none; + color: white; +} + +#header h2 { + margin: 0 0 0 6em; + padding: .5em 1.5em; + border-top-right-radius: .5em; + -moz-border-radius-topright: .5em; + border-bottom-right-radius: .5em; + -moz-border-radius-bottomright: .5em; + font-size: 100%; + text-shadow: black 0 0 1.25px; + text-align: center; + background-color: #2c5f85; + color: white; +} + +#menu { + position: absolute; + top: 1em; + right: 1em; + border-radius: .5em; + -moz-border-radius: .5em; + padding: .5em 1em; + text-align: center; + background-color: #e5ecf2; +} + +#menu a, +#menu a:visited { + padding: .2em 1em; + text-decoration: none; + color: #3d586c; +} + +#menu a.current { + border-radius: .4em; + -moz-border-radius: .4em; + color: #e5ecf2; + background-color: #8da6b8; +} + +#menu a:hover { + border-radius: .4em; + -moz-border-radius: .4em; + color: #e5ecf2; + background-color: #3d586c; +} + +#loader { + position: absolute; + top: 45%; + left: 0; + right: 0; +} + +#loader-inner { + width: 4.5em; + margin: auto; + padding-left: 64px; + font-size: 250%; + /* Spinner image generated by http://www.loadinfo.net/. */ + background: url("../img/spinner-48x48.gif") left center no-repeat; +} + +#content { + display: none; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} \ No newline at end of file diff --git a/tools/pegjs.org/css/test.css b/tools/pegjs.org/css/test.css new file mode 100644 index 0000000..d21edae --- /dev/null +++ b/tools/pegjs.org/css/test.css @@ -0,0 +1,323 @@ +@charset "utf-8"; + +body { + margin:0; +} + +#mocha { + font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; + margin: 60px 50px; +} + +#mocha ul, +#mocha li { + margin: 0; + padding: 0; +} + +#mocha ul { + list-style: none; +} + +#mocha h1, +#mocha h2 { + margin: 0; +} + +#mocha h1 { + margin-top: 15px; + font-size: 1em; + font-weight: 200; +} + +#mocha h1 a { + text-decoration: none; + color: inherit; +} + +#mocha h1 a:hover { + text-decoration: underline; +} + +#mocha .suite .suite h1 { + margin-top: 0; + font-size: .8em; +} + +#mocha .hidden { + display: none; +} + +#mocha h2 { + font-size: 12px; + font-weight: normal; + cursor: pointer; +} + +#mocha .suite { + margin-left: 15px; +} + +#mocha .test { + margin-left: 15px; + overflow: hidden; +} + +#mocha .test.pending:hover h2::after { + content: '(pending)'; + font-family: arial, sans-serif; +} + +#mocha .test.pass.medium .duration { + background: #c09853; +} + +#mocha .test.pass.slow .duration { + background: #b94a48; +} + +#mocha .test.pass::before { + content: '✓'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #00d6b2; +} + +#mocha .test.pass .duration { + font-size: 9px; + margin-left: 5px; + padding: 2px 5px; + color: #fff; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; +} + +#mocha .test.pass.fast .duration { + display: none; +} + +#mocha .test.pending { + color: #0b97c4; +} + +#mocha .test.pending::before { + content: '◦'; + color: #0b97c4; +} + +#mocha .test.fail { + color: #c00; +} + +#mocha .test.fail pre { + color: black; +} + +#mocha .test.fail::before { + content: '✖'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #c00; +} + +#mocha .test pre.error { + color: #c00; + max-height: 300px; + overflow: auto; +} + +#mocha .test .html-error { + overflow: auto; + color: black; + line-height: 1.5; + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid #eee; + max-width: 85%; /*(1)*/ + max-width: -webkit-calc(100% - 42px); + max-width: -moz-calc(100% - 42px); + max-width: calc(100% - 42px); /*(2)*/ + max-height: 300px; + word-wrap: break-word; + border-bottom-color: #ddd; + -webkit-box-shadow: 0 1px 3px #eee; + -moz-box-shadow: 0 1px 3px #eee; + box-shadow: 0 1px 3px #eee; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +#mocha .test .html-error pre.error { + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: 0; + -moz-box-shadow: 0; + box-shadow: 0; + padding: 0; + margin: 0; + margin-top: 18px; + max-height: none; +} + +/** + * (1): approximate for browsers not supporting calc + * (2): 42 = 2*15 + 2*10 + 2*1 (padding + margin + border) + * ^^ seriously + */ +#mocha .test pre { + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid #eee; + max-width: 85%; /*(1)*/ + max-width: -webkit-calc(100% - 42px); + max-width: -moz-calc(100% - 42px); + max-width: calc(100% - 42px); /*(2)*/ + word-wrap: break-word; + border-bottom-color: #ddd; + -webkit-box-shadow: 0 1px 3px #eee; + -moz-box-shadow: 0 1px 3px #eee; + box-shadow: 0 1px 3px #eee; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +#mocha .test h2 { + position: relative; +} + +#mocha .test a.replay { + position: absolute; + top: 3px; + right: 0; + text-decoration: none; + vertical-align: middle; + display: block; + width: 15px; + height: 15px; + line-height: 15px; + text-align: center; + background: #eee; + font-size: 15px; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; + -webkit-transition:opacity 200ms; + -moz-transition:opacity 200ms; + -o-transition:opacity 200ms; + transition: opacity 200ms; + opacity: 0.3; + color: #888; +} + +#mocha .test:hover a.replay { + opacity: 1; +} + +#mocha-report.pass .test.fail { + display: none; +} + +#mocha-report.fail .test.pass { + display: none; +} + +#mocha-report.pending .test.pass, +#mocha-report.pending .test.fail { + display: none; +} +#mocha-report.pending .test.pass.pending { + display: block; +} + +#mocha-error { + color: #c00; + font-size: 1.5em; + font-weight: 100; + letter-spacing: 1px; +} + +#mocha-stats { + font-size: 12px; + margin: 0; + color: #888; + z-index: 1; +} + +#mocha-stats .progress { + float: right; + padding-top: 0; + + /** + * Set safe initial values, so mochas .progress does not inherit these + * properties from Bootstrap .progress (which causes .progress height to + * equal line height set in Bootstrap). + */ + height: auto; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + background-color: initial; +} + +#mocha-stats em { + color: black; +} + +#mocha-stats a { + text-decoration: none; + color: inherit; +} + +#mocha-stats a:hover { + border-bottom: 1px solid #eee; +} + +#mocha-stats li { + display: inline-block; + margin: 0 5px; + list-style: none; + padding-top: 11px; +} + +#mocha-stats canvas { + width: 40px; + height: 40px; +} + +#mocha code .comment { color: #ddd; } +#mocha code .init { color: #2f6fad; } +#mocha code .string { color: #5890ad; } +#mocha code .keyword { color: #8a6343; } +#mocha code .number { color: #2f6fad; } + +@media screen and (max-device-width: 480px) { + #mocha { + margin: 60px 0px; + } + + #mocha #stats { + position: absolute; + } +} diff --git a/tools/pegjs.org/development/benchmark b/tools/pegjs.org/development/benchmark new file mode 100644 index 0000000..ae0d03d --- /dev/null +++ b/tools/pegjs.org/development/benchmark @@ -0,0 +1,91 @@ + + + + + + + + + Benchmark Suite » PEG.js – Parser Generator for JavaScript + + + + + + + +
+ + + + +
+ + +
+ + times + + + + + +
+ + + + + + + + + + + +
TestInput SizeAverage Parse TimeAverage Parse Speed
No results available yet.
+ + + + + +
+ + +
+ + + + diff --git a/tools/pegjs.org/development/test b/tools/pegjs.org/development/test new file mode 100644 index 0000000..b92b1aa --- /dev/null +++ b/tools/pegjs.org/development/test @@ -0,0 +1,77 @@ + + + + + + + + + Test Suite » PEG.js – Parser Generator for JavaScript + + + + + + + +
+ + + + +
+
+ + + + + + +
+ + +
+ + + + diff --git a/tools/pegjs.org/documentation b/tools/pegjs.org/documentation new file mode 100644 index 0000000..f72137a --- /dev/null +++ b/tools/pegjs.org/documentation @@ -0,0 +1,644 @@ + + + + + + + + + Documentation » PEG.js – Parser Generator for JavaScript + + + + + + + +
+ + + + +
+

Documentation

+ +

Table of Contents

+ + + +

Installation

+ +

Node.js

+ +

To use the pegjs command, install PEG.js globally:

+ +
$ npm install -g pegjs
+ +

To use the JavaScript API, install PEG.js locally:

+ +
$ npm install pegjs
+ +

If you need both the pegjs command and the JavaScript API, +install PEG.js both ways.

+ +

Browser

+ +

Download the PEG.js library +(regular or minified version) or install it using Bower:

+ +
$ bower install pegjs
+ +

Generating a Parser

+ +

PEG.js generates parser from a grammar that describes expected input and can +specify what the parser returns (using semantic actions on matched parts of the +input). Generated parser itself is a JavaScript object with a simple API.

+ +

Command Line

+ +

To generate a parser from your grammar, use the pegjs +command:

+ +
$ pegjs arithmetics.pegjs
+ +

This writes parser source code into a file with the same name as the grammar +file but with “.js” extension. You can also specify the output file +explicitly:

+ +
$ pegjs -o arithmetics-parser.js arithmetics.pegjs
+ +

If you omit both input and output file, standard input and output are +used.

+ +

By default, the generated parser is in the Node.js module format. You can +override this using the --format option.

+ +

You can tweak the generated parser with several options:

+ +
+
--allowed-start-rules
+
Comma-separated list of rules the parser will be allowed to start parsing + from (default: the first rule in the grammar).
+ +
--cache
+
Makes the parser cache results, avoiding exponential parsing time in + pathological cases but making the parser slower.
+ +
--dependency
+
Makes the parser require a specified dependency (can be specified multiple + times).
+ +
--export-var
+
Name of a global variable into which the parser object is assigned to when + no module loader is detected.
+ +
--extra-options
+
Additional options (in JSON format) to pass to + peg.generate.
+ +
--extra-options-file
+
File with additional options (in JSON format) to pass to + peg.generate.
+ +
--format
+
Format of the generated parser: amd, commonjs, + globals, umd (default: commonjs).
+ +
--optimize
+
Selects between optimizing the generated parser for parsing speed + (speed) or code size (size) (default: + speed)
+ +
--plugin
+
Makes PEG.js use a specified plugin (can be specified multiple + times).
+ +
--trace
+
Makes the parser trace its progress.
+
+ +

JavaScript API

+ +

In Node.js, require the PEG.js parser generator module:

+ +
var peg = require("pegjs");
+ +

In browser, include the PEG.js library in your web page or application using +the <script> tag. If PEG.js detects an AMD loader, it will +define itself as a module, otherwise the API will be available in the +peg global object.

+ +

To generate a parser, call the peg.generate method and pass your +grammar as a parameter:

+ +
var parser = peg.generate("start = ('a' / 'b')+");
+ +

The method will return generated parser object or its source code as a string +(depending on the value of the output option — see below). It will +throw an exception if the grammar is invalid. The exception will contain +message property with more details about the error.

+ +

You can tweak the generated parser by passing a second parameter with an +options object to peg.generate. The following options are +supported:

+ +
+
allowedStartRules
+
Rules the parser will be allowed to start parsing from (default: the first + rule in the grammar).
+ +
cache
+
If true, makes the parser cache results, avoiding exponential + parsing time in pathological cases but making the parser slower (default: + false).
+ +
dependencies
+
Parser dependencies, the value is an object which maps variables used to + access the dependencies in the parser to module IDs used to load them; valid + only when format is set to "amd", + "commonjs", or "umd" (default: + {}).
+ +
exportVar
+
Name of a global variable into which the parser object is assigned to when + no module loader is detected; valid only when format is set to + "globals" or "umd" (default: + null).
+ +
format
+
format of the generated parser ("amd", "bare", + "commonjs", "globals", or "umd"); valid + only when output is set to "source" (default: + "bare").
+ +
optimize
+
Selects between optimizing the generated parser for parsing speed + ("speed") or code size ("size") (default: + "speed").
+ +
output
+
If set to "parser", the method will return generated parser + object; if set to "source", it will return parser source code as + a string (default: "parser").
+ +
plugins
+
Plugins to use.
+ +
trace
+
Makes the parser trace its progress (default: false).
+
+ +

Using the Parser

+ +

Using the generated parser is simple — just call its parse +method and pass an input string as a parameter. The method will return a parse +result (the exact value depends on the grammar used to generate the parser) or +throw an exception if the input is invalid. The exception will contain +location, expected, found and +message properties with more details about the error.

+ +
parser.parse("abba"); // returns ["a", "b", "b", "a"]
+
+parser.parse("abcd"); // throws an exception 
+ +

You can tweak parser behavior by passing a second parameter with an options +object to the parse method. The following options are +supported:

+ +
+
startRule
+
Name of the rule to start parsing from.
+ +
tracer
+
Tracer to use.
+
+ +

Parsers can also support their own custom options.

+ +

Grammar Syntax and Semantics

+ +

The grammar syntax is similar to JavaScript in that it is not line-oriented +and ignores whitespace between tokens. You can also use JavaScript-style +comments (// ... and /* ... */).

+ +

Let's look at example grammar that recognizes simple arithmetic expressions +like 2*(3+4). A parser generated from this grammar computes their +values.

+ +
start
+  = additive
+
+additive
+  = left:multiplicative "+" right:additive { return left + right; }
+  / multiplicative
+
+multiplicative
+  = left:primary "*" right:multiplicative { return left * right; }
+  / primary
+
+primary
+  = integer
+  / "(" additive:additive ")" { return additive; }
+
+integer "integer"
+  = digits:[0-9]+ { return parseInt(digits.join(""), 10); }
+ +

On the top level, the grammar consists of rules (in our example, +there are five of them). Each rule has a name (e.g. +integer) that identifies the rule, and a parsing +expression (e.g. digits:[0-9]+ { return parseInt(digits.join(""), +10); }) that defines a pattern to match against the input text and +possibly contains some JavaScript code that determines what happens when the +pattern matches successfully. A rule can also contain human-readable +name that is used in error messages (in our example, only the +integer rule has a human-readable name). The parsing starts at the +first rule, which is also called the start rule.

+ +

A rule name must be a JavaScript identifier. It is followed by an equality +sign (“=”) and a parsing expression. If the rule has a human-readable name, it +is written as a JavaScript string between the name and separating equality sign. +Rules need to be separated only by whitespace (their beginning is easily +recognizable), but a semicolon (“;”) after the parsing expression is +allowed.

+ +

The first rule can be preceded by an initializer — a piece of +JavaScript code in curly braces (“{” and “}”). This code is executed before the +generated parser starts parsing. All variables and functions defined in the +initializer are accessible in rule actions and semantic predicates. The code +inside the initializer can access options passed to the parser using the +options variable. Curly braces in the initializer code must be +balanced. Let's look at the example grammar from above using a simple +initializer.

+ +
{
+  function makeInteger(o) {
+    return parseInt(o.join(""), 10);
+  }
+}
+
+start
+  = additive
+
+additive
+  = left:multiplicative "+" right:additive { return left + right; }
+  / multiplicative
+
+multiplicative
+  = left:primary "*" right:multiplicative { return left * right; }
+  / primary
+
+primary
+  = integer
+  / "(" additive:additive ")" { return additive; }
+
+integer "integer"
+  = digits:[0-9]+ { return makeInteger(digits); }
+ +

The parsing expressions of the rules are used to match the input text to the +grammar. There are various types of expressions — matching characters or +character classes, indicating optional parts and repetition, etc. Expressions +can also contain references to other rules. See detailed +description below.

+ +

If an expression successfully matches a part of the text when running the +generated parser, it produces a match result, which is a JavaScript +value. For example:

+ +
    +
  • An expression matching a literal string produces a JavaScript string + containing matched text.
  • + +
  • An expression matching repeated occurrence of some subexpression produces + a JavaScript array with all the matches.
  • +
+ +

The match results propagate through the rules when the rule names are used in +expressions, up to the start rule. The generated parser returns start rule's +match result when parsing is successful.

+ +

One special case of parser expression is a parser action — a +piece of JavaScript code inside curly braces (“{” and “}”) that takes match +results of some of the the preceding expressions and returns a JavaScript value. +This value is considered match result of the preceding expression (in other +words, the parser action is a match result transformer).

+ +

In our arithmetics example, there are many parser actions. Consider the +action in expression digits:[0-9]+ { return parseInt(digits.join(""), 10); +}. It takes the match result of the expression [0-9]+, which is an array +of strings containing digits, as its parameter. It joins the digits together to +form a number and converts it to a JavaScript number object.

+ +

Parsing Expression Types

+ +

There are several types of parsing expressions, some of them containing +subexpressions and thus forming a recursive structure:

+ +
+
"literal"
'literal'
+ +
+

Match exact literal string and return it. The string syntax is the same + as in JavaScript. Appending i right after the literal makes the + match case-insensitive.

+
+ +
.
+ +
+

Match exactly one character and return it as a string.

+
+ +
[characters]
+ +
+

Match one character from a set and return it as a string. The characters + in the list can be escaped in exactly the same way as in JavaScript string. + The list of characters can also contain ranges (e.g. [a-z] + means “all lowercase letters”). Preceding the characters with ^ + inverts the matched set (e.g. [^a-z] means “all character but + lowercase letters”). Appending i right after the literal makes + the match case-insensitive.

+
+ +
rule
+ +
+

Match a parsing expression of a rule recursively and return its match + result.

+
+ +
( expression )
+ +
+

Match a subexpression and return its match result.

+
+ +
expression *
+ +
+

Match zero or more repetitions of the expression and return their match + results in an array. The matching is greedy, i.e. the parser tries to match + the expression as many times as possible. Unlike in regular expressions, + there is no backtracking.

+
+ +
expression +
+ +
+

Match one or more repetitions of the expression and return their match + results in an array. The matching is greedy, i.e. the parser tries to match + the expression as many times as possible. Unlike in regular expressions, + there is no backtracking.

+
+ +
expression ?
+ +
+

Try to match the expression. If the match succeeds, return its match + result, otherwise return null. Unlike in regular expressions, + there is no backtracking.

+
+ +
& expression
+ +
+

Try to match the expression. If the match succeeds, just return + undefined and do not consume any input, otherwise consider the + match failed.

+
+ +
! expression
+ +
+

Try to match the expression. If the match does not succeed, just return + undefined and do not consume any input, otherwise consider the + match failed.

+
+ +
& { predicate }
+ +
+

The predicate is a piece of JavaScript code that is executed as if it was + inside a function. It gets the match results of labeled expressions in + preceding expression as its arguments. It should return some JavaScript + value using the return statement. If the returned value + evaluates to true in boolean context, just return + undefined and do not consume any input; otherwise consider the + match failed.

+ +

The code inside the predicate can access all variables and functions + defined in the initializer at the beginning of the grammar.

+ +

The code inside the predicate can also access location information using + the location function. It returns an object like this:

+ +
{
+  start: { offset: 23, line: 5, column: 6 },
+  end:   { offset: 23, line: 5, column: 6 }
+}
+ +

The start and end properties both refer to the + current parse position. The offset property contains an offset + as a zero-based index and line and column + properties contain a line and a column as one-based indices.

+ +

The code inside the predicate can also access options passed to the + parser using the options variable.

+ +

Note that curly braces in the predicate code must be balanced.

+
+ +
! { predicate }
+ +
+

The predicate is a piece of JavaScript code that is executed as if it was + inside a function. It gets the match results of labeled expressions in + preceding expression as its arguments. It should return some JavaScript + value using the return statement. If the returned value + evaluates to false in boolean context, just return + undefined and do not consume any input; otherwise consider the + match failed.

+ +

The code inside the predicate can access all variables and functions + defined in the initializer at the beginning of the grammar.

+ +

The code inside the predicate can also access location information using + the location function. It returns an object like this:

+ +
{
+  start: { offset: 23, line: 5, column: 6 },
+  end:   { offset: 23, line: 5, column: 6 }
+}
+ +

The start and end properties both refer to the + current parse position. The offset property contains an offset + as a zero-based index and line and column + properties contain a line and a column as one-based indices.

+ +

The code inside the predicate can also access options passed to the + parser using the options variable.

+ +

Note that curly braces in the predicate code must be balanced.

+
+ +
$ expression
+ +
+

Try to match the expression. If the match succeeds, return the matched + text instead of the match result.

+
+ +
label : expression
+ +
+

Match the expression and remember its match result under given label. + The label must be a JavaScript identifier.

+ +

Labeled expressions are useful together with actions, where saved match + results can be accessed by action's JavaScript code.

+
+ +
expression1 expression2 ... expressionn
+ +
+

Match a sequence of expressions and return their match results in an array.

+
+ +
expression { action }
+ +
+

Match the expression. If the match is successful, run the action, + otherwise consider the match failed.

+ +

The action is a piece of JavaScript code that is executed as if it was + inside a function. It gets the match results of labeled expressions in + preceding expression as its arguments. The action should return some + JavaScript value using the return statement. This value is + considered match result of the preceding expression.

+ +

To indicate an error, the code inside the action can invoke the + expected function, which makes the parser throw an exception. + The function takes two parameters — a description of what was expected at + the current position and optional location information (the default is what + location would return — see below). The description will be + used as part of a message of the thrown exception.

+ +

The code inside an action can also invoke the error + function, which also makes the parser throw an exception. The function takes + two parameters — an error message and optional location information (the + default is what location would return — see below). The message + will be used by the thrown exception.

+ +

The code inside the action can access all variables and functions defined + in the initializer at the beginning of the grammar. Curly braces in the + action code must be balanced.

+ +

The code inside the action can also access the text matched by the + expression using the text function.

+ +

The code inside the action can also access location information using the + location function. It returns an object like this:

+ +
{
+  start: { offset: 23, line: 5, column: 6 },
+  end:   { offset: 25, line: 5, column: 8 }
+}
+ +

The start property refers to the position at the beginning + of the expression, the end property refers to position after + the end of the expression. The offset property contains an + offset as a zero-based index and line and column + properties contain a line and a column as one-based indices.

+ +

The code inside the action can also access options passed to the parser + using the options variable.

+ +

Note that curly braces in the action code must be balanced.

+
+ +
expression1 / expression2 / ... / expressionn
+ +
+

Try to match the first expression, if it does not succeed, try the second + one, etc. Return the match result of the first successfully matched + expression. If no expression matches, consider the match failed.

+
+
+ +

Compatibility

+ +

Both the parser generator and generated parsers should run well in the +following environments:

+ +
    +
  • Node.js 0.10.0+
  • +
  • Internet Explorer 8+
  • +
  • Edge
  • +
  • Firefox
  • +
  • Chrome
  • +
  • Safari
  • +
  • Opera
  • +
+ +
+ + +
+ + + + diff --git a/tools/pegjs.org/favicon.ico b/tools/pegjs.org/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4872223c9996058c2fba4183f204fd1bef3991d5 GIT binary patch literal 318 zcmah@K@NZ*3@gM3bQjM=FMP(A_z8cGT_A?bq@)biQ3@n2lG-=a1ndB+NU@0Ck8ocn vT5FNK>>mr1?vOtt!kCoI6pso^>SSJZ*OU!?JSe^9=o^nd^O5BrT%YG(e2g5O literal 0 HcmV?d00001 diff --git a/tools/pegjs.org/img/spinner-16x16-progress.gif b/tools/pegjs.org/img/spinner-16x16-progress.gif new file mode 100644 index 0000000000000000000000000000000000000000..a5b93871ebfd4965aa792eb50c682c0b126b4bee GIT binary patch literal 2227 zcmeH`Yfw`M7RPTwg5g;bAdmp|CIpfo2?-bEVL?bBJi;R(7ZeaTfdm37FA>74KyJuu zK>-oL#S$qCv^tj2>U2jJLC{?&q7?IIGboSm&nBpW|Ja!`;PpHCGEJ>ug%M8&b94Qxs`fWFMzyrWoH-*re?HM<67}{k*81dpFJy>n=5+$yy&N&N*5PZ%gf~}D;2A&l|TPn z`QbzL`ueAvo3-}#mQGIAuCBHqXy@r^Pp3QV-RqK{A5c*df*?GtHo{y~tEOffN$bN{~byYKRzJUKQyTlC^Z@$1(o z-n>z*tyOPq)NE|j5(pL!4wi9oo?CSp=V+uqpmJoqv16-$F#R^@g!Woo__0=?B&an zg@w}9)r$A;s~jDz^78y2KFnKRuc6Th^Yh1-mn+`AtNP`a>fe5=iH-G0PiK#hXHQP% z{Oc_LZ~uz~D4SLZk+6gxE{gPJbIed%GbtOac$r)QW|o7(V%hQBW4XmLFhP-*rBsy4 zKt@?v8T)8~OrD#cUBJ#)lrRCx2Mk~dYy#ffz}tTXnAZ<=6uwGj1dsHHJkuS4+S{>A z?|51V;3qnFr{&6+w2%{Kzo+TdjaF-nwd9Z8#_F(fQP!|{@G;NL3FN@M8i;Ozv14hO zWKRPQ^U+DTsReQ)(zLo*8Wm=+jIj;;H;{JJr6BP|F@`>{viBF?r-u`*dKW^V1B*B=9t5@WPKj~)BsGUe# zwn>xejAX=MbW2TjgOtg74TBE-4ug?W@b(^tt<^o;yFnW?+Ws^|w>?CKvahCpk)hPM zQ@=sn(o*>fwbJ{NANPe2ZM2QYzf#h*HMS zHYj(4H`O^VGM`yy6L`a@oSaZm1Pz1Hf5$Y|whhdg!u~5J1j8D=Mjjd}Hy|n%Buq<- zV?_$eG^*mlGL|!+#m58-It%x+G({Lpq@E?w%ZvFZ5MP$>DY*Dp{@237#8bi`bZ*4y zJEtf|#wXxQ23WZ7Xu;R&W)1ua%0FMHhK~zc)U+)>^SltaU<-O=%%KTnY!$cFu1PFA+&iVbI3Gfwwt#t-`Qo9v#Ti*l9iSh1AtqIoa%l*<2ss6oX(Zwhwk? zFziN>E^=%V;S<(sAFuQcoA_9?*BmBuxKmJvGYyZtwq}NFCpuB{<^X_d3rr9Vo5qqDEa`))4x2HZCD#LMKo2R|f>Olc~51 z{{i=Xx6oW90?B^9hxJe1X5JUB zLmwdY1nRX|0Si#41V-Ps(viaI3I4%9coNOBY{%a+2jbep(}FoA4E1P=CIf?ez?-fY zux%5pTQ5X;U*O@Xj1s%KABMOURA)55cIYgLzR)uIm@;g#wXqn-t)GzYWCX7N-_)~V z;bPd-fx;R=1YN%>HXFsd1*@`6sezo>j{yMF3i7kfKMRTpoD^L!m)j7`GA24cCp7+n zd{EWjx%B+b5VPR%g7k_6Bs*Cddhi2Ui&1)E+k`01T?Zqgv$%85dmEd&xydsmLLY6I z$+jd?!oZV5I!W!&Sl|QP-zaSD>;7~Li@q6MIstq!2$_^zs(^ripr9ZMg%T1H5*ivB9v&VU8M$fGrl_c>xVX54goMPz z#H6I8P{pPMtn|S|X9Ow6wIgwzjvopF4N1v$Inwm7YI;{=$U|GMP*+ zmn#&CuCA^tSFT*WdiB<=TX*l?{o#inluBh!PmfBa>h0~-YPACc1A~Ku_wL<$@ZiD2 zhYxi+-O$j`@bK`XM~|L9efsR#v!8$dS+CcRkB?7GOuT&ga%yU7dU|?hW@dJF_Vw%6 zZ{ECl`}XZGzx?v+ufP8G+i!DobMy1_@87>)SXlV|_uoH!`0&Rce=II8e*E}xX=&-x zr%#_hfBy5&KfiqW^7ZT2`}gk~7#P6ea3dolV`F0z6O(1jmMvet9D~8&a5y(NHzJWp zB9T_FUL6=1xNhCLu&}U*h=|RbH^;=pY}vA9+qP}-@$uWYZ{M+F$IhKQGcq#v?AcRP zRCMIXk)ubCR#jCUKYm;!5}i14qN%Cr%$YN1&z@~=Zf9rAwEtUAuPu`t|Pa z?%TI-fB*gWYPGtrukXhne|-G-@slS{Mn^}-#>SpMfBxddi^<8!SFc{Zd-u-J&=7?} zd3bpE`T6<#`%|e@CX<<+ot>ALck|{=jYi|;<>l?|?c?LKV#SKs*x20M+=_~d>gwvt zmoMMAaihP#|8JH5PaE#5ab$4JW*UVVO!6jzf!~hBeev3uoVp9kD#C{6Cg<(mw>vi( z8@X#wO2)2&WUT8qo8FoGlT&wRrS135+LiAHz@L=N01W{7xTY8(CR=ue zo0X=v`fgS_-vg!PuYu6}L(RPlAz>(eUOT{zYJ34V1ORdjY%jaA(3107Kt!u)L|)H@ zIEa}v1E;qH0KLHGCU`Mymjs>uF#a9BWgjE}1U&PTs_a-xZ7ODR-FAYO-2pxV^Y!fz z?()ct42mnRFFT7&+ztgO7)fV6>%9)*CKd4XE3WAA#vE)u8@%#_(N(U~fjTd4U~cj| zTcBBKxel>=hzdK!2OAd6m2_k=0+;Vt56hd6Jn0eF5BN$gn(CQ=tTt`7NOh@Rsx5Dg z@qeR-Iw)3{D{x&C>f=P&_{EIsYIsviD299I4d5-g}dn^~q3><}vR5t4)r4QwgN5xRW)UK_D2VtWd(Eby#!MMPs zSe%H8j+?CUR?WVw0*%GCA9vter&PFfbh9cALPJ{0tf^8h-;SDJ&Oxlna1Mif?>5tf zMo|qhFNfSv%hw5zR76r>A=)9c8z+d!mWg^=ZHfUKA~LOOz-G)z)FU(|RoT;FqZOqy ziZPU4>FU_=WCm|k@~WeekJN-_&YmXsnyl6l=?*S7oZbsf$H|(|tarq{mqLoihAi!5 zx1?qvXkNKBYj%SU%Nz*@LyiR|E*Up%-lV}pD8-!d2Iy73Q@F@S30|go`@OX*;Hat zLIqpW9%{^@Ua*jAY6nij0$;`13_k%iI9rX{!nE5i`=}5@fiTESI96yB_mf2hyUoCP zkoT7Bp{cuZ)jjgLxhAN2+&Ben&92!CCTU%wV}Ctpqz zRX-?jxS2ScvM|Ohfh-%|0=AIa-ZpX@1Rl-i#}Aw3O1%W^jw4z`SlM^#ZOq$EPk$|C^8@x0g`LTwUuu}K`W zwdkBME-NnhB-9{as){ioove>kxjG)R85OjV*UZm4QXT81VBx{nPbMm12Nshh0_O{} ztyLU|)@S!5<&i`7eTp{hfINB-?$_QDjk)4FKIm1<%h!51wa0_pPsA^1JQ-@qA)b|6 z{8f$Hh5Bqx=dzv_o{T{U!a_>gPwX}Nf$gjDP)6f$A=?@x?jF;YF%dp@EmDxU8`@K9 z2F@VYz`gTMbU8(3T?#hcz}|{<*g;=WX|oH=p`EzAHv$YYiwac7vWb-jZnlg%S z69avda2v9x2`Y@P6B(bjOSF#8pB3^AU`Su<8mMElhkvGLDGdo5hLa)G9ON}mj`0?| z`MDt+4QlE^HJZG3f10#II7(Q#x1NqI-!_)3*I#GgO3RxvsOJYlBk{#QuE9RiA&=kS z!mA}Kb;y%x_ZwEd?D8EFYSUVL38~=sdIWC5f{>~)Z7CH*O1$r>$I+_Bm0G}Hwk8XL z$PM6KQC)gwmV}`mmLE1hTb@}cfT6$$d^tah@Kx|xX|#cwKY=`|oq_(;)sR+lvMA{O zadS^$@sNsc^xf|Z>)IJet+hEDpdr3AhywcY3}IjZcAN)`$kE{r+?iu=g;){|V9tjr zLAxv#7#0uYIpsV-T>QmSaY_A3DR$wK9 zK&WxDwn>v`q z^*OosJR@*Phusk~zQ-~h&@{$$pz5-@=htM8iR@zU#P==ZCO}~5>!${}%dMtr%Dzi{ zUNB_k-*gCU(X(ulv3%cRvIv)QXHVH>QLcmFl5;Sv{;L!xt-FWzt}6(H-*k48guyi&C6OZD{EUbJ5HkVID z?bBFVMZ+|NPTBmRqXFc9Puah~mJ5*UnnvXfURZLbWt(;gYmc!brOvX!n>4k;)Euoc z*~u`@HQa)$n7qz0Hdx+OVEoQ;LZjb1; z{}6iMk1XL%=qCX9Nx9x3n*ZYRq3)TOmuQz^|F`Dud0QRK%vrX}zlP#;{*?_M@ z9i6vn>o0aVk=bO5%L*83>b#?L?MUd`_m1+UehJoVG{HQ4+k;p0>?2E!Ob5zNJ-L_5 zfLYd>z+PLG+CoquW0Td-$u!fuvvioN<+Mwvmrd5_csZ`$msRohOe~XYHjHe^vrrW# zQ@$Gb>kmLxQVC^#DE)=$B2L>}WDFcOTJ`4IANI9|B{v|ZK{{2iXF%09`#OWaGyPkA za~$@iz#0ruk3s=y{cy5lfCUMK%Tv~v(@EM_E`%+CYK_-r*A?Ly(~tOy<|A2v5SpMc zN8Qf2-!(%GR}N$}8OCau*eK>99$G*W_jcs^se)--ChoOIo^Rs__(D$5Z~`rjKzZf0 zcivxvF?K&;;&>IL1e78yS^b{O!WCAOqWt7C%S3AzhHu{~y_i;k0KpD|ZMwoOC$}oX zw+NNPunS`GP@=<_czc;&of|2{R74z9T22F7%kIPnx-)TGGtqG1anB^q?P;ejzU5@R zVgvqLdkFX53FCU#mO;Q!>z>g8XBs~|$Y$H`% zG+1L9gf=W$fmeswbN6O85R+3jQv5vpQ?>SzB zcjS}P5I^T&Ay!`;W-ZX8j7YP3t~ouHc?9<1kDY8YbcX2A+na{X#h}aC&6MXwGYN$+ z>kgjHM?|ID6^spa{~QdWbUIRbJVh_u1K9(uUT>?`n3!Vq1dwIBMGdZK6bGa8pNo{W zn}U>2Y3!<+KFh?(QKq$7_P`W0e`Edz%j~V=eFs5yoPMO&RV>7oHYagDiO3$;VYjQ} z43-rjcp8Kuu1~Ap-7IsXTs8?xtSt4xGBZA z;X^N={fUthK(T0X2bqfIM7YdsMW0Qm8=e8VKIUF(H7E_EVv%#cuoLk}QRXE`1||5^ zo*g27PDIrqul5Mn+%l-K|4#t;3tN{mz{?s?M$)$zw zzBAOB$^=%hs!Fz%k(qB9XuzEqtcKLpfFMw70L5rmQi2Yb{ui3^g?^EqG3)kq{mIv#n8S@&^|;OD{uCWH=AhT)6?W@qBV|+X`-JY+b|N zi7+)K=E2#LRfZGaS>(-hyaumeTHIxb)uj#7bUnKB1DQT)Feh7&d@nil`8AUsbR)s7 z@tQx&cDYNKV#2LPhw*QS>-cCO?fm6gcix+SY?SNHuD3FG290zwv*>s78xG-&%~aIA zS4YQ!-+%CqvgyiGMm#q(D5qu>&&7lqdwx9Jc4VgosoKQdmBSTLJYuFLMTJNZ2K$GLvdeq{iG z;kQmNSKFSg$k1WsAxhY{saC{BsOhO84oCeTGjRdF)R!UvL>GE|eF3i5ux&x!PuoJK zPKrs3i%lMl5t1p$^5P*Tc6mg=Il}kEkuvA)Ssw?8h>yAK20B!(CR@bObvROcqq8L< z2S;e4O-n*>w?+U)uB+a%n(!sO)|vVs;zFMz+w>I|yVjqr?11^pxemh5l)<+6%PJ8O z5n}{!jJZmJcQ!?ey9R@UL_)YX!j8qcP(PUqm&v2wPueyG4uX;qbriVdm@mp$u2kW5 zR%bFR;Km67`N0=9Q%`VlYskhIB_NZP;bs&)=PhklgPiRMp?6hS_5*R=on(EQfVgvV zB77g{r!M7PWBP0>{!n4=cP@u8fg6f+uBK}BEkW!fR9`j!Uj0fo;z0`s0l6oR3dYmuYvU{C_dh~UjP`st`?~1I~wfFk;>R}4u^|< znm7RV`x!7{56fCrvR@;+SRF^+uteKoSksInJ@<;3-P1$N2ZUl1Raf5DOG_j@6Dp;PaGEKIadPxy5 zOW`0UUavGM&W0M=g$3pJfulAwDoxT>@nF^~cvz}gW*|=kO)U6Gwl*!Dqd@c1W@rg?Eeg-XbKp2Mi0E5pu8FsVu4cKEuQ46#Q-D$MFfVsFIC z1m1a=onu6pt7(Tjoew^ZKh5Of%l%shAl;FY3iAoKXn|QidJMSC)PSn$XlNg}N4hzE z3*iG+D5&Rb^7XVj({nk%W-~etiTu&e7(&VRi~^f(P5Q*NCHMlSK(-0Evp8?w>5Imf zoT(ufkw9v{dBh~O4KL6p`CKN+y4%Uom_VR~u~j|;{-GWluZAdEIHYd(HtH#BtC4c6 zFxT<26kMl_MES2F>)-qgeCw=#d0pe18q(Uw<#S4b=CX-C9-mh-FlEf_q3@N&oM-LY z*jjCPuOU`1Ah&PaYGeXw-!&EH<(!PZqXMvp+C;es^eE%>L-(;Im|ZM?c<3U)wg;V& z@$^xmJsfZ3JA1B|<}7C&bN==f<-JvwKae7-KIwYp{%oeJOgh$9)n#Jgn|>V2Ez7ct zYf@MB`c!|}@yk&5gNuEY=RJ36&(%z}1=y;hI3GjAWRnuRMFduPf`2rv?gK}fEHRNe zeay8^uSajYu^1==y}D90X8KjxNQ1FjFlQCeS$gIk8g*m)3X(gvwCeQ}^VeU8pah1e zcTBN9wriTX$YZT>BeSugd;XlF9=rb*_nD zH)ey#7DZfaHrZ^M2Qk4;05(vrg|xODmG~NN_6hiV3RbqZlAX?m>=aTJv-m2~j)sD_9YwZ`7!sADFrAN^4C9a>44&9KUUe8`+OqJ2Q!PBKieY)K`hbI=8{m>`s3)z&e r`=5x0T@jf`d;fgNK0|+fi-OWO3W6Z769VTcg4x^i_lVz0&D#F}!h27a literal 0 HcmV?d00001 diff --git a/tools/pegjs.org/index.html b/tools/pegjs.org/index.html new file mode 100644 index 0000000..ab93aa9 --- /dev/null +++ b/tools/pegjs.org/index.html @@ -0,0 +1,100 @@ + + + + + + + + + PEG.js – Parser Generator for JavaScript + + + + + + + +
+ + + + +
+ + +
+

PEG.js is a simple parser generator for JavaScript that produces fast + parsers with excellent error reporting. You can use it to process complex data + or computer languages and build transformers, interpreters, compilers and + other tools easily.

+ +

Features

+ +
    +
  • Simple and expressive grammar syntax
  • + +
  • Integrates both lexical and syntactical analysis
  • + +
  • Parsers have excellent error reporting out of the box
  • + +
  • Based on parsing + expression grammar formalism — more powerful than traditional + LL(k) and LR(k) parsers
  • + +
  • Usable from your browser, + from the command line, or via JavaScript API
  • +
+
+ +
+ + +
+ + + + diff --git a/tools/pegjs.org/js/benchmark-bundle.js b/tools/pegjs.org/js/benchmark-bundle.js new file mode 100644 index 0000000..1995f31 --- /dev/null +++ b/tools/pegjs.org/js/benchmark-bundle.js @@ -0,0 +1,5917 @@ +var benchmark = (function () { + 'use strict'; + + function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; + } + + function _possibleConstructorReturn(self, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } + + return _assertThisInitialized(self); + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } + } + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + var GrammarError = function GrammarError(message, location) { + _classCallCheck(this, GrammarError); + + this.name = "GrammarError"; + this.message = message; + this.location = location; + + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, GrammarError); + } + }; + + var grammarError = GrammarError; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + function getCjsExportFromNamespace (n) { + return n && n.default || n; + } + + function findIndex(array, condition) { + for (var i = 0; i < array.length; ++i) { + if (condition(array[i], i)) return i; + } + + return -1; + } + + function find(array, condition) { + var index = findIndex(array, condition); + return index < 0 ? void 0 : array[index]; + } + + var arrays = { + findIndex: findIndex, + find: find + }; + + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + + function sourceEscape(s) { + return s.replace(/\0/g, "\\0").replace(/\x08/g, "\\b").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\v/g, "\\v").replace(/\f/g, "\\f").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { + return "\\x0" + hex(ch); + }).replace(/[\x10-\x1F\x7F-\xFF]/g, function (ch) { + return "\\x" + hex(ch); + }).replace(/[\u0100-\u0FFF]/g, function (ch) { + return "\\u0" + hex(ch); + }).replace(/[\u1000-\uFFFF]/g, function (ch) { + return "\\u" + hex(ch); + }); + } + + var js = { + stringEscape: function stringEscape(s) { + return sourceEscape(s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")); + }, + regexpEscape: function regexpEscape(s) { + return sourceEscape(s.replace(/\\/g, "\\\\").replace(/\//g, "\\/").replace(/]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-")); + }, + reservedWords: ["break", "case", "catch", "continue", "debugger", "default", "delete", "do", "else", "finally", "for", "function", "if", "in", "instanceof", "new", "return", "switch", "this", "throw", "try", "typeof", "var", "void", "while", "with", "class", "const", "enum", "export", "extends", "implements", "import", "interface", "let", "package", "private", "protected", "public", "static", "super", "yield", "false", "null", "true"] + }; + var js_1 = js; + + var __hasOwnProperty = Object.prototype.hasOwnProperty; + var objects = { + clone: function clone(source) { + var target = {}; + + for (var key in source) { + if (!__hasOwnProperty.call(source, key)) continue; + target[key] = source[key]; + } + + return target; + }, + each: function each(object, iterator) { + for (var key in object) { + if (!__hasOwnProperty.call(object, key)) continue; + iterator(object[key], key); + } + }, + extend: function extend(target, source) { + for (var key in source) { + if (!__hasOwnProperty.call(source, key)) continue; + if (__hasOwnProperty.call(target, key)) continue; + target[key] = source[key]; + } + + return target; + }, + map: function map(object, transformer) { + var target = {}; + + for (var key in object) { + if (!__hasOwnProperty.call(object, key)) continue; + target[key] = transformer(object[key], key); + } + + return target; + }, + values: function values(object, transformer) { + var target = []; + var index = -1; + var key, value; + + for (key in object) { + if (!__hasOwnProperty.call(object, key)) continue; + value = object[key]; + target[++index] = transformer ? transformer(value, key) : value; + } + + return target; + }, + enforceFastProperties: function enforceFastProperties(o) { + function Sub() {} + + Sub.prototype = o; + var receiver = new Sub(); + + function ic() { + return _typeof(receiver.foo); + } + + ic(); + ic(); + return o; + eval("o" + o); + } + }; + var objects_1 = objects; + + function evalModule(source, context) { + var argumentKeys = Object.keys(context); + var argumentValues = argumentKeys.map(function (argument) { + return context[argument]; + }); + var sandbox = { + exports: {} + }; + argumentKeys.push("module", "exports", source); + argumentValues.push(sandbox, sandbox.exports); + Function.apply(void 0, _toConsumableArray(argumentKeys)).apply(void 0, _toConsumableArray(argumentValues)); + return sandbox.exports; + } + + var vm = { + evalModule: evalModule + }; + + var util = createCommonjsModule(function (module, exports) { + + objects_1.extend(exports, arrays); + objects_1.extend(exports, js_1); + objects_1.extend(exports, objects_1); + objects_1.extend(exports, vm); + + exports.noop = function noop() {}; + + exports.convertPasses = function () { + function convertStage(passes) { + return Array.isArray(passes) ? passes : objects_1.values(passes); + } + + function convertPasses(stages) { + return objects_1.map(stages, convertStage); + } + + return convertPasses; + }(); + + exports.processOptions = function processOptions(options, defaults) { + var processedOptions = {}; + objects_1.extend(processedOptions, options); + objects_1.extend(processedOptions, defaults); + return processedOptions; + }; + }); + var util_1 = util.noop; + var util_2 = util.convertPasses; + var util_3 = util.processOptions; + + var ASTVisitor = function () { + function ASTVisitor() { + _classCallCheck(this, ASTVisitor); + } + + _createClass(ASTVisitor, [{ + key: "visit", + value: function visit(node) { + if (!node) throw new Error("Visitor function called with no arguments or a `falsy` node"); + var fn = this[node.type]; + if (!fn) throw new Error("Visitor function for node type \"".concat(node.type, "\" not defined")); + return fn.apply(this, arguments); + } + }]); + + return ASTVisitor; + }(); + + var visitor = { + ASTVisitor: ASTVisitor, + build: function build(functions) { + var visitor = new ASTVisitor(); + util.extend(visitor, functions); + visitor = util.enforceFastProperties(visitor); + return visitor.visit.bind(visitor); + } + }; + var on = ASTVisitor.on = { + property: function property(name) { + return function visitProperty(node) { + var value = node[name]; + + for (var _len = arguments.length, extraArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + extraArgs[_key - 1] = arguments[_key]; + } + + if (extraArgs.length) this.visit.apply(this, [value].concat(extraArgs));else this.visit(value); + }; + }, + children: function children(name) { + return function visitProperty(node) { + for (var _len2 = arguments.length, extraArgs = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + extraArgs[_key2 - 1] = arguments[_key2]; + } + + var children = node[name]; + var visitor = this; + var cb = extraArgs.length < 1 ? function withoutArgs(child) { + visitor.visit(child); + } : function withArgs(child) { + visitor.visit.apply(visitor, [child].concat(extraArgs)); + }; + children.forEach(cb); + }; + } + }; + var visitNop = util.noop; + var visitExpression = on.property("expression"); + var DEFAULT_FUNCTIONS = { + grammar: function grammar(node) { + var _this = this; + + for (var _len3 = arguments.length, extraArgs = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + extraArgs[_key3 - 1] = arguments[_key3]; + } + + if (node.initializer) { + this.visit.apply(this, [node.initializer].concat(extraArgs)); + } + + node.rules.forEach(function (rule) { + _this.visit.apply(_this, [rule].concat(extraArgs)); + }); + }, + initializer: visitNop, + rule: visitExpression, + named: visitExpression, + choice: on.children("alternatives"), + action: visitExpression, + sequence: on.children("elements"), + labeled: visitExpression, + text: visitExpression, + simple_and: visitExpression, + simple_not: visitExpression, + optional: visitExpression, + zero_or_more: visitExpression, + one_or_more: visitExpression, + group: visitExpression, + semantic_and: visitNop, + semantic_not: visitNop, + rule_ref: visitNop, + literal: visitNop, + class: visitNop, + any: visitNop + }; + util.each(DEFAULT_FUNCTIONS, function (fn, name) { + ASTVisitor.prototype[name] = fn; + }); + + var Node = function Node(type, location) { + _classCallCheck(this, Node); + + this.type = type; + this.location = location; + }; + + var Node_1 = Node; + + var Grammar = function (_Node) { + _inherits(Grammar, _Node); + + function Grammar(initializer, rules, comments, location) { + var _this; + + _classCallCheck(this, Grammar); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(Grammar).call(this, "grammar", location)); + _this.initializer = initializer; + _this.comments = comments; + _this.rules = rules; + _this._alwaysConsumesOnSuccess = new AlwaysConsumesOnSuccess(_assertThisInitialized(_assertThisInitialized(_this))); + return _this; + } + + _createClass(Grammar, [{ + key: "alwaysConsumesOnSuccess", + value: function alwaysConsumesOnSuccess(node) { + return this._alwaysConsumesOnSuccess.visit(node); + } + }, { + key: "findRule", + value: function findRule(name) { + return util.find(this.rules, function (rule) { + return rule.name === name; + }); + } + }, { + key: "indexOfRule", + value: function indexOfRule(name) { + return util.findIndex(this.rules, function (rule) { + return rule.name === name; + }); + } + }]); + + return Grammar; + }(Node_1); + + var Grammar_1 = Grammar; + + var AlwaysConsumesOnSuccess = function (_visitor$ASTVisitor) { + _inherits(AlwaysConsumesOnSuccess, _visitor$ASTVisitor); + + function AlwaysConsumesOnSuccess(ast) { + var _this2; + + _classCallCheck(this, AlwaysConsumesOnSuccess); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AlwaysConsumesOnSuccess).call(this)); + _this2.ast = ast; + return _this2; + } + + _createClass(AlwaysConsumesOnSuccess, [{ + key: "choice", + value: function choice(node) { + return node.alternatives.every(this.visit, this); + } + }, { + key: "sequence", + value: function sequence(node) { + return node.elements.some(this.visit, this); + } + }, { + key: "rule_ref", + value: function rule_ref(node) { + return this.visit(this.ast.findRule(node.name)); + } + }, { + key: "literal", + value: function literal(node) { + return node.value !== ""; + } + }]); + + return AlwaysConsumesOnSuccess; + }(visitor.ASTVisitor); + + function consumesTrue() { + return true; + } + + function consumesFalse() { + return false; + } + + function consumesExpression(node) { + return this.visit(node.expression); + } + + util.extend(AlwaysConsumesOnSuccess.prototype, { + rule: consumesExpression, + named: consumesExpression, + action: consumesExpression, + labeled: consumesExpression, + text: consumesExpression, + simple_and: consumesFalse, + simple_not: consumesFalse, + optional: consumesFalse, + zero_or_more: consumesFalse, + one_or_more: consumesExpression, + group: consumesExpression, + semantic_and: consumesFalse, + semantic_not: consumesFalse, + class: consumesTrue, + any: consumesTrue + }); + + var visitor$1 = visitor; + var Node$1 = Node_1; + var Grammar$1 = Grammar_1; + var ast = { + visitor: visitor$1, + Node: Node$1, + Grammar: Grammar$1 + }; + + function calcReportFailures(ast, session, options) { + ast.rules.forEach(function (rule) { + rule.reportFailures = false; + }); + var changedRules = options.allowedStartRules.map(function (name) { + var rule = ast.findRule(name); + rule.reportFailures = true; + return rule; + }); + var calc = session.buildVisitor({ + rule: function rule(node) { + calc(node.expression); + }, + named: function named() {}, + rule_ref: function rule_ref(node) { + var rule = ast.findRule(node.name); + + if (!rule.reportFailures) { + rule.reportFailures = true; + changedRules.push(rule); + } + } + }); + + while (changedRules.length > 0) { + calc(changedRules.pop()); + } + } + + var calcReportFailures_1 = calcReportFailures; + + function generateBytecode(ast, session) { + var op = session.opcodes; + var literals = []; + var classes = []; + var expectations = []; + var functions = []; + var generate; + + function addLiteralConst(value) { + var index = literals.indexOf(value); + return index === -1 ? literals.push(value) - 1 : index; + } + + function addClassConst(node) { + var cls = { + value: node.parts, + inverted: node.inverted, + ignoreCase: node.ignoreCase + }; + var pattern = JSON.stringify(cls); + var index = util.findIndex(classes, function (c) { + return JSON.stringify(c) === pattern; + }); + return index === -1 ? classes.push(cls) - 1 : index; + } + + function addExpectedConst(expected) { + var pattern = JSON.stringify(expected); + var index = util.findIndex(expectations, function (e) { + return JSON.stringify(e) === pattern; + }); + return index === -1 ? expectations.push(expected) - 1 : index; + } + + function addFunctionConst(predicate, params, code) { + var func = { + predicate: predicate, + params: params, + body: code + }; + var pattern = JSON.stringify(func); + var index = util.findIndex(functions, function (f) { + return JSON.stringify(f) === pattern; + }); + return index === -1 ? functions.push(func) - 1 : index; + } + + var buildSequence = function buildSequence() { + var _ref; + + return (_ref = []).concat.apply(_ref, arguments); + }; + + function buildCondition(match, condCode, thenCode, elseCode) { + if (match > 0) return thenCode; + if (match < 0) return elseCode; + return condCode.concat([thenCode.length, elseCode.length], thenCode, elseCode); + } + + function buildLoop(condCode, bodyCode) { + return condCode.concat([bodyCode.length], bodyCode); + } + + function buildCall(functionIndex, delta, env, sp) { + var params = util.values(env, function (value) { + return sp - value; + }); + return [op.CALL, functionIndex, delta, params.length].concat(params); + } + + function buildSimplePredicate(expression, negative, context) { + var match = expression.match | 0; + return buildSequence([op.PUSH_CURR_POS], [op.EXPECT_NS_BEGIN], generate(expression, { + sp: context.sp + 1, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }), [op.EXPECT_NS_END, negative ? 1 : 0], buildCondition(negative ? -match : match, [negative ? op.IF_ERROR : op.IF_NOT_ERROR], buildSequence([op.POP], [negative ? op.POP : op.POP_CURR_POS], [op.PUSH_UNDEFINED]), buildSequence([op.POP], [negative ? op.POP_CURR_POS : op.POP], [op.PUSH_FAILED]))); + } + + function buildSemanticPredicate(node, negative, context) { + var functionIndex = addFunctionConst(true, Object.keys(context.env), node.code); + return buildSequence([op.UPDATE_SAVED_POS], buildCall(functionIndex, 0, context.env, context.sp), buildCondition(node.match | 0, [op.IF], buildSequence([op.POP], negative ? [op.PUSH_FAILED] : [op.PUSH_UNDEFINED]), buildSequence([op.POP], negative ? [op.PUSH_UNDEFINED] : [op.PUSH_FAILED]))); + } + + function buildAppendLoop(expressionCode) { + return buildLoop([op.WHILE_NOT_ERROR], buildSequence([op.APPEND], expressionCode)); + } + + generate = session.buildVisitor({ + grammar: function grammar(node) { + node.rules.forEach(generate); + node.literals = literals; + node.classes = classes; + node.expectations = expectations; + node.functions = functions; + }, + rule: function rule(node) { + node.bytecode = generate(node.expression, { + sp: -1, + env: {}, + action: null, + reportFailures: node.reportFailures + }); + }, + named: function named(node, context) { + var nameIndex = context.reportFailures ? addExpectedConst({ + type: "rule", + value: node.name + }) : null; + var expressionCode = generate(node.expression, { + sp: context.sp, + env: context.env, + action: context.action, + reportFailures: false + }); + return context.reportFailures ? buildSequence([op.EXPECT, nameIndex], [op.SILENT_FAILS_ON], expressionCode, [op.SILENT_FAILS_OFF]) : expressionCode; + }, + choice: function choice(node, context) { + function buildAlternativesCode(alternatives, context) { + return buildSequence(generate(alternatives[0], { + sp: context.sp, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }), alternatives.length < 2 ? [] : buildCondition(-(alternatives[0].match | 0), [op.IF_ERROR], buildSequence([op.POP], buildAlternativesCode(alternatives.slice(1), context)), [])); + } + + return buildAlternativesCode(node.alternatives, context); + }, + action: function action(node, context) { + var env = util.clone(context.env); + var emitCall = node.expression.type !== "sequence" || node.expression.elements.length === 0; + var expressionCode = generate(node.expression, { + sp: context.sp + (emitCall ? 1 : 0), + env: env, + action: node, + reportFailures: context.reportFailures + }); + var match = node.expression.match | 0; + var functionIndex = emitCall && match >= 0 ? addFunctionConst(false, Object.keys(env), node.code) : null; + return emitCall === false ? expressionCode : buildSequence([op.PUSH_CURR_POS], expressionCode, buildCondition(match, [op.IF_NOT_ERROR], buildSequence([op.LOAD_SAVED_POS, 1], buildCall(functionIndex, 1, env, context.sp + 2)), []), [op.NIP]); + }, + sequence: function sequence(node, context) { + var TOTAL_ELEMENTS = node.elements.length; + + function buildElementsCode(elements, context) { + if (elements.length > 0) { + var processedCount = TOTAL_ELEMENTS - elements.slice(1).length; + return buildSequence(generate(elements[0], { + sp: context.sp, + env: context.env, + pluck: context.pluck, + action: null, + reportFailures: context.reportFailures + }), buildCondition(elements[0].match | 0, [op.IF_NOT_ERROR], buildElementsCode(elements.slice(1), { + sp: context.sp + 1, + env: context.env, + pluck: context.pluck, + action: context.action, + reportFailures: context.reportFailures + }), buildSequence(processedCount > 1 ? [op.POP_N, processedCount] : [op.POP], [op.POP_CURR_POS], [op.PUSH_FAILED]))); + } + + if (context.pluck.length > 0) return buildSequence([op.PLUCK, TOTAL_ELEMENTS + 1, context.pluck.length], context.pluck.map(function (eSP) { + return context.sp - eSP; + })); + if (context.action) return buildSequence([op.LOAD_SAVED_POS, TOTAL_ELEMENTS], buildCall(addFunctionConst(false, Object.keys(context.env), context.action.code), TOTAL_ELEMENTS + 1, context.env, context.sp)); + return buildSequence([op.WRAP, TOTAL_ELEMENTS], [op.NIP]); + } + + return buildSequence([op.PUSH_CURR_POS], buildElementsCode(node.elements, { + sp: context.sp + 1, + env: context.env, + pluck: [], + action: context.action, + reportFailures: context.reportFailures + })); + }, + labeled: function labeled(node, context) { + var env = context.env; + var label = node.label; + var sp = context.sp + 1; + + if (label !== null) { + env = util.clone(context.env); + context.env[label] = sp; + } + + if (context.pluck && node.pick) context.pluck.push(sp); + return generate(node.expression, { + sp: context.sp, + env: env, + action: null, + reportFailures: context.reportFailures + }); + }, + text: function text(node, context) { + return buildSequence([op.PUSH_CURR_POS], generate(node.expression, { + sp: context.sp + 1, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }), buildCondition(node.expression.match | 0, [op.IF_NOT_ERROR], buildSequence([op.POP], [op.TEXT]), [op.NIP])); + }, + simple_and: function simple_and(node, context) { + return buildSimplePredicate(node.expression, false, context); + }, + simple_not: function simple_not(node, context) { + return buildSimplePredicate(node.expression, true, context); + }, + optional: function optional(node, context) { + return buildSequence(generate(node.expression, { + sp: context.sp, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }), buildCondition(-(node.expression.match | 0), [op.IF_ERROR], buildSequence([op.POP], [op.PUSH_NULL]), [])); + }, + zero_or_more: function zero_or_more(node, context) { + var expressionCode = generate(node.expression, { + sp: context.sp + 1, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }); + return buildSequence([op.PUSH_EMPTY_ARRAY], expressionCode, buildAppendLoop(expressionCode), [op.POP]); + }, + one_or_more: function one_or_more(node, context) { + var expressionCode = generate(node.expression, { + sp: context.sp + 1, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }); + return buildSequence([op.PUSH_EMPTY_ARRAY], expressionCode, buildCondition(node.expression.match | 0, [op.IF_NOT_ERROR], buildSequence(buildAppendLoop(expressionCode), [op.POP]), buildSequence([op.POP], [op.POP], [op.PUSH_FAILED]))); + }, + group: function group(node, context) { + return generate(node.expression, { + sp: context.sp, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }); + }, + semantic_and: function semantic_and(node, context) { + return buildSemanticPredicate(node, false, context); + }, + semantic_not: function semantic_not(node, context) { + return buildSemanticPredicate(node, true, context); + }, + rule_ref: function rule_ref(node) { + return [op.RULE, ast.indexOfRule(node.name)]; + }, + literal: function literal(node, context) { + if (node.value.length > 0) { + var match = node.match | 0; + var needConst = match === 0 || match > 0 && !node.ignoreCase; + var stringIndex = needConst ? addLiteralConst(node.ignoreCase ? node.value.toLowerCase() : node.value) : null; + var expectedIndex = context.reportFailures ? addExpectedConst({ + type: "literal", + value: node.value, + ignoreCase: node.ignoreCase + }) : null; + return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(match, node.ignoreCase ? [op.MATCH_STRING_IC, stringIndex] : [op.MATCH_STRING, stringIndex], node.ignoreCase ? [op.ACCEPT_N, node.value.length] : [op.ACCEPT_STRING, stringIndex], [op.PUSH_FAILED])); + } + + return [op.PUSH_EMPTY_STRING]; + }, + class: function _class(node, context) { + var match = node.match | 0; + var classIndex = match === 0 ? addClassConst(node) : null; + var expectedIndex = context.reportFailures ? addExpectedConst({ + type: "class", + value: node.parts, + inverted: node.inverted, + ignoreCase: node.ignoreCase + }) : null; + return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(match, [op.MATCH_CLASS, classIndex], [op.ACCEPT_N, 1], [op.PUSH_FAILED])); + }, + any: function any(node, context) { + var expectedIndex = context.reportFailures ? addExpectedConst({ + type: "any" + }) : null; + return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(node.match | 0, [op.MATCH_ANY], [op.ACCEPT_N, 1], [op.PUSH_FAILED])); + } + }); + generate(ast); + } + + var generateBytecode_1 = generateBytecode; + + var _package = { + name: "pegjs", + version: "0.11.0-dev", + description: "Parser generator for JavaScript", + keywords: [ + "PEG.js", + "pegjs", + "grammar", + "parser", + "generator", + "language", + "PEG" + ], + homepage: "https://pegjs.org/", + repository: "pegjs/pegjs", + license: "MIT", + contributors: [ + "David Majda (https://majda.cz/)", + "Futago-za Ryuu " + ], + types: "typings/pegjs.d.ts", + main: "lib/peg.js", + bin: "bin/peg.js", + engines: { + node: ">= 6" + } + }; + + var _package$1 = /*#__PURE__*/Object.freeze({ + default: _package + }); + + var require$$0 = getCjsExportFromNamespace(_package$1); + + var VERSION = require$$0.version; + + function generateJS(ast, session, options) { + var op = session.opcodes; + var features = options.features || {}; + + function use(feature, use) { + return feature in features ? !!features[feature] : use == null ? true : !!use; + } + + var lineMatchRE = /^([^`\r\n]+?(?:`[^`]*?`[^\r\n]*?)?)$/gm; + + function indent2(code) { + return code.replace(lineMatchRE, " $1"); + } + + function indent10(code) { + return code.replace(lineMatchRE, " $1"); + } + + var l = function l(i) { + return "peg$c" + i; + }; + + var r = function r(i) { + return "peg$r" + i; + }; + + var e = function e(i) { + return "peg$e" + i; + }; + + var f = function f(i) { + return "peg$f" + i; + }; + + function generateTables() { + function buildLiteral(literal) { + return "\"".concat(util.stringEscape(literal), "\""); + } + + function buildRegexp(cls) { + return "/^[" + (cls.inverted ? "^" : "") + cls.value.map(function (part) { + return Array.isArray(part) ? util.regexpEscape(part[0]) + "-" + util.regexpEscape(part[1]) : util.regexpEscape(part); + }).join("") + "]/" + (cls.ignoreCase ? "i" : ""); + } + + function buildExpectation(e) { + switch (e.type) { + case "rule": + return "peg$otherExpectation(\"".concat(util.stringEscape(e.value), "\")"); + + case "literal": + return "peg$literalExpectation(\"" + util.stringEscape(e.value) + "\", " + e.ignoreCase + ")"; + + case "class": + { + var parts = e.value.map(function (part) { + return Array.isArray(part) ? "[\"".concat(util.stringEscape(part[0]), "\", \"").concat(util.stringEscape(part[1]), "\"]") : "\"".concat(util.stringEscape(part), "\""); + }); + return "peg$classExpectation([" + parts.join(", ") + "], " + e.inverted + ", " + e.ignoreCase + ")"; + } + + case "any": + return "peg$anyExpectation()"; + + default: + session.fatal("Unknown expectation type (".concat(JSON.stringify(e), ")")); + } + } + + function buildFunc(f) { + return "function(".concat(f.params.join(", "), ") {").concat(f.body, "}"); + } + + if (options.optimize === "size") { + return ["var peg$literals = [", indent2(ast.literals.map(buildLiteral).join(",\n")), "];", "var peg$regexps = [", indent2(ast.classes.map(buildRegexp).join(",\n")), "];", "var peg$expectations = [", indent2(ast.expectations.map(buildExpectation).join(",\n")), "];", "var peg$functions = [", indent2(ast.functions.map(buildFunc).join(",\n")), "];", "", "var peg$bytecode = [", indent2(ast.rules.map(function (rule) { + return "peg$decode(\"".concat(util.stringEscape(rule.bytecode.map(function (b) { + return String.fromCharCode(b + 32); + }).join("")), "\")"); + }).join(",\n")), "];"].join("\n"); + } + + return ast.literals.map(function (c, i) { + return "var " + l(i) + " = " + buildLiteral(c) + ";"; + }).concat("", ast.classes.map(function (c, i) { + return "var " + r(i) + " = " + buildRegexp(c) + ";"; + })).concat("", ast.expectations.map(function (c, i) { + return "var " + e(i) + " = " + buildExpectation(c) + ";"; + })).concat("", ast.functions.map(function (c, i) { + return "var " + f(i) + " = " + buildFunc(c) + ";"; + })).join("\n"); + } + + function generateRuleHeader(ruleNameCode, ruleIndexCode) { + var parts = []; + parts.push(["", "var rule$expects = function (expected) {", " if (peg$silentFails === 0) peg$expect(expected);", "}", ""].join("\n")); + + if (options.trace) { + parts.push(["peg$tracer.trace({", " type: \"rule.enter\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", "});", ""].join("\n")); + } + + if (options.cache) { + parts.push(["var key = peg$currPos * " + ast.rules.length + " + " + ruleIndexCode + ";", "var cached = peg$resultsCache[key];", "var rule$expectations = [];", "", "rule$expects = function (expected) {", " if (peg$silentFails === 0) peg$expect(expected);", " rule$expectations.push(expected);", "}", "", "if (cached) {", " peg$currPos = cached.nextPos;", "", " rule$expectations = cached.expectations;", " if (peg$silentFails === 0) {", " rule$expectations.forEach(peg$expect);", " }", ""].join("\n")); + + if (options.trace) { + parts.push(["if (cached.result !== peg$FAILED) {", " peg$tracer.trace({", " type: \"rule.match\",", " rule: " + ruleNameCode + ",", " result: cached.result,", " location: peg$computeLocation(startPos, peg$currPos)", " });", "} else {", " peg$tracer.trace({", " type: \"rule.fail\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", " });", "}", ""].join("\n")); + } + + parts.push([" return cached.result;", "}", ""].join("\n")); + } + + return parts.join("\n"); + } + + function generateRuleFooter(ruleNameCode, resultCode) { + var parts = []; + + if (options.cache) { + parts.push(["", "peg$resultsCache[key] = {", " nextPos: peg$currPos,", " result: " + resultCode + ",", " expectations: rule$expectations", "};"].join("\n")); + } + + if (options.trace) { + parts.push(["", "if (" + resultCode + " !== peg$FAILED) {", " peg$tracer.trace({", " type: \"rule.match\",", " rule: " + ruleNameCode + ",", " result: " + resultCode + ",", " location: peg$computeLocation(startPos, peg$currPos)", " });", "} else {", " peg$tracer.trace({", " type: \"rule.fail\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", " });", "}"].join("\n")); + } + + parts.push(["", "return " + resultCode + ";"].join("\n")); + return parts.join("\n"); + } + + function generateInterpreter() { + var parts = []; + + function generateCondition(cond, argsLength) { + var baseLength = argsLength + 3; + var thenLengthCode = "bc[ip + " + (baseLength - 2) + "]"; + var elseLengthCode = "bc[ip + " + (baseLength - 1) + "]"; + return ["ends.push(end);", "ips.push(ip + " + baseLength + " + " + thenLengthCode + " + " + elseLengthCode + ");", "", "if (" + cond + ") {", " end = ip + " + baseLength + " + " + thenLengthCode + ";", " ip += " + baseLength + ";", "} else {", " end = ip + " + baseLength + " + " + thenLengthCode + " + " + elseLengthCode + ";", " ip += " + baseLength + " + " + thenLengthCode + ";", "}", "", "break;"].join("\n"); + } + + function generateLoop(cond) { + var baseLength = 2; + var bodyLengthCode = "bc[ip + " + (baseLength - 1) + "]"; + return ["if (" + cond + ") {", " ends.push(end);", " ips.push(ip);", "", " end = ip + " + baseLength + " + " + bodyLengthCode + ";", " ip += " + baseLength + ";", "} else {", " ip += " + baseLength + " + " + bodyLengthCode + ";", "}", "", "break;"].join("\n"); + } + + function generateCall() { + var baseLength = 4; + var paramsLengthCode = "bc[ip + " + (baseLength - 1) + "]"; + return ["params = bc.slice(ip + " + baseLength + ", ip + " + baseLength + " + " + paramsLengthCode + ")", " .map(function(p) { return stack[stack.length - 1 - p]; });", "", "stack.splice(", " stack.length - bc[ip + 2],", " bc[ip + 2],", " peg$functions[bc[ip + 1]].apply(null, params)", ");", "", "ip += " + baseLength + " + " + paramsLengthCode + ";", "break;"].join("\n"); + } + + parts.push(["function peg$decode(s) {", " return s.split(\"\").map(function(ch) { return ch.charCodeAt(0) - 32; });", "}", "", "function peg$parseRule(index) {"].join("\n")); + + if (options.trace) { + parts.push([" var bc = peg$bytecode[index];", " var ip = 0;", " var ips = [];", " var end = bc.length;", " var ends = [];", " var stack = [];", " var startPos = peg$currPos;", " var params, paramsLength, paramsN;"].join("\n")); + } else { + parts.push([" var bc = peg$bytecode[index];", " var ip = 0;", " var ips = [];", " var end = bc.length;", " var ends = [];", " var stack = [];", " var params, paramsLength, paramsN;"].join("\n")); + } + + parts.push(indent2(generateRuleHeader("peg$ruleNames[index]", "index"))); + parts.push([" while (true) {", " while (ip < end) {", " switch (bc[ip]) {", " case " + op.PUSH_EMPTY_STRING + ":", " stack.push('');", " ip++;", " break;", "", " case " + op.PUSH_UNDEFINED + ":", " stack.push(undefined);", " ip++;", " break;", "", " case " + op.PUSH_NULL + ":", " stack.push(null);", " ip++;", " break;", "", " case " + op.PUSH_FAILED + ":", " stack.push(peg$FAILED);", " ip++;", " break;", "", " case " + op.PUSH_EMPTY_ARRAY + ":", " stack.push([]);", " ip++;", " break;", "", " case " + op.PUSH_CURR_POS + ":", " stack.push(peg$currPos);", " ip++;", " break;", "", " case " + op.POP + ":", " stack.pop();", " ip++;", " break;", "", " case " + op.POP_CURR_POS + ":", " peg$currPos = stack.pop();", " ip++;", " break;", "", " case " + op.POP_N + ":", " stack.length -= bc[ip + 1];", " ip += 2;", " break;", "", " case " + op.NIP + ":", " stack.splice(-2, 1);", " ip++;", " break;", "", " case " + op.APPEND + ":", " stack[stack.length - 2].push(stack.pop());", " ip++;", " break;", "", " case " + op.WRAP + ":", " stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1]));", " ip += 2;", " break;", "", " case " + op.TEXT + ":", " stack.push(input.substring(stack.pop(), peg$currPos));", " ip++;", " break;", "", " case " + op.PLUCK + ":", " paramsLength = bc[ip + 2];", " paramsN = 3 + paramsLength", "", " params = bc.slice(ip + 3, ip + paramsN);", " params = paramsLength === 1", " ? stack[stack.length - 1 - params[ 0 ]]", " : params.map(function(p) { return stack[stack.length - 1 - p]; });", "", " stack.splice(", " stack.length - bc[ip + 1],", " bc[ip + 1],", " params", " );", "", " ip += paramsN;", " break;", "", " case " + op.IF + ":", indent10(generateCondition("stack[stack.length - 1]", 0)), "", " case " + op.IF_ERROR + ":", indent10(generateCondition("stack[stack.length - 1] === peg$FAILED", 0)), "", " case " + op.IF_NOT_ERROR + ":", indent10(generateCondition("stack[stack.length - 1] !== peg$FAILED", 0)), "", " case " + op.WHILE_NOT_ERROR + ":", indent10(generateLoop("stack[stack.length - 1] !== peg$FAILED")), "", " case " + op.MATCH_ANY + ":", indent10(generateCondition("input.length > peg$currPos", 0)), "", " case " + op.MATCH_STRING + ":", indent10(generateCondition("input.substr(peg$currPos, peg$literals[bc[ip + 1]].length) === peg$literals[bc[ip + 1]]", 1)), "", " case " + op.MATCH_STRING_IC + ":", indent10(generateCondition("input.substr(peg$currPos, peg$literals[bc[ip + 1]].length).toLowerCase() === peg$literals[bc[ip + 1]]", 1)), "", " case " + op.MATCH_CLASS + ":", indent10(generateCondition("peg$regexps[bc[ip + 1]].test(input.charAt(peg$currPos))", 1)), "", " case " + op.ACCEPT_N + ":", " stack.push(input.substr(peg$currPos, bc[ip + 1]));", " peg$currPos += bc[ip + 1];", " ip += 2;", " break;", "", " case " + op.ACCEPT_STRING + ":", " stack.push(peg$literals[bc[ip + 1]]);", " peg$currPos += peg$literals[bc[ip + 1]].length;", " ip += 2;", " break;", "", " case " + op.EXPECT + ":", " rule$expects(peg$expectations[bc[ip + 1]]);", " ip += 2;", " break;", "", " case " + op.LOAD_SAVED_POS + ":", " peg$savedPos = stack[stack.length - 1 - bc[ip + 1]];", " ip += 2;", " break;", "", " case " + op.UPDATE_SAVED_POS + ":", " peg$savedPos = peg$currPos;", " ip++;", " break;", "", " case " + op.CALL + ":", indent10(generateCall()), "", " case " + op.RULE + ":", " stack.push(peg$parseRule(bc[ip + 1]));", " ip += 2;", " break;", "", " case " + op.SILENT_FAILS_ON + ":", " peg$silentFails++;", " ip++;", " break;", "", " case " + op.SILENT_FAILS_OFF + ":", " peg$silentFails--;", " ip++;", " break;", "", " case " + op.EXPECT_NS_BEGIN + ":", " peg$begin();", " ip++;", " break;", "", " case " + op.EXPECT_NS_END + ":", " peg$end(bc[ip + 1]);", " ip += 2;", " break;", "", " // istanbul ignore next", " default:", " throw new Error(", " \"Rule #\" + index + \"" + (options.trace ? " ('\" + peg$ruleNames[ index ] + \"')" : "") + ", position \" + ip + \": \"", " + \"Invalid opcode \" + bc[ip] + \".\"", " );", " }", " }", "", " if (ends.length > 0) {", " end = ends.pop();", " ip = ips.pop();", " } else {", " break;", " }", " }"].join("\n")); + parts.push(indent2(generateRuleFooter("peg$ruleNames[index]", "stack[0]"))); + parts.push("}"); + return parts.join("\n"); + } + + function generateRuleFunction(rule) { + var parts = []; + var stackVars = []; + + function s(i) { + if (i < 0) session.fatal("Rule '" + rule.name + "': Var stack underflow: attempt to use var at index " + i); + return "s" + i; + } + + var stack = { + sp: -1, + maxSp: -1, + push: function push(exprCode) { + var code = s(++this.sp) + " = " + exprCode + ";"; + if (this.sp > this.maxSp) this.maxSp = this.sp; + return code; + }, + pop: function pop(n) { + if (typeof n === "undefined") return s(this.sp--); + var values = Array(n); + + for (var i = 0; i < n; i++) { + values[i] = s(this.sp - n + 1 + i); + } + + this.sp -= n; + return values; + }, + top: function top() { + return s(this.sp); + }, + index: function index(i) { + return s(this.sp - i); + } + }; + + function compile(bc) { + var ip = 0; + var end = bc.length; + var parts = []; + var value; + + function compileCondition(cond, argCount) { + var pos = ip; + var baseLength = argCount + 3; + var thenLength = bc[ip + baseLength - 2]; + var elseLength = bc[ip + baseLength - 1]; + var baseSp = stack.sp; + var thenCode, elseCode, thenSp, elseSp; + ip += baseLength; + thenCode = compile(bc.slice(ip, ip + thenLength)); + thenSp = stack.sp; + ip += thenLength; + + if (elseLength > 0) { + stack.sp = baseSp; + elseCode = compile(bc.slice(ip, ip + elseLength)); + elseSp = stack.sp; + ip += elseLength; + + if (thenSp !== elseSp) { + session.fatal("Rule '" + rule.name + "', position " + pos + ": " + "Branches of a condition can't move the stack pointer differently " + "(before: " + baseSp + ", after then: " + thenSp + ", after else: " + elseSp + ")."); + } + } + + parts.push("if (" + cond + ") {"); + parts.push(indent2(thenCode)); + + if (elseLength > 0) { + parts.push("} else {"); + parts.push(indent2(elseCode)); + } + + parts.push("}"); + } + + function compileLoop(cond) { + var pos = ip; + var baseLength = 2; + var bodyLength = bc[ip + baseLength - 1]; + var baseSp = stack.sp; + var bodyCode, bodySp; + ip += baseLength; + bodyCode = compile(bc.slice(ip, ip + bodyLength)); + bodySp = stack.sp; + ip += bodyLength; + + if (bodySp !== baseSp) { + session.fatal("Rule '" + rule.name + "', position " + pos + ": " + "Body of a loop can't move the stack pointer " + "(before: " + baseSp + ", after: " + bodySp + ")."); + } + + parts.push("while (" + cond + ") {"); + parts.push(indent2(bodyCode)); + parts.push("}"); + } + + function compileCall() { + var baseLength = 4; + var paramsLength = bc[ip + baseLength - 1]; + var value = f(bc[ip + 1]) + "(" + bc.slice(ip + baseLength, ip + baseLength + paramsLength).map(function (p) { + return stack.index(p); + }).join(", ") + ")"; + stack.pop(bc[ip + 2]); + parts.push(stack.push(value)); + ip += baseLength + paramsLength; + } + + while (ip < end) { + switch (bc[ip]) { + case op.PUSH_EMPTY_STRING: + parts.push(stack.push("''")); + ip++; + break; + + case op.PUSH_CURR_POS: + parts.push(stack.push("peg$currPos")); + ip++; + break; + + case op.PUSH_UNDEFINED: + parts.push(stack.push("undefined")); + ip++; + break; + + case op.PUSH_NULL: + parts.push(stack.push("null")); + ip++; + break; + + case op.PUSH_FAILED: + parts.push(stack.push("peg$FAILED")); + ip++; + break; + + case op.PUSH_EMPTY_ARRAY: + parts.push(stack.push("[]")); + ip++; + break; + + case op.POP: + stack.pop(); + ip++; + break; + + case op.POP_CURR_POS: + parts.push("peg$currPos = " + stack.pop() + ";"); + ip++; + break; + + case op.POP_N: + stack.pop(bc[ip + 1]); + ip += 2; + break; + + case op.NIP: + value = stack.pop(); + stack.pop(); + parts.push(stack.push(value)); + ip++; + break; + + case op.APPEND: + value = stack.pop(); + parts.push(stack.top() + ".push(" + value + ");"); + ip++; + break; + + case op.WRAP: + parts.push(stack.push("[" + stack.pop(bc[ip + 1]).join(", ") + "]")); + ip += 2; + break; + + case op.TEXT: + parts.push(stack.push("input.substring(" + stack.pop() + ", peg$currPos)")); + ip++; + break; + + case op.PLUCK: + var baseLength = 3; + var paramsLength = bc[ip + baseLength - 1]; + var n = baseLength + paramsLength; + value = bc.slice(ip + baseLength, ip + n); + value = paramsLength === 1 ? stack.index(value[0]) : "[ ".concat(value.map(function (p) { + return stack.index(p); + }).join(", "), " ]"); + stack.pop(bc[ip + 1]); + parts.push(stack.push(value)); + ip += n; + break; + + case op.IF: + compileCondition(stack.top(), 0); + break; + + case op.IF_ERROR: + compileCondition(stack.top() + " === peg$FAILED", 0); + break; + + case op.IF_NOT_ERROR: + compileCondition(stack.top() + " !== peg$FAILED", 0); + break; + + case op.WHILE_NOT_ERROR: + compileLoop(stack.top() + " !== peg$FAILED", 0); + break; + + case op.MATCH_ANY: + compileCondition("input.length > peg$currPos", 0); + break; + + case op.MATCH_STRING: + compileCondition(ast.literals[bc[ip + 1]].length > 1 ? "input.substr(peg$currPos, " + ast.literals[bc[ip + 1]].length + ") === " + l(bc[ip + 1]) : "input.charCodeAt(peg$currPos) === " + ast.literals[bc[ip + 1]].charCodeAt(0), 1); + break; + + case op.MATCH_STRING_IC: + compileCondition("input.substr(peg$currPos, " + ast.literals[bc[ip + 1]].length + ").toLowerCase() === " + l(bc[ip + 1]), 1); + break; + + case op.MATCH_CLASS: + compileCondition(r(bc[ip + 1]) + ".test(input.charAt(peg$currPos))", 1); + break; + + case op.ACCEPT_N: + parts.push(stack.push(bc[ip + 1] > 1 ? "input.substr(peg$currPos, " + bc[ip + 1] + ")" : "input.charAt(peg$currPos)")); + parts.push(bc[ip + 1] > 1 ? "peg$currPos += " + bc[ip + 1] + ";" : "peg$currPos++;"); + ip += 2; + break; + + case op.ACCEPT_STRING: + parts.push(stack.push(l(bc[ip + 1]))); + parts.push(ast.literals[bc[ip + 1]].length > 1 ? "peg$currPos += " + ast.literals[bc[ip + 1]].length + ";" : "peg$currPos++;"); + ip += 2; + break; + + case op.EXPECT: + parts.push("rule$expects(" + e(bc[ip + 1]) + ");"); + ip += 2; + break; + + case op.LOAD_SAVED_POS: + parts.push("peg$savedPos = " + stack.index(bc[ip + 1]) + ";"); + ip += 2; + break; + + case op.UPDATE_SAVED_POS: + parts.push("peg$savedPos = peg$currPos;"); + ip++; + break; + + case op.CALL: + compileCall(); + break; + + case op.RULE: + parts.push(stack.push("peg$parse" + ast.rules[bc[ip + 1]].name + "()")); + ip += 2; + break; + + case op.SILENT_FAILS_ON: + parts.push("peg$silentFails++;"); + ip++; + break; + + case op.SILENT_FAILS_OFF: + parts.push("peg$silentFails--;"); + ip++; + break; + + case op.EXPECT_NS_BEGIN: + parts.push("peg$begin();"); + ip++; + break; + + case op.EXPECT_NS_END: + parts.push("peg$end(" + (bc[ip + 1] !== 0) + ");"); + ip += 2; + break; + + default: + session.fatal("Rule '" + rule.name + "', position " + ip + ": " + "Invalid opcode " + bc[ip] + "."); + } + } + + return parts.join("\n"); + } + + var code = compile(rule.bytecode); + parts.push("function peg$parse" + rule.name + "() {"); + + if (options.trace) { + parts.push(" var startPos = peg$currPos;"); + } + + for (var i = 0; i <= stack.maxSp; i++) { + stackVars[i] = s(i); + } + + parts.push(" var " + stackVars.join(", ") + ";"); + parts.push(indent2(generateRuleHeader("\"" + util.stringEscape(rule.name) + "\"", ast.indexOfRule(rule.name)))); + parts.push(indent2(code)); + parts.push(indent2(generateRuleFooter("\"" + util.stringEscape(rule.name) + "\"", s(0)))); + parts.push("}"); + return parts.join("\n"); + } + + function generateToplevel() { + var parts = []; + parts.push(["function peg$subclass(child, parent) {", " function C() { this.constructor = child; }", " C.prototype = parent.prototype;", " child.prototype = new C();", "}", "", "function peg$SyntaxError(message, expected, found, location) {", " this.message = message;", " this.expected = expected;", " this.found = found;", " this.location = location;", " this.name = \"SyntaxError\";", "", " // istanbul ignore next", " if (typeof Error.captureStackTrace === \"function\") {", " Error.captureStackTrace(this, peg$SyntaxError);", " }", "}", "", "peg$subclass(peg$SyntaxError, Error);", "", "peg$SyntaxError.buildMessage = function(expected, found) {", " var DESCRIBE_EXPECTATION_FNS = {", " literal: function(expectation) {", " return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";", " },", "", " class: function(expectation) {", " var escapedParts = expectation.parts.map(function(part) {", " return Array.isArray(part)", " ? classEscape(part[0]) + \"-\" + classEscape(part[1])", " : classEscape(part);", " });", "", " return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";", " },", "", " any: function() {", " return \"any character\";", " },", "", " end: function() {", " return \"end of input\";", " },", "", " other: function(expectation) {", " return expectation.description;", " },", "", " not: function(expectation) {", " return \"not \" + describeExpectation(expectation.expected);", " }", " };", "", " function hex(ch) {", " return ch.charCodeAt(0).toString(16).toUpperCase();", " }", "", " function literalEscape(s) {", " return s", " .replace(/\\\\/g, \"\\\\\\\\\")", " .replace(/\"/g, \"\\\\\\\"\")", " .replace(/\\0/g, \"\\\\0\")", " .replace(/\\t/g, \"\\\\t\")", " .replace(/\\n/g, \"\\\\n\")", " .replace(/\\r/g, \"\\\\r\")", " .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })", " .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });", " }", "", " function classEscape(s) {", " return s", " .replace(/\\\\/g, \"\\\\\\\\\")", " .replace(/\\]/g, \"\\\\]\")", " .replace(/\\^/g, \"\\\\^\")", " .replace(/-/g, \"\\\\-\")", " .replace(/\\0/g, \"\\\\0\")", " .replace(/\\t/g, \"\\\\t\")", " .replace(/\\n/g, \"\\\\n\")", " .replace(/\\r/g, \"\\\\r\")", " .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })", " .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });", " }", "", " function describeExpectation(expectation) {", " return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);", " }", "", " function describeExpected(expected) {", " var descriptions = expected.map(describeExpectation);", " var i, j;", "", " descriptions.sort();", "", " if (descriptions.length > 0) {", " for (i = 1, j = 1; i < descriptions.length; i++) {", " if (descriptions[i - 1] !== descriptions[i]) {", " descriptions[j] = descriptions[i];", " j++;", " }", " }", " descriptions.length = j;", " }", "", " switch (descriptions.length) {", " case 1:", " return descriptions[0];", "", " case 2:", " return descriptions[0] + \" or \" + descriptions[1];", "", " default:", " return descriptions.slice(0, -1).join(\", \")", " + \", or \"", " + descriptions[descriptions.length - 1];", " }", " }", "", " function describeFound(found) {", " return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";", " }", "", " return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";", "};", ""].join("\n")); + + if (options.trace) { + if (use("DefaultTracer")) parts.push(["function peg$DefaultTracer() {", " this.indentLevel = 0;", "}", "", "peg$DefaultTracer.prototype.trace = function(event) {", " var that = this;", "", " function log(event) {", " function repeat(string, n) {", " var result = \"\", i;", "", " for (i = 0; i < n; i++) {", " result += string;", " }", "", " return result;", " }", "", " function pad(string, length) {", " return string + repeat(\" \", length - string.length);", " }", "", " if (typeof console === \"object\") {", " console.log(", " event.location.start.line + \":\" + event.location.start.column + \"-\"", " + event.location.end.line + \":\" + event.location.end.column + \" \"", " + pad(event.type, 10) + \" \"", " + repeat(\" \", that.indentLevel) + event.rule", " );", " }", " }", "", " switch (event.type) {", " case \"rule.enter\":", " log(event);", " this.indentLevel++;", " break;", "", " case \"rule.match\":", " this.indentLevel--;", " log(event);", " break;", "", " case \"rule.fail\":", " this.indentLevel--;", " log(event);", " break;", "", " // istanbul ignore next", " default:", " throw new Error(\"Invalid event type: \" + event.type + \".\");", " }", "};", ""].join("\n"));else parts.push(["var peg$FauxTracer = {", " trace: function(event) { }", "};", ""].join("\n")); + } + + parts.push(["function peg$parse(input, options) {", " options = options !== undefined ? options : {};", "", " var peg$FAILED = {};", ""].join("\n")); + + if (options.optimize === "size") { + var startRuleIndices = "{ " + options.allowedStartRules.map(function (r) { + return r + ": " + ast.indexOfRule(r); + }).join(", ") + " }"; + var startRuleIndex = ast.indexOfRule(options.allowedStartRules[0]); + parts.push([" var peg$startRuleIndices = " + startRuleIndices + ";", " var peg$startRuleIndex = " + startRuleIndex + ";"].join("\n")); + } else { + var startRuleFunctions = "{ " + options.allowedStartRules.map(function (r) { + return r + ": peg$parse" + r; + }).join(", ") + " }"; + var startRuleFunction = "peg$parse" + options.allowedStartRules[0]; + parts.push([" var peg$startRuleFunctions = " + startRuleFunctions + ";", " var peg$startRuleFunction = " + startRuleFunction + ";"].join("\n")); + } + + parts.push(""); + parts.push(indent2(generateTables())); + parts.push(["", " var peg$currPos = 0;", " var peg$savedPos = 0;", " var peg$posDetailsCache = [{ line: 1, column: 1 }];", " var peg$expected = [];", " var peg$silentFails = 0;", ""].join("\n")); + + if (options.cache) { + parts.push([" var peg$resultsCache = {};", ""].join("\n")); + } + + if (options.trace) { + if (options.optimize === "size") { + var ruleNames = "[" + ast.rules.map(function (r) { + return "\"".concat(util.stringEscape(r.name), "\""); + }).join(", ") + "]"; + parts.push([" var peg$ruleNames = " + ruleNames + ";", ""].join("\n")); + } + + if (use("DefaultTracer")) parts.push([" var peg$tracer = \"tracer\" in options ? options.tracer : new peg$DefaultTracer();", ""].join("\n"));else parts.push([" var peg$tracer = \"tracer\" in options ? options.tracer : peg$FauxTracer;", ""].join("\n")); + } + + parts.push([" var peg$result;", ""].join("\n")); + + if (options.optimize === "size") { + parts.push([" if (\"startRule\" in options) {", " if (!(options.startRule in peg$startRuleIndices)) {", " throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");", " }", "", " peg$startRuleIndex = peg$startRuleIndices[options.startRule];", " }"].join("\n")); + } else { + parts.push([" if (\"startRule\" in options) {", " if (!(options.startRule in peg$startRuleFunctions)) {", " throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");", " }", "", " peg$startRuleFunction = peg$startRuleFunctions[options.startRule];", " }"].join("\n")); + } + + if (use("text")) { + parts.push(["", " function text() {", " return input.substring(peg$savedPos, peg$currPos);", " }"].join("\n")); + } + + if (use("offset")) { + parts.push(["", " function offset() {", " return peg$savedPos;", " }"].join("\n")); + } + + if (use("range")) { + parts.push(["", " function range() {", " return [peg$savedPos, peg$currPos];", " }"].join("\n")); + } + + if (use("location")) { + parts.push(["", " function location() {", " return peg$computeLocation(peg$savedPos, peg$currPos);", " }"].join("\n")); + } + + if (use("expected")) { + parts.push(["", " function expected(description, location) {", " location = location !== undefined", " ? location", " : peg$computeLocation(peg$savedPos, peg$currPos);", "", " throw peg$buildStructuredError(", " [peg$otherExpectation(description)],", " input.substring(peg$savedPos, peg$currPos),", " location", " );", " }"].join("\n")); + } + + if (use("error")) { + parts.push(["", " function error(message, location) {", " location = location !== undefined", " ? location", " : peg$computeLocation(peg$savedPos, peg$currPos);", "", " throw peg$buildSimpleError(message, location);", " }"].join("\n")); + } + + parts.push(["", " function peg$literalExpectation(text, ignoreCase) {", " return { type: \"literal\", text: text, ignoreCase: ignoreCase };", " }", "", " function peg$classExpectation(parts, inverted, ignoreCase) {", " return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };", " }", "", " function peg$anyExpectation() {", " return { type: \"any\" };", " }", "", " function peg$endExpectation() {", " return { type: \"end\" };", " }", "", " function peg$otherExpectation(description) {", " return { type: \"other\", description: description };", " }", "", " function peg$computePosDetails(pos) {", " var details = peg$posDetailsCache[pos];", " var p;", "", " if (details) {", " return details;", " } else {", " p = pos - 1;", " while (!peg$posDetailsCache[p]) {", " p--;", " }", "", " details = peg$posDetailsCache[p];", " details = {", " line: details.line,", " column: details.column", " };", "", " while (p < pos) {", " if (input.charCodeAt(p) === 10) {", " details.line++;", " details.column = 1;", " } else {", " details.column++;", " }", "", " p++;", " }", "", " peg$posDetailsCache[pos] = details;", "", " return details;", " }", " }", "", use("filename") ? " var peg$VALIDFILENAME = typeof options.filename === \"string\" && options.filename.length > 0;" : "", " function peg$computeLocation(startPos, endPos) {", " var loc = {};", "", use("filename") ? " if ( peg$VALIDFILENAME ) loc.filename = options.filename;" : "", "", " var startPosDetails = peg$computePosDetails(startPos);", " loc.start = {", " offset: startPos,", " line: startPosDetails.line,", " column: startPosDetails.column", " };", "", " var endPosDetails = peg$computePosDetails(endPos);", " loc.end = {", " offset: endPos,", " line: endPosDetails.line,", " column: endPosDetails.column", " };", "", " return loc;", " }", "", " function peg$begin() {", " peg$expected.push({ pos: peg$currPos, variants: [] });", " }", "", " function peg$expect(expected) {", " var top = peg$expected[peg$expected.length - 1];", "", " if (peg$currPos < top.pos) { return; }", "", " if (peg$currPos > top.pos) {", " top.pos = peg$currPos;", " top.variants = [];", " }", "", " top.variants.push(expected);", " }", "", " function peg$end(invert) {", " var expected = peg$expected.pop();", " var top = peg$expected[peg$expected.length - 1];", " var variants = expected.variants;", "", " if (top.pos !== expected.pos) { return; }", "", " if (invert) {", " variants = variants.map(function(e) {", " return e.type === \"not\" ? e.expected : { type: \"not\", expected: e };", " });", " }", "", " Array.prototype.push.apply(top.variants, variants);", " }", "", " function peg$buildSimpleError(message, location) {", " return new peg$SyntaxError(message, null, null, location);", " }", "", " function peg$buildStructuredError(expected, found, location) {", " return new peg$SyntaxError(", " peg$SyntaxError.buildMessage(expected, found),", " expected,", " found,", " location", " );", " }", "", " function peg$buildError() {", " var expected = peg$expected[0];", " var failPos = expected.pos;", "", " return peg$buildStructuredError(", " expected.variants,", " failPos < input.length ? input.charAt(failPos) : null,", " failPos < input.length", " ? peg$computeLocation(failPos, failPos + 1)", " : peg$computeLocation(failPos, failPos)", " );", " }", ""].join("\n")); + + if (options.optimize === "size") { + parts.push(indent2(generateInterpreter())); + parts.push(""); + } else { + ast.rules.forEach(function (rule) { + parts.push(indent2(generateRuleFunction(rule))); + parts.push(""); + }); + } + + if (ast.initializer) { + parts.push(indent2(ast.initializer.code)); + parts.push(""); + } + + parts.push(" peg$begin();"); + + if (options.optimize === "size") { + parts.push(" peg$result = peg$parseRule(peg$startRuleIndex);"); + } else { + parts.push(" peg$result = peg$startRuleFunction();"); + } + + parts.push(["", " if (peg$result !== peg$FAILED && peg$currPos === input.length) {", " return peg$result;", " } else {", " if (peg$result !== peg$FAILED && peg$currPos < input.length) {", " peg$expect(peg$endExpectation());", " }", "", " throw peg$buildError();", " }", "}"].join("\n")); + return parts.join("\n"); + } + + function generateWrapper(toplevelCode) { + function generateHeaderComment() { + var comment = "// Generated by PEG.js v".concat(VERSION, ", https://pegjs.org/"); + var header = options.header; + + if (typeof header === "string") { + comment += "\n\n" + header; + } else if (Array.isArray(header)) { + comment += "\n\n"; + header.forEach(function (data) { + comment += "// " + data; + }); + } + + return comment; + } + + function generateParserObject() { + return options.trace && use("DefaultTracer") ? ["{", " SyntaxError: peg$SyntaxError,", " DefaultTracer: peg$DefaultTracer,", " parse: peg$parse", "}"].join("\n") : ["{", " SyntaxError: peg$SyntaxError,", " parse: peg$parse", "}"].join("\n"); + } + + function generateParserExports() { + return options.trace && use("DefaultTracer") ? ["{", " peg$SyntaxError as SyntaxError,", " peg$DefaultTracer as DefaultTracer,", " peg$parse as parse", "}"].join("\n") : ["{", " peg$SyntaxError as SyntaxError,", " peg$parse as parse", "}"].join("\n"); + } + + var generators = { + bare: function bare() { + return [generateHeaderComment(), "(function() {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "})()"].join("\n"); + }, + commonjs: function commonjs() { + var parts = []; + var dependencyVars = Object.keys(options.dependencies); + parts.push([generateHeaderComment(), "", "\"use strict\";", ""].join("\n")); + + if (dependencyVars.length > 0) { + dependencyVars.forEach(function (variable) { + parts.push("var " + variable + " = require(\"" + util.stringEscape(options.dependencies[variable]) + "\");"); + }); + parts.push(""); + } + + parts.push([toplevelCode, "", "module.exports = " + generateParserObject() + ";", ""].join("\n")); + return parts.join("\n"); + }, + es: function es() { + var parts = []; + var dependencyVars = Object.keys(options.dependencies); + parts.push(generateHeaderComment(), ""); + + if (dependencyVars.length > 0) { + dependencyVars.forEach(function (variable) { + parts.push("import " + variable + " from \"" + util.stringEscape(options.dependencies[variable]) + "\";"); + }); + parts.push(""); + } + + parts.push(toplevelCode, "", "export " + generateParserExports() + ";", "", "export default " + generateParserObject() + ";", ""); + return parts.join("\n"); + }, + amd: function amd() { + var dependencyVars = Object.keys(options.dependencies); + var dependencyIds = dependencyVars.map(function (v) { + return options.dependencies[v]; + }); + var dependencies = "[" + dependencyIds.map(function (id) { + return "\"".concat(util.stringEscape(id), "\""); + }).join(", ") + "]"; + var params = dependencyVars.join(", "); + return [generateHeaderComment(), "define(" + dependencies + ", function(" + params + ") {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "});", ""].join("\n"); + }, + globals: function globals() { + return [generateHeaderComment(), "(function(root) {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("root." + options.exportVar + " = " + generateParserObject() + ";"), "})(this);", ""].join("\n"); + }, + umd: function umd() { + var parts = []; + var dependencyVars = Object.keys(options.dependencies); + var dependencyIds = dependencyVars.map(function (v) { + return options.dependencies[v]; + }); + var dependencies = "[" + dependencyIds.map(function (id) { + return "\"".concat(util.stringEscape(id), "\""); + }).join(", ") + "]"; + var requires = dependencyIds.map(function (id) { + return "require(\"".concat(util.stringEscape(id), "\")"); + }).join(", "); + var args = dependencyVars.map(function (v) { + return "root." + v; + }).join(", "); + var params = dependencyVars.join(", "); + parts.push([generateHeaderComment(), "(function(root, factory) {", " if (typeof define === \"function\" && define.amd) {", " define(" + dependencies + ", factory);", " } else if (typeof module === \"object\" && module.exports) {", " module.exports = factory(" + requires + ");"].join("\n")); + + if (options.exportVar !== null) { + parts.push([" } else {", " root." + options.exportVar + " = factory(" + args + ");"].join("\n")); + } + + parts.push([" }", "})(this, function(" + params + ") {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "});", ""].join("\n")); + return parts.join("\n"); + } + }; + return generators[options.format](); + } + + ast.code = generateWrapper(generateToplevel()); + } + + var generateJs = generateJS; + + function removeProxyRules(ast, session, options) { + function isProxyRule(node) { + return node.type === "rule" && node.expression.type === "rule_ref"; + } + + var replaceRuleRefs = session.buildVisitor({ + rule_ref: function rule_ref(node, proxy, real) { + if (node.name === proxy) node.name = real; + } + }); + var allowedStartRules = options.allowedStartRules; + var rules = []; + ast.rules.forEach(function (rule) { + if (isProxyRule(rule)) { + replaceRuleRefs(ast, rule.name, rule.expression.name); + if (allowedStartRules.indexOf(rule.name) < 0) return; + } + + rules.push(rule); + }); + ast.rules = rules; + } + + var removeProxyRules_1 = removeProxyRules; + + var __hasOwnProperty$1 = Object.prototype.hasOwnProperty; + + function reportDuplicateLabels(ast, session) { + var check; + + function checkExpressionWithClonedEnv(node, env) { + check(node.expression, util.clone(env)); + } + + check = session.buildVisitor({ + rule: function rule(node) { + check(node.expression, {}); + }, + choice: function choice(node, env) { + node.alternatives.forEach(function (alternative) { + check(alternative, util.clone(env)); + }); + }, + action: checkExpressionWithClonedEnv, + labeled: function labeled(node, env) { + var label = node.label; + + if (label && __hasOwnProperty$1.call(env, label)) { + var start = env[label].start; + session.error("Label \"".concat(label, "\" is already defined at line ").concat(start.line, ", column ").concat(start.column, "."), node.location); + } + + check(node.expression, env); + if (label) env[label] = node.location; + }, + text: checkExpressionWithClonedEnv, + simple_and: checkExpressionWithClonedEnv, + simple_not: checkExpressionWithClonedEnv, + optional: checkExpressionWithClonedEnv, + zero_or_more: checkExpressionWithClonedEnv, + one_or_more: checkExpressionWithClonedEnv, + group: checkExpressionWithClonedEnv + }); + check(ast); + } + + var reportDuplicateLabels_1 = reportDuplicateLabels; + + var __hasOwnProperty$2 = Object.prototype.hasOwnProperty; + + function reportDuplicateRules(ast, session) { + var rules = {}; + var check = session.buildVisitor({ + rule: function rule(node) { + var name = node.name; + + if (__hasOwnProperty$2.call(rules, name)) { + var start = rules[name].start; + session.error("Rule \"".concat(name, "\" is already defined at line ").concat(start.line, ", column ").concat(start.column, "."), node.location); + } + + rules[node.name] = node.location; + } + }); + check(ast); + } + + var reportDuplicateRules_1 = reportDuplicateRules; + + function reportUnusedRules(ast, session, options) { + var used = {}; + + function yes(node) { + used[node.name || node] = true; + } + + options.allowedStartRules.forEach(yes); + session.buildVisitor({ + rule_ref: yes + })(ast); + ast.rules.forEach(function (rule) { + if (used[rule.name] !== true) { + session.warn("Rule \"".concat(rule.name, "\" is not referenced."), rule.location); + } + }); + } + + var reportUnusedRules_1 = reportUnusedRules; + + function reportInfiniteRecursion(ast, session) { + var visitedRules = []; + var check = session.buildVisitor({ + rule: function rule(node) { + visitedRules.push(node.name); + check(node.expression); + visitedRules.pop(node.name); + }, + sequence: function sequence(node) { + node.elements.every(function (element) { + check(element); + return !ast.alwaysConsumesOnSuccess(element); + }); + }, + rule_ref: function rule_ref(node) { + if (visitedRules.indexOf(node.name) !== -1) { + visitedRules.push(node.name); + var rulePath = visitedRules.join(" -> "); + session.error("Possible infinite loop when parsing (left recursion: ".concat(rulePath, ")."), node.location); + } + + check(ast.findRule(node.name)); + } + }); + check(ast); + } + + var reportInfiniteRecursion_1 = reportInfiniteRecursion; + + function reportInfiniteRepetition(ast, session) { + var check = session.buildVisitor({ + zero_or_more: function zero_or_more(node) { + if (!ast.alwaysConsumesOnSuccess(node.expression)) { + session.error("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", node.location); + } + }, + one_or_more: function one_or_more(node) { + if (!ast.alwaysConsumesOnSuccess(node.expression)) { + session.error("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", node.location); + } + } + }); + check(ast); + } + + var reportInfiniteRepetition_1 = reportInfiniteRepetition; + + function reportUndefinedRules(ast, session, options) { + var check = session.buildVisitor({ + rule_ref: function rule_ref(node) { + if (!ast.findRule(node.name)) { + session.error("Rule \"".concat(node.name, "\" is not defined."), node.location); + } + } + }); + check(ast); + options.allowedStartRules.forEach(function (rule) { + if (!ast.findRule(rule)) { + session.error("Start rule \"".concat(rule, "\" is not defined.")); + } + }); + } + + var reportUndefinedRules_1 = reportUndefinedRules; + + function inferenceMatchResult(ast, session) { + var inference; + + function sometimesMatch(node) { + node.match = 0; + return node.match; + } + + function alwaysMatch(node) { + inference(node.expression); + node.match = 1; + return node.match; + } + + function inferenceExpression(node) { + node.match = inference(node.expression); + return node.match; + } + + function inferenceElements(elements, forChoice) { + var length = elements.length; + var always = 0; + var never = 0; + + for (var i = 0; i < length; ++i) { + var result = inference(elements[i]); + + if (result > 0) { + ++always; + } + + if (result < 0) { + ++never; + } + } + + if (always === length) { + return 1; + } + + if (forChoice) { + return never === length ? -1 : 0; + } + + return never > 0 ? -1 : 0; + } + + inference = session.buildVisitor({ + rule: function rule(node) { + var oldResult; + var count = 0; + + if (typeof node.match === "undefined") { + node.match = 0; + + do { + oldResult = node.match; + node.match = inference(node.expression); + + if (++count > 6) { + session.error("Infinity cycle detected when trying to evaluate node match result", node.location); + } + } while (oldResult !== node.match); + } + + return node.match; + }, + named: inferenceExpression, + choice: function choice(node) { + node.match = inferenceElements(node.alternatives, true); + return node.match; + }, + action: inferenceExpression, + sequence: function sequence(node) { + node.match = inferenceElements(node.elements, false); + return node.match; + }, + labeled: inferenceExpression, + text: inferenceExpression, + simple_and: inferenceExpression, + simple_not: function simple_not(node) { + node.match = -inference(node.expression); + return node.match; + }, + optional: alwaysMatch, + zero_or_more: alwaysMatch, + one_or_more: inferenceExpression, + group: inferenceExpression, + semantic_and: sometimesMatch, + semantic_not: sometimesMatch, + rule_ref: function rule_ref(node) { + var rule = ast.findRule(node.name); + node.match = inference(rule); + return node.match; + }, + literal: function literal(node) { + node.match = node.value.length === 0 ? 1 : 0; + return node.match; + }, + class: function _class(node) { + node.match = node.parts.length === 0 ? -1 : 0; + return node.match; + }, + any: sometimesMatch + }); + inference(ast); + } + + var inferenceMatchResult_1 = inferenceMatchResult; + + function isSemanticPredicate(element) { + var type = element.expression.type; + if (type === "semantic_and") return true; + if (type === "semantic_not") return true; + return false; + } + + function reportIncorrectPlucking(ast, session) { + session.buildVisitor({ + action: function action(node) { + this.visit(node.expression, true); + }, + labeled: function labeled(node, action) { + if (node.pick !== true) return void 0; + if (action === true) session.error("\"@\" cannot be used with an action block.", node.location); + if (isSemanticPredicate(node)) session.error("\"@\" cannot be used on a semantic predicate.", node.location); + this.visit(node.expression); + } + })(ast); + } + + var reportIncorrectPlucking_1 = reportIncorrectPlucking; + + var opcodes = { + PUSH_EMPTY_STRING: 0, + PUSH_UNDEFINED: 1, + PUSH_NULL: 2, + PUSH_FAILED: 3, + PUSH_EMPTY_ARRAY: 4, + PUSH_CURR_POS: 5, + POP: 6, + POP_CURR_POS: 7, + POP_N: 8, + NIP: 9, + APPEND: 10, + WRAP: 11, + TEXT: 12, + PLUCK: 41, + IF: 13, + IF_ERROR: 14, + IF_NOT_ERROR: 15, + WHILE_NOT_ERROR: 16, + MATCH_ANY: 17, + MATCH_STRING: 18, + MATCH_STRING_IC: 19, + MATCH_CLASS: 20, + ACCEPT_N: 21, + ACCEPT_STRING: 22, + EXPECT: 23, + LOAD_SAVED_POS: 24, + UPDATE_SAVED_POS: 25, + CALL: 26, + RULE: 27, + SILENT_FAILS_ON: 28, + SILENT_FAILS_OFF: 29, + EXPECT_NS_BEGIN: 38, + EXPECT_NS_END: 39 + }; + var opcodes_1 = opcodes; + + function peg$subclass(child, parent) { + function C() { + this.constructor = child; + } + + C.prototype = parent.prototype; + child.prototype = new C(); + } + + function peg$SyntaxError(message, expected, found, location) { + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; + + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, peg$SyntaxError); + } + } + + peg$subclass(peg$SyntaxError, Error); + + peg$SyntaxError.buildMessage = function (expected, found) { + var DESCRIBE_EXPECTATION_FNS = { + literal: function literal(expectation) { + return "\"" + literalEscape(expectation.text) + "\""; + }, + class: function _class(expectation) { + var escapedParts = expectation.parts.map(function (part) { + return Array.isArray(part) ? classEscape(part[0]) + "-" + classEscape(part[1]) : classEscape(part); + }); + return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; + }, + any: function any() { + return "any character"; + }, + end: function end() { + return "end of input"; + }, + other: function other(expectation) { + return expectation.description; + }, + not: function not(expectation) { + return "not " + describeExpectation(expectation.expected); + } + }; + + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + + function literalEscape(s) { + return s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { + return "\\x0" + hex(ch); + }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { + return "\\x" + hex(ch); + }); + } + + function classEscape(s) { + return s.replace(/\\/g, "\\\\").replace(/\]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { + return "\\x0" + hex(ch); + }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { + return "\\x" + hex(ch); + }); + } + + function describeExpectation(expectation) { + return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); + } + + function describeExpected(expected) { + var descriptions = expected.map(describeExpectation); + var i, j; + descriptions.sort(); + + if (descriptions.length > 0) { + for (i = 1, j = 1; i < descriptions.length; i++) { + if (descriptions[i - 1] !== descriptions[i]) { + descriptions[j] = descriptions[i]; + j++; + } + } + + descriptions.length = j; + } + + switch (descriptions.length) { + case 1: + return descriptions[0]; + + case 2: + return descriptions[0] + " or " + descriptions[1]; + + default: + return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1]; + } + } + + function describeFound(found) { + return found ? "\"" + literalEscape(found) + "\"" : "end of input"; + } + + return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; + }; + + function peg$parse(input, options) { + options = options !== undefined ? options : {}; + var peg$FAILED = {}; + var peg$startRuleFunctions = { + Grammar: peg$parseGrammar + }; + var peg$startRuleFunction = peg$parseGrammar; + var peg$c0 = "="; + var peg$c1 = "/"; + var peg$c2 = "@"; + var peg$c3 = ":"; + var peg$c4 = "$"; + var peg$c5 = "&"; + var peg$c6 = "!"; + var peg$c7 = "?"; + var peg$c8 = "*"; + var peg$c9 = "+"; + var peg$c10 = "("; + var peg$c11 = ")"; + var peg$c12 = "\t"; + var peg$c13 = "\v"; + var peg$c14 = "\f"; + var peg$c15 = " "; + var peg$c16 = "\xA0"; + var peg$c17 = "\uFEFF"; + var peg$c18 = "\n"; + var peg$c19 = "\r\n"; + var peg$c20 = "\r"; + var peg$c21 = "\u2028"; + var peg$c22 = "\u2029"; + var peg$c23 = "/*"; + var peg$c24 = "*/"; + var peg$c25 = "//"; + var peg$c26 = "_"; + var peg$c27 = "\\"; + var peg$c28 = "\u200C"; + var peg$c29 = "\u200D"; + var peg$c30 = "i"; + var peg$c31 = "\""; + var peg$c32 = "'"; + var peg$c33 = "["; + var peg$c34 = "^"; + var peg$c35 = "]"; + var peg$c36 = "-"; + var peg$c37 = "0"; + var peg$c38 = "b"; + var peg$c39 = "f"; + var peg$c40 = "n"; + var peg$c41 = "r"; + var peg$c42 = "t"; + var peg$c43 = "v"; + var peg$c44 = "x"; + var peg$c45 = "u"; + var peg$c46 = "."; + var peg$c47 = "{"; + var peg$c48 = "}"; + var peg$c49 = ";"; + var peg$r0 = /^[\n\r\u2028\u2029]/; + var peg$r1 = /^[0-9]/; + var peg$r2 = /^[0-9a-f]/i; + var peg$r3 = /^[{}]/; + var peg$r4 = /^[a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A]/; + var peg$r5 = /^[\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C-\uA69D\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3-\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E-\uFF9F]/; + var peg$r6 = /^[\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u09FC\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/; + var peg$r7 = /^[\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]/; + var peg$r8 = /^[A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uFF21-\uFF3A]/; + var peg$r9 = /^[\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E-\u094F\u0982-\u0983\u09BE-\u09C0\u09C7-\u09C8\u09CB-\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB-\u0ACC\u0B02-\u0B03\u0B3E\u0B40\u0B47-\u0B48\u0B4B-\u0B4C\u0B57\u0BBE-\u0BBF\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82-\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CD5-\u0CD6\u0D02-\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82-\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2-\u0DF3\u0F3E-\u0F3F\u0F7F\u102B-\u102C\u1031\u1038\u103B-\u103C\u1056-\u1057\u1062-\u1064\u1067-\u106D\u1083-\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7-\u17C8\u1923-\u1926\u1929-\u192B\u1930-\u1931\u1933-\u1938\u1A19-\u1A1A\u1A55\u1A57\u1A61\u1A63-\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43-\u1B44\u1B82\u1BA1\u1BA6-\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2-\u1BF3\u1C24-\u1C2B\u1C34-\u1C35\u1CE1\u1CF2-\u1CF3\u1CF7\u302E-\u302F\uA823-\uA824\uA827\uA880-\uA881\uA8B4-\uA8C3\uA952-\uA953\uA983\uA9B4-\uA9B5\uA9BA-\uA9BB\uA9BD-\uA9C0\uAA2F-\uAA30\uAA33-\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE-\uAAEF\uAAF5\uABE3-\uABE4\uABE6-\uABE7\uABE9-\uABEA\uABEC]/; + var peg$r10 = /^[\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962-\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2-\u09E3\u09FE\u0A01-\u0A02\u0A3C\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A51\u0A70-\u0A71\u0A75\u0A81-\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7-\u0AC8\u0ACD\u0AE2-\u0AE3\u0AFA-\u0AFF\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62-\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C04\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C62-\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC-\u0CCD\u0CE2-\u0CE3\u0D00-\u0D01\u0D3B-\u0D3C\u0D41-\u0D44\u0D4D\u0D62-\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86-\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039-\u103A\u103D-\u103E\u1058-\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17B4-\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885-\u1886\u18A9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193B\u1A17-\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80-\u1B81\u1BA2-\u1BA5\u1BA8-\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8-\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099-\u309A\uA66F\uA674-\uA67D\uA69E-\uA69F\uA6F0-\uA6F1\uA802\uA806\uA80B\uA825-\uA826\uA8C4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31-\uAA32\uAA35-\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7-\uAAB8\uAABE-\uAABF\uAAC1\uAAEC-\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/; + var peg$r11 = /^[0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]/; + var peg$r12 = /^[\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]/; + var peg$r13 = /^[_\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F]/; + var peg$r14 = /^[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/; + var peg$e0 = peg$literalExpectation("=", false); + var peg$e1 = peg$literalExpectation("/", false); + var peg$e2 = peg$literalExpectation("@", false); + var peg$e3 = peg$literalExpectation(":", false); + var peg$e4 = peg$literalExpectation("$", false); + var peg$e5 = peg$literalExpectation("&", false); + var peg$e6 = peg$literalExpectation("!", false); + var peg$e7 = peg$literalExpectation("?", false); + var peg$e8 = peg$literalExpectation("*", false); + var peg$e9 = peg$literalExpectation("+", false); + var peg$e10 = peg$literalExpectation("(", false); + var peg$e11 = peg$literalExpectation(")", false); + var peg$e12 = peg$anyExpectation(); + var peg$e13 = peg$otherExpectation("whitespace"); + var peg$e14 = peg$classExpectation(["\n", "\r", "\u2028", "\u2029"], false, false); + var peg$e15 = peg$otherExpectation("end of line"); + var peg$e16 = peg$otherExpectation("comment"); + var peg$e17 = peg$literalExpectation("/*", false); + var peg$e18 = peg$literalExpectation("*/", false); + var peg$e19 = peg$literalExpectation("//", false); + var peg$e20 = peg$otherExpectation("identifier"); + var peg$e21 = peg$otherExpectation("literal"); + var peg$e22 = peg$otherExpectation("string"); + var peg$e23 = peg$otherExpectation("character class"); + var peg$e24 = peg$literalExpectation(".", false); + var peg$e25 = peg$otherExpectation("code block"); + var peg$e26 = peg$literalExpectation(";", false); + + var peg$f0 = function peg$f0(initializer, rules) { + return new ast.Grammar(initializer, rules, comments, location()); + }; + + var peg$f1 = function peg$f1(code) { + return createNode("initializer", { + code: code + }); + }; + + var peg$f2 = function peg$f2(name, displayName, expression) { + if (displayName) expression = createNode("named", { + name: displayName, + expression: expression + }); + return createNode("rule", { + name: name, + expression: expression + }); + }; + + var peg$f3 = function peg$f3(head, tail) { + if (tail.length === 0) return head; + return createNode("choice", { + alternatives: [head].concat(tail) + }); + }; + + var peg$f4 = function peg$f4(expression, code) { + if (code === null) return expression; + return createNode("action", { + expression: expression, + code: code + }); + }; + + var peg$f5 = function peg$f5(head, tail) { + var elements = [head]; + + if (tail.length === 0) { + if (head.type !== "labeled" || !head.pick) return head; + } else { + elements = elements.concat(tail); + } + + return createNode("sequence", { + elements: elements + }); + }; + + var peg$f6 = function peg$f6(label, expression) { + return createNode("labeled", { + pick: pick, + label: label, + expression: expression + }); + }; + + var peg$f7 = function peg$f7(label, expression) { + return createNode("labeled", { + label: label, + expression: expression + }); + }; + + var peg$f8 = function peg$f8(name) { + if (RESERVED_WORDS[name] !== true) return name; + error("Label can't be a reserved word \"".concat(name, "\"."), location()); + }; + + var peg$f9 = function peg$f9(operator, expression) { + return createNode(operator, { + expression: expression + }); + }; + + var peg$f10 = function peg$f10() { + return "text"; + }; + + var peg$f11 = function peg$f11() { + return "simple_and"; + }; + + var peg$f12 = function peg$f12() { + return "simple_not"; + }; + + var peg$f13 = function peg$f13(expression, operator) { + return createNode(operator, { + expression: expression + }); + }; + + var peg$f14 = function peg$f14() { + return "optional"; + }; + + var peg$f15 = function peg$f15() { + return "zero_or_more"; + }; + + var peg$f16 = function peg$f16() { + return "one_or_more"; + }; + + var peg$f17 = function peg$f17(e) { + if (e.type !== "labeled" && e.type !== "sequence") return e; + return createNode("group", { + expression: e + }); + }; + + var peg$f18 = function peg$f18(name) { + return createNode("rule_ref", { + name: name + }); + }; + + var peg$f19 = function peg$f19(operator, code) { + return createNode(operator, { + code: code + }); + }; + + var peg$f20 = function peg$f20() { + return "semantic_and"; + }; + + var peg$f21 = function peg$f21() { + return "semantic_not"; + }; + + var peg$f22 = function peg$f22(comment) { + return addComment(comment, true); + }; + + var peg$f23 = function peg$f23(comment) { + return addComment(comment, false); + }; + + var peg$f24 = function peg$f24(head, tail) { + return head + tail.join(""); + }; + + var peg$f25 = function peg$f25(value, ignoreCase) { + return createNode("literal", { + value: value, + ignoreCase: ignoreCase !== null + }); + }; + + var peg$f26 = function peg$f26(chars) { + return chars.join(""); + }; + + var peg$f27 = function peg$f27(inverted, parts, ignoreCase) { + return createNode("class", { + parts: parts.filter(function (part) { + return part !== ""; + }), + inverted: inverted !== null, + ignoreCase: ignoreCase !== null + }); + }; + + var peg$f28 = function peg$f28(begin, end) { + if (begin.charCodeAt(0) > end.charCodeAt(0)) error("Invalid character range: " + text() + "."); + return [begin, end]; + }; + + var peg$f29 = function peg$f29() { + return ""; + }; + + var peg$f30 = function peg$f30() { + return "\0"; + }; + + var peg$f31 = function peg$f31() { + return "\b"; + }; + + var peg$f32 = function peg$f32() { + return "\f"; + }; + + var peg$f33 = function peg$f33() { + return "\n"; + }; + + var peg$f34 = function peg$f34() { + return "\r"; + }; + + var peg$f35 = function peg$f35() { + return "\t"; + }; + + var peg$f36 = function peg$f36() { + return "\v"; + }; + + var peg$f37 = function peg$f37(digits) { + return String.fromCharCode(parseInt(digits, 16)); + }; + + var peg$f38 = function peg$f38() { + return createNode("any"); + }; + + var peg$f39 = function peg$f39() { + error("Unbalanced brace."); + }; + + var peg$currPos = 0; + var peg$savedPos = 0; + var peg$posDetailsCache = [{ + line: 1, + column: 1 + }]; + var peg$expected = []; + var peg$silentFails = 0; + var peg$result; + + if ("startRule" in options) { + if (!(options.startRule in peg$startRuleFunctions)) { + throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + } + + peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; + } + + function text() { + return input.substring(peg$savedPos, peg$currPos); + } + + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } + + function error(message, location) { + location = location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos); + throw peg$buildSimpleError(message, location); + } + + function peg$literalExpectation(text, ignoreCase) { + return { + type: "literal", + text: text, + ignoreCase: ignoreCase + }; + } + + function peg$classExpectation(parts, inverted, ignoreCase) { + return { + type: "class", + parts: parts, + inverted: inverted, + ignoreCase: ignoreCase + }; + } + + function peg$anyExpectation() { + return { + type: "any" + }; + } + + function peg$endExpectation() { + return { + type: "end" + }; + } + + function peg$otherExpectation(description) { + return { + type: "other", + description: description + }; + } + + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos]; + var p; + + if (details) { + return details; + } else { + p = pos - 1; + + while (!peg$posDetailsCache[p]) { + p--; + } + + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column + }; + + while (p < pos) { + if (input.charCodeAt(p) === 10) { + details.line++; + details.column = 1; + } else { + details.column++; + } + + p++; + } + + peg$posDetailsCache[pos] = details; + return details; + } + } + + var peg$VALIDFILENAME = typeof options.filename === "string" && options.filename.length > 0; + + function peg$computeLocation(startPos, endPos) { + var loc = {}; + if (peg$VALIDFILENAME) loc.filename = options.filename; + var startPosDetails = peg$computePosDetails(startPos); + loc.start = { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }; + var endPosDetails = peg$computePosDetails(endPos); + loc.end = { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column + }; + return loc; + } + + function peg$begin() { + peg$expected.push({ + pos: peg$currPos, + variants: [] + }); + } + + function peg$expect(expected) { + var top = peg$expected[peg$expected.length - 1]; + + if (peg$currPos < top.pos) { + return; + } + + if (peg$currPos > top.pos) { + top.pos = peg$currPos; + top.variants = []; + } + + top.variants.push(expected); + } + + function peg$end(invert) { + var expected = peg$expected.pop(); + var top = peg$expected[peg$expected.length - 1]; + var variants = expected.variants; + + if (top.pos !== expected.pos) { + return; + } + + if (invert) { + variants = variants.map(function (e) { + return e.type === "not" ? e.expected : { + type: "not", + expected: e + }; + }); + } + + Array.prototype.push.apply(top.variants, variants); + } + + function peg$buildSimpleError(message, location) { + return new peg$SyntaxError(message, null, null, location); + } + + function peg$buildStructuredError(expected, found, location) { + return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected, found), expected, found, location); + } + + function peg$buildError() { + var expected = peg$expected[0]; + var failPos = expected.pos; + return peg$buildStructuredError(expected.variants, failPos < input.length ? input.charAt(failPos) : null, failPos < input.length ? peg$computeLocation(failPos, failPos + 1) : peg$computeLocation(failPos, failPos)); + } + + function peg$parseGrammar() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + s1 = peg$parse__(); + s2 = peg$currPos; + s3 = peg$parseInitializer(); + + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = null; + } + + s3 = []; + s4 = peg$currPos; + s5 = peg$parseRule(); + + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + s5 = peg$parseRule(); + + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f0(s2, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseInitializer() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$parseCodeBlock(); + + if (s1 !== peg$FAILED) { + s2 = peg$parseEOS(); + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f1(s1); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseRule() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$currPos; + s4 = peg$parseStringLiteral(); + + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 === peg$FAILED) { + s3 = null; + } + + rule$expects(peg$e0); + + if (input.charCodeAt(peg$currPos) === 61) { + s4 = peg$c0; + peg$currPos++; + } else { + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + s6 = peg$parseChoiceExpression(); + + if (s6 !== peg$FAILED) { + s7 = peg$parseEOS(); + + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f2(s1, s3, s6); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseChoiceExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parseActionExpression(); + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + rule$expects(peg$e1); + + if (input.charCodeAt(peg$currPos) === 47) { + s5 = peg$c1; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + s7 = peg$parseActionExpression(); + + if (s7 !== peg$FAILED) { + s3 = s7; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + rule$expects(peg$e1); + + if (input.charCodeAt(peg$currPos) === 47) { + s5 = peg$c1; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + s7 = peg$parseActionExpression(); + + if (s7 !== peg$FAILED) { + s3 = s7; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + + peg$savedPos = s0; + s0 = peg$f3(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseActionExpression() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseSequenceExpression(); + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$parse__(); + s4 = peg$parseCodeBlock(); + + if (s4 !== peg$FAILED) { + s2 = s4; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = null; + } + + peg$savedPos = s0; + s0 = peg$f4(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSequenceExpression() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parseLabeledExpression(); + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + s5 = peg$parseLabeledExpression(); + + if (s5 !== peg$FAILED) { + s3 = s5; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + s5 = peg$parseLabeledExpression(); + + if (s5 !== peg$FAILED) { + s3 = s5; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + + peg$savedPos = s0; + s0 = peg$f5(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLabeledExpression() { + var s0, s1, s2, s3, s4; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e2); + + if (input.charCodeAt(peg$currPos) === 64) { + s1 = peg$c2; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseLabelIdentifier(); + + if (s2 === peg$FAILED) { + s2 = null; + } + + s3 = peg$parse__(); + s4 = peg$parsePrefixedExpression(); + + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f6(s2, s4); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseLabelIdentifier(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parsePrefixedExpression(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f7(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parsePrefixedExpression(); + } + } + + return s0; + } + + function peg$parseLabelIdentifier() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + rule$expects(peg$e3); + + if (input.charCodeAt(peg$currPos) === 58) { + s3 = peg$c3; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f8(s1); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsePrefixedExpression() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsePrefixedOperator(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parseSuffixedExpression(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f9(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseSuffixedExpression(); + } + + return s0; + } + + function peg$parsePrefixedOperator() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e4); + + if (input.charCodeAt(peg$currPos) === 36) { + s1 = peg$c4; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f10(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e5); + + if (input.charCodeAt(peg$currPos) === 38) { + s1 = peg$c5; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f11(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e6); + + if (input.charCodeAt(peg$currPos) === 33) { + s1 = peg$c6; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f12(); + } + + s0 = s1; + } + } + + return s0; + } + + function peg$parseSuffixedExpression() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsePrimaryExpression(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parseSuffixedOperator(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f13(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parsePrimaryExpression(); + } + + return s0; + } + + function peg$parseSuffixedOperator() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e7); + + if (input.charCodeAt(peg$currPos) === 63) { + s1 = peg$c7; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f14(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e8); + + if (input.charCodeAt(peg$currPos) === 42) { + s1 = peg$c8; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f15(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e9); + + if (input.charCodeAt(peg$currPos) === 43) { + s1 = peg$c9; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f16(); + } + + s0 = s1; + } + } + + return s0; + } + + function peg$parsePrimaryExpression() { + var s0, s1, s2, s3, s4, s5; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$parseLiteralMatcher(); + + if (s0 === peg$FAILED) { + s0 = peg$parseCharacterClassMatcher(); + + if (s0 === peg$FAILED) { + s0 = peg$parseAnyMatcher(); + + if (s0 === peg$FAILED) { + s0 = peg$parseRuleReferenceExpression(); + + if (s0 === peg$FAILED) { + s0 = peg$parseSemanticPredicateExpression(); + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e10); + + if (input.charCodeAt(peg$currPos) === 40) { + s1 = peg$c10; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parseChoiceExpression(); + + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + rule$expects(peg$e11); + + if (input.charCodeAt(peg$currPos) === 41) { + s5 = peg$c11; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f17(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + } + } + + return s0; + } + + function peg$parseRuleReferenceExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$begin(); + s3 = peg$currPos; + s4 = peg$parse__(); + s5 = peg$currPos; + s6 = peg$parseStringLiteral(); + + if (s6 !== peg$FAILED) { + s7 = peg$parse__(); + s6 = [s6, s7]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 === peg$FAILED) { + s5 = null; + } + + rule$expects(peg$e0); + + if (input.charCodeAt(peg$currPos) === 61) { + s6 = peg$c0; + peg$currPos++; + } else { + s6 = peg$FAILED; + } + + if (s6 !== peg$FAILED) { + s4 = [s4, s5, s6]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + peg$end(true); + + if (s3 === peg$FAILED) { + s2 = undefined; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f18(s1); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSemanticPredicateExpression() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parseSemanticPredicateOperator(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parseCodeBlock(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f19(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSemanticPredicateOperator() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e5); + + if (input.charCodeAt(peg$currPos) === 38) { + s1 = peg$c5; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f20(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e6); + + if (input.charCodeAt(peg$currPos) === 33) { + s1 = peg$c6; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f21(); + } + + s0 = s1; + } + + return s0; + } + + function peg$parseSourceCharacter() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e12); + + if (input.length > peg$currPos) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseWhiteSpace() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e13); + peg$silentFails++; + + if (input.charCodeAt(peg$currPos) === 9) { + s0 = peg$c12; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 11) { + s0 = peg$c13; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 12) { + s0 = peg$c14; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 32) { + s0 = peg$c15; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 160) { + s0 = peg$c16; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 65279) { + s0 = peg$c17; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseZs(); + } + } + } + } + } + } + + peg$silentFails--; + return s0; + } + + function peg$parseLineTerminator() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e14); + + if (peg$r0.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLineTerminatorSequence() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e15); + peg$silentFails++; + + if (input.charCodeAt(peg$currPos) === 10) { + s0 = peg$c18; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c19) { + s0 = peg$c19; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 13) { + s0 = peg$c20; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8232) { + s0 = peg$c21; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8233) { + s0 = peg$c22; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + } + } + } + } + + peg$silentFails--; + return s0; + } + + function peg$parseComment() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e16); + peg$silentFails++; + s0 = peg$parseMultiLineComment(); + + if (s0 === peg$FAILED) { + s0 = peg$parseSingleLineComment(); + } + + peg$silentFails--; + return s0; + } + + function peg$parseMultiLineComment() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + + if (input.substr(peg$currPos, 2) === peg$c23) { + s1 = peg$c23; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s6 = peg$c24; + peg$currPos += 2; + } else { + s6 = peg$FAILED; + } + + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s6 = peg$c24; + peg$currPos += 2; + } else { + s6 = peg$FAILED; + } + + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } + + s2 = input.substring(s2, peg$currPos); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s3 = peg$c24; + peg$currPos += 2; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f22(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseMultiLineCommentNoLineTerminator() { + var s0, s1, s2, s3, s4, s5, s6; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e17); + + if (input.substr(peg$currPos, 2) === peg$c23) { + s1 = peg$c23; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + rule$expects(peg$e18); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s6 = peg$c24; + peg$currPos += 2; + } else { + s6 = peg$FAILED; + } + + if (s6 === peg$FAILED) { + s6 = peg$parseLineTerminator(); + } + + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + rule$expects(peg$e18); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s6 = peg$c24; + peg$currPos += 2; + } else { + s6 = peg$FAILED; + } + + if (s6 === peg$FAILED) { + s6 = peg$parseLineTerminator(); + } + + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } + + s2 = input.substring(s2, peg$currPos); + rule$expects(peg$e18); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s3 = peg$c24; + peg$currPos += 2; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f22(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSingleLineComment() { + var s0, s1, s2, s3, s4, s5, s6; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e19); + + if (input.substr(peg$currPos, 2) === peg$c25) { + s1 = peg$c25; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + s6 = peg$parseLineTerminator(); + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + s6 = peg$parseLineTerminator(); + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } + + s2 = input.substring(s2, peg$currPos); + peg$savedPos = s0; + s0 = peg$f23(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseIdentifier() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e20); + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parseIdentifierStart(); + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseIdentifierPart(); + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseIdentifierPart(); + } + + peg$savedPos = s0; + s0 = peg$f24(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$silentFails--; + return s0; + } + + function peg$parseIdentifierStart() { + var s0, s1, s2; + + s0 = peg$parseUnicodeLetter(); + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 36) { + s0 = peg$c4; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 95) { + s0 = peg$c26; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseUnicodeEscapeSequence(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + + return s0; + } + + function peg$parseIdentifierPart() { + var s0; + + s0 = peg$parseIdentifierStart(); + + if (s0 === peg$FAILED) { + s0 = peg$parseUnicodeCombiningMark(); + + if (s0 === peg$FAILED) { + s0 = peg$parseNd(); + + if (s0 === peg$FAILED) { + s0 = peg$parsePc(); + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8204) { + s0 = peg$c28; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8205) { + s0 = peg$c29; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + } + } + } + } + } + + return s0; + } + + function peg$parseUnicodeLetter() { + var s0; + + s0 = peg$parseLu(); + + if (s0 === peg$FAILED) { + s0 = peg$parseLl(); + + if (s0 === peg$FAILED) { + s0 = peg$parseLt(); + + if (s0 === peg$FAILED) { + s0 = peg$parseLm(); + + if (s0 === peg$FAILED) { + s0 = peg$parseLo(); + + if (s0 === peg$FAILED) { + s0 = peg$parseNl(); + } + } + } + } + } + + return s0; + } + + function peg$parseUnicodeCombiningMark() { + var s0; + + s0 = peg$parseMn(); + + if (s0 === peg$FAILED) { + s0 = peg$parseMc(); + } + + return s0; + } + + function peg$parseLiteralMatcher() { + var s0, s1, s2; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e21); + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parseStringLiteral(); + + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 105) { + s2 = peg$c30; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = null; + } + + peg$savedPos = s0; + s0 = peg$f25(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$silentFails--; + return s0; + } + + function peg$parseStringLiteral() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e22); + peg$silentFails++; + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 34) { + s1 = peg$c31; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseDoubleStringCharacter(); + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseDoubleStringCharacter(); + } + + if (input.charCodeAt(peg$currPos) === 34) { + s3 = peg$c31; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f26(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 39) { + s1 = peg$c32; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseSingleStringCharacter(); + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseSingleStringCharacter(); + } + + if (input.charCodeAt(peg$currPos) === 39) { + s3 = peg$c32; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f26(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$silentFails--; + return s0; + } + + function peg$parseDoubleStringCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$begin(); + + if (input.charCodeAt(peg$currPos) === 34) { + s2 = peg$c31; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s2 = peg$c27; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + } + + peg$end(true); + + if (s2 === peg$FAILED) { + s1 = undefined; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseLineContinuation(); + } + } + + return s0; + } + + function peg$parseSingleStringCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$begin(); + + if (input.charCodeAt(peg$currPos) === 39) { + s2 = peg$c32; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s2 = peg$c27; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + } + + peg$end(true); + + if (s2 === peg$FAILED) { + s1 = undefined; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseLineContinuation(); + } + } + + return s0; + } + + function peg$parseCharacterClassMatcher() { + var s0, s1, s2, s3, s4, s5; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e23); + peg$silentFails++; + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 91) { + s1 = peg$c33; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 94) { + s2 = peg$c34; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = null; + } + + s3 = []; + s4 = peg$parseCharacterPart(); + + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parseCharacterPart(); + } + + if (input.charCodeAt(peg$currPos) === 93) { + s4 = peg$c35; + peg$currPos++; + } else { + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 105) { + s5 = peg$c30; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 === peg$FAILED) { + s5 = null; + } + + peg$savedPos = s0; + s0 = peg$f27(s2, s3, s5); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$silentFails--; + return s0; + } + + function peg$parseCharacterPart() { + var s0; + + s0 = peg$parseClassCharacterRange(); + + if (s0 === peg$FAILED) { + s0 = peg$parseClassCharacter(); + } + + return s0; + } + + function peg$parseClassCharacterRange() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parseClassCharacter(); + + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 45) { + s2 = peg$c36; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 !== peg$FAILED) { + s3 = peg$parseClassCharacter(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f28(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseClassCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$begin(); + + if (input.charCodeAt(peg$currPos) === 93) { + s2 = peg$c35; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s2 = peg$c27; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + } + + peg$end(true); + + if (s2 === peg$FAILED) { + s1 = undefined; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseLineContinuation(); + } + } + + return s0; + } + + function peg$parseLineContinuation() { + var s0, s1, s2; + + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseLineTerminatorSequence(); + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f29(); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEscapeSequence() { + var s0, s1, s2, s3; + + s0 = peg$parseCharacterEscapeSequence(); + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 48) { + s1 = peg$c37; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$begin(); + s3 = peg$parseDecimalDigit(); + peg$end(true); + + if (s3 === peg$FAILED) { + s2 = undefined; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f30(); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseHexEscapeSequence(); + + if (s0 === peg$FAILED) { + s0 = peg$parseUnicodeEscapeSequence(); + } + } + } + + return s0; + } + + function peg$parseCharacterEscapeSequence() { + var s0; + + s0 = peg$parseSingleEscapeCharacter(); + + if (s0 === peg$FAILED) { + s0 = peg$parseNonEscapeCharacter(); + } + + return s0; + } + + function peg$parseSingleEscapeCharacter() { + var s0, s1; + + if (input.charCodeAt(peg$currPos) === 39) { + s0 = peg$c32; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 34) { + s0 = peg$c31; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s0 = peg$c27; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 98) { + s1 = peg$c38; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f31(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 102) { + s1 = peg$c39; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f32(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 110) { + s1 = peg$c40; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f33(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 114) { + s1 = peg$c41; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f34(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 116) { + s1 = peg$c42; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f35(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 118) { + s1 = peg$c43; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f36(); + } + + s0 = s1; + } + } + } + } + } + } + } + } + + return s0; + } + + function peg$parseNonEscapeCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$begin(); + s2 = peg$parseEscapeCharacter(); + + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + + peg$end(true); + + if (s2 === peg$FAILED) { + s1 = undefined; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEscapeCharacter() { + var s0; + + s0 = peg$parseSingleEscapeCharacter(); + + if (s0 === peg$FAILED) { + s0 = peg$parseDecimalDigit(); + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 120) { + s0 = peg$c44; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 117) { + s0 = peg$c45; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + } + } + } + + return s0; + } + + function peg$parseHexEscapeSequence() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 120) { + s1 = peg$c44; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$currPos; + s4 = peg$parseHexDigit(); + + if (s4 !== peg$FAILED) { + s5 = peg$parseHexDigit(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f37(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseUnicodeEscapeSequence() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 117) { + s1 = peg$c45; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$currPos; + s4 = peg$parseHexDigit(); + + if (s4 !== peg$FAILED) { + s5 = peg$parseHexDigit(); + + if (s5 !== peg$FAILED) { + s6 = peg$parseHexDigit(); + + if (s6 !== peg$FAILED) { + s7 = peg$parseHexDigit(); + + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f37(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseDecimalDigit() { + var s0; + + if (peg$r1.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseHexDigit() { + var s0; + + if (peg$r2.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseAnyMatcher() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e24); + + if (input.charCodeAt(peg$currPos) === 46) { + s1 = peg$c46; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f38(); + } + + s0 = s1; + return s0; + } + + function peg$parseCodeBlock() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e25); + peg$silentFails++; + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c47; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseCode(); + + if (input.charCodeAt(peg$currPos) === 125) { + s3 = peg$c48; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c47; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f39(); + } + + s0 = s1; + } + + peg$silentFails--; + return s0; + } + + function peg$parseCode() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = []; + s2 = []; + s3 = peg$currPos; + s4 = peg$currPos; + peg$begin(); + + if (peg$r3.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + peg$end(true); + + if (s5 === peg$FAILED) { + s4 = undefined; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$currPos; + peg$begin(); + + if (peg$r3.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + peg$end(true); + + if (s5 === peg$FAILED) { + s4 = undefined; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 123) { + s3 = peg$c47; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s4 = peg$parseCode(); + + if (input.charCodeAt(peg$currPos) === 125) { + s5 = peg$c48; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s3 = [s3, s4, s5]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } + + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = []; + s3 = peg$currPos; + s4 = peg$currPos; + peg$begin(); + + if (peg$r3.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + peg$end(true); + + if (s5 === peg$FAILED) { + s4 = undefined; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$currPos; + peg$begin(); + + if (peg$r3.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + peg$end(true); + + if (s5 === peg$FAILED) { + s4 = undefined; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 123) { + s3 = peg$c47; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s4 = peg$parseCode(); + + if (input.charCodeAt(peg$currPos) === 125) { + s5 = peg$c48; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s3 = [s3, s4, s5]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } + } + + s0 = input.substring(s0, peg$currPos); + return s0; + } + + function peg$parseLl() { + var s0; + + if (peg$r4.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLm() { + var s0; + + if (peg$r5.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLo() { + var s0; + + if (peg$r6.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLt() { + var s0; + + if (peg$r7.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLu() { + var s0; + + if (peg$r8.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseMc() { + var s0; + + if (peg$r9.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseMn() { + var s0; + + if (peg$r10.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNd() { + var s0; + + if (peg$r11.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNl() { + var s0; + + if (peg$r12.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsePc() { + var s0; + + if (peg$r13.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseZs() { + var s0; + + if (peg$r14.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parse__() { + var s0, s1; + + s0 = []; + s1 = peg$parseWhiteSpace(); + + if (s1 === peg$FAILED) { + s1 = peg$parseLineTerminatorSequence(); + + if (s1 === peg$FAILED) { + s1 = peg$parseComment(); + } + } + + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parseWhiteSpace(); + + if (s1 === peg$FAILED) { + s1 = peg$parseLineTerminatorSequence(); + + if (s1 === peg$FAILED) { + s1 = peg$parseComment(); + } + } + } + + return s0; + } + + function peg$parse_() { + var s0, s1; + + s0 = []; + s1 = peg$parseWhiteSpace(); + + if (s1 === peg$FAILED) { + s1 = peg$parseMultiLineCommentNoLineTerminator(); + } + + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parseWhiteSpace(); + + if (s1 === peg$FAILED) { + s1 = peg$parseMultiLineCommentNoLineTerminator(); + } + } + + return s0; + } + + function peg$parseEOS() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parse__(); + rule$expects(peg$e26); + + if (input.charCodeAt(peg$currPos) === 59) { + s2 = peg$c49; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse_(); + s2 = peg$parseSingleLineComment(); + + if (s2 === peg$FAILED) { + s2 = null; + } + + s3 = peg$parseLineTerminatorSequence(); + + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse__(); + s2 = peg$parseEOF(); + + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + + return s0; + } + + function peg$parseEOF() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + peg$begin(); + rule$expects(peg$e12); + + if (input.length > peg$currPos) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + peg$end(true); + + if (s1 === peg$FAILED) { + s0 = undefined; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + var pick = true; + var RESERVED_WORDS = {}; + var reservedWords = options.reservedWords || util.reservedWords; + if (Array.isArray(reservedWords)) reservedWords.forEach(function (word) { + RESERVED_WORDS[word] = true; + }); + + function createNode(type, details) { + var node = new ast.Node(type, location()); + if (details === null) return node; + util.extend(node, details); + return util.enforceFastProperties(node); + } + + var comments = options.extractComments ? {} : null; + + function addComment(text, multiline) { + if (options.extractComments) { + var loc = location(); + comments[loc.start.offset] = { + text: text, + multiline: multiline, + location: loc + }; + } + + return text; + } + + peg$begin(); + peg$result = peg$startRuleFunction(); + + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$expect(peg$endExpectation()); + } + + throw peg$buildError(); + } + } + + var parser = { + SyntaxError: peg$SyntaxError, + parse: peg$parse + }; + + function fatal(message, location) { + if (typeof location !== "undefined") throw new grammarError(message, location); + throw new Error(message); + } + + var Session = function () { + function Session(config) { + _classCallCheck(this, Session); + + config = typeof config !== "undefined" ? config : {}; + this.opcodes = config.opcodes || opcodes_1; + this.parser = config.parser || parser; + this.passes = config.passes || {}; + this.visitor = config.visitor || ast.visitor; + this.vm = config.vm || vm; + if (typeof config.warn === "function") this.warn = config.warn; + if (typeof config.error === "function") this.error = config.error; + Object.defineProperty(this, "fatal", { + value: fatal + }); + } + + _createClass(Session, [{ + key: "parse", + value: function parse(input, options) { + return this.parser.parse(input, options); + } + }, { + key: "buildVisitor", + value: function buildVisitor(functions) { + return this.visitor.build(functions); + } + }, { + key: "warn", + value: function warn(_message, _location) {} + }, { + key: "error", + value: function error(message, location) { + fatal(message, location); + } + }]); + + return Session; + }(); + + var session = Session; + + var compiler = { + Session: session, + passes: { + check: { + reportUndefinedRules: reportUndefinedRules_1, + reportDuplicateRules: reportDuplicateRules_1, + reportUnusedRules: reportUnusedRules_1, + reportDuplicateLabels: reportDuplicateLabels_1, + reportInfiniteRecursion: reportInfiniteRecursion_1, + reportInfiniteRepetition: reportInfiniteRepetition_1, + reportIncorrectPlucking: reportIncorrectPlucking_1 + }, + transform: { + removeProxyRules: removeProxyRules_1 + }, + generate: { + calcReportFailures: calcReportFailures_1, + inferenceMatchResult: inferenceMatchResult_1, + generateBytecode: generateBytecode_1, + generateJS: generateJs + } + }, + compile: function compile(ast, session$$1, options) { + options = typeof options !== "undefined" ? options : {}; + options = util.processOptions(options, { + allowedStartRules: [ast.rules[0].name], + cache: false, + context: {}, + dependencies: {}, + exportVar: null, + features: null, + format: "bare", + header: null, + optimize: "speed", + output: "parser", + trace: false + }); + if (options.output === "parser") options.format = "umd"; + util.each(session$$1.passes, function (stage) { + stage.forEach(function (pass) { + pass(ast, session$$1, options); + }); + }); + + switch (options.output) { + case "parser": + return session$$1.vm.evalModule(ast.code, options.context); + + case "source": + return ast.code; + + default: + session$$1.error("Invalid output format: ".concat(options.output, ".")); + } + } + }; + var compiler_1 = compiler; + + var peg = { + VERSION: require$$0.version, + GrammarError: grammarError, + ast: ast, + parser: parser, + compiler: compiler_1, + util: util, + generate: function generate(grammar, options) { + options = typeof options !== "undefined" ? options : {}; + var session = new compiler_1.Session({ + passes: util.convertPasses(compiler_1.passes) + }); + if (Array.isArray(options.plugins)) options.plugins.forEach(function (p) { + if (typeof p.use !== "function") return; + p.use(session, options); + }); + return compiler_1.compile(session.parse(grammar, options.parser || {}), session, options); + } + }; + var peg_1 = peg; + + var Runner = { + run: function run(benchmarks, runCount, options, callbacks) { + var Q = { + functions: [], + add: function add(f) { + this.functions.push(f); + }, + run: function run() { + if (this.functions.length > 0) { + this.functions.shift()(); + setTimeout(function () { + Q.run(); + }, 0); + } + } + }; + var state = {}; + + function initialize() { + callbacks.start(); + state.totalInputSize = 0; + state.totalParseTime = 0; + } + + function benchmarkInitializer(benchmark) { + return function () { + callbacks.benchmarkStart(benchmark); + state.parser = peg_1.generate(callbacks.readFile("examples/" + benchmark.id + ".pegjs"), options); + state.benchmarkInputSize = 0; + state.benchmarkParseTime = 0; + }; + } + + function testRunner(benchmark, test) { + return function () { + callbacks.testStart(benchmark, test); + var input = callbacks.readFile("benchmark/" + benchmark.id + "/" + test.file); + var parseTime = 0; + + for (var i = 0; i < runCount; i++) { + var t = new Date().getTime(); + state.parser.parse(input); + parseTime += new Date().getTime() - t; + } + + var averageParseTime = parseTime / runCount; + callbacks.testFinish(benchmark, test, input.length, averageParseTime); + state.benchmarkInputSize += input.length; + state.benchmarkParseTime += averageParseTime; + }; + } + + function benchmarkFinalizer(benchmark) { + return function () { + callbacks.benchmarkFinish(benchmark, state.benchmarkInputSize, state.benchmarkParseTime); + state.totalInputSize += state.benchmarkInputSize; + state.totalParseTime += state.benchmarkParseTime; + }; + } + + function finalize() { + callbacks.finish(state.totalInputSize, state.totalParseTime); + } + + Q.add(initialize); + benchmarks.forEach(function (benchmark) { + Q.add(benchmarkInitializer(benchmark)); + benchmark.tests.forEach(function (test) { + Q.add(testRunner(benchmark, test)); + }); + Q.add(benchmarkFinalizer(benchmark)); + }); + Q.add(finalize); + Q.run(); + } + }; + var runner = Runner; + + var benchmarks = [{ + id: "json", + title: "JSON", + tests: [{ + file: "example1.json", + title: "Example 1" + }, { + file: "example2.json", + title: "Example 2" + }, { + file: "example3.json", + title: "Example 3" + }, { + file: "example4.json", + title: "Example 4" + }, { + file: "example5.json", + title: "Example 5" + }] + }, { + id: "css", + title: "CSS", + tests: [{ + file: "960.gs/min/960_24_col.css", + title: "960.gs - 960_24_col.css (minified)" + }, { + file: "960.gs/min/960.css", + title: "960.gs - 960.css (minified)" + }, { + file: "960.gs/min/reset.css", + title: "960.gs - reset.css (minified)" + }, { + file: "960.gs/min/text.css", + title: "960.gs - text.css (minified)" + }, { + file: "960.gs/src/960_24_col.css", + title: "960.gs - 960_24_col.css (source)" + }, { + file: "960.gs/src/960.css", + title: "960.gs - 960.css (source)" + }, { + file: "960.gs/src/reset.css", + title: "960.gs - reset.css (source)" + }, { + file: "960.gs/src/text.css", + title: "960.gs - text.css (source)" + }, { + file: "blueprint/min/print.css", + title: "Blueprint - print.css (minified)" + }, { + file: "blueprint/min/screen.css", + title: "Blueprint - screen.css (minified)" + }, { + file: "blueprint/src/forms.css", + title: "Blueprint - forms.css (source)" + }, { + file: "blueprint/src/grid.css", + title: "Blueprint - grid.css (source)" + }, { + file: "blueprint/src/print.css", + title: "Blueprint - print.css (source)" + }, { + file: "blueprint/src/reset.css", + title: "Blueprint - reset.css (source)" + }, { + file: "blueprint/src/typography.css", + title: "Blueprint - typography.css (source)" + }] + }]; + var benchmarks_1 = benchmarks; + + $("#run").click(function () { + var resultsTable = $("#results-table"); + + function appendResult(klass, title, url, inputSize, parseTime) { + var KB = 1024; + var MS_IN_S = 1000; + resultsTable.append("\n \n \n ").concat(url !== null ? "" : "", "\n ").concat(title, "\n ").concat(url !== null ? "" : "", "\n \n \n \n ").concat((inputSize / KB).toFixed(2), "\n \n  kB\n \n \n \n ").concat(parseTime.toFixed(2), "\n \n  ms\n \n \n \n ").concat((inputSize / KB / (parseTime / MS_IN_S)).toFixed(2), "\n \n  kB/s\n \n \n ")); + } + + var runCount = parseInt($("#run-count").val(), 10); + var options = { + cache: $("#cache").is(":checked"), + optimize: $("#optimize").val() + }; + + if (isNaN(runCount) || runCount <= 0) { + alert("Number of runs must be a positive integer."); + return; + } + + runner.run(benchmarks_1, runCount, options, { + readFile: function readFile(file) { + return $.ajax({ + type: "GET", + url: "/" + file, + dataType: "text", + async: false + }).responseText; + }, + testStart: function testStart() {}, + testFinish: function testFinish(benchmark, test, inputSize, parseTime) { + appendResult("individual", test.title, "benchmark/" + benchmark.id + "/" + test.file, inputSize, parseTime); + }, + benchmarkStart: function benchmarkStart(benchmark) { + resultsTable.append("\n \n \n ").concat(benchmark.title, " \n \n \"\n ")); + }, + benchmarkFinish: function benchmarkFinish(benchmark, inputSize, parseTime) { + appendResult("benchmark-total", benchmark.title + " total", null, inputSize, parseTime); + }, + start: function start() { + $("#run-count, #cache, #run").attr("disabled", "disabled"); + resultsTable.show(); + $("#results-table tr").slice(1).remove(); + }, + finish: function finish(inputSize, parseTime) { + appendResult("total", "Total", null, inputSize, parseTime); + $.scrollTo("max", { + axis: "y", + duration: 500 + }); + $("#run-count, #cache, #run").removeAttr("disabled"); + } + }); + }); + $(document).ready(function () { + return $("#run").focus(); + }); + var browser = {}; + + return browser; + +}()); diff --git a/tools/pegjs.org/js/online.js b/tools/pegjs.org/js/online.js new file mode 100644 index 0000000..415f01d --- /dev/null +++ b/tools/pegjs.org/js/online.js @@ -0,0 +1,222 @@ +$(document).ready(function() { + var KB = 1024; + var MS_IN_S = 1000; + + var parser; + + var buildAndParseTimer = null; + var parseTimer = null; + + var oldGrammar = null; + var oldParserVar = null; + var oldOptionCache = null; + var oldOptionOptimize = null; + var oldInput = null; + + var editor = CodeMirror.fromTextArea($("#grammar").get(0), { + lineNumbers: true, + mode: "pegjs" + }); + + window.editor = editor; + + function buildSizeAndTimeInfoHtml(title, size, time) { + return $("", { + "class": "size-and-time", + title: title, + html: (size / KB).toPrecision(2) + " kB, " + + time + " ms, " + + ((size / KB) / (time / MS_IN_S)).toPrecision(2) + " kB/s" + }); + } + + function buildErrorMessage(e) { + return e.location !== undefined + ? "Line " + e.location.start.line + ", column " + e.location.start.column + ": " + e.message + : e.message; + } + + function build() { + oldGrammar = getGrammar(); + oldParserVar = $("#parser-var").val(); + oldOptionCache = $("#option-cache").is(":checked"); + oldOptionOptimize = $("#option-optimize").val(); + + $('#build-message').attr("class", "message progress").text("Building the parser..."); + $("#input").attr("disabled", "disabled"); + $("#parse-message").attr("class", "message disabled").text("Parser not available."); + $("#output").addClass("disabled").text("Output not available."); + $("#parser-var").attr("disabled", "disabled"); + $("#option-cache").attr("disabled", "disabled"); + $("#option-optimize").attr("disabled", "disabled"); + $("#parser-download").attr("disabled", "disabled"); + + try { + var timeBefore = (new Date).getTime(); + var parserSource = peg.generate(getGrammar(), { + cache: $("#option-cache").is(":checked"), + optimize: $("#option-optimize").val(), + output: "source" + }); + var timeAfter = (new Date).getTime(); + + parser = eval(parserSource); + + $("#build-message") + .attr("class", "message info") + .html("Parser built successfully.") + .append(buildSizeAndTimeInfoHtml( + "Parser build time and speed", + getGrammar().length, + timeAfter - timeBefore + )); + $("#input").removeAttr("disabled"); + $("#parser-source").val($("#parser-var").val() + " = " + parserSource + ";\n"); + $("#parser-var").removeAttr("disabled"); + $("#option-cache").removeAttr("disabled"); + $("#option-optimize").removeAttr("disabled"); + $("#parser-download").removeAttr("disabled"); + + var result = true; + } catch (e) { + $("#build-message").attr("class", "message error").text(buildErrorMessage(e)); + + var result = false; + } + + doLayout(); + return result; + } + + function parse() { + oldInput = $("#input").val(); + + $("#input").removeAttr("disabled"); + $("#parse-message").attr("class", "message progress").text("Parsing the input..."); + $("#output").addClass("disabled").text("Output not available."); + + try { + var timeBefore = (new Date).getTime(); + var output = parser.parse($("#input").val()); + var timeAfter = (new Date).getTime(); + + $("#parse-message") + .attr("class", "message info") + .text("Input parsed successfully.") + .append(buildSizeAndTimeInfoHtml( + "Parsing time and speed", + $("#input").val().length, + timeAfter - timeBefore + )); + let json = jsDump.parse(output); + json = json.replace(/ *[{}],? */g, ''); + json = json.replace(/\n([ \t]*\n)*/g, '\n'); + + $("#output").removeClass("disabled").text(json); + + var result = true; + } catch (e) { + $("#parse-message").attr("class", "message error").text(buildErrorMessage(e)); + + var result = false; + } + + doLayout(); + return result; + } + + function buildAndParse() { + console.log('buildAndParse()'); + build() && parse(); + } + + function scheduleBuildAndParse() { + var nothingChanged = getGrammar() === oldGrammar + && $("#parser-var").val() === oldParserVar + && $("#option-cache").is(":checked") === oldOptionCache + && $("#option-optimize").val() === oldOptionOptimize; + if (nothingChanged) { return; } + + if (buildAndParseTimer !== null) { + clearTimeout(buildAndParseTimer); + buildAndParseTimer = null; + } + if (parseTimer !== null) { + clearTimeout(parseTimer); + parseTimer = null; + } + + buildAndParseTimer = setTimeout(function() { + buildAndParse(); + buildAndParseTimer = null; + }, 500); + } + + function scheduleParse() { + if ($("#input").val() === oldInput) { return; } + if (buildAndParseTimer !== null) { return; } + + if (parseTimer !== null) { + clearTimeout(parseTimer); + parseTimer = null; + } + + parseTimer = setTimeout(function() { + parse(); + parseTimer = null; + }, 500); + } + + function doLayout() { + /* + * This forces layout of the page so that the |#columns| table gets a chance + * make itself smaller when the browser window shrinks. + */ + $("#left-column").height("0px"); // needed for IE + $("#right-column").height("0px"); // needed for IE + $(".CodeMirror").height("0px"); + $("#input").height("0px"); + + $("#left-column").height(($("#left-column").parent().innerHeight() - 2) + "px"); // needed for IE + $("#right-column").height(($("#right-column").parent().innerHeight() - 2) + "px"); // needed for IE + $(".CodeMirror").height(($(".CodeMirror").parent().parent().innerHeight() - 14) + "px"); + $("#input").height(($("#input").parent().parent().innerHeight() - 14) + "px"); + } + + function getGrammar() { + return editor.getValue(); + } + + editor.on("change", scheduleBuildAndParse); + + $("#parser-var, #option-cache, #option-optimize") + .change(scheduleBuildAndParse) + .mousedown(scheduleBuildAndParse) + .mouseup(scheduleBuildAndParse) + .click(scheduleBuildAndParse) + .keydown(scheduleBuildAndParse) + .keyup(scheduleBuildAndParse) + .keypress(scheduleBuildAndParse); + + $("#input") + .change(scheduleParse) + .mousedown(scheduleParse) + .mouseup(scheduleParse) + .click(scheduleParse) + .keydown(scheduleParse) + .keyup(scheduleParse) + .keypress(scheduleParse); + + doLayout(); + $(window).resize(doLayout); + + $("#loader").hide(); + $("#content").show(); + + $("#grammar, #parser-var, #option-cache, #option-optimize").removeAttr("disabled"); + + buildAndParse(); + + editor.refresh(); + editor.focus(); +}); diff --git a/tools/pegjs.org/js/test-bundle.js b/tools/pegjs.org/js/test-bundle.js new file mode 100644 index 0000000..913339e --- /dev/null +++ b/tools/pegjs.org/js/test-bundle.js @@ -0,0 +1,38063 @@ +var test = (function (exports) { + 'use strict'; + + function _typeof(obj) { + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function (obj) { + return typeof obj; + }; + } else { + _typeof = function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; + }; + } + + return _typeof(obj); + } + + function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + } + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) _setPrototypeOf(subClass, superClass); + } + + function _getPrototypeOf(o) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { + return o.__proto__ || Object.getPrototypeOf(o); + }; + return _getPrototypeOf(o); + } + + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { + o.__proto__ = p; + return o; + }; + + return _setPrototypeOf(o, p); + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; + } + + function _possibleConstructorReturn(self, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } + + return _assertThisInitialized(self); + } + + function _toConsumableArray(arr) { + return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); + } + + function _arrayWithoutHoles(arr) { + if (Array.isArray(arr)) { + for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; + + return arr2; + } + } + + function _iterableToArray(iter) { + if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); + } + + function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance"); + } + + var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function createCommonjsModule(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + function getCjsExportFromNamespace (n) { + return n && n.default || n; + } + + /*! + * assertion-error + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + + /*! + * Return a function that will copy properties from + * one object to another excluding any originally + * listed. Returned function will create a new `{}`. + * + * @param {String} excluded properties ... + * @return {Function} + */ + + function exclude () { + var excludes = [].slice.call(arguments); + + function excludeProps (res, obj) { + Object.keys(obj).forEach(function (key) { + if (!~excludes.indexOf(key)) res[key] = obj[key]; + }); + } + + return function extendExclude () { + var args = [].slice.call(arguments) + , i = 0 + , res = {}; + + for (; i < args.length; i++) { + excludeProps(res, args[i]); + } + + return res; + }; + } + /*! + * Primary Exports + */ + + var assertionError = AssertionError; + + /** + * ### AssertionError + * + * An extension of the JavaScript `Error` constructor for + * assertion and validation scenarios. + * + * @param {String} message + * @param {Object} properties to include (optional) + * @param {callee} start stack function (optional) + */ + + function AssertionError (message, _props, ssf) { + var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON') + , props = extend(_props || {}); + + // default values + this.message = message || 'Unspecified AssertionError'; + this.showDiff = false; + + // copy from properties + for (var key in props) { + this[key] = props[key]; + } + + // capture stack trace + ssf = ssf || AssertionError; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, ssf); + } else { + try { + throw new Error(); + } catch(e) { + this.stack = e.stack; + } + } + } + + /*! + * Inherit from Error.prototype + */ + + AssertionError.prototype = Object.create(Error.prototype); + + /*! + * Statically set name + */ + + AssertionError.prototype.name = 'AssertionError'; + + /*! + * Ensure correct constructor + */ + + AssertionError.prototype.constructor = AssertionError; + + /** + * Allow errors to be converted to JSON for static transfer. + * + * @param {Boolean} include stack (default: `true`) + * @return {Object} object that can be `JSON.stringify` + */ + + AssertionError.prototype.toJSON = function (stack) { + var extend = exclude('constructor', 'toJSON', 'stack') + , props = extend({ name: this.name }, this); + + // include stack if exists and not turned off + if (false !== stack && this.stack) { + props.stack = this.stack; + } + + return props; + }; + + /* ! + * Chai - pathval utility + * Copyright(c) 2012-2014 Jake Luer + * @see https://github.com/logicalparadox/filtr + * MIT Licensed + */ + + /** + * ### .hasProperty(object, name) + * + * This allows checking whether an object has own + * or inherited from prototype chain named property. + * + * Basically does the same thing as the `in` + * operator but works properly with null/undefined values + * and other primitives. + * + * var obj = { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * + * The following would be the results. + * + * hasProperty(obj, 'str'); // true + * hasProperty(obj, 'constructor'); // true + * hasProperty(obj, 'bar'); // false + * + * hasProperty(obj.str, 'length'); // true + * hasProperty(obj.str, 1); // true + * hasProperty(obj.str, 5); // false + * + * hasProperty(obj.arr, 'length'); // true + * hasProperty(obj.arr, 2); // true + * hasProperty(obj.arr, 3); // false + * + * @param {Object} object + * @param {String|Symbol} name + * @returns {Boolean} whether it exists + * @namespace Utils + * @name hasProperty + * @api public + */ + + function hasProperty(obj, name) { + if (typeof obj === 'undefined' || obj === null) { + return false; + } + + // The `in` operator does not work with primitives. + return name in Object(obj); + } + + /* ! + * ## parsePath(path) + * + * Helper function used to parse string object + * paths. Use in conjunction with `internalGetPathValue`. + * + * var parsed = parsePath('myobject.property.subprop'); + * + * ### Paths: + * + * * Can be infinitely deep and nested. + * * Arrays are also valid using the formal `myobject.document[3].property`. + * * Literal dots and brackets (not delimiter) must be backslash-escaped. + * + * @param {String} path + * @returns {Object} parsed + * @api private + */ + + function parsePath(path) { + var str = path.replace(/([^\\])\[/g, '$1.['); + var parts = str.match(/(\\\.|[^.]+?)+/g); + return parts.map(function mapMatches(value) { + var regexp = /^\[(\d+)\]$/; + var mArr = regexp.exec(value); + var parsed = null; + if (mArr) { + parsed = { i: parseFloat(mArr[1]) }; + } else { + parsed = { p: value.replace(/\\([.\[\]])/g, '$1') }; + } + + return parsed; + }); + } + + /* ! + * ## internalGetPathValue(obj, parsed[, pathDepth]) + * + * Helper companion function for `.parsePath` that returns + * the value located at the parsed address. + * + * var value = getPathValue(obj, parsed); + * + * @param {Object} object to search against + * @param {Object} parsed definition from `parsePath`. + * @param {Number} depth (nesting level) of the property we want to retrieve + * @returns {Object|Undefined} value + * @api private + */ + + function internalGetPathValue(obj, parsed, pathDepth) { + var temporaryValue = obj; + var res = null; + pathDepth = (typeof pathDepth === 'undefined' ? parsed.length : pathDepth); + + for (var i = 0; i < pathDepth; i++) { + var part = parsed[i]; + if (temporaryValue) { + if (typeof part.p === 'undefined') { + temporaryValue = temporaryValue[part.i]; + } else { + temporaryValue = temporaryValue[part.p]; + } + + if (i === (pathDepth - 1)) { + res = temporaryValue; + } + } + } + + return res; + } + + /* ! + * ## internalSetPathValue(obj, value, parsed) + * + * Companion function for `parsePath` that sets + * the value located at a parsed address. + * + * internalSetPathValue(obj, 'value', parsed); + * + * @param {Object} object to search and define on + * @param {*} value to use upon set + * @param {Object} parsed definition from `parsePath` + * @api private + */ + + function internalSetPathValue(obj, val, parsed) { + var tempObj = obj; + var pathDepth = parsed.length; + var part = null; + // Here we iterate through every part of the path + for (var i = 0; i < pathDepth; i++) { + var propName = null; + var propVal = null; + part = parsed[i]; + + // If it's the last part of the path, we set the 'propName' value with the property name + if (i === (pathDepth - 1)) { + propName = typeof part.p === 'undefined' ? part.i : part.p; + // Now we set the property with the name held by 'propName' on object with the desired val + tempObj[propName] = val; + } else if (typeof part.p !== 'undefined' && tempObj[part.p]) { + tempObj = tempObj[part.p]; + } else if (typeof part.i !== 'undefined' && tempObj[part.i]) { + tempObj = tempObj[part.i]; + } else { + // If the obj doesn't have the property we create one with that name to define it + var next = parsed[i + 1]; + // Here we set the name of the property which will be defined + propName = typeof part.p === 'undefined' ? part.i : part.p; + // Here we decide if this property will be an array or a new object + propVal = typeof next.p === 'undefined' ? [] : {}; + tempObj[propName] = propVal; + tempObj = tempObj[propName]; + } + } + } + + /** + * ### .getPathInfo(object, path) + * + * This allows the retrieval of property info in an + * object given a string path. + * + * The path info consists of an object with the + * following properties: + * + * * parent - The parent object of the property referenced by `path` + * * name - The name of the final property, a number if it was an array indexer + * * value - The value of the property, if it exists, otherwise `undefined` + * * exists - Whether the property exists or not + * + * @param {Object} object + * @param {String} path + * @returns {Object} info + * @namespace Utils + * @name getPathInfo + * @api public + */ + + function getPathInfo(obj, path) { + var parsed = parsePath(path); + var last = parsed[parsed.length - 1]; + var info = { + parent: parsed.length > 1 ? internalGetPathValue(obj, parsed, parsed.length - 1) : obj, + name: last.p || last.i, + value: internalGetPathValue(obj, parsed), + }; + info.exists = hasProperty(info.parent, info.name); + + return info; + } + + /** + * ### .getPathValue(object, path) + * + * This allows the retrieval of values in an + * object given a string path. + * + * var obj = { + * prop1: { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * , prop2: { + * arr: [ { nested: 'Universe' } ] + * , str: 'Hello again!' + * } + * } + * + * The following would be the results. + * + * getPathValue(obj, 'prop1.str'); // Hello + * getPathValue(obj, 'prop1.att[2]'); // b + * getPathValue(obj, 'prop2.arr[0].nested'); // Universe + * + * @param {Object} object + * @param {String} path + * @returns {Object} value or `undefined` + * @namespace Utils + * @name getPathValue + * @api public + */ + + function getPathValue(obj, path) { + var info = getPathInfo(obj, path); + return info.value; + } + + /** + * ### .setPathValue(object, path, value) + * + * Define the value in an object at a given string path. + * + * ```js + * var obj = { + * prop1: { + * arr: ['a', 'b', 'c'] + * , str: 'Hello' + * } + * , prop2: { + * arr: [ { nested: 'Universe' } ] + * , str: 'Hello again!' + * } + * }; + * ``` + * + * The following would be acceptable. + * + * ```js + * var properties = require('tea-properties'); + * properties.set(obj, 'prop1.str', 'Hello Universe!'); + * properties.set(obj, 'prop1.arr[2]', 'B'); + * properties.set(obj, 'prop2.arr[0].nested.value', { hello: 'universe' }); + * ``` + * + * @param {Object} object + * @param {String} path + * @param {Mixed} value + * @api private + */ + + function setPathValue(obj, path, val) { + var parsed = parsePath(path); + internalSetPathValue(obj, val, parsed); + return obj; + } + + var pathval = { + hasProperty: hasProperty, + getPathInfo: getPathInfo, + getPathValue: getPathValue, + setPathValue: setPathValue, + }; + + /*! + * Chai - flag utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /** + * ### .flag(object, key, [value]) + * + * Get or set a flag value on an object. If a + * value is provided it will be set, else it will + * return the currently set value or `undefined` if + * the value is not set. + * + * utils.flag(this, 'foo', 'bar'); // setter + * utils.flag(this, 'foo'); // getter, returns `bar` + * + * @param {Object} object constructed Assertion + * @param {String} key + * @param {Mixed} value (optional) + * @namespace Utils + * @name flag + * @api private + */ + + var flag = function flag(obj, key, value) { + var flags = obj.__flags || (obj.__flags = Object.create(null)); + if (arguments.length === 3) { + flags[key] = value; + } else { + return flags[key]; + } + }; + + /*! + * Chai - test utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /*! + * Module dependencies + */ + + + + /** + * ### .test(object, expression) + * + * Test and object for expression. + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name test + */ + + var test = function test(obj, args) { + var negate = flag(obj, 'negate') + , expr = args[0]; + return negate ? !expr : expr; + }; + + var typeDetect = createCommonjsModule(function (module, exports) { + (function (global, factory) { + module.exports = factory(); + }(commonjsGlobal, (function () { + /* ! + * type-detect + * Copyright(c) 2013 jake luer + * MIT Licensed + */ + var promiseExists = typeof Promise === 'function'; + + /* eslint-disable no-undef */ + var globalObject = typeof self === 'object' ? self : commonjsGlobal; // eslint-disable-line id-blacklist + + var symbolExists = typeof Symbol !== 'undefined'; + var mapExists = typeof Map !== 'undefined'; + var setExists = typeof Set !== 'undefined'; + var weakMapExists = typeof WeakMap !== 'undefined'; + var weakSetExists = typeof WeakSet !== 'undefined'; + var dataViewExists = typeof DataView !== 'undefined'; + var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined'; + var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined'; + var setEntriesExists = setExists && typeof Set.prototype.entries === 'function'; + var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function'; + var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries()); + var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries()); + var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function'; + var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]()); + var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function'; + var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]()); + var toStringLeftSliceLength = 8; + var toStringRightSliceLength = -1; + /** + * ### typeOf (obj) + * + * Uses `Object.prototype.toString` to determine the type of an object, + * normalising behaviour across engine versions & well optimised. + * + * @param {Mixed} object + * @return {String} object type + * @api public + */ + function typeDetect(obj) { + /* ! Speed optimisation + * Pre: + * string literal x 3,039,035 ops/sec ±1.62% (78 runs sampled) + * boolean literal x 1,424,138 ops/sec ±4.54% (75 runs sampled) + * number literal x 1,653,153 ops/sec ±1.91% (82 runs sampled) + * undefined x 9,978,660 ops/sec ±1.92% (75 runs sampled) + * function x 2,556,769 ops/sec ±1.73% (77 runs sampled) + * Post: + * string literal x 38,564,796 ops/sec ±1.15% (79 runs sampled) + * boolean literal x 31,148,940 ops/sec ±1.10% (79 runs sampled) + * number literal x 32,679,330 ops/sec ±1.90% (78 runs sampled) + * undefined x 32,363,368 ops/sec ±1.07% (82 runs sampled) + * function x 31,296,870 ops/sec ±0.96% (83 runs sampled) + */ + var typeofObj = typeof obj; + if (typeofObj !== 'object') { + return typeofObj; + } + + /* ! Speed optimisation + * Pre: + * null x 28,645,765 ops/sec ±1.17% (82 runs sampled) + * Post: + * null x 36,428,962 ops/sec ±1.37% (84 runs sampled) + */ + if (obj === null) { + return 'null'; + } + + /* ! Spec Conformance + * Test: `Object.prototype.toString.call(window)`` + * - Node === "[object global]" + * - Chrome === "[object global]" + * - Firefox === "[object Window]" + * - PhantomJS === "[object Window]" + * - Safari === "[object Window]" + * - IE 11 === "[object Window]" + * - IE Edge === "[object Window]" + * Test: `Object.prototype.toString.call(this)`` + * - Chrome Worker === "[object global]" + * - Firefox Worker === "[object DedicatedWorkerGlobalScope]" + * - Safari Worker === "[object DedicatedWorkerGlobalScope]" + * - IE 11 Worker === "[object WorkerGlobalScope]" + * - IE Edge Worker === "[object WorkerGlobalScope]" + */ + if (obj === globalObject) { + return 'global'; + } + + /* ! Speed optimisation + * Pre: + * array literal x 2,888,352 ops/sec ±0.67% (82 runs sampled) + * Post: + * array literal x 22,479,650 ops/sec ±0.96% (81 runs sampled) + */ + if ( + Array.isArray(obj) && + (symbolToStringTagExists === false || !(Symbol.toStringTag in obj)) + ) { + return 'Array'; + } + + // Not caching existence of `window` and related properties due to potential + // for `window` to be unset before tests in quasi-browser environments. + if (typeof window === 'object' && window !== null) { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/browsers.html#location) + * WhatWG HTML$7.7.3 - The `Location` interface + * Test: `Object.prototype.toString.call(window.location)`` + * - IE <=11 === "[object Object]" + * - IE Edge <=13 === "[object Object]" + */ + if (typeof window.location === 'object' && obj === window.location) { + return 'Location'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#document) + * WhatWG HTML$3.1.1 - The `Document` object + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * WhatWG HTML states: + * > For historical reasons, Window objects must also have a + * > writable, configurable, non-enumerable property named + * > HTMLDocument whose value is the Document interface object. + * Test: `Object.prototype.toString.call(document)`` + * - Chrome === "[object HTMLDocument]" + * - Firefox === "[object HTMLDocument]" + * - Safari === "[object HTMLDocument]" + * - IE <=10 === "[object Document]" + * - IE 11 === "[object HTMLDocument]" + * - IE Edge <=13 === "[object HTMLDocument]" + */ + if (typeof window.document === 'object' && obj === window.document) { + return 'Document'; + } + + if (typeof window.navigator === 'object') { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray) + * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray + * Test: `Object.prototype.toString.call(navigator.mimeTypes)`` + * - IE <=10 === "[object MSMimeTypesCollection]" + */ + if (typeof window.navigator.mimeTypes === 'object' && + obj === window.navigator.mimeTypes) { + return 'MimeTypeArray'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) + * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray + * Test: `Object.prototype.toString.call(navigator.plugins)`` + * - IE <=10 === "[object MSPluginsCollection]" + */ + if (typeof window.navigator.plugins === 'object' && + obj === window.navigator.plugins) { + return 'PluginArray'; + } + } + + if ((typeof window.HTMLElement === 'function' || + typeof window.HTMLElement === 'object') && + obj instanceof window.HTMLElement) { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) + * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement` + * Test: `Object.prototype.toString.call(document.createElement('blockquote'))`` + * - IE <=10 === "[object HTMLBlockElement]" + */ + if (obj.tagName === 'BLOCKQUOTE') { + return 'HTMLQuoteElement'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#htmltabledatacellelement) + * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement` + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * Test: Object.prototype.toString.call(document.createElement('td')) + * - Chrome === "[object HTMLTableCellElement]" + * - Firefox === "[object HTMLTableCellElement]" + * - Safari === "[object HTMLTableCellElement]" + */ + if (obj.tagName === 'TD') { + return 'HTMLTableDataCellElement'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#htmltableheadercellelement) + * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement` + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * Test: Object.prototype.toString.call(document.createElement('th')) + * - Chrome === "[object HTMLTableCellElement]" + * - Firefox === "[object HTMLTableCellElement]" + * - Safari === "[object HTMLTableCellElement]" + */ + if (obj.tagName === 'TH') { + return 'HTMLTableHeaderCellElement'; + } + } + } + + /* ! Speed optimisation + * Pre: + * Float64Array x 625,644 ops/sec ±1.58% (80 runs sampled) + * Float32Array x 1,279,852 ops/sec ±2.91% (77 runs sampled) + * Uint32Array x 1,178,185 ops/sec ±1.95% (83 runs sampled) + * Uint16Array x 1,008,380 ops/sec ±2.25% (80 runs sampled) + * Uint8Array x 1,128,040 ops/sec ±2.11% (81 runs sampled) + * Int32Array x 1,170,119 ops/sec ±2.88% (80 runs sampled) + * Int16Array x 1,176,348 ops/sec ±5.79% (86 runs sampled) + * Int8Array x 1,058,707 ops/sec ±4.94% (77 runs sampled) + * Uint8ClampedArray x 1,110,633 ops/sec ±4.20% (80 runs sampled) + * Post: + * Float64Array x 7,105,671 ops/sec ±13.47% (64 runs sampled) + * Float32Array x 5,887,912 ops/sec ±1.46% (82 runs sampled) + * Uint32Array x 6,491,661 ops/sec ±1.76% (79 runs sampled) + * Uint16Array x 6,559,795 ops/sec ±1.67% (82 runs sampled) + * Uint8Array x 6,463,966 ops/sec ±1.43% (85 runs sampled) + * Int32Array x 5,641,841 ops/sec ±3.49% (81 runs sampled) + * Int16Array x 6,583,511 ops/sec ±1.98% (80 runs sampled) + * Int8Array x 6,606,078 ops/sec ±1.74% (81 runs sampled) + * Uint8ClampedArray x 6,602,224 ops/sec ±1.77% (83 runs sampled) + */ + var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]); + if (typeof stringTag === 'string') { + return stringTag; + } + + var objPrototype = Object.getPrototypeOf(obj); + /* ! Speed optimisation + * Pre: + * regex literal x 1,772,385 ops/sec ±1.85% (77 runs sampled) + * regex constructor x 2,143,634 ops/sec ±2.46% (78 runs sampled) + * Post: + * regex literal x 3,928,009 ops/sec ±0.65% (78 runs sampled) + * regex constructor x 3,931,108 ops/sec ±0.58% (84 runs sampled) + */ + if (objPrototype === RegExp.prototype) { + return 'RegExp'; + } + + /* ! Speed optimisation + * Pre: + * date x 2,130,074 ops/sec ±4.42% (68 runs sampled) + * Post: + * date x 3,953,779 ops/sec ±1.35% (77 runs sampled) + */ + if (objPrototype === Date.prototype) { + return 'Date'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag) + * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be "Promise": + * Test: `Object.prototype.toString.call(Promise.resolve())`` + * - Chrome <=47 === "[object Object]" + * - Edge <=20 === "[object Object]" + * - Firefox 29-Latest === "[object Promise]" + * - Safari 7.1-Latest === "[object Promise]" + */ + if (promiseExists && objPrototype === Promise.prototype) { + return 'Promise'; + } + + /* ! Speed optimisation + * Pre: + * set x 2,222,186 ops/sec ±1.31% (82 runs sampled) + * Post: + * set x 4,545,879 ops/sec ±1.13% (83 runs sampled) + */ + if (setExists && objPrototype === Set.prototype) { + return 'Set'; + } + + /* ! Speed optimisation + * Pre: + * map x 2,396,842 ops/sec ±1.59% (81 runs sampled) + * Post: + * map x 4,183,945 ops/sec ±6.59% (82 runs sampled) + */ + if (mapExists && objPrototype === Map.prototype) { + return 'Map'; + } + + /* ! Speed optimisation + * Pre: + * weakset x 1,323,220 ops/sec ±2.17% (76 runs sampled) + * Post: + * weakset x 4,237,510 ops/sec ±2.01% (77 runs sampled) + */ + if (weakSetExists && objPrototype === WeakSet.prototype) { + return 'WeakSet'; + } + + /* ! Speed optimisation + * Pre: + * weakmap x 1,500,260 ops/sec ±2.02% (78 runs sampled) + * Post: + * weakmap x 3,881,384 ops/sec ±1.45% (82 runs sampled) + */ + if (weakMapExists && objPrototype === WeakMap.prototype) { + return 'WeakMap'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag) + * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be "DataView": + * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))`` + * - Edge <=13 === "[object Object]" + */ + if (dataViewExists && objPrototype === DataView.prototype) { + return 'DataView'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag) + * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be "Map Iterator": + * Test: `Object.prototype.toString.call(new Map().entries())`` + * - Edge <=13 === "[object Object]" + */ + if (mapExists && objPrototype === mapIteratorPrototype) { + return 'Map Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag) + * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be "Set Iterator": + * Test: `Object.prototype.toString.call(new Set().entries())`` + * - Edge <=13 === "[object Object]" + */ + if (setExists && objPrototype === setIteratorPrototype) { + return 'Set Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag) + * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be "Array Iterator": + * Test: `Object.prototype.toString.call([][Symbol.iterator]())`` + * - Edge <=13 === "[object Object]" + */ + if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) { + return 'Array Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag) + * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be "String Iterator": + * Test: `Object.prototype.toString.call(''[Symbol.iterator]())`` + * - Edge <=13 === "[object Object]" + */ + if (stringIteratorExists && objPrototype === stringIteratorPrototype) { + return 'String Iterator'; + } + + /* ! Speed optimisation + * Pre: + * object from null x 2,424,320 ops/sec ±1.67% (76 runs sampled) + * Post: + * object from null x 5,838,000 ops/sec ±0.99% (84 runs sampled) + */ + if (objPrototype === null) { + return 'Object'; + } + + return Object + .prototype + .toString + .call(obj) + .slice(toStringLeftSliceLength, toStringRightSliceLength); + } + + return typeDetect; + + }))); + }); + + /*! + * Chai - expectTypes utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /** + * ### .expectTypes(obj, types) + * + * Ensures that the object being tested against is of a valid type. + * + * utils.expectTypes(this, ['array', 'object', 'string']); + * + * @param {Mixed} obj constructed Assertion + * @param {Array} type A list of allowed types for this assertion + * @namespace Utils + * @name expectTypes + * @api public + */ + + + + + + var expectTypes = function expectTypes(obj, types) { + var flagMsg = flag(obj, 'message'); + var ssfi = flag(obj, 'ssfi'); + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + obj = flag(obj, 'object'); + types = types.map(function (t) { return t.toLowerCase(); }); + types.sort(); + + // Transforms ['lorem', 'ipsum'] into 'a lorem, or an ipsum' + var str = types.map(function (t, index) { + var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a'; + var or = types.length > 1 && index === types.length - 1 ? 'or ' : ''; + return or + art + ' ' + t; + }).join(', '); + + var objType = typeDetect(obj).toLowerCase(); + + if (!types.some(function (expected) { return objType === expected; })) { + throw new assertionError( + flagMsg + 'object tested must be ' + str + ', but ' + objType + ' given', + undefined, + ssfi + ); + } + }; + + /*! + * Chai - getActual utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /** + * ### .getActual(object, [actual]) + * + * Returns the `actual` value for an Assertion. + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getActual + */ + + var getActual = function getActual(obj, args) { + return args.length > 4 ? args[4] : obj._obj; + }; + + /* ! + * Chai - getFuncName utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + + /** + * ### .getFuncName(constructorFn) + * + * Returns the name of a function. + * When a non-function instance is passed, returns `null`. + * This also includes a polyfill function if `aFunc.name` is not defined. + * + * @name getFuncName + * @param {Function} funct + * @namespace Utils + * @api public + */ + + var toString = Function.prototype.toString; + var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; + function getFuncName(aFunc) { + if (typeof aFunc !== 'function') { + return null; + } + + var name = ''; + if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { + // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined + var match = toString.call(aFunc).match(functionNameMatch); + if (match) { + name = match[1]; + } + } else { + // If we've got a `name` property we just use it + name = aFunc.name; + } + + return name; + } + + var getFuncName_1 = getFuncName; + + /*! + * Chai - getProperties utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /** + * ### .getProperties(object) + * + * This allows the retrieval of property names of an object, enumerable or not, + * inherited or not. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getProperties + * @api public + */ + + var getProperties = function getProperties(object) { + var result = Object.getOwnPropertyNames(object); + + function addProperty(property) { + if (result.indexOf(property) === -1) { + result.push(property); + } + } + + var proto = Object.getPrototypeOf(object); + while (proto !== null) { + Object.getOwnPropertyNames(proto).forEach(addProperty); + proto = Object.getPrototypeOf(proto); + } + + return result; + }; + + /*! + * Chai - getEnumerableProperties utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /** + * ### .getEnumerableProperties(object) + * + * This allows the retrieval of enumerable property names of an object, + * inherited or not. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getEnumerableProperties + * @api public + */ + + var getEnumerableProperties = function getEnumerableProperties(object) { + var result = []; + for (var name in object) { + result.push(name); + } + return result; + }; + + var config = { + + /** + * ### config.includeStack + * + * User configurable property, influences whether stack trace + * is included in Assertion error message. Default of false + * suppresses stack trace in the error message. + * + * chai.config.includeStack = true; // enable stack on error + * + * @param {Boolean} + * @api public + */ + + includeStack: false, + + /** + * ### config.showDiff + * + * User configurable property, influences whether or not + * the `showDiff` flag should be included in the thrown + * AssertionErrors. `false` will always be `false`; `true` + * will be true when the assertion has requested a diff + * be shown. + * + * @param {Boolean} + * @api public + */ + + showDiff: true, + + /** + * ### config.truncateThreshold + * + * User configurable property, sets length threshold for actual and + * expected values in assertion errors. If this threshold is exceeded, for + * example for large data structures, the value is replaced with something + * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`. + * + * Set it to zero if you want to disable truncating altogether. + * + * This is especially userful when doing assertions on arrays: having this + * set to a reasonable large value makes the failure messages readily + * inspectable. + * + * chai.config.truncateThreshold = 0; // disable truncating + * + * @param {Number} + * @api public + */ + + truncateThreshold: 40, + + /** + * ### config.useProxy + * + * User configurable property, defines if chai will use a Proxy to throw + * an error when a non-existent property is read, which protects users + * from typos when using property-based assertions. + * + * Set it to false if you want to disable this feature. + * + * chai.config.useProxy = false; // disable use of Proxy + * + * This feature is automatically disabled regardless of this config value + * in environments that don't support proxies. + * + * @param {Boolean} + * @api public + */ + + useProxy: true, + + /** + * ### config.proxyExcludedKeys + * + * User configurable property, defines which properties should be ignored + * instead of throwing an error if they do not exist on the assertion. + * This is only applied if the environment Chai is running in supports proxies and + * if the `useProxy` configuration setting is enabled. + * By default, `then` and `inspect` will not throw an error if they do not exist on the + * assertion object because the `.inspect` property is read by `util.inspect` (for example, when + * using `console.log` on the assertion object) and `.then` is necessary for promise type-checking. + * + * // By default these keys will not throw an error if they do not exist on the assertion object + * chai.config.proxyExcludedKeys = ['then', 'inspect']; + * + * @param {Array} + * @api public + */ + + proxyExcludedKeys: ['then', 'catch', 'inspect', 'toJSON'] + }; + + var inspect_1 = createCommonjsModule(function (module, exports) { + // This is (almost) directly from Node.js utils + // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js + + + + + + + module.exports = inspect; + + /** + * ### .inspect(obj, [showHidden], [depth], [colors]) + * + * Echoes the value of a value. Tries to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Boolean} showHidden Flag that shows hidden (not enumerable) + * properties of objects. Default is false. + * @param {Number} depth Depth in which to descend in object. Default is 2. + * @param {Boolean} colors Flag to turn on ANSI escape codes to color the + * output. Default is false (no coloring). + * @namespace Utils + * @name inspect + */ + function inspect(obj, showHidden, depth, colors) { + var ctx = { + showHidden: showHidden, + seen: [], + stylize: function (str) { return str; } + }; + return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth)); + } + + // Returns true if object is a DOM element. + var isDOMElement = function (object) { + if (typeof HTMLElement === 'object') { + return object instanceof HTMLElement; + } else { + return object && + typeof object === 'object' && + 'nodeType' in object && + object.nodeType === 1 && + typeof object.nodeName === 'string'; + } + }; + + function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (value && typeof value.inspect === 'function' && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (typeof ret !== 'string') { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // If this is a DOM element, try to get the outer HTML. + if (isDOMElement(value)) { + if ('outerHTML' in value) { + return value.outerHTML; + // This value does not have an outerHTML attribute, + // it could still be an XML element + } else { + // Attempt to serialize it + try { + if (document.xmlVersion) { + var xmlSerializer = new XMLSerializer(); + return xmlSerializer.serializeToString(value); + } else { + // Firefox 11- do not support outerHTML + // It does, however, support innerHTML + // Use the following to render the element + var ns = "http://www.w3.org/1999/xhtml"; + var container = document.createElementNS(ns, '_'); + + container.appendChild(value.cloneNode(false)); + var html = container.innerHTML + .replace('><', '>' + value.innerHTML + '<'); + container.innerHTML = ''; + return html; + } + } catch (err) { + // This could be a non-native DOM implementation, + // continue with the normal flow: + // printing the element as if it is an object. + } + } + } + + // Look up the keys of the object. + var visibleKeys = getEnumerableProperties(value); + var keys = ctx.showHidden ? getProperties(value) : visibleKeys; + + var name, nameSuffix; + + // Some type of object without properties can be shortcut. + // In IE, errors have a single `stack` property, or if they are vanilla `Error`, + // a `stack` plus `description` property; ignore those for consistency. + if (keys.length === 0 || (isError(value) && ( + (keys.length === 1 && keys[0] === 'stack') || + (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack') + ))) { + if (typeof value === 'function') { + name = getFuncName_1(value); + nameSuffix = name ? ': ' + name : ''; + return ctx.stylize('[Function' + nameSuffix + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toUTCString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '' + , array = false + , typedArray = false + , braces = ['{', '}']; + + if (isTypedArray(value)) { + typedArray = true; + braces = ['[', ']']; + } + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (typeof value === 'function') { + name = getFuncName_1(value); + nameSuffix = name ? ': ' + name : ''; + base = ' [Function' + nameSuffix + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + return formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else if (typedArray) { + return formatTypedArray(value); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); + } + + function formatPrimitive(ctx, value) { + switch (typeof value) { + case 'undefined': + return ctx.stylize('undefined', 'undefined'); + + case 'string': + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + + case 'number': + if (value === 0 && (1/value) === -Infinity) { + return ctx.stylize('-0', 'number'); + } + return ctx.stylize('' + value, 'number'); + + case 'boolean': + return ctx.stylize('' + value, 'boolean'); + + case 'symbol': + return ctx.stylize(value.toString(), 'symbol'); + } + // For some reason typeof null is "object", so special case here. + if (value === null) { + return ctx.stylize('null', 'null'); + } + } + + function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; + } + + function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (Object.prototype.hasOwnProperty.call(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; + } + + function formatTypedArray(value) { + var str = '[ '; + + for (var i = 0; i < value.length; ++i) { + if (str.length >= config.truncateThreshold - 7) { + str += '...'; + break; + } + str += value[i] + ', '; + } + str += ' ]'; + + // Removing trailing `, ` if the array was not truncated + if (str.indexOf(', ]') !== -1) { + str = str.replace(', ]', ' ]'); + } + + return str; + } + + function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name; + var propDescriptor = Object.getOwnPropertyDescriptor(value, key); + var str; + + if (propDescriptor) { + if (propDescriptor.get) { + if (propDescriptor.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (propDescriptor.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + } + if (visibleKeys.indexOf(key) < 0) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(value[key]) < 0) { + if (recurseTimes === null) { + str = formatValue(ctx, value[key], null); + } else { + str = formatValue(ctx, value[key], recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (typeof name === 'undefined') { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; + } + + function reduceToSingleString(output, base, braces) { + var length = output.reduce(function(prev, cur) { + return prev + cur.length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; + } + + function isTypedArray(ar) { + // Unfortunately there's no way to check if an object is a TypedArray + // We have to check if it's one of these types + return (typeof ar === 'object' && /\w+Array]$/.test(objectToString(ar))); + } + + function isArray(ar) { + return Array.isArray(ar) || + (typeof ar === 'object' && objectToString(ar) === '[object Array]'); + } + + function isRegExp(re) { + return typeof re === 'object' && objectToString(re) === '[object RegExp]'; + } + + function isDate(d) { + return typeof d === 'object' && objectToString(d) === '[object Date]'; + } + + function isError(e) { + return typeof e === 'object' && objectToString(e) === '[object Error]'; + } + + function objectToString(o) { + return Object.prototype.toString.call(o); + } + }); + + /*! + * Chai - flag utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /*! + * Module dependencies + */ + + + + + /** + * ### .objDisplay(object) + * + * Determines if an object or an array matches + * criteria to be inspected in-line for error + * messages or should be truncated. + * + * @param {Mixed} javascript object to inspect + * @name objDisplay + * @namespace Utils + * @api public + */ + + var objDisplay = function objDisplay(obj) { + var str = inspect_1(obj) + , type = Object.prototype.toString.call(obj); + + if (config.truncateThreshold && str.length >= config.truncateThreshold) { + if (type === '[object Function]') { + return !obj.name || obj.name === '' + ? '[Function]' + : '[Function: ' + obj.name + ']'; + } else if (type === '[object Array]') { + return '[ Array(' + obj.length + ') ]'; + } else if (type === '[object Object]') { + var keys = Object.keys(obj) + , kstr = keys.length > 2 + ? keys.splice(0, 2).join(', ') + ', ...' + : keys.join(', '); + return '{ Object (' + kstr + ') }'; + } else { + return str; + } + } else { + return str; + } + }; + + /*! + * Chai - message composition utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /*! + * Module dependencies + */ + + + + /** + * ### .getMessage(object, message, negateMessage) + * + * Construct the error message based on flags + * and template tags. Template tags will return + * a stringified inspection of the object referenced. + * + * Message template tags: + * - `#{this}` current asserted object + * - `#{act}` actual value + * - `#{exp}` expected value + * + * @param {Object} object (constructed Assertion) + * @param {Arguments} chai.Assertion.prototype.assert arguments + * @namespace Utils + * @name getMessage + * @api public + */ + + var getMessage = function getMessage(obj, args) { + var negate = flag(obj, 'negate') + , val = flag(obj, 'object') + , expected = args[3] + , actual = getActual(obj, args) + , msg = negate ? args[2] : args[1] + , flagMsg = flag(obj, 'message'); + + if(typeof msg === "function") msg = msg(); + msg = msg || ''; + msg = msg + .replace(/#\{this\}/g, function () { return objDisplay(val); }) + .replace(/#\{act\}/g, function () { return objDisplay(actual); }) + .replace(/#\{exp\}/g, function () { return objDisplay(expected); }); + + return flagMsg ? flagMsg + ': ' + msg : msg; + }; + + /*! + * Chai - transferFlags utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /** + * ### .transferFlags(assertion, object, includeAll = true) + * + * Transfer all the flags for `assertion` to `object`. If + * `includeAll` is set to `false`, then the base Chai + * assertion flags (namely `object`, `ssfi`, `lockSsfi`, + * and `message`) will not be transferred. + * + * + * var newAssertion = new Assertion(); + * utils.transferFlags(assertion, newAssertion); + * + * var anotherAssertion = new Assertion(myObj); + * utils.transferFlags(assertion, anotherAssertion, false); + * + * @param {Assertion} assertion the assertion to transfer the flags from + * @param {Object} object the object to transfer the flags to; usually a new assertion + * @param {Boolean} includeAll + * @namespace Utils + * @name transferFlags + * @api private + */ + + var transferFlags = function transferFlags(assertion, object, includeAll) { + var flags = assertion.__flags || (assertion.__flags = Object.create(null)); + + if (!object.__flags) { + object.__flags = Object.create(null); + } + + includeAll = arguments.length === 3 ? includeAll : true; + + for (var flag in flags) { + if (includeAll || + (flag !== 'object' && flag !== 'ssfi' && flag !== 'lockSsfi' && flag != 'message')) { + object.__flags[flag] = flags[flag]; + } + } + }; + + /* globals Symbol: false, Uint8Array: false, WeakMap: false */ + /*! + * deep-eql + * Copyright(c) 2013 Jake Luer + * MIT Licensed + */ + + + function FakeMap() { + this._key = 'chai/deep-eql__' + Math.random() + Date.now(); + } + + FakeMap.prototype = { + get: function getMap(key) { + return key[this._key]; + }, + set: function setMap(key, value) { + if (Object.isExtensible(key)) { + Object.defineProperty(key, this._key, { + value: value, + configurable: true, + }); + } + }, + }; + + var MemoizeMap = typeof WeakMap === 'function' ? WeakMap : FakeMap; + /*! + * Check to see if the MemoizeMap has recorded a result of the two operands + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @returns {Boolean|null} result + */ + function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) { + // Technically, WeakMap keys can *only* be objects, not primitives. + if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + return null; + } + var leftHandMap = memoizeMap.get(leftHandOperand); + if (leftHandMap) { + var result = leftHandMap.get(rightHandOperand); + if (typeof result === 'boolean') { + return result; + } + } + return null; + } + + /*! + * Set the result of the equality into the MemoizeMap + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {MemoizeMap} memoizeMap + * @param {Boolean} result + */ + function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) { + // Technically, WeakMap keys can *only* be objects, not primitives. + if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + return; + } + var leftHandMap = memoizeMap.get(leftHandOperand); + if (leftHandMap) { + leftHandMap.set(rightHandOperand, result); + } else { + leftHandMap = new MemoizeMap(); + leftHandMap.set(rightHandOperand, result); + memoizeMap.set(leftHandOperand, leftHandMap); + } + } + + /*! + * Primary Export + */ + + var deepEql = deepEqual; + var MemoizeMap_1 = MemoizeMap; + + /** + * Assert deeply nested sameValue equality between two objects of any type. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (optional) Additional options + * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. + * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of + complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular + references to blow the stack. + * @return {Boolean} equal match + */ + function deepEqual(leftHandOperand, rightHandOperand, options) { + // If we have a comparator, we can't assume anything; so bail to its check first. + if (options && options.comparator) { + return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); + } + + var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); + if (simpleResult !== null) { + return simpleResult; + } + + // Deeper comparisons are pushed through to a larger function + return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); + } + + /** + * Many comparisons can be canceled out early via simple equality or primitive checks. + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @return {Boolean|null} equal match + */ + function simpleEqual(leftHandOperand, rightHandOperand) { + // Equal references (except for Numbers) can be returned early + if (leftHandOperand === rightHandOperand) { + // Handle +-0 cases + return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand; + } + + // handle NaN cases + if ( + leftHandOperand !== leftHandOperand && // eslint-disable-line no-self-compare + rightHandOperand !== rightHandOperand // eslint-disable-line no-self-compare + ) { + return true; + } + + // Anything that is not an 'object', i.e. symbols, functions, booleans, numbers, + // strings, and undefined, can be compared by reference. + if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { + // Easy out b/c it would have passed the first equality check + return false; + } + return null; + } + + /*! + * The main logic of the `deepEqual` function. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (optional) Additional options + * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. + * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of + complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular + references to blow the stack. + * @return {Boolean} equal match + */ + function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) { + options = options || {}; + options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap(); + var comparator = options && options.comparator; + + // Check if a memoized result exists. + var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize); + if (memoizeResultLeft !== null) { + return memoizeResultLeft; + } + var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize); + if (memoizeResultRight !== null) { + return memoizeResultRight; + } + + // If a comparator is present, use it. + if (comparator) { + var comparatorResult = comparator(leftHandOperand, rightHandOperand); + // Comparators may return null, in which case we want to go back to default behavior. + if (comparatorResult === false || comparatorResult === true) { + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult); + return comparatorResult; + } + // To allow comparators to override *any* behavior, we ran them first. Since it didn't decide + // what to do, we need to make sure to return the basic tests first before we move on. + var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); + if (simpleResult !== null) { + // Don't memoize this, it takes longer to set/retrieve than to just compare. + return simpleResult; + } + } + + var leftHandType = typeDetect(leftHandOperand); + if (leftHandType !== typeDetect(rightHandOperand)) { + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false); + return false; + } + + // Temporarily set the operands in the memoize object to prevent blowing the stack + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true); + + var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options); + memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result); + return result; + } + + function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) { + switch (leftHandType) { + case 'String': + case 'Number': + case 'Boolean': + case 'Date': + // If these types are their instance types (e.g. `new Number`) then re-deepEqual against their values + return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf()); + case 'Promise': + case 'Symbol': + case 'function': + case 'WeakMap': + case 'WeakSet': + case 'Error': + return leftHandOperand === rightHandOperand; + case 'Arguments': + case 'Int8Array': + case 'Uint8Array': + case 'Uint8ClampedArray': + case 'Int16Array': + case 'Uint16Array': + case 'Int32Array': + case 'Uint32Array': + case 'Float32Array': + case 'Float64Array': + case 'Array': + return iterableEqual(leftHandOperand, rightHandOperand, options); + case 'RegExp': + return regexpEqual(leftHandOperand, rightHandOperand); + case 'Generator': + return generatorEqual(leftHandOperand, rightHandOperand, options); + case 'DataView': + return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options); + case 'ArrayBuffer': + return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options); + case 'Set': + return entriesEqual(leftHandOperand, rightHandOperand, options); + case 'Map': + return entriesEqual(leftHandOperand, rightHandOperand, options); + default: + return objectEqual(leftHandOperand, rightHandOperand, options); + } + } + + /*! + * Compare two Regular Expressions for equality. + * + * @param {RegExp} leftHandOperand + * @param {RegExp} rightHandOperand + * @return {Boolean} result + */ + + function regexpEqual(leftHandOperand, rightHandOperand) { + return leftHandOperand.toString() === rightHandOperand.toString(); + } + + /*! + * Compare two Sets/Maps for equality. Faster than other equality functions. + * + * @param {Set} leftHandOperand + * @param {Set} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + + function entriesEqual(leftHandOperand, rightHandOperand, options) { + // IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach + if (leftHandOperand.size !== rightHandOperand.size) { + return false; + } + if (leftHandOperand.size === 0) { + return true; + } + var leftHandItems = []; + var rightHandItems = []; + leftHandOperand.forEach(function gatherEntries(key, value) { + leftHandItems.push([ key, value ]); + }); + rightHandOperand.forEach(function gatherEntries(key, value) { + rightHandItems.push([ key, value ]); + }); + return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options); + } + + /*! + * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + + function iterableEqual(leftHandOperand, rightHandOperand, options) { + var length = leftHandOperand.length; + if (length !== rightHandOperand.length) { + return false; + } + if (length === 0) { + return true; + } + var index = -1; + while (++index < length) { + if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) { + return false; + } + } + return true; + } + + /*! + * Simple equality for generator objects such as those returned by generator functions. + * + * @param {Iterable} leftHandOperand + * @param {Iterable} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + + function generatorEqual(leftHandOperand, rightHandOperand, options) { + return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options); + } + + /*! + * Determine if the given object has an @@iterator function. + * + * @param {Object} target + * @return {Boolean} `true` if the object has an @@iterator function. + */ + function hasIteratorFunction(target) { + return typeof Symbol !== 'undefined' && + typeof target === 'object' && + typeof Symbol.iterator !== 'undefined' && + typeof target[Symbol.iterator] === 'function'; + } + + /*! + * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array. + * This will consume the iterator - which could have side effects depending on the @@iterator implementation. + * + * @param {Object} target + * @returns {Array} an array of entries from the @@iterator function + */ + function getIteratorEntries(target) { + if (hasIteratorFunction(target)) { + try { + return getGeneratorEntries(target[Symbol.iterator]()); + } catch (iteratorError) { + return []; + } + } + return []; + } + + /*! + * Gets all entries from a Generator. This will consume the generator - which could have side effects. + * + * @param {Generator} target + * @returns {Array} an array of entries from the Generator. + */ + function getGeneratorEntries(generator) { + var generatorResult = generator.next(); + var accumulator = [ generatorResult.value ]; + while (generatorResult.done === false) { + generatorResult = generator.next(); + accumulator.push(generatorResult.value); + } + return accumulator; + } + + /*! + * Gets all own and inherited enumerable keys from a target. + * + * @param {Object} target + * @returns {Array} an array of own and inherited enumerable keys from the target. + */ + function getEnumerableKeys(target) { + var keys = []; + for (var key in target) { + keys.push(key); + } + return keys; + } + + /*! + * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of + * each key. If any value of the given key is not equal, the function will return false (early). + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + function keysEqual(leftHandOperand, rightHandOperand, keys, options) { + var length = keys.length; + if (length === 0) { + return true; + } + for (var i = 0; i < length; i += 1) { + if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) { + return false; + } + } + return true; + } + + /*! + * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual` + * for each enumerable key in the object. + * + * @param {Mixed} leftHandOperand + * @param {Mixed} rightHandOperand + * @param {Object} [options] (Optional) + * @return {Boolean} result + */ + + function objectEqual(leftHandOperand, rightHandOperand, options) { + var leftHandKeys = getEnumerableKeys(leftHandOperand); + var rightHandKeys = getEnumerableKeys(rightHandOperand); + if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) { + leftHandKeys.sort(); + rightHandKeys.sort(); + if (iterableEqual(leftHandKeys, rightHandKeys) === false) { + return false; + } + return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options); + } + + var leftHandEntries = getIteratorEntries(leftHandOperand); + var rightHandEntries = getIteratorEntries(rightHandOperand); + if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) { + leftHandEntries.sort(); + rightHandEntries.sort(); + return iterableEqual(leftHandEntries, rightHandEntries, options); + } + + if (leftHandKeys.length === 0 && + leftHandEntries.length === 0 && + rightHandKeys.length === 0 && + rightHandEntries.length === 0) { + return true; + } + + return false; + } + + /*! + * Returns true if the argument is a primitive. + * + * This intentionally returns true for all objects that can be compared by reference, + * including functions and symbols. + * + * @param {Mixed} value + * @return {Boolean} result + */ + function isPrimitive(value) { + return value === null || typeof value !== 'object'; + } + deepEql.MemoizeMap = MemoizeMap_1; + + /*! + * Chai - isProxyEnabled helper + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /** + * ### .isProxyEnabled() + * + * Helper function to check if Chai's proxy protection feature is enabled. If + * proxies are unsupported or disabled via the user's Chai config, then return + * false. Otherwise, return true. + * + * @namespace Utils + * @name isProxyEnabled + */ + + var isProxyEnabled = function isProxyEnabled() { + return config.useProxy && + typeof Proxy !== 'undefined' && + typeof Reflect !== 'undefined'; + }; + + /*! + * Chai - addProperty utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + + + + + + /** + * ### .addProperty(ctx, name, getter) + * + * Adds a property to the prototype of an object. + * + * utils.addProperty(chai.Assertion.prototype, 'foo', function () { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.instanceof(Foo); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addProperty('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.be.foo; + * + * @param {Object} ctx object to which the property is added + * @param {String} name of property to add + * @param {Function} getter function to be used for name + * @namespace Utils + * @name addProperty + * @api public + */ + + var addProperty = function addProperty(ctx, name, getter) { + getter = getter === undefined ? function () {} : getter; + + Object.defineProperty(ctx, name, + { get: function propertyGetter() { + // Setting the `ssfi` flag to `propertyGetter` causes this function to + // be the starting point for removing implementation frames from the + // stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if + // the `lockSsfi` flag isn't set and proxy protection is disabled. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked + // from inside of another assertion. In the first case, the `ssfi` flag + // has already been set by the overwriting assertion. In the second + // case, the `ssfi` flag has already been set by the outer assertion. + // + // If proxy protection is enabled, then the `ssfi` flag has already been + // set by the proxy getter. + if (!isProxyEnabled() && !flag(this, 'lockSsfi')) { + flag(this, 'ssfi', propertyGetter); + } + + var result = getter.call(this); + if (result !== undefined) + return result; + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + } + , configurable: true + }); + }; + + var fnLengthDesc = Object.getOwnPropertyDescriptor(function () {}, 'length'); + + /*! + * Chai - addLengthGuard utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /** + * ### .addLengthGuard(fn, assertionName, isChainable) + * + * Define `length` as a getter on the given uninvoked method assertion. The + * getter acts as a guard against chaining `length` directly off of an uninvoked + * method assertion, which is a problem because it references `function`'s + * built-in `length` property instead of Chai's `length` assertion. When the + * getter catches the user making this mistake, it throws an error with a + * helpful message. + * + * There are two ways in which this mistake can be made. The first way is by + * chaining the `length` assertion directly off of an uninvoked chainable + * method. In this case, Chai suggests that the user use `lengthOf` instead. The + * second way is by chaining the `length` assertion directly off of an uninvoked + * non-chainable method. Non-chainable methods must be invoked prior to + * chaining. In this case, Chai suggests that the user consult the docs for the + * given assertion. + * + * If the `length` property of functions is unconfigurable, then return `fn` + * without modification. + * + * Note that in ES6, the function's `length` property is configurable, so once + * support for legacy environments is dropped, Chai's `length` property can + * replace the built-in function's `length` property, and this length guard will + * no longer be necessary. In the mean time, maintaining consistency across all + * environments is the priority. + * + * @param {Function} fn + * @param {String} assertionName + * @param {Boolean} isChainable + * @namespace Utils + * @name addLengthGuard + */ + + var addLengthGuard = function addLengthGuard (fn, assertionName, isChainable) { + if (!fnLengthDesc.configurable) return fn; + + Object.defineProperty(fn, 'length', { + get: function () { + if (isChainable) { + throw Error('Invalid Chai property: ' + assertionName + '.length. Due' + + ' to a compatibility issue, "length" cannot directly follow "' + + assertionName + '". Use "' + assertionName + '.lengthOf" instead.'); + } + + throw Error('Invalid Chai property: ' + assertionName + '.length. See' + + ' docs for proper usage of "' + assertionName + '".'); + } + }); + + return fn; + }; + + /*! + * Chai - proxify utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /** + * ### .proxify(object) + * + * Return a proxy of given object that throws an error when a non-existent + * property is read. By default, the root cause is assumed to be a misspelled + * property, and thus an attempt is made to offer a reasonable suggestion from + * the list of existing properties. However, if a nonChainableMethodName is + * provided, then the root cause is instead a failure to invoke a non-chainable + * method prior to reading the non-existent property. + * + * If proxies are unsupported or disabled via the user's Chai config, then + * return object without modification. + * + * @param {Object} obj + * @param {String} nonChainableMethodName + * @namespace Utils + * @name proxify + */ + + var builtins = ['__flags', '__methods', '_obj', 'assert']; + + var proxify = function proxify(obj, nonChainableMethodName) { + if (!isProxyEnabled()) return obj; + + return new Proxy(obj, { + get: function proxyGetter(target, property) { + // This check is here because we should not throw errors on Symbol properties + // such as `Symbol.toStringTag`. + // The values for which an error should be thrown can be configured using + // the `config.proxyExcludedKeys` setting. + if (typeof property === 'string' && + config.proxyExcludedKeys.indexOf(property) === -1 && + !Reflect.has(target, property)) { + // Special message for invalid property access of non-chainable methods. + if (nonChainableMethodName) { + throw Error('Invalid Chai property: ' + nonChainableMethodName + '.' + + property + '. See docs for proper usage of "' + + nonChainableMethodName + '".'); + } + + // If the property is reasonably close to an existing Chai property, + // suggest that property to the user. Only suggest properties with a + // distance less than 4. + var suggestion = null; + var suggestionDistance = 4; + getProperties(target).forEach(function(prop) { + if ( + !Object.prototype.hasOwnProperty(prop) && + builtins.indexOf(prop) === -1 + ) { + var dist = stringDistanceCapped( + property, + prop, + suggestionDistance + ); + if (dist < suggestionDistance) { + suggestion = prop; + suggestionDistance = dist; + } + } + }); + + if (suggestion !== null) { + throw Error('Invalid Chai property: ' + property + + '. Did you mean "' + suggestion + '"?'); + } else { + throw Error('Invalid Chai property: ' + property); + } + } + + // Use this proxy getter as the starting point for removing implementation + // frames from the stack trace of a failed assertion. For property + // assertions, this prevents the proxy getter from showing up in the stack + // trace since it's invoked before the property getter. For method and + // chainable method assertions, this flag will end up getting changed to + // the method wrapper, which is good since this frame will no longer be in + // the stack once the method is invoked. Note that Chai builtin assertion + // properties such as `__flags` are skipped since this is only meant to + // capture the starting point of an assertion. This step is also skipped + // if the `lockSsfi` flag is set, thus indicating that this assertion is + // being called from within another assertion. In that case, the `ssfi` + // flag is already set to the outer assertion's starting point. + if (builtins.indexOf(property) === -1 && !flag(target, 'lockSsfi')) { + flag(target, 'ssfi', proxyGetter); + } + + return Reflect.get(target, property); + } + }); + }; + + /** + * # stringDistanceCapped(strA, strB, cap) + * Return the Levenshtein distance between two strings, but no more than cap. + * @param {string} strA + * @param {string} strB + * @param {number} number + * @return {number} min(string distance between strA and strB, cap) + * @api private + */ + + function stringDistanceCapped(strA, strB, cap) { + if (Math.abs(strA.length - strB.length) >= cap) { + return cap; + } + + var memo = []; + // `memo` is a two-dimensional array containing distances. + // memo[i][j] is the distance between strA.slice(0, i) and + // strB.slice(0, j). + for (var i = 0; i <= strA.length; i++) { + memo[i] = Array(strB.length + 1).fill(0); + memo[i][0] = i; + } + for (var j = 0; j < strB.length; j++) { + memo[0][j] = j; + } + + for (var i = 1; i <= strA.length; i++) { + var ch = strA.charCodeAt(i - 1); + for (var j = 1; j <= strB.length; j++) { + if (Math.abs(i - j) >= cap) { + memo[i][j] = cap; + continue; + } + memo[i][j] = Math.min( + memo[i - 1][j] + 1, + memo[i][j - 1] + 1, + memo[i - 1][j - 1] + + (ch === strB.charCodeAt(j - 1) ? 0 : 1) + ); + } + } + + return memo[strA.length][strB.length]; + } + + /*! + * Chai - addMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + + + + + + + /** + * ### .addMethod(ctx, name, method) + * + * Adds a method to the prototype of an object. + * + * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.equal(str); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addMethod('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(fooStr).to.be.foo('bar'); + * + * @param {Object} ctx object to which the method is added + * @param {String} name of method to add + * @param {Function} method function to be used for name + * @namespace Utils + * @name addMethod + * @api public + */ + + var addMethod = function addMethod(ctx, name, method) { + var methodWrapper = function () { + // Setting the `ssfi` flag to `methodWrapper` causes this function to be the + // starting point for removing implementation frames from the stack trace of + // a failed assertion. + // + // However, we only want to use this function as the starting point if the + // `lockSsfi` flag isn't set. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked from + // inside of another assertion. In the first case, the `ssfi` flag has + // already been set by the overwriting assertion. In the second case, the + // `ssfi` flag has already been set by the outer assertion. + if (!flag(this, 'lockSsfi')) { + flag(this, 'ssfi', methodWrapper); + } + + var result = method.apply(this, arguments); + if (result !== undefined) + return result; + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + addLengthGuard(methodWrapper, name, false); + ctx[name] = proxify(methodWrapper, name); + }; + + /*! + * Chai - overwriteProperty utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + + + + + + /** + * ### .overwriteProperty(ctx, name, fn) + * + * Overwrites an already existing property getter and provides + * access to previous value. Must return function to use as getter. + * + * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) { + * return function () { + * var obj = utils.flag(this, 'object'); + * if (obj instanceof Foo) { + * new chai.Assertion(obj.name).to.equal('bar'); + * } else { + * _super.call(this); + * } + * } + * }); + * + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteProperty('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.be.ok; + * + * @param {Object} ctx object whose property is to be overwritten + * @param {String} name of property to overwrite + * @param {Function} getter function that returns a getter function to be used for name + * @namespace Utils + * @name overwriteProperty + * @api public + */ + + var overwriteProperty = function overwriteProperty(ctx, name, getter) { + var _get = Object.getOwnPropertyDescriptor(ctx, name) + , _super = function () {}; + + if (_get && 'function' === typeof _get.get) + _super = _get.get; + + Object.defineProperty(ctx, name, + { get: function overwritingPropertyGetter() { + // Setting the `ssfi` flag to `overwritingPropertyGetter` causes this + // function to be the starting point for removing implementation frames + // from the stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if + // the `lockSsfi` flag isn't set and proxy protection is disabled. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked + // from inside of another assertion. In the first case, the `ssfi` flag + // has already been set by the overwriting assertion. In the second + // case, the `ssfi` flag has already been set by the outer assertion. + // + // If proxy protection is enabled, then the `ssfi` flag has already been + // set by the proxy getter. + if (!isProxyEnabled() && !flag(this, 'lockSsfi')) { + flag(this, 'ssfi', overwritingPropertyGetter); + } + + // Setting the `lockSsfi` flag to `true` prevents the overwritten + // assertion from changing the `ssfi` flag. By this point, the `ssfi` + // flag is already set to the correct starting point for this assertion. + var origLockSsfi = flag(this, 'lockSsfi'); + flag(this, 'lockSsfi', true); + var result = getter(_super).call(this); + flag(this, 'lockSsfi', origLockSsfi); + + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + } + , configurable: true + }); + }; + + /*! + * Chai - overwriteMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + + + + + + + /** + * ### .overwriteMethod(ctx, name, fn) + * + * Overwrites an already existing method and provides + * access to previous function. Must return function + * to be used for name. + * + * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) { + * return function (str) { + * var obj = utils.flag(this, 'object'); + * if (obj instanceof Foo) { + * new chai.Assertion(obj.value).to.equal(str); + * } else { + * _super.apply(this, arguments); + * } + * } + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteMethod('foo', fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.equal('bar'); + * + * @param {Object} ctx object whose method is to be overwritten + * @param {String} name of method to overwrite + * @param {Function} method function that returns a function to be used for name + * @namespace Utils + * @name overwriteMethod + * @api public + */ + + var overwriteMethod = function overwriteMethod(ctx, name, method) { + var _method = ctx[name] + , _super = function () { + throw new Error(name + ' is not a function'); + }; + + if (_method && 'function' === typeof _method) + _super = _method; + + var overwritingMethodWrapper = function () { + // Setting the `ssfi` flag to `overwritingMethodWrapper` causes this + // function to be the starting point for removing implementation frames from + // the stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if the + // `lockSsfi` flag isn't set. + // + // If the `lockSsfi` flag is set, then either this assertion has been + // overwritten by another assertion, or this assertion is being invoked from + // inside of another assertion. In the first case, the `ssfi` flag has + // already been set by the overwriting assertion. In the second case, the + // `ssfi` flag has already been set by the outer assertion. + if (!flag(this, 'lockSsfi')) { + flag(this, 'ssfi', overwritingMethodWrapper); + } + + // Setting the `lockSsfi` flag to `true` prevents the overwritten assertion + // from changing the `ssfi` flag. By this point, the `ssfi` flag is already + // set to the correct starting point for this assertion. + var origLockSsfi = flag(this, 'lockSsfi'); + flag(this, 'lockSsfi', true); + var result = method(_super).apply(this, arguments); + flag(this, 'lockSsfi', origLockSsfi); + + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + addLengthGuard(overwritingMethodWrapper, name, false); + ctx[name] = proxify(overwritingMethodWrapper, name); + }; + + /*! + * Chai - addChainingMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + /*! + * Module dependencies + */ + + + + + + + + /*! + * Module variables + */ + + // Check whether `Object.setPrototypeOf` is supported + var canSetPrototype = typeof Object.setPrototypeOf === 'function'; + + // Without `Object.setPrototypeOf` support, this module will need to add properties to a function. + // However, some of functions' own props are not configurable and should be skipped. + var testFn = function() {}; + var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) { + var propDesc = Object.getOwnPropertyDescriptor(testFn, name); + + // Note: PhantomJS 1.x includes `callee` as one of `testFn`'s own properties, + // but then returns `undefined` as the property descriptor for `callee`. As a + // workaround, we perform an otherwise unnecessary type-check for `propDesc`, + // and then filter it out if it's not an object as it should be. + if (typeof propDesc !== 'object') + return true; + + return !propDesc.configurable; + }); + + // Cache `Function` properties + var call = Function.prototype.call, + apply = Function.prototype.apply; + + /** + * ### .addChainableMethod(ctx, name, method, chainingBehavior) + * + * Adds a method to an object, such that the method can also be chained. + * + * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) { + * var obj = utils.flag(this, 'object'); + * new chai.Assertion(obj).to.be.equal(str); + * }); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior); + * + * The result can then be used as both a method assertion, executing both `method` and + * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`. + * + * expect(fooStr).to.be.foo('bar'); + * expect(fooStr).to.be.foo.equal('foo'); + * + * @param {Object} ctx object to which the method is added + * @param {String} name of method to add + * @param {Function} method function to be used for `name`, when called + * @param {Function} chainingBehavior function to be called every time the property is accessed + * @namespace Utils + * @name addChainableMethod + * @api public + */ + + var addChainableMethod = function addChainableMethod(ctx, name, method, chainingBehavior) { + if (typeof chainingBehavior !== 'function') { + chainingBehavior = function () { }; + } + + var chainableBehavior = { + method: method + , chainingBehavior: chainingBehavior + }; + + // save the methods so we can overwrite them later, if we need to. + if (!ctx.__methods) { + ctx.__methods = {}; + } + ctx.__methods[name] = chainableBehavior; + + Object.defineProperty(ctx, name, + { get: function chainableMethodGetter() { + chainableBehavior.chainingBehavior.call(this); + + var chainableMethodWrapper = function () { + // Setting the `ssfi` flag to `chainableMethodWrapper` causes this + // function to be the starting point for removing implementation + // frames from the stack trace of a failed assertion. + // + // However, we only want to use this function as the starting point if + // the `lockSsfi` flag isn't set. + // + // If the `lockSsfi` flag is set, then this assertion is being + // invoked from inside of another assertion. In this case, the `ssfi` + // flag has already been set by the outer assertion. + // + // Note that overwriting a chainable method merely replaces the saved + // methods in `ctx.__methods` instead of completely replacing the + // overwritten assertion. Therefore, an overwriting assertion won't + // set the `ssfi` or `lockSsfi` flags. + if (!flag(this, 'lockSsfi')) { + flag(this, 'ssfi', chainableMethodWrapper); + } + + var result = chainableBehavior.method.apply(this, arguments); + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + addLengthGuard(chainableMethodWrapper, name, true); + + // Use `Object.setPrototypeOf` if available + if (canSetPrototype) { + // Inherit all properties from the object by replacing the `Function` prototype + var prototype = Object.create(this); + // Restore the `call` and `apply` methods from `Function` + prototype.call = call; + prototype.apply = apply; + Object.setPrototypeOf(chainableMethodWrapper, prototype); + } + // Otherwise, redefine all properties (slow!) + else { + var asserterNames = Object.getOwnPropertyNames(ctx); + asserterNames.forEach(function (asserterName) { + if (excludeNames.indexOf(asserterName) !== -1) { + return; + } + + var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); + Object.defineProperty(chainableMethodWrapper, asserterName, pd); + }); + } + + transferFlags(this, chainableMethodWrapper); + return proxify(chainableMethodWrapper); + } + , configurable: true + }); + }; + + /*! + * Chai - overwriteChainableMethod utility + * Copyright(c) 2012-2014 Jake Luer + * MIT Licensed + */ + + + + + /** + * ### .overwriteChainableMethod(ctx, name, method, chainingBehavior) + * + * Overwrites an already existing chainable method + * and provides access to the previous function or + * property. Must return functions to be used for + * name. + * + * utils.overwriteChainableMethod(chai.Assertion.prototype, 'lengthOf', + * function (_super) { + * } + * , function (_super) { + * } + * ); + * + * Can also be accessed directly from `chai.Assertion`. + * + * chai.Assertion.overwriteChainableMethod('foo', fn, fn); + * + * Then can be used as any other assertion. + * + * expect(myFoo).to.have.lengthOf(3); + * expect(myFoo).to.have.lengthOf.above(3); + * + * @param {Object} ctx object whose method / property is to be overwritten + * @param {String} name of method / property to overwrite + * @param {Function} method function that returns a function to be used for name + * @param {Function} chainingBehavior function that returns a function to be used for property + * @namespace Utils + * @name overwriteChainableMethod + * @api public + */ + + var overwriteChainableMethod = function overwriteChainableMethod(ctx, name, method, chainingBehavior) { + var chainableBehavior = ctx.__methods[name]; + + var _chainingBehavior = chainableBehavior.chainingBehavior; + chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() { + var result = chainingBehavior(_chainingBehavior).call(this); + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + + var _method = chainableBehavior.method; + chainableBehavior.method = function overwritingChainableMethodWrapper() { + var result = method(_method).apply(this, arguments); + if (result !== undefined) { + return result; + } + + var newAssertion = new chai.Assertion(); + transferFlags(this, newAssertion); + return newAssertion; + }; + }; + + /*! + * Chai - compareByInspect utility + * Copyright(c) 2011-2016 Jake Luer + * MIT Licensed + */ + + /*! + * Module dependencies + */ + + + + /** + * ### .compareByInspect(mixed, mixed) + * + * To be used as a compareFunction with Array.prototype.sort. Compares elements + * using inspect instead of default behavior of using toString so that Symbols + * and objects with irregular/missing toString can still be sorted without a + * TypeError. + * + * @param {Mixed} first element to compare + * @param {Mixed} second element to compare + * @returns {Number} -1 if 'a' should come before 'b'; otherwise 1 + * @name compareByInspect + * @namespace Utils + * @api public + */ + + var compareByInspect = function compareByInspect(a, b) { + return inspect_1(a) < inspect_1(b) ? -1 : 1; + }; + + /*! + * Chai - getOwnEnumerablePropertySymbols utility + * Copyright(c) 2011-2016 Jake Luer + * MIT Licensed + */ + + /** + * ### .getOwnEnumerablePropertySymbols(object) + * + * This allows the retrieval of directly-owned enumerable property symbols of an + * object. This function is necessary because Object.getOwnPropertySymbols + * returns both enumerable and non-enumerable property symbols. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getOwnEnumerablePropertySymbols + * @api public + */ + + var getOwnEnumerablePropertySymbols = function getOwnEnumerablePropertySymbols(obj) { + if (typeof Object.getOwnPropertySymbols !== 'function') return []; + + return Object.getOwnPropertySymbols(obj).filter(function (sym) { + return Object.getOwnPropertyDescriptor(obj, sym).enumerable; + }); + }; + + /*! + * Chai - getOwnEnumerableProperties utility + * Copyright(c) 2011-2016 Jake Luer + * MIT Licensed + */ + + /*! + * Module dependencies + */ + + + + /** + * ### .getOwnEnumerableProperties(object) + * + * This allows the retrieval of directly-owned enumerable property names and + * symbols of an object. This function is necessary because Object.keys only + * returns enumerable property names, not enumerable property symbols. + * + * @param {Object} object + * @returns {Array} + * @namespace Utils + * @name getOwnEnumerableProperties + * @api public + */ + + var getOwnEnumerableProperties = function getOwnEnumerableProperties(obj) { + return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj)); + }; + + /* ! + * Chai - checkError utility + * Copyright(c) 2012-2016 Jake Luer + * MIT Licensed + */ + + /** + * ### .checkError + * + * Checks that an error conforms to a given set of criteria and/or retrieves information about it. + * + * @api public + */ + + /** + * ### .compatibleInstance(thrown, errorLike) + * + * Checks if two instances are compatible (strict equal). + * Returns false if errorLike is not an instance of Error, because instances + * can only be compatible if they're both error instances. + * + * @name compatibleInstance + * @param {Error} thrown error + * @param {Error|ErrorConstructor} errorLike object to compare against + * @namespace Utils + * @api public + */ + + function compatibleInstance(thrown, errorLike) { + return errorLike instanceof Error && thrown === errorLike; + } + + /** + * ### .compatibleConstructor(thrown, errorLike) + * + * Checks if two constructors are compatible. + * This function can receive either an error constructor or + * an error instance as the `errorLike` argument. + * Constructors are compatible if they're the same or if one is + * an instance of another. + * + * @name compatibleConstructor + * @param {Error} thrown error + * @param {Error|ErrorConstructor} errorLike object to compare against + * @namespace Utils + * @api public + */ + + function compatibleConstructor(thrown, errorLike) { + if (errorLike instanceof Error) { + // If `errorLike` is an instance of any error we compare their constructors + return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor; + } else if (errorLike.prototype instanceof Error || errorLike === Error) { + // If `errorLike` is a constructor that inherits from Error, we compare `thrown` to `errorLike` directly + return thrown.constructor === errorLike || thrown instanceof errorLike; + } + + return false; + } + + /** + * ### .compatibleMessage(thrown, errMatcher) + * + * Checks if an error's message is compatible with a matcher (String or RegExp). + * If the message contains the String or passes the RegExp test, + * it is considered compatible. + * + * @name compatibleMessage + * @param {Error} thrown error + * @param {String|RegExp} errMatcher to look for into the message + * @namespace Utils + * @api public + */ + + function compatibleMessage(thrown, errMatcher) { + var comparisonString = typeof thrown === 'string' ? thrown : thrown.message; + if (errMatcher instanceof RegExp) { + return errMatcher.test(comparisonString); + } else if (typeof errMatcher === 'string') { + return comparisonString.indexOf(errMatcher) !== -1; // eslint-disable-line no-magic-numbers + } + + return false; + } + + /** + * ### .getFunctionName(constructorFn) + * + * Returns the name of a function. + * This also includes a polyfill function if `constructorFn.name` is not defined. + * + * @name getFunctionName + * @param {Function} constructorFn + * @namespace Utils + * @api private + */ + + var functionNameMatch$1 = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\(\/]+)/; + function getFunctionName(constructorFn) { + var name = ''; + if (typeof constructorFn.name === 'undefined') { + // Here we run a polyfill if constructorFn.name is not defined + var match = String(constructorFn).match(functionNameMatch$1); + if (match) { + name = match[1]; + } + } else { + name = constructorFn.name; + } + + return name; + } + + /** + * ### .getConstructorName(errorLike) + * + * Gets the constructor name for an Error instance or constructor itself. + * + * @name getConstructorName + * @param {Error|ErrorConstructor} errorLike + * @namespace Utils + * @api public + */ + + function getConstructorName(errorLike) { + var constructorName = errorLike; + if (errorLike instanceof Error) { + constructorName = getFunctionName(errorLike.constructor); + } else if (typeof errorLike === 'function') { + // If `err` is not an instance of Error it is an error constructor itself or another function. + // If we've got a common function we get its name, otherwise we may need to create a new instance + // of the error just in case it's a poorly-constructed error. Please see chaijs/chai/issues/45 to know more. + constructorName = getFunctionName(errorLike).trim() || + getFunctionName(new errorLike()); // eslint-disable-line new-cap + } + + return constructorName; + } + + /** + * ### .getMessage(errorLike) + * + * Gets the error message from an error. + * If `err` is a String itself, we return it. + * If the error has no message, we return an empty string. + * + * @name getMessage + * @param {Error|String} errorLike + * @namespace Utils + * @api public + */ + + function getMessage$1(errorLike) { + var msg = ''; + if (errorLike && errorLike.message) { + msg = errorLike.message; + } else if (typeof errorLike === 'string') { + msg = errorLike; + } + + return msg; + } + + var checkError = { + compatibleInstance: compatibleInstance, + compatibleConstructor: compatibleConstructor, + compatibleMessage: compatibleMessage, + getMessage: getMessage$1, + getConstructorName: getConstructorName, + }; + + /*! + * Chai - isNaN utility + * Copyright(c) 2012-2015 Sakthipriyan Vairamani + * MIT Licensed + */ + + /** + * ### .isNaN(value) + * + * Checks if the given value is NaN or not. + * + * utils.isNaN(NaN); // true + * + * @param {Value} The value which has to be checked if it is NaN + * @name isNaN + * @api private + */ + + function isNaN$1(value) { + // Refer http://www.ecma-international.org/ecma-262/6.0/#sec-isnan-number + // section's NOTE. + return value !== value; + } + + // If ECMAScript 6's Number.isNaN is present, prefer that. + var _isNaN = Number.isNaN || isNaN$1; + + /*! + * chai + * Copyright(c) 2011 Jake Luer + * MIT Licensed + */ + + /*! + * Dependencies that are used for multiple exports are required here only once + */ + + + + /*! + * test utility + */ + + var test$1 = test; + + /*! + * type utility + */ + + var type = typeDetect; + + /*! + * expectTypes utility + */ + var expectTypes$1 = expectTypes; + + /*! + * message utility + */ + + var getMessage$2 = getMessage; + + /*! + * actual utility + */ + + var getActual$1 = getActual; + + /*! + * Inspect util + */ + + var inspect = inspect_1; + + /*! + * Object Display util + */ + + var objDisplay$1 = objDisplay; + + /*! + * Flag utility + */ + + var flag$1 = flag; + + /*! + * Flag transferring utility + */ + + var transferFlags$1 = transferFlags; + + /*! + * Deep equal utility + */ + + var eql = deepEql; + + /*! + * Deep path info + */ + + var getPathInfo$1 = pathval.getPathInfo; + + /*! + * Check if a property exists + */ + + var hasProperty$1 = pathval.hasProperty; + + /*! + * Function name + */ + + var getName = getFuncName_1; + + /*! + * add Property + */ + + var addProperty$1 = addProperty; + + /*! + * add Method + */ + + var addMethod$1 = addMethod; + + /*! + * overwrite Property + */ + + var overwriteProperty$1 = overwriteProperty; + + /*! + * overwrite Method + */ + + var overwriteMethod$1 = overwriteMethod; + + /*! + * Add a chainable method + */ + + var addChainableMethod$1 = addChainableMethod; + + /*! + * Overwrite chainable method + */ + + var overwriteChainableMethod$1 = overwriteChainableMethod; + + /*! + * Compare by inspect method + */ + + var compareByInspect$1 = compareByInspect; + + /*! + * Get own enumerable property symbols method + */ + + var getOwnEnumerablePropertySymbols$1 = getOwnEnumerablePropertySymbols; + + /*! + * Get own enumerable properties method + */ + + var getOwnEnumerableProperties$1 = getOwnEnumerableProperties; + + /*! + * Checks error against a given set of criteria + */ + + var checkError$1 = checkError; + + /*! + * Proxify util + */ + + var proxify$1 = proxify; + + /*! + * addLengthGuard util + */ + + var addLengthGuard$1 = addLengthGuard; + + /*! + * isProxyEnabled helper + */ + + var isProxyEnabled$1 = isProxyEnabled; + + /*! + * isNaN method + */ + + var isNaN$2 = _isNaN; + + var utils = { + test: test$1, + type: type, + expectTypes: expectTypes$1, + getMessage: getMessage$2, + getActual: getActual$1, + inspect: inspect, + objDisplay: objDisplay$1, + flag: flag$1, + transferFlags: transferFlags$1, + eql: eql, + getPathInfo: getPathInfo$1, + hasProperty: hasProperty$1, + getName: getName, + addProperty: addProperty$1, + addMethod: addMethod$1, + overwriteProperty: overwriteProperty$1, + overwriteMethod: overwriteMethod$1, + addChainableMethod: addChainableMethod$1, + overwriteChainableMethod: overwriteChainableMethod$1, + compareByInspect: compareByInspect$1, + getOwnEnumerablePropertySymbols: getOwnEnumerablePropertySymbols$1, + getOwnEnumerableProperties: getOwnEnumerableProperties$1, + checkError: checkError$1, + proxify: proxify$1, + addLengthGuard: addLengthGuard$1, + isProxyEnabled: isProxyEnabled$1, + isNaN: isNaN$2 + }; + + /*! + * chai + * http://chaijs.com + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + + + + var assertion = function (_chai, util) { + /*! + * Module dependencies. + */ + + var AssertionError = _chai.AssertionError + , flag = util.flag; + + /*! + * Module export. + */ + + _chai.Assertion = Assertion; + + /*! + * Assertion Constructor + * + * Creates object for chaining. + * + * `Assertion` objects contain metadata in the form of flags. Three flags can + * be assigned during instantiation by passing arguments to this constructor: + * + * - `object`: This flag contains the target of the assertion. For example, in + * the assertion `expect(numKittens).to.equal(7);`, the `object` flag will + * contain `numKittens` so that the `equal` assertion can reference it when + * needed. + * + * - `message`: This flag contains an optional custom error message to be + * prepended to the error message that's generated by the assertion when it + * fails. + * + * - `ssfi`: This flag stands for "start stack function indicator". It + * contains a function reference that serves as the starting point for + * removing frames from the stack trace of the error that's created by the + * assertion when it fails. The goal is to provide a cleaner stack trace to + * end users by removing Chai's internal functions. Note that it only works + * in environments that support `Error.captureStackTrace`, and only when + * `Chai.config.includeStack` hasn't been set to `false`. + * + * - `lockSsfi`: This flag controls whether or not the given `ssfi` flag + * should retain its current value, even as assertions are chained off of + * this object. This is usually set to `true` when creating a new assertion + * from within another assertion. It's also temporarily set to `true` before + * an overwritten assertion gets called by the overwriting assertion. + * + * @param {Mixed} obj target of the assertion + * @param {String} msg (optional) custom error message + * @param {Function} ssfi (optional) starting point for removing stack frames + * @param {Boolean} lockSsfi (optional) whether or not the ssfi flag is locked + * @api private + */ + + function Assertion (obj, msg, ssfi, lockSsfi) { + flag(this, 'ssfi', ssfi || Assertion); + flag(this, 'lockSsfi', lockSsfi); + flag(this, 'object', obj); + flag(this, 'message', msg); + + return util.proxify(this); + } + + Object.defineProperty(Assertion, 'includeStack', { + get: function() { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + return config.includeStack; + }, + set: function(value) { + console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); + config.includeStack = value; + } + }); + + Object.defineProperty(Assertion, 'showDiff', { + get: function() { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + return config.showDiff; + }, + set: function(value) { + console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); + config.showDiff = value; + } + }); + + Assertion.addProperty = function (name, fn) { + util.addProperty(this.prototype, name, fn); + }; + + Assertion.addMethod = function (name, fn) { + util.addMethod(this.prototype, name, fn); + }; + + Assertion.addChainableMethod = function (name, fn, chainingBehavior) { + util.addChainableMethod(this.prototype, name, fn, chainingBehavior); + }; + + Assertion.overwriteProperty = function (name, fn) { + util.overwriteProperty(this.prototype, name, fn); + }; + + Assertion.overwriteMethod = function (name, fn) { + util.overwriteMethod(this.prototype, name, fn); + }; + + Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) { + util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior); + }; + + /** + * ### .assert(expression, message, negateMessage, expected, actual, showDiff) + * + * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. + * + * @name assert + * @param {Philosophical} expression to be tested + * @param {String|Function} message or function that returns message to display if expression fails + * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails + * @param {Mixed} expected value (remember to check for negation) + * @param {Mixed} actual (optional) will default to `this.obj` + * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails + * @api private + */ + + Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) { + var ok = util.test(this, arguments); + if (false !== showDiff) showDiff = true; + if (undefined === expected && undefined === _actual) showDiff = false; + if (true !== config.showDiff) showDiff = false; + + if (!ok) { + msg = util.getMessage(this, arguments); + var actual = util.getActual(this, arguments); + throw new AssertionError(msg, { + actual: actual + , expected: expected + , showDiff: showDiff + }, (config.includeStack) ? this.assert : flag(this, 'ssfi')); + } + }; + + /*! + * ### ._obj + * + * Quick reference to stored `actual` value for plugin developers. + * + * @api private + */ + + Object.defineProperty(Assertion.prototype, '_obj', + { get: function () { + return flag(this, 'object'); + } + , set: function (val) { + flag(this, 'object', val); + } + }); + }; + + /*! + * chai + * http://chaijs.com + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + + var assertions = function (chai, _) { + var Assertion = chai.Assertion + , AssertionError = chai.AssertionError + , flag = _.flag; + + /** + * ### Language Chains + * + * The following are provided as chainable getters to improve the readability + * of your assertions. + * + * **Chains** + * + * - to + * - be + * - been + * - is + * - that + * - which + * - and + * - has + * - have + * - with + * - at + * - of + * - same + * - but + * - does + * - still + * + * @name language chains + * @namespace BDD + * @api public + */ + + [ 'to', 'be', 'been', 'is' + , 'and', 'has', 'have', 'with' + , 'that', 'which', 'at', 'of' + , 'same', 'but', 'does', 'still' ].forEach(function (chain) { + Assertion.addProperty(chain); + }); + + /** + * ### .not + * + * Negates all assertions that follow in the chain. + * + * expect(function () {}).to.not.throw(); + * expect({a: 1}).to.not.have.property('b'); + * expect([1, 2]).to.be.an('array').that.does.not.include(3); + * + * Just because you can negate any assertion with `.not` doesn't mean you + * should. With great power comes great responsibility. It's often best to + * assert that the one expected output was produced, rather than asserting + * that one of countless unexpected outputs wasn't produced. See individual + * assertions for specific guidance. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.not.equal(1); // Not recommended + * + * @name not + * @namespace BDD + * @api public + */ + + Assertion.addProperty('not', function () { + flag(this, 'negate', true); + }); + + /** + * ### .deep + * + * Causes all `.equal`, `.include`, `.members`, `.keys`, and `.property` + * assertions that follow in the chain to use deep equality instead of strict + * (`===`) equality. See the `deep-eql` project page for info on the deep + * equality algorithm: https://github.com/chaijs/deep-eql. + * + * // Target object deeply (but not strictly) equals `{a: 1}` + * expect({a: 1}).to.deep.equal({a: 1}); + * expect({a: 1}).to.not.equal({a: 1}); + * + * // Target array deeply (but not strictly) includes `{a: 1}` + * expect([{a: 1}]).to.deep.include({a: 1}); + * expect([{a: 1}]).to.not.include({a: 1}); + * + * // Target object deeply (but not strictly) includes `x: {a: 1}` + * expect({x: {a: 1}}).to.deep.include({x: {a: 1}}); + * expect({x: {a: 1}}).to.not.include({x: {a: 1}}); + * + * // Target array deeply (but not strictly) has member `{a: 1}` + * expect([{a: 1}]).to.have.deep.members([{a: 1}]); + * expect([{a: 1}]).to.not.have.members([{a: 1}]); + * + * // Target set deeply (but not strictly) has key `{a: 1}` + * expect(new Set([{a: 1}])).to.have.deep.keys([{a: 1}]); + * expect(new Set([{a: 1}])).to.not.have.keys([{a: 1}]); + * + * // Target object deeply (but not strictly) has property `x: {a: 1}` + * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1}); + * expect({x: {a: 1}}).to.not.have.property('x', {a: 1}); + * + * @name deep + * @namespace BDD + * @api public + */ + + Assertion.addProperty('deep', function () { + flag(this, 'deep', true); + }); + + /** + * ### .nested + * + * Enables dot- and bracket-notation in all `.property` and `.include` + * assertions that follow in the chain. + * + * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]'); + * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'}); + * + * If `.` or `[]` are part of an actual property name, they can be escaped by + * adding two backslashes before them. + * + * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\.a.\\[b\\]'); + * expect({'.a': {'[b]': 'x'}}).to.nested.include({'\\.a.\\[b\\]': 'x'}); + * + * `.nested` cannot be combined with `.own`. + * + * @name nested + * @namespace BDD + * @api public + */ + + Assertion.addProperty('nested', function () { + flag(this, 'nested', true); + }); + + /** + * ### .own + * + * Causes all `.property` and `.include` assertions that follow in the chain + * to ignore inherited properties. + * + * Object.prototype.b = 2; + * + * expect({a: 1}).to.have.own.property('a'); + * expect({a: 1}).to.have.property('b'); + * expect({a: 1}).to.not.have.own.property('b'); + * + * expect({a: 1}).to.own.include({a: 1}); + * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2}); + * + * `.own` cannot be combined with `.nested`. + * + * @name own + * @namespace BDD + * @api public + */ + + Assertion.addProperty('own', function () { + flag(this, 'own', true); + }); + + /** + * ### .ordered + * + * Causes all `.members` assertions that follow in the chain to require that + * members be in the same order. + * + * expect([1, 2]).to.have.ordered.members([1, 2]) + * .but.not.have.ordered.members([2, 1]); + * + * When `.include` and `.ordered` are combined, the ordering begins at the + * start of both arrays. + * + * expect([1, 2, 3]).to.include.ordered.members([1, 2]) + * .but.not.include.ordered.members([2, 3]); + * + * @name ordered + * @namespace BDD + * @api public + */ + + Assertion.addProperty('ordered', function () { + flag(this, 'ordered', true); + }); + + /** + * ### .any + * + * Causes all `.keys` assertions that follow in the chain to only require that + * the target have at least one of the given keys. This is the opposite of + * `.all`, which requires that the target have all of the given keys. + * + * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd'); + * + * See the `.keys` doc for guidance on when to use `.any` or `.all`. + * + * @name any + * @namespace BDD + * @api public + */ + + Assertion.addProperty('any', function () { + flag(this, 'any', true); + flag(this, 'all', false); + }); + + /** + * ### .all + * + * Causes all `.keys` assertions that follow in the chain to require that the + * target have all of the given keys. This is the opposite of `.any`, which + * only requires that the target have at least one of the given keys. + * + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); + * + * Note that `.all` is used by default when neither `.all` nor `.any` are + * added earlier in the chain. However, it's often best to add `.all` anyway + * because it improves readability. + * + * See the `.keys` doc for guidance on when to use `.any` or `.all`. + * + * @name all + * @namespace BDD + * @api public + */ + + Assertion.addProperty('all', function () { + flag(this, 'all', true); + flag(this, 'any', false); + }); + + /** + * ### .a(type[, msg]) + * + * Asserts that the target's type is equal to the given string `type`. Types + * are case insensitive. See the `type-detect` project page for info on the + * type detection algorithm: https://github.com/chaijs/type-detect. + * + * expect('foo').to.be.a('string'); + * expect({a: 1}).to.be.an('object'); + * expect(null).to.be.a('null'); + * expect(undefined).to.be.an('undefined'); + * expect(new Error).to.be.an('error'); + * expect(Promise.resolve()).to.be.a('promise'); + * expect(new Float32Array).to.be.a('float32array'); + * expect(Symbol()).to.be.a('symbol'); + * + * `.a` supports objects that have a custom type set via `Symbol.toStringTag`. + * + * var myObj = { + * [Symbol.toStringTag]: 'myCustomType' + * }; + * + * expect(myObj).to.be.a('myCustomType').but.not.an('object'); + * + * It's often best to use `.a` to check a target's type before making more + * assertions on the same target. That way, you avoid unexpected behavior from + * any assertion that does different things based on the target's type. + * + * expect([1, 2, 3]).to.be.an('array').that.includes(2); + * expect([]).to.be.an('array').that.is.empty; + * + * Add `.not` earlier in the chain to negate `.a`. However, it's often best to + * assert that the target is the expected type, rather than asserting that it + * isn't one of many unexpected types. + * + * expect('foo').to.be.a('string'); // Recommended + * expect('foo').to.not.be.an('array'); // Not recommended + * + * `.a` accepts an optional `msg` argument which is a custom error message to + * show when the assertion fails. The message can also be given as the second + * argument to `expect`. + * + * expect(1).to.be.a('string', 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.a('string'); + * + * `.a` can also be used as a language chain to improve the readability of + * your assertions. + * + * expect({b: 2}).to.have.a.property('b'); + * + * The alias `.an` can be used interchangeably with `.a`. + * + * @name a + * @alias an + * @param {String} type + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function an (type, msg) { + if (msg) flag(this, 'message', msg); + type = type.toLowerCase(); + var obj = flag(this, 'object') + , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a '; + + this.assert( + type === _.type(obj).toLowerCase() + , 'expected #{this} to be ' + article + type + , 'expected #{this} not to be ' + article + type + ); + } + + Assertion.addChainableMethod('an', an); + Assertion.addChainableMethod('a', an); + + /** + * ### .include(val[, msg]) + * + * When the target is a string, `.include` asserts that the given string `val` + * is a substring of the target. + * + * expect('foobar').to.include('foo'); + * + * When the target is an array, `.include` asserts that the given `val` is a + * member of the target. + * + * expect([1, 2, 3]).to.include(2); + * + * When the target is an object, `.include` asserts that the given object + * `val`'s properties are a subset of the target's properties. + * + * expect({a: 1, b: 2, c: 3}).to.include({a: 1, b: 2}); + * + * When the target is a Set or WeakSet, `.include` asserts that the given `val` is a + * member of the target. SameValueZero equality algorithm is used. + * + * expect(new Set([1, 2])).to.include(2); + * + * When the target is a Map, `.include` asserts that the given `val` is one of + * the values of the target. SameValueZero equality algorithm is used. + * + * expect(new Map([['a', 1], ['b', 2]])).to.include(2); + * + * Because `.include` does different things based on the target's type, it's + * important to check the target's type before using `.include`. See the `.a` + * doc for info on testing a target's type. + * + * expect([1, 2, 3]).to.be.an('array').that.includes(2); + * + * By default, strict (`===`) equality is used to compare array members and + * object properties. Add `.deep` earlier in the chain to use deep equality + * instead (WeakSet targets are not supported). See the `deep-eql` project + * page for info on the deep equality algorithm: https://github.com/chaijs/deep-eql. + * + * // Target array deeply (but not strictly) includes `{a: 1}` + * expect([{a: 1}]).to.deep.include({a: 1}); + * expect([{a: 1}]).to.not.include({a: 1}); + * + * // Target object deeply (but not strictly) includes `x: {a: 1}` + * expect({x: {a: 1}}).to.deep.include({x: {a: 1}}); + * expect({x: {a: 1}}).to.not.include({x: {a: 1}}); + * + * By default, all of the target's properties are searched when working with + * objects. This includes properties that are inherited and/or non-enumerable. + * Add `.own` earlier in the chain to exclude the target's inherited + * properties from the search. + * + * Object.prototype.b = 2; + * + * expect({a: 1}).to.own.include({a: 1}); + * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2}); + * + * Note that a target object is always only searched for `val`'s own + * enumerable properties. + * + * `.deep` and `.own` can be combined. + * + * expect({a: {b: 2}}).to.deep.own.include({a: {b: 2}}); + * + * Add `.nested` earlier in the chain to enable dot- and bracket-notation when + * referencing nested properties. + * + * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'}); + * + * If `.` or `[]` are part of an actual property name, they can be escaped by + * adding two backslashes before them. + * + * expect({'.a': {'[b]': 2}}).to.nested.include({'\\.a.\\[b\\]': 2}); + * + * `.deep` and `.nested` can be combined. + * + * expect({a: {b: [{c: 3}]}}).to.deep.nested.include({'a.b[0]': {c: 3}}); + * + * `.own` and `.nested` cannot be combined. + * + * Add `.not` earlier in the chain to negate `.include`. + * + * expect('foobar').to.not.include('taco'); + * expect([1, 2, 3]).to.not.include(4); + * + * However, it's dangerous to negate `.include` when the target is an object. + * The problem is that it creates uncertain expectations by asserting that the + * target object doesn't have all of `val`'s key/value pairs but may or may + * not have some of them. It's often best to identify the exact output that's + * expected, and then write an assertion that only accepts that exact output. + * + * When the target object isn't even expected to have `val`'s keys, it's + * often best to assert exactly that. + * + * expect({c: 3}).to.not.have.any.keys('a', 'b'); // Recommended + * expect({c: 3}).to.not.include({a: 1, b: 2}); // Not recommended + * + * When the target object is expected to have `val`'s keys, it's often best to + * assert that each of the properties has its expected value, rather than + * asserting that each property doesn't have one of many unexpected values. + * + * expect({a: 3, b: 4}).to.include({a: 3, b: 4}); // Recommended + * expect({a: 3, b: 4}).to.not.include({a: 1, b: 2}); // Not recommended + * + * `.include` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect([1, 2, 3]).to.include(4, 'nooo why fail??'); + * expect([1, 2, 3], 'nooo why fail??').to.include(4); + * + * `.include` can also be used as a language chain, causing all `.members` and + * `.keys` assertions that follow in the chain to require the target to be a + * superset of the expected set, rather than an identical set. Note that + * `.members` ignores duplicates in the subset when `.include` is added. + * + * // Target object's keys are a superset of ['a', 'b'] but not identical + * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b'); + * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b'); + * + * // Target array is a superset of [1, 2] but not identical + * expect([1, 2, 3]).to.include.members([1, 2]); + * expect([1, 2, 3]).to.not.have.members([1, 2]); + * + * // Duplicates in the subset are ignored + * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]); + * + * Note that adding `.any` earlier in the chain causes the `.keys` assertion + * to ignore `.include`. + * + * // Both assertions are identical + * expect({a: 1}).to.include.any.keys('a', 'b'); + * expect({a: 1}).to.have.any.keys('a', 'b'); + * + * The aliases `.includes`, `.contain`, and `.contains` can be used + * interchangeably with `.include`. + * + * @name include + * @alias contain + * @alias includes + * @alias contains + * @param {Mixed} val + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function SameValueZero(a, b) { + return (_.isNaN(a) && _.isNaN(b)) || a === b; + } + + function includeChainingBehavior () { + flag(this, 'contains', true); + } + + function include (val, msg) { + if (msg) flag(this, 'message', msg); + + var obj = flag(this, 'object') + , objType = _.type(obj).toLowerCase() + , flagMsg = flag(this, 'message') + , negate = flag(this, 'negate') + , ssfi = flag(this, 'ssfi') + , isDeep = flag(this, 'deep') + , descriptor = isDeep ? 'deep ' : ''; + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + var included = false; + + switch (objType) { + case 'string': + included = obj.indexOf(val) !== -1; + break; + + case 'weakset': + if (isDeep) { + throw new AssertionError( + flagMsg + 'unable to use .deep.include with WeakSet', + undefined, + ssfi + ); + } + + included = obj.has(val); + break; + + case 'map': + var isEql = isDeep ? _.eql : SameValueZero; + obj.forEach(function (item) { + included = included || isEql(item, val); + }); + break; + + case 'set': + if (isDeep) { + obj.forEach(function (item) { + included = included || _.eql(item, val); + }); + } else { + included = obj.has(val); + } + break; + + case 'array': + if (isDeep) { + included = obj.some(function (item) { + return _.eql(item, val); + }); + } else { + included = obj.indexOf(val) !== -1; + } + break; + + default: + // This block is for asserting a subset of properties in an object. + // `_.expectTypes` isn't used here because `.include` should work with + // objects with a custom `@@toStringTag`. + if (val !== Object(val)) { + throw new AssertionError( + flagMsg + 'object tested must be an array, a map, an object,' + + ' a set, a string, or a weakset, but ' + objType + ' given', + undefined, + ssfi + ); + } + + var props = Object.keys(val) + , firstErr = null + , numErrs = 0; + + props.forEach(function (prop) { + var propAssertion = new Assertion(obj); + _.transferFlags(this, propAssertion, true); + flag(propAssertion, 'lockSsfi', true); + + if (!negate || props.length === 1) { + propAssertion.property(prop, val[prop]); + return; + } + + try { + propAssertion.property(prop, val[prop]); + } catch (err) { + if (!_.checkError.compatibleConstructor(err, AssertionError)) { + throw err; + } + if (firstErr === null) firstErr = err; + numErrs++; + } + }, this); + + // When validating .not.include with multiple properties, we only want + // to throw an assertion error if all of the properties are included, + // in which case we throw the first property assertion error that we + // encountered. + if (negate && props.length > 1 && numErrs === props.length) { + throw firstErr; + } + return; + } + + // Assert inclusion in collection or substring in a string. + this.assert( + included + , 'expected #{this} to ' + descriptor + 'include ' + _.inspect(val) + , 'expected #{this} to not ' + descriptor + 'include ' + _.inspect(val)); + } + + Assertion.addChainableMethod('include', include, includeChainingBehavior); + Assertion.addChainableMethod('contain', include, includeChainingBehavior); + Assertion.addChainableMethod('contains', include, includeChainingBehavior); + Assertion.addChainableMethod('includes', include, includeChainingBehavior); + + /** + * ### .ok + * + * Asserts that the target is a truthy value (considered `true` in boolean context). + * However, it's often best to assert that the target is strictly (`===`) or + * deeply equal to its expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.ok; // Not recommended + * + * expect(true).to.be.true; // Recommended + * expect(true).to.be.ok; // Not recommended + * + * Add `.not` earlier in the chain to negate `.ok`. + * + * expect(0).to.equal(0); // Recommended + * expect(0).to.not.be.ok; // Not recommended + * + * expect(false).to.be.false; // Recommended + * expect(false).to.not.be.ok; // Not recommended + * + * expect(null).to.be.null; // Recommended + * expect(null).to.not.be.ok; // Not recommended + * + * expect(undefined).to.be.undefined; // Recommended + * expect(undefined).to.not.be.ok; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(false, 'nooo why fail??').to.be.ok; + * + * @name ok + * @namespace BDD + * @api public + */ + + Assertion.addProperty('ok', function () { + this.assert( + flag(this, 'object') + , 'expected #{this} to be truthy' + , 'expected #{this} to be falsy'); + }); + + /** + * ### .true + * + * Asserts that the target is strictly (`===`) equal to `true`. + * + * expect(true).to.be.true; + * + * Add `.not` earlier in the chain to negate `.true`. However, it's often best + * to assert that the target is equal to its expected value, rather than not + * equal to `true`. + * + * expect(false).to.be.false; // Recommended + * expect(false).to.not.be.true; // Not recommended + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.true; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(false, 'nooo why fail??').to.be.true; + * + * @name true + * @namespace BDD + * @api public + */ + + Assertion.addProperty('true', function () { + this.assert( + true === flag(this, 'object') + , 'expected #{this} to be true' + , 'expected #{this} to be false' + , flag(this, 'negate') ? false : true + ); + }); + + /** + * ### .false + * + * Asserts that the target is strictly (`===`) equal to `false`. + * + * expect(false).to.be.false; + * + * Add `.not` earlier in the chain to negate `.false`. However, it's often + * best to assert that the target is equal to its expected value, rather than + * not equal to `false`. + * + * expect(true).to.be.true; // Recommended + * expect(true).to.not.be.false; // Not recommended + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.false; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(true, 'nooo why fail??').to.be.false; + * + * @name false + * @namespace BDD + * @api public + */ + + Assertion.addProperty('false', function () { + this.assert( + false === flag(this, 'object') + , 'expected #{this} to be false' + , 'expected #{this} to be true' + , flag(this, 'negate') ? true : false + ); + }); + + /** + * ### .null + * + * Asserts that the target is strictly (`===`) equal to `null`. + * + * expect(null).to.be.null; + * + * Add `.not` earlier in the chain to negate `.null`. However, it's often best + * to assert that the target is equal to its expected value, rather than not + * equal to `null`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.null; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(42, 'nooo why fail??').to.be.null; + * + * @name null + * @namespace BDD + * @api public + */ + + Assertion.addProperty('null', function () { + this.assert( + null === flag(this, 'object') + , 'expected #{this} to be null' + , 'expected #{this} not to be null' + ); + }); + + /** + * ### .undefined + * + * Asserts that the target is strictly (`===`) equal to `undefined`. + * + * expect(undefined).to.be.undefined; + * + * Add `.not` earlier in the chain to negate `.undefined`. However, it's often + * best to assert that the target is equal to its expected value, rather than + * not equal to `undefined`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.undefined; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(42, 'nooo why fail??').to.be.undefined; + * + * @name undefined + * @namespace BDD + * @api public + */ + + Assertion.addProperty('undefined', function () { + this.assert( + undefined === flag(this, 'object') + , 'expected #{this} to be undefined' + , 'expected #{this} not to be undefined' + ); + }); + + /** + * ### .NaN + * + * Asserts that the target is exactly `NaN`. + * + * expect(NaN).to.be.NaN; + * + * Add `.not` earlier in the chain to negate `.NaN`. However, it's often best + * to assert that the target is equal to its expected value, rather than not + * equal to `NaN`. + * + * expect('foo').to.equal('foo'); // Recommended + * expect('foo').to.not.be.NaN; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(42, 'nooo why fail??').to.be.NaN; + * + * @name NaN + * @namespace BDD + * @api public + */ + + Assertion.addProperty('NaN', function () { + this.assert( + _.isNaN(flag(this, 'object')) + , 'expected #{this} to be NaN' + , 'expected #{this} not to be NaN' + ); + }); + + /** + * ### .exist + * + * Asserts that the target is not strictly (`===`) equal to either `null` or + * `undefined`. However, it's often best to assert that the target is equal to + * its expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.exist; // Not recommended + * + * expect(0).to.equal(0); // Recommended + * expect(0).to.exist; // Not recommended + * + * Add `.not` earlier in the chain to negate `.exist`. + * + * expect(null).to.be.null; // Recommended + * expect(null).to.not.exist; // Not recommended + * + * expect(undefined).to.be.undefined; // Recommended + * expect(undefined).to.not.exist; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(null, 'nooo why fail??').to.exist; + * + * @name exist + * @namespace BDD + * @api public + */ + + Assertion.addProperty('exist', function () { + var val = flag(this, 'object'); + this.assert( + val !== null && val !== undefined + , 'expected #{this} to exist' + , 'expected #{this} to not exist' + ); + }); + + /** + * ### .empty + * + * When the target is a string or array, `.empty` asserts that the target's + * `length` property is strictly (`===`) equal to `0`. + * + * expect([]).to.be.empty; + * expect('').to.be.empty; + * + * When the target is a map or set, `.empty` asserts that the target's `size` + * property is strictly equal to `0`. + * + * expect(new Set()).to.be.empty; + * expect(new Map()).to.be.empty; + * + * When the target is a non-function object, `.empty` asserts that the target + * doesn't have any own enumerable properties. Properties with Symbol-based + * keys are excluded from the count. + * + * expect({}).to.be.empty; + * + * Because `.empty` does different things based on the target's type, it's + * important to check the target's type before using `.empty`. See the `.a` + * doc for info on testing a target's type. + * + * expect([]).to.be.an('array').that.is.empty; + * + * Add `.not` earlier in the chain to negate `.empty`. However, it's often + * best to assert that the target contains its expected number of values, + * rather than asserting that it's not empty. + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.not.be.empty; // Not recommended + * + * expect(new Set([1, 2, 3])).to.have.property('size', 3); // Recommended + * expect(new Set([1, 2, 3])).to.not.be.empty; // Not recommended + * + * expect(Object.keys({a: 1})).to.have.lengthOf(1); // Recommended + * expect({a: 1}).to.not.be.empty; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect([1, 2, 3], 'nooo why fail??').to.be.empty; + * + * @name empty + * @namespace BDD + * @api public + */ + + Assertion.addProperty('empty', function () { + var val = flag(this, 'object') + , ssfi = flag(this, 'ssfi') + , flagMsg = flag(this, 'message') + , itemsCount; + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + switch (_.type(val).toLowerCase()) { + case 'array': + case 'string': + itemsCount = val.length; + break; + case 'map': + case 'set': + itemsCount = val.size; + break; + case 'weakmap': + case 'weakset': + throw new AssertionError( + flagMsg + '.empty was passed a weak collection', + undefined, + ssfi + ); + case 'function': + var msg = flagMsg + '.empty was passed a function ' + _.getName(val); + throw new AssertionError(msg.trim(), undefined, ssfi); + default: + if (val !== Object(val)) { + throw new AssertionError( + flagMsg + '.empty was passed non-string primitive ' + _.inspect(val), + undefined, + ssfi + ); + } + itemsCount = Object.keys(val).length; + } + + this.assert( + 0 === itemsCount + , 'expected #{this} to be empty' + , 'expected #{this} not to be empty' + ); + }); + + /** + * ### .arguments + * + * Asserts that the target is an `arguments` object. + * + * function test () { + * expect(arguments).to.be.arguments; + * } + * + * test(); + * + * Add `.not` earlier in the chain to negate `.arguments`. However, it's often + * best to assert which type the target is expected to be, rather than + * asserting that its not an `arguments` object. + * + * expect('foo').to.be.a('string'); // Recommended + * expect('foo').to.not.be.arguments; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({}, 'nooo why fail??').to.be.arguments; + * + * The alias `.Arguments` can be used interchangeably with `.arguments`. + * + * @name arguments + * @alias Arguments + * @namespace BDD + * @api public + */ + + function checkArguments () { + var obj = flag(this, 'object') + , type = _.type(obj); + this.assert( + 'Arguments' === type + , 'expected #{this} to be arguments but got ' + type + , 'expected #{this} to not be arguments' + ); + } + + Assertion.addProperty('arguments', checkArguments); + Assertion.addProperty('Arguments', checkArguments); + + /** + * ### .equal(val[, msg]) + * + * Asserts that the target is strictly (`===`) equal to the given `val`. + * + * expect(1).to.equal(1); + * expect('foo').to.equal('foo'); + * + * Add `.deep` earlier in the chain to use deep equality instead. See the + * `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target object deeply (but not strictly) equals `{a: 1}` + * expect({a: 1}).to.deep.equal({a: 1}); + * expect({a: 1}).to.not.equal({a: 1}); + * + * // Target array deeply (but not strictly) equals `[1, 2]` + * expect([1, 2]).to.deep.equal([1, 2]); + * expect([1, 2]).to.not.equal([1, 2]); + * + * Add `.not` earlier in the chain to negate `.equal`. However, it's often + * best to assert that the target is equal to its expected value, rather than + * not equal to one of countless unexpected values. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.equal(2); // Not recommended + * + * `.equal` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.equal(2, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.equal(2); + * + * The aliases `.equals` and `eq` can be used interchangeably with `.equal`. + * + * @name equal + * @alias equals + * @alias eq + * @param {Mixed} val + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertEqual (val, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + if (flag(this, 'deep')) { + var prevLockSsfi = flag(this, 'lockSsfi'); + flag(this, 'lockSsfi', true); + this.eql(val); + flag(this, 'lockSsfi', prevLockSsfi); + } else { + this.assert( + val === obj + , 'expected #{this} to equal #{exp}' + , 'expected #{this} to not equal #{exp}' + , val + , this._obj + , true + ); + } + } + + Assertion.addMethod('equal', assertEqual); + Assertion.addMethod('equals', assertEqual); + Assertion.addMethod('eq', assertEqual); + + /** + * ### .eql(obj[, msg]) + * + * Asserts that the target is deeply equal to the given `obj`. See the + * `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target object is deeply (but not strictly) equal to {a: 1} + * expect({a: 1}).to.eql({a: 1}).but.not.equal({a: 1}); + * + * // Target array is deeply (but not strictly) equal to [1, 2] + * expect([1, 2]).to.eql([1, 2]).but.not.equal([1, 2]); + * + * Add `.not` earlier in the chain to negate `.eql`. However, it's often best + * to assert that the target is deeply equal to its expected value, rather + * than not deeply equal to one of countless unexpected values. + * + * expect({a: 1}).to.eql({a: 1}); // Recommended + * expect({a: 1}).to.not.eql({b: 2}); // Not recommended + * + * `.eql` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect({a: 1}).to.eql({b: 2}, 'nooo why fail??'); + * expect({a: 1}, 'nooo why fail??').to.eql({b: 2}); + * + * The alias `.eqls` can be used interchangeably with `.eql`. + * + * The `.deep.equal` assertion is almost identical to `.eql` but with one + * difference: `.deep.equal` causes deep equality comparisons to also be used + * for any other assertions that follow in the chain. + * + * @name eql + * @alias eqls + * @param {Mixed} obj + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertEql(obj, msg) { + if (msg) flag(this, 'message', msg); + this.assert( + _.eql(obj, flag(this, 'object')) + , 'expected #{this} to deeply equal #{exp}' + , 'expected #{this} to not deeply equal #{exp}' + , obj + , this._obj + , true + ); + } + + Assertion.addMethod('eql', assertEql); + Assertion.addMethod('eqls', assertEql); + + /** + * ### .above(n[, msg]) + * + * Asserts that the target is a number or a date greater than the given number or date `n` respectively. + * However, it's often best to assert that the target is equal to its expected + * value. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.be.above(1); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is greater than the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.above(2); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.above(2); // Not recommended + * + * Add `.not` earlier in the chain to negate `.above`. + * + * expect(2).to.equal(2); // Recommended + * expect(1).to.not.be.above(2); // Not recommended + * + * `.above` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.be.above(2, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.above(2); + * + * The aliases `.gt` and `.greaterThan` can be used interchangeably with + * `.above`. + * + * @name above + * @alias gt + * @alias greaterThan + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertAbove (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to above must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to above must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount > n + , 'expected #{this} to have a ' + descriptor + ' above #{exp} but got #{act}' + , 'expected #{this} to not have a ' + descriptor + ' above #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj > n + , 'expected #{this} to be above #{exp}' + , 'expected #{this} to be at most #{exp}' + , n + ); + } + } + + Assertion.addMethod('above', assertAbove); + Assertion.addMethod('gt', assertAbove); + Assertion.addMethod('greaterThan', assertAbove); + + /** + * ### .least(n[, msg]) + * + * Asserts that the target is a number or a date greater than or equal to the given + * number or date `n` respectively. However, it's often best to assert that the target is equal to + * its expected value. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.be.at.least(1); // Not recommended + * expect(2).to.be.at.least(2); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is greater than or equal to the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.at.least(2); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.at.least(2); // Not recommended + * + * Add `.not` earlier in the chain to negate `.least`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.at.least(2); // Not recommended + * + * `.least` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.be.at.least(2, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.at.least(2); + * + * The alias `.gte` can be used interchangeably with `.least`. + * + * @name least + * @alias gte + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertLeast (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to least must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to least must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount >= n + , 'expected #{this} to have a ' + descriptor + ' at least #{exp} but got #{act}' + , 'expected #{this} to have a ' + descriptor + ' below #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj >= n + , 'expected #{this} to be at least #{exp}' + , 'expected #{this} to be below #{exp}' + , n + ); + } + } + + Assertion.addMethod('least', assertLeast); + Assertion.addMethod('gte', assertLeast); + + /** + * ### .below(n[, msg]) + * + * Asserts that the target is a number or a date less than the given number or date `n` respectively. + * However, it's often best to assert that the target is equal to its expected + * value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.below(2); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is less than the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.below(4); // Not recommended + * + * expect([1, 2, 3]).to.have.length(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.below(4); // Not recommended + * + * Add `.not` earlier in the chain to negate `.below`. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.not.be.below(1); // Not recommended + * + * `.below` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(2).to.be.below(1, 'nooo why fail??'); + * expect(2, 'nooo why fail??').to.be.below(1); + * + * The aliases `.lt` and `.lessThan` can be used interchangeably with + * `.below`. + * + * @name below + * @alias lt + * @alias lessThan + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertBelow (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to below must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to below must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount < n + , 'expected #{this} to have a ' + descriptor + ' below #{exp} but got #{act}' + , 'expected #{this} to not have a ' + descriptor + ' below #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj < n + , 'expected #{this} to be below #{exp}' + , 'expected #{this} to be at least #{exp}' + , n + ); + } + } + + Assertion.addMethod('below', assertBelow); + Assertion.addMethod('lt', assertBelow); + Assertion.addMethod('lessThan', assertBelow); + + /** + * ### .most(n[, msg]) + * + * Asserts that the target is a number or a date less than or equal to the given number + * or date `n` respectively. However, it's often best to assert that the target is equal to its + * expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.at.most(2); // Not recommended + * expect(1).to.be.at.most(1); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is less than or equal to the given number `n`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.at.most(4); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.at.most(4); // Not recommended + * + * Add `.not` earlier in the chain to negate `.most`. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.not.be.at.most(1); // Not recommended + * + * `.most` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(2).to.be.at.most(1, 'nooo why fail??'); + * expect(2, 'nooo why fail??').to.be.at.most(1); + * + * The alias `.lte` can be used interchangeably with `.most`. + * + * @name most + * @alias lte + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertMost (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , nType = _.type(n).toLowerCase() + , errorMessage + , shouldThrow = true; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && nType !== 'date')) { + errorMessage = msgPrefix + 'the argument to most must be a date'; + } else if (nType !== 'number' && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the argument to most must be a number'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount <= n + , 'expected #{this} to have a ' + descriptor + ' at most #{exp} but got #{act}' + , 'expected #{this} to have a ' + descriptor + ' above #{exp}' + , n + , itemsCount + ); + } else { + this.assert( + obj <= n + , 'expected #{this} to be at most #{exp}' + , 'expected #{this} to be above #{exp}' + , n + ); + } + } + + Assertion.addMethod('most', assertMost); + Assertion.addMethod('lte', assertMost); + + /** + * ### .within(start, finish[, msg]) + * + * Asserts that the target is a number or a date greater than or equal to the given + * number or date `start`, and less than or equal to the given number or date `finish` respectively. + * However, it's often best to assert that the target is equal to its expected + * value. + * + * expect(2).to.equal(2); // Recommended + * expect(2).to.be.within(1, 3); // Not recommended + * expect(2).to.be.within(2, 3); // Not recommended + * expect(2).to.be.within(1, 2); // Not recommended + * + * Add `.lengthOf` earlier in the chain to assert that the target's `length` + * or `size` is greater than or equal to the given number `start`, and less + * than or equal to the given number `finish`. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.have.lengthOf.within(2, 4); // Not recommended + * + * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended + * expect([1, 2, 3]).to.have.lengthOf.within(2, 4); // Not recommended + * + * Add `.not` earlier in the chain to negate `.within`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.within(2, 4); // Not recommended + * + * `.within` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(4).to.be.within(1, 3, 'nooo why fail??'); + * expect(4, 'nooo why fail??').to.be.within(1, 3); + * + * @name within + * @param {Number} start lower bound inclusive + * @param {Number} finish upper bound inclusive + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('within', function (start, finish, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , doLength = flag(this, 'doLength') + , flagMsg = flag(this, 'message') + , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') + , ssfi = flag(this, 'ssfi') + , objType = _.type(obj).toLowerCase() + , startType = _.type(start).toLowerCase() + , finishType = _.type(finish).toLowerCase() + , errorMessage + , shouldThrow = true + , range = (startType === 'date' && finishType === 'date') + ? start.toUTCString() + '..' + finish.toUTCString() + : start + '..' + finish; + + if (doLength && objType !== 'map' && objType !== 'set') { + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + } + + if (!doLength && (objType === 'date' && (startType !== 'date' || finishType !== 'date'))) { + errorMessage = msgPrefix + 'the arguments to within must be dates'; + } else if ((startType !== 'number' || finishType !== 'number') && (doLength || objType === 'number')) { + errorMessage = msgPrefix + 'the arguments to within must be numbers'; + } else if (!doLength && (objType !== 'date' && objType !== 'number')) { + var printObj = (objType === 'string') ? "'" + obj + "'" : obj; + errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; + } else { + shouldThrow = false; + } + + if (shouldThrow) { + throw new AssertionError(errorMessage, undefined, ssfi); + } + + if (doLength) { + var descriptor = 'length' + , itemsCount; + if (objType === 'map' || objType === 'set') { + descriptor = 'size'; + itemsCount = obj.size; + } else { + itemsCount = obj.length; + } + this.assert( + itemsCount >= start && itemsCount <= finish + , 'expected #{this} to have a ' + descriptor + ' within ' + range + , 'expected #{this} to not have a ' + descriptor + ' within ' + range + ); + } else { + this.assert( + obj >= start && obj <= finish + , 'expected #{this} to be within ' + range + , 'expected #{this} to not be within ' + range + ); + } + }); + + /** + * ### .instanceof(constructor[, msg]) + * + * Asserts that the target is an instance of the given `constructor`. + * + * function Cat () { } + * + * expect(new Cat()).to.be.an.instanceof(Cat); + * expect([1, 2]).to.be.an.instanceof(Array); + * + * Add `.not` earlier in the chain to negate `.instanceof`. + * + * expect({a: 1}).to.not.be.an.instanceof(Array); + * + * `.instanceof` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(1).to.be.an.instanceof(Array, 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.an.instanceof(Array); + * + * Due to limitations in ES5, `.instanceof` may not always work as expected + * when using a transpiler such as Babel or TypeScript. In particular, it may + * produce unexpected results when subclassing built-in object such as + * `Array`, `Error`, and `Map`. See your transpiler's docs for details: + * + * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes)) + * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work)) + * + * The alias `.instanceOf` can be used interchangeably with `.instanceof`. + * + * @name instanceof + * @param {Constructor} constructor + * @param {String} msg _optional_ + * @alias instanceOf + * @namespace BDD + * @api public + */ + + function assertInstanceOf (constructor, msg) { + if (msg) flag(this, 'message', msg); + + var target = flag(this, 'object'); + var ssfi = flag(this, 'ssfi'); + var flagMsg = flag(this, 'message'); + + try { + var isInstanceOf = target instanceof constructor; + } catch (err) { + if (err instanceof TypeError) { + flagMsg = flagMsg ? flagMsg + ': ' : ''; + throw new AssertionError( + flagMsg + 'The instanceof assertion needs a constructor but ' + + _.type(constructor) + ' was given.', + undefined, + ssfi + ); + } + throw err; + } + + var name = _.getName(constructor); + if (name === null) { + name = 'an unnamed constructor'; + } + + this.assert( + isInstanceOf + , 'expected #{this} to be an instance of ' + name + , 'expected #{this} to not be an instance of ' + name + ); + } + Assertion.addMethod('instanceof', assertInstanceOf); + Assertion.addMethod('instanceOf', assertInstanceOf); + + /** + * ### .property(name[, val[, msg]]) + * + * Asserts that the target has a property with the given key `name`. + * + * expect({a: 1}).to.have.property('a'); + * + * When `val` is provided, `.property` also asserts that the property's value + * is equal to the given `val`. + * + * expect({a: 1}).to.have.property('a', 1); + * + * By default, strict (`===`) equality is used. Add `.deep` earlier in the + * chain to use deep equality instead. See the `deep-eql` project page for + * info on the deep equality algorithm: https://github.com/chaijs/deep-eql. + * + * // Target object deeply (but not strictly) has property `x: {a: 1}` + * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1}); + * expect({x: {a: 1}}).to.not.have.property('x', {a: 1}); + * + * The target's enumerable and non-enumerable properties are always included + * in the search. By default, both own and inherited properties are included. + * Add `.own` earlier in the chain to exclude inherited properties from the + * search. + * + * Object.prototype.b = 2; + * + * expect({a: 1}).to.have.own.property('a'); + * expect({a: 1}).to.have.own.property('a', 1); + * expect({a: 1}).to.have.property('b'); + * expect({a: 1}).to.not.have.own.property('b'); + * + * `.deep` and `.own` can be combined. + * + * expect({x: {a: 1}}).to.have.deep.own.property('x', {a: 1}); + * + * Add `.nested` earlier in the chain to enable dot- and bracket-notation when + * referencing nested properties. + * + * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]'); + * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]', 'y'); + * + * If `.` or `[]` are part of an actual property name, they can be escaped by + * adding two backslashes before them. + * + * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\.a.\\[b\\]'); + * + * `.deep` and `.nested` can be combined. + * + * expect({a: {b: [{c: 3}]}}) + * .to.have.deep.nested.property('a.b[0]', {c: 3}); + * + * `.own` and `.nested` cannot be combined. + * + * Add `.not` earlier in the chain to negate `.property`. + * + * expect({a: 1}).to.not.have.property('b'); + * + * However, it's dangerous to negate `.property` when providing `val`. The + * problem is that it creates uncertain expectations by asserting that the + * target either doesn't have a property with the given key `name`, or that it + * does have a property with the given key `name` but its value isn't equal to + * the given `val`. It's often best to identify the exact output that's + * expected, and then write an assertion that only accepts that exact output. + * + * When the target isn't expected to have a property with the given key + * `name`, it's often best to assert exactly that. + * + * expect({b: 2}).to.not.have.property('a'); // Recommended + * expect({b: 2}).to.not.have.property('a', 1); // Not recommended + * + * When the target is expected to have a property with the given key `name`, + * it's often best to assert that the property has its expected value, rather + * than asserting that it doesn't have one of many unexpected values. + * + * expect({a: 3}).to.have.property('a', 3); // Recommended + * expect({a: 3}).to.not.have.property('a', 1); // Not recommended + * + * `.property` changes the target of any assertions that follow in the chain + * to be the value of the property from the original target object. + * + * expect({a: 1}).to.have.property('a').that.is.a('number'); + * + * `.property` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing `val`, only use the + * second form. + * + * // Recommended + * expect({a: 1}).to.have.property('a', 2, 'nooo why fail??'); + * expect({a: 1}, 'nooo why fail??').to.have.property('a', 2); + * expect({a: 1}, 'nooo why fail??').to.have.property('b'); + * + * // Not recommended + * expect({a: 1}).to.have.property('b', undefined, 'nooo why fail??'); + * + * The above assertion isn't the same thing as not providing `val`. Instead, + * it's asserting that the target object has a `b` property that's equal to + * `undefined`. + * + * The assertions `.ownProperty` and `.haveOwnProperty` can be used + * interchangeably with `.own.property`. + * + * @name property + * @param {String} name + * @param {Mixed} val (optional) + * @param {String} msg _optional_ + * @returns value of property for chaining + * @namespace BDD + * @api public + */ + + function assertProperty (name, val, msg) { + if (msg) flag(this, 'message', msg); + + var isNested = flag(this, 'nested') + , isOwn = flag(this, 'own') + , flagMsg = flag(this, 'message') + , obj = flag(this, 'object') + , ssfi = flag(this, 'ssfi') + , nameType = typeof name; + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + + if (isNested) { + if (nameType !== 'string') { + throw new AssertionError( + flagMsg + 'the argument to property must be a string when using nested syntax', + undefined, + ssfi + ); + } + } else { + if (nameType !== 'string' && nameType !== 'number' && nameType !== 'symbol') { + throw new AssertionError( + flagMsg + 'the argument to property must be a string, number, or symbol', + undefined, + ssfi + ); + } + } + + if (isNested && isOwn) { + throw new AssertionError( + flagMsg + 'The "nested" and "own" flags cannot be combined.', + undefined, + ssfi + ); + } + + if (obj === null || obj === undefined) { + throw new AssertionError( + flagMsg + 'Target cannot be null or undefined.', + undefined, + ssfi + ); + } + + var isDeep = flag(this, 'deep') + , negate = flag(this, 'negate') + , pathInfo = isNested ? _.getPathInfo(obj, name) : null + , value = isNested ? pathInfo.value : obj[name]; + + var descriptor = ''; + if (isDeep) descriptor += 'deep '; + if (isOwn) descriptor += 'own '; + if (isNested) descriptor += 'nested '; + descriptor += 'property '; + + var hasProperty; + if (isOwn) hasProperty = Object.prototype.hasOwnProperty.call(obj, name); + else if (isNested) hasProperty = pathInfo.exists; + else hasProperty = _.hasProperty(obj, name); + + // When performing a negated assertion for both name and val, merely having + // a property with the given name isn't enough to cause the assertion to + // fail. It must both have a property with the given name, and the value of + // that property must equal the given val. Therefore, skip this assertion in + // favor of the next. + if (!negate || arguments.length === 1) { + this.assert( + hasProperty + , 'expected #{this} to have ' + descriptor + _.inspect(name) + , 'expected #{this} to not have ' + descriptor + _.inspect(name)); + } + + if (arguments.length > 1) { + this.assert( + hasProperty && (isDeep ? _.eql(val, value) : val === value) + , 'expected #{this} to have ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}' + , 'expected #{this} to not have ' + descriptor + _.inspect(name) + ' of #{act}' + , val + , value + ); + } + + flag(this, 'object', value); + } + + Assertion.addMethod('property', assertProperty); + + function assertOwnProperty (name, value, msg) { + flag(this, 'own', true); + assertProperty.apply(this, arguments); + } + + Assertion.addMethod('ownProperty', assertOwnProperty); + Assertion.addMethod('haveOwnProperty', assertOwnProperty); + + /** + * ### .ownPropertyDescriptor(name[, descriptor[, msg]]) + * + * Asserts that the target has its own property descriptor with the given key + * `name`. Enumerable and non-enumerable properties are included in the + * search. + * + * expect({a: 1}).to.have.ownPropertyDescriptor('a'); + * + * When `descriptor` is provided, `.ownPropertyDescriptor` also asserts that + * the property's descriptor is deeply equal to the given `descriptor`. See + * the `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * expect({a: 1}).to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 1, + * }); + * + * Add `.not` earlier in the chain to negate `.ownPropertyDescriptor`. + * + * expect({a: 1}).to.not.have.ownPropertyDescriptor('b'); + * + * However, it's dangerous to negate `.ownPropertyDescriptor` when providing + * a `descriptor`. The problem is that it creates uncertain expectations by + * asserting that the target either doesn't have a property descriptor with + * the given key `name`, or that it does have a property descriptor with the + * given key `name` but its not deeply equal to the given `descriptor`. It's + * often best to identify the exact output that's expected, and then write an + * assertion that only accepts that exact output. + * + * When the target isn't expected to have a property descriptor with the given + * key `name`, it's often best to assert exactly that. + * + * // Recommended + * expect({b: 2}).to.not.have.ownPropertyDescriptor('a'); + * + * // Not recommended + * expect({b: 2}).to.not.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 1, + * }); + * + * When the target is expected to have a property descriptor with the given + * key `name`, it's often best to assert that the property has its expected + * descriptor, rather than asserting that it doesn't have one of many + * unexpected descriptors. + * + * // Recommended + * expect({a: 3}).to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 3, + * }); + * + * // Not recommended + * expect({a: 3}).to.not.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 1, + * }); + * + * `.ownPropertyDescriptor` changes the target of any assertions that follow + * in the chain to be the value of the property descriptor from the original + * target object. + * + * expect({a: 1}).to.have.ownPropertyDescriptor('a') + * .that.has.property('enumerable', true); + * + * `.ownPropertyDescriptor` accepts an optional `msg` argument which is a + * custom error message to show when the assertion fails. The message can also + * be given as the second argument to `expect`. When not providing + * `descriptor`, only use the second form. + * + * // Recommended + * expect({a: 1}).to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 2, + * }, 'nooo why fail??'); + * + * // Recommended + * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('a', { + * configurable: true, + * enumerable: true, + * writable: true, + * value: 2, + * }); + * + * // Recommended + * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('b'); + * + * // Not recommended + * expect({a: 1}) + * .to.have.ownPropertyDescriptor('b', undefined, 'nooo why fail??'); + * + * The above assertion isn't the same thing as not providing `descriptor`. + * Instead, it's asserting that the target object has a `b` property + * descriptor that's deeply equal to `undefined`. + * + * The alias `.haveOwnPropertyDescriptor` can be used interchangeably with + * `.ownPropertyDescriptor`. + * + * @name ownPropertyDescriptor + * @alias haveOwnPropertyDescriptor + * @param {String} name + * @param {Object} descriptor _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertOwnPropertyDescriptor (name, descriptor, msg) { + if (typeof descriptor === 'string') { + msg = descriptor; + descriptor = null; + } + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name); + if (actualDescriptor && descriptor) { + this.assert( + _.eql(descriptor, actualDescriptor) + , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor) + , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor) + , descriptor + , actualDescriptor + , true + ); + } else { + this.assert( + actualDescriptor + , 'expected #{this} to have an own property descriptor for ' + _.inspect(name) + , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name) + ); + } + flag(this, 'object', actualDescriptor); + } + + Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor); + Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor); + + /** + * ### .lengthOf(n[, msg]) + * + * Asserts that the target's `length` or `size` is equal to the given number + * `n`. + * + * expect([1, 2, 3]).to.have.lengthOf(3); + * expect('foo').to.have.lengthOf(3); + * expect(new Set([1, 2, 3])).to.have.lengthOf(3); + * expect(new Map([['a', 1], ['b', 2], ['c', 3]])).to.have.lengthOf(3); + * + * Add `.not` earlier in the chain to negate `.lengthOf`. However, it's often + * best to assert that the target's `length` property is equal to its expected + * value, rather than not equal to one of many unexpected values. + * + * expect('foo').to.have.lengthOf(3); // Recommended + * expect('foo').to.not.have.lengthOf(4); // Not recommended + * + * `.lengthOf` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect([1, 2, 3]).to.have.lengthOf(2, 'nooo why fail??'); + * expect([1, 2, 3], 'nooo why fail??').to.have.lengthOf(2); + * + * `.lengthOf` can also be used as a language chain, causing all `.above`, + * `.below`, `.least`, `.most`, and `.within` assertions that follow in the + * chain to use the target's `length` property as the target. However, it's + * often best to assert that the target's `length` property is equal to its + * expected length, rather than asserting that its `length` property falls + * within some range of values. + * + * // Recommended + * expect([1, 2, 3]).to.have.lengthOf(3); + * + * // Not recommended + * expect([1, 2, 3]).to.have.lengthOf.above(2); + * expect([1, 2, 3]).to.have.lengthOf.below(4); + * expect([1, 2, 3]).to.have.lengthOf.at.least(3); + * expect([1, 2, 3]).to.have.lengthOf.at.most(3); + * expect([1, 2, 3]).to.have.lengthOf.within(2,4); + * + * Due to a compatibility issue, the alias `.length` can't be chained directly + * off of an uninvoked method such as `.a`. Therefore, `.length` can't be used + * interchangeably with `.lengthOf` in every situation. It's recommended to + * always use `.lengthOf` instead of `.length`. + * + * expect([1, 2, 3]).to.have.a.length(3); // incompatible; throws error + * expect([1, 2, 3]).to.have.a.lengthOf(3); // passes as expected + * + * @name lengthOf + * @alias length + * @param {Number} n + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertLengthChain () { + flag(this, 'doLength', true); + } + + function assertLength (n, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , objType = _.type(obj).toLowerCase() + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi') + , descriptor = 'length' + , itemsCount; + + switch (objType) { + case 'map': + case 'set': + descriptor = 'size'; + itemsCount = obj.size; + break; + default: + new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); + itemsCount = obj.length; + } + + this.assert( + itemsCount == n + , 'expected #{this} to have a ' + descriptor + ' of #{exp} but got #{act}' + , 'expected #{this} to not have a ' + descriptor + ' of #{act}' + , n + , itemsCount + ); + } + + Assertion.addChainableMethod('length', assertLength, assertLengthChain); + Assertion.addChainableMethod('lengthOf', assertLength, assertLengthChain); + + /** + * ### .match(re[, msg]) + * + * Asserts that the target matches the given regular expression `re`. + * + * expect('foobar').to.match(/^foo/); + * + * Add `.not` earlier in the chain to negate `.match`. + * + * expect('foobar').to.not.match(/taco/); + * + * `.match` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect('foobar').to.match(/taco/, 'nooo why fail??'); + * expect('foobar', 'nooo why fail??').to.match(/taco/); + * + * The alias `.matches` can be used interchangeably with `.match`. + * + * @name match + * @alias matches + * @param {RegExp} re + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + function assertMatch(re, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + this.assert( + re.exec(obj) + , 'expected #{this} to match ' + re + , 'expected #{this} not to match ' + re + ); + } + + Assertion.addMethod('match', assertMatch); + Assertion.addMethod('matches', assertMatch); + + /** + * ### .string(str[, msg]) + * + * Asserts that the target string contains the given substring `str`. + * + * expect('foobar').to.have.string('bar'); + * + * Add `.not` earlier in the chain to negate `.string`. + * + * expect('foobar').to.not.have.string('taco'); + * + * `.string` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect('foobar').to.have.string('taco', 'nooo why fail??'); + * expect('foobar', 'nooo why fail??').to.have.string('taco'); + * + * @name string + * @param {String} str + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('string', function (str, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(obj, flagMsg, ssfi, true).is.a('string'); + + this.assert( + ~obj.indexOf(str) + , 'expected #{this} to contain ' + _.inspect(str) + , 'expected #{this} to not contain ' + _.inspect(str) + ); + }); + + /** + * ### .keys(key1[, key2[, ...]]) + * + * Asserts that the target object, array, map, or set has the given keys. Only + * the target's own inherited properties are included in the search. + * + * When the target is an object or array, keys can be provided as one or more + * string arguments, a single array argument, or a single object argument. In + * the latter case, only the keys in the given object matter; the values are + * ignored. + * + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); + * expect(['x', 'y']).to.have.all.keys(0, 1); + * + * expect({a: 1, b: 2}).to.have.all.keys(['a', 'b']); + * expect(['x', 'y']).to.have.all.keys([0, 1]); + * + * expect({a: 1, b: 2}).to.have.all.keys({a: 4, b: 5}); // ignore 4 and 5 + * expect(['x', 'y']).to.have.all.keys({0: 4, 1: 5}); // ignore 4 and 5 + * + * When the target is a map or set, each key must be provided as a separate + * argument. + * + * expect(new Map([['a', 1], ['b', 2]])).to.have.all.keys('a', 'b'); + * expect(new Set(['a', 'b'])).to.have.all.keys('a', 'b'); + * + * Because `.keys` does different things based on the target's type, it's + * important to check the target's type before using `.keys`. See the `.a` doc + * for info on testing a target's type. + * + * expect({a: 1, b: 2}).to.be.an('object').that.has.all.keys('a', 'b'); + * + * By default, strict (`===`) equality is used to compare keys of maps and + * sets. Add `.deep` earlier in the chain to use deep equality instead. See + * the `deep-eql` project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target set deeply (but not strictly) has key `{a: 1}` + * expect(new Set([{a: 1}])).to.have.all.deep.keys([{a: 1}]); + * expect(new Set([{a: 1}])).to.not.have.all.keys([{a: 1}]); + * + * By default, the target must have all of the given keys and no more. Add + * `.any` earlier in the chain to only require that the target have at least + * one of the given keys. Also, add `.not` earlier in the chain to negate + * `.keys`. It's often best to add `.any` when negating `.keys`, and to use + * `.all` when asserting `.keys` without negation. + * + * When negating `.keys`, `.any` is preferred because `.not.any.keys` asserts + * exactly what's expected of the output, whereas `.not.all.keys` creates + * uncertain expectations. + * + * // Recommended; asserts that target doesn't have any of the given keys + * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd'); + * + * // Not recommended; asserts that target doesn't have all of the given + * // keys but may or may not have some of them + * expect({a: 1, b: 2}).to.not.have.all.keys('c', 'd'); + * + * When asserting `.keys` without negation, `.all` is preferred because + * `.all.keys` asserts exactly what's expected of the output, whereas + * `.any.keys` creates uncertain expectations. + * + * // Recommended; asserts that target has all the given keys + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); + * + * // Not recommended; asserts that target has at least one of the given + * // keys but may or may not have more of them + * expect({a: 1, b: 2}).to.have.any.keys('a', 'b'); + * + * Note that `.all` is used by default when neither `.all` nor `.any` appear + * earlier in the chain. However, it's often best to add `.all` anyway because + * it improves readability. + * + * // Both assertions are identical + * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); // Recommended + * expect({a: 1, b: 2}).to.have.keys('a', 'b'); // Not recommended + * + * Add `.include` earlier in the chain to require that the target's keys be a + * superset of the expected keys, rather than identical sets. + * + * // Target object's keys are a superset of ['a', 'b'] but not identical + * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b'); + * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b'); + * + * However, if `.any` and `.include` are combined, only the `.any` takes + * effect. The `.include` is ignored in this case. + * + * // Both assertions are identical + * expect({a: 1}).to.have.any.keys('a', 'b'); + * expect({a: 1}).to.include.any.keys('a', 'b'); + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({a: 1}, 'nooo why fail??').to.have.key('b'); + * + * The alias `.key` can be used interchangeably with `.keys`. + * + * @name keys + * @alias key + * @param {...String|Array|Object} keys + * @namespace BDD + * @api public + */ + + function assertKeys (keys) { + var obj = flag(this, 'object') + , objType = _.type(obj) + , keysType = _.type(keys) + , ssfi = flag(this, 'ssfi') + , isDeep = flag(this, 'deep') + , str + , deepStr = '' + , actual + , ok = true + , flagMsg = flag(this, 'message'); + + flagMsg = flagMsg ? flagMsg + ': ' : ''; + var mixedArgsMsg = flagMsg + 'when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments'; + + if (objType === 'Map' || objType === 'Set') { + deepStr = isDeep ? 'deeply ' : ''; + actual = []; + + // Map and Set '.keys' aren't supported in IE 11. Therefore, use .forEach. + obj.forEach(function (val, key) { actual.push(key); }); + + if (keysType !== 'Array') { + keys = Array.prototype.slice.call(arguments); + } + } else { + actual = _.getOwnEnumerableProperties(obj); + + switch (keysType) { + case 'Array': + if (arguments.length > 1) { + throw new AssertionError(mixedArgsMsg, undefined, ssfi); + } + break; + case 'Object': + if (arguments.length > 1) { + throw new AssertionError(mixedArgsMsg, undefined, ssfi); + } + keys = Object.keys(keys); + break; + default: + keys = Array.prototype.slice.call(arguments); + } + + // Only stringify non-Symbols because Symbols would become "Symbol()" + keys = keys.map(function (val) { + return typeof val === 'symbol' ? val : String(val); + }); + } + + if (!keys.length) { + throw new AssertionError(flagMsg + 'keys required', undefined, ssfi); + } + + var len = keys.length + , any = flag(this, 'any') + , all = flag(this, 'all') + , expected = keys; + + if (!any && !all) { + all = true; + } + + // Has any + if (any) { + ok = expected.some(function(expectedKey) { + return actual.some(function(actualKey) { + if (isDeep) { + return _.eql(expectedKey, actualKey); + } else { + return expectedKey === actualKey; + } + }); + }); + } + + // Has all + if (all) { + ok = expected.every(function(expectedKey) { + return actual.some(function(actualKey) { + if (isDeep) { + return _.eql(expectedKey, actualKey); + } else { + return expectedKey === actualKey; + } + }); + }); + + if (!flag(this, 'contains')) { + ok = ok && keys.length == actual.length; + } + } + + // Key string + if (len > 1) { + keys = keys.map(function(key) { + return _.inspect(key); + }); + var last = keys.pop(); + if (all) { + str = keys.join(', ') + ', and ' + last; + } + if (any) { + str = keys.join(', ') + ', or ' + last; + } + } else { + str = _.inspect(keys[0]); + } + + // Form + str = (len > 1 ? 'keys ' : 'key ') + str; + + // Have / include + str = (flag(this, 'contains') ? 'contain ' : 'have ') + str; + + // Assertion + this.assert( + ok + , 'expected #{this} to ' + deepStr + str + , 'expected #{this} to not ' + deepStr + str + , expected.slice(0).sort(_.compareByInspect) + , actual.sort(_.compareByInspect) + , true + ); + } + + Assertion.addMethod('keys', assertKeys); + Assertion.addMethod('key', assertKeys); + + /** + * ### .throw([errorLike], [errMsgMatcher], [msg]) + * + * When no arguments are provided, `.throw` invokes the target function and + * asserts that an error is thrown. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(); + * + * When one argument is provided, and it's an error constructor, `.throw` + * invokes the target function and asserts that an error is thrown that's an + * instance of that error constructor. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(TypeError); + * + * When one argument is provided, and it's an error instance, `.throw` invokes + * the target function and asserts that an error is thrown that's strictly + * (`===`) equal to that error instance. + * + * var err = new TypeError('Illegal salmon!'); + * var badFn = function () { throw err; }; + * + * expect(badFn).to.throw(err); + * + * When one argument is provided, and it's a string, `.throw` invokes the + * target function and asserts that an error is thrown with a message that + * contains that string. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw('salmon'); + * + * When one argument is provided, and it's a regular expression, `.throw` + * invokes the target function and asserts that an error is thrown with a + * message that matches that regular expression. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(/salmon/); + * + * When two arguments are provided, and the first is an error instance or + * constructor, and the second is a string or regular expression, `.throw` + * invokes the function and asserts that an error is thrown that fulfills both + * conditions as described above. + * + * var err = new TypeError('Illegal salmon!'); + * var badFn = function () { throw err; }; + * + * expect(badFn).to.throw(TypeError, 'salmon'); + * expect(badFn).to.throw(TypeError, /salmon/); + * expect(badFn).to.throw(err, 'salmon'); + * expect(badFn).to.throw(err, /salmon/); + * + * Add `.not` earlier in the chain to negate `.throw`. + * + * var goodFn = function () {}; + * + * expect(goodFn).to.not.throw(); + * + * However, it's dangerous to negate `.throw` when providing any arguments. + * The problem is that it creates uncertain expectations by asserting that the + * target either doesn't throw an error, or that it throws an error but of a + * different type than the given type, or that it throws an error of the given + * type but with a message that doesn't include the given string. It's often + * best to identify the exact output that's expected, and then write an + * assertion that only accepts that exact output. + * + * When the target isn't expected to throw an error, it's often best to assert + * exactly that. + * + * var goodFn = function () {}; + * + * expect(goodFn).to.not.throw(); // Recommended + * expect(goodFn).to.not.throw(ReferenceError, 'x'); // Not recommended + * + * When the target is expected to throw an error, it's often best to assert + * that the error is of its expected type, and has a message that includes an + * expected string, rather than asserting that it doesn't have one of many + * unexpected types, and doesn't have a message that includes some string. + * + * var badFn = function () { throw new TypeError('Illegal salmon!'); }; + * + * expect(badFn).to.throw(TypeError, 'salmon'); // Recommended + * expect(badFn).to.not.throw(ReferenceError, 'x'); // Not recommended + * + * `.throw` changes the target of any assertions that follow in the chain to + * be the error object that's thrown. + * + * var err = new TypeError('Illegal salmon!'); + * err.code = 42; + * var badFn = function () { throw err; }; + * + * expect(badFn).to.throw(TypeError).with.property('code', 42); + * + * `.throw` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. When not providing two arguments, always use + * the second form. + * + * var goodFn = function () {}; + * + * expect(goodFn).to.throw(TypeError, 'x', 'nooo why fail??'); + * expect(goodFn, 'nooo why fail??').to.throw(); + * + * Due to limitations in ES5, `.throw` may not always work as expected when + * using a transpiler such as Babel or TypeScript. In particular, it may + * produce unexpected results when subclassing the built-in `Error` object and + * then passing the subclassed constructor to `.throw`. See your transpiler's + * docs for details: + * + * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes)) + * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work)) + * + * Beware of some common mistakes when using the `throw` assertion. One common + * mistake is to accidentally invoke the function yourself instead of letting + * the `throw` assertion invoke the function for you. For example, when + * testing if a function named `fn` throws, provide `fn` instead of `fn()` as + * the target for the assertion. + * + * expect(fn).to.throw(); // Good! Tests `fn` as desired + * expect(fn()).to.throw(); // Bad! Tests result of `fn()`, not `fn` + * + * If you need to assert that your function `fn` throws when passed certain + * arguments, then wrap a call to `fn` inside of another function. + * + * expect(function () { fn(42); }).to.throw(); // Function expression + * expect(() => fn(42)).to.throw(); // ES6 arrow function + * + * Another common mistake is to provide an object method (or any stand-alone + * function that relies on `this`) as the target of the assertion. Doing so is + * problematic because the `this` context will be lost when the function is + * invoked by `.throw`; there's no way for it to know what `this` is supposed + * to be. There are two ways around this problem. One solution is to wrap the + * method or function call inside of another function. Another solution is to + * use `bind`. + * + * expect(function () { cat.meow(); }).to.throw(); // Function expression + * expect(() => cat.meow()).to.throw(); // ES6 arrow function + * expect(cat.meow.bind(cat)).to.throw(); // Bind + * + * Finally, it's worth mentioning that it's a best practice in JavaScript to + * only throw `Error` and derivatives of `Error` such as `ReferenceError`, + * `TypeError`, and user-defined objects that extend `Error`. No other type of + * value will generate a stack trace when initialized. With that said, the + * `throw` assertion does technically support any type of value being thrown, + * not just `Error` and its derivatives. + * + * The aliases `.throws` and `.Throw` can be used interchangeably with + * `.throw`. + * + * @name throw + * @alias throws + * @alias Throw + * @param {Error|ErrorConstructor} errorLike + * @param {String|RegExp} errMsgMatcher error message + * @param {String} msg _optional_ + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @returns error for chaining (null if no error) + * @namespace BDD + * @api public + */ + + function assertThrows (errorLike, errMsgMatcher, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , ssfi = flag(this, 'ssfi') + , flagMsg = flag(this, 'message') + , negate = flag(this, 'negate') || false; + new Assertion(obj, flagMsg, ssfi, true).is.a('function'); + + if (errorLike instanceof RegExp || typeof errorLike === 'string') { + errMsgMatcher = errorLike; + errorLike = null; + } + + var caughtErr; + try { + obj(); + } catch (err) { + caughtErr = err; + } + + // If we have the negate flag enabled and at least one valid argument it means we do expect an error + // but we want it to match a given set of criteria + var everyArgIsUndefined = errorLike === undefined && errMsgMatcher === undefined; + + // If we've got the negate flag enabled and both args, we should only fail if both aren't compatible + // See Issue #551 and PR #683@GitHub + var everyArgIsDefined = Boolean(errorLike && errMsgMatcher); + var errorLikeFail = false; + var errMsgMatcherFail = false; + + // Checking if error was thrown + if (everyArgIsUndefined || !everyArgIsUndefined && !negate) { + // We need this to display results correctly according to their types + var errorLikeString = 'an error'; + if (errorLike instanceof Error) { + errorLikeString = '#{exp}'; + } else if (errorLike) { + errorLikeString = _.checkError.getConstructorName(errorLike); + } + + this.assert( + caughtErr + , 'expected #{this} to throw ' + errorLikeString + , 'expected #{this} to not throw an error but #{act} was thrown' + , errorLike && errorLike.toString() + , (caughtErr instanceof Error ? + caughtErr.toString() : (typeof caughtErr === 'string' ? caughtErr : caughtErr && + _.checkError.getConstructorName(caughtErr))) + ); + } + + if (errorLike && caughtErr) { + // We should compare instances only if `errorLike` is an instance of `Error` + if (errorLike instanceof Error) { + var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr, errorLike); + + if (isCompatibleInstance === negate) { + // These checks were created to ensure we won't fail too soon when we've got both args and a negate + // See Issue #551 and PR #683@GitHub + if (everyArgIsDefined && negate) { + errorLikeFail = true; + } else { + this.assert( + negate + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + (caughtErr && !negate ? ' but #{act} was thrown' : '') + , errorLike.toString() + , caughtErr.toString() + ); + } + } + } + + var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr, errorLike); + if (isCompatibleConstructor === negate) { + if (everyArgIsDefined && negate) { + errorLikeFail = true; + } else { + this.assert( + negate + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') + , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) + , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) + ); + } + } + } + + if (caughtErr && errMsgMatcher !== undefined && errMsgMatcher !== null) { + // Here we check compatible messages + var placeholder = 'including'; + if (errMsgMatcher instanceof RegExp) { + placeholder = 'matching'; + } + + var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr, errMsgMatcher); + if (isCompatibleMessage === negate) { + if (everyArgIsDefined && negate) { + errMsgMatcherFail = true; + } else { + this.assert( + negate + , 'expected #{this} to throw error ' + placeholder + ' #{exp} but got #{act}' + , 'expected #{this} to throw error not ' + placeholder + ' #{exp}' + , errMsgMatcher + , _.checkError.getMessage(caughtErr) + ); + } + } + } + + // If both assertions failed and both should've matched we throw an error + if (errorLikeFail && errMsgMatcherFail) { + this.assert( + negate + , 'expected #{this} to throw #{exp} but #{act} was thrown' + , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') + , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) + , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) + ); + } + + flag(this, 'object', caughtErr); + } + Assertion.addMethod('throw', assertThrows); + Assertion.addMethod('throws', assertThrows); + Assertion.addMethod('Throw', assertThrows); + + /** + * ### .respondTo(method[, msg]) + * + * When the target is a non-function object, `.respondTo` asserts that the + * target has a method with the given name `method`. The method can be own or + * inherited, and it can be enumerable or non-enumerable. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * + * expect(new Cat()).to.respondTo('meow'); + * + * When the target is a function, `.respondTo` asserts that the target's + * `prototype` property has a method with the given name `method`. Again, the + * method can be own or inherited, and it can be enumerable or non-enumerable. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * + * expect(Cat).to.respondTo('meow'); + * + * Add `.itself` earlier in the chain to force `.respondTo` to treat the + * target as a non-function object, even if it's a function. Thus, it asserts + * that the target has a method with the given name `method`, rather than + * asserting that the target's `prototype` property has a method with the + * given name `method`. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * Cat.hiss = function () {}; + * + * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow'); + * + * When not adding `.itself`, it's important to check the target's type before + * using `.respondTo`. See the `.a` doc for info on checking a target's type. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * + * expect(new Cat()).to.be.an('object').that.respondsTo('meow'); + * + * Add `.not` earlier in the chain to negate `.respondTo`. + * + * function Dog () {} + * Dog.prototype.bark = function () {}; + * + * expect(new Dog()).to.not.respondTo('meow'); + * + * `.respondTo` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect({}).to.respondTo('meow', 'nooo why fail??'); + * expect({}, 'nooo why fail??').to.respondTo('meow'); + * + * The alias `.respondsTo` can be used interchangeably with `.respondTo`. + * + * @name respondTo + * @alias respondsTo + * @param {String} method + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function respondTo (method, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , itself = flag(this, 'itself') + , context = ('function' === typeof obj && !itself) + ? obj.prototype[method] + : obj[method]; + + this.assert( + 'function' === typeof context + , 'expected #{this} to respond to ' + _.inspect(method) + , 'expected #{this} to not respond to ' + _.inspect(method) + ); + } + + Assertion.addMethod('respondTo', respondTo); + Assertion.addMethod('respondsTo', respondTo); + + /** + * ### .itself + * + * Forces all `.respondTo` assertions that follow in the chain to behave as if + * the target is a non-function object, even if it's a function. Thus, it + * causes `.respondTo` to assert that the target has a method with the given + * name, rather than asserting that the target's `prototype` property has a + * method with the given name. + * + * function Cat () {} + * Cat.prototype.meow = function () {}; + * Cat.hiss = function () {}; + * + * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow'); + * + * @name itself + * @namespace BDD + * @api public + */ + + Assertion.addProperty('itself', function () { + flag(this, 'itself', true); + }); + + /** + * ### .satisfy(matcher[, msg]) + * + * Invokes the given `matcher` function with the target being passed as the + * first argument, and asserts that the value returned is truthy. + * + * expect(1).to.satisfy(function(num) { + * return num > 0; + * }); + * + * Add `.not` earlier in the chain to negate `.satisfy`. + * + * expect(1).to.not.satisfy(function(num) { + * return num > 2; + * }); + * + * `.satisfy` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(1).to.satisfy(function(num) { + * return num > 2; + * }, 'nooo why fail??'); + * + * expect(1, 'nooo why fail??').to.satisfy(function(num) { + * return num > 2; + * }); + * + * The alias `.satisfies` can be used interchangeably with `.satisfy`. + * + * @name satisfy + * @alias satisfies + * @param {Function} matcher + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function satisfy (matcher, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object'); + var result = matcher(obj); + this.assert( + result + , 'expected #{this} to satisfy ' + _.objDisplay(matcher) + , 'expected #{this} to not satisfy' + _.objDisplay(matcher) + , flag(this, 'negate') ? false : true + , result + ); + } + + Assertion.addMethod('satisfy', satisfy); + Assertion.addMethod('satisfies', satisfy); + + /** + * ### .closeTo(expected, delta[, msg]) + * + * Asserts that the target is a number that's within a given +/- `delta` range + * of the given number `expected`. However, it's often best to assert that the + * target is equal to its expected value. + * + * // Recommended + * expect(1.5).to.equal(1.5); + * + * // Not recommended + * expect(1.5).to.be.closeTo(1, 0.5); + * expect(1.5).to.be.closeTo(2, 0.5); + * expect(1.5).to.be.closeTo(1, 1); + * + * Add `.not` earlier in the chain to negate `.closeTo`. + * + * expect(1.5).to.equal(1.5); // Recommended + * expect(1.5).to.not.be.closeTo(3, 1); // Not recommended + * + * `.closeTo` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect(1.5).to.be.closeTo(3, 1, 'nooo why fail??'); + * expect(1.5, 'nooo why fail??').to.be.closeTo(3, 1); + * + * The alias `.approximately` can be used interchangeably with `.closeTo`. + * + * @name closeTo + * @alias approximately + * @param {Number} expected + * @param {Number} delta + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function closeTo(expected, delta, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + + new Assertion(obj, flagMsg, ssfi, true).is.a('number'); + if (typeof expected !== 'number' || typeof delta !== 'number') { + flagMsg = flagMsg ? flagMsg + ': ' : ''; + throw new AssertionError( + flagMsg + 'the arguments to closeTo or approximately must be numbers', + undefined, + ssfi + ); + } + + this.assert( + Math.abs(obj - expected) <= delta + , 'expected #{this} to be close to ' + expected + ' +/- ' + delta + , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta + ); + } + + Assertion.addMethod('closeTo', closeTo); + Assertion.addMethod('approximately', closeTo); + + // Note: Duplicates are ignored if testing for inclusion instead of sameness. + function isSubsetOf(subset, superset, cmp, contains, ordered) { + if (!contains) { + if (subset.length !== superset.length) return false; + superset = superset.slice(); + } + + return subset.every(function(elem, idx) { + if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx]; + + if (!cmp) { + var matchIdx = superset.indexOf(elem); + if (matchIdx === -1) return false; + + // Remove match from superset so not counted twice if duplicate in subset. + if (!contains) superset.splice(matchIdx, 1); + return true; + } + + return superset.some(function(elem2, matchIdx) { + if (!cmp(elem, elem2)) return false; + + // Remove match from superset so not counted twice if duplicate in subset. + if (!contains) superset.splice(matchIdx, 1); + return true; + }); + }); + } + + /** + * ### .members(set[, msg]) + * + * Asserts that the target array has the same members as the given array + * `set`. + * + * expect([1, 2, 3]).to.have.members([2, 1, 3]); + * expect([1, 2, 2]).to.have.members([2, 1, 2]); + * + * By default, members are compared using strict (`===`) equality. Add `.deep` + * earlier in the chain to use deep equality instead. See the `deep-eql` + * project page for info on the deep equality algorithm: + * https://github.com/chaijs/deep-eql. + * + * // Target array deeply (but not strictly) has member `{a: 1}` + * expect([{a: 1}]).to.have.deep.members([{a: 1}]); + * expect([{a: 1}]).to.not.have.members([{a: 1}]); + * + * By default, order doesn't matter. Add `.ordered` earlier in the chain to + * require that members appear in the same order. + * + * expect([1, 2, 3]).to.have.ordered.members([1, 2, 3]); + * expect([1, 2, 3]).to.have.members([2, 1, 3]) + * .but.not.ordered.members([2, 1, 3]); + * + * By default, both arrays must be the same size. Add `.include` earlier in + * the chain to require that the target's members be a superset of the + * expected members. Note that duplicates are ignored in the subset when + * `.include` is added. + * + * // Target array is a superset of [1, 2] but not identical + * expect([1, 2, 3]).to.include.members([1, 2]); + * expect([1, 2, 3]).to.not.have.members([1, 2]); + * + * // Duplicates in the subset are ignored + * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]); + * + * `.deep`, `.ordered`, and `.include` can all be combined. However, if + * `.include` and `.ordered` are combined, the ordering begins at the start of + * both arrays. + * + * expect([{a: 1}, {b: 2}, {c: 3}]) + * .to.include.deep.ordered.members([{a: 1}, {b: 2}]) + * .but.not.include.deep.ordered.members([{b: 2}, {c: 3}]); + * + * Add `.not` earlier in the chain to negate `.members`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the target array doesn't have all of the same members as + * the given array `set` but may or may not have some of them. It's often best + * to identify the exact output that's expected, and then write an assertion + * that only accepts that exact output. + * + * expect([1, 2]).to.not.include(3).and.not.include(4); // Recommended + * expect([1, 2]).to.not.have.members([3, 4]); // Not recommended + * + * `.members` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. + * + * expect([1, 2]).to.have.members([1, 2, 3], 'nooo why fail??'); + * expect([1, 2], 'nooo why fail??').to.have.members([1, 2, 3]); + * + * @name members + * @param {Array} set + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + Assertion.addMethod('members', function (subset, msg) { + if (msg) flag(this, 'message', msg); + var obj = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + + new Assertion(obj, flagMsg, ssfi, true).to.be.an('array'); + new Assertion(subset, flagMsg, ssfi, true).to.be.an('array'); + + var contains = flag(this, 'contains'); + var ordered = flag(this, 'ordered'); + + var subject, failMsg, failNegateMsg; + + if (contains) { + subject = ordered ? 'an ordered superset' : 'a superset'; + failMsg = 'expected #{this} to be ' + subject + ' of #{exp}'; + failNegateMsg = 'expected #{this} to not be ' + subject + ' of #{exp}'; + } else { + subject = ordered ? 'ordered members' : 'members'; + failMsg = 'expected #{this} to have the same ' + subject + ' as #{exp}'; + failNegateMsg = 'expected #{this} to not have the same ' + subject + ' as #{exp}'; + } + + var cmp = flag(this, 'deep') ? _.eql : undefined; + + this.assert( + isSubsetOf(subset, obj, cmp, contains, ordered) + , failMsg + , failNegateMsg + , subset + , obj + , true + ); + }); + + /** + * ### .oneOf(list[, msg]) + * + * Asserts that the target is a member of the given array `list`. However, + * it's often best to assert that the target is equal to its expected value. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.be.oneOf([1, 2, 3]); // Not recommended + * + * Comparisons are performed using strict (`===`) equality. + * + * Add `.not` earlier in the chain to negate `.oneOf`. + * + * expect(1).to.equal(1); // Recommended + * expect(1).to.not.be.oneOf([2, 3, 4]); // Not recommended + * + * `.oneOf` accepts an optional `msg` argument which is a custom error message + * to show when the assertion fails. The message can also be given as the + * second argument to `expect`. + * + * expect(1).to.be.oneOf([2, 3, 4], 'nooo why fail??'); + * expect(1, 'nooo why fail??').to.be.oneOf([2, 3, 4]); + * + * @name oneOf + * @param {Array<*>} list + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function oneOf (list, msg) { + if (msg) flag(this, 'message', msg); + var expected = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(list, flagMsg, ssfi, true).to.be.an('array'); + + this.assert( + list.indexOf(expected) > -1 + , 'expected #{this} to be one of #{exp}' + , 'expected #{this} to not be one of #{exp}' + , list + , expected + ); + } + + Assertion.addMethod('oneOf', oneOf); + + /** + * ### .change(subject[, prop[, msg]]) + * + * When one argument is provided, `.change` asserts that the given function + * `subject` returns a different value when it's invoked before the target + * function compared to when it's invoked afterward. However, it's often best + * to assert that `subject` is equal to its expected value. + * + * var dots = '' + * , addDot = function () { dots += '.'; } + * , getDots = function () { return dots; }; + * + * // Recommended + * expect(getDots()).to.equal(''); + * addDot(); + * expect(getDots()).to.equal('.'); + * + * // Not recommended + * expect(addDot).to.change(getDots); + * + * When two arguments are provided, `.change` asserts that the value of the + * given object `subject`'s `prop` property is different before invoking the + * target function compared to afterward. + * + * var myObj = {dots: ''} + * , addDot = function () { myObj.dots += '.'; }; + * + * // Recommended + * expect(myObj).to.have.property('dots', ''); + * addDot(); + * expect(myObj).to.have.property('dots', '.'); + * + * // Not recommended + * expect(addDot).to.change(myObj, 'dots'); + * + * Strict (`===`) equality is used to compare before and after values. + * + * Add `.not` earlier in the chain to negate `.change`. + * + * var dots = '' + * , noop = function () {} + * , getDots = function () { return dots; }; + * + * expect(noop).to.not.change(getDots); + * + * var myObj = {dots: ''} + * , noop = function () {}; + * + * expect(noop).to.not.change(myObj, 'dots'); + * + * `.change` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing two arguments, always + * use the second form. + * + * var myObj = {dots: ''} + * , addDot = function () { myObj.dots += '.'; }; + * + * expect(addDot).to.not.change(myObj, 'dots', 'nooo why fail??'); + * + * var dots = '' + * , addDot = function () { dots += '.'; } + * , getDots = function () { return dots; }; + * + * expect(addDot, 'nooo why fail??').to.not.change(getDots); + * + * `.change` also causes all `.by` assertions that follow in the chain to + * assert how much a numeric subject was increased or decreased by. However, + * it's dangerous to use `.change.by`. The problem is that it creates + * uncertain expectations by asserting that the subject either increases by + * the given delta, or that it decreases by the given delta. It's often best + * to identify the exact output that's expected, and then write an assertion + * that only accepts that exact output. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; } + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * The alias `.changes` can be used interchangeably with `.change`. + * + * @name change + * @alias changes + * @param {String} subject + * @param {String} prop name _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertChanges (subject, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + + var initial; + if (!prop) { + new Assertion(subject, flagMsg, ssfi, true).is.a('function'); + initial = subject(); + } else { + new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = subject[prop]; + } + + fn(); + + var final = prop === undefined || prop === null ? subject() : subject[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + + // This gets flagged because of the .by(delta) assertion + flag(this, 'deltaMsgObj', msgObj); + flag(this, 'initialDeltaValue', initial); + flag(this, 'finalDeltaValue', final); + flag(this, 'deltaBehavior', 'change'); + flag(this, 'realDelta', final !== initial); + + this.assert( + initial !== final + , 'expected ' + msgObj + ' to change' + , 'expected ' + msgObj + ' to not change' + ); + } + + Assertion.addMethod('change', assertChanges); + Assertion.addMethod('changes', assertChanges); + + /** + * ### .increase(subject[, prop[, msg]]) + * + * When one argument is provided, `.increase` asserts that the given function + * `subject` returns a greater number when it's invoked after invoking the + * target function compared to when it's invoked beforehand. `.increase` also + * causes all `.by` assertions that follow in the chain to assert how much + * greater of a number is returned. It's often best to assert that the return + * value increased by the expected amount, rather than asserting it increased + * by any amount. + * + * var val = 1 + * , addTwo = function () { val += 2; } + * , getVal = function () { return val; }; + * + * expect(addTwo).to.increase(getVal).by(2); // Recommended + * expect(addTwo).to.increase(getVal); // Not recommended + * + * When two arguments are provided, `.increase` asserts that the value of the + * given object `subject`'s `prop` property is greater after invoking the + * target function compared to beforehand. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.increase(myObj, 'val'); // Not recommended + * + * Add `.not` earlier in the chain to negate `.increase`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the subject either decreases, or that it stays the same. + * It's often best to identify the exact output that's expected, and then + * write an assertion that only accepts that exact output. + * + * When the subject is expected to decrease, it's often best to assert that it + * decreased by the expected amount. + * + * var myObj = {val: 1} + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.not.increase(myObj, 'val'); // Not recommended + * + * When the subject is expected to stay the same, it's often best to assert + * exactly that. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.not.change(myObj, 'val'); // Recommended + * expect(noop).to.not.increase(myObj, 'val'); // Not recommended + * + * `.increase` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing two arguments, always + * use the second form. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.increase(myObj, 'val', 'nooo why fail??'); + * + * var val = 1 + * , noop = function () {} + * , getVal = function () { return val; }; + * + * expect(noop, 'nooo why fail??').to.increase(getVal); + * + * The alias `.increases` can be used interchangeably with `.increase`. + * + * @name increase + * @alias increases + * @param {String|Function} subject + * @param {String} prop name _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertIncreases (subject, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + + var initial; + if (!prop) { + new Assertion(subject, flagMsg, ssfi, true).is.a('function'); + initial = subject(); + } else { + new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = subject[prop]; + } + + // Make sure that the target is a number + new Assertion(initial, flagMsg, ssfi, true).is.a('number'); + + fn(); + + var final = prop === undefined || prop === null ? subject() : subject[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + + flag(this, 'deltaMsgObj', msgObj); + flag(this, 'initialDeltaValue', initial); + flag(this, 'finalDeltaValue', final); + flag(this, 'deltaBehavior', 'increase'); + flag(this, 'realDelta', final - initial); + + this.assert( + final - initial > 0 + , 'expected ' + msgObj + ' to increase' + , 'expected ' + msgObj + ' to not increase' + ); + } + + Assertion.addMethod('increase', assertIncreases); + Assertion.addMethod('increases', assertIncreases); + + /** + * ### .decrease(subject[, prop[, msg]]) + * + * When one argument is provided, `.decrease` asserts that the given function + * `subject` returns a lesser number when it's invoked after invoking the + * target function compared to when it's invoked beforehand. `.decrease` also + * causes all `.by` assertions that follow in the chain to assert how much + * lesser of a number is returned. It's often best to assert that the return + * value decreased by the expected amount, rather than asserting it decreased + * by any amount. + * + * var val = 1 + * , subtractTwo = function () { val -= 2; } + * , getVal = function () { return val; }; + * + * expect(subtractTwo).to.decrease(getVal).by(2); // Recommended + * expect(subtractTwo).to.decrease(getVal); // Not recommended + * + * When two arguments are provided, `.decrease` asserts that the value of the + * given object `subject`'s `prop` property is lesser after invoking the + * target function compared to beforehand. + * + * var myObj = {val: 1} + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.decrease(myObj, 'val'); // Not recommended + * + * Add `.not` earlier in the chain to negate `.decrease`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the subject either increases, or that it stays the same. + * It's often best to identify the exact output that's expected, and then + * write an assertion that only accepts that exact output. + * + * When the subject is expected to increase, it's often best to assert that it + * increased by the expected amount. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.not.decrease(myObj, 'val'); // Not recommended + * + * When the subject is expected to stay the same, it's often best to assert + * exactly that. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.not.change(myObj, 'val'); // Recommended + * expect(noop).to.not.decrease(myObj, 'val'); // Not recommended + * + * `.decrease` accepts an optional `msg` argument which is a custom error + * message to show when the assertion fails. The message can also be given as + * the second argument to `expect`. When not providing two arguments, always + * use the second form. + * + * var myObj = {val: 1} + * , noop = function () {}; + * + * expect(noop).to.decrease(myObj, 'val', 'nooo why fail??'); + * + * var val = 1 + * , noop = function () {} + * , getVal = function () { return val; }; + * + * expect(noop, 'nooo why fail??').to.decrease(getVal); + * + * The alias `.decreases` can be used interchangeably with `.decrease`. + * + * @name decrease + * @alias decreases + * @param {String|Function} subject + * @param {String} prop name _optional_ + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertDecreases (subject, prop, msg) { + if (msg) flag(this, 'message', msg); + var fn = flag(this, 'object') + , flagMsg = flag(this, 'message') + , ssfi = flag(this, 'ssfi'); + new Assertion(fn, flagMsg, ssfi, true).is.a('function'); + + var initial; + if (!prop) { + new Assertion(subject, flagMsg, ssfi, true).is.a('function'); + initial = subject(); + } else { + new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); + initial = subject[prop]; + } + + // Make sure that the target is a number + new Assertion(initial, flagMsg, ssfi, true).is.a('number'); + + fn(); + + var final = prop === undefined || prop === null ? subject() : subject[prop]; + var msgObj = prop === undefined || prop === null ? initial : '.' + prop; + + flag(this, 'deltaMsgObj', msgObj); + flag(this, 'initialDeltaValue', initial); + flag(this, 'finalDeltaValue', final); + flag(this, 'deltaBehavior', 'decrease'); + flag(this, 'realDelta', initial - final); + + this.assert( + final - initial < 0 + , 'expected ' + msgObj + ' to decrease' + , 'expected ' + msgObj + ' to not decrease' + ); + } + + Assertion.addMethod('decrease', assertDecreases); + Assertion.addMethod('decreases', assertDecreases); + + /** + * ### .by(delta[, msg]) + * + * When following an `.increase` assertion in the chain, `.by` asserts that + * the subject of the `.increase` assertion increased by the given `delta`. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); + * + * When following a `.decrease` assertion in the chain, `.by` asserts that the + * subject of the `.decrease` assertion decreased by the given `delta`. + * + * var myObj = {val: 1} + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); + * + * When following a `.change` assertion in the chain, `.by` asserts that the + * subject of the `.change` assertion either increased or decreased by the + * given `delta`. However, it's dangerous to use `.change.by`. The problem is + * that it creates uncertain expectations. It's often best to identify the + * exact output that's expected, and then write an assertion that only accepts + * that exact output. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; } + * , subtractTwo = function () { myObj.val -= 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended + * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended + * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended + * + * Add `.not` earlier in the chain to negate `.by`. However, it's often best + * to assert that the subject changed by its expected delta, rather than + * asserting that it didn't change by one of countless unexpected deltas. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * // Recommended + * expect(addTwo).to.increase(myObj, 'val').by(2); + * + * // Not recommended + * expect(addTwo).to.increase(myObj, 'val').but.not.by(3); + * + * `.by` accepts an optional `msg` argument which is a custom error message to + * show when the assertion fails. The message can also be given as the second + * argument to `expect`. + * + * var myObj = {val: 1} + * , addTwo = function () { myObj.val += 2; }; + * + * expect(addTwo).to.increase(myObj, 'val').by(3, 'nooo why fail??'); + * expect(addTwo, 'nooo why fail??').to.increase(myObj, 'val').by(3); + * + * @name by + * @param {Number} delta + * @param {String} msg _optional_ + * @namespace BDD + * @api public + */ + + function assertDelta(delta, msg) { + if (msg) flag(this, 'message', msg); + + var msgObj = flag(this, 'deltaMsgObj'); + var initial = flag(this, 'initialDeltaValue'); + var final = flag(this, 'finalDeltaValue'); + var behavior = flag(this, 'deltaBehavior'); + var realDelta = flag(this, 'realDelta'); + + var expression; + if (behavior === 'change') { + expression = Math.abs(final - initial) === Math.abs(delta); + } else { + expression = realDelta === Math.abs(delta); + } + + this.assert( + expression + , 'expected ' + msgObj + ' to ' + behavior + ' by ' + delta + , 'expected ' + msgObj + ' to not ' + behavior + ' by ' + delta + ); + } + + Assertion.addMethod('by', assertDelta); + + /** + * ### .extensible + * + * Asserts that the target is extensible, which means that new properties can + * be added to it. Primitives are never extensible. + * + * expect({a: 1}).to.be.extensible; + * + * Add `.not` earlier in the chain to negate `.extensible`. + * + * var nonExtensibleObject = Object.preventExtensions({}) + * , sealedObject = Object.seal({}) + * , frozenObject = Object.freeze({}); + * + * expect(nonExtensibleObject).to.not.be.extensible; + * expect(sealedObject).to.not.be.extensible; + * expect(frozenObject).to.not.be.extensible; + * expect(1).to.not.be.extensible; + * + * A custom error message can be given as the second argument to `expect`. + * + * expect(1, 'nooo why fail??').to.be.extensible; + * + * @name extensible + * @namespace BDD + * @api public + */ + + Assertion.addProperty('extensible', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible + // The following provides ES6 behavior for ES5 environments. + + var isExtensible = obj === Object(obj) && Object.isExtensible(obj); + + this.assert( + isExtensible + , 'expected #{this} to be extensible' + , 'expected #{this} to not be extensible' + ); + }); + + /** + * ### .sealed + * + * Asserts that the target is sealed, which means that new properties can't be + * added to it, and its existing properties can't be reconfigured or deleted. + * However, it's possible that its existing properties can still be reassigned + * to different values. Primitives are always sealed. + * + * var sealedObject = Object.seal({}); + * var frozenObject = Object.freeze({}); + * + * expect(sealedObject).to.be.sealed; + * expect(frozenObject).to.be.sealed; + * expect(1).to.be.sealed; + * + * Add `.not` earlier in the chain to negate `.sealed`. + * + * expect({a: 1}).to.not.be.sealed; + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({a: 1}, 'nooo why fail??').to.be.sealed; + * + * @name sealed + * @namespace BDD + * @api public + */ + + Assertion.addProperty('sealed', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed + // The following provides ES6 behavior for ES5 environments. + + var isSealed = obj === Object(obj) ? Object.isSealed(obj) : true; + + this.assert( + isSealed + , 'expected #{this} to be sealed' + , 'expected #{this} to not be sealed' + ); + }); + + /** + * ### .frozen + * + * Asserts that the target is frozen, which means that new properties can't be + * added to it, and its existing properties can't be reassigned to different + * values, reconfigured, or deleted. Primitives are always frozen. + * + * var frozenObject = Object.freeze({}); + * + * expect(frozenObject).to.be.frozen; + * expect(1).to.be.frozen; + * + * Add `.not` earlier in the chain to negate `.frozen`. + * + * expect({a: 1}).to.not.be.frozen; + * + * A custom error message can be given as the second argument to `expect`. + * + * expect({a: 1}, 'nooo why fail??').to.be.frozen; + * + * @name frozen + * @namespace BDD + * @api public + */ + + Assertion.addProperty('frozen', function() { + var obj = flag(this, 'object'); + + // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. + // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true. + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen + // The following provides ES6 behavior for ES5 environments. + + var isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true; + + this.assert( + isFrozen + , 'expected #{this} to be frozen' + , 'expected #{this} to not be frozen' + ); + }); + + /** + * ### .finite + * + * Asserts that the target is a number, and isn't `NaN` or positive/negative + * `Infinity`. + * + * expect(1).to.be.finite; + * + * Add `.not` earlier in the chain to negate `.finite`. However, it's + * dangerous to do so. The problem is that it creates uncertain expectations + * by asserting that the subject either isn't a number, or that it's `NaN`, or + * that it's positive `Infinity`, or that it's negative `Infinity`. It's often + * best to identify the exact output that's expected, and then write an + * assertion that only accepts that exact output. + * + * When the target isn't expected to be a number, it's often best to assert + * that it's the expected type, rather than asserting that it isn't one of + * many unexpected types. + * + * expect('foo').to.be.a('string'); // Recommended + * expect('foo').to.not.be.finite; // Not recommended + * + * When the target is expected to be `NaN`, it's often best to assert exactly + * that. + * + * expect(NaN).to.be.NaN; // Recommended + * expect(NaN).to.not.be.finite; // Not recommended + * + * When the target is expected to be positive infinity, it's often best to + * assert exactly that. + * + * expect(Infinity).to.equal(Infinity); // Recommended + * expect(Infinity).to.not.be.finite; // Not recommended + * + * When the target is expected to be negative infinity, it's often best to + * assert exactly that. + * + * expect(-Infinity).to.equal(-Infinity); // Recommended + * expect(-Infinity).to.not.be.finite; // Not recommended + * + * A custom error message can be given as the second argument to `expect`. + * + * expect('foo', 'nooo why fail??').to.be.finite; + * + * @name finite + * @namespace BDD + * @api public + */ + + Assertion.addProperty('finite', function(msg) { + var obj = flag(this, 'object'); + + this.assert( + typeof obj === 'number' && isFinite(obj) + , 'expected #{this} to be a finite number' + , 'expected #{this} to not be a finite number' + ); + }); + }; + + /*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + + var expect = function (chai, util) { + chai.expect = function (val, message) { + return new chai.Assertion(val, message); + }; + + /** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. + * + * expect.fail(); + * expect.fail("custom error message"); + * expect.fail(1, 2); + * expect.fail(1, 2, "custom error message"); + * expect.fail(1, 2, "custom error message", ">"); + * expect.fail(1, 2, undefined, ">"); + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace BDD + * @api public + */ + + chai.expect.fail = function (actual, expected, message, operator) { + if (arguments.length < 2) { + message = actual; + actual = undefined; + } + + message = message || 'expect.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, chai.expect.fail); + }; + }; + + /*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + + var should = function (chai, util) { + var Assertion = chai.Assertion; + + function loadShould () { + // explicitly define this method as function as to have it's name to include as `ssfi` + function shouldGetter() { + if (this instanceof String + || this instanceof Number + || this instanceof Boolean + || typeof Symbol === 'function' && this instanceof Symbol) { + return new Assertion(this.valueOf(), null, shouldGetter); + } + return new Assertion(this, null, shouldGetter); + } + function shouldSetter(value) { + // See https://github.com/chaijs/chai/issues/86: this makes + // `whatever.should = someValue` actually set `someValue`, which is + // especially useful for `global.should = require('chai').should()`. + // + // Note that we have to use [[DefineProperty]] instead of [[Put]] + // since otherwise we would trigger this very setter! + Object.defineProperty(this, 'should', { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } + // modify Object.prototype to have `should` + Object.defineProperty(Object.prototype, 'should', { + set: shouldSetter + , get: shouldGetter + , configurable: true + }); + + var should = {}; + + /** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. + * + * should.fail(); + * should.fail("custom error message"); + * should.fail(1, 2); + * should.fail(1, 2, "custom error message"); + * should.fail(1, 2, "custom error message", ">"); + * should.fail(1, 2, undefined, ">"); + * + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace BDD + * @api public + */ + + should.fail = function (actual, expected, message, operator) { + if (arguments.length < 2) { + message = actual; + actual = undefined; + } + + message = message || 'should.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, should.fail); + }; + + /** + * ### .equal(actual, expected, [message]) + * + * Asserts non-strict equality (`==`) of `actual` and `expected`. + * + * should.equal(3, '3', '== coerces values to strings'); + * + * @name equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Should + * @api public + */ + + should.equal = function (val1, val2, msg) { + new Assertion(val1, msg).to.equal(val2); + }; + + /** + * ### .throw(function, [constructor/string/regexp], [string/regexp], [message]) + * + * Asserts that `function` will throw an error that is an instance of + * `constructor`, or alternately that it will throw an error with message + * matching `regexp`. + * + * should.throw(fn, 'function throws a reference error'); + * should.throw(fn, /function throws a reference error/); + * should.throw(fn, ReferenceError); + * should.throw(fn, ReferenceError, 'function throws a reference error'); + * should.throw(fn, ReferenceError, /function throws a reference error/); + * + * @name throw + * @alias Throw + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Should + * @api public + */ + + should.Throw = function (fn, errt, errs, msg) { + new Assertion(fn, msg).to.Throw(errt, errs); + }; + + /** + * ### .exist + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var foo = 'hi'; + * + * should.exist(foo, 'foo exists'); + * + * @name exist + * @namespace Should + * @api public + */ + + should.exist = function (val, msg) { + new Assertion(val, msg).to.exist; + }; + + // negation + should.not = {}; + + /** + * ### .not.equal(actual, expected, [message]) + * + * Asserts non-strict inequality (`!=`) of `actual` and `expected`. + * + * should.not.equal(3, 4, 'these numbers are not equal'); + * + * @name not.equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Should + * @api public + */ + + should.not.equal = function (val1, val2, msg) { + new Assertion(val1, msg).to.not.equal(val2); + }; + + /** + * ### .throw(function, [constructor/regexp], [message]) + * + * Asserts that `function` will _not_ throw an error that is an instance of + * `constructor`, or alternately that it will not throw an error with message + * matching `regexp`. + * + * should.not.throw(fn, Error, 'function does not throw'); + * + * @name not.throw + * @alias not.Throw + * @param {Function} function + * @param {ErrorConstructor} constructor + * @param {RegExp} regexp + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Should + * @api public + */ + + should.not.Throw = function (fn, errt, errs, msg) { + new Assertion(fn, msg).to.not.Throw(errt, errs); + }; + + /** + * ### .not.exist + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var bar = null; + * + * should.not.exist(bar, 'bar does not exist'); + * + * @name not.exist + * @namespace Should + * @api public + */ + + should.not.exist = function (val, msg) { + new Assertion(val, msg).to.not.exist; + }; + + should['throw'] = should['Throw']; + should.not['throw'] = should.not['Throw']; + + return should; + } + chai.should = loadShould; + chai.Should = loadShould; + }; + + /*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + + var assert = function (chai, util) { + /*! + * Chai dependencies. + */ + + var Assertion = chai.Assertion + , flag = util.flag; + + /*! + * Module export. + */ + + /** + * ### assert(expression, message) + * + * Write your own test expressions. + * + * assert('foo' !== 'bar', 'foo is not bar'); + * assert(Array.isArray([]), 'empty arrays are arrays'); + * + * @param {Mixed} expression to test for truthiness + * @param {String} message to display on error + * @name assert + * @namespace Assert + * @api public + */ + + var assert = chai.assert = function (express, errmsg) { + var test = new Assertion(null, null, chai.assert, true); + test.assert( + express + , errmsg + , '[ negation message unavailable ]' + ); + }; + + /** + * ### .fail([message]) + * ### .fail(actual, expected, [message], [operator]) + * + * Throw a failure. Node.js `assert` module-compatible. + * + * assert.fail(); + * assert.fail("custom error message"); + * assert.fail(1, 2); + * assert.fail(1, 2, "custom error message"); + * assert.fail(1, 2, "custom error message", ">"); + * assert.fail(1, 2, undefined, ">"); + * + * @name fail + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @param {String} operator + * @namespace Assert + * @api public + */ + + assert.fail = function (actual, expected, message, operator) { + if (arguments.length < 2) { + // Comply with Node's fail([message]) interface + + message = actual; + actual = undefined; + } + + message = message || 'assert.fail()'; + throw new chai.AssertionError(message, { + actual: actual + , expected: expected + , operator: operator + }, assert.fail); + }; + + /** + * ### .isOk(object, [message]) + * + * Asserts that `object` is truthy. + * + * assert.isOk('everything', 'everything is ok'); + * assert.isOk(false, 'this will fail'); + * + * @name isOk + * @alias ok + * @param {Mixed} object to test + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isOk = function (val, msg) { + new Assertion(val, msg, assert.isOk, true).is.ok; + }; + + /** + * ### .isNotOk(object, [message]) + * + * Asserts that `object` is falsy. + * + * assert.isNotOk('everything', 'this will fail'); + * assert.isNotOk(false, 'this will pass'); + * + * @name isNotOk + * @alias notOk + * @param {Mixed} object to test + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotOk = function (val, msg) { + new Assertion(val, msg, assert.isNotOk, true).is.not.ok; + }; + + /** + * ### .equal(actual, expected, [message]) + * + * Asserts non-strict equality (`==`) of `actual` and `expected`. + * + * assert.equal(3, '3', '== coerces values to strings'); + * + * @name equal + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.equal = function (act, exp, msg) { + var test = new Assertion(act, msg, assert.equal, true); + + test.assert( + exp == flag(test, 'object') + , 'expected #{this} to equal #{exp}' + , 'expected #{this} to not equal #{act}' + , exp + , act + , true + ); + }; + + /** + * ### .notEqual(actual, expected, [message]) + * + * Asserts non-strict inequality (`!=`) of `actual` and `expected`. + * + * assert.notEqual(3, 4, 'these numbers are not equal'); + * + * @name notEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notEqual = function (act, exp, msg) { + var test = new Assertion(act, msg, assert.notEqual, true); + + test.assert( + exp != flag(test, 'object') + , 'expected #{this} to not equal #{exp}' + , 'expected #{this} to equal #{act}' + , exp + , act + , true + ); + }; + + /** + * ### .strictEqual(actual, expected, [message]) + * + * Asserts strict equality (`===`) of `actual` and `expected`. + * + * assert.strictEqual(true, true, 'these booleans are strictly equal'); + * + * @name strictEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.strictEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.strictEqual, true).to.equal(exp); + }; + + /** + * ### .notStrictEqual(actual, expected, [message]) + * + * Asserts strict inequality (`!==`) of `actual` and `expected`. + * + * assert.notStrictEqual(3, '3', 'no coercion for strict equality'); + * + * @name notStrictEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notStrictEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp); + }; + + /** + * ### .deepEqual(actual, expected, [message]) + * + * Asserts that `actual` is deeply equal to `expected`. + * + * assert.deepEqual({ tea: 'green' }, { tea: 'green' }); + * + * @name deepEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @alias deepStrictEqual + * @namespace Assert + * @api public + */ + + assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.deepEqual, true).to.eql(exp); + }; + + /** + * ### .notDeepEqual(actual, expected, [message]) + * + * Assert that `actual` is not deeply equal to `expected`. + * + * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' }); + * + * @name notDeepEqual + * @param {Mixed} actual + * @param {Mixed} expected + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepEqual = function (act, exp, msg) { + new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp); + }; + + /** + * ### .isAbove(valueToCheck, valueToBeAbove, [message]) + * + * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`. + * + * assert.isAbove(5, 2, '5 is strictly greater than 2'); + * + * @name isAbove + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAbove + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAbove = function (val, abv, msg) { + new Assertion(val, msg, assert.isAbove, true).to.be.above(abv); + }; + + /** + * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message]) + * + * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`. + * + * assert.isAtLeast(5, 2, '5 is greater or equal to 2'); + * assert.isAtLeast(3, 3, '3 is greater or equal to 3'); + * + * @name isAtLeast + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAtLeast + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAtLeast = function (val, atlst, msg) { + new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst); + }; + + /** + * ### .isBelow(valueToCheck, valueToBeBelow, [message]) + * + * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`. + * + * assert.isBelow(3, 6, '3 is strictly less than 6'); + * + * @name isBelow + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeBelow + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isBelow = function (val, blw, msg) { + new Assertion(val, msg, assert.isBelow, true).to.be.below(blw); + }; + + /** + * ### .isAtMost(valueToCheck, valueToBeAtMost, [message]) + * + * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`. + * + * assert.isAtMost(3, 6, '3 is less than or equal to 6'); + * assert.isAtMost(4, 4, '4 is less than or equal to 4'); + * + * @name isAtMost + * @param {Mixed} valueToCheck + * @param {Mixed} valueToBeAtMost + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isAtMost = function (val, atmst, msg) { + new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst); + }; + + /** + * ### .isTrue(value, [message]) + * + * Asserts that `value` is true. + * + * var teaServed = true; + * assert.isTrue(teaServed, 'the tea has been served'); + * + * @name isTrue + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isTrue = function (val, msg) { + new Assertion(val, msg, assert.isTrue, true).is['true']; + }; + + /** + * ### .isNotTrue(value, [message]) + * + * Asserts that `value` is not true. + * + * var tea = 'tasty chai'; + * assert.isNotTrue(tea, 'great, time for tea!'); + * + * @name isNotTrue + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotTrue = function (val, msg) { + new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true); + }; + + /** + * ### .isFalse(value, [message]) + * + * Asserts that `value` is false. + * + * var teaServed = false; + * assert.isFalse(teaServed, 'no tea yet? hmm...'); + * + * @name isFalse + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFalse = function (val, msg) { + new Assertion(val, msg, assert.isFalse, true).is['false']; + }; + + /** + * ### .isNotFalse(value, [message]) + * + * Asserts that `value` is not false. + * + * var tea = 'tasty chai'; + * assert.isNotFalse(tea, 'great, time for tea!'); + * + * @name isNotFalse + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotFalse = function (val, msg) { + new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false); + }; + + /** + * ### .isNull(value, [message]) + * + * Asserts that `value` is null. + * + * assert.isNull(err, 'there was no error'); + * + * @name isNull + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNull = function (val, msg) { + new Assertion(val, msg, assert.isNull, true).to.equal(null); + }; + + /** + * ### .isNotNull(value, [message]) + * + * Asserts that `value` is not null. + * + * var tea = 'tasty chai'; + * assert.isNotNull(tea, 'great, time for tea!'); + * + * @name isNotNull + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotNull = function (val, msg) { + new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null); + }; + + /** + * ### .isNaN + * + * Asserts that value is NaN. + * + * assert.isNaN(NaN, 'NaN is NaN'); + * + * @name isNaN + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNaN = function (val, msg) { + new Assertion(val, msg, assert.isNaN, true).to.be.NaN; + }; + + /** + * ### .isNotNaN + * + * Asserts that value is not NaN. + * + * assert.isNotNaN(4, '4 is not NaN'); + * + * @name isNotNaN + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + assert.isNotNaN = function (val, msg) { + new Assertion(val, msg, assert.isNotNaN, true).not.to.be.NaN; + }; + + /** + * ### .exists + * + * Asserts that the target is neither `null` nor `undefined`. + * + * var foo = 'hi'; + * + * assert.exists(foo, 'foo is neither `null` nor `undefined`'); + * + * @name exists + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.exists = function (val, msg) { + new Assertion(val, msg, assert.exists, true).to.exist; + }; + + /** + * ### .notExists + * + * Asserts that the target is either `null` or `undefined`. + * + * var bar = null + * , baz; + * + * assert.notExists(bar); + * assert.notExists(baz, 'baz is either null or undefined'); + * + * @name notExists + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notExists = function (val, msg) { + new Assertion(val, msg, assert.notExists, true).to.not.exist; + }; + + /** + * ### .isUndefined(value, [message]) + * + * Asserts that `value` is `undefined`. + * + * var tea; + * assert.isUndefined(tea, 'no tea defined'); + * + * @name isUndefined + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isUndefined = function (val, msg) { + new Assertion(val, msg, assert.isUndefined, true).to.equal(undefined); + }; + + /** + * ### .isDefined(value, [message]) + * + * Asserts that `value` is not `undefined`. + * + * var tea = 'cup of chai'; + * assert.isDefined(tea, 'tea has been defined'); + * + * @name isDefined + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isDefined = function (val, msg) { + new Assertion(val, msg, assert.isDefined, true).to.not.equal(undefined); + }; + + /** + * ### .isFunction(value, [message]) + * + * Asserts that `value` is a function. + * + * function serveTea() { return 'cup of tea'; }; + * assert.isFunction(serveTea, 'great, we can have tea now'); + * + * @name isFunction + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFunction = function (val, msg) { + new Assertion(val, msg, assert.isFunction, true).to.be.a('function'); + }; + + /** + * ### .isNotFunction(value, [message]) + * + * Asserts that `value` is _not_ a function. + * + * var serveTea = [ 'heat', 'pour', 'sip' ]; + * assert.isNotFunction(serveTea, 'great, we have listed the steps'); + * + * @name isNotFunction + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotFunction = function (val, msg) { + new Assertion(val, msg, assert.isNotFunction, true).to.not.be.a('function'); + }; + + /** + * ### .isObject(value, [message]) + * + * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`). + * _The assertion does not match subclassed objects._ + * + * var selection = { name: 'Chai', serve: 'with spices' }; + * assert.isObject(selection, 'tea selection is an object'); + * + * @name isObject + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isObject = function (val, msg) { + new Assertion(val, msg, assert.isObject, true).to.be.a('object'); + }; + + /** + * ### .isNotObject(value, [message]) + * + * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`). + * + * var selection = 'chai' + * assert.isNotObject(selection, 'tea selection is not an object'); + * assert.isNotObject(null, 'null is not an object'); + * + * @name isNotObject + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotObject = function (val, msg) { + new Assertion(val, msg, assert.isNotObject, true).to.not.be.a('object'); + }; + + /** + * ### .isArray(value, [message]) + * + * Asserts that `value` is an array. + * + * var menu = [ 'green', 'chai', 'oolong' ]; + * assert.isArray(menu, 'what kind of tea do we want?'); + * + * @name isArray + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isArray = function (val, msg) { + new Assertion(val, msg, assert.isArray, true).to.be.an('array'); + }; + + /** + * ### .isNotArray(value, [message]) + * + * Asserts that `value` is _not_ an array. + * + * var menu = 'green|chai|oolong'; + * assert.isNotArray(menu, 'what kind of tea do we want?'); + * + * @name isNotArray + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotArray = function (val, msg) { + new Assertion(val, msg, assert.isNotArray, true).to.not.be.an('array'); + }; + + /** + * ### .isString(value, [message]) + * + * Asserts that `value` is a string. + * + * var teaOrder = 'chai'; + * assert.isString(teaOrder, 'order placed'); + * + * @name isString + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isString = function (val, msg) { + new Assertion(val, msg, assert.isString, true).to.be.a('string'); + }; + + /** + * ### .isNotString(value, [message]) + * + * Asserts that `value` is _not_ a string. + * + * var teaOrder = 4; + * assert.isNotString(teaOrder, 'order placed'); + * + * @name isNotString + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotString = function (val, msg) { + new Assertion(val, msg, assert.isNotString, true).to.not.be.a('string'); + }; + + /** + * ### .isNumber(value, [message]) + * + * Asserts that `value` is a number. + * + * var cups = 2; + * assert.isNumber(cups, 'how many cups'); + * + * @name isNumber + * @param {Number} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNumber = function (val, msg) { + new Assertion(val, msg, assert.isNumber, true).to.be.a('number'); + }; + + /** + * ### .isNotNumber(value, [message]) + * + * Asserts that `value` is _not_ a number. + * + * var cups = '2 cups please'; + * assert.isNotNumber(cups, 'how many cups'); + * + * @name isNotNumber + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotNumber = function (val, msg) { + new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a('number'); + }; + + /** + * ### .isFinite(value, [message]) + * + * Asserts that `value` is a finite number. Unlike `.isNumber`, this will fail for `NaN` and `Infinity`. + * + * var cups = 2; + * assert.isFinite(cups, 'how many cups'); + * + * assert.isFinite(NaN); // throws + * + * @name isFinite + * @param {Number} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isFinite = function (val, msg) { + new Assertion(val, msg, assert.isFinite, true).to.be.finite; + }; + + /** + * ### .isBoolean(value, [message]) + * + * Asserts that `value` is a boolean. + * + * var teaReady = true + * , teaServed = false; + * + * assert.isBoolean(teaReady, 'is the tea ready'); + * assert.isBoolean(teaServed, 'has tea been served'); + * + * @name isBoolean + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isBoolean = function (val, msg) { + new Assertion(val, msg, assert.isBoolean, true).to.be.a('boolean'); + }; + + /** + * ### .isNotBoolean(value, [message]) + * + * Asserts that `value` is _not_ a boolean. + * + * var teaReady = 'yep' + * , teaServed = 'nope'; + * + * assert.isNotBoolean(teaReady, 'is the tea ready'); + * assert.isNotBoolean(teaServed, 'has tea been served'); + * + * @name isNotBoolean + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.isNotBoolean = function (val, msg) { + new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean'); + }; + + /** + * ### .typeOf(value, name, [message]) + * + * Asserts that `value`'s type is `name`, as determined by + * `Object.prototype.toString`. + * + * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object'); + * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array'); + * assert.typeOf('tea', 'string', 'we have a string'); + * assert.typeOf(/tea/, 'regexp', 'we have a regular expression'); + * assert.typeOf(null, 'null', 'we have a null'); + * assert.typeOf(undefined, 'undefined', 'we have an undefined'); + * + * @name typeOf + * @param {Mixed} value + * @param {String} name + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.typeOf = function (val, type, msg) { + new Assertion(val, msg, assert.typeOf, true).to.be.a(type); + }; + + /** + * ### .notTypeOf(value, name, [message]) + * + * Asserts that `value`'s type is _not_ `name`, as determined by + * `Object.prototype.toString`. + * + * assert.notTypeOf('tea', 'number', 'strings are not numbers'); + * + * @name notTypeOf + * @param {Mixed} value + * @param {String} typeof name + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notTypeOf = function (val, type, msg) { + new Assertion(val, msg, assert.notTypeOf, true).to.not.be.a(type); + }; + + /** + * ### .instanceOf(object, constructor, [message]) + * + * Asserts that `value` is an instance of `constructor`. + * + * var Tea = function (name) { this.name = name; } + * , chai = new Tea('chai'); + * + * assert.instanceOf(chai, Tea, 'chai is an instance of tea'); + * + * @name instanceOf + * @param {Object} object + * @param {Constructor} constructor + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.instanceOf = function (val, type, msg) { + new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type); + }; + + /** + * ### .notInstanceOf(object, constructor, [message]) + * + * Asserts `value` is not an instance of `constructor`. + * + * var Tea = function (name) { this.name = name; } + * , chai = new String('chai'); + * + * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea'); + * + * @name notInstanceOf + * @param {Object} object + * @param {Constructor} constructor + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notInstanceOf = function (val, type, msg) { + new Assertion(val, msg, assert.notInstanceOf, true) + .to.not.be.instanceOf(type); + }; + + /** + * ### .include(haystack, needle, [message]) + * + * Asserts that `haystack` includes `needle`. Can be used to assert the + * inclusion of a value in an array, a substring in a string, or a subset of + * properties in an object. + * + * assert.include([1,2,3], 2, 'array contains value'); + * assert.include('foobar', 'foo', 'string contains substring'); + * assert.include({ foo: 'bar', hello: 'universe' }, { foo: 'bar' }, 'object contains property'); + * + * Strict equality (===) is used. When asserting the inclusion of a value in + * an array, the array is searched for an element that's strictly equal to the + * given value. When asserting a subset of properties in an object, the object + * is searched for the given property keys, checking that each one is present + * and strictly equal to the given property value. For instance: + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.include([obj1, obj2], obj1); + * assert.include({foo: obj1, bar: obj2}, {foo: obj1}); + * assert.include({foo: obj1, bar: obj2}, {foo: obj1, bar: obj2}); + * + * @name include + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.include = function (exp, inc, msg) { + new Assertion(exp, msg, assert.include, true).include(inc); + }; + + /** + * ### .notInclude(haystack, needle, [message]) + * + * Asserts that `haystack` does not include `needle`. Can be used to assert + * the absence of a value in an array, a substring in a string, or a subset of + * properties in an object. + * + * assert.notInclude([1,2,3], 4, "array doesn't contain value"); + * assert.notInclude('foobar', 'baz', "string doesn't contain substring"); + * assert.notInclude({ foo: 'bar', hello: 'universe' }, { foo: 'baz' }, 'object doesn't contain property'); + * + * Strict equality (===) is used. When asserting the absence of a value in an + * array, the array is searched to confirm the absence of an element that's + * strictly equal to the given value. When asserting a subset of properties in + * an object, the object is searched to confirm that at least one of the given + * property keys is either not present or not strictly equal to the given + * property value. For instance: + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.notInclude([obj1, obj2], {a: 1}); + * assert.notInclude({foo: obj1, bar: obj2}, {foo: {a: 1}}); + * assert.notInclude({foo: obj1, bar: obj2}, {foo: obj1, bar: {b: 2}}); + * + * @name notInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notInclude, true).not.include(inc); + }; + + /** + * ### .deepInclude(haystack, needle, [message]) + * + * Asserts that `haystack` includes `needle`. Can be used to assert the + * inclusion of a value in an array or a subset of properties in an object. + * Deep equality is used. + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.deepInclude([obj1, obj2], {a: 1}); + * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}}); + * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 2}}); + * + * @name deepInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc); + }; + + /** + * ### .notDeepInclude(haystack, needle, [message]) + * + * Asserts that `haystack` does not include `needle`. Can be used to assert + * the absence of a value in an array or a subset of properties in an object. + * Deep equality is used. + * + * var obj1 = {a: 1} + * , obj2 = {b: 2}; + * assert.notDeepInclude([obj1, obj2], {a: 9}); + * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 9}}); + * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 9}}); + * + * @name notDeepInclude + * @param {Array|String} haystack + * @param {Mixed} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc); + }; + + /** + * ### .nestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.nestedInclude({'.a': {'b': 'x'}}, {'\\.a.[b]': 'x'}); + * assert.nestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'x'}); + * + * @name nestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.nestedInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc); + }; + + /** + * ### .notNestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' does not include 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.notNestedInclude({'.a': {'b': 'x'}}, {'\\.a.b': 'y'}); + * assert.notNestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'y'}); + * + * @name notNestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notNestedInclude = function (exp, inc, msg) { + new Assertion(exp, msg, assert.notNestedInclude, true) + .not.nested.include(inc); + }; + + /** + * ### .deepNestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object while checking for deep equality. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.deepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {x: 1}}); + * assert.deepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {x: 1}}); + * + * @name deepNestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepNestedInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.deepNestedInclude, true) + .deep.nested.include(inc); + }; + + /** + * ### .notDeepNestedInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' does not include 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object while checking for deep equality. + * Enables the use of dot- and bracket-notation for referencing nested + * properties. + * '[]' and '.' in property names can be escaped using double backslashes. + * + * assert.notDeepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {y: 1}}) + * assert.notDeepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {y: 2}}); + * + * @name notDeepNestedInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepNestedInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.notDeepNestedInclude, true) + .not.deep.nested.include(inc); + }; + + /** + * ### .ownInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object while ignoring inherited properties. + * + * assert.ownInclude({ a: 1 }, { a: 1 }); + * + * @name ownInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.ownInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.ownInclude, true).own.include(inc); + }; + + /** + * ### .notOwnInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object while ignoring inherited properties. + * + * Object.prototype.b = 2; + * + * assert.notOwnInclude({ a: 1 }, { b: 2 }); + * + * @name notOwnInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notOwnInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc); + }; + + /** + * ### .deepOwnInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the inclusion of a subset of properties in an + * object while ignoring inherited properties and checking for deep equality. + * + * assert.deepOwnInclude({a: {b: 2}}, {a: {b: 2}}); + * + * @name deepOwnInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepOwnInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.deepOwnInclude, true) + .deep.own.include(inc); + }; + + /** + * ### .notDeepOwnInclude(haystack, needle, [message]) + * + * Asserts that 'haystack' includes 'needle'. + * Can be used to assert the absence of a subset of properties in an + * object while ignoring inherited properties and checking for deep equality. + * + * assert.notDeepOwnInclude({a: {b: 2}}, {a: {c: 3}}); + * + * @name notDeepOwnInclude + * @param {Object} haystack + * @param {Object} needle + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepOwnInclude = function(exp, inc, msg) { + new Assertion(exp, msg, assert.notDeepOwnInclude, true) + .not.deep.own.include(inc); + }; + + /** + * ### .match(value, regexp, [message]) + * + * Asserts that `value` matches the regular expression `regexp`. + * + * assert.match('foobar', /^foo/, 'regexp matches'); + * + * @name match + * @param {Mixed} value + * @param {RegExp} regexp + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.match = function (exp, re, msg) { + new Assertion(exp, msg, assert.match, true).to.match(re); + }; + + /** + * ### .notMatch(value, regexp, [message]) + * + * Asserts that `value` does not match the regular expression `regexp`. + * + * assert.notMatch('foobar', /^foo/, 'regexp does not match'); + * + * @name notMatch + * @param {Mixed} value + * @param {RegExp} regexp + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notMatch = function (exp, re, msg) { + new Assertion(exp, msg, assert.notMatch, true).to.not.match(re); + }; + + /** + * ### .property(object, property, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property`. + * + * assert.property({ tea: { green: 'matcha' }}, 'tea'); + * assert.property({ tea: { green: 'matcha' }}, 'toString'); + * + * @name property + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.property = function (obj, prop, msg) { + new Assertion(obj, msg, assert.property, true).to.have.property(prop); + }; + + /** + * ### .notProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a direct or inherited property named + * by `property`. + * + * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee'); + * + * @name notProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.notProperty, true) + .to.not.have.property(prop); + }; + + /** + * ### .propertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property` with a value given by `value`. Uses a strict equality check + * (===). + * + * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good'); + * + * @name propertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.propertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.propertyVal, true) + .to.have.property(prop, val); + }; + + /** + * ### .notPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct or inherited property named + * by `property` with value given by `value`. Uses a strict equality check + * (===). + * + * assert.notPropertyVal({ tea: 'is good' }, 'tea', 'is bad'); + * assert.notPropertyVal({ tea: 'is good' }, 'coffee', 'is good'); + * + * @name notPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notPropertyVal, true) + .to.not.have.property(prop, val); + }; + + /** + * ### .deepPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property` with a value given by `value`. Uses a deep equality check. + * + * assert.deepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' }); + * + * @name deepPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.deepPropertyVal, true) + .to.have.deep.property(prop, val); + }; + + /** + * ### .notDeepPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct or inherited property named + * by `property` with value given by `value`. Uses a deep equality check. + * + * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' }); + * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' }); + * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' }); + * + * @name notDeepPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notDeepPropertyVal, true) + .to.not.have.deep.property(prop, val); + }; + + /** + * ### .ownProperty(object, property, [message]) + * + * Asserts that `object` has a direct property named by `property`. Inherited + * properties aren't checked. + * + * assert.ownProperty({ tea: { green: 'matcha' }}, 'tea'); + * + * @name ownProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @api public + */ + + assert.ownProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.ownProperty, true) + .to.have.own.property(prop); + }; + + /** + * ### .notOwnProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a direct property named by + * `property`. Inherited properties aren't checked. + * + * assert.notOwnProperty({ tea: { green: 'matcha' }}, 'coffee'); + * assert.notOwnProperty({}, 'toString'); + * + * @name notOwnProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @api public + */ + + assert.notOwnProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.notOwnProperty, true) + .to.not.have.own.property(prop); + }; + + /** + * ### .ownPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct property named by `property` and a value + * equal to the provided `value`. Uses a strict equality check (===). + * Inherited properties aren't checked. + * + * assert.ownPropertyVal({ coffee: 'is good'}, 'coffee', 'is good'); + * + * @name ownPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.ownPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.ownPropertyVal, true) + .to.have.own.property(prop, value); + }; + + /** + * ### .notOwnPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct property named by `property` + * with a value equal to the provided `value`. Uses a strict equality check + * (===). Inherited properties aren't checked. + * + * assert.notOwnPropertyVal({ tea: 'is better'}, 'tea', 'is worse'); + * assert.notOwnPropertyVal({}, 'toString', Object.prototype.toString); + * + * @name notOwnPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.notOwnPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.notOwnPropertyVal, true) + .to.not.have.own.property(prop, value); + }; + + /** + * ### .deepOwnPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a direct property named by `property` and a value + * equal to the provided `value`. Uses a deep equality check. Inherited + * properties aren't checked. + * + * assert.deepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' }); + * + * @name deepOwnPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.deepOwnPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.deepOwnPropertyVal, true) + .to.have.deep.own.property(prop, value); + }; + + /** + * ### .notDeepOwnPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a direct property named by `property` + * with a value equal to the provided `value`. Uses a deep equality check. + * Inherited properties aren't checked. + * + * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' }); + * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' }); + * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' }); + * assert.notDeepOwnPropertyVal({}, 'toString', Object.prototype.toString); + * + * @name notDeepOwnPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @api public + */ + + assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) { + new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true) + .to.not.have.deep.own.property(prop, value); + }; + + /** + * ### .nestedProperty(object, property, [message]) + * + * Asserts that `object` has a direct or inherited property named by + * `property`, which can be a string using dot- and bracket-notation for + * nested reference. + * + * assert.nestedProperty({ tea: { green: 'matcha' }}, 'tea.green'); + * + * @name nestedProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.nestedProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.nestedProperty, true) + .to.have.nested.property(prop); + }; + + /** + * ### .notNestedProperty(object, property, [message]) + * + * Asserts that `object` does _not_ have a property named by `property`, which + * can be a string using dot- and bracket-notation for nested reference. The + * property cannot exist on the object nor anywhere in its prototype chain. + * + * assert.notNestedProperty({ tea: { green: 'matcha' }}, 'tea.oolong'); + * + * @name notNestedProperty + * @param {Object} object + * @param {String} property + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notNestedProperty = function (obj, prop, msg) { + new Assertion(obj, msg, assert.notNestedProperty, true) + .to.not.have.nested.property(prop); + }; + + /** + * ### .nestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property` with value given + * by `value`. `property` can use dot- and bracket-notation for nested + * reference. Uses a strict equality check (===). + * + * assert.nestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha'); + * + * @name nestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.nestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.nestedPropertyVal, true) + .to.have.nested.property(prop, val); + }; + + /** + * ### .notNestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a property named by `property` with + * value given by `value`. `property` can use dot- and bracket-notation for + * nested reference. Uses a strict equality check (===). + * + * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha'); + * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'coffee.green', 'matcha'); + * + * @name notNestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notNestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notNestedPropertyVal, true) + .to.not.have.nested.property(prop, val); + }; + + /** + * ### .deepNestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` has a property named by `property` with a value given + * by `value`. `property` can use dot- and bracket-notation for nested + * reference. Uses a deep equality check. + * + * assert.deepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yum' }); + * + * @name deepNestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.deepNestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.deepNestedPropertyVal, true) + .to.have.deep.nested.property(prop, val); + }; + + /** + * ### .notDeepNestedPropertyVal(object, property, value, [message]) + * + * Asserts that `object` does _not_ have a property named by `property` with + * value given by `value`. `property` can use dot- and bracket-notation for + * nested reference. Uses a deep equality check. + * + * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { oolong: 'yum' }); + * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yuck' }); + * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.black', { matcha: 'yum' }); + * + * @name notDeepNestedPropertyVal + * @param {Object} object + * @param {String} property + * @param {Mixed} value + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) { + new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true) + .to.not.have.deep.nested.property(prop, val); + }; + + /** + * ### .lengthOf(object, length, [message]) + * + * Asserts that `object` has a `length` or `size` with the expected value. + * + * assert.lengthOf([1,2,3], 3, 'array has length of 3'); + * assert.lengthOf('foobar', 6, 'string has length of 6'); + * assert.lengthOf(new Set([1,2,3]), 3, 'set has size of 3'); + * assert.lengthOf(new Map([['a',1],['b',2],['c',3]]), 3, 'map has size of 3'); + * + * @name lengthOf + * @param {Mixed} object + * @param {Number} length + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.lengthOf = function (exp, len, msg) { + new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len); + }; + + /** + * ### .hasAnyKeys(object, [keys], [message]) + * + * Asserts that `object` has at least one of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'iDontExist', 'baz']); + * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, iDontExist: 99, baz: 1337}); + * assert.hasAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); + * assert.hasAnyKeys(new Set([{foo: 'bar'}, 'anotherKey']), [{foo: 'bar'}, 'anotherKey']); + * + * @name hasAnyKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAnyKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys); + }; + + /** + * ### .hasAllKeys(object, [keys], [message]) + * + * Asserts that `object` has all and only all of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']); + * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337]); + * assert.hasAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); + * assert.hasAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']); + * + * @name hasAllKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAllKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys); + }; + + /** + * ### .containsAllKeys(object, [keys], [message]) + * + * Asserts that `object` has all of the `keys` provided but may have more keys not listed. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'baz']); + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']); + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, baz: 1337}); + * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337}); + * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}]); + * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); + * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}]); + * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']); + * + * @name containsAllKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.containsAllKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.containsAllKeys, true) + .to.contain.all.keys(keys); + }; + + /** + * ### .doesNotHaveAnyKeys(object, [keys], [message]) + * + * Asserts that `object` has none of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']); + * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'}); + * assert.doesNotHaveAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']); + * assert.doesNotHaveAnyKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']); + * + * @name doesNotHaveAnyKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAnyKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true) + .to.not.have.any.keys(keys); + }; + + /** + * ### .doesNotHaveAllKeys(object, [keys], [message]) + * + * Asserts that `object` does not have at least one of the `keys` provided. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']); + * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'}); + * assert.doesNotHaveAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']); + * assert.doesNotHaveAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']); + * + * @name doesNotHaveAllKeys + * @param {Mixed} object + * @param {String[]} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAllKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAllKeys, true) + .to.not.have.all.keys(keys); + }; + + /** + * ### .hasAnyDeepKeys(object, [keys], [message]) + * + * Asserts that `object` has at least one of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'}); + * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), [{one: 'one'}, {two: 'two'}]); + * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); + * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'}); + * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {three: 'three'}]); + * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); + * + * @name doesNotHaveAllKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAnyDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAnyDeepKeys, true) + .to.have.any.deep.keys(keys); + }; + + /** + * ### .hasAllDeepKeys(object, [keys], [message]) + * + * Asserts that `object` has all and only all of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne']]), {one: 'one'}); + * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); + * assert.hasAllDeepKeys(new Set([{one: 'one'}]), {one: 'one'}); + * assert.hasAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); + * + * @name hasAllDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.hasAllDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.hasAllDeepKeys, true) + .to.have.all.deep.keys(keys); + }; + + /** + * ### .containsAllDeepKeys(object, [keys], [message]) + * + * Asserts that `object` contains all of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'}); + * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); + * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'}); + * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); + * + * @name containsAllDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.containsAllDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.containsAllDeepKeys, true) + .to.contain.all.deep.keys(keys); + }; + + /** + * ### .doesNotHaveAnyDeepKeys(object, [keys], [message]) + * + * Asserts that `object` has none of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'}); + * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {fifty: 'fifty'}]); + * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'}); + * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{twenty: 'twenty'}, {fifty: 'fifty'}]); + * + * @name doesNotHaveAnyDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true) + .to.not.have.any.deep.keys(keys); + }; + + /** + * ### .doesNotHaveAllDeepKeys(object, [keys], [message]) + * + * Asserts that `object` does not have at least one of the `keys` provided. + * Since Sets and Maps can have objects as keys you can use this assertion to perform + * a deep comparison. + * You can also provide a single object instead of a `keys` array and its keys + * will be used as the expected set of keys. + * + * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'}); + * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {one: 'one'}]); + * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'}); + * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {fifty: 'fifty'}]); + * + * @name doesNotHaveAllDeepKeys + * @param {Mixed} object + * @param {Array|Object} keys + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) { + new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true) + .to.not.have.all.deep.keys(keys); + }; + + /** + * ### .throws(fn, [errorLike/string/regexp], [string/regexp], [message]) + * + * If `errorLike` is an `Error` constructor, asserts that `fn` will throw an error that is an + * instance of `errorLike`. + * If `errorLike` is an `Error` instance, asserts that the error thrown is the same + * instance as `errorLike`. + * If `errMsgMatcher` is provided, it also asserts that the error thrown will have a + * message matching `errMsgMatcher`. + * + * assert.throws(fn, 'Error thrown must have this msg'); + * assert.throws(fn, /Error thrown must have a msg that matches this/); + * assert.throws(fn, ReferenceError); + * assert.throws(fn, errorInstance); + * assert.throws(fn, ReferenceError, 'Error thrown must be a ReferenceError and have this msg'); + * assert.throws(fn, errorInstance, 'Error thrown must be the same errorInstance and have this msg'); + * assert.throws(fn, ReferenceError, /Error thrown must be a ReferenceError and match this/); + * assert.throws(fn, errorInstance, /Error thrown must be the same errorInstance and match this/); + * + * @name throws + * @alias throw + * @alias Throw + * @param {Function} fn + * @param {ErrorConstructor|Error} errorLike + * @param {RegExp|String} errMsgMatcher + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Assert + * @api public + */ + + assert.throws = function (fn, errorLike, errMsgMatcher, msg) { + if ('string' === typeof errorLike || errorLike instanceof RegExp) { + errMsgMatcher = errorLike; + errorLike = null; + } + + var assertErr = new Assertion(fn, msg, assert.throws, true) + .to.throw(errorLike, errMsgMatcher); + return flag(assertErr, 'object'); + }; + + /** + * ### .doesNotThrow(fn, [errorLike/string/regexp], [string/regexp], [message]) + * + * If `errorLike` is an `Error` constructor, asserts that `fn` will _not_ throw an error that is an + * instance of `errorLike`. + * If `errorLike` is an `Error` instance, asserts that the error thrown is _not_ the same + * instance as `errorLike`. + * If `errMsgMatcher` is provided, it also asserts that the error thrown will _not_ have a + * message matching `errMsgMatcher`. + * + * assert.doesNotThrow(fn, 'Any Error thrown must not have this message'); + * assert.doesNotThrow(fn, /Any Error thrown must not match this/); + * assert.doesNotThrow(fn, Error); + * assert.doesNotThrow(fn, errorInstance); + * assert.doesNotThrow(fn, Error, 'Error must not have this message'); + * assert.doesNotThrow(fn, errorInstance, 'Error must not have this message'); + * assert.doesNotThrow(fn, Error, /Error must not match this/); + * assert.doesNotThrow(fn, errorInstance, /Error must not match this/); + * + * @name doesNotThrow + * @param {Function} fn + * @param {ErrorConstructor} errorLike + * @param {RegExp|String} errMsgMatcher + * @param {String} message + * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types + * @namespace Assert + * @api public + */ + + assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) { + if ('string' === typeof errorLike || errorLike instanceof RegExp) { + errMsgMatcher = errorLike; + errorLike = null; + } + + new Assertion(fn, msg, assert.doesNotThrow, true) + .to.not.throw(errorLike, errMsgMatcher); + }; + + /** + * ### .operator(val1, operator, val2, [message]) + * + * Compares two values using `operator`. + * + * assert.operator(1, '<', 2, 'everything is ok'); + * assert.operator(1, '>', 2, 'this will fail'); + * + * @name operator + * @param {Mixed} val1 + * @param {String} operator + * @param {Mixed} val2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.operator = function (val, operator, val2, msg) { + var ok; + switch(operator) { + case '==': + ok = val == val2; + break; + case '===': + ok = val === val2; + break; + case '>': + ok = val > val2; + break; + case '>=': + ok = val >= val2; + break; + case '<': + ok = val < val2; + break; + case '<=': + ok = val <= val2; + break; + case '!=': + ok = val != val2; + break; + case '!==': + ok = val !== val2; + break; + default: + msg = msg ? msg + ': ' : msg; + throw new chai.AssertionError( + msg + 'Invalid operator "' + operator + '"', + undefined, + assert.operator + ); + } + var test = new Assertion(ok, msg, assert.operator, true); + test.assert( + true === flag(test, 'object') + , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2) + , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) ); + }; + + /** + * ### .closeTo(actual, expected, delta, [message]) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * assert.closeTo(1.5, 1, 0.5, 'numbers are close'); + * + * @name closeTo + * @param {Number} actual + * @param {Number} expected + * @param {Number} delta + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.closeTo = function (act, exp, delta, msg) { + new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta); + }; + + /** + * ### .approximately(actual, expected, delta, [message]) + * + * Asserts that the target is equal `expected`, to within a +/- `delta` range. + * + * assert.approximately(1.5, 1, 0.5, 'numbers are close'); + * + * @name approximately + * @param {Number} actual + * @param {Number} expected + * @param {Number} delta + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.approximately = function (act, exp, delta, msg) { + new Assertion(act, msg, assert.approximately, true) + .to.be.approximately(exp, delta); + }; + + /** + * ### .sameMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in any order. Uses a + * strict equality check (===). + * + * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members'); + * + * @name sameMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameMembers, true) + .to.have.same.members(set2); + }; + + /** + * ### .notSameMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in any order. + * Uses a strict equality check (===). + * + * assert.notSameMembers([ 1, 2, 3 ], [ 5, 1, 3 ], 'not same members'); + * + * @name notSameMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameMembers, true) + .to.not.have.same.members(set2); + }; + + /** + * ### .sameDeepMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in any order. Uses a + * deep equality check. + * + * assert.sameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { c: 3 }], 'same deep members'); + * + * @name sameDeepMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameDeepMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameDeepMembers, true) + .to.have.same.deep.members(set2); + }; + + /** + * ### .notSameDeepMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in any order. + * Uses a deep equality check. + * + * assert.notSameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { f: 5 }], 'not same deep members'); + * + * @name notSameDeepMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameDeepMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameDeepMembers, true) + .to.not.have.same.deep.members(set2); + }; + + /** + * ### .sameOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in the same order. + * Uses a strict equality check (===). + * + * assert.sameOrderedMembers([ 1, 2, 3 ], [ 1, 2, 3 ], 'same ordered members'); + * + * @name sameOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameOrderedMembers, true) + .to.have.same.ordered.members(set2); + }; + + /** + * ### .notSameOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in the same + * order. Uses a strict equality check (===). + * + * assert.notSameOrderedMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'not same ordered members'); + * + * @name notSameOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameOrderedMembers, true) + .to.not.have.same.ordered.members(set2); + }; + + /** + * ### .sameDeepOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` have the same members in the same order. + * Uses a deep equality check. + * + * assert.sameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { c: 3 } ], 'same deep ordered members'); + * + * @name sameDeepOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.sameDeepOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.sameDeepOrderedMembers, true) + .to.have.same.deep.ordered.members(set2); + }; + + /** + * ### .notSameDeepOrderedMembers(set1, set2, [message]) + * + * Asserts that `set1` and `set2` don't have the same members in the same + * order. Uses a deep equality check. + * + * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { z: 5 } ], 'not same deep ordered members'); + * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { c: 3 } ], 'not same deep ordered members'); + * + * @name notSameDeepOrderedMembers + * @param {Array} set1 + * @param {Array} set2 + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notSameDeepOrderedMembers = function (set1, set2, msg) { + new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true) + .to.not.have.same.deep.ordered.members(set2); + }; + + /** + * ### .includeMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in any order. Uses a + * strict equality check (===). Duplicates are ignored. + * + * assert.includeMembers([ 1, 2, 3 ], [ 2, 1, 2 ], 'include members'); + * + * @name includeMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeMembers, true) + .to.include.members(subset); + }; + + /** + * ### .notIncludeMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in any order. Uses a + * strict equality check (===). Duplicates are ignored. + * + * assert.notIncludeMembers([ 1, 2, 3 ], [ 5, 1 ], 'not include members'); + * + * @name notIncludeMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeMembers, true) + .to.not.include.members(subset); + }; + + /** + * ### .includeDeepMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in any order. Uses a deep + * equality check. Duplicates are ignored. + * + * assert.includeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { b: 2 } ], 'include deep members'); + * + * @name includeDeepMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeDeepMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeDeepMembers, true) + .to.include.deep.members(subset); + }; + + /** + * ### .notIncludeDeepMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in any order. Uses a + * deep equality check. Duplicates are ignored. + * + * assert.notIncludeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { f: 5 } ], 'not include deep members'); + * + * @name notIncludeDeepMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeDeepMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeDeepMembers, true) + .to.not.include.deep.members(subset); + }; + + /** + * ### .includeOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in the same order + * beginning with the first element in `superset`. Uses a strict equality + * check (===). + * + * assert.includeOrderedMembers([ 1, 2, 3 ], [ 1, 2 ], 'include ordered members'); + * + * @name includeOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeOrderedMembers, true) + .to.include.ordered.members(subset); + }; + + /** + * ### .notIncludeOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in the same order + * beginning with the first element in `superset`. Uses a strict equality + * check (===). + * + * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 1 ], 'not include ordered members'); + * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 3 ], 'not include ordered members'); + * + * @name notIncludeOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeOrderedMembers, true) + .to.not.include.ordered.members(subset); + }; + + /** + * ### .includeDeepOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` is included in `superset` in the same order + * beginning with the first element in `superset`. Uses a deep equality + * check. + * + * assert.includeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 } ], 'include deep ordered members'); + * + * @name includeDeepOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.includeDeepOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.includeDeepOrderedMembers, true) + .to.include.deep.ordered.members(subset); + }; + + /** + * ### .notIncludeDeepOrderedMembers(superset, subset, [message]) + * + * Asserts that `subset` isn't included in `superset` in the same order + * beginning with the first element in `superset`. Uses a deep equality + * check. + * + * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { f: 5 } ], 'not include deep ordered members'); + * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 } ], 'not include deep ordered members'); + * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { c: 3 } ], 'not include deep ordered members'); + * + * @name notIncludeDeepOrderedMembers + * @param {Array} superset + * @param {Array} subset + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) { + new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true) + .to.not.include.deep.ordered.members(subset); + }; + + /** + * ### .oneOf(inList, list, [message]) + * + * Asserts that non-object, non-array value `inList` appears in the flat array `list`. + * + * assert.oneOf(1, [ 2, 1 ], 'Not found in list'); + * + * @name oneOf + * @param {*} inList + * @param {Array<*>} list + * @param {String} message + * @namespace Assert + * @api public + */ + + assert.oneOf = function (inList, list, msg) { + new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list); + }; + + /** + * ### .changes(function, object, property, [message]) + * + * Asserts that a function changes the value of a property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 22 }; + * assert.changes(fn, obj, 'val'); + * + * @name changes + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changes = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + new Assertion(fn, msg, assert.changes, true).to.change(obj, prop); + }; + + /** + * ### .changesBy(function, object, property, delta, [message]) + * + * Asserts that a function changes the value of a property by an amount (delta). + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 2 }; + * assert.changesBy(fn, obj, 'val', 2); + * + * @name changesBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changesBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.changesBy, true) + .to.change(obj, prop).by(delta); + }; + + /** + * ### .doesNotChange(function, object, property, [message]) + * + * Asserts that a function does not change the value of a property. + * + * var obj = { val: 10 }; + * var fn = function() { console.log('foo'); }; + * assert.doesNotChange(fn, obj, 'val'); + * + * @name doesNotChange + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotChange = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotChange, true) + .to.not.change(obj, prop); + }; + + /** + * ### .changesButNotBy(function, object, property, delta, [message]) + * + * Asserts that a function does not change the value of a property or of a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 10 }; + * assert.changesButNotBy(fn, obj, 'val', 5); + * + * @name changesButNotBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.changesButNotBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.changesButNotBy, true) + .to.change(obj, prop).but.not.by(delta); + }; + + /** + * ### .increases(function, object, property, [message]) + * + * Asserts that a function increases a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 13 }; + * assert.increases(fn, obj, 'val'); + * + * @name increases + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increases = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.increases, true) + .to.increase(obj, prop); + }; + + /** + * ### .increasesBy(function, object, property, delta, [message]) + * + * Asserts that a function increases a numeric object property or a function's return value by an amount (delta). + * + * var obj = { val: 10 }; + * var fn = function() { obj.val += 10 }; + * assert.increasesBy(fn, obj, 'val', 10); + * + * @name increasesBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increasesBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.increasesBy, true) + .to.increase(obj, prop).by(delta); + }; + + /** + * ### .doesNotIncrease(function, object, property, [message]) + * + * Asserts that a function does not increase a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 8 }; + * assert.doesNotIncrease(fn, obj, 'val'); + * + * @name doesNotIncrease + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotIncrease = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotIncrease, true) + .to.not.increase(obj, prop); + }; + + /** + * ### .increasesButNotBy(function, object, property, [message]) + * + * Asserts that a function does not increase a numeric object property or function's return value by an amount (delta). + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 15 }; + * assert.increasesButNotBy(fn, obj, 'val', 10); + * + * @name increasesButNotBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.increasesButNotBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.increasesButNotBy, true) + .to.increase(obj, prop).but.not.by(delta); + }; + + /** + * ### .decreases(function, object, property, [message]) + * + * Asserts that a function decreases a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.decreases(fn, obj, 'val'); + * + * @name decreases + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreases = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.decreases, true) + .to.decrease(obj, prop); + }; + + /** + * ### .decreasesBy(function, object, property, delta, [message]) + * + * Asserts that a function decreases a numeric object property or a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val -= 5 }; + * assert.decreasesBy(fn, obj, 'val', 5); + * + * @name decreasesBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreasesBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.decreasesBy, true) + .to.decrease(obj, prop).by(delta); + }; + + /** + * ### .doesNotDecrease(function, object, property, [message]) + * + * Asserts that a function does not decreases a numeric object property. + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 15 }; + * assert.doesNotDecrease(fn, obj, 'val'); + * + * @name doesNotDecrease + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotDecrease = function (fn, obj, prop, msg) { + if (arguments.length === 3 && typeof obj === 'function') { + msg = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotDecrease, true) + .to.not.decrease(obj, prop); + }; + + /** + * ### .doesNotDecreaseBy(function, object, property, delta, [message]) + * + * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.doesNotDecreaseBy(fn, obj, 'val', 1); + * + * @name doesNotDecrease + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + return new Assertion(fn, msg, assert.doesNotDecreaseBy, true) + .to.not.decrease(obj, prop).by(delta); + }; + + /** + * ### .decreasesButNotBy(function, object, property, delta, [message]) + * + * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta) + * + * var obj = { val: 10 }; + * var fn = function() { obj.val = 5 }; + * assert.decreasesButNotBy(fn, obj, 'val', 1); + * + * @name decreasesButNotBy + * @param {Function} modifier function + * @param {Object} object or getter function + * @param {String} property name _optional_ + * @param {Number} change amount (delta) + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) { + if (arguments.length === 4 && typeof obj === 'function') { + var tmpMsg = delta; + delta = prop; + msg = tmpMsg; + } else if (arguments.length === 3) { + delta = prop; + prop = null; + } + + new Assertion(fn, msg, assert.decreasesButNotBy, true) + .to.decrease(obj, prop).but.not.by(delta); + }; + + /*! + * ### .ifError(object) + * + * Asserts if value is not a false value, and throws if it is a true value. + * This is added to allow for chai to be a drop-in replacement for Node's + * assert class. + * + * var err = new Error('I am a custom error'); + * assert.ifError(err); // Rethrows err! + * + * @name ifError + * @param {Object} object + * @namespace Assert + * @api public + */ + + assert.ifError = function (val) { + if (val) { + throw(val); + } + }; + + /** + * ### .isExtensible(object) + * + * Asserts that `object` is extensible (can have new properties added to it). + * + * assert.isExtensible({}); + * + * @name isExtensible + * @alias extensible + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isExtensible = function (obj, msg) { + new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible; + }; + + /** + * ### .isNotExtensible(object) + * + * Asserts that `object` is _not_ extensible. + * + * var nonExtensibleObject = Object.preventExtensions({}); + * var sealedObject = Object.seal({}); + * var frozenObject = Object.freeze({}); + * + * assert.isNotExtensible(nonExtensibleObject); + * assert.isNotExtensible(sealedObject); + * assert.isNotExtensible(frozenObject); + * + * @name isNotExtensible + * @alias notExtensible + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotExtensible = function (obj, msg) { + new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible; + }; + + /** + * ### .isSealed(object) + * + * Asserts that `object` is sealed (cannot have new properties added to it + * and its existing properties cannot be removed). + * + * var sealedObject = Object.seal({}); + * var frozenObject = Object.seal({}); + * + * assert.isSealed(sealedObject); + * assert.isSealed(frozenObject); + * + * @name isSealed + * @alias sealed + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isSealed = function (obj, msg) { + new Assertion(obj, msg, assert.isSealed, true).to.be.sealed; + }; + + /** + * ### .isNotSealed(object) + * + * Asserts that `object` is _not_ sealed. + * + * assert.isNotSealed({}); + * + * @name isNotSealed + * @alias notSealed + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotSealed = function (obj, msg) { + new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed; + }; + + /** + * ### .isFrozen(object) + * + * Asserts that `object` is frozen (cannot have new properties added to it + * and its existing properties cannot be modified). + * + * var frozenObject = Object.freeze({}); + * assert.frozen(frozenObject); + * + * @name isFrozen + * @alias frozen + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isFrozen = function (obj, msg) { + new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen; + }; + + /** + * ### .isNotFrozen(object) + * + * Asserts that `object` is _not_ frozen. + * + * assert.isNotFrozen({}); + * + * @name isNotFrozen + * @alias notFrozen + * @param {Object} object + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotFrozen = function (obj, msg) { + new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen; + }; + + /** + * ### .isEmpty(target) + * + * Asserts that the target does not contain any values. + * For arrays and strings, it checks the `length` property. + * For `Map` and `Set` instances, it checks the `size` property. + * For non-function objects, it gets the count of own + * enumerable string keys. + * + * assert.isEmpty([]); + * assert.isEmpty(''); + * assert.isEmpty(new Map); + * assert.isEmpty({}); + * + * @name isEmpty + * @alias empty + * @param {Object|Array|String|Map|Set} target + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isEmpty = function(val, msg) { + new Assertion(val, msg, assert.isEmpty, true).to.be.empty; + }; + + /** + * ### .isNotEmpty(target) + * + * Asserts that the target contains values. + * For arrays and strings, it checks the `length` property. + * For `Map` and `Set` instances, it checks the `size` property. + * For non-function objects, it gets the count of own + * enumerable string keys. + * + * assert.isNotEmpty([1, 2]); + * assert.isNotEmpty('34'); + * assert.isNotEmpty(new Set([5, 6])); + * assert.isNotEmpty({ key: 7 }); + * + * @name isNotEmpty + * @alias notEmpty + * @param {Object|Array|String|Map|Set} target + * @param {String} message _optional_ + * @namespace Assert + * @api public + */ + + assert.isNotEmpty = function(val, msg) { + new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty; + }; + + /*! + * Aliases. + */ + + (function alias(name, as){ + assert[as] = assert[name]; + return alias; + }) + ('isOk', 'ok') + ('isNotOk', 'notOk') + ('throws', 'throw') + ('throws', 'Throw') + ('isExtensible', 'extensible') + ('isNotExtensible', 'notExtensible') + ('isSealed', 'sealed') + ('isNotSealed', 'notSealed') + ('isFrozen', 'frozen') + ('isNotFrozen', 'notFrozen') + ('isEmpty', 'empty') + ('isNotEmpty', 'notEmpty'); + }; + + var chai = createCommonjsModule(function (module, exports) { + /*! + * chai + * Copyright(c) 2011-2014 Jake Luer + * MIT Licensed + */ + + var used = []; + + /*! + * Chai version + */ + + exports.version = '4.2.0'; + + /*! + * Assertion Error + */ + + exports.AssertionError = assertionError; + + /*! + * Utils for plugins (not exported) + */ + + + + /** + * # .use(function) + * + * Provides a way to extend the internals of Chai. + * + * @param {Function} + * @returns {this} for chaining + * @api public + */ + + exports.use = function (fn) { + if (!~used.indexOf(fn)) { + fn(exports, utils); + used.push(fn); + } + + return exports; + }; + + /*! + * Utility Functions + */ + + exports.util = utils; + + /*! + * Configuration + */ + + + exports.config = config; + + /*! + * Primary `Assertion` prototype + */ + + + exports.use(assertion); + + /*! + * Core Assertions + */ + + + exports.use(assertions); + + /*! + * Expect interface + */ + + + exports.use(expect); + + /*! + * Should interface + */ + + + exports.use(should); + + /*! + * Assert interface + */ + + + exports.use(assert); + }); + var chai_1 = chai.version; + var chai_2 = chai.AssertionError; + var chai_3 = chai.use; + var chai_4 = chai.util; + var chai_5 = chai.config; + + var chai$1 = chai; + + var GrammarError = function GrammarError(message, location) { + _classCallCheck(this, GrammarError); + + this.name = "GrammarError"; + this.message = message; + this.location = location; + + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, GrammarError); + } + }; + + var grammarError = GrammarError; + + function findIndex(array, condition) { + for (var i = 0; i < array.length; ++i) { + if (condition(array[i], i)) return i; + } + + return -1; + } + + function find(array, condition) { + var index = findIndex(array, condition); + return index < 0 ? void 0 : array[index]; + } + + var arrays = { + findIndex: findIndex, + find: find + }; + + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + + function sourceEscape(s) { + return s.replace(/\0/g, "\\0").replace(/\x08/g, "\\b").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\v/g, "\\v").replace(/\f/g, "\\f").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { + return "\\x0" + hex(ch); + }).replace(/[\x10-\x1F\x7F-\xFF]/g, function (ch) { + return "\\x" + hex(ch); + }).replace(/[\u0100-\u0FFF]/g, function (ch) { + return "\\u0" + hex(ch); + }).replace(/[\u1000-\uFFFF]/g, function (ch) { + return "\\u" + hex(ch); + }); + } + + var js = { + stringEscape: function stringEscape(s) { + return sourceEscape(s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")); + }, + regexpEscape: function regexpEscape(s) { + return sourceEscape(s.replace(/\\/g, "\\\\").replace(/\//g, "\\/").replace(/]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-")); + }, + reservedWords: ["break", "case", "catch", "continue", "debugger", "default", "delete", "do", "else", "finally", "for", "function", "if", "in", "instanceof", "new", "return", "switch", "this", "throw", "try", "typeof", "var", "void", "while", "with", "class", "const", "enum", "export", "extends", "implements", "import", "interface", "let", "package", "private", "protected", "public", "static", "super", "yield", "false", "null", "true"] + }; + var js_1 = js; + + var __hasOwnProperty = Object.prototype.hasOwnProperty; + var objects = { + clone: function clone(source) { + var target = {}; + + for (var key in source) { + if (!__hasOwnProperty.call(source, key)) continue; + target[key] = source[key]; + } + + return target; + }, + each: function each(object, iterator) { + for (var key in object) { + if (!__hasOwnProperty.call(object, key)) continue; + iterator(object[key], key); + } + }, + extend: function extend(target, source) { + for (var key in source) { + if (!__hasOwnProperty.call(source, key)) continue; + if (__hasOwnProperty.call(target, key)) continue; + target[key] = source[key]; + } + + return target; + }, + map: function map(object, transformer) { + var target = {}; + + for (var key in object) { + if (!__hasOwnProperty.call(object, key)) continue; + target[key] = transformer(object[key], key); + } + + return target; + }, + values: function values(object, transformer) { + var target = []; + var index = -1; + var key, value; + + for (key in object) { + if (!__hasOwnProperty.call(object, key)) continue; + value = object[key]; + target[++index] = transformer ? transformer(value, key) : value; + } + + return target; + }, + enforceFastProperties: function enforceFastProperties(o) { + function Sub() {} + + Sub.prototype = o; + var receiver = new Sub(); + + function ic() { + return _typeof(receiver.foo); + } + + ic(); + ic(); + return o; + eval("o" + o); + } + }; + var objects_1 = objects; + + function evalModule(source, context) { + var argumentKeys = Object.keys(context); + var argumentValues = argumentKeys.map(function (argument) { + return context[argument]; + }); + var sandbox = { + exports: {} + }; + argumentKeys.push("module", "exports", source); + argumentValues.push(sandbox, sandbox.exports); + Function.apply(void 0, _toConsumableArray(argumentKeys)).apply(void 0, _toConsumableArray(argumentValues)); + return sandbox.exports; + } + + var vm = { + evalModule: evalModule + }; + + var util = createCommonjsModule(function (module, exports) { + + objects_1.extend(exports, arrays); + objects_1.extend(exports, js_1); + objects_1.extend(exports, objects_1); + objects_1.extend(exports, vm); + + exports.noop = function noop() {}; + + exports.convertPasses = function () { + function convertStage(passes) { + return Array.isArray(passes) ? passes : objects_1.values(passes); + } + + function convertPasses(stages) { + return objects_1.map(stages, convertStage); + } + + return convertPasses; + }(); + + exports.processOptions = function processOptions(options, defaults) { + var processedOptions = {}; + objects_1.extend(processedOptions, options); + objects_1.extend(processedOptions, defaults); + return processedOptions; + }; + }); + var util_1 = util.noop; + var util_2 = util.convertPasses; + var util_3 = util.processOptions; + + var ASTVisitor = function () { + function ASTVisitor() { + _classCallCheck(this, ASTVisitor); + } + + _createClass(ASTVisitor, [{ + key: "visit", + value: function visit(node) { + if (!node) throw new Error("Visitor function called with no arguments or a `falsy` node"); + var fn = this[node.type]; + if (!fn) throw new Error("Visitor function for node type \"".concat(node.type, "\" not defined")); + return fn.apply(this, arguments); + } + }]); + + return ASTVisitor; + }(); + + var visitor = { + ASTVisitor: ASTVisitor, + build: function build(functions) { + var visitor = new ASTVisitor(); + util.extend(visitor, functions); + visitor = util.enforceFastProperties(visitor); + return visitor.visit.bind(visitor); + } + }; + var on = ASTVisitor.on = { + property: function property(name) { + return function visitProperty(node) { + var value = node[name]; + + for (var _len = arguments.length, extraArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + extraArgs[_key - 1] = arguments[_key]; + } + + if (extraArgs.length) this.visit.apply(this, [value].concat(extraArgs));else this.visit(value); + }; + }, + children: function children(name) { + return function visitProperty(node) { + for (var _len2 = arguments.length, extraArgs = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + extraArgs[_key2 - 1] = arguments[_key2]; + } + + var children = node[name]; + var visitor = this; + var cb = extraArgs.length < 1 ? function withoutArgs(child) { + visitor.visit(child); + } : function withArgs(child) { + visitor.visit.apply(visitor, [child].concat(extraArgs)); + }; + children.forEach(cb); + }; + } + }; + var visitNop = util.noop; + var visitExpression = on.property("expression"); + var DEFAULT_FUNCTIONS = { + grammar: function grammar(node) { + var _this = this; + + for (var _len3 = arguments.length, extraArgs = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { + extraArgs[_key3 - 1] = arguments[_key3]; + } + + if (node.initializer) { + this.visit.apply(this, [node.initializer].concat(extraArgs)); + } + + node.rules.forEach(function (rule) { + _this.visit.apply(_this, [rule].concat(extraArgs)); + }); + }, + initializer: visitNop, + rule: visitExpression, + named: visitExpression, + choice: on.children("alternatives"), + action: visitExpression, + sequence: on.children("elements"), + labeled: visitExpression, + text: visitExpression, + simple_and: visitExpression, + simple_not: visitExpression, + optional: visitExpression, + zero_or_more: visitExpression, + one_or_more: visitExpression, + group: visitExpression, + semantic_and: visitNop, + semantic_not: visitNop, + rule_ref: visitNop, + literal: visitNop, + class: visitNop, + any: visitNop + }; + util.each(DEFAULT_FUNCTIONS, function (fn, name) { + ASTVisitor.prototype[name] = fn; + }); + + var Node = function Node(type, location) { + _classCallCheck(this, Node); + + this.type = type; + this.location = location; + }; + + var Node_1 = Node; + + var Grammar = function (_Node) { + _inherits(Grammar, _Node); + + function Grammar(initializer, rules, comments, location) { + var _this; + + _classCallCheck(this, Grammar); + + _this = _possibleConstructorReturn(this, _getPrototypeOf(Grammar).call(this, "grammar", location)); + _this.initializer = initializer; + _this.comments = comments; + _this.rules = rules; + _this._alwaysConsumesOnSuccess = new AlwaysConsumesOnSuccess(_assertThisInitialized(_assertThisInitialized(_this))); + return _this; + } + + _createClass(Grammar, [{ + key: "alwaysConsumesOnSuccess", + value: function alwaysConsumesOnSuccess(node) { + return this._alwaysConsumesOnSuccess.visit(node); + } + }, { + key: "findRule", + value: function findRule(name) { + return util.find(this.rules, function (rule) { + return rule.name === name; + }); + } + }, { + key: "indexOfRule", + value: function indexOfRule(name) { + return util.findIndex(this.rules, function (rule) { + return rule.name === name; + }); + } + }]); + + return Grammar; + }(Node_1); + + var Grammar_1 = Grammar; + + var AlwaysConsumesOnSuccess = function (_visitor$ASTVisitor) { + _inherits(AlwaysConsumesOnSuccess, _visitor$ASTVisitor); + + function AlwaysConsumesOnSuccess(ast) { + var _this2; + + _classCallCheck(this, AlwaysConsumesOnSuccess); + + _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AlwaysConsumesOnSuccess).call(this)); + _this2.ast = ast; + return _this2; + } + + _createClass(AlwaysConsumesOnSuccess, [{ + key: "choice", + value: function choice(node) { + return node.alternatives.every(this.visit, this); + } + }, { + key: "sequence", + value: function sequence(node) { + return node.elements.some(this.visit, this); + } + }, { + key: "rule_ref", + value: function rule_ref(node) { + return this.visit(this.ast.findRule(node.name)); + } + }, { + key: "literal", + value: function literal(node) { + return node.value !== ""; + } + }]); + + return AlwaysConsumesOnSuccess; + }(visitor.ASTVisitor); + + function consumesTrue() { + return true; + } + + function consumesFalse() { + return false; + } + + function consumesExpression(node) { + return this.visit(node.expression); + } + + util.extend(AlwaysConsumesOnSuccess.prototype, { + rule: consumesExpression, + named: consumesExpression, + action: consumesExpression, + labeled: consumesExpression, + text: consumesExpression, + simple_and: consumesFalse, + simple_not: consumesFalse, + optional: consumesFalse, + zero_or_more: consumesFalse, + one_or_more: consumesExpression, + group: consumesExpression, + semantic_and: consumesFalse, + semantic_not: consumesFalse, + class: consumesTrue, + any: consumesTrue + }); + + var visitor$1 = visitor; + var Node$1 = Node_1; + var Grammar$1 = Grammar_1; + var ast = { + visitor: visitor$1, + Node: Node$1, + Grammar: Grammar$1 + }; + + function calcReportFailures(ast, session, options) { + ast.rules.forEach(function (rule) { + rule.reportFailures = false; + }); + var changedRules = options.allowedStartRules.map(function (name) { + var rule = ast.findRule(name); + rule.reportFailures = true; + return rule; + }); + var calc = session.buildVisitor({ + rule: function rule(node) { + calc(node.expression); + }, + named: function named() {}, + rule_ref: function rule_ref(node) { + var rule = ast.findRule(node.name); + + if (!rule.reportFailures) { + rule.reportFailures = true; + changedRules.push(rule); + } + } + }); + + while (changedRules.length > 0) { + calc(changedRules.pop()); + } + } + + var calcReportFailures_1 = calcReportFailures; + + function generateBytecode(ast, session) { + var op = session.opcodes; + var literals = []; + var classes = []; + var expectations = []; + var functions = []; + var generate; + + function addLiteralConst(value) { + var index = literals.indexOf(value); + return index === -1 ? literals.push(value) - 1 : index; + } + + function addClassConst(node) { + var cls = { + value: node.parts, + inverted: node.inverted, + ignoreCase: node.ignoreCase + }; + var pattern = JSON.stringify(cls); + var index = util.findIndex(classes, function (c) { + return JSON.stringify(c) === pattern; + }); + return index === -1 ? classes.push(cls) - 1 : index; + } + + function addExpectedConst(expected) { + var pattern = JSON.stringify(expected); + var index = util.findIndex(expectations, function (e) { + return JSON.stringify(e) === pattern; + }); + return index === -1 ? expectations.push(expected) - 1 : index; + } + + function addFunctionConst(predicate, params, code) { + var func = { + predicate: predicate, + params: params, + body: code + }; + var pattern = JSON.stringify(func); + var index = util.findIndex(functions, function (f) { + return JSON.stringify(f) === pattern; + }); + return index === -1 ? functions.push(func) - 1 : index; + } + + var buildSequence = function buildSequence() { + var _ref; + + return (_ref = []).concat.apply(_ref, arguments); + }; + + function buildCondition(match, condCode, thenCode, elseCode) { + if (match > 0) return thenCode; + if (match < 0) return elseCode; + return condCode.concat([thenCode.length, elseCode.length], thenCode, elseCode); + } + + function buildLoop(condCode, bodyCode) { + return condCode.concat([bodyCode.length], bodyCode); + } + + function buildCall(functionIndex, delta, env, sp) { + var params = util.values(env, function (value) { + return sp - value; + }); + return [op.CALL, functionIndex, delta, params.length].concat(params); + } + + function buildSimplePredicate(expression, negative, context) { + var match = expression.match | 0; + return buildSequence([op.PUSH_CURR_POS], [op.EXPECT_NS_BEGIN], generate(expression, { + sp: context.sp + 1, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }), [op.EXPECT_NS_END, negative ? 1 : 0], buildCondition(negative ? -match : match, [negative ? op.IF_ERROR : op.IF_NOT_ERROR], buildSequence([op.POP], [negative ? op.POP : op.POP_CURR_POS], [op.PUSH_UNDEFINED]), buildSequence([op.POP], [negative ? op.POP_CURR_POS : op.POP], [op.PUSH_FAILED]))); + } + + function buildSemanticPredicate(node, negative, context) { + var functionIndex = addFunctionConst(true, Object.keys(context.env), node.code); + return buildSequence([op.UPDATE_SAVED_POS], buildCall(functionIndex, 0, context.env, context.sp), buildCondition(node.match | 0, [op.IF], buildSequence([op.POP], negative ? [op.PUSH_FAILED] : [op.PUSH_UNDEFINED]), buildSequence([op.POP], negative ? [op.PUSH_UNDEFINED] : [op.PUSH_FAILED]))); + } + + function buildAppendLoop(expressionCode) { + return buildLoop([op.WHILE_NOT_ERROR], buildSequence([op.APPEND], expressionCode)); + } + + generate = session.buildVisitor({ + grammar: function grammar(node) { + node.rules.forEach(generate); + node.literals = literals; + node.classes = classes; + node.expectations = expectations; + node.functions = functions; + }, + rule: function rule(node) { + node.bytecode = generate(node.expression, { + sp: -1, + env: {}, + action: null, + reportFailures: node.reportFailures + }); + }, + named: function named(node, context) { + var nameIndex = context.reportFailures ? addExpectedConst({ + type: "rule", + value: node.name + }) : null; + var expressionCode = generate(node.expression, { + sp: context.sp, + env: context.env, + action: context.action, + reportFailures: false + }); + return context.reportFailures ? buildSequence([op.EXPECT, nameIndex], [op.SILENT_FAILS_ON], expressionCode, [op.SILENT_FAILS_OFF]) : expressionCode; + }, + choice: function choice(node, context) { + function buildAlternativesCode(alternatives, context) { + return buildSequence(generate(alternatives[0], { + sp: context.sp, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }), alternatives.length < 2 ? [] : buildCondition(-(alternatives[0].match | 0), [op.IF_ERROR], buildSequence([op.POP], buildAlternativesCode(alternatives.slice(1), context)), [])); + } + + return buildAlternativesCode(node.alternatives, context); + }, + action: function action(node, context) { + var env = util.clone(context.env); + var emitCall = node.expression.type !== "sequence" || node.expression.elements.length === 0; + var expressionCode = generate(node.expression, { + sp: context.sp + (emitCall ? 1 : 0), + env: env, + action: node, + reportFailures: context.reportFailures + }); + var match = node.expression.match | 0; + var functionIndex = emitCall && match >= 0 ? addFunctionConst(false, Object.keys(env), node.code) : null; + return emitCall === false ? expressionCode : buildSequence([op.PUSH_CURR_POS], expressionCode, buildCondition(match, [op.IF_NOT_ERROR], buildSequence([op.LOAD_SAVED_POS, 1], buildCall(functionIndex, 1, env, context.sp + 2)), []), [op.NIP]); + }, + sequence: function sequence(node, context) { + var TOTAL_ELEMENTS = node.elements.length; + + function buildElementsCode(elements, context) { + if (elements.length > 0) { + var processedCount = TOTAL_ELEMENTS - elements.slice(1).length; + return buildSequence(generate(elements[0], { + sp: context.sp, + env: context.env, + pluck: context.pluck, + action: null, + reportFailures: context.reportFailures + }), buildCondition(elements[0].match | 0, [op.IF_NOT_ERROR], buildElementsCode(elements.slice(1), { + sp: context.sp + 1, + env: context.env, + pluck: context.pluck, + action: context.action, + reportFailures: context.reportFailures + }), buildSequence(processedCount > 1 ? [op.POP_N, processedCount] : [op.POP], [op.POP_CURR_POS], [op.PUSH_FAILED]))); + } + + if (context.pluck.length > 0) return buildSequence([op.PLUCK, TOTAL_ELEMENTS + 1, context.pluck.length], context.pluck.map(function (eSP) { + return context.sp - eSP; + })); + if (context.action) return buildSequence([op.LOAD_SAVED_POS, TOTAL_ELEMENTS], buildCall(addFunctionConst(false, Object.keys(context.env), context.action.code), TOTAL_ELEMENTS + 1, context.env, context.sp)); + return buildSequence([op.WRAP, TOTAL_ELEMENTS], [op.NIP]); + } + + return buildSequence([op.PUSH_CURR_POS], buildElementsCode(node.elements, { + sp: context.sp + 1, + env: context.env, + pluck: [], + action: context.action, + reportFailures: context.reportFailures + })); + }, + labeled: function labeled(node, context) { + var env = context.env; + var label = node.label; + var sp = context.sp + 1; + + if (label !== null) { + env = util.clone(context.env); + context.env[label] = sp; + } + + if (context.pluck && node.pick) context.pluck.push(sp); + return generate(node.expression, { + sp: context.sp, + env: env, + action: null, + reportFailures: context.reportFailures + }); + }, + text: function text(node, context) { + return buildSequence([op.PUSH_CURR_POS], generate(node.expression, { + sp: context.sp + 1, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }), buildCondition(node.expression.match | 0, [op.IF_NOT_ERROR], buildSequence([op.POP], [op.TEXT]), [op.NIP])); + }, + simple_and: function simple_and(node, context) { + return buildSimplePredicate(node.expression, false, context); + }, + simple_not: function simple_not(node, context) { + return buildSimplePredicate(node.expression, true, context); + }, + optional: function optional(node, context) { + return buildSequence(generate(node.expression, { + sp: context.sp, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }), buildCondition(-(node.expression.match | 0), [op.IF_ERROR], buildSequence([op.POP], [op.PUSH_NULL]), [])); + }, + zero_or_more: function zero_or_more(node, context) { + var expressionCode = generate(node.expression, { + sp: context.sp + 1, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }); + return buildSequence([op.PUSH_EMPTY_ARRAY], expressionCode, buildAppendLoop(expressionCode), [op.POP]); + }, + one_or_more: function one_or_more(node, context) { + var expressionCode = generate(node.expression, { + sp: context.sp + 1, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }); + return buildSequence([op.PUSH_EMPTY_ARRAY], expressionCode, buildCondition(node.expression.match | 0, [op.IF_NOT_ERROR], buildSequence(buildAppendLoop(expressionCode), [op.POP]), buildSequence([op.POP], [op.POP], [op.PUSH_FAILED]))); + }, + group: function group(node, context) { + return generate(node.expression, { + sp: context.sp, + env: util.clone(context.env), + action: null, + reportFailures: context.reportFailures + }); + }, + semantic_and: function semantic_and(node, context) { + return buildSemanticPredicate(node, false, context); + }, + semantic_not: function semantic_not(node, context) { + return buildSemanticPredicate(node, true, context); + }, + rule_ref: function rule_ref(node) { + return [op.RULE, ast.indexOfRule(node.name)]; + }, + literal: function literal(node, context) { + if (node.value.length > 0) { + var match = node.match | 0; + var needConst = match === 0 || match > 0 && !node.ignoreCase; + var stringIndex = needConst ? addLiteralConst(node.ignoreCase ? node.value.toLowerCase() : node.value) : null; + var expectedIndex = context.reportFailures ? addExpectedConst({ + type: "literal", + value: node.value, + ignoreCase: node.ignoreCase + }) : null; + return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(match, node.ignoreCase ? [op.MATCH_STRING_IC, stringIndex] : [op.MATCH_STRING, stringIndex], node.ignoreCase ? [op.ACCEPT_N, node.value.length] : [op.ACCEPT_STRING, stringIndex], [op.PUSH_FAILED])); + } + + return [op.PUSH_EMPTY_STRING]; + }, + class: function _class(node, context) { + var match = node.match | 0; + var classIndex = match === 0 ? addClassConst(node) : null; + var expectedIndex = context.reportFailures ? addExpectedConst({ + type: "class", + value: node.parts, + inverted: node.inverted, + ignoreCase: node.ignoreCase + }) : null; + return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(match, [op.MATCH_CLASS, classIndex], [op.ACCEPT_N, 1], [op.PUSH_FAILED])); + }, + any: function any(node, context) { + var expectedIndex = context.reportFailures ? addExpectedConst({ + type: "any" + }) : null; + return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(node.match | 0, [op.MATCH_ANY], [op.ACCEPT_N, 1], [op.PUSH_FAILED])); + } + }); + generate(ast); + } + + var generateBytecode_1 = generateBytecode; + + var _package = { + name: "pegjs", + version: "0.11.0-dev", + description: "Parser generator for JavaScript", + keywords: [ + "PEG.js", + "pegjs", + "grammar", + "parser", + "generator", + "language", + "PEG" + ], + homepage: "https://pegjs.org/", + repository: "pegjs/pegjs", + license: "MIT", + contributors: [ + "David Majda (https://majda.cz/)", + "Futago-za Ryuu " + ], + types: "typings/pegjs.d.ts", + main: "lib/peg.js", + bin: "bin/peg.js", + engines: { + node: ">= 6" + } + }; + + var _package$1 = /*#__PURE__*/Object.freeze({ + default: _package + }); + + var require$$0 = getCjsExportFromNamespace(_package$1); + + var VERSION = require$$0.version; + + function generateJS(ast, session, options) { + var op = session.opcodes; + var features = options.features || {}; + + function use(feature, use) { + return feature in features ? !!features[feature] : use == null ? true : !!use; + } + + var lineMatchRE = /^([^`\r\n]+?(?:`[^`]*?`[^\r\n]*?)?)$/gm; + + function indent2(code) { + return code.replace(lineMatchRE, " $1"); + } + + function indent10(code) { + return code.replace(lineMatchRE, " $1"); + } + + var l = function l(i) { + return "peg$c" + i; + }; + + var r = function r(i) { + return "peg$r" + i; + }; + + var e = function e(i) { + return "peg$e" + i; + }; + + var f = function f(i) { + return "peg$f" + i; + }; + + function generateTables() { + function buildLiteral(literal) { + return "\"".concat(util.stringEscape(literal), "\""); + } + + function buildRegexp(cls) { + return "/^[" + (cls.inverted ? "^" : "") + cls.value.map(function (part) { + return Array.isArray(part) ? util.regexpEscape(part[0]) + "-" + util.regexpEscape(part[1]) : util.regexpEscape(part); + }).join("") + "]/" + (cls.ignoreCase ? "i" : ""); + } + + function buildExpectation(e) { + switch (e.type) { + case "rule": + return "peg$otherExpectation(\"".concat(util.stringEscape(e.value), "\")"); + + case "literal": + return "peg$literalExpectation(\"" + util.stringEscape(e.value) + "\", " + e.ignoreCase + ")"; + + case "class": + { + var parts = e.value.map(function (part) { + return Array.isArray(part) ? "[\"".concat(util.stringEscape(part[0]), "\", \"").concat(util.stringEscape(part[1]), "\"]") : "\"".concat(util.stringEscape(part), "\""); + }); + return "peg$classExpectation([" + parts.join(", ") + "], " + e.inverted + ", " + e.ignoreCase + ")"; + } + + case "any": + return "peg$anyExpectation()"; + + default: + session.fatal("Unknown expectation type (".concat(JSON.stringify(e), ")")); + } + } + + function buildFunc(f) { + return "function(".concat(f.params.join(", "), ") {").concat(f.body, "}"); + } + + if (options.optimize === "size") { + return ["var peg$literals = [", indent2(ast.literals.map(buildLiteral).join(",\n")), "];", "var peg$regexps = [", indent2(ast.classes.map(buildRegexp).join(",\n")), "];", "var peg$expectations = [", indent2(ast.expectations.map(buildExpectation).join(",\n")), "];", "var peg$functions = [", indent2(ast.functions.map(buildFunc).join(",\n")), "];", "", "var peg$bytecode = [", indent2(ast.rules.map(function (rule) { + return "peg$decode(\"".concat(util.stringEscape(rule.bytecode.map(function (b) { + return String.fromCharCode(b + 32); + }).join("")), "\")"); + }).join(",\n")), "];"].join("\n"); + } + + return ast.literals.map(function (c, i) { + return "var " + l(i) + " = " + buildLiteral(c) + ";"; + }).concat("", ast.classes.map(function (c, i) { + return "var " + r(i) + " = " + buildRegexp(c) + ";"; + })).concat("", ast.expectations.map(function (c, i) { + return "var " + e(i) + " = " + buildExpectation(c) + ";"; + })).concat("", ast.functions.map(function (c, i) { + return "var " + f(i) + " = " + buildFunc(c) + ";"; + })).join("\n"); + } + + function generateRuleHeader(ruleNameCode, ruleIndexCode) { + var parts = []; + parts.push(["", "var rule$expects = function (expected) {", " if (peg$silentFails === 0) peg$expect(expected);", "}", ""].join("\n")); + + if (options.trace) { + parts.push(["peg$tracer.trace({", " type: \"rule.enter\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", "});", ""].join("\n")); + } + + if (options.cache) { + parts.push(["var key = peg$currPos * " + ast.rules.length + " + " + ruleIndexCode + ";", "var cached = peg$resultsCache[key];", "var rule$expectations = [];", "", "rule$expects = function (expected) {", " if (peg$silentFails === 0) peg$expect(expected);", " rule$expectations.push(expected);", "}", "", "if (cached) {", " peg$currPos = cached.nextPos;", "", " rule$expectations = cached.expectations;", " if (peg$silentFails === 0) {", " rule$expectations.forEach(peg$expect);", " }", ""].join("\n")); + + if (options.trace) { + parts.push(["if (cached.result !== peg$FAILED) {", " peg$tracer.trace({", " type: \"rule.match\",", " rule: " + ruleNameCode + ",", " result: cached.result,", " location: peg$computeLocation(startPos, peg$currPos)", " });", "} else {", " peg$tracer.trace({", " type: \"rule.fail\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", " });", "}", ""].join("\n")); + } + + parts.push([" return cached.result;", "}", ""].join("\n")); + } + + return parts.join("\n"); + } + + function generateRuleFooter(ruleNameCode, resultCode) { + var parts = []; + + if (options.cache) { + parts.push(["", "peg$resultsCache[key] = {", " nextPos: peg$currPos,", " result: " + resultCode + ",", " expectations: rule$expectations", "};"].join("\n")); + } + + if (options.trace) { + parts.push(["", "if (" + resultCode + " !== peg$FAILED) {", " peg$tracer.trace({", " type: \"rule.match\",", " rule: " + ruleNameCode + ",", " result: " + resultCode + ",", " location: peg$computeLocation(startPos, peg$currPos)", " });", "} else {", " peg$tracer.trace({", " type: \"rule.fail\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", " });", "}"].join("\n")); + } + + parts.push(["", "return " + resultCode + ";"].join("\n")); + return parts.join("\n"); + } + + function generateInterpreter() { + var parts = []; + + function generateCondition(cond, argsLength) { + var baseLength = argsLength + 3; + var thenLengthCode = "bc[ip + " + (baseLength - 2) + "]"; + var elseLengthCode = "bc[ip + " + (baseLength - 1) + "]"; + return ["ends.push(end);", "ips.push(ip + " + baseLength + " + " + thenLengthCode + " + " + elseLengthCode + ");", "", "if (" + cond + ") {", " end = ip + " + baseLength + " + " + thenLengthCode + ";", " ip += " + baseLength + ";", "} else {", " end = ip + " + baseLength + " + " + thenLengthCode + " + " + elseLengthCode + ";", " ip += " + baseLength + " + " + thenLengthCode + ";", "}", "", "break;"].join("\n"); + } + + function generateLoop(cond) { + var baseLength = 2; + var bodyLengthCode = "bc[ip + " + (baseLength - 1) + "]"; + return ["if (" + cond + ") {", " ends.push(end);", " ips.push(ip);", "", " end = ip + " + baseLength + " + " + bodyLengthCode + ";", " ip += " + baseLength + ";", "} else {", " ip += " + baseLength + " + " + bodyLengthCode + ";", "}", "", "break;"].join("\n"); + } + + function generateCall() { + var baseLength = 4; + var paramsLengthCode = "bc[ip + " + (baseLength - 1) + "]"; + return ["params = bc.slice(ip + " + baseLength + ", ip + " + baseLength + " + " + paramsLengthCode + ")", " .map(function(p) { return stack[stack.length - 1 - p]; });", "", "stack.splice(", " stack.length - bc[ip + 2],", " bc[ip + 2],", " peg$functions[bc[ip + 1]].apply(null, params)", ");", "", "ip += " + baseLength + " + " + paramsLengthCode + ";", "break;"].join("\n"); + } + + parts.push(["function peg$decode(s) {", " return s.split(\"\").map(function(ch) { return ch.charCodeAt(0) - 32; });", "}", "", "function peg$parseRule(index) {"].join("\n")); + + if (options.trace) { + parts.push([" var bc = peg$bytecode[index];", " var ip = 0;", " var ips = [];", " var end = bc.length;", " var ends = [];", " var stack = [];", " var startPos = peg$currPos;", " var params, paramsLength, paramsN;"].join("\n")); + } else { + parts.push([" var bc = peg$bytecode[index];", " var ip = 0;", " var ips = [];", " var end = bc.length;", " var ends = [];", " var stack = [];", " var params, paramsLength, paramsN;"].join("\n")); + } + + parts.push(indent2(generateRuleHeader("peg$ruleNames[index]", "index"))); + parts.push([" while (true) {", " while (ip < end) {", " switch (bc[ip]) {", " case " + op.PUSH_EMPTY_STRING + ":", " stack.push('');", " ip++;", " break;", "", " case " + op.PUSH_UNDEFINED + ":", " stack.push(undefined);", " ip++;", " break;", "", " case " + op.PUSH_NULL + ":", " stack.push(null);", " ip++;", " break;", "", " case " + op.PUSH_FAILED + ":", " stack.push(peg$FAILED);", " ip++;", " break;", "", " case " + op.PUSH_EMPTY_ARRAY + ":", " stack.push([]);", " ip++;", " break;", "", " case " + op.PUSH_CURR_POS + ":", " stack.push(peg$currPos);", " ip++;", " break;", "", " case " + op.POP + ":", " stack.pop();", " ip++;", " break;", "", " case " + op.POP_CURR_POS + ":", " peg$currPos = stack.pop();", " ip++;", " break;", "", " case " + op.POP_N + ":", " stack.length -= bc[ip + 1];", " ip += 2;", " break;", "", " case " + op.NIP + ":", " stack.splice(-2, 1);", " ip++;", " break;", "", " case " + op.APPEND + ":", " stack[stack.length - 2].push(stack.pop());", " ip++;", " break;", "", " case " + op.WRAP + ":", " stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1]));", " ip += 2;", " break;", "", " case " + op.TEXT + ":", " stack.push(input.substring(stack.pop(), peg$currPos));", " ip++;", " break;", "", " case " + op.PLUCK + ":", " paramsLength = bc[ip + 2];", " paramsN = 3 + paramsLength", "", " params = bc.slice(ip + 3, ip + paramsN);", " params = paramsLength === 1", " ? stack[stack.length - 1 - params[ 0 ]]", " : params.map(function(p) { return stack[stack.length - 1 - p]; });", "", " stack.splice(", " stack.length - bc[ip + 1],", " bc[ip + 1],", " params", " );", "", " ip += paramsN;", " break;", "", " case " + op.IF + ":", indent10(generateCondition("stack[stack.length - 1]", 0)), "", " case " + op.IF_ERROR + ":", indent10(generateCondition("stack[stack.length - 1] === peg$FAILED", 0)), "", " case " + op.IF_NOT_ERROR + ":", indent10(generateCondition("stack[stack.length - 1] !== peg$FAILED", 0)), "", " case " + op.WHILE_NOT_ERROR + ":", indent10(generateLoop("stack[stack.length - 1] !== peg$FAILED")), "", " case " + op.MATCH_ANY + ":", indent10(generateCondition("input.length > peg$currPos", 0)), "", " case " + op.MATCH_STRING + ":", indent10(generateCondition("input.substr(peg$currPos, peg$literals[bc[ip + 1]].length) === peg$literals[bc[ip + 1]]", 1)), "", " case " + op.MATCH_STRING_IC + ":", indent10(generateCondition("input.substr(peg$currPos, peg$literals[bc[ip + 1]].length).toLowerCase() === peg$literals[bc[ip + 1]]", 1)), "", " case " + op.MATCH_CLASS + ":", indent10(generateCondition("peg$regexps[bc[ip + 1]].test(input.charAt(peg$currPos))", 1)), "", " case " + op.ACCEPT_N + ":", " stack.push(input.substr(peg$currPos, bc[ip + 1]));", " peg$currPos += bc[ip + 1];", " ip += 2;", " break;", "", " case " + op.ACCEPT_STRING + ":", " stack.push(peg$literals[bc[ip + 1]]);", " peg$currPos += peg$literals[bc[ip + 1]].length;", " ip += 2;", " break;", "", " case " + op.EXPECT + ":", " rule$expects(peg$expectations[bc[ip + 1]]);", " ip += 2;", " break;", "", " case " + op.LOAD_SAVED_POS + ":", " peg$savedPos = stack[stack.length - 1 - bc[ip + 1]];", " ip += 2;", " break;", "", " case " + op.UPDATE_SAVED_POS + ":", " peg$savedPos = peg$currPos;", " ip++;", " break;", "", " case " + op.CALL + ":", indent10(generateCall()), "", " case " + op.RULE + ":", " stack.push(peg$parseRule(bc[ip + 1]));", " ip += 2;", " break;", "", " case " + op.SILENT_FAILS_ON + ":", " peg$silentFails++;", " ip++;", " break;", "", " case " + op.SILENT_FAILS_OFF + ":", " peg$silentFails--;", " ip++;", " break;", "", " case " + op.EXPECT_NS_BEGIN + ":", " peg$begin();", " ip++;", " break;", "", " case " + op.EXPECT_NS_END + ":", " peg$end(bc[ip + 1]);", " ip += 2;", " break;", "", " // istanbul ignore next", " default:", " throw new Error(", " \"Rule #\" + index + \"" + (options.trace ? " ('\" + peg$ruleNames[ index ] + \"')" : "") + ", position \" + ip + \": \"", " + \"Invalid opcode \" + bc[ip] + \".\"", " );", " }", " }", "", " if (ends.length > 0) {", " end = ends.pop();", " ip = ips.pop();", " } else {", " break;", " }", " }"].join("\n")); + parts.push(indent2(generateRuleFooter("peg$ruleNames[index]", "stack[0]"))); + parts.push("}"); + return parts.join("\n"); + } + + function generateRuleFunction(rule) { + var parts = []; + var stackVars = []; + + function s(i) { + if (i < 0) session.fatal("Rule '" + rule.name + "': Var stack underflow: attempt to use var at index " + i); + return "s" + i; + } + + var stack = { + sp: -1, + maxSp: -1, + push: function push(exprCode) { + var code = s(++this.sp) + " = " + exprCode + ";"; + if (this.sp > this.maxSp) this.maxSp = this.sp; + return code; + }, + pop: function pop(n) { + if (typeof n === "undefined") return s(this.sp--); + var values = Array(n); + + for (var i = 0; i < n; i++) { + values[i] = s(this.sp - n + 1 + i); + } + + this.sp -= n; + return values; + }, + top: function top() { + return s(this.sp); + }, + index: function index(i) { + return s(this.sp - i); + } + }; + + function compile(bc) { + var ip = 0; + var end = bc.length; + var parts = []; + var value; + + function compileCondition(cond, argCount) { + var pos = ip; + var baseLength = argCount + 3; + var thenLength = bc[ip + baseLength - 2]; + var elseLength = bc[ip + baseLength - 1]; + var baseSp = stack.sp; + var thenCode, elseCode, thenSp, elseSp; + ip += baseLength; + thenCode = compile(bc.slice(ip, ip + thenLength)); + thenSp = stack.sp; + ip += thenLength; + + if (elseLength > 0) { + stack.sp = baseSp; + elseCode = compile(bc.slice(ip, ip + elseLength)); + elseSp = stack.sp; + ip += elseLength; + + if (thenSp !== elseSp) { + session.fatal("Rule '" + rule.name + "', position " + pos + ": " + "Branches of a condition can't move the stack pointer differently " + "(before: " + baseSp + ", after then: " + thenSp + ", after else: " + elseSp + ")."); + } + } + + parts.push("if (" + cond + ") {"); + parts.push(indent2(thenCode)); + + if (elseLength > 0) { + parts.push("} else {"); + parts.push(indent2(elseCode)); + } + + parts.push("}"); + } + + function compileLoop(cond) { + var pos = ip; + var baseLength = 2; + var bodyLength = bc[ip + baseLength - 1]; + var baseSp = stack.sp; + var bodyCode, bodySp; + ip += baseLength; + bodyCode = compile(bc.slice(ip, ip + bodyLength)); + bodySp = stack.sp; + ip += bodyLength; + + if (bodySp !== baseSp) { + session.fatal("Rule '" + rule.name + "', position " + pos + ": " + "Body of a loop can't move the stack pointer " + "(before: " + baseSp + ", after: " + bodySp + ")."); + } + + parts.push("while (" + cond + ") {"); + parts.push(indent2(bodyCode)); + parts.push("}"); + } + + function compileCall() { + var baseLength = 4; + var paramsLength = bc[ip + baseLength - 1]; + var value = f(bc[ip + 1]) + "(" + bc.slice(ip + baseLength, ip + baseLength + paramsLength).map(function (p) { + return stack.index(p); + }).join(", ") + ")"; + stack.pop(bc[ip + 2]); + parts.push(stack.push(value)); + ip += baseLength + paramsLength; + } + + while (ip < end) { + switch (bc[ip]) { + case op.PUSH_EMPTY_STRING: + parts.push(stack.push("''")); + ip++; + break; + + case op.PUSH_CURR_POS: + parts.push(stack.push("peg$currPos")); + ip++; + break; + + case op.PUSH_UNDEFINED: + parts.push(stack.push("undefined")); + ip++; + break; + + case op.PUSH_NULL: + parts.push(stack.push("null")); + ip++; + break; + + case op.PUSH_FAILED: + parts.push(stack.push("peg$FAILED")); + ip++; + break; + + case op.PUSH_EMPTY_ARRAY: + parts.push(stack.push("[]")); + ip++; + break; + + case op.POP: + stack.pop(); + ip++; + break; + + case op.POP_CURR_POS: + parts.push("peg$currPos = " + stack.pop() + ";"); + ip++; + break; + + case op.POP_N: + stack.pop(bc[ip + 1]); + ip += 2; + break; + + case op.NIP: + value = stack.pop(); + stack.pop(); + parts.push(stack.push(value)); + ip++; + break; + + case op.APPEND: + value = stack.pop(); + parts.push(stack.top() + ".push(" + value + ");"); + ip++; + break; + + case op.WRAP: + parts.push(stack.push("[" + stack.pop(bc[ip + 1]).join(", ") + "]")); + ip += 2; + break; + + case op.TEXT: + parts.push(stack.push("input.substring(" + stack.pop() + ", peg$currPos)")); + ip++; + break; + + case op.PLUCK: + var baseLength = 3; + var paramsLength = bc[ip + baseLength - 1]; + var n = baseLength + paramsLength; + value = bc.slice(ip + baseLength, ip + n); + value = paramsLength === 1 ? stack.index(value[0]) : "[ ".concat(value.map(function (p) { + return stack.index(p); + }).join(", "), " ]"); + stack.pop(bc[ip + 1]); + parts.push(stack.push(value)); + ip += n; + break; + + case op.IF: + compileCondition(stack.top(), 0); + break; + + case op.IF_ERROR: + compileCondition(stack.top() + " === peg$FAILED", 0); + break; + + case op.IF_NOT_ERROR: + compileCondition(stack.top() + " !== peg$FAILED", 0); + break; + + case op.WHILE_NOT_ERROR: + compileLoop(stack.top() + " !== peg$FAILED", 0); + break; + + case op.MATCH_ANY: + compileCondition("input.length > peg$currPos", 0); + break; + + case op.MATCH_STRING: + compileCondition(ast.literals[bc[ip + 1]].length > 1 ? "input.substr(peg$currPos, " + ast.literals[bc[ip + 1]].length + ") === " + l(bc[ip + 1]) : "input.charCodeAt(peg$currPos) === " + ast.literals[bc[ip + 1]].charCodeAt(0), 1); + break; + + case op.MATCH_STRING_IC: + compileCondition("input.substr(peg$currPos, " + ast.literals[bc[ip + 1]].length + ").toLowerCase() === " + l(bc[ip + 1]), 1); + break; + + case op.MATCH_CLASS: + compileCondition(r(bc[ip + 1]) + ".test(input.charAt(peg$currPos))", 1); + break; + + case op.ACCEPT_N: + parts.push(stack.push(bc[ip + 1] > 1 ? "input.substr(peg$currPos, " + bc[ip + 1] + ")" : "input.charAt(peg$currPos)")); + parts.push(bc[ip + 1] > 1 ? "peg$currPos += " + bc[ip + 1] + ";" : "peg$currPos++;"); + ip += 2; + break; + + case op.ACCEPT_STRING: + parts.push(stack.push(l(bc[ip + 1]))); + parts.push(ast.literals[bc[ip + 1]].length > 1 ? "peg$currPos += " + ast.literals[bc[ip + 1]].length + ";" : "peg$currPos++;"); + ip += 2; + break; + + case op.EXPECT: + parts.push("rule$expects(" + e(bc[ip + 1]) + ");"); + ip += 2; + break; + + case op.LOAD_SAVED_POS: + parts.push("peg$savedPos = " + stack.index(bc[ip + 1]) + ";"); + ip += 2; + break; + + case op.UPDATE_SAVED_POS: + parts.push("peg$savedPos = peg$currPos;"); + ip++; + break; + + case op.CALL: + compileCall(); + break; + + case op.RULE: + parts.push(stack.push("peg$parse" + ast.rules[bc[ip + 1]].name + "()")); + ip += 2; + break; + + case op.SILENT_FAILS_ON: + parts.push("peg$silentFails++;"); + ip++; + break; + + case op.SILENT_FAILS_OFF: + parts.push("peg$silentFails--;"); + ip++; + break; + + case op.EXPECT_NS_BEGIN: + parts.push("peg$begin();"); + ip++; + break; + + case op.EXPECT_NS_END: + parts.push("peg$end(" + (bc[ip + 1] !== 0) + ");"); + ip += 2; + break; + + default: + session.fatal("Rule '" + rule.name + "', position " + ip + ": " + "Invalid opcode " + bc[ip] + "."); + } + } + + return parts.join("\n"); + } + + var code = compile(rule.bytecode); + parts.push("function peg$parse" + rule.name + "() {"); + + if (options.trace) { + parts.push(" var startPos = peg$currPos;"); + } + + for (var i = 0; i <= stack.maxSp; i++) { + stackVars[i] = s(i); + } + + parts.push(" var " + stackVars.join(", ") + ";"); + parts.push(indent2(generateRuleHeader("\"" + util.stringEscape(rule.name) + "\"", ast.indexOfRule(rule.name)))); + parts.push(indent2(code)); + parts.push(indent2(generateRuleFooter("\"" + util.stringEscape(rule.name) + "\"", s(0)))); + parts.push("}"); + return parts.join("\n"); + } + + function generateToplevel() { + var parts = []; + parts.push(["function peg$subclass(child, parent) {", " function C() { this.constructor = child; }", " C.prototype = parent.prototype;", " child.prototype = new C();", "}", "", "function peg$SyntaxError(message, expected, found, location) {", " this.message = message;", " this.expected = expected;", " this.found = found;", " this.location = location;", " this.name = \"SyntaxError\";", "", " // istanbul ignore next", " if (typeof Error.captureStackTrace === \"function\") {", " Error.captureStackTrace(this, peg$SyntaxError);", " }", "}", "", "peg$subclass(peg$SyntaxError, Error);", "", "peg$SyntaxError.buildMessage = function(expected, found) {", " var DESCRIBE_EXPECTATION_FNS = {", " literal: function(expectation) {", " return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";", " },", "", " class: function(expectation) {", " var escapedParts = expectation.parts.map(function(part) {", " return Array.isArray(part)", " ? classEscape(part[0]) + \"-\" + classEscape(part[1])", " : classEscape(part);", " });", "", " return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";", " },", "", " any: function() {", " return \"any character\";", " },", "", " end: function() {", " return \"end of input\";", " },", "", " other: function(expectation) {", " return expectation.description;", " },", "", " not: function(expectation) {", " return \"not \" + describeExpectation(expectation.expected);", " }", " };", "", " function hex(ch) {", " return ch.charCodeAt(0).toString(16).toUpperCase();", " }", "", " function literalEscape(s) {", " return s", " .replace(/\\\\/g, \"\\\\\\\\\")", " .replace(/\"/g, \"\\\\\\\"\")", " .replace(/\\0/g, \"\\\\0\")", " .replace(/\\t/g, \"\\\\t\")", " .replace(/\\n/g, \"\\\\n\")", " .replace(/\\r/g, \"\\\\r\")", " .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })", " .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });", " }", "", " function classEscape(s) {", " return s", " .replace(/\\\\/g, \"\\\\\\\\\")", " .replace(/\\]/g, \"\\\\]\")", " .replace(/\\^/g, \"\\\\^\")", " .replace(/-/g, \"\\\\-\")", " .replace(/\\0/g, \"\\\\0\")", " .replace(/\\t/g, \"\\\\t\")", " .replace(/\\n/g, \"\\\\n\")", " .replace(/\\r/g, \"\\\\r\")", " .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })", " .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });", " }", "", " function describeExpectation(expectation) {", " return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);", " }", "", " function describeExpected(expected) {", " var descriptions = expected.map(describeExpectation);", " var i, j;", "", " descriptions.sort();", "", " if (descriptions.length > 0) {", " for (i = 1, j = 1; i < descriptions.length; i++) {", " if (descriptions[i - 1] !== descriptions[i]) {", " descriptions[j] = descriptions[i];", " j++;", " }", " }", " descriptions.length = j;", " }", "", " switch (descriptions.length) {", " case 1:", " return descriptions[0];", "", " case 2:", " return descriptions[0] + \" or \" + descriptions[1];", "", " default:", " return descriptions.slice(0, -1).join(\", \")", " + \", or \"", " + descriptions[descriptions.length - 1];", " }", " }", "", " function describeFound(found) {", " return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";", " }", "", " return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";", "};", ""].join("\n")); + + if (options.trace) { + if (use("DefaultTracer")) parts.push(["function peg$DefaultTracer() {", " this.indentLevel = 0;", "}", "", "peg$DefaultTracer.prototype.trace = function(event) {", " var that = this;", "", " function log(event) {", " function repeat(string, n) {", " var result = \"\", i;", "", " for (i = 0; i < n; i++) {", " result += string;", " }", "", " return result;", " }", "", " function pad(string, length) {", " return string + repeat(\" \", length - string.length);", " }", "", " if (typeof console === \"object\") {", " console.log(", " event.location.start.line + \":\" + event.location.start.column + \"-\"", " + event.location.end.line + \":\" + event.location.end.column + \" \"", " + pad(event.type, 10) + \" \"", " + repeat(\" \", that.indentLevel) + event.rule", " );", " }", " }", "", " switch (event.type) {", " case \"rule.enter\":", " log(event);", " this.indentLevel++;", " break;", "", " case \"rule.match\":", " this.indentLevel--;", " log(event);", " break;", "", " case \"rule.fail\":", " this.indentLevel--;", " log(event);", " break;", "", " // istanbul ignore next", " default:", " throw new Error(\"Invalid event type: \" + event.type + \".\");", " }", "};", ""].join("\n"));else parts.push(["var peg$FauxTracer = {", " trace: function(event) { }", "};", ""].join("\n")); + } + + parts.push(["function peg$parse(input, options) {", " options = options !== undefined ? options : {};", "", " var peg$FAILED = {};", ""].join("\n")); + + if (options.optimize === "size") { + var startRuleIndices = "{ " + options.allowedStartRules.map(function (r) { + return r + ": " + ast.indexOfRule(r); + }).join(", ") + " }"; + var startRuleIndex = ast.indexOfRule(options.allowedStartRules[0]); + parts.push([" var peg$startRuleIndices = " + startRuleIndices + ";", " var peg$startRuleIndex = " + startRuleIndex + ";"].join("\n")); + } else { + var startRuleFunctions = "{ " + options.allowedStartRules.map(function (r) { + return r + ": peg$parse" + r; + }).join(", ") + " }"; + var startRuleFunction = "peg$parse" + options.allowedStartRules[0]; + parts.push([" var peg$startRuleFunctions = " + startRuleFunctions + ";", " var peg$startRuleFunction = " + startRuleFunction + ";"].join("\n")); + } + + parts.push(""); + parts.push(indent2(generateTables())); + parts.push(["", " var peg$currPos = 0;", " var peg$savedPos = 0;", " var peg$posDetailsCache = [{ line: 1, column: 1 }];", " var peg$expected = [];", " var peg$silentFails = 0;", ""].join("\n")); + + if (options.cache) { + parts.push([" var peg$resultsCache = {};", ""].join("\n")); + } + + if (options.trace) { + if (options.optimize === "size") { + var ruleNames = "[" + ast.rules.map(function (r) { + return "\"".concat(util.stringEscape(r.name), "\""); + }).join(", ") + "]"; + parts.push([" var peg$ruleNames = " + ruleNames + ";", ""].join("\n")); + } + + if (use("DefaultTracer")) parts.push([" var peg$tracer = \"tracer\" in options ? options.tracer : new peg$DefaultTracer();", ""].join("\n"));else parts.push([" var peg$tracer = \"tracer\" in options ? options.tracer : peg$FauxTracer;", ""].join("\n")); + } + + parts.push([" var peg$result;", ""].join("\n")); + + if (options.optimize === "size") { + parts.push([" if (\"startRule\" in options) {", " if (!(options.startRule in peg$startRuleIndices)) {", " throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");", " }", "", " peg$startRuleIndex = peg$startRuleIndices[options.startRule];", " }"].join("\n")); + } else { + parts.push([" if (\"startRule\" in options) {", " if (!(options.startRule in peg$startRuleFunctions)) {", " throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");", " }", "", " peg$startRuleFunction = peg$startRuleFunctions[options.startRule];", " }"].join("\n")); + } + + if (use("text")) { + parts.push(["", " function text() {", " return input.substring(peg$savedPos, peg$currPos);", " }"].join("\n")); + } + + if (use("offset")) { + parts.push(["", " function offset() {", " return peg$savedPos;", " }"].join("\n")); + } + + if (use("range")) { + parts.push(["", " function range() {", " return [peg$savedPos, peg$currPos];", " }"].join("\n")); + } + + if (use("location")) { + parts.push(["", " function location() {", " return peg$computeLocation(peg$savedPos, peg$currPos);", " }"].join("\n")); + } + + if (use("expected")) { + parts.push(["", " function expected(description, location) {", " location = location !== undefined", " ? location", " : peg$computeLocation(peg$savedPos, peg$currPos);", "", " throw peg$buildStructuredError(", " [peg$otherExpectation(description)],", " input.substring(peg$savedPos, peg$currPos),", " location", " );", " }"].join("\n")); + } + + if (use("error")) { + parts.push(["", " function error(message, location) {", " location = location !== undefined", " ? location", " : peg$computeLocation(peg$savedPos, peg$currPos);", "", " throw peg$buildSimpleError(message, location);", " }"].join("\n")); + } + + parts.push(["", " function peg$literalExpectation(text, ignoreCase) {", " return { type: \"literal\", text: text, ignoreCase: ignoreCase };", " }", "", " function peg$classExpectation(parts, inverted, ignoreCase) {", " return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };", " }", "", " function peg$anyExpectation() {", " return { type: \"any\" };", " }", "", " function peg$endExpectation() {", " return { type: \"end\" };", " }", "", " function peg$otherExpectation(description) {", " return { type: \"other\", description: description };", " }", "", " function peg$computePosDetails(pos) {", " var details = peg$posDetailsCache[pos];", " var p;", "", " if (details) {", " return details;", " } else {", " p = pos - 1;", " while (!peg$posDetailsCache[p]) {", " p--;", " }", "", " details = peg$posDetailsCache[p];", " details = {", " line: details.line,", " column: details.column", " };", "", " while (p < pos) {", " if (input.charCodeAt(p) === 10) {", " details.line++;", " details.column = 1;", " } else {", " details.column++;", " }", "", " p++;", " }", "", " peg$posDetailsCache[pos] = details;", "", " return details;", " }", " }", "", use("filename") ? " var peg$VALIDFILENAME = typeof options.filename === \"string\" && options.filename.length > 0;" : "", " function peg$computeLocation(startPos, endPos) {", " var loc = {};", "", use("filename") ? " if ( peg$VALIDFILENAME ) loc.filename = options.filename;" : "", "", " var startPosDetails = peg$computePosDetails(startPos);", " loc.start = {", " offset: startPos,", " line: startPosDetails.line,", " column: startPosDetails.column", " };", "", " var endPosDetails = peg$computePosDetails(endPos);", " loc.end = {", " offset: endPos,", " line: endPosDetails.line,", " column: endPosDetails.column", " };", "", " return loc;", " }", "", " function peg$begin() {", " peg$expected.push({ pos: peg$currPos, variants: [] });", " }", "", " function peg$expect(expected) {", " var top = peg$expected[peg$expected.length - 1];", "", " if (peg$currPos < top.pos) { return; }", "", " if (peg$currPos > top.pos) {", " top.pos = peg$currPos;", " top.variants = [];", " }", "", " top.variants.push(expected);", " }", "", " function peg$end(invert) {", " var expected = peg$expected.pop();", " var top = peg$expected[peg$expected.length - 1];", " var variants = expected.variants;", "", " if (top.pos !== expected.pos) { return; }", "", " if (invert) {", " variants = variants.map(function(e) {", " return e.type === \"not\" ? e.expected : { type: \"not\", expected: e };", " });", " }", "", " Array.prototype.push.apply(top.variants, variants);", " }", "", " function peg$buildSimpleError(message, location) {", " return new peg$SyntaxError(message, null, null, location);", " }", "", " function peg$buildStructuredError(expected, found, location) {", " return new peg$SyntaxError(", " peg$SyntaxError.buildMessage(expected, found),", " expected,", " found,", " location", " );", " }", "", " function peg$buildError() {", " var expected = peg$expected[0];", " var failPos = expected.pos;", "", " return peg$buildStructuredError(", " expected.variants,", " failPos < input.length ? input.charAt(failPos) : null,", " failPos < input.length", " ? peg$computeLocation(failPos, failPos + 1)", " : peg$computeLocation(failPos, failPos)", " );", " }", ""].join("\n")); + + if (options.optimize === "size") { + parts.push(indent2(generateInterpreter())); + parts.push(""); + } else { + ast.rules.forEach(function (rule) { + parts.push(indent2(generateRuleFunction(rule))); + parts.push(""); + }); + } + + if (ast.initializer) { + parts.push(indent2(ast.initializer.code)); + parts.push(""); + } + + parts.push(" peg$begin();"); + + if (options.optimize === "size") { + parts.push(" peg$result = peg$parseRule(peg$startRuleIndex);"); + } else { + parts.push(" peg$result = peg$startRuleFunction();"); + } + + parts.push(["", " if (peg$result !== peg$FAILED && peg$currPos === input.length) {", " return peg$result;", " } else {", " if (peg$result !== peg$FAILED && peg$currPos < input.length) {", " peg$expect(peg$endExpectation());", " }", "", " throw peg$buildError();", " }", "}"].join("\n")); + return parts.join("\n"); + } + + function generateWrapper(toplevelCode) { + function generateHeaderComment() { + var comment = "// Generated by PEG.js v".concat(VERSION, ", https://pegjs.org/"); + var header = options.header; + + if (typeof header === "string") { + comment += "\n\n" + header; + } else if (Array.isArray(header)) { + comment += "\n\n"; + header.forEach(function (data) { + comment += "// " + data; + }); + } + + return comment; + } + + function generateParserObject() { + return options.trace && use("DefaultTracer") ? ["{", " SyntaxError: peg$SyntaxError,", " DefaultTracer: peg$DefaultTracer,", " parse: peg$parse", "}"].join("\n") : ["{", " SyntaxError: peg$SyntaxError,", " parse: peg$parse", "}"].join("\n"); + } + + function generateParserExports() { + return options.trace && use("DefaultTracer") ? ["{", " peg$SyntaxError as SyntaxError,", " peg$DefaultTracer as DefaultTracer,", " peg$parse as parse", "}"].join("\n") : ["{", " peg$SyntaxError as SyntaxError,", " peg$parse as parse", "}"].join("\n"); + } + + var generators = { + bare: function bare() { + return [generateHeaderComment(), "(function() {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "})()"].join("\n"); + }, + commonjs: function commonjs() { + var parts = []; + var dependencyVars = Object.keys(options.dependencies); + parts.push([generateHeaderComment(), "", "\"use strict\";", ""].join("\n")); + + if (dependencyVars.length > 0) { + dependencyVars.forEach(function (variable) { + parts.push("var " + variable + " = require(\"" + util.stringEscape(options.dependencies[variable]) + "\");"); + }); + parts.push(""); + } + + parts.push([toplevelCode, "", "module.exports = " + generateParserObject() + ";", ""].join("\n")); + return parts.join("\n"); + }, + es: function es() { + var parts = []; + var dependencyVars = Object.keys(options.dependencies); + parts.push(generateHeaderComment(), ""); + + if (dependencyVars.length > 0) { + dependencyVars.forEach(function (variable) { + parts.push("import " + variable + " from \"" + util.stringEscape(options.dependencies[variable]) + "\";"); + }); + parts.push(""); + } + + parts.push(toplevelCode, "", "export " + generateParserExports() + ";", "", "export default " + generateParserObject() + ";", ""); + return parts.join("\n"); + }, + amd: function amd() { + var dependencyVars = Object.keys(options.dependencies); + var dependencyIds = dependencyVars.map(function (v) { + return options.dependencies[v]; + }); + var dependencies = "[" + dependencyIds.map(function (id) { + return "\"".concat(util.stringEscape(id), "\""); + }).join(", ") + "]"; + var params = dependencyVars.join(", "); + return [generateHeaderComment(), "define(" + dependencies + ", function(" + params + ") {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "});", ""].join("\n"); + }, + globals: function globals() { + return [generateHeaderComment(), "(function(root) {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("root." + options.exportVar + " = " + generateParserObject() + ";"), "})(this);", ""].join("\n"); + }, + umd: function umd() { + var parts = []; + var dependencyVars = Object.keys(options.dependencies); + var dependencyIds = dependencyVars.map(function (v) { + return options.dependencies[v]; + }); + var dependencies = "[" + dependencyIds.map(function (id) { + return "\"".concat(util.stringEscape(id), "\""); + }).join(", ") + "]"; + var requires = dependencyIds.map(function (id) { + return "require(\"".concat(util.stringEscape(id), "\")"); + }).join(", "); + var args = dependencyVars.map(function (v) { + return "root." + v; + }).join(", "); + var params = dependencyVars.join(", "); + parts.push([generateHeaderComment(), "(function(root, factory) {", " if (typeof define === \"function\" && define.amd) {", " define(" + dependencies + ", factory);", " } else if (typeof module === \"object\" && module.exports) {", " module.exports = factory(" + requires + ");"].join("\n")); + + if (options.exportVar !== null) { + parts.push([" } else {", " root." + options.exportVar + " = factory(" + args + ");"].join("\n")); + } + + parts.push([" }", "})(this, function(" + params + ") {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "});", ""].join("\n")); + return parts.join("\n"); + } + }; + return generators[options.format](); + } + + ast.code = generateWrapper(generateToplevel()); + } + + var generateJs = generateJS; + + function removeProxyRules(ast, session, options) { + function isProxyRule(node) { + return node.type === "rule" && node.expression.type === "rule_ref"; + } + + var replaceRuleRefs = session.buildVisitor({ + rule_ref: function rule_ref(node, proxy, real) { + if (node.name === proxy) node.name = real; + } + }); + var allowedStartRules = options.allowedStartRules; + var rules = []; + ast.rules.forEach(function (rule) { + if (isProxyRule(rule)) { + replaceRuleRefs(ast, rule.name, rule.expression.name); + if (allowedStartRules.indexOf(rule.name) < 0) return; + } + + rules.push(rule); + }); + ast.rules = rules; + } + + var removeProxyRules_1 = removeProxyRules; + + var __hasOwnProperty$1 = Object.prototype.hasOwnProperty; + + function reportDuplicateLabels(ast, session) { + var check; + + function checkExpressionWithClonedEnv(node, env) { + check(node.expression, util.clone(env)); + } + + check = session.buildVisitor({ + rule: function rule(node) { + check(node.expression, {}); + }, + choice: function choice(node, env) { + node.alternatives.forEach(function (alternative) { + check(alternative, util.clone(env)); + }); + }, + action: checkExpressionWithClonedEnv, + labeled: function labeled(node, env) { + var label = node.label; + + if (label && __hasOwnProperty$1.call(env, label)) { + var start = env[label].start; + session.error("Label \"".concat(label, "\" is already defined at line ").concat(start.line, ", column ").concat(start.column, "."), node.location); + } + + check(node.expression, env); + if (label) env[label] = node.location; + }, + text: checkExpressionWithClonedEnv, + simple_and: checkExpressionWithClonedEnv, + simple_not: checkExpressionWithClonedEnv, + optional: checkExpressionWithClonedEnv, + zero_or_more: checkExpressionWithClonedEnv, + one_or_more: checkExpressionWithClonedEnv, + group: checkExpressionWithClonedEnv + }); + check(ast); + } + + var reportDuplicateLabels_1 = reportDuplicateLabels; + + var __hasOwnProperty$2 = Object.prototype.hasOwnProperty; + + function reportDuplicateRules(ast, session) { + var rules = {}; + var check = session.buildVisitor({ + rule: function rule(node) { + var name = node.name; + + if (__hasOwnProperty$2.call(rules, name)) { + var start = rules[name].start; + session.error("Rule \"".concat(name, "\" is already defined at line ").concat(start.line, ", column ").concat(start.column, "."), node.location); + } + + rules[node.name] = node.location; + } + }); + check(ast); + } + + var reportDuplicateRules_1 = reportDuplicateRules; + + function reportUnusedRules(ast, session, options) { + var used = {}; + + function yes(node) { + used[node.name || node] = true; + } + + options.allowedStartRules.forEach(yes); + session.buildVisitor({ + rule_ref: yes + })(ast); + ast.rules.forEach(function (rule) { + if (used[rule.name] !== true) { + session.warn("Rule \"".concat(rule.name, "\" is not referenced."), rule.location); + } + }); + } + + var reportUnusedRules_1 = reportUnusedRules; + + function reportInfiniteRecursion(ast, session) { + var visitedRules = []; + var check = session.buildVisitor({ + rule: function rule(node) { + visitedRules.push(node.name); + check(node.expression); + visitedRules.pop(node.name); + }, + sequence: function sequence(node) { + node.elements.every(function (element) { + check(element); + return !ast.alwaysConsumesOnSuccess(element); + }); + }, + rule_ref: function rule_ref(node) { + if (visitedRules.indexOf(node.name) !== -1) { + visitedRules.push(node.name); + var rulePath = visitedRules.join(" -> "); + session.error("Possible infinite loop when parsing (left recursion: ".concat(rulePath, ")."), node.location); + } + + check(ast.findRule(node.name)); + } + }); + check(ast); + } + + var reportInfiniteRecursion_1 = reportInfiniteRecursion; + + function reportInfiniteRepetition(ast, session) { + var check = session.buildVisitor({ + zero_or_more: function zero_or_more(node) { + if (!ast.alwaysConsumesOnSuccess(node.expression)) { + session.error("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", node.location); + } + }, + one_or_more: function one_or_more(node) { + if (!ast.alwaysConsumesOnSuccess(node.expression)) { + session.error("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", node.location); + } + } + }); + check(ast); + } + + var reportInfiniteRepetition_1 = reportInfiniteRepetition; + + function reportUndefinedRules(ast, session, options) { + var check = session.buildVisitor({ + rule_ref: function rule_ref(node) { + if (!ast.findRule(node.name)) { + session.error("Rule \"".concat(node.name, "\" is not defined."), node.location); + } + } + }); + check(ast); + options.allowedStartRules.forEach(function (rule) { + if (!ast.findRule(rule)) { + session.error("Start rule \"".concat(rule, "\" is not defined.")); + } + }); + } + + var reportUndefinedRules_1 = reportUndefinedRules; + + function inferenceMatchResult(ast, session) { + var inference; + + function sometimesMatch(node) { + node.match = 0; + return node.match; + } + + function alwaysMatch(node) { + inference(node.expression); + node.match = 1; + return node.match; + } + + function inferenceExpression(node) { + node.match = inference(node.expression); + return node.match; + } + + function inferenceElements(elements, forChoice) { + var length = elements.length; + var always = 0; + var never = 0; + + for (var i = 0; i < length; ++i) { + var result = inference(elements[i]); + + if (result > 0) { + ++always; + } + + if (result < 0) { + ++never; + } + } + + if (always === length) { + return 1; + } + + if (forChoice) { + return never === length ? -1 : 0; + } + + return never > 0 ? -1 : 0; + } + + inference = session.buildVisitor({ + rule: function rule(node) { + var oldResult; + var count = 0; + + if (typeof node.match === "undefined") { + node.match = 0; + + do { + oldResult = node.match; + node.match = inference(node.expression); + + if (++count > 6) { + session.error("Infinity cycle detected when trying to evaluate node match result", node.location); + } + } while (oldResult !== node.match); + } + + return node.match; + }, + named: inferenceExpression, + choice: function choice(node) { + node.match = inferenceElements(node.alternatives, true); + return node.match; + }, + action: inferenceExpression, + sequence: function sequence(node) { + node.match = inferenceElements(node.elements, false); + return node.match; + }, + labeled: inferenceExpression, + text: inferenceExpression, + simple_and: inferenceExpression, + simple_not: function simple_not(node) { + node.match = -inference(node.expression); + return node.match; + }, + optional: alwaysMatch, + zero_or_more: alwaysMatch, + one_or_more: inferenceExpression, + group: inferenceExpression, + semantic_and: sometimesMatch, + semantic_not: sometimesMatch, + rule_ref: function rule_ref(node) { + var rule = ast.findRule(node.name); + node.match = inference(rule); + return node.match; + }, + literal: function literal(node) { + node.match = node.value.length === 0 ? 1 : 0; + return node.match; + }, + class: function _class(node) { + node.match = node.parts.length === 0 ? -1 : 0; + return node.match; + }, + any: sometimesMatch + }); + inference(ast); + } + + var inferenceMatchResult_1 = inferenceMatchResult; + + function isSemanticPredicate(element) { + var type = element.expression.type; + if (type === "semantic_and") return true; + if (type === "semantic_not") return true; + return false; + } + + function reportIncorrectPlucking(ast, session) { + session.buildVisitor({ + action: function action(node) { + this.visit(node.expression, true); + }, + labeled: function labeled(node, action) { + if (node.pick !== true) return void 0; + if (action === true) session.error("\"@\" cannot be used with an action block.", node.location); + if (isSemanticPredicate(node)) session.error("\"@\" cannot be used on a semantic predicate.", node.location); + this.visit(node.expression); + } + })(ast); + } + + var reportIncorrectPlucking_1 = reportIncorrectPlucking; + + var opcodes = { + PUSH_EMPTY_STRING: 0, + PUSH_UNDEFINED: 1, + PUSH_NULL: 2, + PUSH_FAILED: 3, + PUSH_EMPTY_ARRAY: 4, + PUSH_CURR_POS: 5, + POP: 6, + POP_CURR_POS: 7, + POP_N: 8, + NIP: 9, + APPEND: 10, + WRAP: 11, + TEXT: 12, + PLUCK: 41, + IF: 13, + IF_ERROR: 14, + IF_NOT_ERROR: 15, + WHILE_NOT_ERROR: 16, + MATCH_ANY: 17, + MATCH_STRING: 18, + MATCH_STRING_IC: 19, + MATCH_CLASS: 20, + ACCEPT_N: 21, + ACCEPT_STRING: 22, + EXPECT: 23, + LOAD_SAVED_POS: 24, + UPDATE_SAVED_POS: 25, + CALL: 26, + RULE: 27, + SILENT_FAILS_ON: 28, + SILENT_FAILS_OFF: 29, + EXPECT_NS_BEGIN: 38, + EXPECT_NS_END: 39 + }; + var opcodes_1 = opcodes; + + function peg$subclass(child, parent) { + function C() { + this.constructor = child; + } + + C.prototype = parent.prototype; + child.prototype = new C(); + } + + function peg$SyntaxError(message, expected, found, location) { + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; + + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, peg$SyntaxError); + } + } + + peg$subclass(peg$SyntaxError, Error); + + peg$SyntaxError.buildMessage = function (expected, found) { + var DESCRIBE_EXPECTATION_FNS = { + literal: function literal(expectation) { + return "\"" + literalEscape(expectation.text) + "\""; + }, + class: function _class(expectation) { + var escapedParts = expectation.parts.map(function (part) { + return Array.isArray(part) ? classEscape(part[0]) + "-" + classEscape(part[1]) : classEscape(part); + }); + return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; + }, + any: function any() { + return "any character"; + }, + end: function end() { + return "end of input"; + }, + other: function other(expectation) { + return expectation.description; + }, + not: function not(expectation) { + return "not " + describeExpectation(expectation.expected); + } + }; + + function hex(ch) { + return ch.charCodeAt(0).toString(16).toUpperCase(); + } + + function literalEscape(s) { + return s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { + return "\\x0" + hex(ch); + }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { + return "\\x" + hex(ch); + }); + } + + function classEscape(s) { + return s.replace(/\\/g, "\\\\").replace(/\]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { + return "\\x0" + hex(ch); + }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { + return "\\x" + hex(ch); + }); + } + + function describeExpectation(expectation) { + return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); + } + + function describeExpected(expected) { + var descriptions = expected.map(describeExpectation); + var i, j; + descriptions.sort(); + + if (descriptions.length > 0) { + for (i = 1, j = 1; i < descriptions.length; i++) { + if (descriptions[i - 1] !== descriptions[i]) { + descriptions[j] = descriptions[i]; + j++; + } + } + + descriptions.length = j; + } + + switch (descriptions.length) { + case 1: + return descriptions[0]; + + case 2: + return descriptions[0] + " or " + descriptions[1]; + + default: + return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1]; + } + } + + function describeFound(found) { + return found ? "\"" + literalEscape(found) + "\"" : "end of input"; + } + + return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; + }; + + function peg$parse(input, options) { + options = options !== undefined ? options : {}; + var peg$FAILED = {}; + var peg$startRuleFunctions = { + Grammar: peg$parseGrammar + }; + var peg$startRuleFunction = peg$parseGrammar; + var peg$c0 = "="; + var peg$c1 = "/"; + var peg$c2 = "@"; + var peg$c3 = ":"; + var peg$c4 = "$"; + var peg$c5 = "&"; + var peg$c6 = "!"; + var peg$c7 = "?"; + var peg$c8 = "*"; + var peg$c9 = "+"; + var peg$c10 = "("; + var peg$c11 = ")"; + var peg$c12 = "\t"; + var peg$c13 = "\v"; + var peg$c14 = "\f"; + var peg$c15 = " "; + var peg$c16 = "\xA0"; + var peg$c17 = "\uFEFF"; + var peg$c18 = "\n"; + var peg$c19 = "\r\n"; + var peg$c20 = "\r"; + var peg$c21 = "\u2028"; + var peg$c22 = "\u2029"; + var peg$c23 = "/*"; + var peg$c24 = "*/"; + var peg$c25 = "//"; + var peg$c26 = "_"; + var peg$c27 = "\\"; + var peg$c28 = "\u200C"; + var peg$c29 = "\u200D"; + var peg$c30 = "i"; + var peg$c31 = "\""; + var peg$c32 = "'"; + var peg$c33 = "["; + var peg$c34 = "^"; + var peg$c35 = "]"; + var peg$c36 = "-"; + var peg$c37 = "0"; + var peg$c38 = "b"; + var peg$c39 = "f"; + var peg$c40 = "n"; + var peg$c41 = "r"; + var peg$c42 = "t"; + var peg$c43 = "v"; + var peg$c44 = "x"; + var peg$c45 = "u"; + var peg$c46 = "."; + var peg$c47 = "{"; + var peg$c48 = "}"; + var peg$c49 = ";"; + var peg$r0 = /^[\n\r\u2028\u2029]/; + var peg$r1 = /^[0-9]/; + var peg$r2 = /^[0-9a-f]/i; + var peg$r3 = /^[{}]/; + var peg$r4 = /^[a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A]/; + var peg$r5 = /^[\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C-\uA69D\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3-\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E-\uFF9F]/; + var peg$r6 = /^[\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u09FC\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/; + var peg$r7 = /^[\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]/; + var peg$r8 = /^[A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uFF21-\uFF3A]/; + var peg$r9 = /^[\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E-\u094F\u0982-\u0983\u09BE-\u09C0\u09C7-\u09C8\u09CB-\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB-\u0ACC\u0B02-\u0B03\u0B3E\u0B40\u0B47-\u0B48\u0B4B-\u0B4C\u0B57\u0BBE-\u0BBF\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82-\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CD5-\u0CD6\u0D02-\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82-\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2-\u0DF3\u0F3E-\u0F3F\u0F7F\u102B-\u102C\u1031\u1038\u103B-\u103C\u1056-\u1057\u1062-\u1064\u1067-\u106D\u1083-\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7-\u17C8\u1923-\u1926\u1929-\u192B\u1930-\u1931\u1933-\u1938\u1A19-\u1A1A\u1A55\u1A57\u1A61\u1A63-\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43-\u1B44\u1B82\u1BA1\u1BA6-\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2-\u1BF3\u1C24-\u1C2B\u1C34-\u1C35\u1CE1\u1CF2-\u1CF3\u1CF7\u302E-\u302F\uA823-\uA824\uA827\uA880-\uA881\uA8B4-\uA8C3\uA952-\uA953\uA983\uA9B4-\uA9B5\uA9BA-\uA9BB\uA9BD-\uA9C0\uAA2F-\uAA30\uAA33-\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE-\uAAEF\uAAF5\uABE3-\uABE4\uABE6-\uABE7\uABE9-\uABEA\uABEC]/; + var peg$r10 = /^[\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962-\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2-\u09E3\u09FE\u0A01-\u0A02\u0A3C\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A51\u0A70-\u0A71\u0A75\u0A81-\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7-\u0AC8\u0ACD\u0AE2-\u0AE3\u0AFA-\u0AFF\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62-\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C04\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C62-\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC-\u0CCD\u0CE2-\u0CE3\u0D00-\u0D01\u0D3B-\u0D3C\u0D41-\u0D44\u0D4D\u0D62-\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86-\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039-\u103A\u103D-\u103E\u1058-\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17B4-\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885-\u1886\u18A9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193B\u1A17-\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80-\u1B81\u1BA2-\u1BA5\u1BA8-\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8-\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099-\u309A\uA66F\uA674-\uA67D\uA69E-\uA69F\uA6F0-\uA6F1\uA802\uA806\uA80B\uA825-\uA826\uA8C4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31-\uAA32\uAA35-\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7-\uAAB8\uAABE-\uAABF\uAAC1\uAAEC-\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/; + var peg$r11 = /^[0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]/; + var peg$r12 = /^[\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]/; + var peg$r13 = /^[_\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F]/; + var peg$r14 = /^[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/; + var peg$e0 = peg$literalExpectation("=", false); + var peg$e1 = peg$literalExpectation("/", false); + var peg$e2 = peg$literalExpectation("@", false); + var peg$e3 = peg$literalExpectation(":", false); + var peg$e4 = peg$literalExpectation("$", false); + var peg$e5 = peg$literalExpectation("&", false); + var peg$e6 = peg$literalExpectation("!", false); + var peg$e7 = peg$literalExpectation("?", false); + var peg$e8 = peg$literalExpectation("*", false); + var peg$e9 = peg$literalExpectation("+", false); + var peg$e10 = peg$literalExpectation("(", false); + var peg$e11 = peg$literalExpectation(")", false); + var peg$e12 = peg$anyExpectation(); + var peg$e13 = peg$otherExpectation("whitespace"); + var peg$e14 = peg$classExpectation(["\n", "\r", "\u2028", "\u2029"], false, false); + var peg$e15 = peg$otherExpectation("end of line"); + var peg$e16 = peg$otherExpectation("comment"); + var peg$e17 = peg$literalExpectation("/*", false); + var peg$e18 = peg$literalExpectation("*/", false); + var peg$e19 = peg$literalExpectation("//", false); + var peg$e20 = peg$otherExpectation("identifier"); + var peg$e21 = peg$otherExpectation("literal"); + var peg$e22 = peg$otherExpectation("string"); + var peg$e23 = peg$otherExpectation("character class"); + var peg$e24 = peg$literalExpectation(".", false); + var peg$e25 = peg$otherExpectation("code block"); + var peg$e26 = peg$literalExpectation(";", false); + + var peg$f0 = function peg$f0(initializer, rules) { + return new ast.Grammar(initializer, rules, comments, location()); + }; + + var peg$f1 = function peg$f1(code) { + return createNode("initializer", { + code: code + }); + }; + + var peg$f2 = function peg$f2(name, displayName, expression) { + if (displayName) expression = createNode("named", { + name: displayName, + expression: expression + }); + return createNode("rule", { + name: name, + expression: expression + }); + }; + + var peg$f3 = function peg$f3(head, tail) { + if (tail.length === 0) return head; + return createNode("choice", { + alternatives: [head].concat(tail) + }); + }; + + var peg$f4 = function peg$f4(expression, code) { + if (code === null) return expression; + return createNode("action", { + expression: expression, + code: code + }); + }; + + var peg$f5 = function peg$f5(head, tail) { + var elements = [head]; + + if (tail.length === 0) { + if (head.type !== "labeled" || !head.pick) return head; + } else { + elements = elements.concat(tail); + } + + return createNode("sequence", { + elements: elements + }); + }; + + var peg$f6 = function peg$f6(label, expression) { + return createNode("labeled", { + pick: pick, + label: label, + expression: expression + }); + }; + + var peg$f7 = function peg$f7(label, expression) { + return createNode("labeled", { + label: label, + expression: expression + }); + }; + + var peg$f8 = function peg$f8(name) { + if (RESERVED_WORDS[name] !== true) return name; + error("Label can't be a reserved word \"".concat(name, "\"."), location()); + }; + + var peg$f9 = function peg$f9(operator, expression) { + return createNode(operator, { + expression: expression + }); + }; + + var peg$f10 = function peg$f10() { + return "text"; + }; + + var peg$f11 = function peg$f11() { + return "simple_and"; + }; + + var peg$f12 = function peg$f12() { + return "simple_not"; + }; + + var peg$f13 = function peg$f13(expression, operator) { + return createNode(operator, { + expression: expression + }); + }; + + var peg$f14 = function peg$f14() { + return "optional"; + }; + + var peg$f15 = function peg$f15() { + return "zero_or_more"; + }; + + var peg$f16 = function peg$f16() { + return "one_or_more"; + }; + + var peg$f17 = function peg$f17(e) { + if (e.type !== "labeled" && e.type !== "sequence") return e; + return createNode("group", { + expression: e + }); + }; + + var peg$f18 = function peg$f18(name) { + return createNode("rule_ref", { + name: name + }); + }; + + var peg$f19 = function peg$f19(operator, code) { + return createNode(operator, { + code: code + }); + }; + + var peg$f20 = function peg$f20() { + return "semantic_and"; + }; + + var peg$f21 = function peg$f21() { + return "semantic_not"; + }; + + var peg$f22 = function peg$f22(comment) { + return addComment(comment, true); + }; + + var peg$f23 = function peg$f23(comment) { + return addComment(comment, false); + }; + + var peg$f24 = function peg$f24(head, tail) { + return head + tail.join(""); + }; + + var peg$f25 = function peg$f25(value, ignoreCase) { + return createNode("literal", { + value: value, + ignoreCase: ignoreCase !== null + }); + }; + + var peg$f26 = function peg$f26(chars) { + return chars.join(""); + }; + + var peg$f27 = function peg$f27(inverted, parts, ignoreCase) { + return createNode("class", { + parts: parts.filter(function (part) { + return part !== ""; + }), + inverted: inverted !== null, + ignoreCase: ignoreCase !== null + }); + }; + + var peg$f28 = function peg$f28(begin, end) { + if (begin.charCodeAt(0) > end.charCodeAt(0)) error("Invalid character range: " + text() + "."); + return [begin, end]; + }; + + var peg$f29 = function peg$f29() { + return ""; + }; + + var peg$f30 = function peg$f30() { + return "\0"; + }; + + var peg$f31 = function peg$f31() { + return "\b"; + }; + + var peg$f32 = function peg$f32() { + return "\f"; + }; + + var peg$f33 = function peg$f33() { + return "\n"; + }; + + var peg$f34 = function peg$f34() { + return "\r"; + }; + + var peg$f35 = function peg$f35() { + return "\t"; + }; + + var peg$f36 = function peg$f36() { + return "\v"; + }; + + var peg$f37 = function peg$f37(digits) { + return String.fromCharCode(parseInt(digits, 16)); + }; + + var peg$f38 = function peg$f38() { + return createNode("any"); + }; + + var peg$f39 = function peg$f39() { + error("Unbalanced brace."); + }; + + var peg$currPos = 0; + var peg$savedPos = 0; + var peg$posDetailsCache = [{ + line: 1, + column: 1 + }]; + var peg$expected = []; + var peg$silentFails = 0; + var peg$result; + + if ("startRule" in options) { + if (!(options.startRule in peg$startRuleFunctions)) { + throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + } + + peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; + } + + function text() { + return input.substring(peg$savedPos, peg$currPos); + } + + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } + + function error(message, location) { + location = location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos); + throw peg$buildSimpleError(message, location); + } + + function peg$literalExpectation(text, ignoreCase) { + return { + type: "literal", + text: text, + ignoreCase: ignoreCase + }; + } + + function peg$classExpectation(parts, inverted, ignoreCase) { + return { + type: "class", + parts: parts, + inverted: inverted, + ignoreCase: ignoreCase + }; + } + + function peg$anyExpectation() { + return { + type: "any" + }; + } + + function peg$endExpectation() { + return { + type: "end" + }; + } + + function peg$otherExpectation(description) { + return { + type: "other", + description: description + }; + } + + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos]; + var p; + + if (details) { + return details; + } else { + p = pos - 1; + + while (!peg$posDetailsCache[p]) { + p--; + } + + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column + }; + + while (p < pos) { + if (input.charCodeAt(p) === 10) { + details.line++; + details.column = 1; + } else { + details.column++; + } + + p++; + } + + peg$posDetailsCache[pos] = details; + return details; + } + } + + var peg$VALIDFILENAME = typeof options.filename === "string" && options.filename.length > 0; + + function peg$computeLocation(startPos, endPos) { + var loc = {}; + if (peg$VALIDFILENAME) loc.filename = options.filename; + var startPosDetails = peg$computePosDetails(startPos); + loc.start = { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }; + var endPosDetails = peg$computePosDetails(endPos); + loc.end = { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column + }; + return loc; + } + + function peg$begin() { + peg$expected.push({ + pos: peg$currPos, + variants: [] + }); + } + + function peg$expect(expected) { + var top = peg$expected[peg$expected.length - 1]; + + if (peg$currPos < top.pos) { + return; + } + + if (peg$currPos > top.pos) { + top.pos = peg$currPos; + top.variants = []; + } + + top.variants.push(expected); + } + + function peg$end(invert) { + var expected = peg$expected.pop(); + var top = peg$expected[peg$expected.length - 1]; + var variants = expected.variants; + + if (top.pos !== expected.pos) { + return; + } + + if (invert) { + variants = variants.map(function (e) { + return e.type === "not" ? e.expected : { + type: "not", + expected: e + }; + }); + } + + Array.prototype.push.apply(top.variants, variants); + } + + function peg$buildSimpleError(message, location) { + return new peg$SyntaxError(message, null, null, location); + } + + function peg$buildStructuredError(expected, found, location) { + return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected, found), expected, found, location); + } + + function peg$buildError() { + var expected = peg$expected[0]; + var failPos = expected.pos; + return peg$buildStructuredError(expected.variants, failPos < input.length ? input.charAt(failPos) : null, failPos < input.length ? peg$computeLocation(failPos, failPos + 1) : peg$computeLocation(failPos, failPos)); + } + + function peg$parseGrammar() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + s1 = peg$parse__(); + s2 = peg$currPos; + s3 = peg$parseInitializer(); + + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = null; + } + + s3 = []; + s4 = peg$currPos; + s5 = peg$parseRule(); + + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + s5 = peg$parseRule(); + + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f0(s2, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseInitializer() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$parseCodeBlock(); + + if (s1 !== peg$FAILED) { + s2 = peg$parseEOS(); + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f1(s1); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseRule() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$currPos; + s4 = peg$parseStringLiteral(); + + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 === peg$FAILED) { + s3 = null; + } + + rule$expects(peg$e0); + + if (input.charCodeAt(peg$currPos) === 61) { + s4 = peg$c0; + peg$currPos++; + } else { + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + s6 = peg$parseChoiceExpression(); + + if (s6 !== peg$FAILED) { + s7 = peg$parseEOS(); + + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f2(s1, s3, s6); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseChoiceExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parseActionExpression(); + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + rule$expects(peg$e1); + + if (input.charCodeAt(peg$currPos) === 47) { + s5 = peg$c1; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + s7 = peg$parseActionExpression(); + + if (s7 !== peg$FAILED) { + s3 = s7; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + rule$expects(peg$e1); + + if (input.charCodeAt(peg$currPos) === 47) { + s5 = peg$c1; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + s7 = peg$parseActionExpression(); + + if (s7 !== peg$FAILED) { + s3 = s7; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + + peg$savedPos = s0; + s0 = peg$f3(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseActionExpression() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseSequenceExpression(); + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$parse__(); + s4 = peg$parseCodeBlock(); + + if (s4 !== peg$FAILED) { + s2 = s4; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = null; + } + + peg$savedPos = s0; + s0 = peg$f4(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSequenceExpression() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parseLabeledExpression(); + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + s5 = peg$parseLabeledExpression(); + + if (s5 !== peg$FAILED) { + s3 = s5; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + s5 = peg$parseLabeledExpression(); + + if (s5 !== peg$FAILED) { + s3 = s5; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + + peg$savedPos = s0; + s0 = peg$f5(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLabeledExpression() { + var s0, s1, s2, s3, s4; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e2); + + if (input.charCodeAt(peg$currPos) === 64) { + s1 = peg$c2; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseLabelIdentifier(); + + if (s2 === peg$FAILED) { + s2 = null; + } + + s3 = peg$parse__(); + s4 = peg$parsePrefixedExpression(); + + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f6(s2, s4); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseLabelIdentifier(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parsePrefixedExpression(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f7(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parsePrefixedExpression(); + } + } + + return s0; + } + + function peg$parseLabelIdentifier() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + rule$expects(peg$e3); + + if (input.charCodeAt(peg$currPos) === 58) { + s3 = peg$c3; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f8(s1); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsePrefixedExpression() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsePrefixedOperator(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parseSuffixedExpression(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f9(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseSuffixedExpression(); + } + + return s0; + } + + function peg$parsePrefixedOperator() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e4); + + if (input.charCodeAt(peg$currPos) === 36) { + s1 = peg$c4; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f10(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e5); + + if (input.charCodeAt(peg$currPos) === 38) { + s1 = peg$c5; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f11(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e6); + + if (input.charCodeAt(peg$currPos) === 33) { + s1 = peg$c6; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f12(); + } + + s0 = s1; + } + } + + return s0; + } + + function peg$parseSuffixedExpression() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parsePrimaryExpression(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parseSuffixedOperator(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f13(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parsePrimaryExpression(); + } + + return s0; + } + + function peg$parseSuffixedOperator() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e7); + + if (input.charCodeAt(peg$currPos) === 63) { + s1 = peg$c7; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f14(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e8); + + if (input.charCodeAt(peg$currPos) === 42) { + s1 = peg$c8; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f15(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e9); + + if (input.charCodeAt(peg$currPos) === 43) { + s1 = peg$c9; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f16(); + } + + s0 = s1; + } + } + + return s0; + } + + function peg$parsePrimaryExpression() { + var s0, s1, s2, s3, s4, s5; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$parseLiteralMatcher(); + + if (s0 === peg$FAILED) { + s0 = peg$parseCharacterClassMatcher(); + + if (s0 === peg$FAILED) { + s0 = peg$parseAnyMatcher(); + + if (s0 === peg$FAILED) { + s0 = peg$parseRuleReferenceExpression(); + + if (s0 === peg$FAILED) { + s0 = peg$parseSemanticPredicateExpression(); + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e10); + + if (input.charCodeAt(peg$currPos) === 40) { + s1 = peg$c10; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parseChoiceExpression(); + + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + rule$expects(peg$e11); + + if (input.charCodeAt(peg$currPos) === 41) { + s5 = peg$c11; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f17(s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + } + } + + return s0; + } + + function peg$parseRuleReferenceExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$begin(); + s3 = peg$currPos; + s4 = peg$parse__(); + s5 = peg$currPos; + s6 = peg$parseStringLiteral(); + + if (s6 !== peg$FAILED) { + s7 = peg$parse__(); + s6 = [s6, s7]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 === peg$FAILED) { + s5 = null; + } + + rule$expects(peg$e0); + + if (input.charCodeAt(peg$currPos) === 61) { + s6 = peg$c0; + peg$currPos++; + } else { + s6 = peg$FAILED; + } + + if (s6 !== peg$FAILED) { + s4 = [s4, s5, s6]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + peg$end(true); + + if (s3 === peg$FAILED) { + s2 = undefined; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f18(s1); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSemanticPredicateExpression() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parseSemanticPredicateOperator(); + + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + s3 = peg$parseCodeBlock(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f19(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSemanticPredicateOperator() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e5); + + if (input.charCodeAt(peg$currPos) === 38) { + s1 = peg$c5; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f20(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + rule$expects(peg$e6); + + if (input.charCodeAt(peg$currPos) === 33) { + s1 = peg$c6; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f21(); + } + + s0 = s1; + } + + return s0; + } + + function peg$parseSourceCharacter() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e12); + + if (input.length > peg$currPos) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseWhiteSpace() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e13); + peg$silentFails++; + + if (input.charCodeAt(peg$currPos) === 9) { + s0 = peg$c12; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 11) { + s0 = peg$c13; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 12) { + s0 = peg$c14; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 32) { + s0 = peg$c15; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 160) { + s0 = peg$c16; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 65279) { + s0 = peg$c17; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseZs(); + } + } + } + } + } + } + + peg$silentFails--; + return s0; + } + + function peg$parseLineTerminator() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e14); + + if (peg$r0.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLineTerminatorSequence() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e15); + peg$silentFails++; + + if (input.charCodeAt(peg$currPos) === 10) { + s0 = peg$c18; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c19) { + s0 = peg$c19; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 13) { + s0 = peg$c20; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8232) { + s0 = peg$c21; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8233) { + s0 = peg$c22; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + } + } + } + } + + peg$silentFails--; + return s0; + } + + function peg$parseComment() { + var s0; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e16); + peg$silentFails++; + s0 = peg$parseMultiLineComment(); + + if (s0 === peg$FAILED) { + s0 = peg$parseSingleLineComment(); + } + + peg$silentFails--; + return s0; + } + + function peg$parseMultiLineComment() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + + if (input.substr(peg$currPos, 2) === peg$c23) { + s1 = peg$c23; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s6 = peg$c24; + peg$currPos += 2; + } else { + s6 = peg$FAILED; + } + + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s6 = peg$c24; + peg$currPos += 2; + } else { + s6 = peg$FAILED; + } + + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } + + s2 = input.substring(s2, peg$currPos); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s3 = peg$c24; + peg$currPos += 2; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f22(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseMultiLineCommentNoLineTerminator() { + var s0, s1, s2, s3, s4, s5, s6; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e17); + + if (input.substr(peg$currPos, 2) === peg$c23) { + s1 = peg$c23; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + rule$expects(peg$e18); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s6 = peg$c24; + peg$currPos += 2; + } else { + s6 = peg$FAILED; + } + + if (s6 === peg$FAILED) { + s6 = peg$parseLineTerminator(); + } + + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + rule$expects(peg$e18); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s6 = peg$c24; + peg$currPos += 2; + } else { + s6 = peg$FAILED; + } + + if (s6 === peg$FAILED) { + s6 = peg$parseLineTerminator(); + } + + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } + + s2 = input.substring(s2, peg$currPos); + rule$expects(peg$e18); + + if (input.substr(peg$currPos, 2) === peg$c24) { + s3 = peg$c24; + peg$currPos += 2; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f22(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSingleLineComment() { + var s0, s1, s2, s3, s4, s5, s6; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e19); + + if (input.substr(peg$currPos, 2) === peg$c25) { + s1 = peg$c25; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + s6 = peg$parseLineTerminator(); + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + s5 = peg$currPos; + peg$begin(); + s6 = peg$parseLineTerminator(); + peg$end(true); + + if (s6 === peg$FAILED) { + s5 = undefined; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s6 = peg$parseSourceCharacter(); + + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } + + s2 = input.substring(s2, peg$currPos); + peg$savedPos = s0; + s0 = peg$f23(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseIdentifier() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e20); + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parseIdentifierStart(); + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseIdentifierPart(); + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseIdentifierPart(); + } + + peg$savedPos = s0; + s0 = peg$f24(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$silentFails--; + return s0; + } + + function peg$parseIdentifierStart() { + var s0, s1, s2; + + s0 = peg$parseUnicodeLetter(); + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 36) { + s0 = peg$c4; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 95) { + s0 = peg$c26; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseUnicodeEscapeSequence(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + + return s0; + } + + function peg$parseIdentifierPart() { + var s0; + + s0 = peg$parseIdentifierStart(); + + if (s0 === peg$FAILED) { + s0 = peg$parseUnicodeCombiningMark(); + + if (s0 === peg$FAILED) { + s0 = peg$parseNd(); + + if (s0 === peg$FAILED) { + s0 = peg$parsePc(); + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8204) { + s0 = peg$c28; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8205) { + s0 = peg$c29; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + } + } + } + } + } + + return s0; + } + + function peg$parseUnicodeLetter() { + var s0; + + s0 = peg$parseLu(); + + if (s0 === peg$FAILED) { + s0 = peg$parseLl(); + + if (s0 === peg$FAILED) { + s0 = peg$parseLt(); + + if (s0 === peg$FAILED) { + s0 = peg$parseLm(); + + if (s0 === peg$FAILED) { + s0 = peg$parseLo(); + + if (s0 === peg$FAILED) { + s0 = peg$parseNl(); + } + } + } + } + } + + return s0; + } + + function peg$parseUnicodeCombiningMark() { + var s0; + + s0 = peg$parseMn(); + + if (s0 === peg$FAILED) { + s0 = peg$parseMc(); + } + + return s0; + } + + function peg$parseLiteralMatcher() { + var s0, s1, s2; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e21); + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parseStringLiteral(); + + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 105) { + s2 = peg$c30; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = null; + } + + peg$savedPos = s0; + s0 = peg$f25(s1, s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$silentFails--; + return s0; + } + + function peg$parseStringLiteral() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e22); + peg$silentFails++; + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 34) { + s1 = peg$c31; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseDoubleStringCharacter(); + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseDoubleStringCharacter(); + } + + if (input.charCodeAt(peg$currPos) === 34) { + s3 = peg$c31; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f26(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 39) { + s1 = peg$c32; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseSingleStringCharacter(); + + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseSingleStringCharacter(); + } + + if (input.charCodeAt(peg$currPos) === 39) { + s3 = peg$c32; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f26(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + peg$silentFails--; + return s0; + } + + function peg$parseDoubleStringCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$begin(); + + if (input.charCodeAt(peg$currPos) === 34) { + s2 = peg$c31; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s2 = peg$c27; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + } + + peg$end(true); + + if (s2 === peg$FAILED) { + s1 = undefined; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseLineContinuation(); + } + } + + return s0; + } + + function peg$parseSingleStringCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$begin(); + + if (input.charCodeAt(peg$currPos) === 39) { + s2 = peg$c32; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s2 = peg$c27; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + } + + peg$end(true); + + if (s2 === peg$FAILED) { + s1 = undefined; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseLineContinuation(); + } + } + + return s0; + } + + function peg$parseCharacterClassMatcher() { + var s0, s1, s2, s3, s4, s5; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e23); + peg$silentFails++; + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 91) { + s1 = peg$c33; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 94) { + s2 = peg$c34; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = null; + } + + s3 = []; + s4 = peg$parseCharacterPart(); + + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parseCharacterPart(); + } + + if (input.charCodeAt(peg$currPos) === 93) { + s4 = peg$c35; + peg$currPos++; + } else { + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 105) { + s5 = peg$c30; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 === peg$FAILED) { + s5 = null; + } + + peg$savedPos = s0; + s0 = peg$f27(s2, s3, s5); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + peg$silentFails--; + return s0; + } + + function peg$parseCharacterPart() { + var s0; + + s0 = peg$parseClassCharacterRange(); + + if (s0 === peg$FAILED) { + s0 = peg$parseClassCharacter(); + } + + return s0; + } + + function peg$parseClassCharacterRange() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parseClassCharacter(); + + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 45) { + s2 = peg$c36; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 !== peg$FAILED) { + s3 = peg$parseClassCharacter(); + + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f28(s1, s3); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseClassCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$begin(); + + if (input.charCodeAt(peg$currPos) === 93) { + s2 = peg$c35; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s2 = peg$c27; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + } + + peg$end(true); + + if (s2 === peg$FAILED) { + s1 = undefined; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseLineContinuation(); + } + } + + return s0; + } + + function peg$parseLineContinuation() { + var s0, s1, s2; + + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c27; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseLineTerminatorSequence(); + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f29(); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEscapeSequence() { + var s0, s1, s2, s3; + + s0 = peg$parseCharacterEscapeSequence(); + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 48) { + s1 = peg$c37; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$begin(); + s3 = peg$parseDecimalDigit(); + peg$end(true); + + if (s3 === peg$FAILED) { + s2 = undefined; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f30(); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$parseHexEscapeSequence(); + + if (s0 === peg$FAILED) { + s0 = peg$parseUnicodeEscapeSequence(); + } + } + } + + return s0; + } + + function peg$parseCharacterEscapeSequence() { + var s0; + + s0 = peg$parseSingleEscapeCharacter(); + + if (s0 === peg$FAILED) { + s0 = peg$parseNonEscapeCharacter(); + } + + return s0; + } + + function peg$parseSingleEscapeCharacter() { + var s0, s1; + + if (input.charCodeAt(peg$currPos) === 39) { + s0 = peg$c32; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 34) { + s0 = peg$c31; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s0 = peg$c27; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 98) { + s1 = peg$c38; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f31(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 102) { + s1 = peg$c39; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f32(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 110) { + s1 = peg$c40; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f33(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 114) { + s1 = peg$c41; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f34(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 116) { + s1 = peg$c42; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f35(); + } + + s0 = s1; + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 118) { + s1 = peg$c43; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f36(); + } + + s0 = s1; + } + } + } + } + } + } + } + } + + return s0; + } + + function peg$parseNonEscapeCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$begin(); + s2 = peg$parseEscapeCharacter(); + + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + + peg$end(true); + + if (s2 === peg$FAILED) { + s1 = undefined; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + + if (s2 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEscapeCharacter() { + var s0; + + s0 = peg$parseSingleEscapeCharacter(); + + if (s0 === peg$FAILED) { + s0 = peg$parseDecimalDigit(); + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 120) { + s0 = peg$c44; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 117) { + s0 = peg$c45; + peg$currPos++; + } else { + s0 = peg$FAILED; + } + } + } + } + + return s0; + } + + function peg$parseHexEscapeSequence() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 120) { + s1 = peg$c44; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$currPos; + s4 = peg$parseHexDigit(); + + if (s4 !== peg$FAILED) { + s5 = peg$parseHexDigit(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f37(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseUnicodeEscapeSequence() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 117) { + s1 = peg$c45; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$currPos; + s4 = peg$parseHexDigit(); + + if (s4 !== peg$FAILED) { + s5 = peg$parseHexDigit(); + + if (s5 !== peg$FAILED) { + s6 = peg$parseHexDigit(); + + if (s6 !== peg$FAILED) { + s7 = peg$parseHexDigit(); + + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f37(s2); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseDecimalDigit() { + var s0; + + if (peg$r1.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseHexDigit() { + var s0; + + if (peg$r2.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseAnyMatcher() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + rule$expects(peg$e24); + + if (input.charCodeAt(peg$currPos) === 46) { + s1 = peg$c46; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f38(); + } + + s0 = s1; + return s0; + } + + function peg$parseCodeBlock() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + rule$expects(peg$e25); + peg$silentFails++; + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c47; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + s2 = peg$parseCode(); + + if (input.charCodeAt(peg$currPos) === 125) { + s3 = peg$c48; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s0 = s2; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c47; + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f39(); + } + + s0 = s1; + } + + peg$silentFails--; + return s0; + } + + function peg$parseCode() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = []; + s2 = []; + s3 = peg$currPos; + s4 = peg$currPos; + peg$begin(); + + if (peg$r3.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + peg$end(true); + + if (s5 === peg$FAILED) { + s4 = undefined; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$currPos; + peg$begin(); + + if (peg$r3.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + peg$end(true); + + if (s5 === peg$FAILED) { + s4 = undefined; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 123) { + s3 = peg$c47; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s4 = peg$parseCode(); + + if (input.charCodeAt(peg$currPos) === 125) { + s5 = peg$c48; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s3 = [s3, s4, s5]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } + + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = []; + s3 = peg$currPos; + s4 = peg$currPos; + peg$begin(); + + if (peg$r3.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + peg$end(true); + + if (s5 === peg$FAILED) { + s4 = undefined; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$currPos; + peg$begin(); + + if (peg$r3.test(input.charAt(peg$currPos))) { + s5 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + peg$end(true); + + if (s5 === peg$FAILED) { + s4 = undefined; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + } else { + s2 = peg$FAILED; + } + + if (s2 === peg$FAILED) { + s2 = peg$currPos; + + if (input.charCodeAt(peg$currPos) === 123) { + s3 = peg$c47; + peg$currPos++; + } else { + s3 = peg$FAILED; + } + + if (s3 !== peg$FAILED) { + s4 = peg$parseCode(); + + if (input.charCodeAt(peg$currPos) === 125) { + s5 = peg$c48; + peg$currPos++; + } else { + s5 = peg$FAILED; + } + + if (s5 !== peg$FAILED) { + s3 = [s3, s4, s5]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } + } + + s0 = input.substring(s0, peg$currPos); + return s0; + } + + function peg$parseLl() { + var s0; + + if (peg$r4.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLm() { + var s0; + + if (peg$r5.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLo() { + var s0; + + if (peg$r6.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLt() { + var s0; + + if (peg$r7.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLu() { + var s0; + + if (peg$r8.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseMc() { + var s0; + + if (peg$r9.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseMn() { + var s0; + + if (peg$r10.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNd() { + var s0; + + if (peg$r11.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNl() { + var s0; + + if (peg$r12.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsePc() { + var s0; + + if (peg$r13.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseZs() { + var s0; + + if (peg$r14.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parse__() { + var s0, s1; + + s0 = []; + s1 = peg$parseWhiteSpace(); + + if (s1 === peg$FAILED) { + s1 = peg$parseLineTerminatorSequence(); + + if (s1 === peg$FAILED) { + s1 = peg$parseComment(); + } + } + + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parseWhiteSpace(); + + if (s1 === peg$FAILED) { + s1 = peg$parseLineTerminatorSequence(); + + if (s1 === peg$FAILED) { + s1 = peg$parseComment(); + } + } + } + + return s0; + } + + function peg$parse_() { + var s0, s1; + + s0 = []; + s1 = peg$parseWhiteSpace(); + + if (s1 === peg$FAILED) { + s1 = peg$parseMultiLineCommentNoLineTerminator(); + } + + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parseWhiteSpace(); + + if (s1 === peg$FAILED) { + s1 = peg$parseMultiLineCommentNoLineTerminator(); + } + } + + return s0; + } + + function peg$parseEOS() { + var s0, s1, s2, s3; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + s1 = peg$parse__(); + rule$expects(peg$e26); + + if (input.charCodeAt(peg$currPos) === 59) { + s2 = peg$c49; + peg$currPos++; + } else { + s2 = peg$FAILED; + } + + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse_(); + s2 = peg$parseSingleLineComment(); + + if (s2 === peg$FAILED) { + s2 = null; + } + + s3 = peg$parseLineTerminatorSequence(); + + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse__(); + s2 = peg$parseEOF(); + + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + + return s0; + } + + function peg$parseEOF() { + var s0, s1; + + var rule$expects = function rule$expects(expected) { + if (peg$silentFails === 0) peg$expect(expected); + }; + + s0 = peg$currPos; + peg$begin(); + rule$expects(peg$e12); + + if (input.length > peg$currPos) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + } + + peg$end(true); + + if (s1 === peg$FAILED) { + s0 = undefined; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + var pick = true; + var RESERVED_WORDS = {}; + var reservedWords = options.reservedWords || util.reservedWords; + if (Array.isArray(reservedWords)) reservedWords.forEach(function (word) { + RESERVED_WORDS[word] = true; + }); + + function createNode(type, details) { + var node = new ast.Node(type, location()); + if (details === null) return node; + util.extend(node, details); + return util.enforceFastProperties(node); + } + + var comments = options.extractComments ? {} : null; + + function addComment(text, multiline) { + if (options.extractComments) { + var loc = location(); + comments[loc.start.offset] = { + text: text, + multiline: multiline, + location: loc + }; + } + + return text; + } + + peg$begin(); + peg$result = peg$startRuleFunction(); + + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$expect(peg$endExpectation()); + } + + throw peg$buildError(); + } + } + + var parser = { + SyntaxError: peg$SyntaxError, + parse: peg$parse + }; + + function fatal(message, location) { + if (typeof location !== "undefined") throw new grammarError(message, location); + throw new Error(message); + } + + var Session = function () { + function Session(config) { + _classCallCheck(this, Session); + + config = typeof config !== "undefined" ? config : {}; + this.opcodes = config.opcodes || opcodes_1; + this.parser = config.parser || parser; + this.passes = config.passes || {}; + this.visitor = config.visitor || ast.visitor; + this.vm = config.vm || vm; + if (typeof config.warn === "function") this.warn = config.warn; + if (typeof config.error === "function") this.error = config.error; + Object.defineProperty(this, "fatal", { + value: fatal + }); + } + + _createClass(Session, [{ + key: "parse", + value: function parse(input, options) { + return this.parser.parse(input, options); + } + }, { + key: "buildVisitor", + value: function buildVisitor(functions) { + return this.visitor.build(functions); + } + }, { + key: "warn", + value: function warn(_message, _location) {} + }, { + key: "error", + value: function error(message, location) { + fatal(message, location); + } + }]); + + return Session; + }(); + + var session = Session; + + var compiler = { + Session: session, + passes: { + check: { + reportUndefinedRules: reportUndefinedRules_1, + reportDuplicateRules: reportDuplicateRules_1, + reportUnusedRules: reportUnusedRules_1, + reportDuplicateLabels: reportDuplicateLabels_1, + reportInfiniteRecursion: reportInfiniteRecursion_1, + reportInfiniteRepetition: reportInfiniteRepetition_1, + reportIncorrectPlucking: reportIncorrectPlucking_1 + }, + transform: { + removeProxyRules: removeProxyRules_1 + }, + generate: { + calcReportFailures: calcReportFailures_1, + inferenceMatchResult: inferenceMatchResult_1, + generateBytecode: generateBytecode_1, + generateJS: generateJs + } + }, + compile: function compile(ast, session$$1, options) { + options = typeof options !== "undefined" ? options : {}; + options = util.processOptions(options, { + allowedStartRules: [ast.rules[0].name], + cache: false, + context: {}, + dependencies: {}, + exportVar: null, + features: null, + format: "bare", + header: null, + optimize: "speed", + output: "parser", + trace: false + }); + if (options.output === "parser") options.format = "umd"; + util.each(session$$1.passes, function (stage) { + stage.forEach(function (pass) { + pass(ast, session$$1, options); + }); + }); + + switch (options.output) { + case "parser": + return session$$1.vm.evalModule(ast.code, options.context); + + case "source": + return ast.code; + + default: + session$$1.error("Invalid output format: ".concat(options.output, ".")); + } + } + }; + var compiler_1 = compiler; + + var peg = { + VERSION: require$$0.version, + GrammarError: grammarError, + ast: ast, + parser: parser, + compiler: compiler_1, + util: util, + generate: function generate(grammar, options) { + options = typeof options !== "undefined" ? options : {}; + var session = new compiler_1.Session({ + passes: util.convertPasses(compiler_1.passes) + }); + if (Array.isArray(options.plugins)) options.plugins.forEach(function (p) { + if (typeof p.use !== "function") return; + p.use(session, options); + }); + return compiler_1.compile(session.parse(grammar, options.parser || {}), session, options); + } + }; + var peg_1 = peg; + + // This is an `every` implementation that works for all iterables + var every = function every(obj, fn) { + var pass = true; + + try { + /* eslint-disable-next-line local-rules/no-prototype-methods */ + obj.forEach(function() { + if (!fn.apply(this, arguments)) { + // Throwing an error is the only way to break `forEach` + throw new Error(); + } + }); + } catch (e) { + pass = false; + } + + return pass; + }; + + var functionName = function functionName(func) { + return ( + func.displayName || + func.name || + // Use function decomposition as a last resort to get function + // name. Does not rely on function decomposition to work - if it + // doesn't debugging will be slightly less informative + // (i.e. toString will say 'spy' rather than 'myFunc'). + (String(func).match(/function ([^\s\(]+)/) || [])[1] + ); + }; + + var call$1 = Function.call; + + var copyPrototype = function copyPrototypeMethods(prototype) { + /* eslint-disable local-rules/no-prototype-methods */ + return Object.getOwnPropertyNames(prototype).reduce(function(result, name) { + // ignore size because it throws from Map + if ( + name !== "size" && + name !== "caller" && + name !== "callee" && + name !== "arguments" && + typeof prototype[name] === "function" + ) { + result[name] = call$1.bind(prototype[name]); + } + + return result; + }, Object.create(null)); + }; + + var array = copyPrototype(Array.prototype); + + var _function = copyPrototype(Function.prototype); + + var object = copyPrototype(Object.prototype); + + var string = copyPrototype(String.prototype); + + var prototypes = { + array: array, + function: _function, + object: object, + string: string + }; + + var commonjsGlobal$1 = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function commonjsRequire$1 () { + throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); + } + + function unwrapExports$1 (x) { + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; + } + + function createCommonjsModule$1(fn, module) { + return module = { exports: {} }, fn(module, module.exports), module.exports; + } + + var typeDetect$1 = createCommonjsModule$1(function (module, exports) { + (function (global, factory) { + module.exports = factory(); + }(commonjsGlobal$1, (function () { + /* ! + * type-detect + * Copyright(c) 2013 jake luer + * MIT Licensed + */ + var promiseExists = typeof Promise === 'function'; + + /* eslint-disable no-undef */ + var globalObject = typeof self === 'object' ? self : commonjsGlobal$1; // eslint-disable-line id-blacklist + + var symbolExists = typeof Symbol !== 'undefined'; + var mapExists = typeof Map !== 'undefined'; + var setExists = typeof Set !== 'undefined'; + var weakMapExists = typeof WeakMap !== 'undefined'; + var weakSetExists = typeof WeakSet !== 'undefined'; + var dataViewExists = typeof DataView !== 'undefined'; + var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined'; + var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined'; + var setEntriesExists = setExists && typeof Set.prototype.entries === 'function'; + var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function'; + var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries()); + var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries()); + var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function'; + var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]()); + var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function'; + var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]()); + var toStringLeftSliceLength = 8; + var toStringRightSliceLength = -1; + /** + * ### typeOf (obj) + * + * Uses `Object.prototype.toString` to determine the type of an object, + * normalising behaviour across engine versions & well optimised. + * + * @param {Mixed} object + * @return {String} object type + * @api public + */ + function typeDetect(obj) { + /* ! Speed optimisation + * Pre: + * string literal x 3,039,035 ops/sec ±1.62% (78 runs sampled) + * boolean literal x 1,424,138 ops/sec ±4.54% (75 runs sampled) + * number literal x 1,653,153 ops/sec ±1.91% (82 runs sampled) + * undefined x 9,978,660 ops/sec ±1.92% (75 runs sampled) + * function x 2,556,769 ops/sec ±1.73% (77 runs sampled) + * Post: + * string literal x 38,564,796 ops/sec ±1.15% (79 runs sampled) + * boolean literal x 31,148,940 ops/sec ±1.10% (79 runs sampled) + * number literal x 32,679,330 ops/sec ±1.90% (78 runs sampled) + * undefined x 32,363,368 ops/sec ±1.07% (82 runs sampled) + * function x 31,296,870 ops/sec ±0.96% (83 runs sampled) + */ + var typeofObj = typeof obj; + if (typeofObj !== 'object') { + return typeofObj; + } + + /* ! Speed optimisation + * Pre: + * null x 28,645,765 ops/sec ±1.17% (82 runs sampled) + * Post: + * null x 36,428,962 ops/sec ±1.37% (84 runs sampled) + */ + if (obj === null) { + return 'null'; + } + + /* ! Spec Conformance + * Test: `Object.prototype.toString.call(window)`` + * - Node === "[object global]" + * - Chrome === "[object global]" + * - Firefox === "[object Window]" + * - PhantomJS === "[object Window]" + * - Safari === "[object Window]" + * - IE 11 === "[object Window]" + * - IE Edge === "[object Window]" + * Test: `Object.prototype.toString.call(this)`` + * - Chrome Worker === "[object global]" + * - Firefox Worker === "[object DedicatedWorkerGlobalScope]" + * - Safari Worker === "[object DedicatedWorkerGlobalScope]" + * - IE 11 Worker === "[object WorkerGlobalScope]" + * - IE Edge Worker === "[object WorkerGlobalScope]" + */ + if (obj === globalObject) { + return 'global'; + } + + /* ! Speed optimisation + * Pre: + * array literal x 2,888,352 ops/sec ±0.67% (82 runs sampled) + * Post: + * array literal x 22,479,650 ops/sec ±0.96% (81 runs sampled) + */ + if ( + Array.isArray(obj) && + (symbolToStringTagExists === false || !(Symbol.toStringTag in obj)) + ) { + return 'Array'; + } + + // Not caching existence of `window` and related properties due to potential + // for `window` to be unset before tests in quasi-browser environments. + if (typeof window === 'object' && window !== null) { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/browsers.html#location) + * WhatWG HTML$7.7.3 - The `Location` interface + * Test: `Object.prototype.toString.call(window.location)`` + * - IE <=11 === "[object Object]" + * - IE Edge <=13 === "[object Object]" + */ + if (typeof window.location === 'object' && obj === window.location) { + return 'Location'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#document) + * WhatWG HTML$3.1.1 - The `Document` object + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * WhatWG HTML states: + * > For historical reasons, Window objects must also have a + * > writable, configurable, non-enumerable property named + * > HTMLDocument whose value is the Document interface object. + * Test: `Object.prototype.toString.call(document)`` + * - Chrome === "[object HTMLDocument]" + * - Firefox === "[object HTMLDocument]" + * - Safari === "[object HTMLDocument]" + * - IE <=10 === "[object Document]" + * - IE 11 === "[object HTMLDocument]" + * - IE Edge <=13 === "[object HTMLDocument]" + */ + if (typeof window.document === 'object' && obj === window.document) { + return 'Document'; + } + + if (typeof window.navigator === 'object') { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray) + * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray + * Test: `Object.prototype.toString.call(navigator.mimeTypes)`` + * - IE <=10 === "[object MSMimeTypesCollection]" + */ + if (typeof window.navigator.mimeTypes === 'object' && + obj === window.navigator.mimeTypes) { + return 'MimeTypeArray'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) + * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray + * Test: `Object.prototype.toString.call(navigator.plugins)`` + * - IE <=10 === "[object MSPluginsCollection]" + */ + if (typeof window.navigator.plugins === 'object' && + obj === window.navigator.plugins) { + return 'PluginArray'; + } + } + + if ((typeof window.HTMLElement === 'function' || + typeof window.HTMLElement === 'object') && + obj instanceof window.HTMLElement) { + /* ! Spec Conformance + * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) + * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement` + * Test: `Object.prototype.toString.call(document.createElement('blockquote'))`` + * - IE <=10 === "[object HTMLBlockElement]" + */ + if (obj.tagName === 'BLOCKQUOTE') { + return 'HTMLQuoteElement'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#htmltabledatacellelement) + * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement` + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * Test: Object.prototype.toString.call(document.createElement('td')) + * - Chrome === "[object HTMLTableCellElement]" + * - Firefox === "[object HTMLTableCellElement]" + * - Safari === "[object HTMLTableCellElement]" + */ + if (obj.tagName === 'TD') { + return 'HTMLTableDataCellElement'; + } + + /* ! Spec Conformance + * (https://html.spec.whatwg.org/#htmltableheadercellelement) + * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement` + * Note: Most browsers currently adher to the W3C DOM Level 2 spec + * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) + * which suggests that browsers should use HTMLTableCellElement for + * both TD and TH elements. WhatWG separates these. + * Test: Object.prototype.toString.call(document.createElement('th')) + * - Chrome === "[object HTMLTableCellElement]" + * - Firefox === "[object HTMLTableCellElement]" + * - Safari === "[object HTMLTableCellElement]" + */ + if (obj.tagName === 'TH') { + return 'HTMLTableHeaderCellElement'; + } + } + } + + /* ! Speed optimisation + * Pre: + * Float64Array x 625,644 ops/sec ±1.58% (80 runs sampled) + * Float32Array x 1,279,852 ops/sec ±2.91% (77 runs sampled) + * Uint32Array x 1,178,185 ops/sec ±1.95% (83 runs sampled) + * Uint16Array x 1,008,380 ops/sec ±2.25% (80 runs sampled) + * Uint8Array x 1,128,040 ops/sec ±2.11% (81 runs sampled) + * Int32Array x 1,170,119 ops/sec ±2.88% (80 runs sampled) + * Int16Array x 1,176,348 ops/sec ±5.79% (86 runs sampled) + * Int8Array x 1,058,707 ops/sec ±4.94% (77 runs sampled) + * Uint8ClampedArray x 1,110,633 ops/sec ±4.20% (80 runs sampled) + * Post: + * Float64Array x 7,105,671 ops/sec ±13.47% (64 runs sampled) + * Float32Array x 5,887,912 ops/sec ±1.46% (82 runs sampled) + * Uint32Array x 6,491,661 ops/sec ±1.76% (79 runs sampled) + * Uint16Array x 6,559,795 ops/sec ±1.67% (82 runs sampled) + * Uint8Array x 6,463,966 ops/sec ±1.43% (85 runs sampled) + * Int32Array x 5,641,841 ops/sec ±3.49% (81 runs sampled) + * Int16Array x 6,583,511 ops/sec ±1.98% (80 runs sampled) + * Int8Array x 6,606,078 ops/sec ±1.74% (81 runs sampled) + * Uint8ClampedArray x 6,602,224 ops/sec ±1.77% (83 runs sampled) + */ + var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]); + if (typeof stringTag === 'string') { + return stringTag; + } + + var objPrototype = Object.getPrototypeOf(obj); + /* ! Speed optimisation + * Pre: + * regex literal x 1,772,385 ops/sec ±1.85% (77 runs sampled) + * regex constructor x 2,143,634 ops/sec ±2.46% (78 runs sampled) + * Post: + * regex literal x 3,928,009 ops/sec ±0.65% (78 runs sampled) + * regex constructor x 3,931,108 ops/sec ±0.58% (84 runs sampled) + */ + if (objPrototype === RegExp.prototype) { + return 'RegExp'; + } + + /* ! Speed optimisation + * Pre: + * date x 2,130,074 ops/sec ±4.42% (68 runs sampled) + * Post: + * date x 3,953,779 ops/sec ±1.35% (77 runs sampled) + */ + if (objPrototype === Date.prototype) { + return 'Date'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag) + * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be "Promise": + * Test: `Object.prototype.toString.call(Promise.resolve())`` + * - Chrome <=47 === "[object Object]" + * - Edge <=20 === "[object Object]" + * - Firefox 29-Latest === "[object Promise]" + * - Safari 7.1-Latest === "[object Promise]" + */ + if (promiseExists && objPrototype === Promise.prototype) { + return 'Promise'; + } + + /* ! Speed optimisation + * Pre: + * set x 2,222,186 ops/sec ±1.31% (82 runs sampled) + * Post: + * set x 4,545,879 ops/sec ±1.13% (83 runs sampled) + */ + if (setExists && objPrototype === Set.prototype) { + return 'Set'; + } + + /* ! Speed optimisation + * Pre: + * map x 2,396,842 ops/sec ±1.59% (81 runs sampled) + * Post: + * map x 4,183,945 ops/sec ±6.59% (82 runs sampled) + */ + if (mapExists && objPrototype === Map.prototype) { + return 'Map'; + } + + /* ! Speed optimisation + * Pre: + * weakset x 1,323,220 ops/sec ±2.17% (76 runs sampled) + * Post: + * weakset x 4,237,510 ops/sec ±2.01% (77 runs sampled) + */ + if (weakSetExists && objPrototype === WeakSet.prototype) { + return 'WeakSet'; + } + + /* ! Speed optimisation + * Pre: + * weakmap x 1,500,260 ops/sec ±2.02% (78 runs sampled) + * Post: + * weakmap x 3,881,384 ops/sec ±1.45% (82 runs sampled) + */ + if (weakMapExists && objPrototype === WeakMap.prototype) { + return 'WeakMap'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag) + * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be "DataView": + * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))`` + * - Edge <=13 === "[object Object]" + */ + if (dataViewExists && objPrototype === DataView.prototype) { + return 'DataView'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag) + * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be "Map Iterator": + * Test: `Object.prototype.toString.call(new Map().entries())`` + * - Edge <=13 === "[object Object]" + */ + if (mapExists && objPrototype === mapIteratorPrototype) { + return 'Map Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag) + * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be "Set Iterator": + * Test: `Object.prototype.toString.call(new Set().entries())`` + * - Edge <=13 === "[object Object]" + */ + if (setExists && objPrototype === setIteratorPrototype) { + return 'Set Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag) + * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be "Array Iterator": + * Test: `Object.prototype.toString.call([][Symbol.iterator]())`` + * - Edge <=13 === "[object Object]" + */ + if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) { + return 'Array Iterator'; + } + + /* ! Spec Conformance + * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag) + * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be "String Iterator": + * Test: `Object.prototype.toString.call(''[Symbol.iterator]())`` + * - Edge <=13 === "[object Object]" + */ + if (stringIteratorExists && objPrototype === stringIteratorPrototype) { + return 'String Iterator'; + } + + /* ! Speed optimisation + * Pre: + * object from null x 2,424,320 ops/sec ±1.67% (76 runs sampled) + * Post: + * object from null x 5,838,000 ops/sec ±0.99% (84 runs sampled) + */ + if (objPrototype === null) { + return 'Object'; + } + + return Object + .prototype + .toString + .call(obj) + .slice(toStringLeftSliceLength, toStringRightSliceLength); + } + + return typeDetect; + + }))); + }); + + var typeOf = function typeOf(value) { + return typeDetect$1(value).toLowerCase(); + }; + + function valueToString(value) { + if (value && value.toString) { + /* eslint-disable-next-line local-rules/no-prototype-methods */ + return value.toString(); + } + return String(value); + } + + var valueToString_1 = valueToString; + + var lib = { + every: every, + functionName: functionName, + prototypes: prototypes, + typeOf: typeOf, + valueToString: valueToString_1 + }; + + var arrayProto = lib.prototypes.array; + var hasOwnProperty = lib.prototypes.object.hasOwnProperty; + + var join = arrayProto.join; + var push = arrayProto.push; + var slice = arrayProto.slice; + + // Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug + var hasDontEnumBug = (function() { + var obj = { + constructor: function() { + return "0"; + }, + toString: function() { + return "1"; + }, + valueOf: function() { + return "2"; + }, + toLocaleString: function() { + return "3"; + }, + prototype: function() { + return "4"; + }, + isPrototypeOf: function() { + return "5"; + }, + propertyIsEnumerable: function() { + return "6"; + }, + hasOwnProperty: function() { + return "7"; + }, + length: function() { + return "8"; + }, + unique: function() { + return "9"; + } + }; + + var result = []; + for (var prop in obj) { + if (hasOwnProperty(obj, prop)) { + push(result, obj[prop]()); + } + } + return join(result, "") !== "0123456789"; + })(); + + /* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will + * override properties in previous sources. + * + * target - The Object to extend + * sources - Objects to copy properties from. + * + * Returns the extended target + */ + var extend = function extend(target /*, sources */) { + var sources = slice(arguments, 1); + var source, i, prop; + + for (i = 0; i < sources.length; i++) { + source = sources[i]; + + for (prop in source) { + if (hasOwnProperty(source, prop)) { + target[prop] = source[prop]; + } + } + + // Make sure we copy (own) toString method even when in JScript with DontEnum bug + // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug + if (hasDontEnumBug && hasOwnProperty(source, "toString") && source.toString !== target.toString) { + target.toString = source.toString; + } + } + + return target; + }; + + /* istanbul ignore next : not testing that setTimeout works */ + function nextTick(callback) { + setTimeout(callback, 0); + } + + var getNextTick = function getNextTick(process, setImmediate) { + if (typeof process === "object" && typeof process.nextTick === "function") { + return process.nextTick; + } + + if (typeof setImmediate === "function") { + return setImmediate; + } + + return nextTick; + }; + + /* istanbul ignore next */ + var root = typeof window !== "undefined" ? window : commonjsGlobal$1; + + var nextTick$1 = getNextTick(root.process, root.setImmediate); + + var arrayProto$1 = lib.prototypes.array; + + var functionName$1 = lib.functionName; + + var valueToString$1 = lib.valueToString; + + var concat = arrayProto$1.concat; + var forEach = arrayProto$1.forEach; + var join$1 = arrayProto$1.join; + var reverse = arrayProto$1.reverse; + var slice$1 = arrayProto$1.slice; + + var useLeftMostCallback = -1; + var useRightMostCallback = -2; + + function getCallback(behavior, args) { + var callArgAt = behavior.callArgAt; + + if (callArgAt >= 0) { + return args[callArgAt]; + } + + var argumentList; + + if (callArgAt === useLeftMostCallback) { + argumentList = args; + } + + if (callArgAt === useRightMostCallback) { + argumentList = reverse(slice$1(args)); + } + + var callArgProp = behavior.callArgProp; + + for (var i = 0, l = argumentList.length; i < l; ++i) { + if (!callArgProp && typeof argumentList[i] === "function") { + return argumentList[i]; + } + + if (callArgProp && argumentList[i] && typeof argumentList[i][callArgProp] === "function") { + return argumentList[i][callArgProp]; + } + } + + return null; + } + + function getCallbackError(behavior, func, args) { + if (behavior.callArgAt < 0) { + var msg; + + if (behavior.callArgProp) { + msg = + functionName$1(behavior.stub) + + " expected to yield to '" + + valueToString$1(behavior.callArgProp) + + "', but no object with such a property was passed."; + } else { + msg = functionName$1(behavior.stub) + " expected to yield, but no callback was passed."; + } + + if (args.length > 0) { + msg += " Received [" + join$1(args, ", ") + "]"; + } + + return msg; + } + + return "argument at index " + behavior.callArgAt + " is not a function: " + func; + } + + function ensureArgs(name, behavior, args) { + // map function name to internal property + // callsArg => callArgAt + var property = name.replace(/sArg/, "ArgAt"); + var index = behavior[property]; + + if (index >= args.length) { + throw new TypeError( + name + " failed: " + (index + 1) + " arguments required but only " + args.length + " present" + ); + } + } + + function callCallback(behavior, args) { + if (typeof behavior.callArgAt === "number") { + ensureArgs("callsArg", behavior, args); + var func = getCallback(behavior, args); + + if (typeof func !== "function") { + throw new TypeError(getCallbackError(behavior, func, args)); + } + + if (behavior.callbackAsync) { + nextTick$1(function() { + func.apply(behavior.callbackContext, behavior.callbackArguments); + }); + } else { + return func.apply(behavior.callbackContext, behavior.callbackArguments); + } + } + + return undefined; + } + + var proto = { + create: function create(stub) { + var behavior = extend({}, proto); + delete behavior.create; + delete behavior.addBehavior; + delete behavior.createBehavior; + behavior.stub = stub; + + if (stub.defaultBehavior && stub.defaultBehavior.promiseLibrary) { + behavior.promiseLibrary = stub.defaultBehavior.promiseLibrary; + } + + return behavior; + }, + + isPresent: function isPresent() { + return ( + typeof this.callArgAt === "number" || + this.exception || + this.exceptionCreator || + typeof this.returnArgAt === "number" || + this.returnThis || + typeof this.resolveArgAt === "number" || + this.resolveThis || + typeof this.throwArgAt === "number" || + this.fakeFn || + this.returnValueDefined + ); + }, + + invoke: function invoke(context, args) { + /* + * callCallback (conditionally) calls ensureArgs + * + * Note: callCallback intentionally happens before + * everything else and cannot be moved lower + */ + var returnValue = callCallback(this, args); + + if (this.exception) { + throw this.exception; + } else if (this.exceptionCreator) { + this.exception = this.exceptionCreator(); + this.exceptionCreator = undefined; + throw this.exception; + } else if (typeof this.returnArgAt === "number") { + ensureArgs("returnsArg", this, args); + return args[this.returnArgAt]; + } else if (this.returnThis) { + return context; + } else if (typeof this.throwArgAt === "number") { + ensureArgs("throwsArg", this, args); + throw args[this.throwArgAt]; + } else if (this.fakeFn) { + return this.fakeFn.apply(context, args); + } else if (typeof this.resolveArgAt === "number") { + ensureArgs("resolvesArg", this, args); + return (this.promiseLibrary || Promise).resolve(args[this.resolveArgAt]); + } else if (this.resolveThis) { + return (this.promiseLibrary || Promise).resolve(context); + } else if (this.resolve) { + return (this.promiseLibrary || Promise).resolve(this.returnValue); + } else if (this.reject) { + return (this.promiseLibrary || Promise).reject(this.returnValue); + } else if (this.callsThrough) { + return this.stub.wrappedMethod.apply(context, args); + } else if (typeof this.returnValue !== "undefined") { + return this.returnValue; + } else if (typeof this.callArgAt === "number") { + return returnValue; + } + + return this.returnValue; + }, + + onCall: function onCall(index) { + return this.stub.onCall(index); + }, + + onFirstCall: function onFirstCall() { + return this.stub.onFirstCall(); + }, + + onSecondCall: function onSecondCall() { + return this.stub.onSecondCall(); + }, + + onThirdCall: function onThirdCall() { + return this.stub.onThirdCall(); + }, + + withArgs: function withArgs(/* arguments */) { + throw new Error( + 'Defining a stub by invoking "stub.onCall(...).withArgs(...)" ' + + 'is not supported. Use "stub.withArgs(...).onCall(...)" ' + + "to define sequential behavior for calls with certain arguments." + ); + } + }; + + function createAsyncVersion(syncFnName) { + return function() { + var result = this[syncFnName].apply(this, arguments); + this.callbackAsync = true; + return result; + }; + } + + // create asynchronous versions of callsArg* and yields* methods + forEach(Object.keys(proto), function(method) { + // need to avoid creating anotherasync versions of the newly added async methods + if (method.match(/^(callsArg|yields)/) && !method.match(/Async/)) { + proto[method + "Async"] = createAsyncVersion(method); + } + }); + + function createBehavior(behaviorMethod) { + return function() { + this.defaultBehavior = this.defaultBehavior || proto.create(this); + this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments); + return this; + }; + } + + function addBehavior(stub, name, fn) { + proto[name] = function() { + fn.apply(this, concat([this], slice$1(arguments))); + return this.stub || this; + }; + + stub[name] = createBehavior(name); + } + + proto.addBehavior = addBehavior; + proto.createBehavior = createBehavior; + var behavior = proto; + + var forEach$1 = lib.prototypes.array.forEach; + + function walkInternal(obj, iterator, context, originalObj, seen) { + var proto, prop; + + if (typeof Object.getOwnPropertyNames !== "function") { + // We explicitly want to enumerate through all of the prototype's properties + // in this case, therefore we deliberately leave out an own property check. + /* eslint-disable-next-line guard-for-in */ + for (prop in obj) { + iterator.call(context, obj[prop], prop, obj); + } + + return; + } + + forEach$1(Object.getOwnPropertyNames(obj), function(k) { + if (seen[k] !== true) { + seen[k] = true; + var target = typeof Object.getOwnPropertyDescriptor(obj, k).get === "function" ? originalObj : obj; + iterator.call(context, k, target); + } + }); + + proto = Object.getPrototypeOf(obj); + if (proto) { + walkInternal(proto, iterator, context, originalObj, seen); + } + } + + /* Walks the prototype chain of an object and iterates over every own property + * name encountered. The iterator is called in the same fashion that Array.prototype.forEach + * works, where it is passed the value, key, and own object as the 1st, 2nd, and 3rd positional + * argument, respectively. In cases where Object.getOwnPropertyNames is not available, walk will + * default to using a simple for..in loop. + * + * obj - The object to walk the prototype chain for. + * iterator - The function to be called on each pass of the walk. + * context - (Optional) When given, the iterator will be called with this object as the receiver. + */ + var walk = function walk(obj, iterator, context) { + return walkInternal(obj, iterator, context, obj, {}); + }; + + var getPropertyDescriptor = function getPropertyDescriptor(object, property) { + var proto = object; + var descriptor; + + while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) { + proto = Object.getPrototypeOf(proto); + } + return descriptor; + }; + + var hasOwnProperty$1 = lib.prototypes.object.hasOwnProperty; + var push$1 = lib.prototypes.array.push; + + function collectMethod(methods, object, prop, propOwner) { + if (typeof getPropertyDescriptor(propOwner, prop).value === "function" && hasOwnProperty$1(object, prop)) { + push$1(methods, object[prop]); + } + } + + // This function returns an array of all the own methods on the passed object + function collectOwnMethods(object) { + var methods = []; + + walk(object, collectMethod.bind(null, methods, object)); + + return methods; + } + + var collectOwnMethods_1 = collectOwnMethods; + + /** + * Verify if an object is a ECMAScript Module + * + * As the exports from a module is immutable we cannot alter the exports + * using spies or stubs. Let the consumer know this to avoid bug reports + * on weird error messages. + * + * @param {Object} object The object to examine + * + * @returns {Boolean} true when the object is a module + */ + var isEsModule = function(object) { + return ( + object && typeof Symbol !== "undefined" && object[Symbol.toStringTag] === "Module" && Object.isSealed(object) + ); + }; + + function isPropertyConfigurable(obj, propName) { + var propertyDescriptor = getPropertyDescriptor(obj, propName); + + return propertyDescriptor ? propertyDescriptor.configurable : true; + } + + var isPropertyConfigurable_1 = isPropertyConfigurable; + + function isNonExistentOwnProperty(object, property) { + return object && typeof property !== "undefined" && !(property in object); + } + + var isNonExistentOwnProperty_1 = isNonExistentOwnProperty; + + var o = Object.prototype; + + function getClass(value) { + // Returns the internal [[Class]] by calling Object.prototype.toString + // with the provided value as this. Return value is a string, naming the + // internal class, e.g. "Array" + return o.toString.call(value).split(/[ \]]/)[1]; + } + + var getClass_1 = getClass; + + function isNaN$1$1(value) { + // Unlike global isNaN, this avoids type coercion + // typeof check avoids IE host object issues, hat tip to + // lodash + var val = value; // JsLint thinks value !== value is "weird" + return typeof value === "number" && value !== val; + } + + var isNan = isNaN$1$1; + + /** + * @name samsam.isNegZero + * @param Object value + * + * Returns ``true`` if ``value`` is ``-0``. + */ + function isNegZero(value) { + return value === 0 && 1 / value === -Infinity; + } + + var isNegZero_1 = isNegZero; + + /** + * @name samsam.equal + * @param Object obj1 + * @param Object obj2 + * + * Returns ``true`` if two objects are strictly equal. Compared to + * ``===`` there are two exceptions: + * + * - NaN is considered equal to NaN + * - -0 and +0 are not considered equal + */ + function identical(obj1, obj2) { + if (obj1 === obj2 || (isNan(obj1) && isNan(obj2))) { + return obj1 !== 0 || isNegZero_1(obj1) === isNegZero_1(obj2); + } + + return false; + } + + var identical_1 = identical; + + /** + * @name samsam.isArguments + * @param Object object + * + * Returns ``true`` if ``object`` is an ``arguments`` object, + * ``false`` otherwise. + */ + function isArguments(object) { + if (getClass_1(object) === "Arguments") { + return true; + } + if ( + typeof object !== "object" || + typeof object.length !== "number" || + getClass_1(object) === "Array" + ) { + return false; + } + if (typeof object.callee === "function") { + return true; + } + try { + object[object.length] = 6; + delete object[object.length]; + } catch (e) { + return true; + } + return false; + } + + var isArguments_1 = isArguments; + + function isDate(value) { + return value instanceof Date; + } + + var isDate_1 = isDate; + + var div = typeof document !== "undefined" && document.createElement("div"); + + /** + * @name samsam.isElement + * @param Object object + * + * Returns ``true`` if ``object`` is a DOM element node. Unlike + * Underscore.js/lodash, this function will return ``false`` if ``object`` + * is an *element-like* object, i.e. a regular object with a ``nodeType`` + * property that holds the value ``1``. + */ + function isElement(object) { + if (!object || object.nodeType !== 1 || !div) { + return false; + } + try { + object.appendChild(div); + object.removeChild(div); + } catch (e) { + return false; + } + return true; + } + + var isElement_1 = isElement; + + // Returns true when the value is a regular Object and not a specialized Object + // + // This helps speeding up deepEqual cyclic checks + // The premise is that only Objects are stored in the visited array. + // So if this function returns false, we don't have to do the + // expensive operation of searching for the value in the the array of already + // visited objects + function isObject(value) { + return ( + typeof value === "object" && + value !== null && + // none of these are collection objects, so we can return false + !(value instanceof Boolean) && + !(value instanceof Date) && + !(value instanceof Error) && + !(value instanceof Number) && + !(value instanceof RegExp) && + !(value instanceof String) + ); + } + + var isObject_1 = isObject; + + function isSet(val) { + return (typeof Set !== "undefined" && val instanceof Set) || false; + } + + var isSet_1 = isSet; + + function isSubset(s1, s2, compare) { + var allContained = true; + s1.forEach(function(v1) { + var includes = false; + s2.forEach(function(v2) { + if (compare(v2, v1)) { + includes = true; + } + }); + allContained = allContained && includes; + }); + + return allContained; + } + + var isSubset_1 = isSubset; + + var re = /function (\w+)\s*\(/; + + function getClassName(value) { + if (value.constructor && "name" in value.constructor) { + return value.constructor.name; + } + + if (typeof value.constructor === "function") { + var match = value.constructor.toString().match(re); + if (match.length > 1) { + return match[1]; + } + } + + return null; + } + + var getClassName_1 = getClassName; + + var every$1 = Array.prototype.every; + var getTime = Date.prototype.getTime; + var hasOwnProperty$2 = Object.prototype.hasOwnProperty; + var indexOf = Array.prototype.indexOf; + var keys = Object.keys; + + /** + * @name samsam.deepEqual + * @param Object first + * @param Object second + * + * Deep equal comparison. Two values are "deep equal" if: + * + * - They are equal, according to samsam.identical + * - They are both date objects representing the same time + * - They are both arrays containing elements that are all deepEqual + * - They are objects with the same set of properties, and each property + * in ``first`` is deepEqual to the corresponding property in ``second`` + * + * Supports cyclic objects. + */ + function deepEqualCyclic(first, second) { + // used for cyclic comparison + // contain already visited objects + var objects1 = []; + var objects2 = []; + // contain pathes (position in the object structure) + // of the already visited objects + // indexes same as in objects arrays + var paths1 = []; + var paths2 = []; + // contains combinations of already compared objects + // in the manner: { "$1['ref']$2['ref']": true } + var compared = {}; + + // does the recursion for the deep equal check + return (function deepEqual(obj1, obj2, path1, path2) { + var type1 = typeof obj1; + var type2 = typeof obj2; + + // == null also matches undefined + if ( + obj1 === obj2 || + isNan(obj1) || + isNan(obj2) || + obj1 == null || + obj2 == null || + type1 !== "object" || + type2 !== "object" + ) { + return identical_1(obj1, obj2); + } + + // Elements are only equal if identical(expected, actual) + if (isElement_1(obj1) || isElement_1(obj2)) { + return false; + } + + var isDate1 = isDate_1(obj1); + var isDate2 = isDate_1(obj2); + if (isDate1 || isDate2) { + if ( + !isDate1 || + !isDate2 || + getTime.call(obj1) !== getTime.call(obj2) + ) { + return false; + } + } + + if (obj1 instanceof RegExp && obj2 instanceof RegExp) { + if (obj1.toString() !== obj2.toString()) { + return false; + } + } + + if (obj1 instanceof Error && obj2 instanceof Error) { + if ( + obj1.constructor !== obj2.constructor || + obj1.message !== obj2.message || + obj1.stack !== obj2.stack + ) { + return false; + } + } + + var class1 = getClass_1(obj1); + var class2 = getClass_1(obj2); + var keys1 = keys(obj1); + var keys2 = keys(obj2); + var name1 = getClassName_1(obj1); + var name2 = getClassName_1(obj2); + + if (isArguments_1(obj1) || isArguments_1(obj2)) { + if (obj1.length !== obj2.length) { + return false; + } + } else { + if ( + type1 !== type2 || + class1 !== class2 || + keys1.length !== keys2.length || + (name1 && name2 && name1 !== name2) + ) { + return false; + } + } + + if (isSet_1(obj1) || isSet_1(obj2)) { + if (!isSet_1(obj1) || !isSet_1(obj2) || obj1.size !== obj2.size) { + return false; + } + + return isSubset_1(obj1, obj2, deepEqual); + } + + return every$1.call(keys1, function(key) { + if (!hasOwnProperty$2.call(obj2, key)) { + return false; + } + + var value1 = obj1[key]; + var value2 = obj2[key]; + var isObject1 = isObject_1(value1); + var isObject2 = isObject_1(value2); + // determines, if the objects were already visited + // (it's faster to check for isObject first, than to + // get -1 from getIndex for non objects) + var index1 = isObject1 ? indexOf.call(objects1, value1) : -1; + var index2 = isObject2 ? indexOf.call(objects2, value2) : -1; + // determines the new paths of the objects + // - for non cyclic objects the current path will be extended + // by current property name + // - for cyclic objects the stored path is taken + var newPath1 = + index1 !== -1 + ? paths1[index1] + : path1 + "[" + JSON.stringify(key) + "]"; + var newPath2 = + index2 !== -1 + ? paths2[index2] + : path2 + "[" + JSON.stringify(key) + "]"; + var combinedPath = newPath1 + newPath2; + + // stop recursion if current objects are already compared + if (compared[combinedPath]) { + return true; + } + + // remember the current objects and their paths + if (index1 === -1 && isObject1) { + objects1.push(value1); + paths1.push(newPath1); + } + if (index2 === -1 && isObject2) { + objects2.push(value2); + paths2.push(newPath2); + } + + // remember that the current objects are already compared + if (isObject1 && isObject2) { + compared[combinedPath] = true; + } + + // End of cyclic logic + + // neither value1 nor value2 is a cycle + // continue with next level + return deepEqual(value1, value2, newPath1, newPath2); + }); + })(first, second, "$1", "$2"); + } + + var deepEqual$1 = deepEqualCyclic; + + function arrayContains(array, subset, compare) { + if (subset.length === 0) { + return true; + } + var i, l, j, k; + for (i = 0, l = array.length; i < l; ++i) { + if (compare(array[i], subset[0])) { + for (j = 0, k = subset.length; j < k; ++j) { + if (i + j >= l) { + return false; + } + if (!compare(array[i + j], subset[j])) { + return false; + } + } + return true; + } + } + return false; + } + + /** + * @name samsam.match + * @param Object object + * @param Object matcher + * + * Compare arbitrary value ``object`` with matcher. + */ + function match(object, matcher) { + if (matcher && typeof matcher.test === "function") { + return matcher.test(object); + } + + if (typeof matcher === "function") { + return matcher(object) === true; + } + + if (typeof matcher === "string") { + matcher = matcher.toLowerCase(); + var notNull = typeof object === "string" || !!object; + return ( + notNull && + String(object) + .toLowerCase() + .indexOf(matcher) >= 0 + ); + } + + if (typeof matcher === "number") { + return matcher === object; + } + + if (typeof matcher === "boolean") { + return matcher === object; + } + + if (typeof matcher === "undefined") { + return typeof object === "undefined"; + } + + if (matcher === null) { + return object === null; + } + + if (isSet_1(object)) { + return isSubset_1(matcher, object, match); + } + + if (getClass_1(object) === "Array" && getClass_1(matcher) === "Array") { + return arrayContains(object, matcher, match); + } + + if (isDate_1(matcher)) { + return isDate_1(object) && object.getTime() === matcher.getTime(); + } + + if (matcher && typeof matcher === "object") { + if (matcher === object) { + return true; + } + var prop; + // eslint-disable-next-line guard-for-in + for (prop in matcher) { + var value = object[prop]; + if ( + typeof value === "undefined" && + typeof object.getAttribute === "function" + ) { + value = object.getAttribute(prop); + } + if ( + matcher[prop] === null || + typeof matcher[prop] === "undefined" + ) { + if (value !== matcher[prop]) { + return false; + } + } else if ( + typeof value === "undefined" || + !match(value, matcher[prop]) + ) { + return false; + } + } + return true; + } + + throw new Error( + "Matcher was not a string, a number, a " + + "function, a boolean or an object" + ); + } + + var match_1 = match; + + var samsam = { + isArguments: isArguments_1, + isElement: isElement_1, + isNegZero: isNegZero_1, + identical: identical_1, + deepEqual: deepEqual$1, + match: match_1 + }; + + var deepEqual_1 = createCommonjsModule$1(function (module) { + + var arrayProto = lib.prototypes.array; + var toString = lib.prototypes.object.toString; + + + var every = arrayProto.every; + var join = arrayProto.join; + var sort = arrayProto.sort; + + function isReallyNaN(val) { + // eslint-disable-next-line no-self-compare + return val !== val; + } + + var deepEqual = (module.exports = function deepEqual(a, b, matcher) { + if (a === null && b === null) { + return true; + } + + if (typeof a !== "object" || typeof b !== "object") { + return (isReallyNaN(a) && isReallyNaN(b)) || a === b; + } + + if (a instanceof Error && b instanceof Error) { + return a === b; + } + + if (toString(a) !== toString(b)) { + return false; + } + + if (join(sort(Object.keys(a))) !== join(sort(Object.keys(b)))) { + return false; + } + + if (samsam.deepEqual(a, b)) { + return true; + } + + if (matcher) { + var keys = Object.keys(a); + var allKeysMatch = every(keys, function(key) { + return matcher(a[key], b[key]); + }); + + return keys.length > 0 && allKeysMatch; + } + + return false; + }); + + deepEqual.use = function(match) { + return function deepEqual$matcher(a, b) { + // If both are matchers they must be the same instance in order to be considered equal + // If we didn't do that we would end up running one matcher against the other + if (match.isMatcher(a)) { + if (match.isMatcher(b)) { + return a === b; + } + return a.test(b); + } + + return deepEqual(a, b, deepEqual$matcher); + }; + }; + }); + + // This is an `every` implementation that works for all iterables + var every$2 = function every(obj, fn) { + var pass = true; + + try { + /* eslint-disable-next-line local-rules/no-prototype-methods */ + obj.forEach(function() { + if (!fn.apply(this, arguments)) { + // Throwing an error is the only way to break `forEach` + throw new Error(); + } + }); + } catch (e) { + pass = false; + } + + return pass; + }; + + /** + * lodash (Custom Build) + * Build: `lodash modularize exports="npm" -o ./` + * Copyright jQuery Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ + + /** Used as the `TypeError` message for "Functions" methods. */ + var FUNC_ERROR_TEXT = 'Expected a function'; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0; + + /** `Object#toString` result references. */ + var funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + symbolTag = '[object Symbol]'; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + reLeadingDot = /^\./, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof commonjsGlobal$1 == 'object' && commonjsGlobal$1 && commonjsGlobal$1.Object === Object && commonjsGlobal$1; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root$1 = freeGlobal || freeSelf || Function('return this')(); + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Checks if `value` is a host object in IE < 9. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a host object, else `false`. + */ + function isHostObject(value) { + // Many host objects are `Object` objects that can coerce to strings + // despite having improperly defined `toString` methods. + var result = false; + if (value != null && typeof value.toString != 'function') { + try { + result = !!(value + ''); + } catch (e) {} + } + return result; + } + + /** Used for built-in method references. */ + var arrayProto$2 = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = root$1['__core-js_shared__']; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty$3 = objectProto.hasOwnProperty; + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var objectToString = objectProto.toString; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty$3).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Symbol$1 = root$1.Symbol, + splice = arrayProto$2.splice; + + /* Built-in method references that are verified to be native. */ + var Map$1 = getNative(root$1, 'Map'), + nativeCreate = getNative(Object, 'create'); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol$1 ? Symbol$1.prototype : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + } + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + return this.has(key) && delete this.__data__[key]; + } + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty$3.call(data, key) ? data[key] : undefined; + } + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? data[key] !== undefined : hasOwnProperty$3.call(data, key); + } + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + } + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + return true; + } + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries ? entries.length : 0; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.__data__ = { + 'hash': new Hash, + 'map': new (Map$1 || ListCache), + 'string': new Hash + }; + } + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + return getMapData(this, key)['delete'](key); + } + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + getMapData(this, key).set(key, value); + return this; + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = isKey(path, object) ? [path] : castPath(path); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject$1(value) || isMasked(value)) { + return false; + } + var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value) { + return isArray(value) ? value : stringToPath(value); + } + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoize(function(string) { + string = toString$1(string); + + var result = []; + if (reLeadingDot.test(string)) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, string) { + result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to process. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result); + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } + + // Assign cache to `_.memoize`. + memoize.Cache = MapCache; + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 8-9 which returns 'object' for typed array and other constructors. + var tag = isObject$1(value) ? objectToString.call(value) : ''; + return tag == funcTag || tag == genTag; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject$1(value) { + var type = typeof value; + return !!value && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return !!value && typeof value == 'object'; + } + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && objectToString.call(value) == symbolTag); + } + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {string} Returns the string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString$1(value) { + return value == null ? '' : baseToString(value); + } + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + var lodash_get = get; + + var typeOf$1 = function typeOf(value) { + return typeDetect$1(value).toLowerCase(); + }; + + var slice$2 = lib.prototypes.string.slice; + + + var iterableToString = function iterableToString(obj) { + var representation = ""; + + function stringify(item) { + return typeof item === "string" ? "'" + item + "'" : String(item); + } + + function mapToString(map) { + /* eslint-disable-next-line local-rules/no-prototype-methods */ + map.forEach(function(value, key) { + representation += "[" + stringify(key) + "," + stringify(value) + "],"; + }); + + representation = slice$2(representation, 0, -1); + return representation; + } + + function genericIterableToString(iterable) { + /* eslint-disable-next-line local-rules/no-prototype-methods */ + iterable.forEach(function(value) { + representation += stringify(value) + ","; + }); + + representation = slice$2(representation, 0, -1); + return representation; + } + + if (typeOf$1(obj) === "map") { + return mapToString(obj); + } + + return genericIterableToString(obj); + }; + + var arrayProto$3 = lib.prototypes.array; + var deepEqual$1$1 = deepEqual_1.use(match$1); // eslint-disable-line no-use-before-define + + var functionName$2 = lib.functionName; + + + var objectProto$1 = lib.prototypes.object; + var stringProto = lib.prototypes.string; + + var valueToString$2 = lib.valueToString; + + var arrayIndexOf = arrayProto$3.indexOf; + var arrayEvery = arrayProto$3.every; + var join$2 = arrayProto$3.join; + var map = arrayProto$3.map; + var some = arrayProto$3.some; + + var hasOwnProperty$4 = objectProto$1.hasOwnProperty; + var isPrototypeOf = objectProto$1.isPrototypeOf; + + var stringIndexOf = stringProto.indexOf; + + function assertType(value, type, name) { + var actual = typeOf$1(value); + if (actual !== type) { + throw new TypeError("Expected type of " + name + " to be " + type + ", but was " + actual); + } + } + + function assertMethodExists(value, method, name, methodPath) { + if (typeof value[method] === "undefined") { + throw new TypeError("Expected " + name + " to have method " + methodPath); + } + } + + var matcher = { + toString: function() { + return this.message; + } + }; + + function isMatcher(object) { + return isPrototypeOf(matcher, object); + } + + function matchObject(expectation, actual) { + if (actual === null || actual === undefined) { + return false; + } + + return arrayEvery(Object.keys(expectation), function(key) { + var exp = expectation[key]; + var act = actual[key]; + + if (isMatcher(exp)) { + if (!exp.test(act)) { + return false; + } + } else if (typeOf$1(exp) === "object") { + if (!matchObject(exp, act)) { + return false; + } + } else if (!deepEqual$1$1(exp, act)) { + return false; + } + + return true; + }); + } + + var TYPE_MAP = { + function: function(m, expectation, message) { + m.test = expectation; + m.message = message || "match(" + functionName$2(expectation) + ")"; + }, + number: function(m, expectation) { + m.test = function(actual) { + // we need type coercion here + return expectation == actual; // eslint-disable-line eqeqeq + }; + }, + object: function(m, expectation) { + var array = []; + + if (typeof expectation.test === "function") { + m.test = function(actual) { + return expectation.test(actual) === true; + }; + m.message = "match(" + functionName$2(expectation.test) + ")"; + return m; + } + + array = map(Object.keys(expectation), function(key) { + return key + ": " + valueToString$2(expectation[key]); + }); + + m.test = function(actual) { + return matchObject(expectation, actual); + }; + m.message = "match(" + join$2(array, ", ") + ")"; + + return m; + }, + regexp: function(m, expectation) { + m.test = function(actual) { + return typeof actual === "string" && expectation.test(actual); + }; + }, + string: function(m, expectation) { + m.test = function(actual) { + return typeof actual === "string" && stringIndexOf(actual, expectation) !== -1; + }; + m.message = 'match("' + expectation + '")'; + } + }; + + function match$1(expectation, message) { + var m = Object.create(matcher); + var type = typeOf$1(expectation); + + if (type in TYPE_MAP) { + TYPE_MAP[type](m, expectation, message); + } else { + m.test = function(actual) { + return deepEqual$1$1(expectation, actual); + }; + } + + if (!m.message) { + m.message = "match(" + valueToString$2(expectation) + ")"; + } + + return m; + } + + matcher.or = function(m2) { + var matcher2 = m2; + if (!arguments.length) { + throw new TypeError("Matcher expected"); + } else if (!isMatcher(m2)) { + matcher2 = match$1(m2); + } + var m1 = this; + var or = Object.create(matcher); + or.test = function(actual) { + return m1.test(actual) || matcher2.test(actual); + }; + or.message = m1.message + ".or(" + matcher2.message + ")"; + return or; + }; + + matcher.and = function(m2) { + var matcher2 = m2; + if (!arguments.length) { + throw new TypeError("Matcher expected"); + } else if (!isMatcher(m2)) { + matcher2 = match$1(m2); + } + var m1 = this; + var and = Object.create(matcher); + and.test = function(actual) { + return m1.test(actual) && matcher2.test(actual); + }; + and.message = m1.message + ".and(" + matcher2.message + ")"; + return and; + }; + + match$1.isMatcher = isMatcher; + + match$1.any = match$1(function() { + return true; + }, "any"); + + match$1.defined = match$1(function(actual) { + return actual !== null && actual !== undefined; + }, "defined"); + + match$1.truthy = match$1(function(actual) { + return Boolean(actual); + }, "truthy"); + + match$1.falsy = match$1(function(actual) { + return !actual; + }, "falsy"); + + match$1.same = function(expectation) { + return match$1(function(actual) { + return expectation === actual; + }, "same(" + valueToString$2(expectation) + ")"); + }; + + match$1.in = function(arrayOfExpectations) { + if (!Array.isArray(arrayOfExpectations)) { + throw new TypeError("array expected"); + } + + return match$1(function(actual) { + return some(arrayOfExpectations, function(expectation) { + return expectation === actual; + }); + }, "in(" + valueToString$2(arrayOfExpectations) + ")"); + }; + + match$1.typeOf = function(type) { + assertType(type, "string", "type"); + return match$1(function(actual) { + return typeOf$1(actual) === type; + }, 'typeOf("' + type + '")'); + }; + + match$1.instanceOf = function(type) { + if (typeof Symbol === "undefined" || typeof Symbol.hasInstance === "undefined") { + assertType(type, "function", "type"); + } else { + assertMethodExists(type, Symbol.hasInstance, "type", "[Symbol.hasInstance]"); + } + return match$1(function(actual) { + return actual instanceof type; + }, "instanceOf(" + (functionName$2(type) || Object.prototype.toString.call(type)) + ")"); + }; + + function createPropertyMatcher(propertyTest, messagePrefix) { + return function(property, value) { + assertType(property, "string", "property"); + var onlyProperty = arguments.length === 1; + var message = messagePrefix + '("' + property + '"'; + if (!onlyProperty) { + message += ", " + valueToString$2(value); + } + message += ")"; + return match$1(function(actual) { + if (actual === undefined || actual === null || !propertyTest(actual, property)) { + return false; + } + return onlyProperty || deepEqual$1$1(value, actual[property]); + }, message); + }; + } + + match$1.has = createPropertyMatcher(function(actual, property) { + if (typeof actual === "object") { + return property in actual; + } + return actual[property] !== undefined; + }, "has"); + + match$1.hasOwn = createPropertyMatcher(function(actual, property) { + return hasOwnProperty$4(actual, property); + }, "hasOwn"); + + match$1.hasNested = function(property, value) { + assertType(property, "string", "property"); + var onlyProperty = arguments.length === 1; + var message = 'hasNested("' + property + '"'; + if (!onlyProperty) { + message += ", " + valueToString$2(value); + } + message += ")"; + return match$1(function(actual) { + if (actual === undefined || actual === null || lodash_get(actual, property) === undefined) { + return false; + } + return onlyProperty || deepEqual$1$1(value, lodash_get(actual, property)); + }, message); + }; + + match$1.every = function(predicate) { + if (!isMatcher(predicate)) { + throw new TypeError("Matcher expected"); + } + + return match$1(function(actual) { + if (typeOf$1(actual) === "object") { + return every$2(Object.keys(actual), function(key) { + return predicate.test(actual[key]); + }); + } + + return ( + Boolean(actual) && + typeOf$1(actual.forEach) === "function" && + every$2(actual, function(element) { + return predicate.test(element); + }) + ); + }, "every(" + predicate.message + ")"); + }; + + match$1.some = function(predicate) { + if (!isMatcher(predicate)) { + throw new TypeError("Matcher expected"); + } + + return match$1(function(actual) { + if (typeOf$1(actual) === "object") { + return !every$2(Object.keys(actual), function(key) { + return !predicate.test(actual[key]); + }); + } + + return ( + Boolean(actual) && + typeOf$1(actual.forEach) === "function" && + !every$2(actual, function(element) { + return !predicate.test(element); + }) + ); + }, "some(" + predicate.message + ")"); + }; + + match$1.array = match$1.typeOf("array"); + + match$1.array.deepEquals = function(expectation) { + return match$1(function(actual) { + // Comparing lengths is the fastest way to spot a difference before iterating through every item + var sameLength = actual.length === expectation.length; + return ( + typeOf$1(actual) === "array" && + sameLength && + every$2(actual, function(element, index) { + return expectation[index] === element; + }) + ); + }, "deepEquals([" + iterableToString(expectation) + "])"); + }; + + match$1.array.startsWith = function(expectation) { + return match$1(function(actual) { + return ( + typeOf$1(actual) === "array" && + every$2(expectation, function(expectedElement, index) { + return actual[index] === expectedElement; + }) + ); + }, "startsWith([" + iterableToString(expectation) + "])"); + }; + + match$1.array.endsWith = function(expectation) { + return match$1(function(actual) { + // This indicates the index in which we should start matching + var offset = actual.length - expectation.length; + + return ( + typeOf$1(actual) === "array" && + every$2(expectation, function(expectedElement, index) { + return actual[offset + index] === expectedElement; + }) + ); + }, "endsWith([" + iterableToString(expectation) + "])"); + }; + + match$1.array.contains = function(expectation) { + return match$1(function(actual) { + return ( + typeOf$1(actual) === "array" && + every$2(expectation, function(expectedElement) { + return arrayIndexOf(actual, expectedElement) !== -1; + }) + ); + }, "contains([" + iterableToString(expectation) + "])"); + }; + + match$1.map = match$1.typeOf("map"); + + match$1.map.deepEquals = function mapDeepEquals(expectation) { + return match$1(function(actual) { + // Comparing lengths is the fastest way to spot a difference before iterating through every item + var sameLength = actual.size === expectation.size; + return ( + typeOf$1(actual) === "map" && + sameLength && + every$2(actual, function(element, key) { + return expectation.has(key) && expectation.get(key) === element; + }) + ); + }, "deepEquals(Map[" + iterableToString(expectation) + "])"); + }; + + match$1.map.contains = function mapContains(expectation) { + return match$1(function(actual) { + return ( + typeOf$1(actual) === "map" && + every$2(expectation, function(element, key) { + return actual.has(key) && actual.get(key) === element; + }) + ); + }, "contains(Map[" + iterableToString(expectation) + "])"); + }; + + match$1.set = match$1.typeOf("set"); + + match$1.set.deepEquals = function setDeepEquals(expectation) { + return match$1(function(actual) { + // Comparing lengths is the fastest way to spot a difference before iterating through every item + var sameLength = actual.size === expectation.size; + return ( + typeOf$1(actual) === "set" && + sameLength && + every$2(actual, function(element) { + return expectation.has(element); + }) + ); + }, "deepEquals(Set[" + iterableToString(expectation) + "])"); + }; + + match$1.set.contains = function setContains(expectation) { + return match$1(function(actual) { + return ( + typeOf$1(actual) === "set" && + every$2(expectation, function(element) { + return actual.has(element); + }) + ); + }, "contains(Set[" + iterableToString(expectation) + "])"); + }; + + match$1.bool = match$1.typeOf("boolean"); + match$1.number = match$1.typeOf("number"); + match$1.string = match$1.typeOf("string"); + match$1.object = match$1.typeOf("object"); + match$1.func = match$1.typeOf("function"); + match$1.regexp = match$1.typeOf("regexp"); + match$1.date = match$1.typeOf("date"); + match$1.symbol = match$1.typeOf("symbol"); + + var match_1$1 = match$1; + + var every$3 = Array.prototype.every; + + var calledInOrder = function calledInOrder(spies) { + var callMap = {}; + // eslint-disable-next-line no-underscore-dangle + var _spies = arguments.length > 1 ? arguments : spies; + + function hasCallsLeft(spy) { + if (callMap[spy.id] === undefined) { + callMap[spy.id] = 0; + } + + return callMap[spy.id] < spy.callCount; + } + + return every$3.call(_spies, function checkAdjacentCalls(spy, i) { + var calledBeforeNext = true; + + if (i !== _spies.length - 1) { + calledBeforeNext = spy.calledBefore(_spies[i + 1]); + } + + if (hasCallsLeft(spy) && calledBeforeNext) { + callMap[spy.id] += 1; + return true; + } + + return false; + }); + }; + + var sort = lib.prototypes.array.sort; + + var orderByFirstCall = function orderByFirstCall(spies) { + return sort(spies, function(a, b) { + // uuid, won't ever be equal + var aCall = a.getCall(0); + var bCall = b.getCall(0); + var aId = (aCall && aCall.callId) || -1; + var bId = (bCall && bCall.callId) || -1; + + return aId < bId ? -1 : 1; + }); + }; + + var array$1 = [null, "once", "twice", "thrice"]; + + var timesInWords = function timesInWords(count) { + return array$1[count] || (count || 0) + " times"; + }; + + var o$1 = Object.prototype; + + function getClass$1(value) { + // Returns the internal [[Class]] by calling Object.prototype.toString + // with the provided value as this. Return value is a string, naming the + // internal class, e.g. "Array" + return o$1.toString.call(value).split(/[ \]]/)[1]; + } + + var getClass_1$1 = getClass$1; + + function isNaN$2$1(value) { + // Unlike global isNaN, this avoids type coercion + // typeof check avoids IE host object issues, hat tip to + // lodash + var val = value; // JsLint thinks value !== value is "weird" + return typeof value === "number" && value !== val; + } + + var isNan$1 = isNaN$2$1; + + /** + * @name samsam.isNegZero + * @param Object value + * + * Returns ``true`` if ``value`` is ``-0``. + */ + function isNegZero$1(value) { + return value === 0 && 1 / value === -Infinity; + } + + var isNegZero_1$1 = isNegZero$1; + + /** + * @name samsam.equal + * @param Object obj1 + * @param Object obj2 + * + * Returns ``true`` if two objects are strictly equal. Compared to + * ``===`` there are two exceptions: + * + * - NaN is considered equal to NaN + * - -0 and +0 are not considered equal + */ + function identical$1(obj1, obj2) { + if (obj1 === obj2 || (isNan$1(obj1) && isNan$1(obj2))) { + return obj1 !== 0 || isNegZero_1$1(obj1) === isNegZero_1$1(obj2); + } + + return false; + } + + var identical_1$1 = identical$1; + + /** + * @name samsam.isArguments + * @param Object object + * + * Returns ``true`` if ``object`` is an ``arguments`` object, + * ``false`` otherwise. + */ + function isArguments$1(object) { + if (getClass_1$1(object) === "Arguments") { + return true; + } + if ( + typeof object !== "object" || + typeof object.length !== "number" || + getClass_1$1(object) === "Array" + ) { + return false; + } + if (typeof object.callee === "function") { + return true; + } + try { + object[object.length] = 6; + delete object[object.length]; + } catch (e) { + return true; + } + return false; + } + + var isArguments_1$1 = isArguments$1; + + function isDate$1(value) { + return value instanceof Date; + } + + var isDate_1$1 = isDate$1; + + var div$1 = typeof document !== "undefined" && document.createElement("div"); + + /** + * @name samsam.isElement + * @param Object object + * + * Returns ``true`` if ``object`` is a DOM element node. Unlike + * Underscore.js/lodash, this function will return ``false`` if ``object`` + * is an *element-like* object, i.e. a regular object with a ``nodeType`` + * property that holds the value ``1``. + */ + function isElement$1(object) { + if (!object || object.nodeType !== 1 || !div$1) { + return false; + } + try { + object.appendChild(div$1); + object.removeChild(div$1); + } catch (e) { + return false; + } + return true; + } + + var isElement_1$1 = isElement$1; + + // Returns true when the value is a regular Object and not a specialized Object + // + // This helps speeding up deepEqual cyclic checks + // The premise is that only Objects are stored in the visited array. + // So if this function returns false, we don't have to do the + // expensive operation of searching for the value in the the array of already + // visited objects + function isObject$2(value) { + return ( + typeof value === "object" && + value !== null && + // none of these are collection objects, so we can return false + !(value instanceof Boolean) && + !(value instanceof Date) && + !(value instanceof Error) && + !(value instanceof Number) && + !(value instanceof RegExp) && + !(value instanceof String) + ); + } + + var isObject_1$1 = isObject$2; + + function isSet$1(val) { + return (typeof Set !== "undefined" && val instanceof Set) || false; + } + + var isSet_1$1 = isSet$1; + + // Production steps of ECMA-262, Edition 6, 22.1.2.1 + // Reference: http://www.ecma-international.org/ecma-262/6.0/#sec-array.from + var polyfill = (function() { + var isCallable = function(fn) { + return typeof fn === 'function'; + }; + var toInteger = function (value) { + var number = Number(value); + if (isNaN(number)) { return 0; } + if (number === 0 || !isFinite(number)) { return number; } + return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); + }; + var maxSafeInteger = Math.pow(2, 53) - 1; + var toLength = function (value) { + var len = toInteger(value); + return Math.min(Math.max(len, 0), maxSafeInteger); + }; + var iteratorProp = function(value) { + if(value != null) { + if(['string','number','boolean','symbol'].indexOf(typeof value) > -1){ + return Symbol.iterator; + } else if ( + (typeof Symbol !== 'undefined') && + ('iterator' in Symbol) && + (Symbol.iterator in value) + ) { + return Symbol.iterator; + } + // Support "@@iterator" placeholder, Gecko 27 to Gecko 35 + else if ('@@iterator' in value) { + return '@@iterator'; + } + } + }; + var getMethod = function(O, P) { + // Assert: IsPropertyKey(P) is true. + if (O != null && P != null) { + // Let func be GetV(O, P). + var func = O[P]; + // ReturnIfAbrupt(func). + // If func is either undefined or null, return undefined. + if(func == null) { + return void 0; + } + // If IsCallable(func) is false, throw a TypeError exception. + if (!isCallable(func)) { + throw new TypeError(func + ' is not a function'); + } + return func; + } + }; + var iteratorStep = function(iterator) { + // Let result be IteratorNext(iterator). + // ReturnIfAbrupt(result). + var result = iterator.next(); + // Let done be IteratorComplete(result). + // ReturnIfAbrupt(done). + var done = Boolean(result.done); + // If done is true, return false. + if(done) { + return false; + } + // Return result. + return result; + }; + + // The length property of the from method is 1. + return function from(items /*, mapFn, thisArg */ ) { + + // 1. Let C be the this value. + var C = this; + + // 2. If mapfn is undefined, let mapping be false. + var mapFn = arguments.length > 1 ? arguments[1] : void 0; + + var T; + if (typeof mapFn !== 'undefined') { + // 3. else + // a. If IsCallable(mapfn) is false, throw a TypeError exception. + if (!isCallable(mapFn)) { + throw new TypeError( + 'Array.from: when provided, the second argument must be a function' + ); + } + + // b. If thisArg was supplied, let T be thisArg; else let T + // be undefined. + if (arguments.length > 2) { + T = arguments[2]; + } + // c. Let mapping be true (implied by mapFn) + } + + var A, k; + + // 4. Let usingIterator be GetMethod(items, @@iterator). + // 5. ReturnIfAbrupt(usingIterator). + var usingIterator = getMethod(items, iteratorProp(items)); + + // 6. If usingIterator is not undefined, then + if (usingIterator !== void 0) { + // a. If IsConstructor(C) is true, then + // i. Let A be the result of calling the [[Construct]] + // internal method of C with an empty argument list. + // b. Else, + // i. Let A be the result of the abstract operation ArrayCreate + // with argument 0. + // c. ReturnIfAbrupt(A). + A = isCallable(C) ? Object(new C()) : []; + + // d. Let iterator be GetIterator(items, usingIterator). + var iterator = usingIterator.call(items); + + // e. ReturnIfAbrupt(iterator). + if (iterator == null) { + throw new TypeError( + 'Array.from requires an array-like or iterable object' + ); + } + + // f. Let k be 0. + k = 0; + + // g. Repeat + var next, nextValue; + while (true) { + // i. Let Pk be ToString(k). + // ii. Let next be IteratorStep(iterator). + // iii. ReturnIfAbrupt(next). + next = iteratorStep(iterator); + + // iv. If next is false, then + if (!next) { + + // 1. Let setStatus be Set(A, "length", k, true). + // 2. ReturnIfAbrupt(setStatus). + A.length = k; + + // 3. Return A. + return A; + } + // v. Let nextValue be IteratorValue(next). + // vi. ReturnIfAbrupt(nextValue) + nextValue = next.value; + + // vii. If mapping is true, then + // 1. Let mappedValue be Call(mapfn, T, «nextValue, k»). + // 2. If mappedValue is an abrupt completion, return + // IteratorClose(iterator, mappedValue). + // 3. Let mappedValue be mappedValue.[[value]]. + // viii. Else, let mappedValue be nextValue. + // ix. Let defineStatus be the result of + // CreateDataPropertyOrThrow(A, Pk, mappedValue). + // x. [TODO] If defineStatus is an abrupt completion, return + // IteratorClose(iterator, defineStatus). + if (mapFn) { + A[k] = mapFn.call(T, nextValue, k); + } + else { + A[k] = nextValue; + } + // xi. Increase k by 1. + k++; + } + // 7. Assert: items is not an Iterable so assume it is + // an array-like object. + } else { + + // 8. Let arrayLike be ToObject(items). + var arrayLike = Object(items); + + // 9. ReturnIfAbrupt(items). + if (items == null) { + throw new TypeError( + 'Array.from requires an array-like object - not null or undefined' + ); + } + + // 10. Let len be ToLength(Get(arrayLike, "length")). + // 11. ReturnIfAbrupt(len). + var len = toLength(arrayLike.length); + + // 12. If IsConstructor(C) is true, then + // a. Let A be Construct(C, «len»). + // 13. Else + // a. Let A be ArrayCreate(len). + // 14. ReturnIfAbrupt(A). + A = isCallable(C) ? Object(new C(len)) : new Array(len); + + // 15. Let k be 0. + k = 0; + // 16. Repeat, while k < len… (also steps a - h) + var kValue; + while (k < len) { + kValue = arrayLike[k]; + if (mapFn) { + A[k] = mapFn.call(T, kValue, k); + } + else { + A[k] = kValue; + } + k++; + } + // 17. Let setStatus be Set(A, "length", len, true). + // 18. ReturnIfAbrupt(setStatus). + A.length = len; + // 19. Return A. + } + return A; + }; + })(); + + var arrayFrom = (typeof Array.from === 'function' ? + Array.from : + polyfill + ); + + function isSubset$1(s1, s2, compare) { + // FIXME: IE11 doesn't support Array.from + // Potential solutions: + // - contribute a patch to https://github.com/Volox/eslint-plugin-ie11#readme + // - https://github.com/mathiasbynens/Array.from (doesn't work with matchers) + var values1 = arrayFrom(s1); + var values2 = arrayFrom(s2); + + for (var i = 0; i < values1.length; i++) { + var includes = false; + + for (var j = 0; j < values2.length; j++) { + if (compare(values2[j], values1[i])) { + includes = true; + break; + } + } + + if (!includes) { + return false; + } + } + + return true; + } + + var isSubset_1$1 = isSubset$1; + + function getClassName$1(value) { + return Object.getPrototypeOf(value) ? value.constructor.name : null; + } + + var getClassName_1$1 = getClassName$1; + + var every$4 = Array.prototype.every; + var getTime$1 = Date.prototype.getTime; + var hasOwnProperty$5 = Object.prototype.hasOwnProperty; + var indexOf$1 = Array.prototype.indexOf; + var keys$1 = Object.keys; + + /** + * @name samsam.deepEqual + * @param Object first + * @param Object second + * + * Deep equal comparison. Two values are "deep equal" if: + * + * - They are equal, according to samsam.identical + * - They are both date objects representing the same time + * - They are both arrays containing elements that are all deepEqual + * - They are objects with the same set of properties, and each property + * in ``first`` is deepEqual to the corresponding property in ``second`` + * + * Supports cyclic objects. + */ + function deepEqualCyclic$1(first, second) { + // used for cyclic comparison + // contain already visited objects + var objects1 = []; + var objects2 = []; + // contain pathes (position in the object structure) + // of the already visited objects + // indexes same as in objects arrays + var paths1 = []; + var paths2 = []; + // contains combinations of already compared objects + // in the manner: { "$1['ref']$2['ref']": true } + var compared = {}; + + // does the recursion for the deep equal check + return (function deepEqual(obj1, obj2, path1, path2) { + var type1 = typeof obj1; + var type2 = typeof obj2; + + // == null also matches undefined + if ( + obj1 === obj2 || + isNan$1(obj1) || + isNan$1(obj2) || + obj1 == null || + obj2 == null || + type1 !== "object" || + type2 !== "object" + ) { + return identical_1$1(obj1, obj2); + } + + // Elements are only equal if identical(expected, actual) + if (isElement_1$1(obj1) || isElement_1$1(obj2)) { + return false; + } + + var isDate1 = isDate_1$1(obj1); + var isDate2 = isDate_1$1(obj2); + if (isDate1 || isDate2) { + if ( + !isDate1 || + !isDate2 || + getTime$1.call(obj1) !== getTime$1.call(obj2) + ) { + return false; + } + } + + if (obj1 instanceof RegExp && obj2 instanceof RegExp) { + if (obj1.toString() !== obj2.toString()) { + return false; + } + } + + if (obj1 instanceof Error && obj2 instanceof Error) { + if (obj1.stack !== obj2.stack) { + return false; + } + } + + var class1 = getClass_1$1(obj1); + var class2 = getClass_1$1(obj2); + var keys1 = keys$1(obj1); + var keys2 = keys$1(obj2); + var name1 = getClassName_1$1(obj1); + var name2 = getClassName_1$1(obj2); + + if (isArguments_1$1(obj1) || isArguments_1$1(obj2)) { + if (obj1.length !== obj2.length) { + return false; + } + } else { + if ( + type1 !== type2 || + class1 !== class2 || + keys1.length !== keys2.length || + (name1 && name2 && name1 !== name2) + ) { + return false; + } + } + + if (isSet_1$1(obj1) || isSet_1$1(obj2)) { + if (!isSet_1$1(obj1) || !isSet_1$1(obj2) || obj1.size !== obj2.size) { + return false; + } + + return isSubset_1$1(obj1, obj2, deepEqual); + } + + return every$4.call(keys1, function(key) { + if (!hasOwnProperty$5.call(obj2, key)) { + return false; + } + + var value1 = obj1[key]; + var value2 = obj2[key]; + var isObject1 = isObject_1$1(value1); + var isObject2 = isObject_1$1(value2); + // determines, if the objects were already visited + // (it's faster to check for isObject first, than to + // get -1 from getIndex for non objects) + var index1 = isObject1 ? indexOf$1.call(objects1, value1) : -1; + var index2 = isObject2 ? indexOf$1.call(objects2, value2) : -1; + // determines the new paths of the objects + // - for non cyclic objects the current path will be extended + // by current property name + // - for cyclic objects the stored path is taken + var newPath1 = + index1 !== -1 + ? paths1[index1] + : path1 + "[" + JSON.stringify(key) + "]"; + var newPath2 = + index2 !== -1 + ? paths2[index2] + : path2 + "[" + JSON.stringify(key) + "]"; + var combinedPath = newPath1 + newPath2; + + // stop recursion if current objects are already compared + if (compared[combinedPath]) { + return true; + } + + // remember the current objects and their paths + if (index1 === -1 && isObject1) { + objects1.push(value1); + paths1.push(newPath1); + } + if (index2 === -1 && isObject2) { + objects2.push(value2); + paths2.push(newPath2); + } + + // remember that the current objects are already compared + if (isObject1 && isObject2) { + compared[combinedPath] = true; + } + + // End of cyclic logic + + // neither value1 nor value2 is a cycle + // continue with next level + return deepEqual(value1, value2, newPath1, newPath2); + }); + })(first, second, "$1", "$2"); + } + + var deepEqual$2 = deepEqualCyclic$1; + + function arrayContains$1(array, subset, compare) { + if (subset.length === 0) { + return true; + } + var i, l, j, k; + for (i = 0, l = array.length; i < l; ++i) { + if (compare(array[i], subset[0])) { + for (j = 0, k = subset.length; j < k; ++j) { + if (i + j >= l) { + return false; + } + if (!compare(array[i + j], subset[j])) { + return false; + } + } + return true; + } + } + return false; + } + + /** + * @name samsam.match + * @param Object object + * @param Object matcher + * + * Compare arbitrary value ``object`` with matcher. + */ + function match$2(object, matcher) { + if (matcher && typeof matcher.test === "function") { + return matcher.test(object); + } + + if (typeof matcher === "function") { + return matcher(object) === true; + } + + if (typeof matcher === "string") { + matcher = matcher.toLowerCase(); + var notNull = typeof object === "string" || !!object; + return ( + notNull && + String(object) + .toLowerCase() + .indexOf(matcher) >= 0 + ); + } + + if (typeof matcher === "number") { + return matcher === object; + } + + if (typeof matcher === "boolean") { + return matcher === object; + } + + if (typeof matcher === "undefined") { + return typeof object === "undefined"; + } + + if (matcher === null) { + return object === null; + } + + if (isSet_1$1(object)) { + return isSubset_1$1(matcher, object, match$2); + } + + if (getClass_1$1(object) === "Array" && getClass_1$1(matcher) === "Array") { + return arrayContains$1(object, matcher, match$2); + } + + if (isDate_1$1(matcher)) { + return isDate_1$1(object) && object.getTime() === matcher.getTime(); + } + + if (matcher && typeof matcher === "object") { + if (matcher === object) { + return true; + } + var prop; + // eslint-disable-next-line guard-for-in + for (prop in matcher) { + var value = object[prop]; + if ( + typeof value === "undefined" && + typeof object.getAttribute === "function" + ) { + value = object.getAttribute(prop); + } + if ( + matcher[prop] === null || + typeof matcher[prop] === "undefined" + ) { + if (value !== matcher[prop]) { + return false; + } + } else if ( + typeof value === "undefined" || + !match$2(value, matcher[prop]) + ) { + return false; + } + } + return true; + } + + throw new Error( + "Matcher was not a string, a number, a " + + "function, a boolean or an object" + ); + } + + var match_1$2 = match$2; + + var samsam$1 = { + isArguments: isArguments_1$1, + isElement: isElement_1$1, + isNegZero: isNegZero_1$1, + identical: identical_1$1, + deepEqual: deepEqual$2, + match: match_1$2 + }; + + var formatio = { + excludeConstructors: ["Object", /^.$/], + quoteStrings: true, + limitChildrenCount: 0 + }; + + var specialObjects = []; + if (typeof commonjsGlobal$1 !== "undefined") { + specialObjects.push({ object: commonjsGlobal$1, value: "[object global]" }); + } + if (typeof document !== "undefined") { + specialObjects.push({ + object: document, + value: "[object HTMLDocument]" + }); + } + if (typeof window !== "undefined") { + specialObjects.push({ object: window, value: "[object Window]" }); + } + + function functionName$3(func) { + if (!func) { return ""; } + if (func.displayName) { return func.displayName; } + if (func.name) { return func.name; } + var matches = func.toString().match(/function\s+([^\(]+)/m); + return (matches && matches[1]) || ""; + } + + function constructorName(f, object) { + var name = functionName$3(object && object.constructor); + var excludes = f.excludeConstructors || + formatio.excludeConstructors || []; + + var i, l; + for (i = 0, l = excludes.length; i < l; ++i) { + if (typeof excludes[i] === "string" && excludes[i] === name) { + return ""; + } else if (excludes[i].test && excludes[i].test(name)) { + return ""; + } + } + + return name; + } + + function isCircular(object, objects) { + if (typeof object !== "object") { return false; } + var i, l; + for (i = 0, l = objects.length; i < l; ++i) { + if (objects[i] === object) { return true; } + } + return false; + } + + function ascii(f, object, processed, indent) { + if (typeof object === "string") { + if (object.length === 0) { return "(empty string)"; } + var qs = f.quoteStrings; + var quote = typeof qs !== "boolean" || qs; + return processed || quote ? "\"" + object + "\"" : object; + } + + if (typeof object === "function" && !(object instanceof RegExp)) { + return ascii.func(object); + } + + processed = processed || []; + + if (isCircular(object, processed)) { return "[Circular]"; } + + if (Object.prototype.toString.call(object) === "[object Array]") { + return ascii.array.call(f, object, processed); + } + + if (!object) { return String((1 / object) === -Infinity ? "-0" : object); } + if (samsam$1.isElement(object)) { return ascii.element(object); } + + if (typeof object.toString === "function" && + object.toString !== Object.prototype.toString) { + return object.toString(); + } + + var i, l; + for (i = 0, l = specialObjects.length; i < l; i++) { + if (object === specialObjects[i].object) { + return specialObjects[i].value; + } + } + + if (typeof Set !== "undefined" && object instanceof Set) { + return ascii.set.call(f, object, processed); + } + + return ascii.object.call(f, object, processed, indent); + } + + ascii.func = function (func) { + return "function " + functionName$3(func) + "() {}"; + }; + + function delimit(str, delimiters) { + delimiters = delimiters || ["[", "]"]; + return delimiters[0] + str + delimiters[1]; + } + + ascii.array = function (array, processed, delimiters) { + processed = processed || []; + processed.push(array); + var pieces = []; + var i, l; + l = (this.limitChildrenCount > 0) ? + Math.min(this.limitChildrenCount, array.length) : array.length; + + for (i = 0; i < l; ++i) { + pieces.push(ascii(this, array[i], processed)); + } + + if (l < array.length) { + pieces.push("[... " + (array.length - l) + " more elements]"); + } + + return delimit(pieces.join(", "), delimiters); + }; + + ascii.set = function (set, processed) { + return ascii.array.call(this, Array.from(set), processed, ["Set {", "}"]); + }; + + ascii.object = function (object, processed, indent) { + processed = processed || []; + processed.push(object); + indent = indent || 0; + var pieces = []; + var properties = Object.keys(object).sort(); + var length = 3; + var prop, str, obj, i, k, l; + l = (this.limitChildrenCount > 0) ? + Math.min(this.limitChildrenCount, properties.length) : properties.length; + + for (i = 0; i < l; ++i) { + prop = properties[i]; + obj = object[prop]; + + if (isCircular(obj, processed)) { + str = "[Circular]"; + } else { + str = ascii(this, obj, processed, indent + 2); + } + + str = (/\s/.test(prop) ? "\"" + prop + "\"" : prop) + ": " + str; + length += str.length; + pieces.push(str); + } + + var cons = constructorName(this, object); + var prefix = cons ? "[" + cons + "] " : ""; + var is = ""; + for (i = 0, k = indent; i < k; ++i) { is += " "; } + + if (l < properties.length) + {pieces.push("[... " + (properties.length - l) + " more elements]");} + + if (length + indent > 80) { + return prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" + + is + "}"; + } + return prefix + "{ " + pieces.join(", ") + " }"; + }; + + ascii.element = function (element) { + var tagName = element.tagName.toLowerCase(); + var attrs = element.attributes; + var pairs = []; + var attr, attrName, i, l, val; + + for (i = 0, l = attrs.length; i < l; ++i) { + attr = attrs.item(i); + attrName = attr.nodeName.toLowerCase().replace("html:", ""); + val = attr.nodeValue; + if (attrName !== "contenteditable" || val !== "inherit") { + if (val) { pairs.push(attrName + "=\"" + val + "\""); } + } + } + + var formatted = "<" + tagName + (pairs.length > 0 ? " " : ""); + // SVG elements have undefined innerHTML + var content = element.innerHTML || ""; + + if (content.length > 20) { + content = content.substr(0, 20) + "[...]"; + } + + var res = formatted + pairs.join(" ") + ">" + content + + ""; + + return res.replace(/ contentEditable="inherit"/, ""); + }; + + function Formatio(options) { + // eslint-disable-next-line guard-for-in + for (var opt in options) { + this[opt] = options[opt]; + } + } + + Formatio.prototype = { + functionName: functionName$3, + + configure: function (options) { + return new Formatio(options); + }, + + constructorName: function (object) { + return constructorName(this, object); + }, + + ascii: function (object, processed, indent) { + return ascii(this, object, processed, indent); + } + }; + + var formatio_1 = Formatio.prototype; + + var formatter = formatio_1.configure({ + quoteStrings: false, + limitChildrenCount: 250 + }); + + var customFormatter; + + function format() { + if (customFormatter) { + return customFormatter.apply(null, arguments); + } + + return formatter.ascii.apply(formatter, arguments); + } + + format.setFormatter = function(aCustomFormatter) { + if (typeof aCustomFormatter !== "function") { + throw new Error("format.setFormatter must be called with a function"); + } + + customFormatter = aCustomFormatter; + }; + + var format_1 = format; + + var arrayProto$4 = lib.prototypes.array; + + + + + + var stringSlice = lib.prototypes.string.slice; + + var arraySlice = arrayProto$4.slice; + var concat$1 = arrayProto$4.concat; + var forEach$2 = arrayProto$4.forEach; + var join$3 = arrayProto$4.join; + var splice$1 = arrayProto$4.splice; + + var assert$1; + + function verifyIsStub() { + var args = arraySlice(arguments); + + forEach$2(args, function(method) { + if (!method) { + assert$1.fail("fake is not a spy"); + } + + if (method.proxy && method.proxy.isSinonProxy) { + verifyIsStub(method.proxy); + } else { + if (typeof method !== "function") { + assert$1.fail(method + " is not a function"); + } + + if (typeof method.getCall !== "function") { + assert$1.fail(method + " is not stubbed"); + } + } + }); + } + + function verifyIsValidAssertion(assertionMethod, assertionArgs) { + switch (assertionMethod) { + case "notCalled": + case "called": + case "calledOnce": + case "calledTwice": + case "calledThrice": + if (assertionArgs.length !== 0) { + assert$1.fail( + assertionMethod + + " takes 1 argument but was called with " + + (assertionArgs.length + 1) + + " arguments" + ); + } + break; + default: + break; + } + } + + function failAssertion(object, msg) { + var obj = object || commonjsGlobal$1; + var failMethod = obj.fail || assert$1.fail; + failMethod.call(obj, msg); + } + + function mirrorPropAsAssertion(name, method, message) { + var msg = message; + var meth = method; + if (arguments.length === 2) { + msg = method; + meth = name; + } + + assert$1[name] = function(fake) { + verifyIsStub(fake); + + var args = arraySlice(arguments, 1); + var failed = false; + + verifyIsValidAssertion(name, args); + + if (typeof meth === "function") { + failed = !meth(fake); + } else { + failed = typeof fake[meth] === "function" ? !fake[meth].apply(fake, args) : !fake[meth]; + } + + if (failed) { + failAssertion(this, (fake.printf || fake.proxy.printf).apply(fake, concat$1([msg], args))); + } else { + assert$1.pass(name); + } + }; + } + + function exposedName(prefix, prop) { + return !prefix || /^fail/.test(prop) ? prop : prefix + stringSlice(prop, 0, 1).toUpperCase() + stringSlice(prop, 1); + } + + assert$1 = { + failException: "AssertError", + + fail: function fail(message) { + var error = new Error(message); + error.name = this.failException || assert$1.failException; + + throw error; + }, + + pass: function pass() { + return; + }, + + callOrder: function assertCallOrder() { + verifyIsStub.apply(null, arguments); + var expected = ""; + var actual = ""; + + if (!calledInOrder(arguments)) { + try { + expected = join$3(arguments, ", "); + var calls = arraySlice(arguments); + var i = calls.length; + while (i) { + if (!calls[--i].called) { + splice$1(calls, i, 1); + } + } + actual = join$3(orderByFirstCall(calls), ", "); + } catch (e) { + // If this fails, we'll just fall back to the blank string + } + + failAssertion(this, "expected " + expected + " to be called in order but were called as " + actual); + } else { + assert$1.pass("callOrder"); + } + }, + + callCount: function assertCallCount(method, count) { + verifyIsStub(method); + + if (method.callCount !== count) { + var msg = "expected %n to be called " + timesInWords(count) + " but was called %c%C"; + failAssertion(this, method.printf(msg)); + } else { + assert$1.pass("callCount"); + } + }, + + expose: function expose(target, options) { + if (!target) { + throw new TypeError("target is null or undefined"); + } + + var o = options || {}; + var prefix = (typeof o.prefix === "undefined" && "assert") || o.prefix; + var includeFail = typeof o.includeFail === "undefined" || Boolean(o.includeFail); + var instance = this; + + forEach$2(Object.keys(instance), function(method) { + if (method !== "expose" && (includeFail || !/^(fail)/.test(method))) { + target[exposedName(prefix, method)] = instance[method]; + } + }); + + return target; + }, + + match: function match(actual, expectation) { + var matcher = match_1$1(expectation); + if (matcher.test(actual)) { + assert$1.pass("match"); + } else { + var formatted = [ + "expected value to match", + " expected = " + format_1(expectation), + " actual = " + format_1(actual) + ]; + + failAssertion(this, join$3(formatted, "\n")); + } + } + }; + + mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called"); + mirrorPropAsAssertion( + "notCalled", + function(spy) { + return !spy.called; + }, + "expected %n to not have been called but was called %c%C" + ); + mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C"); + mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C"); + mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C"); + mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t"); + mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t"); + mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new"); + mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new"); + mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %D"); + mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %D"); + mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %D"); + mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %D"); + mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %D"); + mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %D"); + mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C"); + mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C"); + mirrorPropAsAssertion("threw", "%n did not throw exception%C"); + mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C"); + + var assert_1 = assert$1; + + var lolex = createCommonjsModule$1(function (module, exports) { + (function(f){{module.exports=f();}})(function(){return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof commonjsRequire$1&&commonjsRequire$1;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t);}return n[i].exports}for(var u="function"==typeof commonjsRequire$1&&commonjsRequire$1,i=0;i -1; + var maxTimeout = Math.pow(2, 31) - 1; //see https://heycam.github.io/webidl/#abstract-opdef-converttoint + + // Make properties writable in IE, as per + // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html + if (isRunningInIE) { + _global.setTimeout = _global.setTimeout; + _global.clearTimeout = _global.clearTimeout; + _global.setInterval = _global.setInterval; + _global.clearInterval = _global.clearInterval; + _global.Date = _global.Date; + } + + // setImmediate is not a standard function + // avoid adding the prop to the window object if not present + if (_global.setImmediate !== undefined) { + _global.setImmediate = _global.setImmediate; + _global.clearImmediate = _global.clearImmediate; + } + + // node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref() + // browsers, a number. + // see https://github.com/cjohansen/Sinon.JS/pull/436 + + var NOOP = function () { return undefined; }; + var timeoutResult = _global.setTimeout(NOOP, 0); + var addTimerReturnsObject = typeof timeoutResult === "object"; + var hrtimePresent = (_global.process && typeof _global.process.hrtime === "function"); + var nextTickPresent = (_global.process && typeof _global.process.nextTick === "function"); + var performancePresent = (_global.performance && typeof _global.performance.now === "function"); + var hasPerformancePrototype = (_global.Performance && (typeof _global.Performance).match(/^(function|object)$/)); + var requestAnimationFramePresent = ( + _global.requestAnimationFrame && typeof _global.requestAnimationFrame === "function" + ); + var cancelAnimationFramePresent = ( + _global.cancelAnimationFrame && typeof _global.cancelAnimationFrame === "function" + ); + + _global.clearTimeout(timeoutResult); + + var NativeDate = _global.Date; + var uniqueTimerId = 1; + + function isNumberFinite(num) { + if (Number.isFinite) { + return Number.isFinite(num); + } + + if (typeof num !== "number") { + return false; + } + + return isFinite(num); + } + + /** + * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into + * number of milliseconds. This is used to support human-readable strings passed + * to clock.tick() + */ + function parseTime(str) { + if (!str) { + return 0; + } + + var strings = str.split(":"); + var l = strings.length; + var i = l; + var ms = 0; + var parsed; + + if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { + throw new Error("tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits"); + } + + while (i--) { + parsed = parseInt(strings[i], 10); + + if (parsed >= 60) { + throw new Error("Invalid time " + str); + } + + ms += parsed * Math.pow(60, (l - i - 1)); + } + + return ms * 1000; + } + + /** + * Get the decimal part of the millisecond value as nanoseconds + * + * @param {Number} msFloat the number of milliseconds + * @returns {Number} an integer number of nanoseconds in the range [0,1e6) + * + * Example: nanoRemainer(123.456789) -> 456789 + */ + function nanoRemainder(msFloat) { + var modulo = 1e6; + var remainder = (msFloat * 1e6) % modulo; + var positiveRemainder = remainder < 0 ? remainder + modulo : remainder; + + return Math.floor(positiveRemainder); + } + + /** + * Used to grok the `now` parameter to createClock. + * @param epoch {Date|number} the system time + */ + function getEpoch(epoch) { + if (!epoch) { return 0; } + if (typeof epoch.getTime === "function") { return epoch.getTime(); } + if (typeof epoch === "number") { return epoch; } + throw new TypeError("now should be milliseconds since UNIX epoch"); + } + + function inRange(from, to, timer) { + return timer && timer.callAt >= from && timer.callAt <= to; + } + + function mirrorDateProperties(target, source) { + var prop; + for (prop in source) { + if (source.hasOwnProperty(prop)) { + target[prop] = source[prop]; + } + } + + // set special now implementation + if (source.now) { + target.now = function now() { + return target.clock.now; + }; + } else { + delete target.now; + } + + // set special toSource implementation + if (source.toSource) { + target.toSource = function toSource() { + return source.toSource(); + }; + } else { + delete target.toSource; + } + + // set special toString implementation + target.toString = function toString() { + return source.toString(); + }; + + target.prototype = source.prototype; + target.parse = source.parse; + target.UTC = source.UTC; + target.prototype.toUTCString = source.prototype.toUTCString; + + return target; + } + + function createDate() { + function ClockDate(year, month, date, hour, minute, second, ms) { + // Defensive and verbose to avoid potential harm in passing + // explicit undefined when user does not pass argument + switch (arguments.length) { + case 0: + return new NativeDate(ClockDate.clock.now); + case 1: + return new NativeDate(year); + case 2: + return new NativeDate(year, month); + case 3: + return new NativeDate(year, month, date); + case 4: + return new NativeDate(year, month, date, hour); + case 5: + return new NativeDate(year, month, date, hour, minute); + case 6: + return new NativeDate(year, month, date, hour, minute, second); + default: + return new NativeDate(year, month, date, hour, minute, second, ms); + } + } + + return mirrorDateProperties(ClockDate, NativeDate); + } + + + function enqueueJob(clock, job) { + // enqueues a microtick-deferred task - ecma262/#sec-enqueuejob + if (!clock.jobs) { + clock.jobs = []; + } + clock.jobs.push(job); + } + + function runJobs(clock) { + // runs all microtick-deferred tasks - ecma262/#sec-runjobs + if (!clock.jobs) { + return; + } + for (var i = 0; i < clock.jobs.length; i++) { + var job = clock.jobs[i]; + job.func.apply(null, job.args); + if (clock.loopLimit && i > clock.loopLimit) { + throw new Error("Aborting after running " + clock.loopLimit + " timers, assuming an infinite loop!"); + } + } + clock.jobs = []; + } + + function addTimer(clock, timer) { + if (timer.func === undefined) { + throw new Error("Callback must be provided to timer calls"); + } + + timer.type = timer.immediate ? "Immediate" : "Timeout"; + + if (timer.hasOwnProperty("delay")) { + if (!isNumberFinite(timer.delay)) { + timer.delay = 0; + } + timer.delay = timer.delay > maxTimeout ? 1 : timer.delay; + timer.delay = Math.max(0, timer.delay); + } + + if (timer.hasOwnProperty("interval")) { + timer.type = "Interval"; + timer.interval = timer.interval > maxTimeout ? 1 : timer.interval; + } + + if (timer.hasOwnProperty("animation")) { + timer.type = "AnimationFrame"; + timer.animation = true; + } + + if (!clock.timers) { + clock.timers = {}; + } + + timer.id = uniqueTimerId++; + timer.createdAt = clock.now; + timer.callAt = clock.now + (parseInt(timer.delay) || (clock.duringTick ? 1 : 0)); + + clock.timers[timer.id] = timer; + + if (addTimerReturnsObject) { + var res = { + id: timer.id, + ref: function () { return res; }, + unref: function () { return res; }, + refresh: function () { return res; } + }; + return res; + } + + return timer.id; + } + + /* eslint consistent-return: "off" */ + function compareTimers(a, b) { + // Sort first by absolute timing + if (a.callAt < b.callAt) { + return -1; + } + if (a.callAt > b.callAt) { + return 1; + } + + // Sort next by immediate, immediate timers take precedence + if (a.immediate && !b.immediate) { + return -1; + } + if (!a.immediate && b.immediate) { + return 1; + } + + // Sort next by creation time, earlier-created timers take precedence + if (a.createdAt < b.createdAt) { + return -1; + } + if (a.createdAt > b.createdAt) { + return 1; + } + + // Sort next by id, lower-id timers take precedence + if (a.id < b.id) { + return -1; + } + if (a.id > b.id) { + return 1; + } + + // As timer ids are unique, no fallback `0` is necessary + } + + function firstTimerInRange(clock, from, to) { + var timers = clock.timers; + var timer = null; + var id, isInRange; + + for (id in timers) { + if (timers.hasOwnProperty(id)) { + isInRange = inRange(from, to, timers[id]); + + if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) { + timer = timers[id]; + } + } + } + + return timer; + } + + function firstTimer(clock) { + var timers = clock.timers; + var timer = null; + var id; + + for (id in timers) { + if (timers.hasOwnProperty(id)) { + if (!timer || compareTimers(timer, timers[id]) === 1) { + timer = timers[id]; + } + } + } + + return timer; + } + + function lastTimer(clock) { + var timers = clock.timers; + var timer = null; + var id; + + for (id in timers) { + if (timers.hasOwnProperty(id)) { + if (!timer || compareTimers(timer, timers[id]) === -1) { + timer = timers[id]; + } + } + } + + return timer; + } + + function callTimer(clock, timer) { + if (typeof timer.interval === "number") { + clock.timers[timer.id].callAt += timer.interval; + } else { + delete clock.timers[timer.id]; + } + + if (typeof timer.func === "function") { + timer.func.apply(null, timer.args); + } else { + /* eslint no-eval: "off" */ + eval(timer.func); + } + } + + function clearTimer(clock, timerId, ttype) { + if (!timerId) { + // null appears to be allowed in most browsers, and appears to be + // relied upon by some libraries, like Bootstrap carousel + return; + } + + if (!clock.timers) { + clock.timers = {}; + } + + // in Node, timerId is an object with .ref()/.unref(), and + // its .id field is the actual timer id. + if (typeof timerId === "object") { + timerId = timerId.id; + } + + if (clock.timers.hasOwnProperty(timerId)) { + // check that the ID matches a timer of the correct type + var timer = clock.timers[timerId]; + if (timer.type === ttype) { + delete clock.timers[timerId]; + } else { + var clear = ttype === "AnimationFrame" ? "cancelAnimationFrame" : "clear" + ttype; + var schedule = timer.type === "AnimationFrame" ? "requestAnimationFrame" : "set" + timer.type; + throw new Error("Cannot clear timer: timer created with " + schedule + + "() but cleared with " + clear + "()"); + } + } + } + + function uninstall(clock, target, config) { + var method, + i, + l; + var installedHrTime = "_hrtime"; + var installedNextTick = "_nextTick"; + + for (i = 0, l = clock.methods.length; i < l; i++) { + method = clock.methods[i]; + if (method === "hrtime" && target.process) { + target.process.hrtime = clock[installedHrTime]; + } else if (method === "nextTick" && target.process) { + target.process.nextTick = clock[installedNextTick]; + } else if (method === "performance") { + target[method] = clock["_" + method]; + } else { + if (target[method] && target[method].hadOwnProperty) { + target[method] = clock["_" + method]; + if (method === "clearInterval" && config.shouldAdvanceTime === true) { + target[method](clock.attachedInterval); + } + } else { + try { + delete target[method]; + } catch (ignore) { /* eslint empty-block: "off" */ } + } + } + } + + // Prevent multiple executions which will completely remove these props + clock.methods = []; + + // return pending timers, to enable checking what timers remained on uninstall + if (!clock.timers) { + return []; + } + return Object.keys(clock.timers).map(function mapper(key) { + return clock.timers[key]; + }); + } + + function hijackMethod(target, method, clock) { + var prop; + clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method); + clock["_" + method] = target[method]; + + if (method === "Date") { + var date = mirrorDateProperties(clock[method], target[method]); + target[method] = date; + } else if (method === "performance") { + target[method] = clock[method]; + } else { + target[method] = function () { + return clock[method].apply(clock, arguments); + }; + + for (prop in clock[method]) { + if (clock[method].hasOwnProperty(prop)) { + target[method][prop] = clock[method][prop]; + } + } + } + + target[method].clock = clock; + } + + function doIntervalTick(clock, advanceTimeDelta) { + clock.tick(advanceTimeDelta); + } + + var timers = { + setTimeout: _global.setTimeout, + clearTimeout: _global.clearTimeout, + setImmediate: _global.setImmediate, + clearImmediate: _global.clearImmediate, + setInterval: _global.setInterval, + clearInterval: _global.clearInterval, + Date: _global.Date + }; + + if (hrtimePresent) { + timers.hrtime = _global.process.hrtime; + } + + if (nextTickPresent) { + timers.nextTick = _global.process.nextTick; + } + + if (performancePresent) { + timers.performance = _global.performance; + } + + if (requestAnimationFramePresent) { + timers.requestAnimationFrame = _global.requestAnimationFrame; + } + + if (cancelAnimationFramePresent) { + timers.cancelAnimationFrame = _global.cancelAnimationFrame; + } + + var keys = Object.keys || function (obj) { + var ks = []; + var key; + + for (key in obj) { + if (obj.hasOwnProperty(key)) { + ks.push(key); + } + } + + return ks; + }; + + /** + * @param start {Date|number} the system time - non-integer values are floored + * @param loopLimit {number} maximum number of timers that will be run when calling runAll() + */ + function createClock(start, loopLimit) { + start = Math.floor(getEpoch(start)); + loopLimit = loopLimit || 1000; + var nanos = 0; + var adjustedSystemTime = [0, 0]; // [millis, nanoremainder] + + if (NativeDate === undefined) { + throw new Error("The global scope doesn't have a `Date` object" + + " (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)"); + } + + var clock = { + now: start, + timeouts: {}, + Date: createDate(), + loopLimit: loopLimit + }; + + clock.Date.clock = clock; + + function getTimeToNextFrame() { + return 16 - ((clock.now - start) % 16); + } + + function hrtime(prev) { + var millisSinceStart = clock.now - adjustedSystemTime[0] - start; + var secsSinceStart = Math.floor( millisSinceStart / 1000); + var remainderInNanos = (millisSinceStart - secsSinceStart * 1e3 ) * 1e6 + nanos - adjustedSystemTime[1]; + + if (Array.isArray(prev)) { + if ( prev[1] > 1e9 ) { + throw new TypeError("Number of nanoseconds can't exceed a billion"); + } + + var oldSecs = prev[0]; + var nanoDiff = remainderInNanos - prev[1]; + var secDiff = secsSinceStart - oldSecs; + + if (nanoDiff < 0) { + nanoDiff += 1e9; + secDiff -= 1; + } + + return [secDiff, nanoDiff]; + } + return [secsSinceStart, remainderInNanos]; + } + + clock.setTimeout = function setTimeout(func, timeout) { + return addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 2), + delay: timeout + }); + }; + + clock.clearTimeout = function clearTimeout(timerId) { + return clearTimer(clock, timerId, "Timeout"); + }; + clock.nextTick = function nextTick(func) { + return enqueueJob(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 1) + }); + }; + clock.setInterval = function setInterval(func, timeout) { + timeout = parseInt(timeout, 10); + return addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 2), + delay: timeout, + interval: timeout + }); + }; + + clock.clearInterval = function clearInterval(timerId) { + return clearTimer(clock, timerId, "Interval"); + }; + + clock.setImmediate = function setImmediate(func) { + return addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 1), + immediate: true + }); + }; + + clock.clearImmediate = function clearImmediate(timerId) { + return clearTimer(clock, timerId, "Immediate"); + }; + + clock.countTimers = function countTimers() { + return Object.keys(clock.timers || {}).length; + }; + + clock.requestAnimationFrame = function requestAnimationFrame(func) { + var result = addTimer(clock, { + func: func, + delay: getTimeToNextFrame(), + args: [clock.now + getTimeToNextFrame()], + animation: true + }); + + return result.id || result; + }; + + clock.cancelAnimationFrame = function cancelAnimationFrame(timerId) { + return clearTimer(clock, timerId, "AnimationFrame"); + }; + + clock.runMicrotasks = function runMicrotasks() { + runJobs(clock); + }; + + /** + * @param {tickValue} {String|Number} number of milliseconds or a human-readable value like "01:11:15" + */ + clock.tick = function tick(tickValue) { + var msFloat = typeof tickValue === "number" ? tickValue : parseTime(tickValue); + var ms = Math.floor(msFloat); + var remainder = nanoRemainder(msFloat); + var nanosTotal = nanos + remainder; + var tickTo = clock.now + ms; + + if (msFloat < 0) { + throw new TypeError("Negative ticks are not supported"); + } + + // adjust for positive overflow + if (nanosTotal >= 1e6) { + tickTo += 1; + nanosTotal -= 1e6; + } + + nanos = nanosTotal; + var tickFrom = clock.now; + var previous = clock.now; + var timer, firstException, oldNow; + + clock.duringTick = true; + + // perform process.nextTick()s + oldNow = clock.now; + runJobs(clock); + if (oldNow !== clock.now) { + // compensate for any setSystemTime() call during process.nextTick() callback + tickFrom += clock.now - oldNow; + tickTo += clock.now - oldNow; + } + + // perform each timer in the requested range + timer = firstTimerInRange(clock, tickFrom, tickTo); + while (timer && tickFrom <= tickTo) { + if (clock.timers[timer.id]) { + tickFrom = timer.callAt; + clock.now = timer.callAt; + oldNow = clock.now; + try { + runJobs(clock); + callTimer(clock, timer); + } catch (e) { + firstException = firstException || e; + } + + // compensate for any setSystemTime() call during timer callback + if (oldNow !== clock.now) { + tickFrom += clock.now - oldNow; + tickTo += clock.now - oldNow; + previous += clock.now - oldNow; + } + } + + timer = firstTimerInRange(clock, previous, tickTo); + previous = tickFrom; + } + + // perform process.nextTick()s again + oldNow = clock.now; + runJobs(clock); + if (oldNow !== clock.now) { + // compensate for any setSystemTime() call during process.nextTick() callback + tickFrom += clock.now - oldNow; + tickTo += clock.now - oldNow; + } + clock.duringTick = false; + + // corner case: during runJobs, new timers were scheduled which could be in the range [clock.now, tickTo] + timer = firstTimerInRange(clock, tickFrom, tickTo); + if (timer) { + try { + clock.tick(tickTo - clock.now); // do it all again - for the remainder of the requested range + } catch (e) { + firstException = firstException || e; + } + } else { + // no timers remaining in the requested range: move the clock all the way to the end + clock.now = tickTo; + + // update nanos + nanos = nanosTotal; + } + if (firstException) { + throw firstException; + } + return clock.now; + }; + + clock.next = function next() { + runJobs(clock); + var timer = firstTimer(clock); + if (!timer) { + return clock.now; + } + + clock.duringTick = true; + try { + clock.now = timer.callAt; + callTimer(clock, timer); + runJobs(clock); + return clock.now; + } finally { + clock.duringTick = false; + } + }; + + clock.runAll = function runAll() { + var numTimers, i; + runJobs(clock); + for (i = 0; i < clock.loopLimit; i++) { + if (!clock.timers) { + return clock.now; + } + + numTimers = keys(clock.timers).length; + if (numTimers === 0) { + return clock.now; + } + + clock.next(); + } + + throw new Error("Aborting after running " + clock.loopLimit + " timers, assuming an infinite loop!"); + }; + + clock.runToFrame = function runToFrame() { + return clock.tick(getTimeToNextFrame()); + }; + + clock.runToLast = function runToLast() { + var timer = lastTimer(clock); + if (!timer) { + runJobs(clock); + return clock.now; + } + + return clock.tick(timer.callAt - clock.now); + }; + + clock.reset = function reset() { + nanos = 0; + clock.timers = {}; + clock.jobs = []; + clock.now = start; + }; + + clock.setSystemTime = function setSystemTime(systemTime) { + // determine time difference + var newNow = getEpoch(systemTime); + var difference = newNow - clock.now; + var id, timer; + + adjustedSystemTime[0] = difference; + adjustedSystemTime[1] = nanos; + // update 'system clock' + clock.now = newNow; + nanos = 0; + + // update timers and intervals to keep them stable + for (id in clock.timers) { + if (clock.timers.hasOwnProperty(id)) { + timer = clock.timers[id]; + timer.createdAt += difference; + timer.callAt += difference; + } + } + }; + + if (performancePresent) { + clock.performance = Object.create(null); + + if (hasPerformancePrototype) { + var proto = _global.Performance.prototype; + + Object + .getOwnPropertyNames(proto) + .forEach(function (name) { + clock.performance[name] = NOOP; + }); + } + + clock.performance.now = function lolexNow() { + var hrt = hrtime(); + var millis = (hrt[0] * 1000 + hrt[1] / 1e6); + return millis; + }; + } + + + if (hrtimePresent) { + clock.hrtime = hrtime; + } + + return clock; + } + + /** + * @param config {Object} optional config + * @param config.target {Object} the target to install timers in (default `window`) + * @param config.now {number|Date} a number (in milliseconds) or a Date object (default epoch) + * @param config.toFake {string[]} names of the methods that should be faked. + * @param config.loopLimit {number} the maximum number of timers that will be run when calling runAll() + * @param config.shouldAdvanceTime {Boolean} tells lolex to increment mocked time automatically (default false) + * @param config.advanceTimeDelta {Number} increment mocked time every <> ms (default: 20ms) + */ + function install(config) { + if ( arguments.length > 1 || config instanceof Date || Array.isArray(config) || typeof config === "number") { + throw new TypeError("lolex.install called with " + String(config) + + " lolex 2.0+ requires an object parameter - see https://github.com/sinonjs/lolex"); + } + config = typeof config !== "undefined" ? config : {}; + config.shouldAdvanceTime = config.shouldAdvanceTime || false; + config.advanceTimeDelta = config.advanceTimeDelta || 20; + + var i, l; + var target = config.target || _global; + var clock = createClock(config.now, config.loopLimit); + + clock.uninstall = function () { + return uninstall(clock, target, config); + }; + + clock.methods = config.toFake || []; + + if (clock.methods.length === 0) { + // do not fake nextTick by default - GitHub#126 + clock.methods = keys(timers).filter(function (key) {return key !== "nextTick";}); + } + + for (i = 0, l = clock.methods.length; i < l; i++) { + if (clock.methods[i] === "hrtime") { + if (target.process && typeof target.process.hrtime === "function") { + hijackMethod(target.process, clock.methods[i], clock); + } + } else if (clock.methods[i] === "nextTick") { + if (target.process && typeof target.process.nextTick === "function") { + hijackMethod(target.process, clock.methods[i], clock); + } + } else { + if (clock.methods[i] === "setInterval" && config.shouldAdvanceTime === true) { + var intervalTick = doIntervalTick.bind(null, clock, config.advanceTimeDelta); + var intervalId = target[clock.methods[i]]( + intervalTick, + config.advanceTimeDelta); + clock.attachedInterval = intervalId; + } + hijackMethod(target, clock.methods[i], clock); + } + } + + return clock; + } + + return { + timers: timers, + createClock: createClock, + install: install, + withGlobal: withGlobal + }; + } + + var defaultImplementation = withGlobal(global || window); + + exports.timers = defaultImplementation.timers; + exports.createClock = defaultImplementation.createClock; + exports.install = defaultImplementation.install; + exports.withGlobal = withGlobal; + + }).call(this,typeof commonjsGlobal$1 !== "undefined" ? commonjsGlobal$1 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); + },{}]},{},[1])(1) + }); + }); + + function createClock(config, globalCtx) { + var llxCtx = lolex; + if (globalCtx !== null && typeof globalCtx === "object") { + llxCtx = lolex.withGlobal(globalCtx); + } + var clock = llxCtx.install(config); + clock.restore = clock.uninstall; + return clock; + } + + /** + * @param {number|Date|Object} dateOrConfig The unix epoch value to install with (default 0) + * @returns {Object} Returns a lolex clock instance + */ + var useFakeTimers = function(dateOrConfig) { + var hasArguments = typeof dateOrConfig !== "undefined"; + var argumentIsDateLike = + (typeof dateOrConfig === "number" || dateOrConfig instanceof Date) && arguments.length === 1; + var argumentIsObject = dateOrConfig !== null && typeof dateOrConfig === "object" && arguments.length === 1; + + if (!hasArguments) { + return createClock({ + now: 0 + }); + } + + if (argumentIsDateLike) { + return createClock({ + now: dateOrConfig + }); + } + + if (argumentIsObject) { + var config = extend({}, dateOrConfig); + var globalCtx = config.global; + delete config.global; + return createClock(config, globalCtx); + } + + throw new TypeError("useFakeTimers expected epoch or config object. See https://github.com/sinonjs/sinon"); + }; + + var clock = { + create: function(now) { + return lolex.createClock(now); + } + }; + + var timers = { + setTimeout: setTimeout, + clearTimeout: clearTimeout, + setImmediate: typeof setImmediate !== "undefined" ? setImmediate : undefined, + clearImmediate: typeof clearImmediate !== "undefined" ? clearImmediate : undefined, + setInterval: setInterval, + clearInterval: clearInterval, + Date: Date + }; + + var fakeTimers = { + useFakeTimers: useFakeTimers, + clock: clock, + timers: timers + }; + + var functionToString = function toString() { + var i, prop, thisValue; + if (this.getCall && this.callCount) { + i = this.callCount; + + while (i--) { + thisValue = this.getCall(i).thisValue; + + for (prop in thisValue) { + if (thisValue[prop] === this) { + return prop; + } + } + } + } + + return this.displayName || "sinon fake"; + }; + + var arrayProto$5 = lib.prototypes.array; + + var deepEqual$3 = deepEqual_1.use(match_1$1); + var functionName$4 = lib.functionName; + + var valueToString$3 = lib.valueToString; + + var concat$2 = arrayProto$5.concat; + var filter = arrayProto$5.filter; + var join$4 = arrayProto$5.join; + var map$1 = arrayProto$5.map; + var reduce = arrayProto$5.reduce; + var slice$3 = arrayProto$5.slice; + + function throwYieldError(proxy, text, args) { + var msg = functionName$4(proxy) + text; + if (args.length) { + msg += " Received [" + join$4(slice$3(args), ", ") + "]"; + } + throw new Error(msg); + } + + var callProto = { + calledOn: function calledOn(thisValue) { + if (match_1$1 && match_1$1.isMatcher(thisValue)) { + return thisValue.test(this.thisValue); + } + return this.thisValue === thisValue; + }, + + calledWith: function calledWith() { + var self = this; + var calledWithArgs = slice$3(arguments); + + if (calledWithArgs.length > self.args.length) { + return false; + } + + return reduce( + calledWithArgs, + function(prev, arg, i) { + return prev && deepEqual$3(arg, self.args[i]); + }, + true + ); + }, + + calledWithMatch: function calledWithMatch() { + var self = this; + var calledWithMatchArgs = slice$3(arguments); + + if (calledWithMatchArgs.length > self.args.length) { + return false; + } + + return reduce( + calledWithMatchArgs, + function(prev, expectation, i) { + var actual = self.args[i]; + + return prev && (match_1$1 && match_1$1(expectation).test(actual)); + }, + true + ); + }, + + calledWithExactly: function calledWithExactly() { + return arguments.length === this.args.length && this.calledWith.apply(this, arguments); + }, + + notCalledWith: function notCalledWith() { + return !this.calledWith.apply(this, arguments); + }, + + notCalledWithMatch: function notCalledWithMatch() { + return !this.calledWithMatch.apply(this, arguments); + }, + + returned: function returned(value) { + return deepEqual$3(value, this.returnValue); + }, + + threw: function threw(error) { + if (typeof error === "undefined" || !this.exception) { + return Boolean(this.exception); + } + + return this.exception === error || this.exception.name === error; + }, + + calledWithNew: function calledWithNew() { + return this.proxy.prototype && this.thisValue instanceof this.proxy; + }, + + calledBefore: function(other) { + return this.callId < other.callId; + }, + + calledAfter: function(other) { + return this.callId > other.callId; + }, + + calledImmediatelyBefore: function(other) { + return this.callId === other.callId - 1; + }, + + calledImmediatelyAfter: function(other) { + return this.callId === other.callId + 1; + }, + + callArg: function(pos) { + this.ensureArgIsAFunction(pos); + return this.args[pos](); + }, + + callArgOn: function(pos, thisValue) { + this.ensureArgIsAFunction(pos); + return this.args[pos].apply(thisValue); + }, + + callArgWith: function(pos) { + return this.callArgOnWith.apply(this, concat$2([pos, null], slice$3(arguments, 1))); + }, + + callArgOnWith: function(pos, thisValue) { + this.ensureArgIsAFunction(pos); + var args = slice$3(arguments, 2); + return this.args[pos].apply(thisValue, args); + }, + + throwArg: function(pos) { + if (pos > this.args.length) { + throw new TypeError("Not enough arguments: " + pos + " required but only " + this.args.length + " present"); + } + + throw this.args[pos]; + }, + + yield: function() { + return this.yieldOn.apply(this, concat$2([null], slice$3(arguments, 0))); + }, + + yieldOn: function(thisValue) { + var args = slice$3(this.args); + var yieldFn = filter(args, function(arg) { + return typeof arg === "function"; + })[0]; + + if (!yieldFn) { + throwYieldError(this.proxy, " cannot yield since no callback was passed.", args); + } + + return yieldFn.apply(thisValue, slice$3(arguments, 1)); + }, + + yieldTo: function(prop) { + return this.yieldToOn.apply(this, concat$2([prop, null], slice$3(arguments, 1))); + }, + + yieldToOn: function(prop, thisValue) { + var args = slice$3(this.args); + var yieldArg = filter(args, function(arg) { + return arg && typeof arg[prop] === "function"; + })[0]; + var yieldFn = yieldArg && yieldArg[prop]; + + if (!yieldFn) { + throwYieldError( + this.proxy, + " cannot yield to '" + valueToString$3(prop) + "' since no callback was passed.", + args + ); + } + + return yieldFn.apply(thisValue, slice$3(arguments, 2)); + }, + + toString: function() { + var callStr = this.proxy ? String(this.proxy) + "(" : ""; + var formattedArgs; + + if (!this.args) { + return ":("; + } + + formattedArgs = map$1(this.args, function(arg) { + return format_1(arg); + }); + + callStr = callStr + join$4(formattedArgs, ", ") + ")"; + + if (typeof this.returnValue !== "undefined") { + callStr += " => " + format_1(this.returnValue); + } + + if (this.exception) { + callStr += " !" + this.exception.name; + + if (this.exception.message) { + callStr += "(" + this.exception.message + ")"; + } + } + if (this.stack) { + // Omit the error message and the two top stack frames in sinon itself: + callStr += (this.stack.split("\n")[3] || "unknown").replace(/^\s*(?:at\s+|@)?/, " at "); + } + + return callStr; + }, + + ensureArgIsAFunction: function(pos) { + if (typeof this.args[pos] !== "function") { + throw new TypeError( + "Expected argument at position " + pos + " to be a Function, but was " + typeof this.args[pos] + ); + } + } + }; + Object.defineProperty(callProto, "stack", { + enumerable: true, + configurable: true, + get: function() { + return (this.errorWithCallStack && this.errorWithCallStack.stack) || ""; + } + }); + + callProto.invokeCallback = callProto.yield; + + function createSpyCall(spy, thisValue, args, returnValue, exception, id, errorWithCallStack) { + if (typeof id !== "number") { + throw new TypeError("Call id is not a number"); + } + + var proxyCall = Object.create(callProto); + var lastArg = (args.length > 0 && args[args.length - 1]) || undefined; + var callback = lastArg && typeof lastArg === "function" ? lastArg : undefined; + + proxyCall.proxy = spy; + proxyCall.thisValue = thisValue; + proxyCall.args = args; + proxyCall.lastArg = lastArg; + proxyCall.callback = callback; + proxyCall.returnValue = returnValue; + proxyCall.exception = exception; + proxyCall.callId = id; + proxyCall.errorWithCallStack = errorWithCallStack; + + return proxyCall; + } + createSpyCall.toString = callProto.toString; // used by mocks + + var call$1$1 = createSpyCall; + + var hasOwnProperty$6 = lib.prototypes.object.hasOwnProperty; + var valueToString$4 = lib.valueToString; + + function isFunction$1(obj) { + return typeof obj === "function" || Boolean(obj && obj.constructor && obj.call && obj.apply); + } + + function mirrorProperties(target, source) { + for (var prop in source) { + if (!hasOwnProperty$6(target, prop)) { + target[prop] = source[prop]; + } + } + } + + // Cheap way to detect if we have ES5 support. + var hasES5Support = "keys" in Object; + + var wrapMethod = function wrapMethod(object, property, method) { + if (!object) { + throw new TypeError("Should wrap property of object"); + } + + if (typeof method !== "function" && typeof method !== "object") { + throw new TypeError("Method wrapper should be a function or a property descriptor"); + } + + function checkWrappedMethod(wrappedMethod) { + var error; + + if (!isFunction$1(wrappedMethod)) { + error = new TypeError( + "Attempted to wrap " + typeof wrappedMethod + " property " + valueToString$4(property) + " as function" + ); + } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) { + error = new TypeError("Attempted to wrap " + valueToString$4(property) + " which is already wrapped"); + } else if (wrappedMethod.calledBefore) { + var verb = wrappedMethod.returns ? "stubbed" : "spied on"; + error = new TypeError("Attempted to wrap " + valueToString$4(property) + " which is already " + verb); + } + + if (error) { + if (wrappedMethod && wrappedMethod.stackTraceError) { + error.stack += "\n--------------\n" + wrappedMethod.stackTraceError.stack; + } + throw error; + } + } + + var error, wrappedMethod, i, wrappedMethodDesc; + + function simplePropertyAssignment() { + wrappedMethod = object[property]; + checkWrappedMethod(wrappedMethod); + object[property] = method; + method.displayName = property; + } + + // Firefox has a problem when using hasOwn.call on objects from other frames. + /* eslint-disable-next-line local-rules/no-prototype-methods */ + var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwnProperty$6(object, property); + + if (hasES5Support) { + var methodDesc = typeof method === "function" ? { value: method } : method; + wrappedMethodDesc = getPropertyDescriptor(object, property); + + if (!wrappedMethodDesc) { + error = new TypeError( + "Attempted to wrap " + typeof wrappedMethod + " property " + property + " as function" + ); + } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) { + error = new TypeError("Attempted to wrap " + property + " which is already wrapped"); + } + if (error) { + if (wrappedMethodDesc && wrappedMethodDesc.stackTraceError) { + error.stack += "\n--------------\n" + wrappedMethodDesc.stackTraceError.stack; + } + throw error; + } + + var types = Object.keys(methodDesc); + for (i = 0; i < types.length; i++) { + wrappedMethod = wrappedMethodDesc[types[i]]; + checkWrappedMethod(wrappedMethod); + } + + mirrorProperties(methodDesc, wrappedMethodDesc); + for (i = 0; i < types.length; i++) { + mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]); + } + Object.defineProperty(object, property, methodDesc); + + // catch failing assignment + // this is the converse of the check in `.restore` below + if (typeof method === "function" && object[property] !== method) { + // correct any wrongdoings caused by the defineProperty call above, + // such as adding new items (if object was a Storage object) + delete object[property]; + simplePropertyAssignment(); + } + } else { + simplePropertyAssignment(); + } + + method.displayName = property; + + // Set up an Error object for a stack trace which can be used later to find what line of + // code the original method was created on. + method.stackTraceError = new Error("Stack Trace for original"); + + method.restore = function() { + // For prototype properties try to reset by delete first. + // If this fails (ex: localStorage on mobile safari) then force a reset + // via direct assignment. + if (!owned) { + // In some cases `delete` may throw an error + try { + delete object[property]; + } catch (e) {} // eslint-disable-line no-empty + // For native code functions `delete` fails without throwing an error + // on Chrome < 43, PhantomJS, etc. + } else if (hasES5Support) { + Object.defineProperty(object, property, wrappedMethodDesc); + } + + if (hasES5Support) { + var descriptor = getPropertyDescriptor(object, property); + if (descriptor && descriptor.value === method) { + object[property] = wrappedMethod; + } + } else { + // Use strict equality comparison to check failures then force a reset + // via direct assignment. + if (object[property] === method) { + object[property] = wrappedMethod; + } + } + }; + + method.wrappedMethod = wrappedMethod; + + method.restore.sinon = true; + + if (!hasES5Support) { + mirrorProperties(method, wrappedMethod); + } + + return method; + }; + + var global$1 = (typeof global !== "undefined" ? global : + typeof self !== "undefined" ? self : + typeof window !== "undefined" ? window : {}); + + // shim for using process in browser + // based off https://github.com/defunctzombie/node-process/blob/master/browser.js + + function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); + } + function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); + } + var cachedSetTimeout = defaultSetTimout; + var cachedClearTimeout = defaultClearTimeout; + if (typeof global$1.setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } + if (typeof global$1.clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } + + function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + + } + function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + + } + var queue = []; + var draining = false; + var currentQueue; + var queueIndex = -1; + + function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } + } + + function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); + } + function nextTick$2(fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } + } + // v8 likes predictible objects + function Item(fun, array) { + this.fun = fun; + this.array = array; + } + Item.prototype.run = function () { + this.fun.apply(null, this.array); + }; + var title = 'browser'; + var platform = 'browser'; + var browser = true; + var env = {}; + var argv = []; + var version = ''; // empty string to avoid regexp issues + var versions = {}; + var release = {}; + var config$1 = {}; + + function noop() {} + + var on$1 = noop; + var addListener = noop; + var once = noop; + var off = noop; + var removeListener = noop; + var removeAllListeners = noop; + var emit = noop; + + function binding(name) { + throw new Error('process.binding is not supported'); + } + + function cwd () { return '/' } + function chdir (dir) { + throw new Error('process.chdir is not supported'); + }function umask() { return 0; } + + // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js + var performance = global$1.performance || {}; + var performanceNow = + performance.now || + performance.mozNow || + performance.msNow || + performance.oNow || + performance.webkitNow || + function(){ return (new Date()).getTime() }; + + // generate timestamp or delta + // see http://nodejs.org/api/process.html#process_process_hrtime + function hrtime(previousTimestamp){ + var clocktime = performanceNow.call(performance)*1e-3; + var seconds = Math.floor(clocktime); + var nanoseconds = Math.floor((clocktime%1)*1e9); + if (previousTimestamp) { + seconds = seconds - previousTimestamp[0]; + nanoseconds = nanoseconds - previousTimestamp[1]; + if (nanoseconds<0) { + seconds--; + nanoseconds += 1e9; + } + } + return [seconds,nanoseconds] + } + + var startTime = new Date(); + function uptime() { + var currentTime = new Date(); + var dif = currentTime - startTime; + return dif / 1000; + } + + var process = { + nextTick: nextTick$2, + title: title, + browser: browser, + env: env, + argv: argv, + version: version, + versions: versions, + on: on$1, + addListener: addListener, + once: once, + off: off, + removeListener: removeListener, + removeAllListeners: removeAllListeners, + emit: emit, + binding: binding, + cwd: cwd, + chdir: chdir, + umask: umask, + hrtime: hrtime, + platform: platform, + release: release, + config: config$1, + uptime: uptime + }; + + var hasFlag = (flag, argv$$1) => { + argv$$1 = argv$$1 || process.argv; + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const pos = argv$$1.indexOf(prefix + flag); + const terminatorPos = argv$$1.indexOf('--'); + return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); + }; + + const env$1 = process.env; + + let forceColor; + if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; + } else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; + } + if ('FORCE_COLOR' in env$1) { + forceColor = env$1.FORCE_COLOR.length === 0 || parseInt(env$1.FORCE_COLOR, 10) !== 0; + } + + function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; + } + + function supportsColor(stream) { + if (forceColor === false) { + return 0; + } + + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } + + const min = forceColor ? 1 : 0; + + if ('CI' in env$1) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env$1) || env$1.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env$1) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env$1.TEAMCITY_VERSION) ? 1 : 0; + } + + if ('TERM_PROGRAM' in env$1) { + const version$$1 = parseInt(('').split('.')[0], 10); + + switch (env$1.TERM_PROGRAM) { + case 'iTerm.app': + return version$$1 >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env$1.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env$1.TERM)) { + return 1; + } + + if ('COLORTERM' in env$1) { + return 1; + } + + return min; + } + + function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); + } + + var supportsColor_1 = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) + }; + + function colorize(str, color) { + if (supportsColor_1.stdout === false) { + return str; + } + + return "\x1b[" + color + "m" + str + "\x1b[0m"; + } + + var red = function(str) { + return colorize(str, 31); + }; + + var green = function(str) { + return colorize(str, 32); + }; + + var cyan = function(str) { + return colorize(str, 96); + }; + + var white = function(str) { + return colorize(str, 39); + }; + + var bold = function(str) { + return colorize(str, 1); + }; + + var color = { + red: red, + green: green, + cyan: cyan, + white: white, + bold: bold + }; + + var base = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports['default'] = /*istanbul ignore end*/Diff; + function Diff() {} + + Diff.prototype = { + /*istanbul ignore start*/ /*istanbul ignore end*/diff: function diff(oldString, newString) { + /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + var callback = options.callback; + if (typeof options === 'function') { + callback = options; + options = {}; + } + this.options = options; + + var self = this; + + function done(value) { + if (callback) { + setTimeout(function () { + callback(undefined, value); + }, 0); + return true; + } else { + return value; + } + } + + // Allow subclasses to massage the input prior to running + oldString = this.castInput(oldString); + newString = this.castInput(newString); + + oldString = this.removeEmpty(this.tokenize(oldString)); + newString = this.removeEmpty(this.tokenize(newString)); + + var newLen = newString.length, + oldLen = oldString.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0, i.e. the content starts with the same values + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + // Identity per the equality and tokenizer + return done([{ value: this.join(newString), count: newString.length }]); + } + + // Main worker method. checks all permutations of a given edit length for acceptance. + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; + var addPath = bestPath[diagonalPath - 1], + removePath = bestPath[diagonalPath + 1], + _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } + + var canAdd = addPath && addPath.newPos + 1 < newLen, + canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } else { + basePath = addPath; // No need to clone, we've pulled it from the list + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } + + _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); + + // If we have hit the end of both strings, then we are done + if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { + return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); + } else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } + + editLength++; + } + + // Performs the length of edit iteration. Is a bit fugly as this has to support the + // sync and async mode which is never fun. Loops over execEditLength until a value + // is produced. + if (callback) { + (function exec() { + setTimeout(function () { + // This should not happen, but we want to be safe. + /* istanbul ignore next */ + if (editLength > maxEditLength) { + return callback(); + } + + if (!execEditLength()) { + exec(); + } + }, 0); + })(); + } else { + while (editLength <= maxEditLength) { + var ret = execEditLength(); + if (ret) { + return ret; + } + } + } + }, + /*istanbul ignore start*/ /*istanbul ignore end*/pushComponent: function pushComponent(components, added, removed) { + var last = components[components.length - 1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = { count: last.count + 1, added: added, removed: removed }; + } else { + components.push({ count: 1, added: added, removed: removed }); + } + }, + /*istanbul ignore start*/ /*istanbul ignore end*/extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath, + commonCount = 0; + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } + + if (commonCount) { + basePath.components.push({ count: commonCount }); + } + + basePath.newPos = newPos; + return oldPos; + }, + /*istanbul ignore start*/ /*istanbul ignore end*/equals: function equals(left, right) { + if (this.options.comparator) { + return this.options.comparator(left, right); + } else { + return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase(); + } + }, + /*istanbul ignore start*/ /*istanbul ignore end*/removeEmpty: function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + }, + /*istanbul ignore start*/ /*istanbul ignore end*/castInput: function castInput(value) { + return value; + }, + /*istanbul ignore start*/ /*istanbul ignore end*/tokenize: function tokenize(value) { + return value.split(''); + }, + /*istanbul ignore start*/ /*istanbul ignore end*/join: function join(chars) { + return chars.join(''); + } + }; + + function buildValues(diff, components, newString, oldString, useLongestToken) { + var componentPos = 0, + componentLen = components.length, + newPos = 0, + oldPos = 0; + + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + if (!component.removed) { + if (!component.added && useLongestToken) { + var value = newString.slice(newPos, newPos + component.count); + value = value.map(function (value, i) { + var oldValue = oldString[oldPos + i]; + return oldValue.length > value.length ? oldValue : value; + }); + + component.value = diff.join(value); + } else { + component.value = diff.join(newString.slice(newPos, newPos + component.count)); + } + newPos += component.count; + + // Common case + if (!component.added) { + oldPos += component.count; + } + } else { + component.value = diff.join(oldString.slice(oldPos, oldPos + component.count)); + oldPos += component.count; + + // Reverse add and remove so removes are output first to match common convention + // The diffing algorithm is tied to add then remove output and this is the simplest + // route to get the desired output with minimal overhead. + if (componentPos && components[componentPos - 1].added) { + var tmp = components[componentPos - 1]; + components[componentPos - 1] = components[componentPos]; + components[componentPos] = tmp; + } + } + } + + // Special case handle for when one terminal is ignored (i.e. whitespace). + // For this case we merge the terminal into the prior string and drop the change. + // This is only available for string mode. + var lastComponent = components[componentLen - 1]; + if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { + components[componentLen - 2].value += lastComponent.value; + components.pop(); + } + + return components; + } + + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + + }); + + unwrapExports$1(base); + + var character = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports.characterDiff = undefined; + exports. /*istanbul ignore end*/diffChars = diffChars; + + + + /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /*istanbul ignore end*/var characterDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/characterDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); + function diffChars(oldStr, newStr, options) { + return characterDiff.diff(oldStr, newStr, options); + } + + }); + + unwrapExports$1(character); + var character_1 = character.characterDiff; + var character_2 = character.diffChars; + + var params = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports. /*istanbul ignore end*/generateOptions = generateOptions; + function generateOptions(options, defaults) { + if (typeof options === 'function') { + defaults.callback = options; + } else if (options) { + for (var name in options) { + /* istanbul ignore else */ + if (options.hasOwnProperty(name)) { + defaults[name] = options[name]; + } + } + } + return defaults; + } + + }); + + unwrapExports$1(params); + var params_1 = params.generateOptions; + + var word = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports.wordDiff = undefined; + exports. /*istanbul ignore end*/diffWords = diffWords; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = diffWordsWithSpace; + + + + /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); + + /*istanbul ignore end*/ + + /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /*istanbul ignore end*/ // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode + // + // Ranges and exceptions: + // Latin-1 Supplement, 0080–00FF + // - U+00D7 × Multiplication sign + // - U+00F7 ÷ Division sign + // Latin Extended-A, 0100–017F + // Latin Extended-B, 0180–024F + // IPA Extensions, 0250–02AF + // Spacing Modifier Letters, 02B0–02FF + // - U+02C7 ˇ ˇ Caron + // - U+02D8 ˘ ˘ Breve + // - U+02D9 ˙ ˙ Dot Above + // - U+02DA ˚ ˚ Ring Above + // - U+02DB ˛ ˛ Ogonek + // - U+02DC ˜ ˜ Small Tilde + // - U+02DD ˝ ˝ Double Acute Accent + // Latin Extended Additional, 1E00–1EFF + var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/; + + var reWhitespace = /\S/; + + var wordDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/wordDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); + wordDiff.equals = function (left, right) { + if (this.options.ignoreCase) { + left = left.toLowerCase(); + right = right.toLowerCase(); + } + return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right); + }; + wordDiff.tokenize = function (value) { + var tokens = value.split(/(\s+|\b)/); + + // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set. + for (var i = 0; i < tokens.length - 1; i++) { + // If we have an empty string in the next field and we have only word chars before and after, merge + if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) { + tokens[i] += tokens[i + 2]; + tokens.splice(i + 1, 2); + i--; + } + } + + return tokens; + }; + + function diffWords(oldStr, newStr, options) { + options = /*istanbul ignore start*/(0, params.generateOptions) /*istanbul ignore end*/(options, { ignoreWhitespace: true }); + return wordDiff.diff(oldStr, newStr, options); + } + + function diffWordsWithSpace(oldStr, newStr, options) { + return wordDiff.diff(oldStr, newStr, options); + } + + }); + + unwrapExports$1(word); + var word_1 = word.wordDiff; + var word_2 = word.diffWords; + var word_3 = word.diffWordsWithSpace; + + var line = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports.lineDiff = undefined; + exports. /*istanbul ignore end*/diffLines = diffLines; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = diffTrimmedLines; + + + + /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); + + /*istanbul ignore end*/ + + /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /*istanbul ignore end*/var lineDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/lineDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); + lineDiff.tokenize = function (value) { + var retLines = [], + linesAndNewlines = value.split(/(\n|\r\n)/); + + // Ignore the final empty token that occurs if the string ends with a new line + if (!linesAndNewlines[linesAndNewlines.length - 1]) { + linesAndNewlines.pop(); + } + + // Merge the content and line separators into single tokens + for (var i = 0; i < linesAndNewlines.length; i++) { + var line = linesAndNewlines[i]; + + if (i % 2 && !this.options.newlineIsToken) { + retLines[retLines.length - 1] += line; + } else { + if (this.options.ignoreWhitespace) { + line = line.trim(); + } + retLines.push(line); + } + } + + return retLines; + }; + + function diffLines(oldStr, newStr, callback) { + return lineDiff.diff(oldStr, newStr, callback); + } + function diffTrimmedLines(oldStr, newStr, callback) { + var options = /*istanbul ignore start*/(0, params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true }); + return lineDiff.diff(oldStr, newStr, options); + } + + }); + + unwrapExports$1(line); + var line_1 = line.lineDiff; + var line_2 = line.diffLines; + var line_3 = line.diffTrimmedLines; + + var sentence = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports.sentenceDiff = undefined; + exports. /*istanbul ignore end*/diffSentences = diffSentences; + + + + /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /*istanbul ignore end*/var sentenceDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/sentenceDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); + sentenceDiff.tokenize = function (value) { + return value.split(/(\S.+?[.!?])(?=\s+|$)/); + }; + + function diffSentences(oldStr, newStr, callback) { + return sentenceDiff.diff(oldStr, newStr, callback); + } + + }); + + unwrapExports$1(sentence); + var sentence_1 = sentence.sentenceDiff; + var sentence_2 = sentence.diffSentences; + + var css = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports.cssDiff = undefined; + exports. /*istanbul ignore end*/diffCss = diffCss; + + + + /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /*istanbul ignore end*/var cssDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/cssDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); + cssDiff.tokenize = function (value) { + return value.split(/([{}:;,]|\s+)/); + }; + + function diffCss(oldStr, newStr, callback) { + return cssDiff.diff(oldStr, newStr, callback); + } + + }); + + unwrapExports$1(css); + var css_1 = css.cssDiff; + var css_2 = css.diffCss; + + var json = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports.jsonDiff = undefined; + + var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + + exports. /*istanbul ignore end*/diffJson = diffJson; + /*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = canonicalize; + + + + /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); + + /*istanbul ignore end*/ + + /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /*istanbul ignore end*/var objectPrototypeToString = Object.prototype.toString; + + var jsonDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/jsonDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); + // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a + // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: + jsonDiff.useLongestToken = true; + + jsonDiff.tokenize = /*istanbul ignore start*/line.lineDiff /*istanbul ignore end*/.tokenize; + jsonDiff.castInput = function (value) { + /*istanbul ignore start*/var _options = /*istanbul ignore end*/this.options, + undefinedReplacement = _options.undefinedReplacement, + _options$stringifyRep = _options.stringifyReplacer, + stringifyReplacer = _options$stringifyRep === undefined ? function (k, v) /*istanbul ignore start*/{ + return (/*istanbul ignore end*/typeof v === 'undefined' ? undefinedReplacement : v + ); + } : _options$stringifyRep; + + + return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' '); + }; + jsonDiff.equals = function (left, right) { + return (/*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')) + ); + }; + + function diffJson(oldObj, newObj, options) { + return jsonDiff.diff(oldObj, newObj, options); + } + + // This function handles the presence of circular references by bailing out when encountering an + // object that is already on the "stack" of items being processed. Accepts an optional replacer + function canonicalize(obj, stack, replacementStack, replacer, key) { + stack = stack || []; + replacementStack = replacementStack || []; + + if (replacer) { + obj = replacer(key, obj); + } + + var i = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; + + for (i = 0; i < stack.length; i += 1) { + if (stack[i] === obj) { + return replacementStack[i]; + } + } + + var canonicalizedObj = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; + + if ('[object Array]' === objectPrototypeToString.call(obj)) { + stack.push(obj); + canonicalizedObj = new Array(obj.length); + replacementStack.push(canonicalizedObj); + for (i = 0; i < obj.length; i += 1) { + canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key); + } + stack.pop(); + replacementStack.pop(); + return canonicalizedObj; + } + + if (obj && obj.toJSON) { + obj = obj.toJSON(); + } + + if ( /*istanbul ignore start*/(typeof /*istanbul ignore end*/obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null) { + stack.push(obj); + canonicalizedObj = {}; + replacementStack.push(canonicalizedObj); + var sortedKeys = [], + _key = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; + for (_key in obj) { + /* istanbul ignore else */ + if (obj.hasOwnProperty(_key)) { + sortedKeys.push(_key); + } + } + sortedKeys.sort(); + for (i = 0; i < sortedKeys.length; i += 1) { + _key = sortedKeys[i]; + canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key); + } + stack.pop(); + replacementStack.pop(); + } else { + canonicalizedObj = obj; + } + return canonicalizedObj; + } + + }); + + unwrapExports$1(json); + var json_1 = json.jsonDiff; + var json_2 = json.diffJson; + var json_3 = json.canonicalize; + + var array$2 = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports.arrayDiff = undefined; + exports. /*istanbul ignore end*/diffArrays = diffArrays; + + + + /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /*istanbul ignore end*/var arrayDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); + arrayDiff.tokenize = function (value) { + return value.slice(); + }; + arrayDiff.join = arrayDiff.removeEmpty = function (value) { + return value; + }; + + function diffArrays(oldArr, newArr, callback) { + return arrayDiff.diff(oldArr, newArr, callback); + } + + }); + + unwrapExports$1(array$2); + var array_1 = array$2.arrayDiff; + var array_2 = array$2.diffArrays; + + var parse = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports. /*istanbul ignore end*/parsePatch = parsePatch; + function parsePatch(uniDiff) { + /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/), + delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [], + list = [], + i = 0; + + function parseIndex() { + var index = {}; + list.push(index); + + // Parse diff metadata + while (i < diffstr.length) { + var line = diffstr[i]; + + // File header found, end parsing diff metadata + if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { + break; + } + + // Diff index + var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); + if (header) { + index.index = header[1]; + } + + i++; + } + + // Parse file headers if they are defined. Unified diff requires them, but + // there's no technical issues to have an isolated hunk without file header + parseFileHeader(index); + parseFileHeader(index); + + // Parse hunks + index.hunks = []; + + while (i < diffstr.length) { + var _line = diffstr[i]; + + if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) { + break; + } else if (/^@@/.test(_line)) { + index.hunks.push(parseHunk()); + } else if (_line && options.strict) { + // Ignore unexpected content unless in strict mode + throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line)); + } else { + i++; + } + } + } + + // Parses the --- and +++ headers, if none are found, no lines + // are consumed. + function parseFileHeader(index) { + var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]); + if (fileHeader) { + var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new'; + var data = fileHeader[2].split('\t', 2); + var fileName = data[0].replace(/\\\\/g, '\\'); + if (/^".*"$/.test(fileName)) { + fileName = fileName.substr(1, fileName.length - 2); + } + index[keyPrefix + 'FileName'] = fileName; + index[keyPrefix + 'Header'] = (data[1] || '').trim(); + + i++; + } + } + + // Parses a hunk + // This assumes that we are at the start of a hunk. + function parseHunk() { + var chunkHeaderIndex = i, + chunkHeaderLine = diffstr[i++], + chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); + + var hunk = { + oldStart: +chunkHeader[1], + oldLines: +chunkHeader[2] || 1, + newStart: +chunkHeader[3], + newLines: +chunkHeader[4] || 1, + lines: [], + linedelimiters: [] + }; + + var addCount = 0, + removeCount = 0; + for (; i < diffstr.length; i++) { + // Lines starting with '---' could be mistaken for the "remove line" operation + // But they could be the header for the next file. Therefore prune such cases out. + if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) { + break; + } + var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0]; + + if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') { + hunk.lines.push(diffstr[i]); + hunk.linedelimiters.push(delimiters[i] || '\n'); + + if (operation === '+') { + addCount++; + } else if (operation === '-') { + removeCount++; + } else if (operation === ' ') { + addCount++; + removeCount++; + } + } else { + break; + } + } + + // Handle the empty block count case + if (!addCount && hunk.newLines === 1) { + hunk.newLines = 0; + } + if (!removeCount && hunk.oldLines === 1) { + hunk.oldLines = 0; + } + + // Perform optional sanity checking + if (options.strict) { + if (addCount !== hunk.newLines) { + throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); + } + if (removeCount !== hunk.oldLines) { + throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); + } + } + + return hunk; + } + + while (i < diffstr.length) { + parseIndex(); + } + + return list; + } + + }); + + unwrapExports$1(parse); + var parse_1 = parse.parsePatch; + + var distanceIterator = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + + exports["default"] = /*istanbul ignore end*/function (start, minLine, maxLine) { + var wantForward = true, + backwardExhausted = false, + forwardExhausted = false, + localOffset = 1; + + return function iterator() { + if (wantForward && !forwardExhausted) { + if (backwardExhausted) { + localOffset++; + } else { + wantForward = false; + } + + // Check if trying to fit beyond text length, and if not, check it fits + // after offset location (or desired location on first iteration) + if (start + localOffset <= maxLine) { + return localOffset; + } + + forwardExhausted = true; + } + + if (!backwardExhausted) { + if (!forwardExhausted) { + wantForward = true; + } + + // Check if trying to fit before text beginning, and if not, check it fits + // before offset location + if (minLine <= start - localOffset) { + return -localOffset++; + } + + backwardExhausted = true; + return iterator(); + } + + // We tried to fit hunk before text beginning and beyond text length, then + // hunk can't fit on the text. Return undefined + }; + }; + + }); + + unwrapExports$1(distanceIterator); + + var apply$1 = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports. /*istanbul ignore end*/applyPatch = applyPatch; + /*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches; + + + + + + /*istanbul ignore start*/var _distanceIterator2 = _interopRequireDefault(distanceIterator); + + function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /*istanbul ignore end*/function applyPatch(source, uniDiff) { + /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + if (typeof uniDiff === 'string') { + uniDiff = /*istanbul ignore start*/(0, parse.parsePatch) /*istanbul ignore end*/(uniDiff); + } + + if (Array.isArray(uniDiff)) { + if (uniDiff.length > 1) { + throw new Error('applyPatch only works with a single input.'); + } + + uniDiff = uniDiff[0]; + } + + // Apply the diff to the input + var lines = source.split(/\r\n|[\n\v\f\r\x85]/), + delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [], + hunks = uniDiff.hunks, + compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{ + return (/*istanbul ignore end*/line === patchContent + ); + }, + errorCount = 0, + fuzzFactor = options.fuzzFactor || 0, + minLine = 0, + offset = 0, + removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/, + addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; + + /** + * Checks if the hunk exactly fits on the provided location + */ + function hunkFits(hunk, toPos) { + for (var j = 0; j < hunk.lines.length; j++) { + var line = hunk.lines[j], + operation = line.length > 0 ? line[0] : ' ', + content = line.length > 0 ? line.substr(1) : line; + + if (operation === ' ' || operation === '-') { + // Context sanity check + if (!compareLine(toPos + 1, lines[toPos], operation, content)) { + errorCount++; + + if (errorCount > fuzzFactor) { + return false; + } + } + toPos++; + } + } + + return true; + } + + // Search best fit offsets for each hunk based on the previous ones + for (var i = 0; i < hunks.length; i++) { + var hunk = hunks[i], + maxLine = lines.length - hunk.oldLines, + localOffset = 0, + toPos = offset + hunk.oldStart - 1; + + var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine); + + for (; localOffset !== undefined; localOffset = iterator()) { + if (hunkFits(hunk, toPos + localOffset)) { + hunk.offset = offset += localOffset; + break; + } + } + + if (localOffset === undefined) { + return false; + } + + // Set lower text limit to end of the current hunk, so next ones don't try + // to fit over already patched text + minLine = hunk.offset + hunk.oldStart + hunk.oldLines; + } + + // Apply patch hunks + var diffOffset = 0; + for (var _i = 0; _i < hunks.length; _i++) { + var _hunk = hunks[_i], + _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1; + diffOffset += _hunk.newLines - _hunk.oldLines; + + if (_toPos < 0) { + // Creating a new file + _toPos = 0; + } + + for (var j = 0; j < _hunk.lines.length; j++) { + var line = _hunk.lines[j], + operation = line.length > 0 ? line[0] : ' ', + content = line.length > 0 ? line.substr(1) : line, + delimiter = _hunk.linedelimiters[j]; + + if (operation === ' ') { + _toPos++; + } else if (operation === '-') { + lines.splice(_toPos, 1); + delimiters.splice(_toPos, 1); + /* istanbul ignore else */ + } else if (operation === '+') { + lines.splice(_toPos, 0, content); + delimiters.splice(_toPos, 0, delimiter); + _toPos++; + } else if (operation === '\\') { + var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null; + if (previousOperation === '+') { + removeEOFNL = true; + } else if (previousOperation === '-') { + addEOFNL = true; + } + } + } + } + + // Handle EOFNL insertion/removal + if (removeEOFNL) { + while (!lines[lines.length - 1]) { + lines.pop(); + delimiters.pop(); + } + } else if (addEOFNL) { + lines.push(''); + delimiters.push('\n'); + } + for (var _k = 0; _k < lines.length - 1; _k++) { + lines[_k] = lines[_k] + delimiters[_k]; + } + return lines.join(''); + } + + // Wrapper that supports multiple file patches via callbacks. + function applyPatches(uniDiff, options) { + if (typeof uniDiff === 'string') { + uniDiff = /*istanbul ignore start*/(0, parse.parsePatch) /*istanbul ignore end*/(uniDiff); + } + + var currentIndex = 0; + function processIndex() { + var index = uniDiff[currentIndex++]; + if (!index) { + return options.complete(); + } + + options.loadFile(index, function (err, data) { + if (err) { + return options.complete(err); + } + + var updatedContent = applyPatch(data, index, options); + options.patched(index, updatedContent, function (err) { + if (err) { + return options.complete(err); + } + + processIndex(); + }); + }); + } + processIndex(); + } + + }); + + unwrapExports$1(apply$1); + var apply_1 = apply$1.applyPatch; + var apply_2 = apply$1.applyPatches; + + var create = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports. /*istanbul ignore end*/structuredPatch = structuredPatch; + /*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = createTwoFilesPatch; + /*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = createPatch; + + + + /*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + + /*istanbul ignore end*/function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { + if (!options) { + options = {}; + } + if (typeof options.context === 'undefined') { + options.context = 4; + } + + var diff = /*istanbul ignore start*/(0, line.diffLines) /*istanbul ignore end*/(oldStr, newStr, options); + diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function (entry) { + return ' ' + entry; + }); + } + + var hunks = []; + var oldRangeStart = 0, + newRangeStart = 0, + curRange = [], + oldLine = 1, + newLine = 1; + + /*istanbul ignore start*/var _loop = function _loop( /*istanbul ignore end*/i) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, '').split('\n'); + current.lines = lines; + + if (current.added || current.removed) { + /*istanbul ignore start*/var _curRange; + + /*istanbul ignore end*/ // If we have previous context, start with that + if (!oldRangeStart) { + var prev = diff[i - 1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : []; + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + + // Output our changes + /*istanbul ignore start*/(_curRange = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/lines.map(function (entry) { + return (current.added ? '+' : '-') + entry; + }))); + + // Track the updated file position + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + // Identical context lines. Track line changes + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= options.context * 2 && i < diff.length - 2) { + /*istanbul ignore start*/var _curRange2; + + /*istanbul ignore end*/ // Overlapping + /*istanbul ignore start*/(_curRange2 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines))); + } else { + /*istanbul ignore start*/var _curRange3; + + /*istanbul ignore end*/ // end the range and output + var contextSize = Math.min(lines.length, options.context); + /*istanbul ignore start*/(_curRange3 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines.slice(0, contextSize)))); + + var hunk = { + oldStart: oldRangeStart, + oldLines: oldLine - oldRangeStart + contextSize, + newStart: newRangeStart, + newLines: newLine - newRangeStart + contextSize, + lines: curRange + }; + if (i >= diff.length - 2 && lines.length <= options.context) { + // EOF is inside this hunk + var oldEOFNewline = /\n$/.test(oldStr); + var newEOFNewline = /\n$/.test(newStr); + if (lines.length == 0 && !oldEOFNewline) { + // special case: old has no eol and no trailing context; no-nl can end up before adds + curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file'); + } else if (!oldEOFNewline || !newEOFNewline) { + curRange.push('\\ No newline at end of file'); + } + } + hunks.push(hunk); + + oldRangeStart = 0; + newRangeStart = 0; + curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + }; + + for (var i = 0; i < diff.length; i++) { + /*istanbul ignore start*/_loop( /*istanbul ignore end*/i); + } + + return { + oldFileName: oldFileName, newFileName: newFileName, + oldHeader: oldHeader, newHeader: newHeader, + hunks: hunks + }; + } + + function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { + var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options); + + var ret = []; + if (oldFileName == newFileName) { + ret.push('Index: ' + oldFileName); + } + ret.push('==================================================================='); + ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader)); + ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader)); + + for (var i = 0; i < diff.hunks.length; i++) { + var hunk = diff.hunks[i]; + ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@'); + ret.push.apply(ret, hunk.lines); + } + + return ret.join('\n') + '\n'; + } + + function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { + return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); + } + + }); + + unwrapExports$1(create); + var create_1 = create.structuredPatch; + var create_2 = create.createTwoFilesPatch; + var create_3 = create.createPatch; + + var array$4 = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports. /*istanbul ignore end*/arrayEqual = arrayEqual; + /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayStartsWith = arrayStartsWith; + function arrayEqual(a, b) { + if (a.length !== b.length) { + return false; + } + + return arrayStartsWith(a, b); + } + + function arrayStartsWith(array, start) { + if (start.length > array.length) { + return false; + } + + for (var i = 0; i < start.length; i++) { + if (start[i] !== array[i]) { + return false; + } + } + + return true; + } + + }); + + unwrapExports$1(array$4); + var array_1$1 = array$4.arrayEqual; + var array_2$1 = array$4.arrayStartsWith; + + var merge_1 = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports. /*istanbul ignore end*/calcLineCount = calcLineCount; + /*istanbul ignore start*/exports. /*istanbul ignore end*/merge = merge; + + + + + + + + /*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } + + /*istanbul ignore end*/function calcLineCount(hunk) { + /*istanbul ignore start*/var _calcOldNewLineCount = /*istanbul ignore end*/calcOldNewLineCount(hunk.lines), + oldLines = _calcOldNewLineCount.oldLines, + newLines = _calcOldNewLineCount.newLines; + + if (oldLines !== undefined) { + hunk.oldLines = oldLines; + } else { + delete hunk.oldLines; + } + + if (newLines !== undefined) { + hunk.newLines = newLines; + } else { + delete hunk.newLines; + } + } + + function merge(mine, theirs, base) { + mine = loadPatch(mine, base); + theirs = loadPatch(theirs, base); + + var ret = {}; + + // For index we just let it pass through as it doesn't have any necessary meaning. + // Leaving sanity checks on this to the API consumer that may know more about the + // meaning in their own context. + if (mine.index || theirs.index) { + ret.index = mine.index || theirs.index; + } + + if (mine.newFileName || theirs.newFileName) { + if (!fileNameChanged(mine)) { + // No header or no change in ours, use theirs (and ours if theirs does not exist) + ret.oldFileName = theirs.oldFileName || mine.oldFileName; + ret.newFileName = theirs.newFileName || mine.newFileName; + ret.oldHeader = theirs.oldHeader || mine.oldHeader; + ret.newHeader = theirs.newHeader || mine.newHeader; + } else if (!fileNameChanged(theirs)) { + // No header or no change in theirs, use ours + ret.oldFileName = mine.oldFileName; + ret.newFileName = mine.newFileName; + ret.oldHeader = mine.oldHeader; + ret.newHeader = mine.newHeader; + } else { + // Both changed... figure it out + ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName); + ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName); + ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader); + ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader); + } + } + + ret.hunks = []; + + var mineIndex = 0, + theirsIndex = 0, + mineOffset = 0, + theirsOffset = 0; + + while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) { + var mineCurrent = mine.hunks[mineIndex] || { oldStart: Infinity }, + theirsCurrent = theirs.hunks[theirsIndex] || { oldStart: Infinity }; + + if (hunkBefore(mineCurrent, theirsCurrent)) { + // This patch does not overlap with any of the others, yay. + ret.hunks.push(cloneHunk(mineCurrent, mineOffset)); + mineIndex++; + theirsOffset += mineCurrent.newLines - mineCurrent.oldLines; + } else if (hunkBefore(theirsCurrent, mineCurrent)) { + // This patch does not overlap with any of the others, yay. + ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset)); + theirsIndex++; + mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines; + } else { + // Overlap, merge as best we can + var mergedHunk = { + oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart), + oldLines: 0, + newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset), + newLines: 0, + lines: [] + }; + mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines); + theirsIndex++; + mineIndex++; + + ret.hunks.push(mergedHunk); + } + } + + return ret; + } + + function loadPatch(param, base) { + if (typeof param === 'string') { + if (/^@@/m.test(param) || /^Index:/m.test(param)) { + return (/*istanbul ignore start*/(0, parse.parsePatch) /*istanbul ignore end*/(param)[0] + ); + } + + if (!base) { + throw new Error('Must provide a base reference or pass in a patch'); + } + return (/*istanbul ignore start*/(0, create.structuredPatch) /*istanbul ignore end*/(undefined, undefined, base, param) + ); + } + + return param; + } + + function fileNameChanged(patch) { + return patch.newFileName && patch.newFileName !== patch.oldFileName; + } + + function selectField(index, mine, theirs) { + if (mine === theirs) { + return mine; + } else { + index.conflict = true; + return { mine: mine, theirs: theirs }; + } + } + + function hunkBefore(test, check) { + return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart; + } + + function cloneHunk(hunk, offset) { + return { + oldStart: hunk.oldStart, oldLines: hunk.oldLines, + newStart: hunk.newStart + offset, newLines: hunk.newLines, + lines: hunk.lines + }; + } + + function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) { + // This will generally result in a conflicted hunk, but there are cases where the context + // is the only overlap where we can successfully merge the content here. + var mine = { offset: mineOffset, lines: mineLines, index: 0 }, + their = { offset: theirOffset, lines: theirLines, index: 0 }; + + // Handle any leading content + insertLeading(hunk, mine, their); + insertLeading(hunk, their, mine); + + // Now in the overlap content. Scan through and select the best changes from each. + while (mine.index < mine.lines.length && their.index < their.lines.length) { + var mineCurrent = mine.lines[mine.index], + theirCurrent = their.lines[their.index]; + + if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) { + // Both modified ... + mutualChange(hunk, mine, their); + } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') { + /*istanbul ignore start*/var _hunk$lines; + + /*istanbul ignore end*/ // Mine inserted + /*istanbul ignore start*/(_hunk$lines = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(mine))); + } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') { + /*istanbul ignore start*/var _hunk$lines2; + + /*istanbul ignore end*/ // Theirs inserted + /*istanbul ignore start*/(_hunk$lines2 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(their))); + } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') { + // Mine removed or edited + removal(hunk, mine, their); + } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') { + // Their removed or edited + removal(hunk, their, mine, true); + } else if (mineCurrent === theirCurrent) { + // Context identity + hunk.lines.push(mineCurrent); + mine.index++; + their.index++; + } else { + // Context mismatch + conflict(hunk, collectChange(mine), collectChange(their)); + } + } + + // Now push anything that may be remaining + insertTrailing(hunk, mine); + insertTrailing(hunk, their); + + calcLineCount(hunk); + } + + function mutualChange(hunk, mine, their) { + var myChanges = collectChange(mine), + theirChanges = collectChange(their); + + if (allRemoves(myChanges) && allRemoves(theirChanges)) { + // Special case for remove changes that are supersets of one another + if ( /*istanbul ignore start*/(0, array$4.arrayStartsWith) /*istanbul ignore end*/(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) { + /*istanbul ignore start*/var _hunk$lines3; + + /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines3 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges)); + return; + } else if ( /*istanbul ignore start*/(0, array$4.arrayStartsWith) /*istanbul ignore end*/(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) { + /*istanbul ignore start*/var _hunk$lines4; + + /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines4 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines4 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges)); + return; + } + } else if ( /*istanbul ignore start*/(0, array$4.arrayEqual) /*istanbul ignore end*/(myChanges, theirChanges)) { + /*istanbul ignore start*/var _hunk$lines5; + + /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines5 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines5 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges)); + return; + } + + conflict(hunk, myChanges, theirChanges); + } + + function removal(hunk, mine, their, swap) { + var myChanges = collectChange(mine), + theirChanges = collectContext(their, myChanges); + if (theirChanges.merged) { + /*istanbul ignore start*/var _hunk$lines6; + + /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines6 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines6 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges.merged)); + } else { + conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges); + } + } + + function conflict(hunk, mine, their) { + hunk.conflict = true; + hunk.lines.push({ + conflict: true, + mine: mine, + theirs: their + }); + } + + function insertLeading(hunk, insert, their) { + while (insert.offset < their.offset && insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + insert.offset++; + } + } + function insertTrailing(hunk, insert) { + while (insert.index < insert.lines.length) { + var line = insert.lines[insert.index++]; + hunk.lines.push(line); + } + } + + function collectChange(state) { + var ret = [], + operation = state.lines[state.index][0]; + while (state.index < state.lines.length) { + var line = state.lines[state.index]; + + // Group additions that are immediately after subtractions and treat them as one "atomic" modify change. + if (operation === '-' && line[0] === '+') { + operation = '+'; + } + + if (operation === line[0]) { + ret.push(line); + state.index++; + } else { + break; + } + } + + return ret; + } + function collectContext(state, matchChanges) { + var changes = [], + merged = [], + matchIndex = 0, + contextChanges = false, + conflicted = false; + while (matchIndex < matchChanges.length && state.index < state.lines.length) { + var change = state.lines[state.index], + match = matchChanges[matchIndex]; + + // Once we've hit our add, then we are done + if (match[0] === '+') { + break; + } + + contextChanges = contextChanges || change[0] !== ' '; + + merged.push(match); + matchIndex++; + + // Consume any additions in the other block as a conflict to attempt + // to pull in the remaining context after this + if (change[0] === '+') { + conflicted = true; + + while (change[0] === '+') { + changes.push(change); + change = state.lines[++state.index]; + } + } + + if (match.substr(1) === change.substr(1)) { + changes.push(change); + state.index++; + } else { + conflicted = true; + } + } + + if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) { + conflicted = true; + } + + if (conflicted) { + return changes; + } + + while (matchIndex < matchChanges.length) { + merged.push(matchChanges[matchIndex++]); + } + + return { + merged: merged, + changes: changes + }; + } + + function allRemoves(changes) { + return changes.reduce(function (prev, change) { + return prev && change[0] === '-'; + }, true); + } + function skipRemoveSuperset(state, removeChanges, delta) { + for (var i = 0; i < delta; i++) { + var changeContent = removeChanges[removeChanges.length - delta + i].substr(1); + if (state.lines[state.index + i] !== ' ' + changeContent) { + return false; + } + } + + state.index += delta; + return true; + } + + function calcOldNewLineCount(lines) { + var oldLines = 0; + var newLines = 0; + + lines.forEach(function (line) { + if (typeof line !== 'string') { + var myCount = calcOldNewLineCount(line.mine); + var theirCount = calcOldNewLineCount(line.theirs); + + if (oldLines !== undefined) { + if (myCount.oldLines === theirCount.oldLines) { + oldLines += myCount.oldLines; + } else { + oldLines = undefined; + } + } + + if (newLines !== undefined) { + if (myCount.newLines === theirCount.newLines) { + newLines += myCount.newLines; + } else { + newLines = undefined; + } + } + } else { + if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) { + newLines++; + } + if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) { + oldLines++; + } + } + }); + + return { oldLines: oldLines, newLines: newLines }; + } + + }); + + unwrapExports$1(merge_1); + var merge_2 = merge_1.calcLineCount; + var merge_3 = merge_1.merge; + + var dmp = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports. /*istanbul ignore end*/convertChangesToDMP = convertChangesToDMP; + // See: http://code.google.com/p/google-diff-match-patch/wiki/API + function convertChangesToDMP(changes) { + var ret = [], + change = /*istanbul ignore start*/void 0 /*istanbul ignore end*/, + operation = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; + for (var i = 0; i < changes.length; i++) { + change = changes[i]; + if (change.added) { + operation = 1; + } else if (change.removed) { + operation = -1; + } else { + operation = 0; + } + + ret.push([operation, change.value]); + } + return ret; + } + + }); + + unwrapExports$1(dmp); + var dmp_1 = dmp.convertChangesToDMP; + + var xml = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports. /*istanbul ignore end*/convertChangesToXML = convertChangesToXML; + function convertChangesToXML(changes) { + var ret = []; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(''); + } else if (change.removed) { + ret.push(''); + } + } + return ret.join(''); + } + + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, '&'); + n = n.replace(//g, '>'); + n = n.replace(/"/g, '"'); + + return n; + } + + }); + + unwrapExports$1(xml); + var xml_1 = xml.convertChangesToXML; + + var lib$1 = createCommonjsModule$1(function (module, exports) { + + exports.__esModule = true; + exports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.merge = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.diffArrays = exports.diffJson = exports.diffCss = exports.diffSentences = exports.diffTrimmedLines = exports.diffLines = exports.diffWordsWithSpace = exports.diffWords = exports.diffChars = exports.Diff = undefined; + + /*istanbul ignore end*/ + + /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); + + /*istanbul ignore end*/ + + + + + + + + + + + + + + + + + + + + + + + + + + /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + + /* See LICENSE file for terms of use */ + + /* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ + exports. /*istanbul ignore end*/Diff = _base2['default']; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffChars = character.diffChars; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffWords = word.diffWords; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = word.diffWordsWithSpace; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffLines = line.diffLines; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = line.diffTrimmedLines; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffSentences = sentence.diffSentences; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffCss = css.diffCss; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffJson = json.diffJson; + /*istanbul ignore start*/exports. /*istanbul ignore end*/diffArrays = array$2.diffArrays; + /*istanbul ignore start*/exports. /*istanbul ignore end*/structuredPatch = create.structuredPatch; + /*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = create.createTwoFilesPatch; + /*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = create.createPatch; + /*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatch = apply$1.applyPatch; + /*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = apply$1.applyPatches; + /*istanbul ignore start*/exports. /*istanbul ignore end*/parsePatch = parse.parsePatch; + /*istanbul ignore start*/exports. /*istanbul ignore end*/merge = merge_1.merge; + /*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToDMP = dmp.convertChangesToDMP; + /*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToXML = xml.convertChangesToXML; + /*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = json.canonicalize; + + }); + + unwrapExports$1(lib$1); + var lib_1$1 = lib$1.canonicalize; + var lib_2$1 = lib$1.convertChangesToXML; + var lib_3$1 = lib$1.convertChangesToDMP; + var lib_4$1 = lib$1.merge; + var lib_5$1 = lib$1.parsePatch; + var lib_6 = lib$1.applyPatches; + var lib_7 = lib$1.applyPatch; + var lib_8 = lib$1.createPatch; + var lib_9 = lib$1.createTwoFilesPatch; + var lib_10 = lib$1.structuredPatch; + var lib_11 = lib$1.diffArrays; + var lib_12 = lib$1.diffJson; + var lib_13 = lib$1.diffCss; + var lib_14 = lib$1.diffSentences; + var lib_15 = lib$1.diffTrimmedLines; + var lib_16 = lib$1.diffLines; + var lib_17 = lib$1.diffWordsWithSpace; + var lib_18 = lib$1.diffWords; + var lib_19 = lib$1.diffChars; + var lib_20 = lib$1.Diff; + + var arrayProto$6 = lib.prototypes.array; + + + + + + + var join$5 = arrayProto$6.join; + var map$2 = arrayProto$6.map; + var push$2 = arrayProto$6.push; + + function colorSinonMatchText(matcher, calledArg, calledArgMessage) { + var calledArgumentMessage = calledArgMessage; + if (!matcher.test(calledArg)) { + matcher.message = color.red(matcher.message); + if (calledArgumentMessage) { + calledArgumentMessage = color.green(calledArgumentMessage); + } + } + return calledArgumentMessage + " " + matcher.message; + } + + function colorDiffText(diff) { + var objects = map$2(diff, function(part) { + var text = part.value; + if (part.added) { + text = color.green(text); + } else if (part.removed) { + text = color.red(text); + } + if (diff.length === 2) { + text += " "; // format simple diffs + } + return text; + }); + return join$5(objects, ""); + } + + var spyFormatters = { + c: function(spyInstance) { + return timesInWords(spyInstance.callCount); + }, + + n: function(spyInstance) { + // eslint-disable-next-line local-rules/no-prototype-methods + return spyInstance.toString(); + }, + + D: function(spyInstance, args) { + var message = ""; + + for (var i = 0, l = spyInstance.callCount; i < l; ++i) { + // describe multiple calls + if (l > 1) { + message += "\nCall " + (i + 1) + ":"; + } + var calledArgs = spyInstance.getCall(i).args; + for (var j = 0; j < calledArgs.length || j < args.length; ++j) { + message += "\n"; + var calledArgMessage = j < calledArgs.length ? format_1(calledArgs[j]) : ""; + if (match_1$1.isMatcher(args[j])) { + message += colorSinonMatchText(args[j], calledArgs[j], calledArgMessage); + } else { + var expectedArgMessage = j < args.length ? format_1(args[j]) : ""; + var diff = lib$1.diffJson(calledArgMessage, expectedArgMessage); + message += colorDiffText(diff); + } + } + } + + return message; + }, + + C: function(spyInstance) { + var calls = []; + + for (var i = 0, l = spyInstance.callCount; i < l; ++i) { + // eslint-disable-next-line local-rules/no-prototype-methods + var stringifiedCall = " " + spyInstance.getCall(i).toString(); + if (/\n/.test(calls[i - 1])) { + stringifiedCall = "\n" + stringifiedCall; + } + push$2(calls, stringifiedCall); + } + + return calls.length > 0 ? "\n" + join$5(calls, "\n") : ""; + }, + + t: function(spyInstance) { + var objects = []; + + for (var i = 0, l = spyInstance.callCount; i < l; ++i) { + push$2(objects, format_1(spyInstance.thisValues[i])); + } + + return join$5(objects, ", "); + }, + + "*": function(spyInstance, args) { + return join$5( + map$2(args, function(arg) { + return format_1(arg); + }), + ", " + ); + } + }; + + var arrayProto$7 = lib.prototypes.array; + var createBehavior$1 = behavior.create; + + var functionName$5 = lib.functionName; + + + + var deepEqual$4 = deepEqual_1.use(match_1$1); + + + + + var valueToString$5 = lib.valueToString; + + /* cache references to library methods so that they also can be stubbed without problems */ + var concat$3 = arrayProto$7.concat; + var forEach$3 = arrayProto$7.forEach; + var pop = arrayProto$7.pop; + var push$3 = arrayProto$7.push; + var slice$4 = arrayProto$7.slice; + var filter$1 = Array.prototype.filter; + var ErrorConstructor = Error.prototype.constructor; + var bind = Function.prototype.bind; + + var callId = 0; + + function spy(object, property, types) { + var descriptor, methodDesc; + + if (isEsModule(object)) { + throw new TypeError("ES Modules cannot be spied"); + } + + if (!property && typeof object === "function") { + return spy.create(object); + } + + if (!object && !property) { + return spy.create(function() { + return; + }); + } + + if (!types) { + return wrapMethod(object, property, spy.create(object[property])); + } + + descriptor = {}; + methodDesc = getPropertyDescriptor(object, property); + + forEach$3(types, function(type) { + descriptor[type] = spy.create(methodDesc[type]); + }); + + return wrapMethod(object, property, descriptor); + } + + function incrementCallCount() { + this.called = true; + this.callCount += 1; + this.notCalled = false; + this.calledOnce = this.callCount === 1; + this.calledTwice = this.callCount === 2; + this.calledThrice = this.callCount === 3; + } + + function createCallProperties() { + this.firstCall = this.getCall(0); + this.secondCall = this.getCall(1); + this.thirdCall = this.getCall(2); + this.lastCall = this.getCall(this.callCount - 1); + } + + function createProxy(func, proxyLength) { + // Retain the function length: + var p; + if (proxyLength) { + // Do not change this to use an eval. Projects that depend on sinon block the use of eval. + // ref: https://github.com/sinonjs/sinon/issues/710 + switch (proxyLength) { + /*eslint-disable no-unused-vars, max-len*/ + case 1: + p = function proxy(a) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 2: + p = function proxy(a, b) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 3: + p = function proxy(a, b, c) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 4: + p = function proxy(a, b, c, d) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 5: + p = function proxy(a, b, c, d, e) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 6: + p = function proxy(a, b, c, d, e, f) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 7: + p = function proxy(a, b, c, d, e, f, g) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 8: + p = function proxy(a, b, c, d, e, f, g, h) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 9: + p = function proxy(a, b, c, d, e, f, g, h, i) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 10: + p = function proxy(a, b, c, d, e, f, g, h, i, j) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 11: + p = function proxy(a, b, c, d, e, f, g, h, i, j, k) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + case 12: + p = function proxy(a, b, c, d, e, f, g, h, i, j, k, l) { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + default: + p = function proxy() { + return p.invoke(func, this, slice$4(arguments)); + }; + break; + /*eslint-enable*/ + } + } else { + p = function proxy() { + return p.invoke(func, this, slice$4(arguments)); + }; + } + p.isSinonProxy = true; + return p; + } + + var uuid = 0; + + // Public API + var spyApi = { + formatters: spyFormatters, + + resetHistory: function() { + if (this.invoking) { + var err = new Error( + "Cannot reset Sinon function while invoking it. " + + "Move the call to .resetHistory outside of the callback." + ); + err.name = "InvalidResetException"; + throw err; + } + + this.called = false; + this.notCalled = true; + this.calledOnce = false; + this.calledTwice = false; + this.calledThrice = false; + this.callCount = 0; + this.firstCall = null; + this.secondCall = null; + this.thirdCall = null; + this.lastCall = null; + this.args = []; + this.returnValues = []; + this.thisValues = []; + this.exceptions = []; + this.callIds = []; + this.errorsWithCallStack = []; + if (this.fakes) { + forEach$3(this.fakes, function(fake) { + if (fake.resetHistory) { + fake.resetHistory(); + } else { + fake.reset(); + } + }); + } + + return this; + }, + + create: function create(func, spyLength) { + var name; + var funk = func; + + if (typeof funk !== "function") { + funk = function() { + return; + }; + } else { + name = functionName$5(funk); + } + + var length = spyLength || funk.length; + var proxy = createProxy(funk, length); + + extend(proxy, spy); + delete proxy.create; + extend(proxy, funk); + + proxy.resetHistory(); + proxy.prototype = funk.prototype; + proxy.displayName = name || "spy"; + proxy.toString = functionToString; + proxy.instantiateFake = spy.create; + proxy.id = "spy#" + uuid++; + + return proxy; + }, + + invoke: function invoke(func, thisValue, args) { + var matchings = this.matchingFakes(args); + var currentCallId = callId++; + var exception, returnValue; + + incrementCallCount.call(this); + push$3(this.thisValues, thisValue); + push$3(this.args, args); + push$3(this.callIds, currentCallId); + forEach$3(matchings, function(matching) { + incrementCallCount.call(matching); + push$3(matching.thisValues, thisValue); + push$3(matching.args, args); + push$3(matching.callIds, currentCallId); + }); + + // Make call properties available from within the spied function: + createCallProperties.call(this); + forEach$3(matchings, function(matching) { + createCallProperties.call(matching); + }); + + try { + this.invoking = true; + + var thisCall = this.getCall(this.callCount - 1); + + if (thisCall.calledWithNew()) { + // Call through with `new` + returnValue = new (bind.apply(this.func || func, concat$3([thisValue], args)))(); + + if (typeof returnValue !== "object") { + returnValue = thisValue; + } + } else { + returnValue = (this.func || func).apply(thisValue, args); + } + } catch (e) { + exception = e; + } finally { + delete this.invoking; + } + + push$3(this.exceptions, exception); + push$3(this.returnValues, returnValue); + forEach$3(matchings, function(matching) { + push$3(matching.exceptions, exception); + push$3(matching.returnValues, returnValue); + }); + + var err = new ErrorConstructor(); + // 1. Please do not get stack at this point. It may be so very slow, and not actually used + // 2. PhantomJS does not serialize the stack trace until the error has been thrown: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack + try { + throw err; + } catch (e) { + /* empty */ + } + push$3(this.errorsWithCallStack, err); + forEach$3(matchings, function(matching) { + push$3(matching.errorsWithCallStack, err); + }); + + // Make return value and exception available in the calls: + createCallProperties.call(this); + forEach$3(matchings, function(matching) { + createCallProperties.call(matching); + }); + + if (exception !== undefined) { + throw exception; + } + + return returnValue; + }, + + named: function named(name) { + this.displayName = name; + return this; + }, + + getCall: function getCall(i) { + if (i < 0 || i >= this.callCount) { + return null; + } + + return call$1$1( + this, + this.thisValues[i], + this.args[i], + this.returnValues[i], + this.exceptions[i], + this.callIds[i], + this.errorsWithCallStack[i] + ); + }, + + getCalls: function() { + var calls = []; + var i; + + for (i = 0; i < this.callCount; i++) { + push$3(calls, this.getCall(i)); + } + + return calls; + }, + + calledBefore: function calledBefore(spyFn) { + if (!this.called) { + return false; + } + + if (!spyFn.called) { + return true; + } + + return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1]; + }, + + calledAfter: function calledAfter(spyFn) { + if (!this.called || !spyFn.called) { + return false; + } + + return this.callIds[this.callCount - 1] > spyFn.callIds[0]; + }, + + calledImmediatelyBefore: function calledImmediatelyBefore(spyFn) { + if (!this.called || !spyFn.called) { + return false; + } + + return this.callIds[this.callCount - 1] === spyFn.callIds[spyFn.callCount - 1] - 1; + }, + + calledImmediatelyAfter: function calledImmediatelyAfter(spyFn) { + if (!this.called || !spyFn.called) { + return false; + } + + return this.callIds[this.callCount - 1] === spyFn.callIds[spyFn.callCount - 1] + 1; + }, + + withArgs: function() { + var args = slice$4(arguments); + + if (this.fakes) { + var matching = pop(this.matchingFakes(args, true)); + + if (matching) { + return matching; + } + } else { + this.fakes = []; + } + + var original = this; + var fake = this.instantiateFake(); + fake.matchingArguments = args; + fake.parent = this; + push$3(this.fakes, fake); + + if (original.defaultBehavior && original.defaultBehavior.promiseLibrary) { + fake.defaultBehavior = fake.defaultBehavior || createBehavior$1(fake); + fake.defaultBehavior.promiseLibrary = original.defaultBehavior.promiseLibrary; + } + + fake.withArgs = function() { + return original.withArgs.apply(original, arguments); + }; + + forEach$3(original.args, function(arg, i) { + if (!fake.matches(arg)) { + return; + } + + incrementCallCount.call(fake); + push$3(fake.thisValues, original.thisValues[i]); + push$3(fake.args, arg); + push$3(fake.returnValues, original.returnValues[i]); + push$3(fake.exceptions, original.exceptions[i]); + push$3(fake.callIds, original.callIds[i]); + }); + + createCallProperties.call(fake); + + return fake; + }, + + matchingFakes: function(args, strict) { + return filter$1.call(this.fakes || [], function(fake) { + return fake.matches(args, strict); + }); + }, + + matches: function(args, strict) { + var margs = this.matchingArguments; + + if (margs.length <= args.length && deepEqual$4(margs, slice$4(args, 0, margs.length))) { + return !strict || margs.length === args.length; + } + + return undefined; + }, + + printf: function(format) { + var spyInstance = this; + var args = slice$4(arguments, 1); + var formatter; + + return (format || "").replace(/%(.)/g, function(match, specifyer) { + formatter = spyApi.formatters[specifyer]; + + if (typeof formatter === "function") { + return String(formatter(spyInstance, args)); + } else if (!isNaN(parseInt(specifyer, 10))) { + return format_1(args[specifyer - 1]); + } + + return "%" + specifyer; + }); + } + }; + + function delegateToCalls(method, matchAny, actual, returnsValues, notCalled, totalCallCount) { + spyApi[method] = function() { + if (!this.called) { + if (notCalled) { + return notCalled.apply(this, arguments); + } + return false; + } + + if (totalCallCount !== undefined && this.callCount !== totalCallCount) { + return false; + } + + var currentCall; + var matches = 0; + var returnValues = []; + + for (var i = 0, l = this.callCount; i < l; i += 1) { + currentCall = this.getCall(i); + var returnValue = currentCall[actual || method].apply(currentCall, arguments); + push$3(returnValues, returnValue); + if (returnValue) { + matches += 1; + + if (matchAny) { + return true; + } + } + } + + if (returnsValues) { + return returnValues; + } + return matches === this.callCount; + }; + } + + delegateToCalls("calledOn", true); + delegateToCalls("alwaysCalledOn", false, "calledOn"); + delegateToCalls("calledWith", true); + delegateToCalls("calledOnceWith", true, "calledWith", false, undefined, 1); + delegateToCalls("calledWithMatch", true); + delegateToCalls("alwaysCalledWith", false, "calledWith"); + delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch"); + delegateToCalls("calledWithExactly", true); + delegateToCalls("calledOnceWithExactly", true, "calledWithExactly", false, undefined, 1); + delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly"); + delegateToCalls("neverCalledWith", false, "notCalledWith", false, function() { + return true; + }); + delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch", false, function() { + return true; + }); + delegateToCalls("threw", true); + delegateToCalls("alwaysThrew", false, "threw"); + delegateToCalls("returned", true); + delegateToCalls("alwaysReturned", false, "returned"); + delegateToCalls("calledWithNew", true); + delegateToCalls("alwaysCalledWithNew", false, "calledWithNew"); + /* eslint-disable local-rules/no-prototype-methods */ + delegateToCalls("callArg", false, "callArgWith", true, function() { + throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); + }); + spyApi.callArgWith = spyApi.callArg; + delegateToCalls("callArgOn", false, "callArgOnWith", true, function() { + throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); + }); + spyApi.callArgOnWith = spyApi.callArgOn; + delegateToCalls("throwArg", false, "throwArg", false, function() { + throw new Error(this.toString() + " cannot throw arg since it was not yet invoked."); + }); + delegateToCalls("yield", false, "yield", true, function() { + throw new Error(this.toString() + " cannot yield since it was not yet invoked."); + }); + // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode. + spyApi.invokeCallback = spyApi.yield; + delegateToCalls("yieldOn", false, "yieldOn", true, function() { + throw new Error(this.toString() + " cannot yield since it was not yet invoked."); + }); + delegateToCalls("yieldTo", false, "yieldTo", true, function(property) { + throw new Error( + this.toString() + " cannot yield to '" + valueToString$5(property) + "' since it was not yet invoked." + ); + }); + delegateToCalls("yieldToOn", false, "yieldToOn", true, function(property) { + throw new Error( + this.toString() + " cannot yield to '" + valueToString$5(property) + "' since it was not yet invoked." + ); + }); + /* eslint-enable local-rules/no-prototype-methods */ + + extend(spy, spyApi); + spy.spyCall = call$1$1; + var spy_1 = spy; + + var defaultBehaviors = createCommonjsModule$1(function (module) { + + var arrayProto = lib.prototypes.array; + + + var forEach = arrayProto.forEach; + var slice = arrayProto.slice; + + var useLeftMostCallback = -1; + var useRightMostCallback = -2; + + function throwsException(fake, error, message) { + if (typeof error === "function") { + fake.exceptionCreator = error; + } else if (typeof error === "string") { + fake.exceptionCreator = function() { + var newException = new Error(message || ""); + newException.name = error; + return newException; + }; + } else if (!error) { + fake.exceptionCreator = function() { + return new Error("Error"); + }; + } else { + fake.exception = error; + } + } + + module.exports = { + callsFake: function callsFake(fake, fn) { + fake.fakeFn = fn; + }, + + callsArg: function callsArg(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.callArgAt = index; + fake.callbackArguments = []; + fake.callbackContext = undefined; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + callsArgOn: function callsArgOn(fake, index, context) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.callArgAt = index; + fake.callbackArguments = []; + fake.callbackContext = context; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + callsArgWith: function callsArgWith(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.callArgAt = index; + fake.callbackArguments = slice(arguments, 2); + fake.callbackContext = undefined; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + callsArgOnWith: function callsArgWith(fake, index, context) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.callArgAt = index; + fake.callbackArguments = slice(arguments, 3); + fake.callbackContext = context; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + usingPromise: function usingPromise(fake, promiseLibrary) { + fake.promiseLibrary = promiseLibrary; + }, + + yields: function(fake) { + fake.callArgAt = useLeftMostCallback; + fake.callbackArguments = slice(arguments, 1); + fake.callbackContext = undefined; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + yieldsRight: function(fake) { + fake.callArgAt = useRightMostCallback; + fake.callbackArguments = slice(arguments, 1); + fake.callbackContext = undefined; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + yieldsOn: function(fake, context) { + fake.callArgAt = useLeftMostCallback; + fake.callbackArguments = slice(arguments, 2); + fake.callbackContext = context; + fake.callArgProp = undefined; + fake.callbackAsync = false; + }, + + yieldsTo: function(fake, prop) { + fake.callArgAt = useLeftMostCallback; + fake.callbackArguments = slice(arguments, 2); + fake.callbackContext = undefined; + fake.callArgProp = prop; + fake.callbackAsync = false; + }, + + yieldsToOn: function(fake, prop, context) { + fake.callArgAt = useLeftMostCallback; + fake.callbackArguments = slice(arguments, 3); + fake.callbackContext = context; + fake.callArgProp = prop; + fake.callbackAsync = false; + }, + + throws: throwsException, + throwsException: throwsException, + + returns: function returns(fake, value) { + fake.returnValue = value; + fake.resolve = false; + fake.reject = false; + fake.returnValueDefined = true; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + }, + + returnsArg: function returnsArg(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.returnArgAt = index; + }, + + throwsArg: function throwsArg(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + + fake.throwArgAt = index; + }, + + returnsThis: function returnsThis(fake) { + fake.returnThis = true; + }, + + resolves: function resolves(fake, value) { + fake.returnValue = value; + fake.resolve = true; + fake.resolveThis = false; + fake.reject = false; + fake.returnValueDefined = true; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + }, + + resolvesArg: function resolvesArg(fake, index) { + if (typeof index !== "number") { + throw new TypeError("argument index is not number"); + } + fake.resolveArgAt = index; + fake.returnValue = undefined; + fake.resolve = true; + fake.resolveThis = false; + fake.reject = false; + fake.returnValueDefined = false; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + }, + + rejects: function rejects(fake, error, message) { + var reason; + if (typeof error === "string") { + reason = new Error(message || ""); + reason.name = error; + } else if (!error) { + reason = new Error("Error"); + } else { + reason = error; + } + fake.returnValue = reason; + fake.resolve = false; + fake.resolveThis = false; + fake.reject = true; + fake.returnValueDefined = true; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + + return fake; + }, + + resolvesThis: function resolvesThis(fake) { + fake.returnValue = undefined; + fake.resolve = false; + fake.resolveThis = true; + fake.reject = false; + fake.returnValueDefined = false; + fake.exception = undefined; + fake.exceptionCreator = undefined; + fake.fakeFn = undefined; + }, + + callThrough: function callThrough(fake) { + fake.callsThrough = true; + }, + + get: function get(fake, getterFunction) { + var rootStub = fake.stub || fake; + + Object.defineProperty(rootStub.rootObj, rootStub.propName, { + get: getterFunction, + configurable: isPropertyConfigurable_1(rootStub.rootObj, rootStub.propName) + }); + + return fake; + }, + + set: function set(fake, setterFunction) { + var rootStub = fake.stub || fake; + + Object.defineProperty( + rootStub.rootObj, + rootStub.propName, + // eslint-disable-next-line accessor-pairs + { + set: setterFunction, + configurable: isPropertyConfigurable_1(rootStub.rootObj, rootStub.propName) + } + ); + + return fake; + }, + + value: function value(fake, newVal) { + var rootStub = fake.stub || fake; + + Object.defineProperty(rootStub.rootObj, rootStub.propName, { + value: newVal, + enumerable: true, + configurable: isPropertyConfigurable_1(rootStub.rootObj, rootStub.propName) + }); + + return fake; + } + }; + + function createAsyncVersion(syncFnName) { + return function() { + var result = module.exports[syncFnName].apply(this, arguments); + this.callbackAsync = true; + return result; + }; + } + + // create asynchronous versions of callsArg* and yields* methods + forEach(Object.keys(module.exports), function(method) { + // need to avoid creating anotherasync versions of the newly added async methods + if (method.match(/^(callsArg|yields)/) && !method.match(/Async/)) { + module.exports[method + "Async"] = createAsyncVersion(method); + } + }); + }); + var defaultBehaviors_1 = defaultBehaviors.callsFake; + var defaultBehaviors_2 = defaultBehaviors.callsArg; + var defaultBehaviors_3 = defaultBehaviors.callsArgOn; + var defaultBehaviors_4 = defaultBehaviors.callsArgWith; + var defaultBehaviors_5 = defaultBehaviors.callsArgOnWith; + var defaultBehaviors_6 = defaultBehaviors.usingPromise; + var defaultBehaviors_7 = defaultBehaviors.yields; + var defaultBehaviors_8 = defaultBehaviors.yieldsRight; + var defaultBehaviors_9 = defaultBehaviors.yieldsOn; + var defaultBehaviors_10 = defaultBehaviors.yieldsTo; + var defaultBehaviors_11 = defaultBehaviors.yieldsToOn; + var defaultBehaviors_12 = defaultBehaviors.throwsException; + var defaultBehaviors_13 = defaultBehaviors.returns; + var defaultBehaviors_14 = defaultBehaviors.returnsArg; + var defaultBehaviors_15 = defaultBehaviors.throwsArg; + var defaultBehaviors_16 = defaultBehaviors.returnsThis; + var defaultBehaviors_17 = defaultBehaviors.resolves; + var defaultBehaviors_18 = defaultBehaviors.resolvesArg; + var defaultBehaviors_19 = defaultBehaviors.rejects; + var defaultBehaviors_20 = defaultBehaviors.resolvesThis; + var defaultBehaviors_21 = defaultBehaviors.callThrough; + var defaultBehaviors_22 = defaultBehaviors.get; + var defaultBehaviors_23 = defaultBehaviors.set; + var defaultBehaviors_24 = defaultBehaviors.value; + + function stubEntireObject(stub, object) { + walk(object || {}, function(prop, propOwner) { + // we don't want to stub things like toString(), valueOf(), etc. so we only stub if the object + // is not Object.prototype + if ( + propOwner !== Object.prototype && + prop !== "constructor" && + typeof getPropertyDescriptor(propOwner, prop).value === "function" + ) { + stub(object, prop); + } + }); + + return object; + } + + var stubEntireObject_1 = stubEntireObject; + + var valueToString$6 = lib.valueToString; + + function throwOnFalsyObject(object, property) { + if (property && !object) { + var type = object === null ? "null" : "undefined"; + throw new Error("Trying to stub property '" + valueToString$6(property) + "' of " + type); + } + } + + var throwOnFalsyObject_1 = throwOnFalsyObject; + + var arrayProto$8 = lib.prototypes.array; + + + var hasOwnProperty$7 = lib.prototypes.object.hasOwnProperty; + + + + + + + + + + var valueToString$7 = lib.valueToString; + + var forEach$4 = arrayProto$8.forEach; + var pop$1 = arrayProto$8.pop; + var slice$5 = arrayProto$8.slice; + var sort$1 = arrayProto$8.sort; + + function stub(object, property) { + if (arguments.length > 2) { + throw new TypeError("stub(obj, 'meth', fn) has been removed, see documentation"); + } + + if (isEsModule(object)) { + throw new TypeError("ES Modules cannot be stubbed"); + } + + throwOnFalsyObject_1.apply(null, arguments); + + if (isNonExistentOwnProperty_1(object, property)) { + throw new TypeError("Cannot stub non-existent own property " + valueToString$7(property)); + } + + var actualDescriptor = getPropertyDescriptor(object, property); + var isStubbingEntireObject = typeof property === "undefined" && typeof object === "object"; + var isCreatingNewStub = !object && typeof property === "undefined"; + var isStubbingNonFuncProperty = + (typeof object === "object" || typeof object === "function") && + typeof property !== "undefined" && + (typeof actualDescriptor === "undefined" || typeof actualDescriptor.value !== "function") && + typeof descriptor === "undefined"; + var isStubbingExistingMethod = + typeof object === "object" && + typeof actualDescriptor !== "undefined" && + typeof actualDescriptor.value === "function"; + var arity = isStubbingExistingMethod ? object[property].length : 0; + + if (isStubbingEntireObject) { + return stubEntireObject_1(stub, object); + } + + if (isCreatingNewStub) { + return stub.create(); + } + + var s = stub.create(arity); + s.rootObj = object; + s.propName = property; + s.restore = function restore() { + if (actualDescriptor !== undefined) { + Object.defineProperty(object, property, actualDescriptor); + return; + } + + delete object[property]; + }; + + return isStubbingNonFuncProperty ? s : wrapMethod(object, property, s); + } + + stub.createStubInstance = function(constructor, overrides) { + if (typeof constructor !== "function") { + throw new TypeError("The constructor should be a function."); + } + + var stubbedObject = stub(Object.create(constructor.prototype)); + + forEach$4(Object.keys(overrides || {}), function(propertyName) { + if (propertyName in stubbedObject) { + var value = overrides[propertyName]; + if (value.createStubInstance) { + stubbedObject[propertyName] = value; + } else { + stubbedObject[propertyName].returns(value); + } + } else { + throw new Error("Cannot stub " + propertyName + ". Property does not exist!"); + } + }); + return stubbedObject; + }; + + /*eslint-disable no-use-before-define*/ + function getParentBehaviour(stubInstance) { + return stubInstance.parent && getCurrentBehavior(stubInstance.parent); + } + + function getDefaultBehavior(stubInstance) { + return stubInstance.defaultBehavior || getParentBehaviour(stubInstance) || behavior.create(stubInstance); + } + + function getCurrentBehavior(stubInstance) { + var currentBehavior = stubInstance.behaviors[stubInstance.callCount - 1]; + return currentBehavior && currentBehavior.isPresent() ? currentBehavior : getDefaultBehavior(stubInstance); + } + /*eslint-enable no-use-before-define*/ + + var uuid$1 = 0; + + var proto$1 = { + create: function create(stubLength) { + var functionStub = function() { + var args = slice$5(arguments); + var matchings = functionStub.matchingFakes(args); + + var fnStub = + pop$1( + sort$1(matchings, function(a, b) { + return a.matchingArguments.length - b.matchingArguments.length; + }) + ) || functionStub; + return getCurrentBehavior(fnStub).invoke(this, arguments); + }; + + var orig = functionStub; + functionStub = spy_1.create(functionStub, stubLength); + functionStub.id = "stub#" + uuid$1++; + functionStub.func = orig; + + extend(functionStub, stub); + functionStub.instantiateFake = stub.create; + functionStub.displayName = "stub"; + functionStub.toString = functionToString; + + functionStub.defaultBehavior = null; + functionStub.behaviors = []; + + return functionStub; + }, + + resetBehavior: function() { + var fakes = this.fakes || []; + + this.defaultBehavior = null; + this.behaviors = []; + + delete this.returnValue; + delete this.returnArgAt; + delete this.throwArgAt; + delete this.resolveArgAt; + delete this.fakeFn; + this.returnThis = false; + this.resolveThis = false; + + forEach$4(fakes, function(fake) { + fake.resetBehavior(); + }); + }, + + resetHistory: spy_1.resetHistory, + + reset: function() { + this.resetHistory(); + this.resetBehavior(); + }, + + onCall: function onCall(index) { + if (!this.behaviors[index]) { + this.behaviors[index] = behavior.create(this); + } + + return this.behaviors[index]; + }, + + onFirstCall: function onFirstCall() { + return this.onCall(0); + }, + + onSecondCall: function onSecondCall() { + return this.onCall(1); + }, + + onThirdCall: function onThirdCall() { + return this.onCall(2); + } + }; + + forEach$4(Object.keys(behavior), function(method) { + if ( + hasOwnProperty$7(behavior, method) && + !hasOwnProperty$7(proto$1, method) && + method !== "create" && + method !== "withArgs" && + method !== "invoke" + ) { + proto$1[method] = behavior.createBehavior(method); + } + }); + + forEach$4(Object.keys(defaultBehaviors), function(method) { + if (hasOwnProperty$7(defaultBehaviors, method) && !hasOwnProperty$7(proto$1, method)) { + behavior.addBehavior(stub, method, defaultBehaviors[method]); + } + }); + + extend(stub, proto$1); + var stub_1 = stub; + + var arrayProto$9 = lib.prototypes.array; + var spyInvoke = spy_1.invoke; + var spyCallToString = call$1$1.toString; + + + + + + var deepEqual$5 = deepEqual_1.use(match_1$1); + + var valueToString$8 = lib.valueToString; + + var every$5 = arrayProto$9.every; + var forEach$5 = arrayProto$9.forEach; + var push$4 = arrayProto$9.push; + var slice$6 = arrayProto$9.slice; + + function callCountInWords(callCount) { + if (callCount === 0) { + return "never called"; + } + + return "called " + timesInWords(callCount); + } + + function expectedCallCountInWords(expectation) { + var min = expectation.minCalls; + var max = expectation.maxCalls; + + if (typeof min === "number" && typeof max === "number") { + var str = timesInWords(min); + + if (min !== max) { + str = "at least " + str + " and at most " + timesInWords(max); + } + + return str; + } + + if (typeof min === "number") { + return "at least " + timesInWords(min); + } + + return "at most " + timesInWords(max); + } + + function receivedMinCalls(expectation) { + var hasMinLimit = typeof expectation.minCalls === "number"; + return !hasMinLimit || expectation.callCount >= expectation.minCalls; + } + + function receivedMaxCalls(expectation) { + if (typeof expectation.maxCalls !== "number") { + return false; + } + + return expectation.callCount === expectation.maxCalls; + } + + function verifyMatcher(possibleMatcher, arg) { + var isMatcher = match_1$1 && match_1$1.isMatcher(possibleMatcher); + + return (isMatcher && possibleMatcher.test(arg)) || true; + } + + var mockExpectation = { + minCalls: 1, + maxCalls: 1, + + create: function create(methodName) { + var expectation = extend(stub_1.create(), mockExpectation); + delete expectation.create; + expectation.method = methodName; + + return expectation; + }, + + invoke: function invoke(func, thisValue, args) { + this.verifyCallAllowed(thisValue, args); + + return spyInvoke.apply(this, arguments); + }, + + atLeast: function atLeast(num) { + if (typeof num !== "number") { + throw new TypeError("'" + valueToString$8(num) + "' is not number"); + } + + if (!this.limitsSet) { + this.maxCalls = null; + this.limitsSet = true; + } + + this.minCalls = num; + + return this; + }, + + atMost: function atMost(num) { + if (typeof num !== "number") { + throw new TypeError("'" + valueToString$8(num) + "' is not number"); + } + + if (!this.limitsSet) { + this.minCalls = null; + this.limitsSet = true; + } + + this.maxCalls = num; + + return this; + }, + + never: function never() { + return this.exactly(0); + }, + + once: function once() { + return this.exactly(1); + }, + + twice: function twice() { + return this.exactly(2); + }, + + thrice: function thrice() { + return this.exactly(3); + }, + + exactly: function exactly(num) { + if (typeof num !== "number") { + throw new TypeError("'" + valueToString$8(num) + "' is not a number"); + } + + this.atLeast(num); + return this.atMost(num); + }, + + met: function met() { + return !this.failed && receivedMinCalls(this); + }, + + verifyCallAllowed: function verifyCallAllowed(thisValue, args) { + var expectedArguments = this.expectedArguments; + + if (receivedMaxCalls(this)) { + this.failed = true; + mockExpectation.fail(this.method + " already called " + timesInWords(this.maxCalls)); + } + + if ("expectedThis" in this && this.expectedThis !== thisValue) { + mockExpectation.fail( + this.method + + " called with " + + valueToString$8(thisValue) + + " as thisValue, expected " + + valueToString$8(this.expectedThis) + ); + } + + if (!("expectedArguments" in this)) { + return; + } + + if (!args) { + mockExpectation.fail(this.method + " received no arguments, expected " + format_1(expectedArguments)); + } + + if (args.length < expectedArguments.length) { + mockExpectation.fail( + this.method + + " received too few arguments (" + + format_1(args) + + "), expected " + + format_1(expectedArguments) + ); + } + + if (this.expectsExactArgCount && args.length !== expectedArguments.length) { + mockExpectation.fail( + this.method + + " received too many arguments (" + + format_1(args) + + "), expected " + + format_1(expectedArguments) + ); + } + + forEach$5( + expectedArguments, + function(expectedArgument, i) { + if (!verifyMatcher(expectedArgument, args[i])) { + mockExpectation.fail( + this.method + + " received wrong arguments " + + format_1(args) + + ", didn't match " + + String(expectedArguments) + ); + } + + if (!deepEqual$5(expectedArgument, args[i])) { + mockExpectation.fail( + this.method + + " received wrong arguments " + + format_1(args) + + ", expected " + + format_1(expectedArguments) + ); + } + }, + this + ); + }, + + allowsCall: function allowsCall(thisValue, args) { + var expectedArguments = this.expectedArguments; + + if (this.met() && receivedMaxCalls(this)) { + return false; + } + + if ("expectedThis" in this && this.expectedThis !== thisValue) { + return false; + } + + if (!("expectedArguments" in this)) { + return true; + } + + // eslint-disable-next-line no-underscore-dangle + var _args = args || []; + + if (_args.length < expectedArguments.length) { + return false; + } + + if (this.expectsExactArgCount && _args.length !== expectedArguments.length) { + return false; + } + + return every$5(expectedArguments, function(expectedArgument, i) { + if (!verifyMatcher(expectedArgument, _args[i])) { + return false; + } + + if (!deepEqual$5(expectedArgument, _args[i])) { + return false; + } + + return true; + }); + }, + + withArgs: function withArgs() { + this.expectedArguments = slice$6(arguments); + return this; + }, + + withExactArgs: function withExactArgs() { + this.withArgs.apply(this, arguments); + this.expectsExactArgCount = true; + return this; + }, + + on: function on(thisValue) { + this.expectedThis = thisValue; + return this; + }, + + toString: function() { + var args = slice$6(this.expectedArguments || []); + + if (!this.expectsExactArgCount) { + push$4(args, "[...]"); + } + + var callStr = spyCallToString.call({ + proxy: this.method || "anonymous mock expectation", + args: args + }); + + var message = callStr.replace(", [...", "[, ...") + " " + expectedCallCountInWords(this); + + if (this.met()) { + return "Expectation met: " + message; + } + + return "Expected " + message + " (" + callCountInWords(this.callCount) + ")"; + }, + + verify: function verify() { + if (!this.met()) { + mockExpectation.fail(String(this)); + } else { + mockExpectation.pass(String(this)); + } + + return true; + }, + + pass: function pass(message) { + assert_1.pass(message); + }, + + fail: function fail(message) { + var exception = new Error(message); + exception.name = "ExpectationError"; + + throw exception; + } + }; + + var mockExpectation_1 = mockExpectation; + + var forEach$6 = Array.prototype.forEach; + + function usePromiseLibrary(library, fakes) { + if (typeof library === "undefined") { + return; + } + + if (Array.isArray(fakes)) { + forEach$6.call(fakes, usePromiseLibrary.bind(null, library)); + + return; + } + + if (typeof fakes.usingPromise === "function") { + fakes.usingPromise(library); + } + } + + var usePromiseLibrary_1 = usePromiseLibrary; + + var arrayProto$a = lib.prototypes.array; + + var spyCallToString$1 = call$1$1.toString; + + + var deepEqual$6 = deepEqual_1.use(match_1$1); + + + + var concat$4 = arrayProto$a.concat; + var filter$2 = arrayProto$a.filter; + var forEach$7 = arrayProto$a.forEach; + var every$6 = arrayProto$a.every; + var join$6 = arrayProto$a.join; + var push$5 = arrayProto$a.push; + var slice$7 = arrayProto$a.slice; + var unshift = arrayProto$a.unshift; + + function mock(object) { + if (!object || typeof object === "string") { + return mockExpectation_1.create(object ? object : "Anonymous mock"); + } + + return mock.create(object); + } + + function each(collection, callback) { + var col = collection || []; + + forEach$7(col, callback); + } + + function arrayEquals(arr1, arr2, compareLength) { + if (compareLength && arr1.length !== arr2.length) { + return false; + } + + return every$6(arr1, function(element, i) { + return deepEqual$6(element, arr2[i]); + }); + } + + extend(mock, { + create: function create(object) { + if (!object) { + throw new TypeError("object is null"); + } + + var mockObject = extend({}, mock); + mockObject.object = object; + delete mockObject.create; + + return mockObject; + }, + + expects: function expects(method) { + if (!method) { + throw new TypeError("method is falsy"); + } + + if (!this.expectations) { + this.expectations = {}; + this.proxies = []; + this.failures = []; + } + + if (!this.expectations[method]) { + this.expectations[method] = []; + var mockObject = this; + + wrapMethod(this.object, method, function() { + return mockObject.invokeMethod(method, this, arguments); + }); + + push$5(this.proxies, method); + } + + var expectation = mockExpectation_1.create(method); + extend(expectation, this.object[method]); + push$5(this.expectations[method], expectation); + usePromiseLibrary_1(this.promiseLibrary, expectation); + + return expectation; + }, + + restore: function restore() { + var object = this.object; + + each(this.proxies, function(proxy) { + if (typeof object[proxy].restore === "function") { + object[proxy].restore(); + } + }); + }, + + verify: function verify() { + var expectations = this.expectations || {}; + var messages = this.failures ? slice$7(this.failures) : []; + var met = []; + + each(this.proxies, function(proxy) { + each(expectations[proxy], function(expectation) { + if (!expectation.met()) { + push$5(messages, String(expectation)); + } else { + push$5(met, String(expectation)); + } + }); + }); + + this.restore(); + + if (messages.length > 0) { + mockExpectation_1.fail(join$6(concat$4(messages, met), "\n")); + } else if (met.length > 0) { + mockExpectation_1.pass(join$6(concat$4(messages, met), "\n")); + } + + return true; + }, + + usingPromise: function usingPromise(promiseLibrary) { + this.promiseLibrary = promiseLibrary; + + return this; + }, + + invokeMethod: function invokeMethod(method, thisValue, args) { + /* if we cannot find any matching files we will explicitly call mockExpection#fail with error messages */ + /* eslint consistent-return: "off" */ + var expectations = this.expectations && this.expectations[method] ? this.expectations[method] : []; + var currentArgs = args || []; + var available; + + var expectationsWithMatchingArgs = filter$2(expectations, function(expectation) { + var expectedArgs = expectation.expectedArguments || []; + + return arrayEquals(expectedArgs, currentArgs, expectation.expectsExactArgCount); + }); + + var expectationsToApply = filter$2(expectationsWithMatchingArgs, function(expectation) { + return !expectation.met() && expectation.allowsCall(thisValue, args); + }); + + if (expectationsToApply.length > 0) { + return expectationsToApply[0].apply(thisValue, args); + } + + var messages = []; + var exhausted = 0; + + forEach$7(expectationsWithMatchingArgs, function(expectation) { + if (expectation.allowsCall(thisValue, args)) { + available = available || expectation; + } else { + exhausted += 1; + } + }); + + if (available && exhausted === 0) { + return available.apply(thisValue, args); + } + + forEach$7(expectations, function(expectation) { + push$5(messages, " " + String(expectation)); + }); + + unshift( + messages, + "Unexpected call: " + + spyCallToString$1.call({ + proxy: method, + args: args + }) + ); + + var err = new Error(); + if (!err.stack) { + // PhantomJS does not serialize the stack trace until the error has been thrown + try { + throw err; + } catch (e) { + /* empty */ + } + } + push$5( + this.failures, + "Unexpected call: " + + spyCallToString$1.call({ + proxy: method, + args: args, + stack: err.stack + }) + ); + + mockExpectation_1.fail(join$6(messages, "\n")); + } + }); + + var mock_1 = mock; + + var arrayProto$b = lib.prototypes.array; + + + + var forEach$8 = arrayProto$b.forEach; + var slice$8 = arrayProto$b.slice; + + function getError(value) { + return value instanceof Error ? value : new Error(value); + } + + function cleanProxy(f) { + var undesirableProperties = [ + "instantiateFake", + "callArg", + "callArgOn", + "callArgOnWith", + "callArgWith", + "invokeCallback", + "throwArg", + "withArgs", + "yield", + "yieldOn", + "yieldTo", + "yieldToOn" + ]; + + forEach$8(undesirableProperties, function(key) { + delete f[key]; + }); + + return f; + } + + var uuid$2 = 0; + function wrapFunc(f) { + var fakeInstance = function() { + var lastArg = (arguments.length > 0 && arguments[arguments.length - 1]) || undefined; + var callback = lastArg && typeof lastArg === "function" ? lastArg : undefined; + + /* eslint-disable no-use-before-define */ + p.lastArg = lastArg; + p.callback = callback; + /* eslint-enable no-use-before-define */ + + return f && f.apply(this, arguments); + }; + var p = cleanProxy(spy_1(fakeInstance)); + + p.displayName = "fake"; + p.id = "fake#" + uuid$2++; + + return p; + } + + function fake(f) { + if (arguments.length > 0 && typeof f !== "function") { + throw new TypeError("Expected f argument to be a Function"); + } + + return wrapFunc(f); + } + + fake.returns = function returns(value) { + function f() { + return value; + } + + return wrapFunc(f); + }; + + fake.throws = function throws(value) { + function f() { + throw getError(value); + } + + return wrapFunc(f); + }; + + fake.resolves = function resolves(value) { + function f() { + return Promise.resolve(value); + } + + return wrapFunc(f); + }; + + fake.rejects = function rejects(value) { + function f() { + return Promise.reject(getError(value)); + } + + return wrapFunc(f); + }; + + function yieldInternal(async, values) { + function f() { + var callback = arguments[arguments.length - 1]; + if (typeof callback !== "function") { + throw new TypeError("Expected last argument to be a function"); + } + if (async) { + nextTick$1(function() { + callback.apply(null, values); + }); + } else { + callback.apply(null, values); + } + } + + return wrapFunc(f); + } + + fake.yields = function yields() { + return yieldInternal(false, slice$8(arguments)); + }; + + fake.yieldsAsync = function yieldsAsync() { + return yieldInternal(true, slice$8(arguments)); + }; + + var fake_1 = fake; + + var nise = createCommonjsModule$1(function (module, exports) { + (function(f){{module.exports=f();}})(function(){return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof commonjsRequire$1=="function"&&commonjsRequire$1;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r);}return n[o].exports}var i=typeof commonjsRequire$1=="function"&&commonjsRequire$1;for(var o=0;o {}, { + // get once() { supportsOnce = true; } + // }); + var options = flattenOptions(providedOptions); + + // 2. If callback is null, then return. + if (listener == null) { + return; + } + + this.eventListeners = this.eventListeners || {}; + this.eventListeners[event] = this.eventListeners[event] || []; + + // 4. If context object’s associated list of event listener + // does not contain an event listener whose type is type, + // callback is callback, and capture is capture, then append + // a new event listener to it, whose type is type, callback is + // callback, capture is capture, passive is passive, and once is once. + if (!this.eventListeners[event].some(hasListenerFilter(listener, options.capture))) { + this.eventListeners[event].push({ + listener: listener, + capture: options.capture, + once: options.once + }); + } + }, + + // https://dom.spec.whatwg.org/#dom-eventtarget-removeeventlistener + removeEventListener: function removeEventListener(event, listener, providedOptions) { + if (!this.eventListeners || !this.eventListeners[event]) { + return; + } + + // 2. Let capture be the result of flattening options. + var options = flattenOptions(providedOptions); + + // 3. If there is an event listener in the associated list of + // event listeners whose type is type, callback is callback, + // and capture is capture, then set that event listener’s + // removed to true and remove it from the associated list of event listeners. + this.eventListeners[event] = this.eventListeners[event] + .filter(not(hasListenerFilter(listener, options.capture))); + }, + + dispatchEvent: function dispatchEvent(event) { + if (!this.eventListeners || !this.eventListeners[event.type]) { + return Boolean(event.defaultPrevented); + } + + var self = this; + var type = event.type; + var listeners = self.eventListeners[type]; + + // Remove listeners, that should be dispatched once + // before running dispatch loop to avoid nested dispatch issues + self.eventListeners[type] = listeners.filter(function (listenerSpec) { + return !listenerSpec.once; + }); + listeners.forEach(function (listenerSpec) { + var listener = listenerSpec.listener; + if (typeof listener === "function") { + listener.call(self, event); + } else { + listener.handleEvent(event); + } + }); + + return Boolean(event.defaultPrevented); + } + }; + + module.exports = EventTarget; + + },{}],4:[function(require,module,exports){ + + function Event(type, bubbles, cancelable, target) { + this.initEvent(type, bubbles, cancelable, target); + } + + Event.prototype = { + initEvent: function (type, bubbles, cancelable, target) { + this.type = type; + this.bubbles = bubbles; + this.cancelable = cancelable; + this.target = target; + this.currentTarget = target; + }, + + stopPropagation: function () {}, + + preventDefault: function () { + this.defaultPrevented = true; + } + }; + + module.exports = Event; + + },{}],5:[function(require,module,exports){ + + module.exports = { + Event: require("./event"), + ProgressEvent: require("./progress-event"), + CustomEvent: require("./custom-event"), + EventTarget: require("./event-target") + }; + + },{"./custom-event":2,"./event":4,"./event-target":3,"./progress-event":6}],6:[function(require,module,exports){ + + var Event = require("./event"); + + function ProgressEvent(type, progressEventRaw, target) { + this.initEvent(type, false, false, target); + this.loaded = typeof progressEventRaw.loaded === "number" ? progressEventRaw.loaded : null; + this.total = typeof progressEventRaw.total === "number" ? progressEventRaw.total : null; + this.lengthComputable = !!progressEventRaw.total; + } + + ProgressEvent.prototype = new Event(); + + ProgressEvent.prototype.constructor = ProgressEvent; + + module.exports = ProgressEvent; + + },{"./event":4}],7:[function(require,module,exports){ + + var lolex = require("lolex"); + var fakeServer = require("./index"); + + function Server() {} + Server.prototype = fakeServer; + + var fakeServerWithClock = new Server(); + + fakeServerWithClock.addRequest = function addRequest(xhr) { + if (xhr.async) { + if (typeof setTimeout.clock === "object") { + this.clock = setTimeout.clock; + } else { + this.clock = lolex.install(); + this.resetClock = true; + } + + if (!this.longestTimeout) { + var clockSetTimeout = this.clock.setTimeout; + var clockSetInterval = this.clock.setInterval; + var server = this; + + this.clock.setTimeout = function (fn, timeout) { + server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); + + return clockSetTimeout.apply(this, arguments); + }; + + this.clock.setInterval = function (fn, timeout) { + server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); + + return clockSetInterval.apply(this, arguments); + }; + } + } + + return fakeServer.addRequest.call(this, xhr); + }; + + fakeServerWithClock.respond = function respond() { + var returnVal = fakeServer.respond.apply(this, arguments); + + if (this.clock) { + this.clock.tick(this.longestTimeout || 0); + this.longestTimeout = 0; + + if (this.resetClock) { + this.clock.uninstall(); + this.resetClock = false; + } + } + + return returnVal; + }; + + fakeServerWithClock.restore = function restore() { + if (this.clock) { + this.clock.uninstall(); + } + + return fakeServer.restore.apply(this, arguments); + }; + + module.exports = fakeServerWithClock; + + },{"./index":9,"lolex":32}],8:[function(require,module,exports){ + + var formatio = require("@sinonjs/formatio"); + + var formatter = formatio.configure({ + quoteStrings: false, + limitChildrenCount: 250 + }); + + module.exports = function format() { + return formatter.ascii.apply(formatter, arguments); + }; + + },{"@sinonjs/formatio":13}],9:[function(require,module,exports){ + + var fakeXhr = require("../fake-xhr"); + var push = [].push; + var format = require("./format"); + var configureLogError = require("../configure-logger"); + var pathToRegexp = require("path-to-regexp"); + + var supportsArrayBuffer = typeof ArrayBuffer !== "undefined"; + + function responseArray(handler) { + var response = handler; + + if (Object.prototype.toString.call(handler) !== "[object Array]") { + response = [200, {}, handler]; + } + + if (typeof response[2] !== "string") { + if (!supportsArrayBuffer) { + throw new TypeError("Fake server response body should be a string, but was " + + typeof response[2]); + } + else if (!(response[2] instanceof ArrayBuffer)) { + throw new TypeError("Fake server response body should be a string or ArrayBuffer, but was " + + typeof response[2]); + } + } + + return response; + } + + function getDefaultWindowLocation() { + return { "host": "localhost", "protocol": "http" }; + } + + function getWindowLocation() { + if (typeof window === "undefined") { + // Fallback + return getDefaultWindowLocation(); + } + + if (typeof window.location !== "undefined") { + // Browsers place location on window + return window.location; + } + + if ((typeof window.window !== "undefined") && (typeof window.window.location !== "undefined")) { + // React Native on Android places location on window.window + return window.window.location; + } + + return getDefaultWindowLocation(); + } + + function matchOne(response, reqMethod, reqUrl) { + var rmeth = response.method; + var matchMethod = !rmeth || rmeth.toLowerCase() === reqMethod.toLowerCase(); + var url = response.url; + var matchUrl = !url || url === reqUrl || (typeof url.test === "function" && url.test(reqUrl)); + + return matchMethod && matchUrl; + } + + function match(response, request) { + var wloc = getWindowLocation(); + + var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host); + + var requestUrl = request.url; + + if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) { + requestUrl = requestUrl.replace(rCurrLoc, ""); + } + + if (matchOne(response, this.getHTTPMethod(request), requestUrl)) { + if (typeof response.response === "function") { + var ru = response.url; + var args = [request].concat(ru && typeof ru.exec === "function" ? ru.exec(requestUrl).slice(1) : []); + return response.response.apply(response, args); + } + + return true; + } + + return false; + } + + function incrementRequestCount() { + var count = ++this.requestCount; + + this.requested = true; + + this.requestedOnce = count === 1; + this.requestedTwice = count === 2; + this.requestedThrice = count === 3; + + this.firstRequest = this.getRequest(0); + this.secondRequest = this.getRequest(1); + this.thirdRequest = this.getRequest(2); + + this.lastRequest = this.getRequest(count - 1); + } + + var fakeServer = { + create: function (config) { + var server = Object.create(this); + server.configure(config); + this.xhr = fakeXhr.useFakeXMLHttpRequest(); + server.requests = []; + server.requestCount = 0; + server.queue = []; + server.responses = []; + + + this.xhr.onCreate = function (xhrObj) { + xhrObj.unsafeHeadersEnabled = function () { + return !(server.unsafeHeadersEnabled === false); + }; + server.addRequest(xhrObj); + }; + + return server; + }, + + configure: function (config) { + var self = this; + var whitelist = { + "autoRespond": true, + "autoRespondAfter": true, + "respondImmediately": true, + "fakeHTTPMethods": true, + "logger": true, + "unsafeHeadersEnabled": true + }; + + config = config || {}; + + Object.keys(config).forEach(function (setting) { + if (setting in whitelist) { + self[setting] = config[setting]; + } + }); + + self.logError = configureLogError(config); + }, + + addRequest: function addRequest(xhrObj) { + var server = this; + push.call(this.requests, xhrObj); + + incrementRequestCount.call(this); + + xhrObj.onSend = function () { + server.handleRequest(this); + + if (server.respondImmediately) { + server.respond(); + } else if (server.autoRespond && !server.responding) { + setTimeout(function () { + server.responding = false; + server.respond(); + }, server.autoRespondAfter || 10); + + server.responding = true; + } + }; + }, + + getHTTPMethod: function getHTTPMethod(request) { + if (this.fakeHTTPMethods && /post/i.test(request.method)) { + var matches = (request.requestBody || "").match(/_method=([^\b;]+)/); + return matches ? matches[1] : request.method; + } + + return request.method; + }, + + handleRequest: function handleRequest(xhr) { + if (xhr.async) { + push.call(this.queue, xhr); + } else { + this.processRequest(xhr); + } + }, + + logger: function () { + // no-op; override via configure() + }, + + logError: configureLogError({}), + + log: function log(response, request) { + var str; + + str = "Request:\n" + format(request) + "\n\n"; + str += "Response:\n" + format(response) + "\n\n"; + + if (typeof this.logger === "function") { + this.logger(str); + } + }, + + respondWith: function respondWith(method, url, body) { + if (arguments.length === 1 && typeof method !== "function") { + this.response = responseArray(method); + return; + } + + if (arguments.length === 1) { + body = method; + url = method = null; + } + + if (arguments.length === 2) { + body = url; + url = method; + method = null; + } + + push.call(this.responses, { + method: method, + url: typeof url === "string" && url !== "" ? pathToRegexp(url) : url, + response: typeof body === "function" ? body : responseArray(body) + }); + }, + + respond: function respond() { + if (arguments.length > 0) { + this.respondWith.apply(this, arguments); + } + + var queue = this.queue || []; + var requests = queue.splice(0, queue.length); + var self = this; + + requests.forEach(function (request) { + self.processRequest(request); + }); + }, + + processRequest: function processRequest(request) { + try { + if (request.aborted) { + return; + } + + var response = this.response || [404, {}, ""]; + + if (this.responses) { + for (var l = this.responses.length, i = l - 1; i >= 0; i--) { + if (match.call(this, this.responses[i], request)) { + response = this.responses[i].response; + break; + } + } + } + + if (request.readyState !== 4) { + this.log(response, request); + + request.respond(response[0], response[1], response[2]); + } + } catch (e) { + this.logError("Fake server request processing", e); + } + }, + + restore: function restore() { + return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments); + }, + + getRequest: function getRequest(index) { + return this.requests[index] || null; + }, + + reset: function reset() { + this.resetBehavior(); + this.resetHistory(); + }, + + resetBehavior: function resetBehavior() { + this.responses.length = this.queue.length = 0; + }, + + resetHistory: function resetHistory() { + this.requests.length = this.requestCount = 0; + + this.requestedOnce = this.requestedTwice = this.requestedThrice = this.requested = false; + + this.firstRequest = this.secondRequest = this.thirdRequest = this.lastRequest = null; + } + }; + + module.exports = fakeServer; + + },{"../configure-logger":1,"../fake-xhr":11,"./format":8,"path-to-regexp":33}],10:[function(require,module,exports){ + + exports.isSupported = (function () { + try { + return !!new Blob(); + } catch (e) { + return false; + } + }()); + + },{}],11:[function(require,module,exports){ + (function (global){ + + var TextEncoder = require("text-encoding").TextEncoder; + + var configureLogError = require("../configure-logger"); + var sinonEvent = require("../event"); + var extend = require("just-extend"); + + function getWorkingXHR(globalScope) { + var supportsXHR = typeof globalScope.XMLHttpRequest !== "undefined"; + if (supportsXHR) { + return globalScope.XMLHttpRequest; + } + + var supportsActiveX = typeof globalScope.ActiveXObject !== "undefined"; + if (supportsActiveX) { + return function () { + return new globalScope.ActiveXObject("MSXML2.XMLHTTP.3.0"); + }; + } + + return false; + } + + var supportsProgress = typeof ProgressEvent !== "undefined"; + var supportsCustomEvent = typeof CustomEvent !== "undefined"; + var supportsFormData = typeof FormData !== "undefined"; + var supportsArrayBuffer = typeof ArrayBuffer !== "undefined"; + var supportsBlob = require("./blob").isSupported; + var isReactNative = global.navigator && global.navigator.product === "ReactNative"; + var sinonXhr = { XMLHttpRequest: global.XMLHttpRequest }; + sinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest; + sinonXhr.GlobalActiveXObject = global.ActiveXObject; + sinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject !== "undefined"; + sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest !== "undefined"; + sinonXhr.workingXHR = getWorkingXHR(global); + sinonXhr.supportsTimeout = + (sinonXhr.supportsXHR && "timeout" in (new sinonXhr.GlobalXMLHttpRequest())); + sinonXhr.supportsCORS = isReactNative || + (sinonXhr.supportsXHR && "withCredentials" in (new sinonXhr.GlobalXMLHttpRequest())); + + // Ref: https://fetch.spec.whatwg.org/#forbidden-header-name + var unsafeHeaders = { + "Accept-Charset": true, + "Access-Control-Request-Headers": true, + "Access-Control-Request-Method": true, + "Accept-Encoding": true, + "Connection": true, + "Content-Length": true, + "Cookie": true, + "Cookie2": true, + "Content-Transfer-Encoding": true, + "Date": true, + "DNT": true, + "Expect": true, + "Host": true, + "Keep-Alive": true, + "Origin": true, + "Referer": true, + "TE": true, + "Trailer": true, + "Transfer-Encoding": true, + "Upgrade": true, + "User-Agent": true, + "Via": true + }; + + + function EventTargetHandler() { + var self = this; + var events = ["loadstart", "progress", "abort", "error", "load", "timeout", "loadend"]; + + function addEventListener(eventName) { + self.addEventListener(eventName, function (event) { + var listener = self["on" + eventName]; + + if (listener && typeof listener === "function") { + listener.call(this, event); + } + }); + } + + events.forEach(addEventListener); + } + + EventTargetHandler.prototype = sinonEvent.EventTarget; + + // Note that for FakeXMLHttpRequest to work pre ES5 + // we lose some of the alignment with the spec. + // To ensure as close a match as possible, + // set responseType before calling open, send or respond; + function FakeXMLHttpRequest(config) { + EventTargetHandler.call(this); + this.readyState = FakeXMLHttpRequest.UNSENT; + this.requestHeaders = {}; + this.requestBody = null; + this.status = 0; + this.statusText = ""; + this.upload = new EventTargetHandler(); + this.responseType = ""; + this.response = ""; + this.logError = configureLogError(config); + + if (sinonXhr.supportsTimeout) { + this.timeout = 0; + } + + if (sinonXhr.supportsCORS) { + this.withCredentials = false; + } + + if (typeof FakeXMLHttpRequest.onCreate === "function") { + FakeXMLHttpRequest.onCreate(this); + } + } + + function verifyState(xhr) { + if (xhr.readyState !== FakeXMLHttpRequest.OPENED) { + throw new Error("INVALID_STATE_ERR"); + } + + if (xhr.sendFlag) { + throw new Error("INVALID_STATE_ERR"); + } + } + + function normalizeHeaderValue(value) { + // Ref: https://fetch.spec.whatwg.org/#http-whitespace-bytes + /*eslint no-control-regex: "off"*/ + return value.replace(/^[\x09\x0A\x0D\x20]+|[\x09\x0A\x0D\x20]+$/g, ""); + } + + function getHeader(headers, header) { + var foundHeader = Object.keys(headers).filter(function (h) { + return h.toLowerCase() === header.toLowerCase(); + }); + + return foundHeader[0] || null; + } + + function excludeSetCookie2Header(header) { + return !/^Set-Cookie2?$/i.test(header); + } + + // largest arity in XHR is 5 - XHR#open + var apply = function (obj, method, args) { + switch (args.length) { + case 0: return obj[method](); + case 1: return obj[method](args[0]); + case 2: return obj[method](args[0], args[1]); + case 3: return obj[method](args[0], args[1], args[2]); + case 4: return obj[method](args[0], args[1], args[2], args[3]); + case 5: return obj[method](args[0], args[1], args[2], args[3], args[4]); + default: throw new Error("Unhandled case"); + } + }; + + FakeXMLHttpRequest.filters = []; + FakeXMLHttpRequest.addFilter = function addFilter(fn) { + this.filters.push(fn); + }; + FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) { + var xhr = new sinonXhr.workingXHR(); // eslint-disable-line new-cap + + [ + "open", + "setRequestHeader", + "abort", + "getResponseHeader", + "getAllResponseHeaders", + "addEventListener", + "overrideMimeType", + "removeEventListener" + ].forEach(function (method) { + fakeXhr[method] = function () { + return apply(xhr, method, arguments); + }; + }); + + fakeXhr.send = function () { + // Ref: https://xhr.spec.whatwg.org/#the-responsetype-attribute + if (xhr.responseType !== fakeXhr.responseType) { + xhr.responseType = fakeXhr.responseType; + } + return apply(xhr, "send", arguments); + }; + + var copyAttrs = function (args) { + args.forEach(function (attr) { + fakeXhr[attr] = xhr[attr]; + }); + }; + + var stateChangeStart = function () { + fakeXhr.readyState = xhr.readyState; + if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) { + copyAttrs(["status", "statusText"]); + } + if (xhr.readyState >= FakeXMLHttpRequest.LOADING) { + copyAttrs(["response"]); + if (xhr.responseType === "" || xhr.responseType === "text") { + copyAttrs(["responseText"]); + } + } + if ( + xhr.readyState === FakeXMLHttpRequest.DONE && + (xhr.responseType === "" || xhr.responseType === "document") + ) { + copyAttrs(["responseXML"]); + } + }; + + var stateChangeEnd = function () { + if (fakeXhr.onreadystatechange) { + fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr, currentTarget: fakeXhr }); + } + }; + + var stateChange = function stateChange() { + stateChangeStart(); + stateChangeEnd(); + }; + + if (xhr.addEventListener) { + xhr.addEventListener("readystatechange", stateChangeStart); + + Object.keys(fakeXhr.eventListeners).forEach(function (event) { + /*eslint-disable no-loop-func*/ + fakeXhr.eventListeners[event].forEach(function (handler) { + xhr.addEventListener(event, handler.listener, { + capture: handler.capture, + once: handler.once + }); + }); + /*eslint-enable no-loop-func*/ + }); + + xhr.addEventListener("readystatechange", stateChangeEnd); + } else { + xhr.onreadystatechange = stateChange; + } + apply(xhr, "open", xhrArgs); + }; + FakeXMLHttpRequest.useFilters = false; + + function verifyRequestOpened(xhr) { + if (xhr.readyState !== FakeXMLHttpRequest.OPENED) { + throw new Error("INVALID_STATE_ERR - " + xhr.readyState); + } + } + + function verifyRequestSent(xhr) { + if (xhr.readyState === FakeXMLHttpRequest.DONE) { + throw new Error("Request done"); + } + } + + function verifyHeadersReceived(xhr) { + if (xhr.async && xhr.readyState !== FakeXMLHttpRequest.HEADERS_RECEIVED) { + throw new Error("No headers received"); + } + } + + function verifyResponseBodyType(body, responseType) { + var error = null; + var isString = typeof body === "string"; + + if (responseType === "arraybuffer") { + + if (!isString && !(body instanceof ArrayBuffer)) { + error = new Error("Attempted to respond to fake XMLHttpRequest with " + + body + ", which is not a string or ArrayBuffer."); + error.name = "InvalidBodyException"; + } + } + else if (!isString) { + error = new Error("Attempted to respond to fake XMLHttpRequest with " + + body + ", which is not a string."); + error.name = "InvalidBodyException"; + } + + if (error) { + throw error; + } + } + + function convertToArrayBuffer(body, encoding) { + if (body instanceof ArrayBuffer) { + return body; + } + + return new TextEncoder(encoding || "utf-8").encode(body).buffer; + } + + function isXmlContentType(contentType) { + return !contentType || /(text\/xml)|(application\/xml)|(\+xml)/.test(contentType); + } + + function convertResponseBody(responseType, contentType, body) { + if (responseType === "" || responseType === "text") { + return body; + } else if (supportsArrayBuffer && responseType === "arraybuffer") { + return convertToArrayBuffer(body); + } else if (responseType === "json") { + try { + return JSON.parse(body); + } catch (e) { + // Return parsing failure as null + return null; + } + } else if (supportsBlob && responseType === "blob") { + var blobOptions = {}; + if (contentType) { + blobOptions.type = contentType; + } + return new Blob([convertToArrayBuffer(body)], blobOptions); + } else if (responseType === "document") { + if (isXmlContentType(contentType)) { + return FakeXMLHttpRequest.parseXML(body); + } + return null; + } + throw new Error("Invalid responseType " + responseType); + } + + function clearResponse(xhr) { + if (xhr.responseType === "" || xhr.responseType === "text") { + xhr.response = xhr.responseText = ""; + } else { + xhr.response = xhr.responseText = null; + } + xhr.responseXML = null; + } + + /** + * Steps to follow when there is an error, according to: + * https://xhr.spec.whatwg.org/#request-error-steps + */ + function requestErrorSteps(xhr) { + clearResponse(xhr); + xhr.errorFlag = true; + xhr.requestHeaders = {}; + xhr.responseHeaders = {}; + + if (xhr.readyState !== FakeXMLHttpRequest.UNSENT && xhr.sendFlag + && xhr.readyState !== FakeXMLHttpRequest.DONE) { + xhr.readyStateChange(FakeXMLHttpRequest.DONE); + xhr.sendFlag = false; + } + } + + FakeXMLHttpRequest.parseXML = function parseXML(text) { + // Treat empty string as parsing failure + if (text !== "") { + try { + if (typeof DOMParser !== "undefined") { + var parser = new DOMParser(); + var parsererrorNS = ""; + + try { + var parsererrors = parser + .parseFromString("INVALID", "text/xml") + .getElementsByTagName("parsererror"); + if (parsererrors.length) { + parsererrorNS = parsererrors[0].namespaceURI; + } + } catch (e) { + // passing invalid XML makes IE11 throw + // so no namespace needs to be determined + } + + var result; + try { + result = parser.parseFromString(text, "text/xml"); + } catch (err) { + return null; + } + + return result.getElementsByTagNameNS(parsererrorNS, "parsererror").length + ? null : result; + } + var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); + xmlDoc.async = "false"; + xmlDoc.loadXML(text); + return xmlDoc.parseError.errorCode !== 0 + ? null : xmlDoc; + } catch (e) { + // Unable to parse XML - no biggie + } + } + + return null; + }; + + FakeXMLHttpRequest.statusCodes = { + 100: "Continue", + 101: "Switching Protocols", + 200: "OK", + 201: "Created", + 202: "Accepted", + 203: "Non-Authoritative Information", + 204: "No Content", + 205: "Reset Content", + 206: "Partial Content", + 207: "Multi-Status", + 300: "Multiple Choice", + 301: "Moved Permanently", + 302: "Found", + 303: "See Other", + 304: "Not Modified", + 305: "Use Proxy", + 307: "Temporary Redirect", + 400: "Bad Request", + 401: "Unauthorized", + 402: "Payment Required", + 403: "Forbidden", + 404: "Not Found", + 405: "Method Not Allowed", + 406: "Not Acceptable", + 407: "Proxy Authentication Required", + 408: "Request Timeout", + 409: "Conflict", + 410: "Gone", + 411: "Length Required", + 412: "Precondition Failed", + 413: "Request Entity Too Large", + 414: "Request-URI Too Long", + 415: "Unsupported Media Type", + 416: "Requested Range Not Satisfiable", + 417: "Expectation Failed", + 422: "Unprocessable Entity", + 500: "Internal Server Error", + 501: "Not Implemented", + 502: "Bad Gateway", + 503: "Service Unavailable", + 504: "Gateway Timeout", + 505: "HTTP Version Not Supported" + }; + + extend(FakeXMLHttpRequest.prototype, sinonEvent.EventTarget, { + async: true, + + open: function open(method, url, async, username, password) { + this.method = method; + this.url = url; + this.async = typeof async === "boolean" ? async : true; + this.username = username; + this.password = password; + clearResponse(this); + this.requestHeaders = {}; + this.sendFlag = false; + + if (FakeXMLHttpRequest.useFilters === true) { + var xhrArgs = arguments; + var defake = FakeXMLHttpRequest.filters.some(function (filter) { + return filter.apply(this, xhrArgs); + }); + if (defake) { + FakeXMLHttpRequest.defake(this, arguments); + return; + } + } + this.readyStateChange(FakeXMLHttpRequest.OPENED); + }, + + readyStateChange: function readyStateChange(state) { + this.readyState = state; + + var readyStateChangeEvent = new sinonEvent.Event("readystatechange", false, false, this); + var event, progress; + + if (typeof this.onreadystatechange === "function") { + try { + this.onreadystatechange(readyStateChangeEvent); + } catch (e) { + this.logError("Fake XHR onreadystatechange handler", e); + } + } + + if (this.readyState === FakeXMLHttpRequest.DONE) { + if (this.timedOut || this.aborted || this.status === 0) { + progress = {loaded: 0, total: 0}; + event = (this.timedOut && "timeout") || (this.aborted && "abort") || "error"; + } else { + progress = {loaded: 100, total: 100}; + event = "load"; + } + + if (supportsProgress) { + this.upload.dispatchEvent(new sinonEvent.ProgressEvent("progress", progress, this)); + this.upload.dispatchEvent(new sinonEvent.ProgressEvent(event, progress, this)); + this.upload.dispatchEvent(new sinonEvent.ProgressEvent("loadend", progress, this)); + } + + this.dispatchEvent(new sinonEvent.ProgressEvent("progress", progress, this)); + this.dispatchEvent(new sinonEvent.ProgressEvent(event, progress, this)); + this.dispatchEvent(new sinonEvent.ProgressEvent("loadend", progress, this)); + } + + this.dispatchEvent(readyStateChangeEvent); + }, + + // Ref https://xhr.spec.whatwg.org/#the-setrequestheader()-method + setRequestHeader: function setRequestHeader(header, value) { + if (typeof value !== "string") { + throw new TypeError("By RFC7230, section 3.2.4, header values should be strings. Got " + typeof value); + } + verifyState(this); + + var checkUnsafeHeaders = true; + if (typeof this.unsafeHeadersEnabled === "function") { + checkUnsafeHeaders = this.unsafeHeadersEnabled(); + } + + if (checkUnsafeHeaders && (getHeader(unsafeHeaders, header) !== null || /^(Sec-|Proxy-)/i.test(header))) { + throw new Error("Refused to set unsafe header \"" + header + "\""); + } + + value = normalizeHeaderValue(value); + + var existingHeader = getHeader(this.requestHeaders, header); + if (existingHeader) { + this.requestHeaders[existingHeader] += ", " + value; + } else { + this.requestHeaders[header] = value; + } + }, + + setStatus: function setStatus(status) { + var sanitizedStatus = typeof status === "number" ? status : 200; + + verifyRequestOpened(this); + this.status = sanitizedStatus; + this.statusText = FakeXMLHttpRequest.statusCodes[sanitizedStatus]; + }, + + // Helps testing + setResponseHeaders: function setResponseHeaders(headers) { + verifyRequestOpened(this); + + var responseHeaders = this.responseHeaders = {}; + + Object.keys(headers).forEach(function (header) { + responseHeaders[header] = headers[header]; + }); + + if (this.async) { + this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED); + } else { + this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED; + } + }, + + // Currently treats ALL data as a DOMString (i.e. no Document) + send: function send(data) { + verifyState(this); + + if (!/^(head)$/i.test(this.method)) { + var contentType = getHeader(this.requestHeaders, "Content-Type"); + if (this.requestHeaders[contentType]) { + var value = this.requestHeaders[contentType].split(";"); + this.requestHeaders[contentType] = value[0] + ";charset=utf-8"; + } else if (supportsFormData && !(data instanceof FormData)) { + this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8"; + } + + this.requestBody = data; + } + + this.errorFlag = false; + this.sendFlag = this.async; + clearResponse(this); + this.readyStateChange(FakeXMLHttpRequest.OPENED); + + if (typeof this.onSend === "function") { + this.onSend(this); + } + + // Only listen if setInterval and Date are a stubbed. + if (sinonXhr.supportsTimeout && typeof setInterval.clock === "object" && typeof Date.clock === "object") { + var initiatedTime = Date.now(); + var self = this; + + // Listen to any possible tick by fake timers and check to see if timeout has + // been exceeded. It's important to note that timeout can be changed while a request + // is in flight, so we must check anytime the end user forces a clock tick to make + // sure timeout hasn't changed. + // https://xhr.spec.whatwg.org/#dfnReturnLink-2 + var clearIntervalId = setInterval(function () { + // Check if the readyState has been reset or is done. If this is the case, there + // should be no timeout. This will also prevent aborted requests and + // fakeServerWithClock from triggering unnecessary responses. + if (self.readyState === FakeXMLHttpRequest.UNSENT + || self.readyState === FakeXMLHttpRequest.DONE) { + clearInterval(clearIntervalId); + } else if (typeof self.timeout === "number" && self.timeout > 0) { + if (Date.now() >= (initiatedTime + self.timeout)) { + self.triggerTimeout(); + clearInterval(clearIntervalId); + } + } + }, 1); + } + + this.dispatchEvent(new sinonEvent.Event("loadstart", false, false, this)); + }, + + abort: function abort() { + this.aborted = true; + requestErrorSteps(this); + this.readyState = FakeXMLHttpRequest.UNSENT; + }, + + error: function () { + clearResponse(this); + this.errorFlag = true; + this.requestHeaders = {}; + this.responseHeaders = {}; + + this.readyStateChange(FakeXMLHttpRequest.DONE); + }, + + triggerTimeout: function triggerTimeout() { + if (sinonXhr.supportsTimeout) { + this.timedOut = true; + requestErrorSteps(this); + } + }, + + getResponseHeader: function getResponseHeader(header) { + if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { + return null; + } + + if (/^Set-Cookie2?$/i.test(header)) { + return null; + } + + header = getHeader(this.responseHeaders, header); + + return this.responseHeaders[header] || null; + }, + + getAllResponseHeaders: function getAllResponseHeaders() { + if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { + return ""; + } + + var responseHeaders = this.responseHeaders; + var headers = Object.keys(responseHeaders) + .filter(excludeSetCookie2Header) + .reduce(function (prev, header) { + var value = responseHeaders[header]; + + return prev + (header + ": " + value + "\r\n"); + }, ""); + + return headers; + }, + + setResponseBody: function setResponseBody(body) { + verifyRequestSent(this); + verifyHeadersReceived(this); + verifyResponseBodyType(body, this.responseType); + var contentType = this.overriddenMimeType || this.getResponseHeader("Content-Type"); + + var isTextResponse = this.responseType === "" || this.responseType === "text"; + clearResponse(this); + if (this.async) { + var chunkSize = this.chunkSize || 10; + var index = 0; + + do { + this.readyStateChange(FakeXMLHttpRequest.LOADING); + + if (isTextResponse) { + this.responseText = this.response += body.substring(index, index + chunkSize); + } + index += chunkSize; + } while (index < body.length); + } + + this.response = convertResponseBody(this.responseType, contentType, body); + if (isTextResponse) { + this.responseText = this.response; + } + + if (this.responseType === "document") { + this.responseXML = this.response; + } else if (this.responseType === "" && isXmlContentType(contentType)) { + this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText); + } + this.readyStateChange(FakeXMLHttpRequest.DONE); + }, + + respond: function respond(status, headers, body) { + this.setStatus(status); + this.setResponseHeaders(headers || {}); + this.setResponseBody(body || ""); + }, + + uploadProgress: function uploadProgress(progressEventRaw) { + if (supportsProgress) { + this.upload.dispatchEvent(new sinonEvent.ProgressEvent("progress", progressEventRaw, this.upload)); + } + }, + + downloadProgress: function downloadProgress(progressEventRaw) { + if (supportsProgress) { + this.dispatchEvent(new sinonEvent.ProgressEvent("progress", progressEventRaw, this)); + } + }, + + uploadError: function uploadError(error) { + if (supportsCustomEvent) { + this.upload.dispatchEvent(new sinonEvent.CustomEvent("error", {detail: error})); + } + }, + + overrideMimeType: function overrideMimeType(type) { + if (this.readyState >= FakeXMLHttpRequest.LOADING) { + throw new Error("INVALID_STATE_ERR"); + } + this.overriddenMimeType = type; + } + }); + + var states = { + UNSENT: 0, + OPENED: 1, + HEADERS_RECEIVED: 2, + LOADING: 3, + DONE: 4 + }; + + extend(FakeXMLHttpRequest, states); + extend(FakeXMLHttpRequest.prototype, states); + + function useFakeXMLHttpRequest() { + FakeXMLHttpRequest.restore = function restore(keepOnCreate) { + if (sinonXhr.supportsXHR) { + global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest; + } + + if (sinonXhr.supportsActiveX) { + global.ActiveXObject = sinonXhr.GlobalActiveXObject; + } + + delete FakeXMLHttpRequest.restore; + + if (keepOnCreate !== true) { + delete FakeXMLHttpRequest.onCreate; + } + }; + if (sinonXhr.supportsXHR) { + global.XMLHttpRequest = FakeXMLHttpRequest; + } + + if (sinonXhr.supportsActiveX) { + global.ActiveXObject = function ActiveXObject(objId) { + if (objId === "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) { + + return new FakeXMLHttpRequest(); + } + + return new sinonXhr.GlobalActiveXObject(objId); + }; + } + + return FakeXMLHttpRequest; + } + + module.exports = { + xhr: sinonXhr, + FakeXMLHttpRequest: FakeXMLHttpRequest, + useFakeXMLHttpRequest: useFakeXMLHttpRequest + }; + + }).call(this,typeof commonjsGlobal$1 !== "undefined" ? commonjsGlobal$1 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); + },{"../configure-logger":1,"../event":5,"./blob":10,"just-extend":31,"text-encoding":34}],12:[function(require,module,exports){ + + module.exports = { + fakeServer: require("./fake-server"), + fakeServerWithClock: require("./fake-server/fake-server-with-clock"), + fakeXhr: require("./fake-xhr") + }; + + },{"./fake-server":9,"./fake-server/fake-server-with-clock":7,"./fake-xhr":11}],13:[function(require,module,exports){ + (function (global){ + + var samsam = require("@sinonjs/samsam"); + var formatio = { + excludeConstructors: ["Object", /^.$/], + quoteStrings: true, + limitChildrenCount: 0 + }; + + var specialObjects = []; + if (typeof global !== "undefined") { + specialObjects.push({ object: global, value: "[object global]" }); + } + if (typeof document !== "undefined") { + specialObjects.push({ + object: document, + value: "[object HTMLDocument]" + }); + } + if (typeof window !== "undefined") { + specialObjects.push({ object: window, value: "[object Window]" }); + } + + function functionName(func) { + if (!func) { return ""; } + if (func.displayName) { return func.displayName; } + if (func.name) { return func.name; } + var matches = func.toString().match(/function\s+([^\(]+)/m); + return (matches && matches[1]) || ""; + } + + function constructorName(f, object) { + var name = functionName(object && object.constructor); + var excludes = f.excludeConstructors || + formatio.excludeConstructors || []; + + var i, l; + for (i = 0, l = excludes.length; i < l; ++i) { + if (typeof excludes[i] === "string" && excludes[i] === name) { + return ""; + } else if (excludes[i].test && excludes[i].test(name)) { + return ""; + } + } + + return name; + } + + function isCircular(object, objects) { + if (typeof object !== "object") { return false; } + var i, l; + for (i = 0, l = objects.length; i < l; ++i) { + if (objects[i] === object) { return true; } + } + return false; + } + + function ascii(f, object, processed, indent) { + if (typeof object === "string") { + if (object.length === 0) { return "(empty string)"; } + var qs = f.quoteStrings; + var quote = typeof qs !== "boolean" || qs; + return processed || quote ? "\"" + object + "\"" : object; + } + + if (typeof object === "function" && !(object instanceof RegExp)) { + return ascii.func(object); + } + + processed = processed || []; + + if (isCircular(object, processed)) { return "[Circular]"; } + + if (Object.prototype.toString.call(object) === "[object Array]") { + return ascii.array.call(f, object, processed); + } + + if (!object) { return String((1 / object) === -Infinity ? "-0" : object); } + if (samsam.isElement(object)) { return ascii.element(object); } + + if (typeof object.toString === "function" && + object.toString !== Object.prototype.toString) { + return object.toString(); + } + + var i, l; + for (i = 0, l = specialObjects.length; i < l; i++) { + if (object === specialObjects[i].object) { + return specialObjects[i].value; + } + } + + if (typeof Set !== "undefined" && object instanceof Set) { + return ascii.set.call(f, object, processed); + } + + return ascii.object.call(f, object, processed, indent); + } + + ascii.func = function (func) { + return "function " + functionName(func) + "() {}"; + }; + + function delimit(str, delimiters) { + delimiters = delimiters || ["[", "]"]; + return delimiters[0] + str + delimiters[1]; + } + + ascii.array = function (array, processed, delimiters) { + processed = processed || []; + processed.push(array); + var pieces = []; + var i, l; + l = (this.limitChildrenCount > 0) ? + Math.min(this.limitChildrenCount, array.length) : array.length; + + for (i = 0; i < l; ++i) { + pieces.push(ascii(this, array[i], processed)); + } + + if (l < array.length) { + pieces.push("[... " + (array.length - l) + " more elements]"); + } + + return delimit(pieces.join(", "), delimiters); + }; + + ascii.set = function (set, processed) { + return ascii.array.call(this, Array.from(set), processed, ["Set {", "}"]); + }; + + ascii.object = function (object, processed, indent) { + processed = processed || []; + processed.push(object); + indent = indent || 0; + var pieces = []; + var properties = Object.keys(object).sort(); + var length = 3; + var prop, str, obj, i, k, l; + l = (this.limitChildrenCount > 0) ? + Math.min(this.limitChildrenCount, properties.length) : properties.length; + + for (i = 0; i < l; ++i) { + prop = properties[i]; + obj = object[prop]; + + if (isCircular(obj, processed)) { + str = "[Circular]"; + } else { + str = ascii(this, obj, processed, indent + 2); + } + + str = (/\s/.test(prop) ? "\"" + prop + "\"" : prop) + ": " + str; + length += str.length; + pieces.push(str); + } + + var cons = constructorName(this, object); + var prefix = cons ? "[" + cons + "] " : ""; + var is = ""; + for (i = 0, k = indent; i < k; ++i) { is += " "; } + + if (l < properties.length) + {pieces.push("[... " + (properties.length - l) + " more elements]");} + + if (length + indent > 80) { + return prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" + + is + "}"; + } + return prefix + "{ " + pieces.join(", ") + " }"; + }; + + ascii.element = function (element) { + var tagName = element.tagName.toLowerCase(); + var attrs = element.attributes; + var pairs = []; + var attr, attrName, i, l, val; + + for (i = 0, l = attrs.length; i < l; ++i) { + attr = attrs.item(i); + attrName = attr.nodeName.toLowerCase().replace("html:", ""); + val = attr.nodeValue; + if (attrName !== "contenteditable" || val !== "inherit") { + if (val) { pairs.push(attrName + "=\"" + val + "\""); } + } + } + + var formatted = "<" + tagName + (pairs.length > 0 ? " " : ""); + // SVG elements have undefined innerHTML + var content = element.innerHTML || ""; + + if (content.length > 20) { + content = content.substr(0, 20) + "[...]"; + } + + var res = formatted + pairs.join(" ") + ">" + content + + ""; + + return res.replace(/ contentEditable="inherit"/, ""); + }; + + function Formatio(options) { + // eslint-disable-next-line guard-for-in + for (var opt in options) { + this[opt] = options[opt]; + } + } + + Formatio.prototype = { + functionName: functionName, + + configure: function (options) { + return new Formatio(options); + }, + + constructorName: function (object) { + return constructorName(this, object); + }, + + ascii: function (object, processed, indent) { + return ascii(this, object, processed, indent); + } + }; + + module.exports = Formatio.prototype; + + }).call(this,typeof commonjsGlobal$1 !== "undefined" ? commonjsGlobal$1 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); + },{"@sinonjs/samsam":27}],14:[function(require,module,exports){ + + var getClass = require("./get-class"); + var identical = require("./identical"); + var isArguments = require("./is-arguments"); + var isDate = require("./is-date"); + var isElement = require("./is-element"); + var isNaN = require("./is-nan"); + var isObject = require("./is-object"); + var isSet = require("./is-set"); + var isSubset = require("./is-subset"); + var getClassName = require("./get-class-name"); + + var every = Array.prototype.every; + var getTime = Date.prototype.getTime; + var hasOwnProperty = Object.prototype.hasOwnProperty; + var indexOf = Array.prototype.indexOf; + var keys = Object.keys; + + /** + * @name samsam.deepEqual + * @param Object first + * @param Object second + * + * Deep equal comparison. Two values are "deep equal" if: + * + * - They are equal, according to samsam.identical + * - They are both date objects representing the same time + * - They are both arrays containing elements that are all deepEqual + * - They are objects with the same set of properties, and each property + * in ``first`` is deepEqual to the corresponding property in ``second`` + * + * Supports cyclic objects. + */ + function deepEqualCyclic(first, second) { + // used for cyclic comparison + // contain already visited objects + var objects1 = []; + var objects2 = []; + // contain pathes (position in the object structure) + // of the already visited objects + // indexes same as in objects arrays + var paths1 = []; + var paths2 = []; + // contains combinations of already compared objects + // in the manner: { "$1['ref']$2['ref']": true } + var compared = {}; + + // does the recursion for the deep equal check + return (function deepEqual(obj1, obj2, path1, path2) { + var type1 = typeof obj1; + var type2 = typeof obj2; + + // == null also matches undefined + if ( + obj1 === obj2 || + isNaN(obj1) || + isNaN(obj2) || + obj1 == null || + obj2 == null || + type1 !== "object" || + type2 !== "object" + ) { + return identical(obj1, obj2); + } + + // Elements are only equal if identical(expected, actual) + if (isElement(obj1) || isElement(obj2)) { + return false; + } + + var isDate1 = isDate(obj1); + var isDate2 = isDate(obj2); + if (isDate1 || isDate2) { + if ( + !isDate1 || + !isDate2 || + getTime.call(obj1) !== getTime.call(obj2) + ) { + return false; + } + } + + if (obj1 instanceof RegExp && obj2 instanceof RegExp) { + if (obj1.toString() !== obj2.toString()) { + return false; + } + } + + if (obj1 instanceof Error && obj2 instanceof Error) { + if (obj1.stack !== obj2.stack) { + return false; + } + } + + var class1 = getClass(obj1); + var class2 = getClass(obj2); + var keys1 = keys(obj1); + var keys2 = keys(obj2); + var name1 = getClassName(obj1); + var name2 = getClassName(obj2); + + if (isArguments(obj1) || isArguments(obj2)) { + if (obj1.length !== obj2.length) { + return false; + } + } else { + if ( + type1 !== type2 || + class1 !== class2 || + keys1.length !== keys2.length || + (name1 && name2 && name1 !== name2) + ) { + return false; + } + } + + if (isSet(obj1) || isSet(obj2)) { + if (!isSet(obj1) || !isSet(obj2) || obj1.size !== obj2.size) { + return false; + } + + return isSubset(obj1, obj2, deepEqual); + } + + return every.call(keys1, function(key) { + if (!hasOwnProperty.call(obj2, key)) { + return false; + } + + var value1 = obj1[key]; + var value2 = obj2[key]; + var isObject1 = isObject(value1); + var isObject2 = isObject(value2); + // determines, if the objects were already visited + // (it's faster to check for isObject first, than to + // get -1 from getIndex for non objects) + var index1 = isObject1 ? indexOf.call(objects1, value1) : -1; + var index2 = isObject2 ? indexOf.call(objects2, value2) : -1; + // determines the new paths of the objects + // - for non cyclic objects the current path will be extended + // by current property name + // - for cyclic objects the stored path is taken + var newPath1 = + index1 !== -1 + ? paths1[index1] + : path1 + "[" + JSON.stringify(key) + "]"; + var newPath2 = + index2 !== -1 + ? paths2[index2] + : path2 + "[" + JSON.stringify(key) + "]"; + var combinedPath = newPath1 + newPath2; + + // stop recursion if current objects are already compared + if (compared[combinedPath]) { + return true; + } + + // remember the current objects and their paths + if (index1 === -1 && isObject1) { + objects1.push(value1); + paths1.push(newPath1); + } + if (index2 === -1 && isObject2) { + objects2.push(value2); + paths2.push(newPath2); + } + + // remember that the current objects are already compared + if (isObject1 && isObject2) { + compared[combinedPath] = true; + } + + // End of cyclic logic + + // neither value1 nor value2 is a cycle + // continue with next level + return deepEqual(value1, value2, newPath1, newPath2); + }); + })(first, second, "$1", "$2"); + } + + module.exports = deepEqualCyclic; + + },{"./get-class":16,"./get-class-name":15,"./identical":17,"./is-arguments":18,"./is-date":19,"./is-element":20,"./is-nan":21,"./is-object":23,"./is-set":24,"./is-subset":25}],15:[function(require,module,exports){ + + function getClassName(value) { + return Object.getPrototypeOf(value) ? value.constructor.name : null; + } + + module.exports = getClassName; + + },{}],16:[function(require,module,exports){ + + var o = Object.prototype; + + function getClass(value) { + // Returns the internal [[Class]] by calling Object.prototype.toString + // with the provided value as this. Return value is a string, naming the + // internal class, e.g. "Array" + return o.toString.call(value).split(/[ \]]/)[1]; + } + + module.exports = getClass; + + },{}],17:[function(require,module,exports){ + + var isNaN = require("./is-nan"); + var isNegZero = require("./is-neg-zero"); + + /** + * @name samsam.equal + * @param Object obj1 + * @param Object obj2 + * + * Returns ``true`` if two objects are strictly equal. Compared to + * ``===`` there are two exceptions: + * + * - NaN is considered equal to NaN + * - -0 and +0 are not considered equal + */ + function identical(obj1, obj2) { + if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) { + return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2); + } + + return false; + } + + module.exports = identical; + + },{"./is-nan":21,"./is-neg-zero":22}],18:[function(require,module,exports){ + + var getClass = require("./get-class"); + + /** + * @name samsam.isArguments + * @param Object object + * + * Returns ``true`` if ``object`` is an ``arguments`` object, + * ``false`` otherwise. + */ + function isArguments(object) { + if (getClass(object) === "Arguments") { + return true; + } + if ( + typeof object !== "object" || + typeof object.length !== "number" || + getClass(object) === "Array" + ) { + return false; + } + if (typeof object.callee === "function") { + return true; + } + try { + object[object.length] = 6; + delete object[object.length]; + } catch (e) { + return true; + } + return false; + } + + module.exports = isArguments; + + },{"./get-class":16}],19:[function(require,module,exports){ + + function isDate(value) { + return value instanceof Date; + } + + module.exports = isDate; + + },{}],20:[function(require,module,exports){ + + var div = typeof document !== "undefined" && document.createElement("div"); + + /** + * @name samsam.isElement + * @param Object object + * + * Returns ``true`` if ``object`` is a DOM element node. Unlike + * Underscore.js/lodash, this function will return ``false`` if ``object`` + * is an *element-like* object, i.e. a regular object with a ``nodeType`` + * property that holds the value ``1``. + */ + function isElement(object) { + if (!object || object.nodeType !== 1 || !div) { + return false; + } + try { + object.appendChild(div); + object.removeChild(div); + } catch (e) { + return false; + } + return true; + } + + module.exports = isElement; + + },{}],21:[function(require,module,exports){ + + function isNaN(value) { + // Unlike global isNaN, this avoids type coercion + // typeof check avoids IE host object issues, hat tip to + // lodash + var val = value; // JsLint thinks value !== value is "weird" + return typeof value === "number" && value !== val; + } + + module.exports = isNaN; + + },{}],22:[function(require,module,exports){ + + /** + * @name samsam.isNegZero + * @param Object value + * + * Returns ``true`` if ``value`` is ``-0``. + */ + function isNegZero(value) { + return value === 0 && 1 / value === -Infinity; + } + + module.exports = isNegZero; + + },{}],23:[function(require,module,exports){ + + // Returns true when the value is a regular Object and not a specialized Object + // + // This helps speeding up deepEqual cyclic checks + // The premise is that only Objects are stored in the visited array. + // So if this function returns false, we don't have to do the + // expensive operation of searching for the value in the the array of already + // visited objects + function isObject(value) { + return ( + typeof value === "object" && + value !== null && + // none of these are collection objects, so we can return false + !(value instanceof Boolean) && + !(value instanceof Date) && + !(value instanceof Error) && + !(value instanceof Number) && + !(value instanceof RegExp) && + !(value instanceof String) + ); + } + + module.exports = isObject; + + },{}],24:[function(require,module,exports){ + + function isSet(val) { + return (typeof Set !== "undefined" && val instanceof Set) || false; + } + + module.exports = isSet; + + },{}],25:[function(require,module,exports){ + + var from = require("array-from"); + + function isSubset(s1, s2, compare) { + // FIXME: IE11 doesn't support Array.from + // Potential solutions: + // - contribute a patch to https://github.com/Volox/eslint-plugin-ie11#readme + // - https://github.com/mathiasbynens/Array.from (doesn't work with matchers) + var values1 = from(s1); + var values2 = from(s2); + + for (var i = 0; i < values1.length; i++) { + var includes = false; + + for (var j = 0; j < values2.length; j++) { + if (compare(values2[j], values1[i])) { + includes = true; + break; + } + } + + if (!includes) { + return false; + } + } + + return true; + } + + module.exports = isSubset; + + },{"array-from":28}],26:[function(require,module,exports){ + + var getClass = require("./get-class"); + var isDate = require("./is-date"); + var isSet = require("./is-set"); + var isSubset = require("./is-subset"); + + function arrayContains(array, subset, compare) { + if (subset.length === 0) { + return true; + } + var i, l, j, k; + for (i = 0, l = array.length; i < l; ++i) { + if (compare(array[i], subset[0])) { + for (j = 0, k = subset.length; j < k; ++j) { + if (i + j >= l) { + return false; + } + if (!compare(array[i + j], subset[j])) { + return false; + } + } + return true; + } + } + return false; + } + + /** + * @name samsam.match + * @param Object object + * @param Object matcher + * + * Compare arbitrary value ``object`` with matcher. + */ + function match(object, matcher) { + if (matcher && typeof matcher.test === "function") { + return matcher.test(object); + } + + if (typeof matcher === "function") { + return matcher(object) === true; + } + + if (typeof matcher === "string") { + matcher = matcher.toLowerCase(); + var notNull = typeof object === "string" || !!object; + return ( + notNull && + String(object) + .toLowerCase() + .indexOf(matcher) >= 0 + ); + } + + if (typeof matcher === "number") { + return matcher === object; + } + + if (typeof matcher === "boolean") { + return matcher === object; + } + + if (typeof matcher === "undefined") { + return typeof object === "undefined"; + } + + if (matcher === null) { + return object === null; + } + + if (isSet(object)) { + return isSubset(matcher, object, match); + } + + if (getClass(object) === "Array" && getClass(matcher) === "Array") { + return arrayContains(object, matcher, match); + } + + if (isDate(matcher)) { + return isDate(object) && object.getTime() === matcher.getTime(); + } + + if (matcher && typeof matcher === "object") { + if (matcher === object) { + return true; + } + var prop; + // eslint-disable-next-line guard-for-in + for (prop in matcher) { + var value = object[prop]; + if ( + typeof value === "undefined" && + typeof object.getAttribute === "function" + ) { + value = object.getAttribute(prop); + } + if ( + matcher[prop] === null || + typeof matcher[prop] === "undefined" + ) { + if (value !== matcher[prop]) { + return false; + } + } else if ( + typeof value === "undefined" || + !match(value, matcher[prop]) + ) { + return false; + } + } + return true; + } + + throw new Error( + "Matcher was not a string, a number, a " + + "function, a boolean or an object" + ); + } + + module.exports = match; + + },{"./get-class":16,"./is-date":19,"./is-set":24,"./is-subset":25}],27:[function(require,module,exports){ + + var deepEqualCyclic = require("./deep-equal"); + var identical = require("./identical"); + var isArguments = require("./is-arguments"); + var isElement = require("./is-element"); + var isNegZero = require("./is-neg-zero"); + var match = require("./match"); + + module.exports = { + isArguments: isArguments, + isElement: isElement, + isNegZero: isNegZero, + identical: identical, + deepEqual: deepEqualCyclic, + match: match + }; + + },{"./deep-equal":14,"./identical":17,"./is-arguments":18,"./is-element":20,"./is-neg-zero":22,"./match":26}],28:[function(require,module,exports){ + module.exports = (typeof Array.from === 'function' ? + Array.from : + require('./polyfill') + ); + + },{"./polyfill":29}],29:[function(require,module,exports){ + // Production steps of ECMA-262, Edition 6, 22.1.2.1 + // Reference: http://www.ecma-international.org/ecma-262/6.0/#sec-array.from + module.exports = (function() { + var isCallable = function(fn) { + return typeof fn === 'function'; + }; + var toInteger = function (value) { + var number = Number(value); + if (isNaN(number)) { return 0; } + if (number === 0 || !isFinite(number)) { return number; } + return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); + }; + var maxSafeInteger = Math.pow(2, 53) - 1; + var toLength = function (value) { + var len = toInteger(value); + return Math.min(Math.max(len, 0), maxSafeInteger); + }; + var iteratorProp = function(value) { + if(value != null) { + if(['string','number','boolean','symbol'].indexOf(typeof value) > -1){ + return Symbol.iterator; + } else if ( + (typeof Symbol !== 'undefined') && + ('iterator' in Symbol) && + (Symbol.iterator in value) + ) { + return Symbol.iterator; + } + // Support "@@iterator" placeholder, Gecko 27 to Gecko 35 + else if ('@@iterator' in value) { + return '@@iterator'; + } + } + }; + var getMethod = function(O, P) { + // Assert: IsPropertyKey(P) is true. + if (O != null && P != null) { + // Let func be GetV(O, P). + var func = O[P]; + // ReturnIfAbrupt(func). + // If func is either undefined or null, return undefined. + if(func == null) { + return void 0; + } + // If IsCallable(func) is false, throw a TypeError exception. + if (!isCallable(func)) { + throw new TypeError(func + ' is not a function'); + } + return func; + } + }; + var iteratorStep = function(iterator) { + // Let result be IteratorNext(iterator). + // ReturnIfAbrupt(result). + var result = iterator.next(); + // Let done be IteratorComplete(result). + // ReturnIfAbrupt(done). + var done = Boolean(result.done); + // If done is true, return false. + if(done) { + return false; + } + // Return result. + return result; + }; + + // The length property of the from method is 1. + return function from(items /*, mapFn, thisArg */ ) { + + // 1. Let C be the this value. + var C = this; + + // 2. If mapfn is undefined, let mapping be false. + var mapFn = arguments.length > 1 ? arguments[1] : void 0; + + var T; + if (typeof mapFn !== 'undefined') { + // 3. else + // a. If IsCallable(mapfn) is false, throw a TypeError exception. + if (!isCallable(mapFn)) { + throw new TypeError( + 'Array.from: when provided, the second argument must be a function' + ); + } + + // b. If thisArg was supplied, let T be thisArg; else let T + // be undefined. + if (arguments.length > 2) { + T = arguments[2]; + } + // c. Let mapping be true (implied by mapFn) + } + + var A, k; + + // 4. Let usingIterator be GetMethod(items, @@iterator). + // 5. ReturnIfAbrupt(usingIterator). + var usingIterator = getMethod(items, iteratorProp(items)); + + // 6. If usingIterator is not undefined, then + if (usingIterator !== void 0) { + // a. If IsConstructor(C) is true, then + // i. Let A be the result of calling the [[Construct]] + // internal method of C with an empty argument list. + // b. Else, + // i. Let A be the result of the abstract operation ArrayCreate + // with argument 0. + // c. ReturnIfAbrupt(A). + A = isCallable(C) ? Object(new C()) : []; + + // d. Let iterator be GetIterator(items, usingIterator). + var iterator = usingIterator.call(items); + + // e. ReturnIfAbrupt(iterator). + if (iterator == null) { + throw new TypeError( + 'Array.from requires an array-like or iterable object' + ); + } + + // f. Let k be 0. + k = 0; + + // g. Repeat + var next, nextValue; + while (true) { + // i. Let Pk be ToString(k). + // ii. Let next be IteratorStep(iterator). + // iii. ReturnIfAbrupt(next). + next = iteratorStep(iterator); + + // iv. If next is false, then + if (!next) { + + // 1. Let setStatus be Set(A, "length", k, true). + // 2. ReturnIfAbrupt(setStatus). + A.length = k; + + // 3. Return A. + return A; + } + // v. Let nextValue be IteratorValue(next). + // vi. ReturnIfAbrupt(nextValue) + nextValue = next.value; + + // vii. If mapping is true, then + // 1. Let mappedValue be Call(mapfn, T, «nextValue, k»). + // 2. If mappedValue is an abrupt completion, return + // IteratorClose(iterator, mappedValue). + // 3. Let mappedValue be mappedValue.[[value]]. + // viii. Else, let mappedValue be nextValue. + // ix. Let defineStatus be the result of + // CreateDataPropertyOrThrow(A, Pk, mappedValue). + // x. [TODO] If defineStatus is an abrupt completion, return + // IteratorClose(iterator, defineStatus). + if (mapFn) { + A[k] = mapFn.call(T, nextValue, k); + } + else { + A[k] = nextValue; + } + // xi. Increase k by 1. + k++; + } + // 7. Assert: items is not an Iterable so assume it is + // an array-like object. + } else { + + // 8. Let arrayLike be ToObject(items). + var arrayLike = Object(items); + + // 9. ReturnIfAbrupt(items). + if (items == null) { + throw new TypeError( + 'Array.from requires an array-like object - not null or undefined' + ); + } + + // 10. Let len be ToLength(Get(arrayLike, "length")). + // 11. ReturnIfAbrupt(len). + var len = toLength(arrayLike.length); + + // 12. If IsConstructor(C) is true, then + // a. Let A be Construct(C, «len»). + // 13. Else + // a. Let A be ArrayCreate(len). + // 14. ReturnIfAbrupt(A). + A = isCallable(C) ? Object(new C(len)) : new Array(len); + + // 15. Let k be 0. + k = 0; + // 16. Repeat, while k < len… (also steps a - h) + var kValue; + while (k < len) { + kValue = arrayLike[k]; + if (mapFn) { + A[k] = mapFn.call(T, kValue, k); + } + else { + A[k] = kValue; + } + k++; + } + // 17. Let setStatus be Set(A, "length", len, true). + // 18. ReturnIfAbrupt(setStatus). + A.length = len; + // 19. Return A. + } + return A; + }; + })(); + + },{}],30:[function(require,module,exports){ + module.exports = Array.isArray || function (arr) { + return Object.prototype.toString.call(arr) == '[object Array]'; + }; + + },{}],31:[function(require,module,exports){ + module.exports = extend; + + /* + var obj = {a: 3, b: 5}; + extend(obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8} + obj; // {a: 4, b: 5, c: 8} + + var obj = {a: 3, b: 5}; + extend({}, obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8} + obj; // {a: 3, b: 5} + + var arr = [1, 2, 3]; + var obj = {a: 3, b: 5}; + extend(obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]} + arr.push(4); + obj; // {a: 3, b: 5, c: [1, 2, 3, 4]} + + var arr = [1, 2, 3]; + var obj = {a: 3, b: 5}; + extend(true, obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]} + arr.push(4); + obj; // {a: 3, b: 5, c: [1, 2, 3]} + + extend({a: 4, b: 5}); // {a: 4, b: 5} + extend({a: 4, b: 5}, 3); {a: 4, b: 5} + extend({a: 4, b: 5}, true); {a: 4, b: 5} + extend('hello', {a: 4, b: 5}); // throws + extend(3, {a: 4, b: 5}); // throws + */ + + function extend(/* [deep], obj1, obj2, [objn] */) { + var args = [].slice.call(arguments); + var deep = false; + if (typeof args[0] == 'boolean') { + deep = args.shift(); + } + var result = args[0]; + if (!result || (typeof result != 'object' && typeof result != 'function')) { + throw new Error('extendee must be an object'); + } + var extenders = args.slice(1); + var len = extenders.length; + for (var i = 0; i < len; i++) { + var extender = extenders[i]; + for (var key in extender) { + if (extender.hasOwnProperty(key)) { + var value = extender[key]; + if (deep && isCloneable(value)) { + var base = Array.isArray(value) ? [] : {}; + result[key] = extend(true, result[key] || base, value); + } else { + result[key] = value; + } + } + } + } + return result; + } + + function isCloneable(obj) { + return Array.isArray(obj) || {}.toString.call(obj) == '[object Object]'; + } + + },{}],32:[function(require,module,exports){ + (function (global){ + + var userAgent = global.navigator && global.navigator.userAgent; + var isRunningInIE = userAgent && userAgent.indexOf("MSIE ") > -1; + var maxTimeout = Math.pow(2, 31) - 1; //see https://heycam.github.io/webidl/#abstract-opdef-converttoint + + // Make properties writable in IE, as per + // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html + if (isRunningInIE) { + global.setTimeout = global.setTimeout; + global.clearTimeout = global.clearTimeout; + global.setInterval = global.setInterval; + global.clearInterval = global.clearInterval; + global.Date = global.Date; + } + + // setImmediate is not a standard function + // avoid adding the prop to the window object if not present + if (global.setImmediate !== undefined) { + global.setImmediate = global.setImmediate; + global.clearImmediate = global.clearImmediate; + } + + // node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref() + // browsers, a number. + // see https://github.com/cjohansen/Sinon.JS/pull/436 + + var NOOP = function () { return undefined; }; + var timeoutResult = setTimeout(NOOP, 0); + var addTimerReturnsObject = typeof timeoutResult === "object"; + var hrtimePresent = (global.process && typeof global.process.hrtime === "function"); + var nextTickPresent = (global.process && typeof global.process.nextTick === "function"); + var performancePresent = (global.performance && typeof global.performance.now === "function"); + var requestAnimationFramePresent = (global.requestAnimationFrame && typeof global.requestAnimationFrame === "function"); + var cancelAnimationFramePresent = (global.cancelAnimationFrame && typeof global.cancelAnimationFrame === "function"); + + clearTimeout(timeoutResult); + + var NativeDate = Date; + var uniqueTimerId = 1; + + /** + * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into + * number of milliseconds. This is used to support human-readable strings passed + * to clock.tick() + */ + function parseTime(str) { + if (!str) { + return 0; + } + + var strings = str.split(":"); + var l = strings.length; + var i = l; + var ms = 0; + var parsed; + + if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { + throw new Error("tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits"); + } + + while (i--) { + parsed = parseInt(strings[i], 10); + + if (parsed >= 60) { + throw new Error("Invalid time " + str); + } + + ms += parsed * Math.pow(60, (l - i - 1)); + } + + return ms * 1000; + } + + /** + * Floor function that also works for negative numbers + */ + function fixedFloor(n) { + return (n >= 0 ? Math.floor(n) : Math.ceil(n)); + } + + /** + * % operator that also works for negative numbers + */ + function fixedModulo(n, m) { + return ((n % m) + m) % m; + } + + /** + * Used to grok the `now` parameter to createClock. + * @param epoch {Date|number} the system time + */ + function getEpoch(epoch) { + if (!epoch) { return 0; } + if (typeof epoch.getTime === "function") { return epoch.getTime(); } + if (typeof epoch === "number") { return epoch; } + throw new TypeError("now should be milliseconds since UNIX epoch"); + } + + function inRange(from, to, timer) { + return timer && timer.callAt >= from && timer.callAt <= to; + } + + function mirrorDateProperties(target, source) { + var prop; + for (prop in source) { + if (source.hasOwnProperty(prop)) { + target[prop] = source[prop]; + } + } + + // set special now implementation + if (source.now) { + target.now = function now() { + return target.clock.now; + }; + } else { + delete target.now; + } + + // set special toSource implementation + if (source.toSource) { + target.toSource = function toSource() { + return source.toSource(); + }; + } else { + delete target.toSource; + } + + // set special toString implementation + target.toString = function toString() { + return source.toString(); + }; + + target.prototype = source.prototype; + target.parse = source.parse; + target.UTC = source.UTC; + target.prototype.toUTCString = source.prototype.toUTCString; + + return target; + } + + function createDate() { + function ClockDate(year, month, date, hour, minute, second, ms) { + // Defensive and verbose to avoid potential harm in passing + // explicit undefined when user does not pass argument + switch (arguments.length) { + case 0: + return new NativeDate(ClockDate.clock.now); + case 1: + return new NativeDate(year); + case 2: + return new NativeDate(year, month); + case 3: + return new NativeDate(year, month, date); + case 4: + return new NativeDate(year, month, date, hour); + case 5: + return new NativeDate(year, month, date, hour, minute); + case 6: + return new NativeDate(year, month, date, hour, minute, second); + default: + return new NativeDate(year, month, date, hour, minute, second, ms); + } + } + + return mirrorDateProperties(ClockDate, NativeDate); + } + + + function enqueueJob(clock, job) { + // enqueues a microtick-deferred task - ecma262/#sec-enqueuejob + if (!clock.jobs) { + clock.jobs = []; + } + clock.jobs.push(job); + } + + function runJobs(clock) { + // runs all microtick-deferred tasks - ecma262/#sec-runjobs + if (!clock.jobs) { + return; + } + for (var i = 0; i < clock.jobs.length; i++) { + var job = clock.jobs[i]; + job.func.apply(null, job.args); + } + clock.jobs = []; + } + + function addTimer(clock, timer) { + if (timer.func === undefined) { + throw new Error("Callback must be provided to timer calls"); + } + + timer.type = timer.immediate ? "Immediate" : "Timeout"; + + if (timer.hasOwnProperty("delay")) { + timer.delay = timer.delay > maxTimeout ? 1 : timer.delay; + timer.delay = Math.max(0, timer.delay); + } + + if (timer.hasOwnProperty("interval")) { + timer.type = "Interval"; + timer.interval = timer.interval > maxTimeout ? 1 : timer.interval; + } + + if (timer.hasOwnProperty("animation")) { + timer.type = "AnimationFrame"; + timer.animation = true; + } + + if (!clock.timers) { + clock.timers = {}; + } + + timer.id = uniqueTimerId++; + timer.createdAt = clock.now; + timer.callAt = clock.now + (parseInt(timer.delay) || (clock.duringTick ? 1 : 0)); + + clock.timers[timer.id] = timer; + + if (addTimerReturnsObject) { + return { + id: timer.id, + ref: NOOP, + unref: NOOP + }; + } + + return timer.id; + } + + + /* eslint consistent-return: "off" */ + function compareTimers(a, b) { + // Sort first by absolute timing + if (a.callAt < b.callAt) { + return -1; + } + if (a.callAt > b.callAt) { + return 1; + } + + // Sort next by immediate, immediate timers take precedence + if (a.immediate && !b.immediate) { + return -1; + } + if (!a.immediate && b.immediate) { + return 1; + } + + // Sort next by creation time, earlier-created timers take precedence + if (a.createdAt < b.createdAt) { + return -1; + } + if (a.createdAt > b.createdAt) { + return 1; + } + + // Sort next by id, lower-id timers take precedence + if (a.id < b.id) { + return -1; + } + if (a.id > b.id) { + return 1; + } + + // As timer ids are unique, no fallback `0` is necessary + } + + function firstTimerInRange(clock, from, to) { + var timers = clock.timers; + var timer = null; + var id, isInRange; + + for (id in timers) { + if (timers.hasOwnProperty(id)) { + isInRange = inRange(from, to, timers[id]); + + if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) { + timer = timers[id]; + } + } + } + + return timer; + } + + function firstTimer(clock) { + var timers = clock.timers; + var timer = null; + var id; + + for (id in timers) { + if (timers.hasOwnProperty(id)) { + if (!timer || compareTimers(timer, timers[id]) === 1) { + timer = timers[id]; + } + } + } + + return timer; + } + + function lastTimer(clock) { + var timers = clock.timers; + var timer = null; + var id; + + for (id in timers) { + if (timers.hasOwnProperty(id)) { + if (!timer || compareTimers(timer, timers[id]) === -1) { + timer = timers[id]; + } + } + } + + return timer; + } + + function callTimer(clock, timer) { + if (typeof timer.interval === "number") { + clock.timers[timer.id].callAt += timer.interval; + } else { + delete clock.timers[timer.id]; + } + + if (typeof timer.func === "function") { + timer.func.apply(null, timer.args); + } else { + /* eslint no-eval: "off" */ + eval(timer.func); + } + } + + function clearTimer(clock, timerId, ttype) { + if (!timerId) { + // null appears to be allowed in most browsers, and appears to be + // relied upon by some libraries, like Bootstrap carousel + return; + } + + if (!clock.timers) { + clock.timers = []; + } + + // in Node, timerId is an object with .ref()/.unref(), and + // its .id field is the actual timer id. + if (typeof timerId === "object") { + timerId = timerId.id; + } + + if (clock.timers.hasOwnProperty(timerId)) { + // check that the ID matches a timer of the correct type + var timer = clock.timers[timerId]; + if (timer.type === ttype) { + delete clock.timers[timerId]; + } else { + var clear = ttype === "AnimationFrame" ? "cancelAnimationFrame" : "clear" + ttype; + var schedule = timer.type === "AnimationFrame" ? "requestAnimationFrame" : "set" + timer.type; + throw new Error("Cannot clear timer: timer created with " + schedule + + "() but cleared with " + clear + "()"); + } + } + } + + function uninstall(clock, target, config) { + var method, + i, + l; + var installedHrTime = "_hrtime"; + var installedNextTick = "_nextTick"; + + for (i = 0, l = clock.methods.length; i < l; i++) { + method = clock.methods[i]; + if (method === "hrtime" && target.process) { + target.process.hrtime = clock[installedHrTime]; + } else if (method === "nextTick" && target.process) { + target.process.nextTick = clock[installedNextTick]; + } else { + if (target[method] && target[method].hadOwnProperty) { + target[method] = clock["_" + method]; + if (method === "clearInterval" && config.shouldAdvanceTime === true) { + target[method](clock.attachedInterval); + } + } else { + try { + delete target[method]; + } catch (ignore) { /* eslint empty-block: "off" */ } + } + } + } + + // Prevent multiple executions which will completely remove these props + clock.methods = []; + + // return pending timers, to enable checking what timers remained on uninstall + if (!clock.timers) { + return []; + } + return Object.keys(clock.timers).map(function mapper(key) { + return clock.timers[key]; + }); + } + + function hijackMethod(target, method, clock) { + var prop; + clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method); + clock["_" + method] = target[method]; + + if (method === "Date") { + var date = mirrorDateProperties(clock[method], target[method]); + target[method] = date; + } else { + target[method] = function () { + return clock[method].apply(clock, arguments); + }; + + for (prop in clock[method]) { + if (clock[method].hasOwnProperty(prop)) { + target[method][prop] = clock[method][prop]; + } + } + } + + target[method].clock = clock; + } + + function doIntervalTick(clock, advanceTimeDelta) { + clock.tick(advanceTimeDelta); + } + + var timers = { + setTimeout: setTimeout, + clearTimeout: clearTimeout, + setImmediate: global.setImmediate, + clearImmediate: global.clearImmediate, + setInterval: setInterval, + clearInterval: clearInterval, + Date: Date + }; + + if (hrtimePresent) { + timers.hrtime = global.process.hrtime; + } + + if (nextTickPresent) { + timers.nextTick = global.process.nextTick; + } + + if (performancePresent) { + timers.performance = global.performance; + } + + if (requestAnimationFramePresent) { + timers.requestAnimationFrame = global.requestAnimationFrame; + } + + if (cancelAnimationFramePresent) { + timers.cancelAnimationFrame = global.cancelAnimationFrame; + } + + var keys = Object.keys || function (obj) { + var ks = []; + var key; + + for (key in obj) { + if (obj.hasOwnProperty(key)) { + ks.push(key); + } + } + + return ks; + }; + + exports.timers = timers; + + /** + * @param start {Date|number} the system time + * @param loopLimit {number} maximum number of timers that will be run when calling runAll() + */ + function createClock(start, loopLimit) { + start = start || 0; + loopLimit = loopLimit || 1000; + + var clock = { + now: getEpoch(start), + hrNow: 0, + timeouts: {}, + Date: createDate(), + loopLimit: loopLimit + }; + + clock.Date.clock = clock; + + function getTimeToNextFrame() { + return 16 - ((clock.now - start) % 16); + } + + clock.setTimeout = function setTimeout(func, timeout) { + return addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 2), + delay: timeout + }); + }; + + clock.clearTimeout = function clearTimeout(timerId) { + return clearTimer(clock, timerId, "Timeout"); + }; + clock.nextTick = function nextTick(func) { + return enqueueJob(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 1) + }); + }; + clock.setInterval = function setInterval(func, timeout) { + return addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 2), + delay: timeout, + interval: timeout + }); + }; + + clock.clearInterval = function clearInterval(timerId) { + return clearTimer(clock, timerId, "Interval"); + }; + + clock.setImmediate = function setImmediate(func) { + return addTimer(clock, { + func: func, + args: Array.prototype.slice.call(arguments, 1), + immediate: true + }); + }; + + clock.clearImmediate = function clearImmediate(timerId) { + return clearTimer(clock, timerId, "Immediate"); + }; + + clock.requestAnimationFrame = function requestAnimationFrame(func) { + var result = addTimer(clock, { + func: func, + delay: getTimeToNextFrame(), + args: [clock.now + getTimeToNextFrame()], + animation: true + }); + + return result.id || result; + }; + + clock.cancelAnimationFrame = function cancelAnimationFrame(timerId) { + return clearTimer(clock, timerId, "AnimationFrame"); + }; + + function updateHrTime(newNow) { + clock.hrNow += (newNow - clock.now); + } + + clock.tick = function tick(ms) { + ms = typeof ms === "number" ? ms : parseTime(ms); + var tickFrom = clock.now; + var tickTo = clock.now + ms; + var previous = clock.now; + var timer, firstException, oldNow; + + clock.duringTick = true; + + // perform process.nextTick()s + oldNow = clock.now; + runJobs(clock); + if (oldNow !== clock.now) { + // compensate for any setSystemTime() call during process.nextTick() callback + tickFrom += clock.now - oldNow; + tickTo += clock.now - oldNow; + } + + // perform each timer in the requested range + timer = firstTimerInRange(clock, tickFrom, tickTo); + while (timer && tickFrom <= tickTo) { + if (clock.timers[timer.id]) { + updateHrTime(timer.callAt); + tickFrom = timer.callAt; + clock.now = timer.callAt; + oldNow = clock.now; + try { + runJobs(clock); + callTimer(clock, timer); + } catch (e) { + firstException = firstException || e; + } + + // compensate for any setSystemTime() call during timer callback + if (oldNow !== clock.now) { + tickFrom += clock.now - oldNow; + tickTo += clock.now - oldNow; + previous += clock.now - oldNow; + } + } + + timer = firstTimerInRange(clock, previous, tickTo); + previous = tickFrom; + } + + // perform process.nextTick()s again + oldNow = clock.now; + runJobs(clock); + if (oldNow !== clock.now) { + // compensate for any setSystemTime() call during process.nextTick() callback + tickFrom += clock.now - oldNow; + tickTo += clock.now - oldNow; + } + clock.duringTick = false; + + // corner case: during runJobs, new timers were scheduled which could be in the range [clock.now, tickTo] + timer = firstTimerInRange(clock, tickFrom, tickTo); + if (timer) { + try { + clock.tick(tickTo - clock.now); // do it all again - for the remainder of the requested range + } catch (e) { + firstException = firstException || e; + } + } else { + // no timers remaining in the requested range: move the clock all the way to the end + updateHrTime(tickTo); + clock.now = tickTo; + } + if (firstException) { + throw firstException; + } + return clock.now; + }; + + clock.next = function next() { + runJobs(clock); + var timer = firstTimer(clock); + if (!timer) { + return clock.now; + } + + clock.duringTick = true; + try { + updateHrTime(timer.callAt); + clock.now = timer.callAt; + callTimer(clock, timer); + runJobs(clock); + return clock.now; + } finally { + clock.duringTick = false; + } + }; + + clock.runAll = function runAll() { + var numTimers, i; + runJobs(clock); + for (i = 0; i < clock.loopLimit; i++) { + if (!clock.timers) { + return clock.now; + } + + numTimers = keys(clock.timers).length; + if (numTimers === 0) { + return clock.now; + } + + clock.next(); + } + + throw new Error("Aborting after running " + clock.loopLimit + " timers, assuming an infinite loop!"); + }; + + clock.runToFrame = function runToFrame() { + return clock.tick(getTimeToNextFrame()); + }; + + clock.runToLast = function runToLast() { + var timer = lastTimer(clock); + if (!timer) { + runJobs(clock); + return clock.now; + } + + return clock.tick(timer.callAt); + }; + + clock.reset = function reset() { + clock.timers = {}; + }; + + clock.setSystemTime = function setSystemTime(systemTime) { + // determine time difference + var newNow = getEpoch(systemTime); + var difference = newNow - clock.now; + var id, timer; + + // update 'system clock' + clock.now = newNow; + + // update timers and intervals to keep them stable + for (id in clock.timers) { + if (clock.timers.hasOwnProperty(id)) { + timer = clock.timers[id]; + timer.createdAt += difference; + timer.callAt += difference; + } + } + }; + + if (performancePresent) { + clock.performance = Object.create(global.performance); + clock.performance.now = function lolexNow() { + return clock.hrNow; + }; + } + if (hrtimePresent) { + clock.hrtime = function (prev) { + if (Array.isArray(prev)) { + var oldSecs = (prev[0] + prev[1] / 1e9); + var newSecs = (clock.hrNow / 1000); + var difference = (newSecs - oldSecs); + var secs = fixedFloor(difference); + var nanosecs = fixedModulo(difference * 1e9, 1e9); + return [ + secs, + nanosecs + ]; + } + return [ + fixedFloor(clock.hrNow / 1000), + fixedModulo(clock.hrNow * 1e6, 1e9) + ]; + }; + } + + return clock; + } + exports.createClock = createClock; + + /** + * @param config {Object} optional config + * @param config.target {Object} the target to install timers in (default `window`) + * @param config.now {number|Date} a number (in milliseconds) or a Date object (default epoch) + * @param config.toFake {string[]} names of the methods that should be faked. + * @param config.loopLimit {number} the maximum number of timers that will be run when calling runAll() + * @param config.shouldAdvanceTime {Boolean} tells lolex to increment mocked time automatically (default false) + * @param config.advanceTimeDelta {Number} increment mocked time every <> ms (default: 20ms) + */ + exports.install = function install(config) { + if ( arguments.length > 1 || config instanceof Date || Array.isArray(config) || typeof config === "number") { + throw new TypeError("lolex.install called with " + String(config) + + " lolex 2.0+ requires an object parameter - see https://github.com/sinonjs/lolex"); + } + config = typeof config !== "undefined" ? config : {}; + config.shouldAdvanceTime = config.shouldAdvanceTime || false; + config.advanceTimeDelta = config.advanceTimeDelta || 20; + + var i, l; + var target = config.target || global; + var clock = createClock(config.now, config.loopLimit); + + clock.uninstall = function () { + return uninstall(clock, target, config); + }; + + clock.methods = config.toFake || []; + + if (clock.methods.length === 0) { + // do not fake nextTick by default - GitHub#126 + clock.methods = keys(timers).filter(function (key) {return key !== "nextTick";}); + } + + for (i = 0, l = clock.methods.length; i < l; i++) { + if (clock.methods[i] === "hrtime") { + if (target.process && typeof target.process.hrtime === "function") { + hijackMethod(target.process, clock.methods[i], clock); + } + } else if (clock.methods[i] === "nextTick") { + if (target.process && typeof target.process.nextTick === "function") { + hijackMethod(target.process, clock.methods[i], clock); + } + } else { + if (clock.methods[i] === "setInterval" && config.shouldAdvanceTime === true) { + var intervalTick = doIntervalTick.bind(null, clock, config.advanceTimeDelta); + var intervalId = target[clock.methods[i]]( + intervalTick, + config.advanceTimeDelta); + clock.attachedInterval = intervalId; + } + hijackMethod(target, clock.methods[i], clock); + } + } + + return clock; + }; + + }).call(this,typeof commonjsGlobal$1 !== "undefined" ? commonjsGlobal$1 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); + },{}],33:[function(require,module,exports){ + var isarray = require('isarray'); + + /** + * Expose `pathToRegexp`. + */ + module.exports = pathToRegexp; + module.exports.parse = parse; + module.exports.compile = compile; + module.exports.tokensToFunction = tokensToFunction; + module.exports.tokensToRegExp = tokensToRegExp; + + /** + * The main path matching regexp utility. + * + * @type {RegExp} + */ + var PATH_REGEXP = new RegExp([ + // Match escaped characters that would otherwise appear in future matches. + // This allows the user to escape special characters that won't transform. + '(\\\\.)', + // Match Express-style parameters and un-named parameters with a prefix + // and optional suffixes. Matches appear as: + // + // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined] + // "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined] + // "/*" => ["/", undefined, undefined, undefined, undefined, "*"] + '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))' + ].join('|'), 'g'); + + /** + * Parse a string for the raw tokens. + * + * @param {string} str + * @param {Object=} options + * @return {!Array} + */ + function parse (str, options) { + var tokens = []; + var key = 0; + var index = 0; + var path = ''; + var defaultDelimiter = options && options.delimiter || '/'; + var res; + + while ((res = PATH_REGEXP.exec(str)) != null) { + var m = res[0]; + var escaped = res[1]; + var offset = res.index; + path += str.slice(index, offset); + index = offset + m.length; + + // Ignore already escaped sequences. + if (escaped) { + path += escaped[1]; + continue + } + + var next = str[index]; + var prefix = res[2]; + var name = res[3]; + var capture = res[4]; + var group = res[5]; + var modifier = res[6]; + var asterisk = res[7]; + + // Push the current path onto the tokens. + if (path) { + tokens.push(path); + path = ''; + } + + var partial = prefix != null && next != null && next !== prefix; + var repeat = modifier === '+' || modifier === '*'; + var optional = modifier === '?' || modifier === '*'; + var delimiter = res[2] || defaultDelimiter; + var pattern = capture || group; + + tokens.push({ + name: name || key++, + prefix: prefix || '', + delimiter: delimiter, + optional: optional, + repeat: repeat, + partial: partial, + asterisk: !!asterisk, + pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?') + }); + } + + // Match any characters still remaining. + if (index < str.length) { + path += str.substr(index); + } + + // If the path exists, push it onto the end. + if (path) { + tokens.push(path); + } + + return tokens + } + + /** + * Compile a string to a template function for the path. + * + * @param {string} str + * @param {Object=} options + * @return {!function(Object=, Object=)} + */ + function compile (str, options) { + return tokensToFunction(parse(str, options)) + } + + /** + * Prettier encoding of URI path segments. + * + * @param {string} + * @return {string} + */ + function encodeURIComponentPretty (str) { + return encodeURI(str).replace(/[\/?#]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) + } + + /** + * Encode the asterisk parameter. Similar to `pretty`, but allows slashes. + * + * @param {string} + * @return {string} + */ + function encodeAsterisk (str) { + return encodeURI(str).replace(/[?#]/g, function (c) { + return '%' + c.charCodeAt(0).toString(16).toUpperCase() + }) + } + + /** + * Expose a method for transforming tokens into the path function. + */ + function tokensToFunction (tokens) { + // Compile all the tokens into regexps. + var matches = new Array(tokens.length); + + // Compile all the patterns before compilation. + for (var i = 0; i < tokens.length; i++) { + if (typeof tokens[i] === 'object') { + matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$'); + } + } + + return function (obj, opts) { + var path = ''; + var data = obj || {}; + var options = opts || {}; + var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent; + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + + if (typeof token === 'string') { + path += token; + + continue + } + + var value = data[token.name]; + var segment; + + if (value == null) { + if (token.optional) { + // Prepend partial segment prefixes. + if (token.partial) { + path += token.prefix; + } + + continue + } else { + throw new TypeError('Expected "' + token.name + '" to be defined') + } + } + + if (isarray(value)) { + if (!token.repeat) { + throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`') + } + + if (value.length === 0) { + if (token.optional) { + continue + } else { + throw new TypeError('Expected "' + token.name + '" to not be empty') + } + } + + for (var j = 0; j < value.length; j++) { + segment = encode(value[j]); + + if (!matches[i].test(segment)) { + throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`') + } + + path += (j === 0 ? token.prefix : token.delimiter) + segment; + } + + continue + } + + segment = token.asterisk ? encodeAsterisk(value) : encode(value); + + if (!matches[i].test(segment)) { + throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"') + } + + path += token.prefix + segment; + } + + return path + } + } + + /** + * Escape a regular expression string. + * + * @param {string} str + * @return {string} + */ + function escapeString (str) { + return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1') + } + + /** + * Escape the capturing group by escaping special characters and meaning. + * + * @param {string} group + * @return {string} + */ + function escapeGroup (group) { + return group.replace(/([=!:$\/()])/g, '\\$1') + } + + /** + * Attach the keys as a property of the regexp. + * + * @param {!RegExp} re + * @param {Array} keys + * @return {!RegExp} + */ + function attachKeys (re, keys) { + re.keys = keys; + return re + } + + /** + * Get the flags for a regexp from the options. + * + * @param {Object} options + * @return {string} + */ + function flags (options) { + return options.sensitive ? '' : 'i' + } + + /** + * Pull out keys from a regexp. + * + * @param {!RegExp} path + * @param {!Array} keys + * @return {!RegExp} + */ + function regexpToRegexp (path, keys) { + // Use a negative lookahead to match only capturing groups. + var groups = path.source.match(/\((?!\?)/g); + + if (groups) { + for (var i = 0; i < groups.length; i++) { + keys.push({ + name: i, + prefix: null, + delimiter: null, + optional: false, + repeat: false, + partial: false, + asterisk: false, + pattern: null + }); + } + } + + return attachKeys(path, keys) + } + + /** + * Transform an array into a regexp. + * + * @param {!Array} path + * @param {Array} keys + * @param {!Object} options + * @return {!RegExp} + */ + function arrayToRegexp (path, keys, options) { + var parts = []; + + for (var i = 0; i < path.length; i++) { + parts.push(pathToRegexp(path[i], keys, options).source); + } + + var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options)); + + return attachKeys(regexp, keys) + } + + /** + * Create a path regexp from string input. + * + * @param {string} path + * @param {!Array} keys + * @param {!Object} options + * @return {!RegExp} + */ + function stringToRegexp (path, keys, options) { + return tokensToRegExp(parse(path, options), keys, options) + } + + /** + * Expose a function for taking tokens and returning a RegExp. + * + * @param {!Array} tokens + * @param {(Array|Object)=} keys + * @param {Object=} options + * @return {!RegExp} + */ + function tokensToRegExp (tokens, keys, options) { + if (!isarray(keys)) { + options = /** @type {!Object} */ (keys || options); + keys = []; + } + + options = options || {}; + + var strict = options.strict; + var end = options.end !== false; + var route = ''; + + // Iterate over the tokens and create our regexp string. + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; + + if (typeof token === 'string') { + route += escapeString(token); + } else { + var prefix = escapeString(token.prefix); + var capture = '(?:' + token.pattern + ')'; + + keys.push(token); + + if (token.repeat) { + capture += '(?:' + prefix + capture + ')*'; + } + + if (token.optional) { + if (!token.partial) { + capture = '(?:' + prefix + '(' + capture + '))?'; + } else { + capture = prefix + '(' + capture + ')?'; + } + } else { + capture = prefix + '(' + capture + ')'; + } + + route += capture; + } + } + + var delimiter = escapeString(options.delimiter || '/'); + var endsWithDelimiter = route.slice(-delimiter.length) === delimiter; + + // In non-strict mode we allow a slash at the end of match. If the path to + // match already ends with a slash, we remove it for consistency. The slash + // is valid at the end of a path match, not in the middle. This is important + // in non-ending mode, where "/test/" shouldn't match "/test//route". + if (!strict) { + route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'; + } + + if (end) { + route += '$'; + } else { + // In non-ending mode, we need the capturing groups to match as much as + // possible by using a positive lookahead to the end or next path segment. + route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'; + } + + return attachKeys(new RegExp('^' + route, flags(options)), keys) + } + + /** + * Normalize the given path string, returning a regular expression. + * + * An empty array can be passed in for the keys, which will hold the + * placeholder key descriptions. For example, using `/user/:id`, `keys` will + * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. + * + * @param {(string|RegExp|Array)} path + * @param {(Array|Object)=} keys + * @param {Object=} options + * @return {!RegExp} + */ + function pathToRegexp (path, keys, options) { + if (!isarray(keys)) { + options = /** @type {!Object} */ (keys || options); + keys = []; + } + + options = options || {}; + + if (path instanceof RegExp) { + return regexpToRegexp(path, /** @type {!Array} */ (keys)) + } + + if (isarray(path)) { + return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options) + } + + return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options) + } + + },{"isarray":30}],34:[function(require,module,exports){ + // This is free and unencumbered software released into the public domain. + // See LICENSE.md for more information. + + var encoding = require("./lib/encoding.js"); + + module.exports = { + TextEncoder: encoding.TextEncoder, + TextDecoder: encoding.TextDecoder, + }; + + },{"./lib/encoding.js":36}],35:[function(require,module,exports){ + (function(global) { + + if (typeof module !== "undefined" && module.exports) { + module.exports = global; + } + + global["encoding-indexes"] = + { + "big5":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188], + "euc-kr":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "gb18030":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565], + "gb18030-ranges":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]], + "jis0208":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "jis0212":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], + "ibm866":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160], + "iso-8859-2":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], + "iso-8859-3":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729], + "iso-8859-4":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729], + "iso-8859-5":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119], + "iso-8859-6":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null], + "iso-8859-7":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], + "iso-8859-8":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], + "iso-8859-10":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312], + "iso-8859-13":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217], + "iso-8859-14":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255], + "iso-8859-15":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], + "iso-8859-16":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255], + "koi8-r":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], + "koi8-u":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], + "macintosh":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711], + "windows-874":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null], + "windows-1250":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], + "windows-1251":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103], + "windows-1252":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], + "windows-1253":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], + "windows-1254":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255], + "windows-1255":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], + "windows-1256":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746], + "windows-1257":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729], + "windows-1258":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255], + "x-mac-cyrillic":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364] + }; + + // For strict environments where `this` inside the global scope + // is `undefined`, take a pure object instead + }(this || {})); + },{}],36:[function(require,module,exports){ + // This is free and unencumbered software released into the public domain. + // See LICENSE.md for more information. + + /** + * @fileoverview Global |this| required for resolving indexes in node. + * @suppress {globalThis} + */ + (function(global) { + + // If we're in node require encoding-indexes and attach it to the global. + if (typeof module !== "undefined" && module.exports && + !global["encoding-indexes"]) { + global["encoding-indexes"] = + require("./encoding-indexes.js")["encoding-indexes"]; + } + + // + // Utilities + // + + /** + * @param {number} a The number to test. + * @param {number} min The minimum value in the range, inclusive. + * @param {number} max The maximum value in the range, inclusive. + * @return {boolean} True if a >= min and a <= max. + */ + function inRange(a, min, max) { + return min <= a && a <= max; + } + + /** + * @param {!Array.<*>} array The array to check. + * @param {*} item The item to look for in the array. + * @return {boolean} True if the item appears in the array. + */ + function includes(array, item) { + return array.indexOf(item) !== -1; + } + + var floor = Math.floor; + + /** + * @param {*} o + * @return {Object} + */ + function ToDictionary(o) { + if (o === undefined) return {}; + if (o === Object(o)) return o; + throw TypeError('Could not convert argument to dictionary'); + } + + /** + * @param {string} string Input string of UTF-16 code units. + * @return {!Array.} Code points. + */ + function stringToCodePoints(string) { + // https://heycam.github.io/webidl/#dfn-obtain-unicode + + // 1. Let S be the DOMString value. + var s = String(string); + + // 2. Let n be the length of S. + var n = s.length; + + // 3. Initialize i to 0. + var i = 0; + + // 4. Initialize U to be an empty sequence of Unicode characters. + var u = []; + + // 5. While i < n: + while (i < n) { + + // 1. Let c be the code unit in S at index i. + var c = s.charCodeAt(i); + + // 2. Depending on the value of c: + + // c < 0xD800 or c > 0xDFFF + if (c < 0xD800 || c > 0xDFFF) { + // Append to U the Unicode character with code point c. + u.push(c); + } + + // 0xDC00 ≤ c ≤ 0xDFFF + else if (0xDC00 <= c && c <= 0xDFFF) { + // Append to U a U+FFFD REPLACEMENT CHARACTER. + u.push(0xFFFD); + } + + // 0xD800 ≤ c ≤ 0xDBFF + else if (0xD800 <= c && c <= 0xDBFF) { + // 1. If i = n−1, then append to U a U+FFFD REPLACEMENT + // CHARACTER. + if (i === n - 1) { + u.push(0xFFFD); + } + // 2. Otherwise, i < n−1: + else { + // 1. Let d be the code unit in S at index i+1. + var d = s.charCodeAt(i + 1); + + // 2. If 0xDC00 ≤ d ≤ 0xDFFF, then: + if (0xDC00 <= d && d <= 0xDFFF) { + // 1. Let a be c & 0x3FF. + var a = c & 0x3FF; + + // 2. Let b be d & 0x3FF. + var b = d & 0x3FF; + + // 3. Append to U the Unicode character with code point + // 2^16+2^10*a+b. + u.push(0x10000 + (a << 10) + b); + + // 4. Set i to i+1. + i += 1; + } + + // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a + // U+FFFD REPLACEMENT CHARACTER. + else { + u.push(0xFFFD); + } + } + } + + // 3. Set i to i+1. + i += 1; + } + + // 6. Return U. + return u; + } + + /** + * @param {!Array.} code_points Array of code points. + * @return {string} string String of UTF-16 code units. + */ + function codePointsToString(code_points) { + var s = ''; + for (var i = 0; i < code_points.length; ++i) { + var cp = code_points[i]; + if (cp <= 0xFFFF) { + s += String.fromCharCode(cp); + } else { + cp -= 0x10000; + s += String.fromCharCode((cp >> 10) + 0xD800, + (cp & 0x3FF) + 0xDC00); + } + } + return s; + } + + + // + // Implementation of Encoding specification + // https://encoding.spec.whatwg.org/ + // + + // + // 4. Terminology + // + + /** + * An ASCII byte is a byte in the range 0x00 to 0x7F, inclusive. + * @param {number} a The number to test. + * @return {boolean} True if a is in the range 0x00 to 0x7F, inclusive. + */ + function isASCIIByte(a) { + return 0x00 <= a && a <= 0x7F; + } + + /** + * An ASCII code point is a code point in the range U+0000 to + * U+007F, inclusive. + */ + var isASCIICodePoint = isASCIIByte; + + + /** + * End-of-stream is a special token that signifies no more tokens + * are in the stream. + * @const + */ var end_of_stream = -1; + + /** + * A stream represents an ordered sequence of tokens. + * + * @constructor + * @param {!(Array.|Uint8Array)} tokens Array of tokens that provide + * the stream. + */ + function Stream(tokens) { + /** @type {!Array.} */ + this.tokens = [].slice.call(tokens); + // Reversed as push/pop is more efficient than shift/unshift. + this.tokens.reverse(); + } + + Stream.prototype = { + /** + * @return {boolean} True if end-of-stream has been hit. + */ + endOfStream: function() { + return !this.tokens.length; + }, + + /** + * When a token is read from a stream, the first token in the + * stream must be returned and subsequently removed, and + * end-of-stream must be returned otherwise. + * + * @return {number} Get the next token from the stream, or + * end_of_stream. + */ + read: function() { + if (!this.tokens.length) + return end_of_stream; + return this.tokens.pop(); + }, + + /** + * When one or more tokens are prepended to a stream, those tokens + * must be inserted, in given order, before the first token in the + * stream. + * + * @param {(number|!Array.)} token The token(s) to prepend to the + * stream. + */ + prepend: function(token) { + if (Array.isArray(token)) { + var tokens = /**@type {!Array.}*/(token); + while (tokens.length) + this.tokens.push(tokens.pop()); + } else { + this.tokens.push(token); + } + }, + + /** + * When one or more tokens are pushed to a stream, those tokens + * must be inserted, in given order, after the last token in the + * stream. + * + * @param {(number|!Array.)} token The tokens(s) to push to the + * stream. + */ + push: function(token) { + if (Array.isArray(token)) { + var tokens = /**@type {!Array.}*/(token); + while (tokens.length) + this.tokens.unshift(tokens.shift()); + } else { + this.tokens.unshift(token); + } + } + }; + + // + // 5. Encodings + // + + // 5.1 Encoders and decoders + + /** @const */ + var finished = -1; + + /** + * @param {boolean} fatal If true, decoding errors raise an exception. + * @param {number=} opt_code_point Override the standard fallback code point. + * @return {number} The code point to insert on a decoding error. + */ + function decoderError(fatal, opt_code_point) { + if (fatal) + throw TypeError('Decoder error'); + return opt_code_point || 0xFFFD; + } + + /** + * @param {number} code_point The code point that could not be encoded. + * @return {number} Always throws, no value is actually returned. + */ + function encoderError(code_point) { + throw TypeError('The code point ' + code_point + ' could not be encoded.'); + } + + // 5.2 Names and labels + + // TODO: Define @typedef for Encoding: {name:string,labels:Array.} + // https://github.com/google/closure-compiler/issues/247 + + /** + * @param {string} label The encoding label. + * @return {?{name:string,labels:Array.}} + */ + function getEncoding(label) { + // 1. Remove any leading and trailing ASCII whitespace from label. + label = String(label).trim().toLowerCase(); + + // 2. If label is an ASCII case-insensitive match for any of the + // labels listed in the table below, return the corresponding + // encoding, and failure otherwise. + if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) { + return label_to_encoding[label]; + } + return null; + } + + /** + * Encodings table: https://encoding.spec.whatwg.org/encodings.json + * @const + * @type {!Array.<{ + * heading: string, + * encodings: Array.<{name:string,labels:Array.}> + * }>} + */ + var encodings = [ + { + "encodings": [ + { + "labels": [ + "unicode-1-1-utf-8", + "utf-8", + "utf8" + ], + "name": "UTF-8" + } + ], + "heading": "The Encoding" + }, + { + "encodings": [ + { + "labels": [ + "866", + "cp866", + "csibm866", + "ibm866" + ], + "name": "IBM866" + }, + { + "labels": [ + "csisolatin2", + "iso-8859-2", + "iso-ir-101", + "iso8859-2", + "iso88592", + "iso_8859-2", + "iso_8859-2:1987", + "l2", + "latin2" + ], + "name": "ISO-8859-2" + }, + { + "labels": [ + "csisolatin3", + "iso-8859-3", + "iso-ir-109", + "iso8859-3", + "iso88593", + "iso_8859-3", + "iso_8859-3:1988", + "l3", + "latin3" + ], + "name": "ISO-8859-3" + }, + { + "labels": [ + "csisolatin4", + "iso-8859-4", + "iso-ir-110", + "iso8859-4", + "iso88594", + "iso_8859-4", + "iso_8859-4:1988", + "l4", + "latin4" + ], + "name": "ISO-8859-4" + }, + { + "labels": [ + "csisolatincyrillic", + "cyrillic", + "iso-8859-5", + "iso-ir-144", + "iso8859-5", + "iso88595", + "iso_8859-5", + "iso_8859-5:1988" + ], + "name": "ISO-8859-5" + }, + { + "labels": [ + "arabic", + "asmo-708", + "csiso88596e", + "csiso88596i", + "csisolatinarabic", + "ecma-114", + "iso-8859-6", + "iso-8859-6-e", + "iso-8859-6-i", + "iso-ir-127", + "iso8859-6", + "iso88596", + "iso_8859-6", + "iso_8859-6:1987" + ], + "name": "ISO-8859-6" + }, + { + "labels": [ + "csisolatingreek", + "ecma-118", + "elot_928", + "greek", + "greek8", + "iso-8859-7", + "iso-ir-126", + "iso8859-7", + "iso88597", + "iso_8859-7", + "iso_8859-7:1987", + "sun_eu_greek" + ], + "name": "ISO-8859-7" + }, + { + "labels": [ + "csiso88598e", + "csisolatinhebrew", + "hebrew", + "iso-8859-8", + "iso-8859-8-e", + "iso-ir-138", + "iso8859-8", + "iso88598", + "iso_8859-8", + "iso_8859-8:1988", + "visual" + ], + "name": "ISO-8859-8" + }, + { + "labels": [ + "csiso88598i", + "iso-8859-8-i", + "logical" + ], + "name": "ISO-8859-8-I" + }, + { + "labels": [ + "csisolatin6", + "iso-8859-10", + "iso-ir-157", + "iso8859-10", + "iso885910", + "l6", + "latin6" + ], + "name": "ISO-8859-10" + }, + { + "labels": [ + "iso-8859-13", + "iso8859-13", + "iso885913" + ], + "name": "ISO-8859-13" + }, + { + "labels": [ + "iso-8859-14", + "iso8859-14", + "iso885914" + ], + "name": "ISO-8859-14" + }, + { + "labels": [ + "csisolatin9", + "iso-8859-15", + "iso8859-15", + "iso885915", + "iso_8859-15", + "l9" + ], + "name": "ISO-8859-15" + }, + { + "labels": [ + "iso-8859-16" + ], + "name": "ISO-8859-16" + }, + { + "labels": [ + "cskoi8r", + "koi", + "koi8", + "koi8-r", + "koi8_r" + ], + "name": "KOI8-R" + }, + { + "labels": [ + "koi8-ru", + "koi8-u" + ], + "name": "KOI8-U" + }, + { + "labels": [ + "csmacintosh", + "mac", + "macintosh", + "x-mac-roman" + ], + "name": "macintosh" + }, + { + "labels": [ + "dos-874", + "iso-8859-11", + "iso8859-11", + "iso885911", + "tis-620", + "windows-874" + ], + "name": "windows-874" + }, + { + "labels": [ + "cp1250", + "windows-1250", + "x-cp1250" + ], + "name": "windows-1250" + }, + { + "labels": [ + "cp1251", + "windows-1251", + "x-cp1251" + ], + "name": "windows-1251" + }, + { + "labels": [ + "ansi_x3.4-1968", + "ascii", + "cp1252", + "cp819", + "csisolatin1", + "ibm819", + "iso-8859-1", + "iso-ir-100", + "iso8859-1", + "iso88591", + "iso_8859-1", + "iso_8859-1:1987", + "l1", + "latin1", + "us-ascii", + "windows-1252", + "x-cp1252" + ], + "name": "windows-1252" + }, + { + "labels": [ + "cp1253", + "windows-1253", + "x-cp1253" + ], + "name": "windows-1253" + }, + { + "labels": [ + "cp1254", + "csisolatin5", + "iso-8859-9", + "iso-ir-148", + "iso8859-9", + "iso88599", + "iso_8859-9", + "iso_8859-9:1989", + "l5", + "latin5", + "windows-1254", + "x-cp1254" + ], + "name": "windows-1254" + }, + { + "labels": [ + "cp1255", + "windows-1255", + "x-cp1255" + ], + "name": "windows-1255" + }, + { + "labels": [ + "cp1256", + "windows-1256", + "x-cp1256" + ], + "name": "windows-1256" + }, + { + "labels": [ + "cp1257", + "windows-1257", + "x-cp1257" + ], + "name": "windows-1257" + }, + { + "labels": [ + "cp1258", + "windows-1258", + "x-cp1258" + ], + "name": "windows-1258" + }, + { + "labels": [ + "x-mac-cyrillic", + "x-mac-ukrainian" + ], + "name": "x-mac-cyrillic" + } + ], + "heading": "Legacy single-byte encodings" + }, + { + "encodings": [ + { + "labels": [ + "chinese", + "csgb2312", + "csiso58gb231280", + "gb2312", + "gb_2312", + "gb_2312-80", + "gbk", + "iso-ir-58", + "x-gbk" + ], + "name": "GBK" + }, + { + "labels": [ + "gb18030" + ], + "name": "gb18030" + } + ], + "heading": "Legacy multi-byte Chinese (simplified) encodings" + }, + { + "encodings": [ + { + "labels": [ + "big5", + "big5-hkscs", + "cn-big5", + "csbig5", + "x-x-big5" + ], + "name": "Big5" + } + ], + "heading": "Legacy multi-byte Chinese (traditional) encodings" + }, + { + "encodings": [ + { + "labels": [ + "cseucpkdfmtjapanese", + "euc-jp", + "x-euc-jp" + ], + "name": "EUC-JP" + }, + { + "labels": [ + "csiso2022jp", + "iso-2022-jp" + ], + "name": "ISO-2022-JP" + }, + { + "labels": [ + "csshiftjis", + "ms932", + "ms_kanji", + "shift-jis", + "shift_jis", + "sjis", + "windows-31j", + "x-sjis" + ], + "name": "Shift_JIS" + } + ], + "heading": "Legacy multi-byte Japanese encodings" + }, + { + "encodings": [ + { + "labels": [ + "cseuckr", + "csksc56011987", + "euc-kr", + "iso-ir-149", + "korean", + "ks_c_5601-1987", + "ks_c_5601-1989", + "ksc5601", + "ksc_5601", + "windows-949" + ], + "name": "EUC-KR" + } + ], + "heading": "Legacy multi-byte Korean encodings" + }, + { + "encodings": [ + { + "labels": [ + "csiso2022kr", + "hz-gb-2312", + "iso-2022-cn", + "iso-2022-cn-ext", + "iso-2022-kr" + ], + "name": "replacement" + }, + { + "labels": [ + "utf-16be" + ], + "name": "UTF-16BE" + }, + { + "labels": [ + "utf-16", + "utf-16le" + ], + "name": "UTF-16LE" + }, + { + "labels": [ + "x-user-defined" + ], + "name": "x-user-defined" + } + ], + "heading": "Legacy miscellaneous encodings" + } + ]; + + // Label to encoding registry. + /** @type {Object.}>} */ + var label_to_encoding = {}; + encodings.forEach(function(category) { + category.encodings.forEach(function(encoding) { + encoding.labels.forEach(function(label) { + label_to_encoding[label] = encoding; + }); + }); + }); + + // Registry of of encoder/decoder factories, by encoding name. + /** @type {Object.} */ + var encoders = {}; + /** @type {Object.} */ + var decoders = {}; + + // + // 6. Indexes + // + + /** + * @param {number} pointer The |pointer| to search for. + * @param {(!Array.|undefined)} index The |index| to search within. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in |index|. + */ + function indexCodePointFor(pointer, index) { + if (!index) return null; + return index[pointer] || null; + } + + /** + * @param {number} code_point The |code point| to search for. + * @param {!Array.} index The |index| to search within. + * @return {?number} The first pointer corresponding to |code point| in + * |index|, or null if |code point| is not in |index|. + */ + function indexPointerFor(code_point, index) { + var pointer = index.indexOf(code_point); + return pointer === -1 ? null : pointer; + } + + /** + * @param {string} name Name of the index. + * @return {(!Array.|!Array.>)} + * */ + function index(name) { + if (!('encoding-indexes' in global)) { + throw Error("Indexes missing." + + " Did you forget to include encoding-indexes.js first?"); + } + return global['encoding-indexes'][name]; + } + + /** + * @param {number} pointer The |pointer| to search for in the gb18030 index. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in the gb18030 index. + */ + function indexGB18030RangesCodePointFor(pointer) { + // 1. If pointer is greater than 39419 and less than 189000, or + // pointer is greater than 1237575, return null. + if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575)) + return null; + + // 2. If pointer is 7457, return code point U+E7C7. + if (pointer === 7457) return 0xE7C7; + + // 3. Let offset be the last pointer in index gb18030 ranges that + // is equal to or less than pointer and let code point offset be + // its corresponding code point. + var offset = 0; + var code_point_offset = 0; + var idx = index('gb18030-ranges'); + var i; + for (i = 0; i < idx.length; ++i) { + /** @type {!Array.} */ + var entry = idx[i]; + if (entry[0] <= pointer) { + offset = entry[0]; + code_point_offset = entry[1]; + } else { + break; + } + } + + // 4. Return a code point whose value is code point offset + + // pointer − offset. + return code_point_offset + pointer - offset; + } + + /** + * @param {number} code_point The |code point| to locate in the gb18030 index. + * @return {number} The first pointer corresponding to |code point| in the + * gb18030 index. + */ + function indexGB18030RangesPointerFor(code_point) { + // 1. If code point is U+E7C7, return pointer 7457. + if (code_point === 0xE7C7) return 7457; + + // 2. Let offset be the last code point in index gb18030 ranges + // that is equal to or less than code point and let pointer offset + // be its corresponding pointer. + var offset = 0; + var pointer_offset = 0; + var idx = index('gb18030-ranges'); + var i; + for (i = 0; i < idx.length; ++i) { + /** @type {!Array.} */ + var entry = idx[i]; + if (entry[1] <= code_point) { + offset = entry[1]; + pointer_offset = entry[0]; + } else { + break; + } + } + + // 3. Return a pointer whose value is pointer offset + code point + // − offset. + return pointer_offset + code_point - offset; + } + + /** + * @param {number} code_point The |code_point| to search for in the Shift_JIS + * index. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in the Shift_JIS index. + */ + function indexShiftJISPointerFor(code_point) { + // 1. Let index be index jis0208 excluding all entries whose + // pointer is in the range 8272 to 8835, inclusive. + shift_jis_index = shift_jis_index || + index('jis0208').map(function(code_point, pointer) { + return inRange(pointer, 8272, 8835) ? null : code_point; + }); + var index_ = shift_jis_index; + + // 2. Return the index pointer for code point in index. + return index_.indexOf(code_point); + } + var shift_jis_index; + + /** + * @param {number} code_point The |code_point| to search for in the big5 + * index. + * @return {?number} The code point corresponding to |pointer| in |index|, + * or null if |code point| is not in the big5 index. + */ + function indexBig5PointerFor(code_point) { + // 1. Let index be index Big5 excluding all entries whose pointer + big5_index_no_hkscs = big5_index_no_hkscs || + index('big5').map(function(code_point, pointer) { + return (pointer < (0xA1 - 0x81) * 157) ? null : code_point; + }); + var index_ = big5_index_no_hkscs; + + // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or + // U+5345, return the last pointer corresponding to code point in + // index. + if (code_point === 0x2550 || code_point === 0x255E || + code_point === 0x2561 || code_point === 0x256A || + code_point === 0x5341 || code_point === 0x5345) { + return index_.lastIndexOf(code_point); + } + + // 3. Return the index pointer for code point in index. + return indexPointerFor(code_point, index_); + } + var big5_index_no_hkscs; + + // + // 8. API + // + + /** @const */ var DEFAULT_ENCODING = 'utf-8'; + + // 8.1 Interface TextDecoder + + /** + * @constructor + * @param {string=} label The label of the encoding; + * defaults to 'utf-8'. + * @param {Object=} options + */ + function TextDecoder(label, options) { + // Web IDL conventions + if (!(this instanceof TextDecoder)) + throw TypeError('Called as a function. Did you forget \'new\'?'); + label = label !== undefined ? String(label) : DEFAULT_ENCODING; + options = ToDictionary(options); + + // A TextDecoder object has an associated encoding, decoder, + // stream, ignore BOM flag (initially unset), BOM seen flag + // (initially unset), error mode (initially replacement), and do + // not flush flag (initially unset). + + /** @private */ + this._encoding = null; + /** @private @type {?Decoder} */ + this._decoder = null; + /** @private @type {boolean} */ + this._ignoreBOM = false; + /** @private @type {boolean} */ + this._BOMseen = false; + /** @private @type {string} */ + this._error_mode = 'replacement'; + /** @private @type {boolean} */ + this._do_not_flush = false; + + + // 1. Let encoding be the result of getting an encoding from + // label. + var encoding = getEncoding(label); + + // 2. If encoding is failure or replacement, throw a RangeError. + if (encoding === null || encoding.name === 'replacement') + throw RangeError('Unknown encoding: ' + label); + if (!decoders[encoding.name]) { + throw Error('Decoder not present.' + + ' Did you forget to include encoding-indexes.js first?'); + } + + // 3. Let dec be a new TextDecoder object. + var dec = this; + + // 4. Set dec's encoding to encoding. + dec._encoding = encoding; + + // 5. If options's fatal member is true, set dec's error mode to + // fatal. + if (Boolean(options['fatal'])) + dec._error_mode = 'fatal'; + + // 6. If options's ignoreBOM member is true, set dec's ignore BOM + // flag. + if (Boolean(options['ignoreBOM'])) + dec._ignoreBOM = true; + + // For pre-ES5 runtimes: + if (!Object.defineProperty) { + this.encoding = dec._encoding.name.toLowerCase(); + this.fatal = dec._error_mode === 'fatal'; + this.ignoreBOM = dec._ignoreBOM; + } + + // 7. Return dec. + return dec; + } + + if (Object.defineProperty) { + // The encoding attribute's getter must return encoding's name. + Object.defineProperty(TextDecoder.prototype, 'encoding', { + /** @this {TextDecoder} */ + get: function() { return this._encoding.name.toLowerCase(); } + }); + + // The fatal attribute's getter must return true if error mode + // is fatal, and false otherwise. + Object.defineProperty(TextDecoder.prototype, 'fatal', { + /** @this {TextDecoder} */ + get: function() { return this._error_mode === 'fatal'; } + }); + + // The ignoreBOM attribute's getter must return true if ignore + // BOM flag is set, and false otherwise. + Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', { + /** @this {TextDecoder} */ + get: function() { return this._ignoreBOM; } + }); + } + + /** + * @param {BufferSource=} input The buffer of bytes to decode. + * @param {Object=} options + * @return {string} The decoded string. + */ + TextDecoder.prototype.decode = function decode(input, options) { + var bytes; + if (typeof input === 'object' && input instanceof ArrayBuffer) { + bytes = new Uint8Array(input); + } else if (typeof input === 'object' && 'buffer' in input && + input.buffer instanceof ArrayBuffer) { + bytes = new Uint8Array(input.buffer, + input.byteOffset, + input.byteLength); + } else { + bytes = new Uint8Array(0); + } + + options = ToDictionary(options); + + // 1. If the do not flush flag is unset, set decoder to a new + // encoding's decoder, set stream to a new stream, and unset the + // BOM seen flag. + if (!this._do_not_flush) { + this._decoder = decoders[this._encoding.name]({ + fatal: this._error_mode === 'fatal'}); + this._BOMseen = false; + } + + // 2. If options's stream is true, set the do not flush flag, and + // unset the do not flush flag otherwise. + this._do_not_flush = Boolean(options['stream']); + + // 3. If input is given, push a copy of input to stream. + // TODO: Align with spec algorithm - maintain stream on instance. + var input_stream = new Stream(bytes); + + // 4. Let output be a new stream. + var output = []; + + /** @type {?(number|!Array.)} */ + var result; + + // 5. While true: + while (true) { + // 1. Let token be the result of reading from stream. + var token = input_stream.read(); + + // 2. If token is end-of-stream and the do not flush flag is + // set, return output, serialized. + // TODO: Align with spec algorithm. + if (token === end_of_stream) + break; + + // 3. Otherwise, run these subsubsteps: + + // 1. Let result be the result of processing token for decoder, + // stream, output, and error mode. + result = this._decoder.handler(input_stream, token); + + // 2. If result is finished, return output, serialized. + if (result === finished) + break; + + if (result !== null) { + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } + + // 3. Otherwise, if result is error, throw a TypeError. + // (Thrown in handler) + + // 4. Otherwise, do nothing. + } + // TODO: Align with spec algorithm. + if (!this._do_not_flush) { + do { + result = this._decoder.handler(input_stream, input_stream.read()); + if (result === finished) + break; + if (result === null) + continue; + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } while (!input_stream.endOfStream()); + this._decoder = null; + } + + // A TextDecoder object also has an associated serialize stream + // algorithm... + /** + * @param {!Array.} stream + * @return {string} + * @this {TextDecoder} + */ + function serializeStream(stream) { + // 1. Let token be the result of reading from stream. + // (Done in-place on array, rather than as a stream) + + // 2. If encoding is UTF-8, UTF-16BE, or UTF-16LE, and ignore + // BOM flag and BOM seen flag are unset, run these subsubsteps: + if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) && + !this._ignoreBOM && !this._BOMseen) { + if (stream.length > 0 && stream[0] === 0xFEFF) { + // 1. If token is U+FEFF, set BOM seen flag. + this._BOMseen = true; + stream.shift(); + } else if (stream.length > 0) { + // 2. Otherwise, if token is not end-of-stream, set BOM seen + // flag and append token to stream. + this._BOMseen = true; + } + } + // 4. Otherwise, return output. + return codePointsToString(stream); + } + + return serializeStream.call(this, output); + }; + + // 8.2 Interface TextEncoder + + /** + * @constructor + * @param {string=} label The label of the encoding. NONSTANDARD. + * @param {Object=} options NONSTANDARD. + */ + function TextEncoder(label, options) { + // Web IDL conventions + if (!(this instanceof TextEncoder)) + throw TypeError('Called as a function. Did you forget \'new\'?'); + options = ToDictionary(options); + + // A TextEncoder object has an associated encoding and encoder. + + /** @private */ + this._encoding = null; + /** @private @type {?Encoder} */ + this._encoder = null; + + // Non-standard + /** @private @type {boolean} */ + this._do_not_flush = false; + /** @private @type {string} */ + this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement'; + + // 1. Let enc be a new TextEncoder object. + var enc = this; + + // 2. Set enc's encoding to UTF-8's encoder. + if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) { + // NONSTANDARD behavior. + label = label !== undefined ? String(label) : DEFAULT_ENCODING; + var encoding = getEncoding(label); + if (encoding === null || encoding.name === 'replacement') + throw RangeError('Unknown encoding: ' + label); + if (!encoders[encoding.name]) { + throw Error('Encoder not present.' + + ' Did you forget to include encoding-indexes.js first?'); + } + enc._encoding = encoding; + } else { + // Standard behavior. + enc._encoding = getEncoding('utf-8'); + + if (label !== undefined && 'console' in global) { + console.warn('TextEncoder constructor called with encoding label, ' + + 'which is ignored.'); + } + } + + // For pre-ES5 runtimes: + if (!Object.defineProperty) + this.encoding = enc._encoding.name.toLowerCase(); + + // 3. Return enc. + return enc; + } + + if (Object.defineProperty) { + // The encoding attribute's getter must return encoding's name. + Object.defineProperty(TextEncoder.prototype, 'encoding', { + /** @this {TextEncoder} */ + get: function() { return this._encoding.name.toLowerCase(); } + }); + } + + /** + * @param {string=} opt_string The string to encode. + * @param {Object=} options + * @return {!Uint8Array} Encoded bytes, as a Uint8Array. + */ + TextEncoder.prototype.encode = function encode(opt_string, options) { + opt_string = opt_string === undefined ? '' : String(opt_string); + options = ToDictionary(options); + + // NOTE: This option is nonstandard. None of the encodings + // permitted for encoding (i.e. UTF-8, UTF-16) are stateful when + // the input is a USVString so streaming is not necessary. + if (!this._do_not_flush) + this._encoder = encoders[this._encoding.name]({ + fatal: this._fatal === 'fatal'}); + this._do_not_flush = Boolean(options['stream']); + + // 1. Convert input to a stream. + var input = new Stream(stringToCodePoints(opt_string)); + + // 2. Let output be a new stream + var output = []; + + /** @type {?(number|!Array.)} */ + var result; + // 3. While true, run these substeps: + while (true) { + // 1. Let token be the result of reading from input. + var token = input.read(); + if (token === end_of_stream) + break; + // 2. Let result be the result of processing token for encoder, + // input, output. + result = this._encoder.handler(input, token); + if (result === finished) + break; + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } + // TODO: Align with spec algorithm. + if (!this._do_not_flush) { + while (true) { + result = this._encoder.handler(input, input.read()); + if (result === finished) + break; + if (Array.isArray(result)) + output.push.apply(output, /**@type {!Array.}*/(result)); + else + output.push(result); + } + this._encoder = null; + } + // 3. If result is finished, convert output into a byte sequence, + // and then return a Uint8Array object wrapping an ArrayBuffer + // containing output. + return new Uint8Array(output); + }; + + + // + // 9. The encoding + // + + // 9.1 utf-8 + + // 9.1.1 utf-8 decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function UTF8Decoder(options) { + var fatal = options.fatal; + + // utf-8's decoder's has an associated utf-8 code point, utf-8 + // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8 + // lower boundary (initially 0x80), and a utf-8 upper boundary + // (initially 0xBF). + var /** @type {number} */ utf8_code_point = 0, + /** @type {number} */ utf8_bytes_seen = 0, + /** @type {number} */ utf8_bytes_needed = 0, + /** @type {number} */ utf8_lower_boundary = 0x80, + /** @type {number} */ utf8_upper_boundary = 0xBF; + + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and utf-8 bytes needed is not 0, + // set utf-8 bytes needed to 0 and return error. + if (bite === end_of_stream && utf8_bytes_needed !== 0) { + utf8_bytes_needed = 0; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream, return finished. + if (bite === end_of_stream) + return finished; + + // 3. If utf-8 bytes needed is 0, based on byte: + if (utf8_bytes_needed === 0) { + + // 0x00 to 0x7F + if (inRange(bite, 0x00, 0x7F)) { + // Return a code point whose value is byte. + return bite; + } + + // 0xC2 to 0xDF + else if (inRange(bite, 0xC2, 0xDF)) { + // 1. Set utf-8 bytes needed to 1. + utf8_bytes_needed = 1; + + // 2. Set UTF-8 code point to byte & 0x1F. + utf8_code_point = bite & 0x1F; + } + + // 0xE0 to 0xEF + else if (inRange(bite, 0xE0, 0xEF)) { + // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0. + if (bite === 0xE0) + utf8_lower_boundary = 0xA0; + // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F. + if (bite === 0xED) + utf8_upper_boundary = 0x9F; + // 3. Set utf-8 bytes needed to 2. + utf8_bytes_needed = 2; + // 4. Set UTF-8 code point to byte & 0xF. + utf8_code_point = bite & 0xF; + } + + // 0xF0 to 0xF4 + else if (inRange(bite, 0xF0, 0xF4)) { + // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90. + if (bite === 0xF0) + utf8_lower_boundary = 0x90; + // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F. + if (bite === 0xF4) + utf8_upper_boundary = 0x8F; + // 3. Set utf-8 bytes needed to 3. + utf8_bytes_needed = 3; + // 4. Set UTF-8 code point to byte & 0x7. + utf8_code_point = bite & 0x7; + } + + // Otherwise + else { + // Return error. + return decoderError(fatal); + } + + // Return continue. + return null; + } + + // 4. If byte is not in the range utf-8 lower boundary to utf-8 + // upper boundary, inclusive, run these substeps: + if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) { + + // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8 + // bytes seen to 0, set utf-8 lower boundary to 0x80, and set + // utf-8 upper boundary to 0xBF. + utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; + utf8_lower_boundary = 0x80; + utf8_upper_boundary = 0xBF; + + // 2. Prepend byte to stream. + stream.prepend(bite); + + // 3. Return error. + return decoderError(fatal); + } + + // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary + // to 0xBF. + utf8_lower_boundary = 0x80; + utf8_upper_boundary = 0xBF; + + // 6. Set UTF-8 code point to (UTF-8 code point << 6) | (byte & + // 0x3F) + utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F); + + // 7. Increase utf-8 bytes seen by one. + utf8_bytes_seen += 1; + + // 8. If utf-8 bytes seen is not equal to utf-8 bytes needed, + // continue. + if (utf8_bytes_seen !== utf8_bytes_needed) + return null; + + // 9. Let code point be utf-8 code point. + var code_point = utf8_code_point; + + // 10. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes + // seen to 0. + utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; + + // 11. Return a code point whose value is code point. + return code_point; + }; + } + + // 9.1.2 utf-8 encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function UTF8Encoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Set count and offset based on the range code point is in: + var count, offset; + // U+0080 to U+07FF, inclusive: + if (inRange(code_point, 0x0080, 0x07FF)) { + // 1 and 0xC0 + count = 1; + offset = 0xC0; + } + // U+0800 to U+FFFF, inclusive: + else if (inRange(code_point, 0x0800, 0xFFFF)) { + // 2 and 0xE0 + count = 2; + offset = 0xE0; + } + // U+10000 to U+10FFFF, inclusive: + else if (inRange(code_point, 0x10000, 0x10FFFF)) { + // 3 and 0xF0 + count = 3; + offset = 0xF0; + } + + // 4. Let bytes be a byte sequence whose first byte is (code + // point >> (6 × count)) + offset. + var bytes = [(code_point >> (6 * count)) + offset]; + + // 5. Run these substeps while count is greater than 0: + while (count > 0) { + + // 1. Set temp to code point >> (6 × (count − 1)). + var temp = code_point >> (6 * (count - 1)); + + // 2. Append to bytes 0x80 | (temp & 0x3F). + bytes.push(0x80 | (temp & 0x3F)); + + // 3. Decrease count by one. + count -= 1; + } + + // 6. Return bytes bytes, in order. + return bytes; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['UTF-8'] = function(options) { + return new UTF8Encoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['UTF-8'] = function(options) { + return new UTF8Decoder(options); + }; + + // + // 10. Legacy single-byte encodings + // + + // 10.1 single-byte decoder + /** + * @constructor + * @implements {Decoder} + * @param {!Array.} index The encoding index. + * @param {{fatal: boolean}} options + */ + function SingleByteDecoder(index, options) { + var fatal = options.fatal; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream, return finished. + if (bite === end_of_stream) + return finished; + + // 2. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 3. Let code point be the index code point for byte − 0x80 in + // index single-byte. + var code_point = index[bite - 0x80]; + + // 4. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 5. Return a code point whose value is code point. + return code_point; + }; + } + + // 10.2 single-byte encoder + /** + * @constructor + * @implements {Encoder} + * @param {!Array.} index The encoding index. + * @param {{fatal: boolean}} options + */ + function SingleByteEncoder(index, options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Let pointer be the index pointer for code point in index + // single-byte. + var pointer = indexPointerFor(code_point, index); + + // 4. If pointer is null, return error with code point. + if (pointer === null) + encoderError(code_point); + + // 5. Return a byte whose value is pointer + 0x80. + return pointer + 0x80; + }; + } + + (function() { + if (!('encoding-indexes' in global)) + return; + encodings.forEach(function(category) { + if (category.heading !== 'Legacy single-byte encodings') + return; + category.encodings.forEach(function(encoding) { + var name = encoding.name; + var idx = index(name.toLowerCase()); + /** @param {{fatal: boolean}} options */ + decoders[name] = function(options) { + return new SingleByteDecoder(idx, options); + }; + /** @param {{fatal: boolean}} options */ + encoders[name] = function(options) { + return new SingleByteEncoder(idx, options); + }; + }); + }); + }()); + + // + // 11. Legacy multi-byte Chinese (simplified) encodings + // + + // 11.1 gbk + + // 11.1.1 gbk decoder + // gbk's decoder is gb18030's decoder. + /** @param {{fatal: boolean}} options */ + decoders['GBK'] = function(options) { + return new GB18030Decoder(options); + }; + + // 11.1.2 gbk encoder + // gbk's encoder is gb18030's encoder with its gbk flag set. + /** @param {{fatal: boolean}} options */ + encoders['GBK'] = function(options) { + return new GB18030Encoder(options, true); + }; + + // 11.2 gb18030 + + // 11.2.1 gb18030 decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function GB18030Decoder(options) { + var fatal = options.fatal; + // gb18030's decoder has an associated gb18030 first, gb18030 + // second, and gb18030 third (all initially 0x00). + var /** @type {number} */ gb18030_first = 0x00, + /** @type {number} */ gb18030_second = 0x00, + /** @type {number} */ gb18030_third = 0x00; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and gb18030 first, gb18030 + // second, and gb18030 third are 0x00, return finished. + if (bite === end_of_stream && gb18030_first === 0x00 && + gb18030_second === 0x00 && gb18030_third === 0x00) { + return finished; + } + // 2. If byte is end-of-stream, and gb18030 first, gb18030 + // second, or gb18030 third is not 0x00, set gb18030 first, + // gb18030 second, and gb18030 third to 0x00, and return error. + if (bite === end_of_stream && + (gb18030_first !== 0x00 || gb18030_second !== 0x00 || + gb18030_third !== 0x00)) { + gb18030_first = 0x00; + gb18030_second = 0x00; + gb18030_third = 0x00; + decoderError(fatal); + } + var code_point; + // 3. If gb18030 third is not 0x00, run these substeps: + if (gb18030_third !== 0x00) { + // 1. Let code point be null. + code_point = null; + // 2. If byte is in the range 0x30 to 0x39, inclusive, set + // code point to the index gb18030 ranges code point for + // (((gb18030 first − 0x81) × 10 + gb18030 second − 0x30) × + // 126 + gb18030 third − 0x81) × 10 + byte − 0x30. + if (inRange(bite, 0x30, 0x39)) { + code_point = indexGB18030RangesCodePointFor( + (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 + + gb18030_third - 0x81) * 10 + bite - 0x30); + } + + // 3. Let buffer be a byte sequence consisting of gb18030 + // second, gb18030 third, and byte, in order. + var buffer = [gb18030_second, gb18030_third, bite]; + + // 4. Set gb18030 first, gb18030 second, and gb18030 third to + // 0x00. + gb18030_first = 0x00; + gb18030_second = 0x00; + gb18030_third = 0x00; + + // 5. If code point is null, prepend buffer to stream and + // return error. + if (code_point === null) { + stream.prepend(buffer); + return decoderError(fatal); + } + + // 6. Return a code point whose value is code point. + return code_point; + } + + // 4. If gb18030 second is not 0x00, run these substeps: + if (gb18030_second !== 0x00) { + + // 1. If byte is in the range 0x81 to 0xFE, inclusive, set + // gb18030 third to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + gb18030_third = bite; + return null; + } + + // 2. Prepend gb18030 second followed by byte to stream, set + // gb18030 first and gb18030 second to 0x00, and return error. + stream.prepend([gb18030_second, bite]); + gb18030_first = 0x00; + gb18030_second = 0x00; + return decoderError(fatal); + } + + // 5. If gb18030 first is not 0x00, run these substeps: + if (gb18030_first !== 0x00) { + + // 1. If byte is in the range 0x30 to 0x39, inclusive, set + // gb18030 second to byte and return continue. + if (inRange(bite, 0x30, 0x39)) { + gb18030_second = bite; + return null; + } + + // 2. Let lead be gb18030 first, let pointer be null, and set + // gb18030 first to 0x00. + var lead = gb18030_first; + var pointer = null; + gb18030_first = 0x00; + + // 3. Let offset be 0x40 if byte is less than 0x7F and 0x41 + // otherwise. + var offset = bite < 0x7F ? 0x40 : 0x41; + + // 4. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 + // to 0xFE, inclusive, set pointer to (lead − 0x81) × 190 + + // (byte − offset). + if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE)) + pointer = (lead - 0x81) * 190 + (bite - offset); + + // 5. Let code point be null if pointer is null and the index + // code point for pointer in index gb18030 otherwise. + code_point = pointer === null ? null : + indexCodePointFor(pointer, index('gb18030')); + + // 6. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (code_point === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 7. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 8. Return a code point whose value is code point. + return code_point; + } + + // 6. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 7. If byte is 0x80, return code point U+20AC. + if (bite === 0x80) + return 0x20AC; + + // 8. If byte is in the range 0x81 to 0xFE, inclusive, set + // gb18030 first to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + gb18030_first = bite; + return null; + } + + // 9. Return error. + return decoderError(fatal); + }; + } + + // 11.2.2 gb18030 encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + * @param {boolean=} gbk_flag + */ + function GB18030Encoder(options, gbk_flag) { + var fatal = options.fatal; + // gb18030's decoder has an associated gbk flag (initially unset). + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. If code point is U+E5E5, return error with code point. + if (code_point === 0xE5E5) + return encoderError(code_point); + + // 4. If the gbk flag is set and code point is U+20AC, return + // byte 0x80. + if (gbk_flag && code_point === 0x20AC) + return 0x80; + + // 5. Let pointer be the index pointer for code point in index + // gb18030. + var pointer = indexPointerFor(code_point, index('gb18030')); + + // 6. If pointer is not null, run these substeps: + if (pointer !== null) { + + // 1. Let lead be floor(pointer / 190) + 0x81. + var lead = floor(pointer / 190) + 0x81; + + // 2. Let trail be pointer % 190. + var trail = pointer % 190; + + // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise. + var offset = trail < 0x3F ? 0x40 : 0x41; + + // 4. Return two bytes whose values are lead and trail + offset. + return [lead, trail + offset]; + } + + // 7. If gbk flag is set, return error with code point. + if (gbk_flag) + return encoderError(code_point); + + // 8. Set pointer to the index gb18030 ranges pointer for code + // point. + pointer = indexGB18030RangesPointerFor(code_point); + + // 9. Let byte1 be floor(pointer / 10 / 126 / 10). + var byte1 = floor(pointer / 10 / 126 / 10); + + // 10. Set pointer to pointer − byte1 × 10 × 126 × 10. + pointer = pointer - byte1 * 10 * 126 * 10; + + // 11. Let byte2 be floor(pointer / 10 / 126). + var byte2 = floor(pointer / 10 / 126); + + // 12. Set pointer to pointer − byte2 × 10 × 126. + pointer = pointer - byte2 * 10 * 126; + + // 13. Let byte3 be floor(pointer / 10). + var byte3 = floor(pointer / 10); + + // 14. Let byte4 be pointer − byte3 × 10. + var byte4 = pointer - byte3 * 10; + + // 15. Return four bytes whose values are byte1 + 0x81, byte2 + + // 0x30, byte3 + 0x81, byte4 + 0x30. + return [byte1 + 0x81, + byte2 + 0x30, + byte3 + 0x81, + byte4 + 0x30]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['gb18030'] = function(options) { + return new GB18030Encoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['gb18030'] = function(options) { + return new GB18030Decoder(options); + }; + + + // + // 12. Legacy multi-byte Chinese (traditional) encodings + // + + // 12.1 Big5 + + // 12.1.1 Big5 decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function Big5Decoder(options) { + var fatal = options.fatal; + // Big5's decoder has an associated Big5 lead (initially 0x00). + var /** @type {number} */ Big5_lead = 0x00; + + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and Big5 lead is not 0x00, set + // Big5 lead to 0x00 and return error. + if (bite === end_of_stream && Big5_lead !== 0x00) { + Big5_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and Big5 lead is 0x00, return + // finished. + if (bite === end_of_stream && Big5_lead === 0x00) + return finished; + + // 3. If Big5 lead is not 0x00, let lead be Big5 lead, let + // pointer be null, set Big5 lead to 0x00, and then run these + // substeps: + if (Big5_lead !== 0x00) { + var lead = Big5_lead; + var pointer = null; + Big5_lead = 0x00; + + // 1. Let offset be 0x40 if byte is less than 0x7F and 0x62 + // otherwise. + var offset = bite < 0x7F ? 0x40 : 0x62; + + // 2. If byte is in the range 0x40 to 0x7E, inclusive, or 0xA1 + // to 0xFE, inclusive, set pointer to (lead − 0x81) × 157 + + // (byte − offset). + if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE)) + pointer = (lead - 0x81) * 157 + (bite - offset); + + // 3. If there is a row in the table below whose first column + // is pointer, return the two code points listed in its second + // column + // Pointer | Code points + // --------+-------------- + // 1133 | U+00CA U+0304 + // 1135 | U+00CA U+030C + // 1164 | U+00EA U+0304 + // 1166 | U+00EA U+030C + switch (pointer) { + case 1133: return [0x00CA, 0x0304]; + case 1135: return [0x00CA, 0x030C]; + case 1164: return [0x00EA, 0x0304]; + case 1166: return [0x00EA, 0x030C]; + } + + // 4. Let code point be null if pointer is null and the index + // code point for pointer in index Big5 otherwise. + var code_point = (pointer === null) ? null : + indexCodePointFor(pointer, index('big5')); + + // 5. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (code_point === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 6. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 7. Return a code point whose value is code point. + return code_point; + } + + // 4. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 5. If byte is in the range 0x81 to 0xFE, inclusive, set Big5 + // lead to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + Big5_lead = bite; + return null; + } + + // 6. Return error. + return decoderError(fatal); + }; + } + + // 12.1.2 Big5 encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function Big5Encoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Let pointer be the index Big5 pointer for code point. + var pointer = indexBig5PointerFor(code_point); + + // 4. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 5. Let lead be floor(pointer / 157) + 0x81. + var lead = floor(pointer / 157) + 0x81; + + // 6. If lead is less than 0xA1, return error with code point. + if (lead < 0xA1) + return encoderError(code_point); + + // 7. Let trail be pointer % 157. + var trail = pointer % 157; + + // 8. Let offset be 0x40 if trail is less than 0x3F and 0x62 + // otherwise. + var offset = trail < 0x3F ? 0x40 : 0x62; + + // Return two bytes whose values are lead and trail + offset. + return [lead, trail + offset]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['Big5'] = function(options) { + return new Big5Encoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['Big5'] = function(options) { + return new Big5Decoder(options); + }; + + + // + // 13. Legacy multi-byte Japanese encodings + // + + // 13.1 euc-jp + + // 13.1.1 euc-jp decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function EUCJPDecoder(options) { + var fatal = options.fatal; + + // euc-jp's decoder has an associated euc-jp jis0212 flag + // (initially unset) and euc-jp lead (initially 0x00). + var /** @type {boolean} */ eucjp_jis0212_flag = false, + /** @type {number} */ eucjp_lead = 0x00; + + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and euc-jp lead is not 0x00, set + // euc-jp lead to 0x00, and return error. + if (bite === end_of_stream && eucjp_lead !== 0x00) { + eucjp_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and euc-jp lead is 0x00, return + // finished. + if (bite === end_of_stream && eucjp_lead === 0x00) + return finished; + + // 3. If euc-jp lead is 0x8E and byte is in the range 0xA1 to + // 0xDF, inclusive, set euc-jp lead to 0x00 and return a code + // point whose value is 0xFF61 − 0xA1 + byte. + if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) { + eucjp_lead = 0x00; + return 0xFF61 - 0xA1 + bite; + } + + // 4. If euc-jp lead is 0x8F and byte is in the range 0xA1 to + // 0xFE, inclusive, set the euc-jp jis0212 flag, set euc-jp lead + // to byte, and return continue. + if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) { + eucjp_jis0212_flag = true; + eucjp_lead = bite; + return null; + } + + // 5. If euc-jp lead is not 0x00, let lead be euc-jp lead, set + // euc-jp lead to 0x00, and run these substeps: + if (eucjp_lead !== 0x00) { + var lead = eucjp_lead; + eucjp_lead = 0x00; + + // 1. Let code point be null. + var code_point = null; + + // 2. If lead and byte are both in the range 0xA1 to 0xFE, + // inclusive, set code point to the index code point for (lead + // − 0xA1) × 94 + byte − 0xA1 in index jis0208 if the euc-jp + // jis0212 flag is unset and in index jis0212 otherwise. + if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) { + code_point = indexCodePointFor( + (lead - 0xA1) * 94 + (bite - 0xA1), + index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212')); + } + + // 3. Unset the euc-jp jis0212 flag. + eucjp_jis0212_flag = false; + + // 4. If byte is not in the range 0xA1 to 0xFE, inclusive, + // prepend byte to stream. + if (!inRange(bite, 0xA1, 0xFE)) + stream.prepend(bite); + + // 5. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 6. Return a code point whose value is code point. + return code_point; + } + + // 6. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 7. If byte is 0x8E, 0x8F, or in the range 0xA1 to 0xFE, + // inclusive, set euc-jp lead to byte and return continue. + if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) { + eucjp_lead = bite; + return null; + } + + // 8. Return error. + return decoderError(fatal); + }; + } + + // 13.1.2 euc-jp encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function EUCJPEncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. If code point is U+00A5, return byte 0x5C. + if (code_point === 0x00A5) + return 0x5C; + + // 4. If code point is U+203E, return byte 0x7E. + if (code_point === 0x203E) + return 0x7E; + + // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, + // return two bytes whose values are 0x8E and code point − + // 0xFF61 + 0xA1. + if (inRange(code_point, 0xFF61, 0xFF9F)) + return [0x8E, code_point - 0xFF61 + 0xA1]; + + // 6. If code point is U+2212, set it to U+FF0D. + if (code_point === 0x2212) + code_point = 0xFF0D; + + // 7. Let pointer be the index pointer for code point in index + // jis0208. + var pointer = indexPointerFor(code_point, index('jis0208')); + + // 8. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 9. Let lead be floor(pointer / 94) + 0xA1. + var lead = floor(pointer / 94) + 0xA1; + + // 10. Let trail be pointer % 94 + 0xA1. + var trail = pointer % 94 + 0xA1; + + // 11. Return two bytes whose values are lead and trail. + return [lead, trail]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['EUC-JP'] = function(options) { + return new EUCJPEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['EUC-JP'] = function(options) { + return new EUCJPDecoder(options); + }; + + // 13.2 iso-2022-jp + + // 13.2.1 iso-2022-jp decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function ISO2022JPDecoder(options) { + var fatal = options.fatal; + /** @enum */ + var states = { + ASCII: 0, + Roman: 1, + Katakana: 2, + LeadByte: 3, + TrailByte: 4, + EscapeStart: 5, + Escape: 6 + }; + // iso-2022-jp's decoder has an associated iso-2022-jp decoder + // state (initially ASCII), iso-2022-jp decoder output state + // (initially ASCII), iso-2022-jp lead (initially 0x00), and + // iso-2022-jp output flag (initially unset). + var /** @type {number} */ iso2022jp_decoder_state = states.ASCII, + /** @type {number} */ iso2022jp_decoder_output_state = states.ASCII, + /** @type {number} */ iso2022jp_lead = 0x00, + /** @type {boolean} */ iso2022jp_output_flag = false; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // switching on iso-2022-jp decoder state: + switch (iso2022jp_decoder_state) { + default: + case states.ASCII: + // ASCII + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x00 to 0x7F, excluding 0x0E, 0x0F, and 0x1B + if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E + && bite !== 0x0F && bite !== 0x1B) { + // Unset the iso-2022-jp output flag and return a code point + // whose value is byte. + iso2022jp_output_flag = false; + return bite; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.Roman: + // Roman + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x5C + if (bite === 0x5C) { + // Unset the iso-2022-jp output flag and return code point + // U+00A5. + iso2022jp_output_flag = false; + return 0x00A5; + } + + // 0x7E + if (bite === 0x7E) { + // Unset the iso-2022-jp output flag and return code point + // U+203E. + iso2022jp_output_flag = false; + return 0x203E; + } + + // 0x00 to 0x7F, excluding 0x0E, 0x0F, 0x1B, 0x5C, and 0x7E + if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F + && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) { + // Unset the iso-2022-jp output flag and return a code point + // whose value is byte. + iso2022jp_output_flag = false; + return bite; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.Katakana: + // Katakana + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x21 to 0x5F + if (inRange(bite, 0x21, 0x5F)) { + // Unset the iso-2022-jp output flag and return a code point + // whose value is 0xFF61 − 0x21 + byte. + iso2022jp_output_flag = false; + return 0xFF61 - 0x21 + bite; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.LeadByte: + // Lead byte + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return null; + } + + // 0x21 to 0x7E + if (inRange(bite, 0x21, 0x7E)) { + // Unset the iso-2022-jp output flag, set iso-2022-jp lead + // to byte, iso-2022-jp decoder state to trail byte, and + // return continue. + iso2022jp_output_flag = false; + iso2022jp_lead = bite; + iso2022jp_decoder_state = states.TrailByte; + return null; + } + + // end-of-stream + if (bite === end_of_stream) { + // Return finished. + return finished; + } + + // Otherwise + // Unset the iso-2022-jp output flag and return error. + iso2022jp_output_flag = false; + return decoderError(fatal); + + case states.TrailByte: + // Trail byte + // Based on byte: + + // 0x1B + if (bite === 0x1B) { + // Set iso-2022-jp decoder state to escape start and return + // continue. + iso2022jp_decoder_state = states.EscapeStart; + return decoderError(fatal); + } + + // 0x21 to 0x7E + if (inRange(bite, 0x21, 0x7E)) { + // 1. Set the iso-2022-jp decoder state to lead byte. + iso2022jp_decoder_state = states.LeadByte; + + // 2. Let pointer be (iso-2022-jp lead − 0x21) × 94 + byte − 0x21. + var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21; + + // 3. Let code point be the index code point for pointer in + // index jis0208. + var code_point = indexCodePointFor(pointer, index('jis0208')); + + // 4. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 5. Return a code point whose value is code point. + return code_point; + } + + // end-of-stream + if (bite === end_of_stream) { + // Set the iso-2022-jp decoder state to lead byte, prepend + // byte to stream, and return error. + iso2022jp_decoder_state = states.LeadByte; + stream.prepend(bite); + return decoderError(fatal); + } + + // Otherwise + // Set iso-2022-jp decoder state to lead byte and return + // error. + iso2022jp_decoder_state = states.LeadByte; + return decoderError(fatal); + + case states.EscapeStart: + // Escape start + + // 1. If byte is either 0x24 or 0x28, set iso-2022-jp lead to + // byte, iso-2022-jp decoder state to escape, and return + // continue. + if (bite === 0x24 || bite === 0x28) { + iso2022jp_lead = bite; + iso2022jp_decoder_state = states.Escape; + return null; + } + + // 2. Prepend byte to stream. + stream.prepend(bite); + + // 3. Unset the iso-2022-jp output flag, set iso-2022-jp + // decoder state to iso-2022-jp decoder output state, and + // return error. + iso2022jp_output_flag = false; + iso2022jp_decoder_state = iso2022jp_decoder_output_state; + return decoderError(fatal); + + case states.Escape: + // Escape + + // 1. Let lead be iso-2022-jp lead and set iso-2022-jp lead to + // 0x00. + var lead = iso2022jp_lead; + iso2022jp_lead = 0x00; + + // 2. Let state be null. + var state = null; + + // 3. If lead is 0x28 and byte is 0x42, set state to ASCII. + if (lead === 0x28 && bite === 0x42) + state = states.ASCII; + + // 4. If lead is 0x28 and byte is 0x4A, set state to Roman. + if (lead === 0x28 && bite === 0x4A) + state = states.Roman; + + // 5. If lead is 0x28 and byte is 0x49, set state to Katakana. + if (lead === 0x28 && bite === 0x49) + state = states.Katakana; + + // 6. If lead is 0x24 and byte is either 0x40 or 0x42, set + // state to lead byte. + if (lead === 0x24 && (bite === 0x40 || bite === 0x42)) + state = states.LeadByte; + + // 7. If state is non-null, run these substeps: + if (state !== null) { + // 1. Set iso-2022-jp decoder state and iso-2022-jp decoder + // output state to states. + iso2022jp_decoder_state = iso2022jp_decoder_state = state; + + // 2. Let output flag be the iso-2022-jp output flag. + var output_flag = iso2022jp_output_flag; + + // 3. Set the iso-2022-jp output flag. + iso2022jp_output_flag = true; + + // 4. Return continue, if output flag is unset, and error + // otherwise. + return !output_flag ? null : decoderError(fatal); + } + + // 8. Prepend lead and byte to stream. + stream.prepend([lead, bite]); + + // 9. Unset the iso-2022-jp output flag, set iso-2022-jp + // decoder state to iso-2022-jp decoder output state and + // return error. + iso2022jp_output_flag = false; + iso2022jp_decoder_state = iso2022jp_decoder_output_state; + return decoderError(fatal); + } + }; + } + + // 13.2.2 iso-2022-jp encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function ISO2022JPEncoder(options) { + var fatal = options.fatal; + // iso-2022-jp's encoder has an associated iso-2022-jp encoder + // state which is one of ASCII, Roman, and jis0208 (initially + // ASCII). + /** @enum */ + var states = { + ASCII: 0, + Roman: 1, + jis0208: 2 + }; + var /** @type {number} */ iso2022jp_state = states.ASCII; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream and iso-2022-jp encoder + // state is not ASCII, prepend code point to stream, set + // iso-2022-jp encoder state to ASCII, and return three bytes + // 0x1B 0x28 0x42. + if (code_point === end_of_stream && + iso2022jp_state !== states.ASCII) { + stream.prepend(code_point); + iso2022jp_state = states.ASCII; + return [0x1B, 0x28, 0x42]; + } + + // 2. If code point is end-of-stream and iso-2022-jp encoder + // state is ASCII, return finished. + if (code_point === end_of_stream && iso2022jp_state === states.ASCII) + return finished; + + // 3. If ISO-2022-JP encoder state is ASCII or Roman, and code + // point is U+000E, U+000F, or U+001B, return error with U+FFFD. + if ((iso2022jp_state === states.ASCII || + iso2022jp_state === states.Roman) && + (code_point === 0x000E || code_point === 0x000F || + code_point === 0x001B)) { + return encoderError(0xFFFD); + } + + // 4. If iso-2022-jp encoder state is ASCII and code point is an + // ASCII code point, return a byte whose value is code point. + if (iso2022jp_state === states.ASCII && + isASCIICodePoint(code_point)) + return code_point; + + // 5. If iso-2022-jp encoder state is Roman and code point is an + // ASCII code point, excluding U+005C and U+007E, or is U+00A5 + // or U+203E, run these substeps: + if (iso2022jp_state === states.Roman && + ((isASCIICodePoint(code_point) && + code_point !== 0x005C && code_point !== 0x007E) || + (code_point == 0x00A5 || code_point == 0x203E))) { + + // 1. If code point is an ASCII code point, return a byte + // whose value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 2. If code point is U+00A5, return byte 0x5C. + if (code_point === 0x00A5) + return 0x5C; + + // 3. If code point is U+203E, return byte 0x7E. + if (code_point === 0x203E) + return 0x7E; + } + + // 6. If code point is an ASCII code point, and iso-2022-jp + // encoder state is not ASCII, prepend code point to stream, set + // iso-2022-jp encoder state to ASCII, and return three bytes + // 0x1B 0x28 0x42. + if (isASCIICodePoint(code_point) && + iso2022jp_state !== states.ASCII) { + stream.prepend(code_point); + iso2022jp_state = states.ASCII; + return [0x1B, 0x28, 0x42]; + } + + // 7. If code point is either U+00A5 or U+203E, and iso-2022-jp + // encoder state is not Roman, prepend code point to stream, set + // iso-2022-jp encoder state to Roman, and return three bytes + // 0x1B 0x28 0x4A. + if ((code_point === 0x00A5 || code_point === 0x203E) && + iso2022jp_state !== states.Roman) { + stream.prepend(code_point); + iso2022jp_state = states.Roman; + return [0x1B, 0x28, 0x4A]; + } + + // 8. If code point is U+2212, set it to U+FF0D. + if (code_point === 0x2212) + code_point = 0xFF0D; + + // 9. Let pointer be the index pointer for code point in index + // jis0208. + var pointer = indexPointerFor(code_point, index('jis0208')); + + // 10. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 11. If iso-2022-jp encoder state is not jis0208, prepend code + // point to stream, set iso-2022-jp encoder state to jis0208, + // and return three bytes 0x1B 0x24 0x42. + if (iso2022jp_state !== states.jis0208) { + stream.prepend(code_point); + iso2022jp_state = states.jis0208; + return [0x1B, 0x24, 0x42]; + } + + // 12. Let lead be floor(pointer / 94) + 0x21. + var lead = floor(pointer / 94) + 0x21; + + // 13. Let trail be pointer % 94 + 0x21. + var trail = pointer % 94 + 0x21; + + // 14. Return two bytes whose values are lead and trail. + return [lead, trail]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['ISO-2022-JP'] = function(options) { + return new ISO2022JPEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['ISO-2022-JP'] = function(options) { + return new ISO2022JPDecoder(options); + }; + + // 13.3 Shift_JIS + + // 13.3.1 Shift_JIS decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function ShiftJISDecoder(options) { + var fatal = options.fatal; + // Shift_JIS's decoder has an associated Shift_JIS lead (initially + // 0x00). + var /** @type {number} */ Shift_JIS_lead = 0x00; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and Shift_JIS lead is not 0x00, + // set Shift_JIS lead to 0x00 and return error. + if (bite === end_of_stream && Shift_JIS_lead !== 0x00) { + Shift_JIS_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and Shift_JIS lead is 0x00, + // return finished. + if (bite === end_of_stream && Shift_JIS_lead === 0x00) + return finished; + + // 3. If Shift_JIS lead is not 0x00, let lead be Shift_JIS lead, + // let pointer be null, set Shift_JIS lead to 0x00, and then run + // these substeps: + if (Shift_JIS_lead !== 0x00) { + var lead = Shift_JIS_lead; + var pointer = null; + Shift_JIS_lead = 0x00; + + // 1. Let offset be 0x40, if byte is less than 0x7F, and 0x41 + // otherwise. + var offset = (bite < 0x7F) ? 0x40 : 0x41; + + // 2. Let lead offset be 0x81, if lead is less than 0xA0, and + // 0xC1 otherwise. + var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1; + + // 3. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 + // to 0xFC, inclusive, set pointer to (lead − lead offset) × + // 188 + byte − offset. + if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC)) + pointer = (lead - lead_offset) * 188 + bite - offset; + + // 4. If pointer is in the range 8836 to 10715, inclusive, + // return a code point whose value is 0xE000 − 8836 + pointer. + if (inRange(pointer, 8836, 10715)) + return 0xE000 - 8836 + pointer; + + // 5. Let code point be null, if pointer is null, and the + // index code point for pointer in index jis0208 otherwise. + var code_point = (pointer === null) ? null : + indexCodePointFor(pointer, index('jis0208')); + + // 6. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (code_point === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 7. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 8. Return a code point whose value is code point. + return code_point; + } + + // 4. If byte is an ASCII byte or 0x80, return a code point + // whose value is byte. + if (isASCIIByte(bite) || bite === 0x80) + return bite; + + // 5. If byte is in the range 0xA1 to 0xDF, inclusive, return a + // code point whose value is 0xFF61 − 0xA1 + byte. + if (inRange(bite, 0xA1, 0xDF)) + return 0xFF61 - 0xA1 + bite; + + // 6. If byte is in the range 0x81 to 0x9F, inclusive, or 0xE0 + // to 0xFC, inclusive, set Shift_JIS lead to byte and return + // continue. + if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) { + Shift_JIS_lead = bite; + return null; + } + + // 7. Return error. + return decoderError(fatal); + }; + } + + // 13.3.2 Shift_JIS encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function ShiftJISEncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point or U+0080, return a + // byte whose value is code point. + if (isASCIICodePoint(code_point) || code_point === 0x0080) + return code_point; + + // 3. If code point is U+00A5, return byte 0x5C. + if (code_point === 0x00A5) + return 0x5C; + + // 4. If code point is U+203E, return byte 0x7E. + if (code_point === 0x203E) + return 0x7E; + + // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, + // return a byte whose value is code point − 0xFF61 + 0xA1. + if (inRange(code_point, 0xFF61, 0xFF9F)) + return code_point - 0xFF61 + 0xA1; + + // 6. If code point is U+2212, set it to U+FF0D. + if (code_point === 0x2212) + code_point = 0xFF0D; + + // 7. Let pointer be the index Shift_JIS pointer for code point. + var pointer = indexShiftJISPointerFor(code_point); + + // 8. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 9. Let lead be floor(pointer / 188). + var lead = floor(pointer / 188); + + // 10. Let lead offset be 0x81, if lead is less than 0x1F, and + // 0xC1 otherwise. + var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1; + + // 11. Let trail be pointer % 188. + var trail = pointer % 188; + + // 12. Let offset be 0x40, if trail is less than 0x3F, and 0x41 + // otherwise. + var offset = (trail < 0x3F) ? 0x40 : 0x41; + + // 13. Return two bytes whose values are lead + lead offset and + // trail + offset. + return [lead + lead_offset, trail + offset]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['Shift_JIS'] = function(options) { + return new ShiftJISEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['Shift_JIS'] = function(options) { + return new ShiftJISDecoder(options); + }; + + // + // 14. Legacy multi-byte Korean encodings + // + + // 14.1 euc-kr + + // 14.1.1 euc-kr decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function EUCKRDecoder(options) { + var fatal = options.fatal; + + // euc-kr's decoder has an associated euc-kr lead (initially 0x00). + var /** @type {number} */ euckr_lead = 0x00; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and euc-kr lead is not 0x00, set + // euc-kr lead to 0x00 and return error. + if (bite === end_of_stream && euckr_lead !== 0) { + euckr_lead = 0x00; + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and euc-kr lead is 0x00, return + // finished. + if (bite === end_of_stream && euckr_lead === 0) + return finished; + + // 3. If euc-kr lead is not 0x00, let lead be euc-kr lead, let + // pointer be null, set euc-kr lead to 0x00, and then run these + // substeps: + if (euckr_lead !== 0x00) { + var lead = euckr_lead; + var pointer = null; + euckr_lead = 0x00; + + // 1. If byte is in the range 0x41 to 0xFE, inclusive, set + // pointer to (lead − 0x81) × 190 + (byte − 0x41). + if (inRange(bite, 0x41, 0xFE)) + pointer = (lead - 0x81) * 190 + (bite - 0x41); + + // 2. Let code point be null, if pointer is null, and the + // index code point for pointer in index euc-kr otherwise. + var code_point = (pointer === null) + ? null : indexCodePointFor(pointer, index('euc-kr')); + + // 3. If code point is null and byte is an ASCII byte, prepend + // byte to stream. + if (pointer === null && isASCIIByte(bite)) + stream.prepend(bite); + + // 4. If code point is null, return error. + if (code_point === null) + return decoderError(fatal); + + // 5. Return a code point whose value is code point. + return code_point; + } + + // 4. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 5. If byte is in the range 0x81 to 0xFE, inclusive, set + // euc-kr lead to byte and return continue. + if (inRange(bite, 0x81, 0xFE)) { + euckr_lead = bite; + return null; + } + + // 6. Return error. + return decoderError(fatal); + }; + } + + // 14.1.2 euc-kr encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function EUCKREncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. Let pointer be the index pointer for code point in index + // euc-kr. + var pointer = indexPointerFor(code_point, index('euc-kr')); + + // 4. If pointer is null, return error with code point. + if (pointer === null) + return encoderError(code_point); + + // 5. Let lead be floor(pointer / 190) + 0x81. + var lead = floor(pointer / 190) + 0x81; + + // 6. Let trail be pointer % 190 + 0x41. + var trail = (pointer % 190) + 0x41; + + // 7. Return two bytes whose values are lead and trail. + return [lead, trail]; + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['EUC-KR'] = function(options) { + return new EUCKREncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['EUC-KR'] = function(options) { + return new EUCKRDecoder(options); + }; + + + // + // 15. Legacy miscellaneous encodings + // + + // 15.1 replacement + + // Not needed - API throws RangeError + + // 15.2 Common infrastructure for utf-16be and utf-16le + + /** + * @param {number} code_unit + * @param {boolean} utf16be + * @return {!Array.} bytes + */ + function convertCodeUnitToBytes(code_unit, utf16be) { + // 1. Let byte1 be code unit >> 8. + var byte1 = code_unit >> 8; + + // 2. Let byte2 be code unit & 0x00FF. + var byte2 = code_unit & 0x00FF; + + // 3. Then return the bytes in order: + // utf-16be flag is set: byte1, then byte2. + if (utf16be) + return [byte1, byte2]; + // utf-16be flag is unset: byte2, then byte1. + return [byte2, byte1]; + } + + // 15.2.1 shared utf-16 decoder + /** + * @constructor + * @implements {Decoder} + * @param {boolean} utf16_be True if big-endian, false if little-endian. + * @param {{fatal: boolean}} options + */ + function UTF16Decoder(utf16_be, options) { + var fatal = options.fatal; + var /** @type {?number} */ utf16_lead_byte = null, + /** @type {?number} */ utf16_lead_surrogate = null; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream and either utf-16 lead byte or + // utf-16 lead surrogate is not null, set utf-16 lead byte and + // utf-16 lead surrogate to null, and return error. + if (bite === end_of_stream && (utf16_lead_byte !== null || + utf16_lead_surrogate !== null)) { + return decoderError(fatal); + } + + // 2. If byte is end-of-stream and utf-16 lead byte and utf-16 + // lead surrogate are null, return finished. + if (bite === end_of_stream && utf16_lead_byte === null && + utf16_lead_surrogate === null) { + return finished; + } + + // 3. If utf-16 lead byte is null, set utf-16 lead byte to byte + // and return continue. + if (utf16_lead_byte === null) { + utf16_lead_byte = bite; + return null; + } + + // 4. Let code unit be the result of: + var code_unit; + if (utf16_be) { + // utf-16be decoder flag is set + // (utf-16 lead byte << 8) + byte. + code_unit = (utf16_lead_byte << 8) + bite; + } else { + // utf-16be decoder flag is unset + // (byte << 8) + utf-16 lead byte. + code_unit = (bite << 8) + utf16_lead_byte; + } + // Then set utf-16 lead byte to null. + utf16_lead_byte = null; + + // 5. If utf-16 lead surrogate is not null, let lead surrogate + // be utf-16 lead surrogate, set utf-16 lead surrogate to null, + // and then run these substeps: + if (utf16_lead_surrogate !== null) { + var lead_surrogate = utf16_lead_surrogate; + utf16_lead_surrogate = null; + + // 1. If code unit is in the range U+DC00 to U+DFFF, + // inclusive, return a code point whose value is 0x10000 + + // ((lead surrogate − 0xD800) << 10) + (code unit − 0xDC00). + if (inRange(code_unit, 0xDC00, 0xDFFF)) { + return 0x10000 + (lead_surrogate - 0xD800) * 0x400 + + (code_unit - 0xDC00); + } + + // 2. Prepend the sequence resulting of converting code unit + // to bytes using utf-16be decoder flag to stream and return + // error. + stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be)); + return decoderError(fatal); + } + + // 6. If code unit is in the range U+D800 to U+DBFF, inclusive, + // set utf-16 lead surrogate to code unit and return continue. + if (inRange(code_unit, 0xD800, 0xDBFF)) { + utf16_lead_surrogate = code_unit; + return null; + } + + // 7. If code unit is in the range U+DC00 to U+DFFF, inclusive, + // return error. + if (inRange(code_unit, 0xDC00, 0xDFFF)) + return decoderError(fatal); + + // 8. Return code point code unit. + return code_unit; + }; + } + + // 15.2.2 shared utf-16 encoder + /** + * @constructor + * @implements {Encoder} + * @param {boolean} utf16_be True if big-endian, false if little-endian. + * @param {{fatal: boolean}} options + */ + function UTF16Encoder(utf16_be, options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1. If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is in the range U+0000 to U+FFFF, inclusive, + // return the sequence resulting of converting code point to + // bytes using utf-16be encoder flag. + if (inRange(code_point, 0x0000, 0xFFFF)) + return convertCodeUnitToBytes(code_point, utf16_be); + + // 3. Let lead be ((code point − 0x10000) >> 10) + 0xD800, + // converted to bytes using utf-16be encoder flag. + var lead = convertCodeUnitToBytes( + ((code_point - 0x10000) >> 10) + 0xD800, utf16_be); + + // 4. Let trail be ((code point − 0x10000) & 0x3FF) + 0xDC00, + // converted to bytes using utf-16be encoder flag. + var trail = convertCodeUnitToBytes( + ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be); + + // 5. Return a byte sequence of lead followed by trail. + return lead.concat(trail); + }; + } + + // 15.3 utf-16be + // 15.3.1 utf-16be decoder + /** @param {{fatal: boolean}} options */ + encoders['UTF-16BE'] = function(options) { + return new UTF16Encoder(true, options); + }; + // 15.3.2 utf-16be encoder + /** @param {{fatal: boolean}} options */ + decoders['UTF-16BE'] = function(options) { + return new UTF16Decoder(true, options); + }; + + // 15.4 utf-16le + // 15.4.1 utf-16le decoder + /** @param {{fatal: boolean}} options */ + encoders['UTF-16LE'] = function(options) { + return new UTF16Encoder(false, options); + }; + // 15.4.2 utf-16le encoder + /** @param {{fatal: boolean}} options */ + decoders['UTF-16LE'] = function(options) { + return new UTF16Decoder(false, options); + }; + + // 15.5 x-user-defined + + // 15.5.1 x-user-defined decoder + /** + * @constructor + * @implements {Decoder} + * @param {{fatal: boolean}} options + */ + function XUserDefinedDecoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream The stream of bytes being decoded. + * @param {number} bite The next byte read from the stream. + * @return {?(number|!Array.)} The next code point(s) + * decoded, or null if not enough data exists in the input + * stream to decode a complete code point. + */ + this.handler = function(stream, bite) { + // 1. If byte is end-of-stream, return finished. + if (bite === end_of_stream) + return finished; + + // 2. If byte is an ASCII byte, return a code point whose value + // is byte. + if (isASCIIByte(bite)) + return bite; + + // 3. Return a code point whose value is 0xF780 + byte − 0x80. + return 0xF780 + bite - 0x80; + }; + } + + // 15.5.2 x-user-defined encoder + /** + * @constructor + * @implements {Encoder} + * @param {{fatal: boolean}} options + */ + function XUserDefinedEncoder(options) { + var fatal = options.fatal; + /** + * @param {Stream} stream Input stream. + * @param {number} code_point Next code point read from the stream. + * @return {(number|!Array.)} Byte(s) to emit. + */ + this.handler = function(stream, code_point) { + // 1.If code point is end-of-stream, return finished. + if (code_point === end_of_stream) + return finished; + + // 2. If code point is an ASCII code point, return a byte whose + // value is code point. + if (isASCIICodePoint(code_point)) + return code_point; + + // 3. If code point is in the range U+F780 to U+F7FF, inclusive, + // return a byte whose value is code point − 0xF780 + 0x80. + if (inRange(code_point, 0xF780, 0xF7FF)) + return code_point - 0xF780 + 0x80; + + // 4. Return error with code point. + return encoderError(code_point); + }; + } + + /** @param {{fatal: boolean}} options */ + encoders['x-user-defined'] = function(options) { + return new XUserDefinedEncoder(options); + }; + /** @param {{fatal: boolean}} options */ + decoders['x-user-defined'] = function(options) { + return new XUserDefinedDecoder(options); + }; + + if (!global['TextEncoder']) + global['TextEncoder'] = TextEncoder; + if (!global['TextDecoder']) + global['TextDecoder'] = TextDecoder; + + if (typeof module !== "undefined" && module.exports) { + module.exports = { + TextEncoder: global['TextEncoder'], + TextDecoder: global['TextDecoder'], + EncodingIndexes: global["encoding-indexes"] + }; + } + + // For strict environments where `this` inside the global scope + // is `undefined`, take a pure object instead + }(this || {})); + },{"./encoding-indexes.js":35}]},{},[12])(12) + }); + }); + + var arrayProto$c = lib.prototypes.array; + + + + + + + + + + + + + var valueToString$9 = lib.valueToString; + var fakeServer = nise.fakeServer; + var fakeXhr = nise.fakeXhr; + + + var filter$3 = arrayProto$c.filter; + var forEach$9 = arrayProto$c.filter; + var push$6 = arrayProto$c.push; + var reverse$1 = arrayProto$c.reverse; + + function applyOnEach(fakes, method) { + var matchingFakes = filter$3(fakes, function(fake) { + return typeof fake[method] === "function"; + }); + + forEach$9(matchingFakes, function(fake) { + fake[method](); + }); + } + + function Sandbox() { + var sandbox = this; + var collection = []; + var fakeRestorers = []; + var promiseLib; + + sandbox.serverPrototype = fakeServer; + + // this is for testing only + sandbox.getFakes = function getFakes() { + return collection; + }; + + // this is for testing only + sandbox.getRestorers = function() { + return fakeRestorers; + }; + + sandbox.createStubInstance = function createStubInstance(constructor) { + if (typeof constructor !== "function") { + throw new TypeError("The constructor should be a function."); + } + return this.stub(Object.create(constructor.prototype)); + }; + + sandbox.inject = function inject(obj) { + obj.spy = function() { + return sandbox.spy.apply(null, arguments); + }; + + obj.stub = function() { + return sandbox.stub.apply(null, arguments); + }; + + obj.mock = function() { + return sandbox.mock.apply(null, arguments); + }; + + if (sandbox.clock) { + obj.clock = sandbox.clock; + } + + if (sandbox.server) { + obj.server = sandbox.server; + obj.requests = sandbox.server.requests; + } + + obj.match = match_1$1; + + return obj; + }; + + sandbox.mock = function mock() { + var m = mock_1.apply(null, arguments); + + push$6(collection, m); + usePromiseLibrary_1(promiseLib, m); + + return m; + }; + + sandbox.reset = function reset() { + applyOnEach(collection, "reset"); + applyOnEach(collection, "resetHistory"); + }; + + sandbox.resetBehavior = function resetBehavior() { + applyOnEach(collection, "resetBehavior"); + }; + + sandbox.resetHistory = function resetHistory() { + function privateResetHistory(f) { + var method = f.resetHistory || f.reset; + if (method) { + method.call(f); + } + } + + forEach$9(collection, function(fake) { + if (typeof fake === "function") { + privateResetHistory(fake); + return; + } + + var methods = []; + if (fake.get) { + push$6(methods, fake.get); + } + + if (fake.set) { + push$6(methods, fake.set); + } + + forEach$9(methods, privateResetHistory); + }); + }; + + sandbox.restore = function restore() { + if (arguments.length) { + throw new Error("sandbox.restore() does not take any parameters. Perhaps you meant stub.restore()"); + } + + reverse$1(collection); + applyOnEach(collection, "restore"); + collection = []; + + forEach$9(fakeRestorers, function(restorer) { + restorer(); + }); + fakeRestorers = []; + + sandbox.restoreContext(); + }; + + sandbox.restoreContext = function restoreContext() { + var injectedKeys = sandbox.injectedKeys; + var injectInto = sandbox.injectInto; + + if (!injectedKeys) { + return; + } + + forEach$9(injectedKeys, function(injectedKey) { + delete injectInto[injectedKey]; + }); + + injectedKeys = []; + }; + + function getFakeRestorer(object, property) { + var descriptor = getPropertyDescriptor(object, property); + + function restorer() { + Object.defineProperty(object, property, descriptor); + } + restorer.object = object; + restorer.property = property; + return restorer; + } + + function verifyNotReplaced(object, property) { + forEach$9(fakeRestorers, function(fakeRestorer) { + if (fakeRestorer.object === object && fakeRestorer.property === property) { + throw new TypeError("Attempted to replace " + property + " which is already replaced"); + } + }); + } + + sandbox.replace = function replace(object, property, replacement) { + var descriptor = getPropertyDescriptor(object, property); + + if (typeof descriptor === "undefined") { + throw new TypeError("Cannot replace non-existent own property " + valueToString$9(property)); + } + + if (typeof replacement === "undefined") { + throw new TypeError("Expected replacement argument to be defined"); + } + + if (typeof descriptor.get === "function") { + throw new Error("Use sandbox.replaceGetter for replacing getters"); + } + + if (typeof descriptor.set === "function") { + throw new Error("Use sandbox.replaceSetter for replacing setters"); + } + + if (typeof object[property] !== typeof replacement) { + throw new TypeError("Cannot replace " + typeof object[property] + " with " + typeof replacement); + } + + verifyNotReplaced(object, property); + + // store a function for restoring the replaced property + push$6(fakeRestorers, getFakeRestorer(object, property)); + + object[property] = replacement; + + return replacement; + }; + + sandbox.replaceGetter = function replaceGetter(object, property, replacement) { + var descriptor = getPropertyDescriptor(object, property); + + if (typeof descriptor === "undefined") { + throw new TypeError("Cannot replace non-existent own property " + valueToString$9(property)); + } + + if (typeof replacement !== "function") { + throw new TypeError("Expected replacement argument to be a function"); + } + + if (typeof descriptor.get !== "function") { + throw new Error("`object.property` is not a getter"); + } + + verifyNotReplaced(object, property); + + // store a function for restoring the replaced property + push$6(fakeRestorers, getFakeRestorer(object, property)); + + Object.defineProperty(object, property, { + get: replacement, + configurable: isPropertyConfigurable_1(object, property) + }); + + return replacement; + }; + + sandbox.replaceSetter = function replaceSetter(object, property, replacement) { + var descriptor = getPropertyDescriptor(object, property); + + if (typeof descriptor === "undefined") { + throw new TypeError("Cannot replace non-existent own property " + valueToString$9(property)); + } + + if (typeof replacement !== "function") { + throw new TypeError("Expected replacement argument to be a function"); + } + + if (typeof descriptor.set !== "function") { + throw new Error("`object.property` is not a setter"); + } + + verifyNotReplaced(object, property); + + // store a function for restoring the replaced property + push$6(fakeRestorers, getFakeRestorer(object, property)); + + // eslint-disable-next-line accessor-pairs + Object.defineProperty(object, property, { + set: replacement, + configurable: isPropertyConfigurable_1(object, property) + }); + + return replacement; + }; + + sandbox.spy = function spy() { + var s = spy_1.apply(spy_1, arguments); + + push$6(collection, s); + + return s; + }; + + sandbox.stub = function stub(object, property) { + if (isEsModule(object)) { + throw new TypeError("ES Modules cannot be stubbed"); + } + + if (isNonExistentOwnProperty_1(object, property)) { + throw new TypeError("Cannot stub non-existent own property " + valueToString$9(property)); + } + + var stubbed = stub_1.apply(null, arguments); + var isStubbingEntireObject = typeof property === "undefined" && typeof object === "object"; + + if (isStubbingEntireObject) { + var ownMethods = collectOwnMethods_1(stubbed); + + forEach$9(ownMethods, function(method) { + push$6(collection, method); + }); + + usePromiseLibrary_1(promiseLib, ownMethods); + } else { + push$6(collection, stubbed); + usePromiseLibrary_1(promiseLib, stubbed); + } + + return stubbed; + }; + + // eslint-disable-next-line no-unused-vars + sandbox.fake = function fake(f) { + var s = fake_1.apply(fake_1, arguments); + + push$6(collection, s); + + return s; + }; + + forEach$9(Object.keys(fake_1), function(key) { + var fakeBehavior = fake_1[key]; + if (typeof fakeBehavior === "function") { + sandbox.fake[key] = function() { + var s = fakeBehavior.apply(fakeBehavior, arguments); + + push$6(collection, s); + + return s; + }; + } + }); + + sandbox.useFakeTimers = function useFakeTimers(args) { + var clock = fakeTimers.useFakeTimers.call(null, args); + + sandbox.clock = clock; + push$6(collection, clock); + + return clock; + }; + + sandbox.verify = function verify() { + applyOnEach(collection, "verify"); + }; + + sandbox.verifyAndRestore = function verifyAndRestore() { + var exception; + + try { + sandbox.verify(); + } catch (e) { + exception = e; + } + + sandbox.restore(); + + if (exception) { + throw exception; + } + }; + + sandbox.useFakeServer = function useFakeServer() { + var proto = sandbox.serverPrototype || fakeServer; + + if (!proto || !proto.create) { + return null; + } + + sandbox.server = proto.create(); + push$6(collection, sandbox.server); + + return sandbox.server; + }; + + sandbox.useFakeXMLHttpRequest = function useFakeXMLHttpRequest() { + var xhr = fakeXhr.useFakeXMLHttpRequest(); + push$6(collection, xhr); + return xhr; + }; + + sandbox.usingPromise = function usingPromise(promiseLibrary) { + promiseLib = promiseLibrary; + collection.promiseLibrary = promiseLibrary; + + return sandbox; + }; + } + + Sandbox.prototype.assert = assert_1; + Sandbox.prototype.match = match_1$1; + + var sandbox = Sandbox; + + var arrayProto$d = lib.prototypes.array; + + + var forEach$a = arrayProto$d.forEach; + var push$7 = arrayProto$d.push; + + function prepareSandboxFromConfig(config) { + var sandbox$$1 = new sandbox(); + + if (config.useFakeServer) { + if (typeof config.useFakeServer === "object") { + sandbox$$1.serverPrototype = config.useFakeServer; + } + + sandbox$$1.useFakeServer(); + } + + if (config.useFakeTimers) { + if (typeof config.useFakeTimers === "object") { + sandbox$$1.useFakeTimers(config.useFakeTimers); + } else { + sandbox$$1.useFakeTimers(); + } + } + + return sandbox$$1; + } + + function exposeValue(sandbox$$1, config, key, value) { + if (!value) { + return; + } + + if (config.injectInto && !(key in config.injectInto)) { + config.injectInto[key] = value; + push$7(sandbox$$1.injectedKeys, key); + } else { + push$7(sandbox$$1.args, value); + } + } + + function createSandbox(config) { + if (!config) { + return new sandbox(); + } + + var configuredSandbox = prepareSandboxFromConfig(config); + configuredSandbox.args = configuredSandbox.args || []; + configuredSandbox.injectedKeys = []; + configuredSandbox.injectInto = config.injectInto; + var exposed = configuredSandbox.inject({}); + + if (config.properties) { + forEach$a(config.properties, function(prop) { + var value = exposed[prop] || (prop === "sandbox" && configuredSandbox); + exposeValue(configuredSandbox, config, prop, value); + }); + } else { + exposeValue(configuredSandbox, config, "sandbox"); + } + + return configuredSandbox; + } + + var createSandbox_1 = createSandbox; + + var deprecated = createCommonjsModule$1(function (module, exports) { + + // wrap returns a function that will invoke the supplied function and print a deprecation warning to the console each + // time it is called. + exports.wrap = function(func, msg) { + var wrapped = function() { + exports.printWarning(msg); + return func.apply(this, arguments); + }; + if (func.prototype) { + wrapped.prototype = func.prototype; + } + return wrapped; + }; + + // defaultMsg returns a string which can be supplied to `wrap()` to notify the user that a particular part of the + // sinon API has been deprecated. + /* istanbul ignore next */ + exports.defaultMsg = function(funcName) { + return "sinon." + funcName + " is deprecated and will be removed from the public API in a future version of sinon."; + }; + + exports.printWarning = function(msg) { + // Watch out for IE7 and below! :( + if (typeof console !== "undefined") { + /* istanbul ignore else */ + if (console.info) { + console.info(msg); + } else { + console.log(msg); + } + } + }; + }); + var deprecated_1 = deprecated.wrap; + var deprecated_2 = deprecated.defaultMsg; + var deprecated_3 = deprecated.printWarning; + + var defaultConfig = { + injectIntoThis: true, + injectInto: null, + properties: ["spy", "stub", "mock", "clock", "server", "requests"], + useFakeTimers: true, + useFakeServer: true + }; + + var apiMethods = { + createSandbox: createSandbox_1, + assert: assert_1, + match: match_1$1, + spyCall: call$1$1, + + expectation: mockExpectation_1, + createStubInstance: stub_1.createStubInstance, + defaultConfig: defaultConfig, + + setFormatter: format_1.setFormatter, + + // fake timers + timers: fakeTimers.timers, + + // fake XHR + xhr: nise.fakeXhr.xhr, + FakeXMLHttpRequest: nise.fakeXhr.FakeXMLHttpRequest, + + // fake server + fakeServer: nise.fakeServer, + fakeServerWithClock: nise.fakeServerWithClock, + createFakeServer: nise.fakeServer.create.bind(nise.fakeServer), + createFakeServerWithClock: nise.fakeServerWithClock.create.bind(nise.fakeServerWithClock), + + addBehavior: function(name, fn) { + behavior.addBehavior(stub_1, name, fn); + } + }; + + var legacySandboxAPI = { + sandbox: { + create: deprecated.wrap( + createSandbox_1, + // eslint-disable-next-line max-len + "`sandbox.create()` is deprecated. Use default sandbox at `sinon.sandbox` or create new sandboxes with `sinon.createSandbox()`" + ) + } + }; + + var sandbox$1 = new sandbox(); + + var api = extend(sandbox$1, legacySandboxAPI, apiMethods); + + var sinon = api; + + const _serverPrototype = sinon.serverPrototype; + const _getFakes = sinon.getFakes; + const _getRestorers = sinon.getRestorers; + const _createStubInstance = sinon.createStubInstance; + const _inject = sinon.inject; + const _mock = sinon.mock; + const _reset = sinon.reset; + const _resetBehavior = sinon.resetBehavior; + const _resetHistory = sinon.resetHistory; + const _restore = sinon.restore; + const _restoreContext = sinon.restoreContext; + const _replace = sinon.replace; + const _replaceGetter = sinon.replaceGetter; + const _replaceSetter = sinon.replaceSetter; + const _spy = sinon.spy; + const _stub = sinon.stub; + const _fake = sinon.fake; + const _useFakeTimers = sinon.useFakeTimers; + const _verify = sinon.verify; + const _verifyAndRestore = sinon.verifyAndRestore; + const _useFakeServer = sinon.useFakeServer; + const _useFakeXMLHttpRequest = sinon.useFakeXMLHttpRequest; + const _usingPromise = sinon.usingPromise; + const _sandbox = sinon.sandbox; + const _createSandbox = sinon.createSandbox; + const _assert = sinon.assert; + const _match = sinon.match; + const _spyCall = sinon.spyCall; + const _expectation = sinon.expectation; + const _defaultConfig = sinon.defaultConfig; + const _setFormatter = sinon.setFormatter; + const _timers = sinon.timers; + const _xhr = sinon.xhr; + const _FakeXMLHttpRequest = sinon.FakeXMLHttpRequest; + const _fakeServer = sinon.fakeServer; + const _fakeServerWithClock = sinon.fakeServerWithClock; + const _createFakeServer = sinon.createFakeServer; + const _createFakeServerWithClock = sinon.createFakeServerWithClock; + const _addBehavior = sinon.addBehavior; + + var expect$1 = chai$1.expect; + describe("generated parser API", function () { + describe("parse", function () { + it("parses input", function () { + var parser = peg_1.generate("start = 'a'"); + expect$1(parser.parse("a")).to.equal("a"); + }); + it("throws an exception on syntax error", function () { + var parser = peg_1.generate("start = 'a'"); + expect$1(function () { + parser.parse("b"); + }).to.throw(); + }); + describe("start rule", function () { + var parser = peg_1.generate("\n\n a = 'x' { return 'a'; }\n b = 'x' { return 'b'; }\n c = 'x' { return 'c'; }\n\n ", { + allowedStartRules: ["b", "c"] + }); + describe("when |startRule| is not set", function () { + it("starts parsing from the first allowed rule", function () { + expect$1(parser.parse("x")).to.equal("b"); + }); + }); + describe("when |startRule| is set to an allowed rule", function () { + it("starts parsing from specified rule", function () { + expect$1(parser.parse("x", { + startRule: "b" + })).to.equal("b"); + expect$1(parser.parse("x", { + startRule: "c" + })).to.equal("c"); + }); + }); + describe("when |startRule| is set to a disallowed start rule", function () { + it("throws an exception", function () { + expect$1(function () { + parser.parse("x", { + startRule: "a" + }); + }).to.throw(); + }); + }); + }); + describe("tracing", function () { + var parser = peg_1.generate("\n\n start = a / b\n a = 'a'\n b = 'b'\n\n ", { + trace: true + }); + describe("default tracer", function () { + it("traces using console.log (if console is defined)", function () { + var messages = ["1:1-1:1 rule.enter start", "1:1-1:1 rule.enter a", "1:1-1:1 rule.fail a", "1:1-1:1 rule.enter b", "1:1-1:2 rule.match b", "1:1-1:2 rule.match start"]; + if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") sinon.stub(console, "log"); + + try { + parser.parse("b"); + + if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") { + expect$1(console.log.callCount).to.equal(messages.length); + messages.forEach(function (message, index) { + var call = console.log.getCall(index); + expect$1(call.calledWithExactly(message)).to.equal(true); + }); + } + } finally { + if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") console.log.restore(); + } + }); + }); + describe("custom tracers", function () { + describe("trace", function () { + it("receives tracing events", function () { + var events = [{ + type: "rule.enter", + rule: "start", + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 0, + line: 1, + column: 1 + } + } + }, { + type: "rule.enter", + rule: "a", + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 0, + line: 1, + column: 1 + } + } + }, { + type: "rule.fail", + rule: "a", + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 0, + line: 1, + column: 1 + } + } + }, { + type: "rule.enter", + rule: "b", + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 0, + line: 1, + column: 1 + } + } + }, { + type: "rule.match", + rule: "b", + result: "b", + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 1, + line: 1, + column: 2 + } + } + }, { + type: "rule.match", + rule: "start", + result: "b", + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 1, + line: 1, + column: 2 + } + } + }]; + var tracer = { + trace: sinon.spy() + }; + parser.parse("b", { + tracer: tracer + }); + expect$1(tracer.trace.callCount).to.equal(events.length); + events.forEach(function (event, index) { + var call = tracer.trace.getCall(index); + expect$1(call.calledWithExactly(event)).to.equal(true); + }); + }); + }); + }); + }); + it("accepts custom options", function () { + var parser = peg_1.generate("start = 'a'"); + parser.parse("a", { + foo: 42 + }); + }); + }); + }); + var generatedParserApi_spec = {}; + + var expect$2 = chai$1.expect; + describe("PEG.js API", function () { + describe("generate", function () { + it("generates a parser", function () { + var parser = peg_1.generate("start = 'a'"); + expect$2(parser).to.be.an("object"); + expect$2(parser.parse("a")).to.equal("a"); + }); + it("throws an exception on syntax error", function () { + expect$2(function () { + peg_1.generate("start = @"); + }).to.throw(); + }); + it("throws an exception on semantic error", function () { + expect$2(function () { + peg_1.generate("start = undefined"); + }).to.throw(); + }); + describe("allowed start rules", function () { + var grammar = "\n\n a = 'x'\n b = 'x'\n c = 'x'\n\n "; + it("throws an error on missing rule", function () { + expect$2(function () { + peg_1.generate(grammar, { + allowedStartRules: ["missing"] + }); + }).to.throw(); + }); + describe("when optimizing for parsing speed", function () { + describe("when |allowedStartRules| is not set", function () { + it("generated parser can start only from the first rule", function () { + var parser = peg_1.generate(grammar, { + optimize: "speed" + }); + expect$2(parser.parse("x", { + startRule: "a" + })).to.equal("x"); + expect$2(function () { + parser.parse("x", { + startRule: "b" + }); + }).to.throw(); + expect$2(function () { + parser.parse("x", { + startRule: "c" + }); + }).to.throw(); + }); + }); + describe("when |allowedStartRules| is set", function () { + it("generated parser can start only from specified rules", function () { + var parser = peg_1.generate(grammar, { + optimize: "speed", + allowedStartRules: ["b", "c"] + }); + expect$2(function () { + parser.parse("x", { + startRule: "a" + }); + }).to.throw(); + expect$2(parser.parse("x", { + startRule: "b" + })).to.equal("x"); + expect$2(parser.parse("x", { + startRule: "c" + })).to.equal("x"); + }); + }); + }); + describe("when optimizing for code size", function () { + describe("when |allowedStartRules| is not set", function () { + it("generated parser can start only from the first rule", function () { + var parser = peg_1.generate(grammar, { + optimize: "size" + }); + expect$2(parser.parse("x", { + startRule: "a" + })).to.equal("x"); + expect$2(function () { + parser.parse("x", { + startRule: "b" + }); + }).to.throw(); + expect$2(function () { + parser.parse("x", { + startRule: "c" + }); + }).to.throw(); + }); + }); + describe("when |allowedStartRules| is set", function () { + it("generated parser can start only from specified rules", function () { + var parser = peg_1.generate(grammar, { + optimize: "size", + allowedStartRules: ["b", "c"] + }); + expect$2(function () { + parser.parse("x", { + startRule: "a" + }); + }).to.throw(); + expect$2(parser.parse("x", { + startRule: "b" + })).to.equal("x"); + expect$2(parser.parse("x", { + startRule: "c" + })).to.equal("x"); + }); + }); + }); + }); + describe("intermediate results caching", function () { + var grammar = "\n\n { var n = 0; }\n start = (a 'b') / (a 'c') { return n; }\n a = 'a' { n++; }\n\n "; + describe("when |cache| is not set", function () { + it("generated parser doesn't cache intermediate parse results", function () { + var parser = peg_1.generate(grammar); + expect$2(parser.parse("ac")).to.equal(2); + }); + }); + describe("when |cache| is set to |false|", function () { + it("generated parser doesn't cache intermediate parse results", function () { + var parser = peg_1.generate(grammar, { + cache: false + }); + expect$2(parser.parse("ac")).to.equal(2); + }); + }); + describe("when |cache| is set to |true|", function () { + it("generated parser caches intermediate parse results", function () { + var parser = peg_1.generate(grammar, { + cache: true + }); + expect$2(parser.parse("ac")).to.equal(1); + }); + }); + }); + describe("tracing", function () { + var grammar = "start = 'a'"; + describe("when |trace| is not set", function () { + it("generated parser doesn't trace", function () { + var parser = peg_1.generate(grammar); + var tracer = { + trace: sinon.spy() + }; + parser.parse("a", { + tracer: tracer + }); + expect$2(tracer.trace.called).to.equal(false); + }); + }); + describe("when |trace| is set to |false|", function () { + it("generated parser doesn't trace", function () { + var parser = peg_1.generate(grammar, { + trace: false + }); + var tracer = { + trace: sinon.spy() + }; + parser.parse("a", { + tracer: tracer + }); + expect$2(tracer.trace.called).to.equal(false); + }); + }); + describe("when |trace| is set to |true|", function () { + it("generated parser traces", function () { + var parser = peg_1.generate(grammar, { + trace: true + }); + var tracer = { + trace: sinon.spy() + }; + parser.parse("a", { + tracer: tracer + }); + expect$2(tracer.trace.called).to.equal(true); + }); + }); + }); + describe("output", function () { + var grammar = "start = 'a'"; + describe("when |output| is not set", function () { + it("returns generated parser object", function () { + var parser = peg_1.generate(grammar); + expect$2(parser).to.be.an("object"); + expect$2(parser.parse("a")).to.equal("a"); + }); + }); + describe("when |output| is set to |\"parser\"|", function () { + it("returns generated parser object", function () { + var parser = peg_1.generate(grammar, { + output: "parser" + }); + expect$2(parser).to.be.an("object"); + expect$2(parser.parse("a")).to.equal("a"); + }); + }); + describe("when |output| is set to |\"source\"|", function () { + it("returns generated parser source code", function () { + var source = peg_1.generate(grammar, { + output: "source" + }); + expect$2(source).to.be.a("string"); + expect$2(eval(source).parse("a")).to.equal("a"); + }); + }); + }); + describe("reserved words", function () { + var RESERVED_WORDS = peg_1.util.reservedWords; + describe("throws an exception on reserved JS words used as labels", function () { + var _iteratorNormalCompletion = true; + var _didIteratorError = false; + var _iteratorError = undefined; + + try { + var _loop = function _loop() { + var label = _step.value; + it(label, function () { + expect$2(function () { + peg_1.generate(["start = " + label + ":end", "end = 'a'"].join("\n"), { + output: "source" + }); + }).to.throw(peg_1.parser.SyntaxError); + }); + }; + + for (var _iterator = RESERVED_WORDS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { + _loop(); + } + } catch (err) { + _didIteratorError = true; + _iteratorError = err; + } finally { + try { + if (!_iteratorNormalCompletion && _iterator.return != null) { + _iterator.return(); + } + } finally { + if (_didIteratorError) { + throw _iteratorError; + } + } + } + }); + describe("not throws an exception on reserved JS words used as rule name", function () { + var _iteratorNormalCompletion2 = true; + var _didIteratorError2 = false; + var _iteratorError2 = undefined; + + try { + var _loop2 = function _loop2() { + var rule = _step2.value; + it(rule, function () { + expect$2(function () { + peg_1.generate(["start = " + rule, rule + " = 'a'"].join("\n"), { + output: "source" + }); + }).to.not.throw(peg_1.parser.SyntaxError); + }); + }; + + for (var _iterator2 = RESERVED_WORDS[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { + _loop2(); + } + } catch (err) { + _didIteratorError2 = true; + _iteratorError2 = err; + } finally { + try { + if (!_iteratorNormalCompletion2 && _iterator2.return != null) { + _iterator2.return(); + } + } finally { + if (_didIteratorError2) { + throw _iteratorError2; + } + } + } + }); + }); + it("accepts custom options", function () { + peg_1.generate("start = 'a'", { + foo: 42 + }); + }); + }); + }); + + var util$1 = peg_1.util; + var expect$3 = chai$1.expect; + describe("PEG.js Utility API", function () { + describe("util.convertPasses", function () { + var passes = { + stage1: { + pass1: function pass1() {}, + pass2: function pass2() {}, + pass3: function pass3() {} + }, + stage2: { + pass1: function pass1() {}, + pass2: function pass2() {} + }, + stage3: { + pass1: function pass1() {} + } + }; + + function expectPasses(result) { + expect$3(result).to.be.an("object"); + expect$3(result.stage1).to.be.an("array").and.to.have.a.lengthOf(3); + expect$3(result.stage2).to.be.an("array").and.to.have.a.lengthOf(2); + expect$3(result.stage3).to.be.an("array").and.to.have.a.lengthOf(1); + } + + it("converts a map of stages containing a map of passes", function () { + expectPasses(util$1.convertPasses(passes)); + }); + it("converts a map of stages containing a list of passes", function () { + expectPasses(util$1.convertPasses({ + stage1: [passes.stage1.pass1, passes.stage1.pass2, passes.stage1.pass3], + stage2: passes.stage2, + stage3: [passes.stage3.pass1] + })); + }); + }); + describe("util.clone", function () { + var meta = { + name: "pegjs", + version: 0.11, + util: util$1 + }; + it("shallow clones an object", function () { + expect$3(util$1.clone(meta)).to.be.an("object").that.has.own.includes(meta); + }); + it("cloned properties refrence same value", function () { + expect$3(util$1.clone(meta)).to.haveOwnProperty("util").that.is.a("object").which.equals(util$1); + }); + }); + describe("util.each", function () { + it("should iterate over an objects properties", function () { + var size = Object.keys(util$1).length; + var entries = []; + util$1.each(util$1, function (value, key) { + entries.push({ + key: key, + value: value + }); + }); + expect$3(entries.length).to.equal(size); + entries.forEach(function (entry) { + expect$3(util$1).to.have.ownProperty(entry.key).which.equals(entry.value); + }); + }); + }); + describe("util.values", function () { + var map = { + a: 1, + b: 2, + c: 3 + }; + it("can extract values like Object.values", function () { + expect$3(util$1.values(map)).to.be.an("array").with.a.lengthOf(3).and.includes.members([1, 2, 3]); + }); + it("can take a transformer, like Array#map", function () { + expect$3(util$1.values(map, function (n) { + return String(n); + })).that.includes.members(["1", "2", "3"]); + }); + }); + describe("util.extend", function () { + var source = { + d: 4, + e: 5, + f: 6, + g: 7, + h: 8 + }; + it("extend an empty object", function () { + var target = {}; + expect$3(util$1.extend(target, source)).to.be.an("object").that.includes.keys(Object.keys(source)); + expect$3(util$1.values(target)).to.include.members([4, 5, 6, 7, 8]).and.have.a.lengthOf(5); + }); + it("extend an object", function () { + var target = util$1.extend({}, source); + var utils = Object.keys(util$1); + expect$3(util$1.extend(target, util$1)).to.include.keys(utils); + expect$3(util$1.values(target)).to.have.a.lengthOf(5 + utils.length); + }); + }); + describe("util.map", function () { + var object = { + a: 1, + b: 2, + c: 3, + d: 4 + }; + var result = util$1.map(object, String); + it("returns an object, and not an array, unlike Array#map", function () { + expect$3(result).to.be.an("object").that.includes.keys(Object.keys(object)); + }); + it("applies a transformation on each properties value", function () { + util$1.each(result, function (property) { + expect$3(property).to.be.a("string"); + }); + }); + }); + }); + + var expect$4 = chai$1.expect; + describe("plugin API", function () { + describe("use", function () { + var grammar = "start = 'a'"; + it("is called for each plugin", function () { + var pluginsUsed = [false, false, false]; + var plugins = [{ + use: function use() { + pluginsUsed[0] = true; + } + }, { + use: function use() { + pluginsUsed[1] = true; + } + }, { + use: function use() { + pluginsUsed[2] = true; + } + }]; + peg_1.generate(grammar, { + plugins: plugins + }); + expect$4(pluginsUsed).to.deep.equal([true, true, true]); + }); + it("receives configuration", function () { + var plugin = { + use: function use(config) { + expect$4(config).to.be.an("object"); + expect$4(config.parser).to.be.an("object"); + expect$4(config.parser.parse("start = 'a'")).to.be.an("object"); + expect$4(config.passes).to.be.an("object"); + expect$4(config.passes.check).to.be.an("array"); + config.passes.check.forEach(function (pass) { + expect$4(pass).to.be.a("function"); + }); + expect$4(config.passes.transform).to.be.an("array"); + config.passes.transform.forEach(function (pass) { + expect$4(pass).to.be.a("function"); + }); + expect$4(config.passes.generate).to.be.an("array"); + config.passes.generate.forEach(function (pass) { + expect$4(pass).to.be.a("function"); + }); + } + }; + peg_1.generate(grammar, { + plugins: [plugin] + }); + }); + it("receives options", function () { + var generateOptions = { + plugins: [{ + use: function use(config, options) { + expect$4(options).to.equal(generateOptions); + } + }], + foo: 42 + }; + peg_1.generate(grammar, generateOptions); + }); + it("can replace parser", function () { + var plugin = { + use: function use(config) { + config.parser = peg_1.generate("\n\n start = .* {\n return new ast.Grammar( void 0, [{\n type: \"rule\",\n name: \"start\",\n expression: {\n type: \"literal\",\n value: text(),\n ignoreCase: false\n }\n }] );\n }\n\n ", { + context: { + ast: peg_1.ast + } + }); + } + }; + var parser = peg_1.generate("a", { + plugins: [plugin] + }); + expect$4(parser.parse("a")).to.equal("a"); + }); + it("can change compiler passes", function () { + var plugin = { + use: function use(config) { + function pass(ast) { + ast.code = "exports.parse = function() { return 42; }"; + } + + config.passes.generate = [pass]; + } + }; + var parser = peg_1.generate(grammar, { + plugins: [plugin] + }); + expect$4(parser.parse("a")).to.equal(42); + }); + it("can change options", function () { + var grammar = "\n\n a = 'x'\n b = 'x'\n c = 'x'\n\n "; + var plugin = { + use: function use(config, options) { + options.allowedStartRules = ["b", "c"]; + } + }; + var parser = peg_1.generate(grammar, { + allowedStartRules: ["a"], + plugins: [plugin] + }); + expect$4(function () { + parser.parse("x", { + startRule: "a" + }); + }).to.throw(); + expect$4(parser.parse("x", { + startRule: "b" + })).to.equal("x"); + expect$4(parser.parse("x", { + startRule: "c" + })).to.equal("x"); + }); + }); + }); + + var expect$5 = chai$1.expect; + describe("generated parser behavior", function () { + function varyOptimizationOptions(block) { + var optionsVariants = [{ + cache: false, + optimize: "speed", + trace: false + }, { + cache: false, + optimize: "speed", + trace: true + }, { + cache: false, + optimize: "size", + trace: false + }, { + cache: false, + optimize: "size", + trace: true + }, { + cache: true, + optimize: "speed", + trace: false + }, { + cache: true, + optimize: "speed", + trace: true + }, { + cache: true, + optimize: "size", + trace: false + }, { + cache: true, + optimize: "size", + trace: true + }]; + optionsVariants.forEach(function (variant) { + describe("with options " + chai$1.util.inspect(variant), function () { + block(peg_1.util.clone(variant)); + }); + }); + } + + function withConsoleStub(block) { + if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") sinon.stub(console, "log"); + + try { + return block(); + } finally { + if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") console.log.restore(); + } + } + + function helpers(chai, utils) { + var Assertion = chai.Assertion; + Assertion.addMethod("parse", function (input, expected, options) { + var _this = this; + + options = typeof options !== "undefined" ? options : {}; + var result = withConsoleStub(function () { + return utils.flag(_this, "object").parse(input, options); + }); + + if (typeof expected !== "undefined") { + this.assert(utils.eql(result, expected), "expected #{this} to parse input as #{exp} but got #{act}", "expected #{this} to not parse input as #{exp}", expected, result, !utils.flag(this, "negate")); + } + }); + Assertion.addMethod("failToParse", function (input, props, options) { + var _this2 = this; + + options = typeof options !== "undefined" ? options : {}; + var passed, result; + + try { + result = withConsoleStub(function () { + return utils.flag(_this2, "object").parse(input, options); + }); + passed = true; + } catch (e) { + result = e; + passed = false; + } + + this.assert(!passed, "expected #{this} to fail to parse input but got #{act}", "expected #{this} to not fail to parse input but #{act} was thrown", null, result); + + if (!passed && typeof props !== "undefined") { + Object.keys(props).forEach(function (key) { + new Assertion(result).to.have.property(key).that.is.deep.equal(props[key]); + }); + } + }); + } + + beforeEach(function () { + chai$1.use(helpers); + }); + varyOptimizationOptions(function (options) { + describe("initializer", function () { + it("executes the code before parsing starts", function () { + var parser = peg_1.generate(["{ var result = 42; }", "start = 'a' { return result; }"].join("\n"), options); + expect$5(parser).to.parse("a", 42); + }); + describe("available variables and functions", function () { + it("|options| contains options", function () { + var parser = peg_1.generate(["{ var result = options; }", "start = 'a' { return result; }"].join("\n"), options); + expect$5(parser).to.parse("a", { + a: 42 + }, { + a: 42 + }); + }); + }); + }); + describe("rule", function () { + if (options.cache) { + it("caches rule match results", function () { + var parser = peg_1.generate(["{ var n = 0; }", "start = (a 'b') / (a 'c') { return n; }", "a = 'a' { n++; }"].join("\n"), options); + expect$5(parser).to.parse("ac", 1); + }); + } else { + it("doesn't cache rule match results", function () { + var parser = peg_1.generate(["{ var n = 0; }", "start = (a 'b') / (a 'c') { return n; }", "a = 'a' { n++; }"].join("\n"), options); + expect$5(parser).to.parse("ac", 2); + }); + } + + describe("when the expression matches", function () { + it("returns its match result", function () { + var parser = peg_1.generate("start = 'a'"); + expect$5(parser).to.parse("a", "a"); + }); + }); + describe("when the expression doesn't match", function () { + describe("without display name", function () { + it("reports match failure and doesn't record any expectation", function () { + var parser = peg_1.generate("start = 'a'"); + expect$5(parser).to.failToParse("b", { + expected: [{ + type: "literal", + text: "a", + ignoreCase: false + }] + }); + }); + }); + describe("with display name", function () { + it("reports match failure and records an expectation of type \"other\"", function () { + var parser = peg_1.generate("start 'start' = 'a'"); + expect$5(parser).to.failToParse("b", { + expected: [{ + type: "other", + description: "start" + }] + }); + }); + it("discards any expectations recorded when matching the expression", function () { + var parser = peg_1.generate("start 'start' = 'a'"); + expect$5(parser).to.failToParse("b", { + expected: [{ + type: "other", + description: "start" + }] + }); + }); + }); + }); + }); + describe("literal", function () { + describe("matching", function () { + it("matches empty literals", function () { + var parser = peg_1.generate("start = ''", options); + expect$5(parser).to.parse(""); + }); + it("matches one-character literals", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.parse("a"); + expect$5(parser).to.failToParse("b"); + }); + it("matches multi-character literals", function () { + var parser = peg_1.generate("start = 'abcd'", options); + expect$5(parser).to.parse("abcd"); + expect$5(parser).to.failToParse("efgh"); + }); + it("is case sensitive without the \"i\" flag", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.parse("a"); + expect$5(parser).to.failToParse("A"); + }); + it("is case insensitive with the \"i\" flag", function () { + var parser = peg_1.generate("start = 'a'i", options); + expect$5(parser).to.parse("a"); + expect$5(parser).to.parse("A"); + }); + }); + describe("when it matches", function () { + it("returns the matched text", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.parse("a", "a"); + }); + it("consumes the matched text", function () { + var parser = peg_1.generate("start = 'a' .", options); + expect$5(parser).to.parse("ab"); + }); + }); + describe("when it doesn't match", function () { + it("reports match failure and records an expectation of type \"literal\"", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("b", { + expected: [{ + type: "literal", + text: "a", + ignoreCase: false + }] + }); + }); + }); + }); + describe("character class", function () { + describe("matching", function () { + it("matches empty classes", function () { + var parser = peg_1.generate("start = []", options); + expect$5(parser).to.failToParse("a"); + }); + it("matches classes with a character list", function () { + var parser = peg_1.generate("start = [abc]", options); + expect$5(parser).to.parse("a"); + expect$5(parser).to.parse("b"); + expect$5(parser).to.parse("c"); + expect$5(parser).to.failToParse("d"); + }); + it("matches classes with a character range", function () { + var parser = peg_1.generate("start = [a-c]", options); + expect$5(parser).to.parse("a"); + expect$5(parser).to.parse("b"); + expect$5(parser).to.parse("c"); + expect$5(parser).to.failToParse("d"); + }); + it("matches inverted classes", function () { + var parser = peg_1.generate("start = [^a]", options); + expect$5(parser).to.failToParse("a"); + expect$5(parser).to.parse("b"); + }); + it("is case sensitive without the \"i\" flag", function () { + var parser = peg_1.generate("start = [a]", options); + expect$5(parser).to.parse("a"); + expect$5(parser).to.failToParse("A"); + }); + it("is case insensitive with the \"i\" flag", function () { + var parser = peg_1.generate("start = [a]i", options); + expect$5(parser).to.parse("a"); + expect$5(parser).to.parse("A"); + }); + }); + describe("when it matches", function () { + it("returns the matched character", function () { + var parser = peg_1.generate("start = [a]", options); + expect$5(parser).to.parse("a", "a"); + }); + it("consumes the matched character", function () { + var parser = peg_1.generate("start = [a] .", options); + expect$5(parser).to.parse("ab"); + }); + }); + describe("when it doesn't match", function () { + it("reports match failure and records an expectation of type \"class\"", function () { + var parser = peg_1.generate("start = [a]", options); + expect$5(parser).to.failToParse("b", { + expected: [{ + type: "class", + parts: ["a"], + inverted: false, + ignoreCase: false + }] + }); + }); + }); + }); + describe("dot", function () { + describe("matching", function () { + it("matches any character", function () { + var parser = peg_1.generate("start = .", options); + expect$5(parser).to.parse("a"); + expect$5(parser).to.parse("b"); + expect$5(parser).to.parse("c"); + }); + }); + describe("when it matches", function () { + it("returns the matched character", function () { + var parser = peg_1.generate("start = .", options); + expect$5(parser).to.parse("a", "a"); + }); + it("consumes the matched character", function () { + var parser = peg_1.generate("start = . .", options); + expect$5(parser).to.parse("ab"); + }); + }); + describe("when it doesn't match", function () { + it("reports match failure and records an expectation of type \"any\"", function () { + var parser = peg_1.generate("start = .", options); + expect$5(parser).to.failToParse("", { + expected: [{ + type: "any" + }] + }); + }); + }); + }); + describe("rule reference", function () { + describe("when referenced rule's expression matches", function () { + it("returns its result", function () { + var parser = peg_1.generate(["start = a", "a = 'a'"].join("\n"), options); + expect$5(parser).to.parse("a", "a"); + }); + }); + describe("when referenced rule's expression doesn't match", function () { + it("reports match failure", function () { + var parser = peg_1.generate(["start = a", "a = 'a'"].join("\n"), options); + expect$5(parser).to.failToParse("b"); + }); + }); + }); + describe("positive semantic predicate", function () { + describe("when the code returns a truthy value", function () { + it("returns |undefined|", function () { + var parser = peg_1.generate("start = &{ return true; } ''", options); + expect$5(parser).to.parse("", [void 0, ""]); + }); + }); + describe("when the code returns a falsey value", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = &{ return false; }", options); + expect$5(parser).to.failToParse(""); + }); + }); + describe("label variables", function () { + describe("in containing sequence", function () { + it("can access variables defined by preceding labeled elements", function () { + var parser = peg_1.generate("start = a:'a' &{ return a === 'a'; }", options); + expect$5(parser).to.parse("a"); + }); + it("cannot access variable defined by labeled predicate element", function () { + var parser = peg_1.generate("start = 'a' b:&{ return b === undefined; } 'c'", options); + expect$5(parser).to.failToParse("ac"); + }); + it("cannot access variables defined by following labeled elements", function () { + var parser = peg_1.generate("start = &{ return a === 'a'; } a:'a'", options); + expect$5(parser).to.failToParse("a"); + }); + it("cannot access variables defined by subexpressions", function () { + var testcases = [{ + grammar: "start = (a:'a') &{ return a === 'a'; }", + input: "a" + }, { + grammar: "start = (a:'a')? &{ return a === 'a'; }", + input: "a" + }, { + grammar: "start = (a:'a')* &{ return a === 'a'; }", + input: "a" + }, { + grammar: "start = (a:'a')+ &{ return a === 'a'; }", + input: "a" + }, { + grammar: "start = $(a:'a') &{ return a === 'a'; }", + input: "a" + }, { + grammar: "start = &(a:'a') 'a' &{ return a === 'a'; }", + input: "a" + }, { + grammar: "start = !(a:'a') 'b' &{ return a === 'a'; }", + input: "b" + }, { + grammar: "start = b:(a:'a') &{ return a === 'a'; }", + input: "a" + }, { + grammar: "start = ('a' b:'b' 'c') &{ return b === 'b'; }", + input: "abc" + }, { + grammar: "start = (a:'a' { return a; }) &{ return a === 'a'; }", + input: "a" + }, { + grammar: "start = ('a' / b:'b' / 'c') &{ return b === 'b'; }", + input: "b" + }]; + testcases.forEach(function (testcase) { + var parser = peg_1.generate(testcase.grammar, options); + expect$5(parser).to.failToParse(testcase.input); + }); + }); + }); + describe("in outer sequence", function () { + it("can access variables defined by preceding labeled elements", function () { + var parser = peg_1.generate("start = a:'a' ('b' &{ return a === 'a'; })", options); + expect$5(parser).to.parse("ab"); + }); + it("cannot access variable defined by labeled predicate element", function () { + var parser = peg_1.generate("start = 'a' b:('b' &{ return b === undefined; }) 'c'", options); + expect$5(parser).to.failToParse("abc"); + }); + it("cannot access variables defined by following labeled elements", function () { + var parser = peg_1.generate("start = ('a' &{ return b === 'b'; }) b:'b'", options); + expect$5(parser).to.failToParse("ab"); + }); + }); + }); + describe("initializer variables & functions", function () { + it("can access variables defined in the initializer", function () { + var parser = peg_1.generate(["{ var v = 42 }", "start = &{ return v === 42; }"].join("\n"), options); + expect$5(parser).to.parse(""); + }); + it("can access functions defined in the initializer", function () { + var parser = peg_1.generate(["{ function f() { return 42; } }", "start = &{ return f() === 42; }"].join("\n"), options); + expect$5(parser).to.parse(""); + }); + }); + describe("available variables & functions", function () { + it("|options| contains options", function () { + var parser = peg_1.generate(["{ var result; }", "start = &{ result = options; return true; } { return result; }"].join("\n"), options); + expect$5(parser).to.parse("", { + a: 42 + }, { + a: 42 + }); + }); + it("|location| returns current location info", function () { + var parser = peg_1.generate(["{ var result; }", "start = line (nl+ line)* { return result; }", "line = thing (' '+ thing)*", "thing = digit / mark", "digit = [0-9]", "mark = &{ result = location(); return true; } 'x'", "nl = '\\r'? '\\n'"].join("\n"), options); + expect$5(parser).to.parse("1\n2\n\n3\n\n\n4 5 x", { + start: { + offset: 13, + line: 7, + column: 5 + }, + end: { + offset: 13, + line: 7, + column: 5 + } + }); + expect$5(parser).to.parse("1\nx", { + start: { + offset: 2, + line: 2, + column: 1 + }, + end: { + offset: 2, + line: 2, + column: 1 + } + }); + expect$5(parser).to.parse("1\r\nx", { + start: { + offset: 3, + line: 2, + column: 1 + }, + end: { + offset: 3, + line: 2, + column: 1 + } + }); + }); + it("|offset| returns current start offset", function () { + var parser = peg_1.generate(["start = [0-9]+ val:mark { return val; }", "mark = 'xx' { return offset(); }"].join("\n"), options); + expect$5(parser).to.parse("0123456xx", 7); + }); + it("|range| returns current range", function () { + var parser = peg_1.generate(["start = [0-9]+ val:mark { return val; }", "mark = 'xx' { return range(); }"].join("\n"), options); + expect$5(parser).to.parse("0123456xx", [7, 9]); + }); + }); + }); + describe("negative semantic predicate", function () { + describe("when the code returns a falsey value", function () { + it("returns |undefined|", function () { + var parser = peg_1.generate("start = !{ return false; } ''", options); + expect$5(parser).to.parse("", [void 0, ""]); + }); + }); + describe("when the code returns a truthy value", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = !{ return true; }", options); + expect$5(parser).to.failToParse(""); + }); + }); + describe("label variables", function () { + describe("in containing sequence", function () { + it("can access variables defined by preceding labeled elements", function () { + var parser = peg_1.generate("start = a:'a' !{ return a !== 'a'; }", options); + expect$5(parser).to.parse("a"); + }); + it("cannot access variable defined by labeled predicate element", function () { + var parser = peg_1.generate("start = 'a' b:!{ return b !== undefined; } 'c'", options); + expect$5(parser).to.failToParse("ac"); + }); + it("cannot access variables defined by following labeled elements", function () { + var parser = peg_1.generate("start = !{ return a !== 'a'; } a:'a'", options); + expect$5(parser).to.failToParse("a"); + }); + it("cannot access variables defined by subexpressions", function () { + var testcases = [{ + grammar: "start = (a:'a') !{ return a !== 'a'; }", + input: "a" + }, { + grammar: "start = (a:'a')? !{ return a !== 'a'; }", + input: "a" + }, { + grammar: "start = (a:'a')* !{ return a !== 'a'; }", + input: "a" + }, { + grammar: "start = (a:'a')+ !{ return a !== 'a'; }", + input: "a" + }, { + grammar: "start = $(a:'a') !{ return a !== 'a'; }", + input: "a" + }, { + grammar: "start = &(a:'a') 'a' !{ return a !== 'a'; }", + input: "a" + }, { + grammar: "start = !(a:'a') 'b' !{ return a !== 'a'; }", + input: "b" + }, { + grammar: "start = b:(a:'a') !{ return a !== 'a'; }", + input: "a" + }, { + grammar: "start = ('a' b:'b' 'c') !{ return b !== 'b'; }", + input: "abc" + }, { + grammar: "start = (a:'a' { return a; }) !{ return a !== 'a'; }", + input: "a" + }, { + grammar: "start = ('a' / b:'b' / 'c') !{ return b !== 'b'; }", + input: "b" + }]; + testcases.forEach(function (testcase) { + var parser = peg_1.generate(testcase.grammar, options); + expect$5(parser).to.failToParse(testcase.input); + }); + }); + }); + describe("in outer sequence", function () { + it("can access variables defined by preceding labeled elements", function () { + var parser = peg_1.generate("start = a:'a' ('b' !{ return a !== 'a'; })", options); + expect$5(parser).to.parse("ab"); + }); + it("cannot access variable defined by labeled predicate element", function () { + var parser = peg_1.generate("start = 'a' b:('b' !{ return b !== undefined; }) 'c'", options); + expect$5(parser).to.failToParse("abc"); + }); + it("cannot access variables defined by following labeled elements", function () { + var parser = peg_1.generate("start = ('a' !{ return b !== 'b'; }) b:'b'", options); + expect$5(parser).to.failToParse("ab"); + }); + }); + }); + describe("initializer variables & functions", function () { + it("can access variables defined in the initializer", function () { + var parser = peg_1.generate(["{ var v = 42 }", "start = !{ return v !== 42; }"].join("\n"), options); + expect$5(parser).to.parse(""); + }); + it("can access functions defined in the initializer", function () { + var parser = peg_1.generate(["{ function f() { return 42; } }", "start = !{ return f() !== 42; }"].join("\n"), options); + expect$5(parser).to.parse(""); + }); + }); + describe("available variables & functions", function () { + it("|options| contains options", function () { + var parser = peg_1.generate(["{ var result; }", "start = !{ result = options; return false; } { return result; }"].join("\n"), options); + expect$5(parser).to.parse("", { + a: 42 + }, { + a: 42 + }); + }); + it("|location| returns current location info", function () { + var parser = peg_1.generate(["{ var result; }", "start = line (nl+ line)* { return result; }", "line = thing (' '+ thing)*", "thing = digit / mark", "digit = [0-9]", "mark = !{ result = location(); return false; } 'x'", "nl = '\\r'? '\\n'"].join("\n"), options); + expect$5(parser).to.parse("1\n2\n\n3\n\n\n4 5 x", { + start: { + offset: 13, + line: 7, + column: 5 + }, + end: { + offset: 13, + line: 7, + column: 5 + } + }); + expect$5(parser).to.parse("1\nx", { + start: { + offset: 2, + line: 2, + column: 1 + }, + end: { + offset: 2, + line: 2, + column: 1 + } + }); + expect$5(parser).to.parse("1\r\nx", { + start: { + offset: 3, + line: 2, + column: 1 + }, + end: { + offset: 3, + line: 2, + column: 1 + } + }); + }); + }); + }); + describe("group", function () { + describe("when the expression matches", function () { + it("returns its match result", function () { + var parser = peg_1.generate("start = ('a')", options); + expect$5(parser).to.parse("a", "a"); + }); + }); + describe("when the expression doesn't match", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = ('a')", options); + expect$5(parser).to.failToParse("b"); + }); + }); + }); + describe("optional", function () { + describe("when the expression matches", function () { + it("returns its match result", function () { + var parser = peg_1.generate("start = 'a'?", options); + expect$5(parser).to.parse("a", "a"); + }); + }); + describe("when the expression doesn't match", function () { + it("returns |null|", function () { + var parser = peg_1.generate("start = 'a'?", options); + expect$5(parser).to.parse("", null); + }); + }); + }); + describe("zero or more", function () { + describe("when the expression matches zero or more times", function () { + it("returns an array of its match results", function () { + var parser = peg_1.generate("start = 'a'*", options); + expect$5(parser).to.parse("", []); + expect$5(parser).to.parse("a", ["a"]); + expect$5(parser).to.parse("aaa", ["a", "a", "a"]); + }); + }); + }); + describe("one or more", function () { + describe("when the expression matches one or more times", function () { + it("returns an array of its match results", function () { + var parser = peg_1.generate("start = 'a'+", options); + expect$5(parser).to.parse("a", ["a"]); + expect$5(parser).to.parse("aaa", ["a", "a", "a"]); + }); + }); + describe("when the expression doesn't match", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = 'a'+", options); + expect$5(parser).to.failToParse(""); + }); + }); + }); + describe("text", function () { + describe("when the expression matches", function () { + it("returns the matched text", function () { + var parser = peg_1.generate("start = $('a' 'b' 'c')", options); + expect$5(parser).to.parse("abc", "abc"); + }); + }); + describe("when the expression doesn't match", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = $('a')", options); + expect$5(parser).to.failToParse("b"); + }); + }); + }); + describe("positive simple predicate", function () { + describe("when the expression matches", function () { + it("returns |undefined|", function () { + var parser = peg_1.generate("start = &'a' 'a'", options); + expect$5(parser).to.parse("a", [void 0, "a"]); + }); + it("resets parse position", function () { + var parser = peg_1.generate("start = &'a' 'a'", options); + expect$5(parser).to.parse("a"); + }); + }); + describe("when the expression doesn't match", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = &'a'", options); + expect$5(parser).to.failToParse("b"); + }); + it("doesn't discard any expectations recorded when matching the expression", function () { + var parser = peg_1.generate("start = 'a' / &'b' / 'c'", options); + expect$5(parser).to.failToParse("d", { + expected: [{ + type: "literal", + text: "a", + ignoreCase: false + }, { + type: "literal", + text: "b", + ignoreCase: false + }, { + type: "literal", + text: "c", + ignoreCase: false + }] + }); + }); + it("records expectations from right place", function () { + var parser = peg_1.generate("start = 'a' / &'b' .", options); + expect$5(parser).to.failToParse("d", { + expected: [{ + type: "literal", + text: "a", + ignoreCase: false + }, { + type: "literal", + text: "b", + ignoreCase: false + }] + }); + }); + }); + }); + describe("negative simple predicate", function () { + describe("when the expression matches", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = !'a'", options); + expect$5(parser).to.failToParse("a"); + }); + }); + describe("when the expression doesn't match", function () { + it("returns |undefined|", function () { + var parser = peg_1.generate("start = !'a' 'b'", options); + expect$5(parser).to.parse("b", [void 0, "b"]); + }); + it("resets parse position", function () { + var parser = peg_1.generate("start = !'a' 'b'", options); + expect$5(parser).to.parse("b"); + }); + it("inverts any expectations recorded when matching the expression", function () { + var parser = peg_1.generate("start = 'a' / !'b' / 'c'", options); + expect$5(parser).to.failToParse("b", { + expected: [{ + type: "literal", + text: "a", + ignoreCase: false + }, { + type: "not", + expected: { + type: "literal", + text: "b", + ignoreCase: false + } + }, { + type: "literal", + text: "c", + ignoreCase: false + }] + }); + }); + it("records expectations from right place", function () { + var parser = peg_1.generate("start = 'a' / !'b' .", options); + expect$5(parser).to.failToParse("b", { + expected: [{ + type: "literal", + text: "a", + ignoreCase: false + }, { + type: "not", + expected: { + type: "literal", + text: "b", + ignoreCase: false + } + }] + }); + }); + it("reports not inverted expectations when the expression inverted twice", function () { + var parser = peg_1.generate("start = !(!'a')", options); + expect$5(parser).to.failToParse("b", { + expected: [{ + type: "literal", + text: "a", + ignoreCase: false + }] + }); + }); + }); + }); + describe("label", function () { + describe("when the expression matches", function () { + it("returns its match result", function () { + var parser = peg_1.generate("start = a:'a'", options); + expect$5(parser).to.parse("a", "a"); + }); + }); + describe("when the expression doesn't match", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = a:'a'", options); + expect$5(parser).to.failToParse("b"); + }); + }); + }); + describe("sequence", function () { + describe("when all expressions match", function () { + function parser(description, edgecases) { + it(description, function () { + edgecases.forEach(function (_ref) { + var grammar = _ref.grammar, + input = _ref.input, + output = _ref.output; + var parser = peg_1.generate(grammar, options); + expect$5(parser).to.parse(input, output); + }); + }); + } + + parser("returns an array of their match results", [{ + grammar: "start = 'a' 'b' 'c'", + input: "abc", + output: ["a", "b", "c"] + }]); + parser("plucking a single value", [{ + grammar: "start = @'a'", + input: "a", + output: "a" + }, { + grammar: "start = @'a' / @'b'", + input: "a", + output: "a" + }, { + grammar: "start = @'a' / @'b'", + input: "b", + output: "b" + }, { + grammar: "start = 'a' @'b' 'c'", + input: "abc", + output: "b" + }, { + grammar: "start = 'a' ( @'b' 'c' )", + input: "abc", + output: ["a", "b"] + }, { + grammar: "start = 'a' @( 'b' @'c' 'd' )", + input: "abcd", + output: "c" + }, { + grammar: "start = 'a' ( @'b' 'c' ) @'d'", + input: "abcd", + output: "d" + }, { + grammar: "start = 'a' @'b' 'c' / 'd' 'e' @'f'", + input: "def", + output: "f" + }]); + parser("plucking multiple values", [{ + grammar: "start = 'a' @'b' @'c'", + input: "abc", + output: ["b", "c"] + }, { + grammar: "start = 'a' ( @'b' @'c' )", + input: "abc", + output: ["a", ["b", "c"]] + }, { + grammar: "start = 'a' @( 'b' @'c' @'d' )", + input: "abcd", + output: ["c", "d"] + }, { + grammar: "start = 'a' @( @'b' 'c' ) @'d' 'e'", + input: "abcde", + output: ["b", "d"] + }, { + grammar: "start = 'a' @'b' 'c' / @'d' 'e' @'f'", + input: "def", + output: ["d", "f"] + }]); + parser("plucking a value if a predicate doesnt fail", [{ + grammar: "start = @'a' &{ return true; }", + input: "a", + output: "a" + }, { + grammar: "start = @'a' !{ return false; }", + input: "a", + output: "a" + }, { + grammar: "start = @n:[0-9] &{ return n > 0; }", + input: "2", + output: "2" + }]); + }); + describe("when any expression doesn't match", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = 'a' 'b' 'c'", options); + expect$5(parser).to.failToParse("dbc"); + expect$5(parser).to.failToParse("adc"); + expect$5(parser).to.failToParse("abd"); + }); + it("resets parse position", function () { + var parser = peg_1.generate("start = 'a' 'b' / 'a'", options); + expect$5(parser).to.parse("a", "a"); + }); + }); + }); + describe("action", function () { + describe("when the expression matches", function () { + it("returns the value returned by the code", function () { + var parser = peg_1.generate("start = 'a' { return 42; }", options); + expect$5(parser).to.parse("a", 42); + }); + describe("label variables", function () { + describe("in the expression", function () { + it("can access variable defined by labeled expression", function () { + var parser = peg_1.generate("start = a:'a' { return a; }", options); + expect$5(parser).to.parse("a", "a"); + }); + it("can access variables defined by labeled sequence elements", function () { + var parser = peg_1.generate("start = a:'a' b:'b' c:'c' { return [a, b, c]; }", options); + expect$5(parser).to.parse("abc", ["a", "b", "c"]); + }); + it("cannot access variables defined by subexpressions", function () { + var testcases = [{ + grammar: "start = (a:'a') { return a; }", + input: "a" + }, { + grammar: "start = (a:'a')? { return a; }", + input: "a" + }, { + grammar: "start = (a:'a')* { return a; }", + input: "a" + }, { + grammar: "start = (a:'a')+ { return a; }", + input: "a" + }, { + grammar: "start = $(a:'a') { return a; }", + input: "a" + }, { + grammar: "start = &(a:'a') 'a' { return a; }", + input: "a" + }, { + grammar: "start = !(a:'a') 'b' { return a; }", + input: "b" + }, { + grammar: "start = b:(a:'a') { return a; }", + input: "a" + }, { + grammar: "start = ('a' b:'b' 'c') { return b; }", + input: "abc" + }, { + grammar: "start = (a:'a' { return a; }) { return a; }", + input: "a" + }, { + grammar: "start = ('a' / b:'b' / 'c') { return b; }", + input: "b" + }]; + testcases.forEach(function (testcase) { + var parser = peg_1.generate(testcase.grammar, options); + expect$5(parser).to.failToParse(testcase.input); + }); + }); + }); + describe("in outer sequence", function () { + it("can access variables defined by preceding labeled elements", function () { + var parser = peg_1.generate("start = a:'a' ('b' { return a; })", options); + expect$5(parser).to.parse("ab", ["a", "a"]); + }); + it("cannot access variable defined by labeled action element", function () { + var parser = peg_1.generate("start = 'a' b:('b' { return b; }) c:'c'", options); + expect$5(parser).to.failToParse("abc"); + }); + it("cannot access variables defined by following labeled elements", function () { + var parser = peg_1.generate("start = ('a' { return b; }) b:'b'", options); + expect$5(parser).to.failToParse("ab"); + }); + }); + }); + describe("initializer variables & functions", function () { + it("can access variables defined in the initializer", function () { + var parser = peg_1.generate(["{ var v = 42 }", "start = 'a' { return v; }"].join("\n"), options); + expect$5(parser).to.parse("a", 42); + }); + it("can access functions defined in the initializer", function () { + var parser = peg_1.generate(["{ function f() { return 42; } }", "start = 'a' { return f(); }"].join("\n"), options); + expect$5(parser).to.parse("a", 42); + }); + }); + describe("available variables & functions", function () { + it("|options| contains options", function () { + var parser = peg_1.generate("start = 'a' { return options; }", options); + expect$5(parser).to.parse("a", { + a: 42 + }, { + a: 42 + }); + }); + it("|text| returns text matched by the expression", function () { + var parser = peg_1.generate("start = 'a' { return text(); }", options); + expect$5(parser).to.parse("a", "a"); + }); + it("|location| returns location info of the expression", function () { + var parser = peg_1.generate(["{ var result; }", "start = line (nl+ line)* { return result; }", "line = thing (' '+ thing)*", "thing = digit / mark", "digit = [0-9]", "mark = 'x' { result = location(); }", "nl = '\\r'? '\\n'"].join("\n"), options); + expect$5(parser).to.parse("1\n2\n\n3\n\n\n4 5 x", { + start: { + offset: 13, + line: 7, + column: 5 + }, + end: { + offset: 14, + line: 7, + column: 6 + } + }); + expect$5(parser).to.parse("1\nx", { + start: { + offset: 2, + line: 2, + column: 1 + }, + end: { + offset: 3, + line: 2, + column: 2 + } + }); + expect$5(parser).to.parse("1\r\nx", { + start: { + offset: 3, + line: 2, + column: 1 + }, + end: { + offset: 4, + line: 2, + column: 2 + } + }); + }); + describe("|expected|", function () { + it("terminates parsing and throws an exception", function () { + var parser = peg_1.generate("start = 'a' { expected('a'); }", options); + expect$5(parser).to.failToParse("a", { + message: "Expected a but \"a\" found.", + expected: [{ + type: "other", + description: "a" + }], + found: "a", + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 1, + line: 1, + column: 2 + } + } + }); + }); + it("allows to set custom location info", function () { + var parser = peg_1.generate(["start = 'a' {", " expected('a', {", " start: { offset: 1, line: 1, column: 2 },", " end: { offset: 2, line: 1, column: 3 }", " });", "}"].join("\n"), options); + expect$5(parser).to.failToParse("a", { + message: "Expected a but \"a\" found.", + expected: [{ + type: "other", + description: "a" + }], + found: "a", + location: { + start: { + offset: 1, + line: 1, + column: 2 + }, + end: { + offset: 2, + line: 1, + column: 3 + } + } + }); + }); + }); + describe("|error|", function () { + it("terminates parsing and throws an exception", function () { + var parser = peg_1.generate("start = 'a' { error('a'); }", options); + expect$5(parser).to.failToParse("a", { + message: "a", + found: null, + expected: null, + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 1, + line: 1, + column: 2 + } + } + }); + }); + it("allows to set custom location info", function () { + var parser = peg_1.generate(["start = 'a' {", " error('a', {", " start: { offset: 1, line: 1, column: 2 },", " end: { offset: 2, line: 1, column: 3 }", " });", "}"].join("\n"), options); + expect$5(parser).to.failToParse("a", { + message: "a", + expected: null, + found: null, + location: { + start: { + offset: 1, + line: 1, + column: 2 + }, + end: { + offset: 2, + line: 1, + column: 3 + } + } + }); + }); + }); + }); + }); + describe("when the expression doesn't match", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = 'a' { return 42; }", options); + expect$5(parser).to.failToParse("b"); + }); + it("doesn't execute the code", function () { + var parser = peg_1.generate("start = 'a' { throw 'Boom!'; } / 'b'", options); + expect$5(parser).to.parse("b"); + }); + }); + }); + describe("choice", function () { + describe("when any expression matches", function () { + it("returns its match result", function () { + var parser = peg_1.generate("start = 'a' / 'b' / 'c'", options); + expect$5(parser).to.parse("a", "a"); + expect$5(parser).to.parse("b", "b"); + expect$5(parser).to.parse("c", "c"); + }); + }); + describe("when all expressions don't match", function () { + it("reports match failure", function () { + var parser = peg_1.generate("start = 'a' / 'b' / 'c'", options); + expect$5(parser).to.failToParse("d"); + }); + }); + }); + describe("error reporting", function () { + describe("behavior", function () { + it("reports only the rightmost error", function () { + var parser = peg_1.generate("start = 'a' 'b' / 'a' 'c' 'd'", options); + expect$5(parser).to.failToParse("ace", { + expected: [{ + type: "literal", + text: "d", + ignoreCase: false + }] + }); + }); + }); + describe("expectations reporting", function () { + it("reports expectations correctly with no alternative", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("ab", { + expected: [{ + type: "end" + }] + }); + }); + it("reports expectations correctly with one alternative", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("b", { + expected: [{ + type: "literal", + text: "a", + ignoreCase: false + }] + }); + }); + it("reports expectations correctly with multiple alternatives", function () { + var parser = peg_1.generate("start = 'a' / 'b' / 'c'", options); + expect$5(parser).to.failToParse("d", { + expected: [{ + type: "literal", + text: "a", + ignoreCase: false + }, { + type: "literal", + text: "b", + ignoreCase: false + }, { + type: "literal", + text: "c", + ignoreCase: false + }] + }); + }); + it("reports expectations correctly with look ahead", function () { + var parser = peg_1.generate(["Statement = '{' __ !Statement Statement __ '}'", "__ = [ ]*"].join("\n"), options); + expect$5(parser).to.failToParse("{x}", { + expected: [{ + type: "class", + parts: [" "], + inverted: false, + ignoreCase: false + }, { + type: "not", + expected: { + type: "literal", + text: "{", + ignoreCase: false + } + }, { + type: "literal", + text: "{", + ignoreCase: false + }] + }); + parser = peg_1.generate(["Start = Char+ End", "End = 'e'", "Char = !End [a-z]"].join("\n"), options); + expect$5(parser).to.failToParse("a", { + expected: [{ + type: "class", + parts: [["a", "z"]], + inverted: false, + ignoreCase: false + }, { + type: "literal", + text: "e", + ignoreCase: false + }] + }); + }); + it("reports expectations correctly with look ahead + grouped names", function () { + var parser = peg_1.generate(["Start = Char+ End", "End 'end' = 'e'", "Char = !End [a-z]"].join("\n"), options); + expect$5(parser).to.failToParse("a", { + expected: [{ + type: "class", + parts: [["a", "z"]], + inverted: false, + ignoreCase: false + }, { + type: "other", + description: "end" + }] + }); + }); + }); + describe("found string reporting", function () { + it("reports found string correctly at the end of input", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("", { + found: null + }); + }); + it("reports found string correctly in the middle of input", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("b", { + found: "b" + }); + }); + }); + describe("message building", function () { + it("builds message correctly with no alternative", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("ab", { + message: "Expected end of input but \"b\" found." + }); + }); + it("builds message correctly with one alternative", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("b", { + message: "Expected \"a\" but \"b\" found." + }); + }); + it("builds message correctly with multiple alternatives", function () { + var parser = peg_1.generate("start = 'a' / 'b' / 'c'", options); + expect$5(parser).to.failToParse("d", { + message: "Expected \"a\", \"b\", or \"c\" but \"d\" found." + }); + }); + it("builds message correctly at the end of input", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("", { + message: "Expected \"a\" but end of input found." + }); + }); + it("builds message correctly in the middle of input", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("b", { + message: "Expected \"a\" but \"b\" found." + }); + }); + it("removes duplicates from expectations", function () { + var parser = peg_1.generate("start = 'a' / 'a'", options); + expect$5(parser).to.failToParse("b", { + message: "Expected \"a\" but \"b\" found." + }); + }); + it("sorts expectations", function () { + var parser = peg_1.generate("start = 'c' / 'b' / 'a'", options); + expect$5(parser).to.failToParse("d", { + message: "Expected \"a\", \"b\", or \"c\" but \"d\" found." + }); + }); + }); + describe("position reporting", function () { + it("reports position correctly at the end of input", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("", { + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 0, + line: 1, + column: 1 + } + } + }); + }); + it("reports position correctly in the middle of input", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("b", { + location: { + start: { + offset: 0, + line: 1, + column: 1 + }, + end: { + offset: 1, + line: 1, + column: 2 + } + } + }); + }); + it("reports position correctly with trailing input", function () { + var parser = peg_1.generate("start = 'a'", options); + expect$5(parser).to.failToParse("aa", { + location: { + start: { + offset: 1, + line: 1, + column: 2 + }, + end: { + offset: 2, + line: 1, + column: 3 + } + } + }); + }); + it("reports position correctly in complex cases", function () { + var parser = peg_1.generate(["start = line (nl+ line)*", "line = digit (' '+ digit)*", "digit = [0-9]", "nl = '\\r'? '\\n'"].join("\n"), options); + expect$5(parser).to.failToParse("1\n2\n\n3\n\n\n4 5 x", { + location: { + start: { + offset: 13, + line: 7, + column: 5 + }, + end: { + offset: 14, + line: 7, + column: 6 + } + } + }); + expect$5(parser).to.failToParse("1\nx", { + location: { + start: { + offset: 2, + line: 2, + column: 1 + }, + end: { + offset: 3, + line: 2, + column: 2 + } + } + }); + expect$5(parser).to.failToParse("1\r\nx", { + location: { + start: { + offset: 3, + line: 2, + column: 1 + }, + end: { + offset: 4, + line: 2, + column: 2 + } + } + }); + }); + }); + }); + describe("complex examples", function () { + it("handles arithmetics example correctly", function () { + var parser = peg_1.generate(["Expr = Sum", "Sum = head:Product tail:(('+' / '-') Product)* {", " return tail.reduce(function(result, element) {", " if (element[0] === '+') { return result + element[1]; }", " if (element[0] === '-') { return result - element[1]; }", " }, head);", " }", "Product = head:Value tail:(('*' / '/') Value)* {", " return tail.reduce(function(result, element) {", " if (element[0] === '*') { return result * element[1]; }", " if (element[0] === '/') { return result / element[1]; }", " }, head);", " }", "Value = digits:[0-9]+ { return parseInt(digits.join(''), 10); }", " / '(' expr:Expr ')' { return expr; }"].join("\n"), options); + expect$5(parser).to.parse("0", 0); + expect$5(parser).to.parse("123", 123); + expect$5(parser).to.parse("(42+43)", 42 + 43); + expect$5(parser).to.parse("42", 42); + expect$5(parser).to.parse("42*43", 42 * 43); + expect$5(parser).to.parse("42*43*44*45", 42 * 43 * 44 * 45); + expect$5(parser).to.parse("42/43", 42 / 43); + expect$5(parser).to.parse("42/43/44/45", 42 / 43 / 44 / 45); + expect$5(parser).to.parse("42*43", 42 * 43); + expect$5(parser).to.parse("42*43+44*45", 42 * 43 + 44 * 45); + expect$5(parser).to.parse("42*43+44*45+46*47+48*49", 42 * 43 + 44 * 45 + 46 * 47 + 48 * 49); + expect$5(parser).to.parse("42*43-44*45", 42 * 43 - 44 * 45); + expect$5(parser).to.parse("42*43-44*45-46*47-48*49", 42 * 43 - 44 * 45 - 46 * 47 - 48 * 49); + expect$5(parser).to.parse("42+43", 42 + 43); + expect$5(parser).to.parse("(1+2)*(3+4)", (1 + 2) * (3 + 4)); + }); + it("handles non-context-free language correctly", function () { + var parser = peg_1.generate(["S = &(A 'c') a:'a'+ B:B !('a' / 'b' / 'c') { return a.join('') + B; }", "A = a:'a' A:A? b:'b' { return [a, A, b].join(''); }", "B = b:'b' B:B? c:'c' { return [b, B, c].join(''); }"].join("\n"), options); + expect$5(parser).to.parse("abc", "abc"); + expect$5(parser).to.parse("aaabbbccc", "aaabbbccc"); + expect$5(parser).to.failToParse("aabbbccc"); + expect$5(parser).to.failToParse("aaaabbbccc"); + expect$5(parser).to.failToParse("aaabbccc"); + expect$5(parser).to.failToParse("aaabbbbccc"); + expect$5(parser).to.failToParse("aaabbbcc"); + expect$5(parser).to.failToParse("aaabbbcccc"); + }); + it("handles nested comments example correctly", function () { + var parser = peg_1.generate(["C = begin:Begin ns:N* end:End { return begin + ns.join('') + end; }", "N = C", " / !Begin !End z:Z { return z; }", "Z = .", "Begin = '(*'", "End = '*)'"].join("\n"), options); + expect$5(parser).to.parse("(**)", "(**)"); + expect$5(parser).to.parse("(*abc*)", "(*abc*)"); + expect$5(parser).to.parse("(*(**)*)", "(*(**)*)"); + expect$5(parser).to.parse("(*abc(*def*)ghi(*(*(*jkl*)*)*)mno*)", "(*abc(*def*)ghi(*(*(*jkl*)*)*)mno*)"); + }); + }); + }); + }); + + let plugins = []; + + var chaiLike = function(_chai, utils) { + function isType(type, target) { + return utils.type(target).toUpperCase() === type.toUpperCase(); + } + + function like(object, expected) { + for (let validator of plugins) { + if (validator.match(object, expected)) { + return validator.assert(object, expected); + } + } + + // Early check for optimization and prevent recursion failures + if (object === expected) { + return true; + } + + if (isType('object', expected) && isType('object', object)) { + for (let key of Object.keys(expected)) { + if (!(key in object)) { + return false; + } + if (!like(object[key], expected[key])) { + return false; + } + } + return true; + } + + if (isType('array', expected) && isType('array', object)) { + if (object.length !== expected.length) { + return false; + } + for (let i = 0; i < expected.length; i++) { + if (!like(object[i], expected[i])) { + return false; + } + } + return true; + } + + // Special case for RegExps because literal regexp (/.../) not equal new RegExp(...) + if (isType('RegExp', object) && isType('RegExp', expected)) { + return object.toString() === expected.toString(); + } + + if (isType('Date', object) && isType('Date', expected)) { + return object.getTime() === expected.getTime(); + } + + // Do reflexed compare so primitives and object wrappers will be equal + if (isType('string', object) && isType('string', expected) + || isType('number', object) && isType('number', expected) + || isType('boolean', object) && isType('boolean', expected) + ) { + return object == expected; + } + + return false; + } + + _chai.Assertion.addMethod('like', function(expected) { + let object = utils.flag(this, 'object'); + this.assert( + like(object, expected), + 'expected #{this} to be like #{exp}', + 'expected #{this} to not like #{exp}', + expected, object, + _chai.config.showDiff + ); + }); + }; + + var extend$1 = function(plugin) { + plugins.push(plugin); + }; + + var clearPlugins = function() { + plugins = []; + }; + chaiLike.extend = extend$1; + chaiLike.clearPlugins = clearPlugins; + + var chaiLike$1 = chaiLike; + + var Session$1 = peg_1.compiler.Session; + + var helpers = function helpers(chai, utils) { + chai.use(chaiLike$1); + var Assertion = chai.Assertion; + + function parse(grammar, session, options) { + var ast = session.parse(grammar); + + if (!options.allowedStartRules) { + options.allowedStartRules = ast.rules.length > 0 ? [ast.rules[0].name] : []; + } + + return ast; + } + + Assertion.addMethod("changeAST", function (grammar, props, options, additionalRuleProps) { + options = typeof options !== "undefined" ? options : {}; + additionalRuleProps = typeof additionalRuleProps !== "undefined" ? additionalRuleProps : { + reportFailures: true + }; + var session = new Session$1({ + grammar: grammar + }); + var ast = parse(grammar, session, options); + ast.rules = ast.rules.map(function (rule) { + return Object.assign(rule, additionalRuleProps); + }); + utils.flag(this, "object")(ast, session, options); + new Assertion(ast).like(props); + }); + Assertion.addMethod("reportError", function (grammar, props, options) { + options = typeof options !== "undefined" ? options : {}; + var session = new Session$1({ + grammar: grammar + }); + var ast = parse(grammar, session, options); + var passed, result; + + try { + utils.flag(this, "object")(ast, session, options); + passed = true; + } catch (e) { + result = e; + passed = false; + } + + this.assert(!passed, "expected #{this} to report an error but it didn't", "expected #{this} to not report an error but #{act} was reported", null, result); + + if (!passed && typeof props !== "undefined") { + if (typeof props === "string") props = { + message: props + }; + Object.keys(props).forEach(function (key) { + new Assertion(result).to.have.property(key).that.is.deep.equal(props[key]); + }); + } + }); + Assertion.addMethod("reportWarning", function (grammar, warnings, options) { + var _this = this; + + warnings = Array.isArray(warnings) ? warnings : warnings == null ? [] : [warnings]; + options = typeof options !== "undefined" ? options : {}; + var messages = []; + + function warn(message) { + messages.push(message); + } + + var session = new Session$1({ + grammar: grammar, + warn: warn + }); + var ast = parse(grammar, session, options); + utils.flag(this, "object")(ast, session, options); + var messagesCount = messages.length; + var warningsCount = warnings.length; + if (warnings.length) this.assert(messagesCount === warningsCount, "expected #{this} to report ".concat(warningsCount, " warnings, but it reported ").concat(messagesCount, " warnings"), "expected #{this} to not report ".concat(warningsCount, " warnings"), warnings, messages); + warnings.forEach(function (warning) { + _this.assert(messages.indexOf(warning) !== -1, "expected #{this} to report the warning #{exp}, but it didn't", "expected #{this} to not report the warning #{exp}", warning); + }); + }); + }; + + var pass = peg_1.compiler.passes.generate.generateBytecode; + chai$1.use(helpers); + var expect$6 = chai$1.expect; + describe("compiler pass |generateBytecode|", function () { + function bytecodeDetails(bytecode) { + return { + rules: [{ + bytecode: bytecode + }] + }; + } + + function constsDetails(literals, classes, expectations, functions) { + return { + literals: literals, + classes: classes, + expectations: expectations, + functions: functions + }; + } + + describe("for grammar", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(["a = 'a'", "b = 'b'", "c = 'c'"].join("\n"), { + rules: [{ + bytecode: [23, 0, 18, 0, 2, 1, 22, 0, 3] + }, { + bytecode: [23, 1, 18, 1, 2, 1, 22, 1, 3] + }, { + bytecode: [23, 2, 18, 2, 2, 1, 22, 2, 3] + }] + }); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(["a = 'a'", "b = 'b'", "c = 'c'"].join("\n"), constsDetails(["a", "b", "c"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }, { + type: "literal", + value: "b", + ignoreCase: false + }, { + type: "literal", + value: "c", + ignoreCase: false + }], [])); + }); + }); + describe("for rule", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST("start = 'a'", bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3])); + }); + }); + describe("for named", function () { + var grammar1 = "start 'start' = ."; + var grammar2 = "start 'start' = 'a'"; + var grammar3 = "start 'start' = [a]"; + describe("when |reportFailures=true|", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar1, bytecodeDetails([23, 0, 28, 17, 2, 1, 21, 1, 3, 29])); + expect$6(pass).to.changeAST(grammar2, bytecodeDetails([23, 0, 28, 18, 0, 2, 1, 22, 0, 3, 29])); + expect$6(pass).to.changeAST(grammar3, bytecodeDetails([23, 0, 28, 20, 0, 2, 1, 21, 1, 3, 29])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar1, constsDetails([], [], [{ + type: "rule", + value: "start" + }], [])); + expect$6(pass).to.changeAST(grammar2, constsDetails(["a"], [], [{ + type: "rule", + value: "start" + }], [])); + expect$6(pass).to.changeAST(grammar3, constsDetails([], [{ + value: ["a"], + inverted: false, + ignoreCase: false + }], [{ + type: "rule", + value: "start" + }], [])); + }); + }); + describe("when |reportFailures=false|", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar1, bytecodeDetails([17, 2, 1, 21, 1, 3]), {}, { + reportFailures: false + }); + expect$6(pass).to.changeAST(grammar2, bytecodeDetails([18, 0, 2, 1, 22, 0, 3]), {}, { + reportFailures: false + }); + expect$6(pass).to.changeAST(grammar3, bytecodeDetails([20, 0, 2, 1, 21, 1, 3]), {}, { + reportFailures: false + }); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar1, constsDetails([], [], [], []), {}, { + reportFailures: false + }); + expect$6(pass).to.changeAST(grammar2, constsDetails(["a"], [], [], []), {}, { + reportFailures: false + }); + expect$6(pass).to.changeAST(grammar3, constsDetails([], [{ + value: ["a"], + inverted: false, + ignoreCase: false + }], [], []), {}, { + reportFailures: false + }); + }); + }); + }); + describe("for choice", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST("start = 'a' / 'b' / 'c'", bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3, 14, 23, 0, 6, 23, 1, 18, 1, 2, 1, 22, 1, 3, 14, 10, 0, 6, 23, 2, 18, 2, 2, 1, 22, 2, 3])); + }); + }); + describe("for action", function () { + describe("without labels", function () { + var grammar = "start = 'a' { code }"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 6, 0, 24, 1, 26, 0, 1, 0, 9])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }], [{ + predicate: false, + params: [], + body: " code " + }])); + }); + }); + describe("with one label", function () { + var grammar = "start = a:'a' { code }"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 7, 0, 24, 1, 26, 0, 1, 1, 0, 9])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }], [{ + predicate: false, + params: ["a"], + body: " code " + }])); + }); + }); + describe("with multiple labels", function () { + var grammar = "start = a:'a' b:'b' c:'c' { code }"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 41, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 25, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 9, 4, 24, 3, 26, 0, 4, 3, 2, 1, 0, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a", "b", "c"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }, { + type: "literal", + value: "b", + ignoreCase: false + }, { + type: "literal", + value: "c", + ignoreCase: false + }], [{ + predicate: false, + params: ["a", "b", "c"], + body: " code " + }])); + }); + }); + }); + describe("for sequence", function () { + var grammar = "start = 'a' 'b' 'c'"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 35, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 19, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 3, 4, 11, 3, 9, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a", "b", "c"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }, { + type: "literal", + value: "b", + ignoreCase: false + }, { + type: "literal", + value: "c", + ignoreCase: false + }], [])); + }); + it("generates correct plucking bytecode", function () { + expect$6(pass).to.changeAST("start = 'a' @'b' 'c'", bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 36, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 20, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 4, 4, 41, 4, 1, 1, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); + expect$6(pass).to.changeAST("start = 'a' @'b' @'c'", bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 37, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 21, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 5, 4, 41, 4, 2, 1, 0, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); + }); + }); + describe("for labeled", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST("start = a:'a'", bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3])); + }); + }); + describe("for text", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST("start = $'a'", bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 2, 1, 6, 12, 9])); + }); + }); + describe("for simple_and", function () { + var grammar = "start = &'a'"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 38, 23, 0, 18, 0, 2, 1, 22, 0, 3, 39, 0, 15, 3, 3, 6, 7, 1, 6, 6, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }], [])); + }); + }); + describe("for simple_not", function () { + var grammar = "start = !'a'"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 38, 23, 0, 18, 0, 2, 1, 22, 0, 3, 39, 1, 14, 3, 3, 6, 6, 1, 6, 7, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }], [])); + }); + }); + describe("for optional", function () { + var grammar = "start = 'a'?"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3, 14, 2, 0, 6, 2])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }], [])); + }); + }); + describe("for zero_or_more", function () { + var grammar = "start = 'a'*"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([4, 23, 0, 18, 0, 2, 1, 22, 0, 3, 16, 10, 10, 23, 0, 18, 0, 2, 1, 22, 0, 3, 6])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }], [])); + }); + }); + describe("for one_or_more", function () { + var grammar = "start = 'a'+"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([4, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 13, 3, 16, 10, 10, 23, 0, 18, 0, 2, 1, 22, 0, 3, 6, 6, 6, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }], [])); + }); + }); + describe("for group", function () { + var grammar = "start = ('a')"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }], [])); + }); + }); + describe("for semantic_and", function () { + describe("without labels", function () { + var grammar = "start = &{ code }"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([25, 26, 0, 0, 0, 13, 2, 2, 6, 1, 6, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], [{ + predicate: true, + params: [], + body: " code " + }])); + }); + }); + describe("with labels", function () { + var grammar = "start = a:'a' b:'b' c:'c' &{ code }"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 57, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 41, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 25, 4, 25, 26, 0, 0, 3, 2, 1, 0, 13, 2, 2, 6, 1, 6, 3, 15, 3, 4, 11, 4, 9, 8, 4, 7, 3, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a", "b", "c"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }, { + type: "literal", + value: "b", + ignoreCase: false + }, { + type: "literal", + value: "c", + ignoreCase: false + }], [{ + predicate: true, + params: ["a", "b", "c"], + body: " code " + }])); + }); + }); + }); + describe("for semantic_not", function () { + describe("without labels", function () { + var grammar = "start = !{ code }"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([25, 26, 0, 0, 0, 13, 2, 2, 6, 3, 6, 1])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], [{ + predicate: true, + params: [], + body: " code " + }])); + }); + }); + describe("with labels", function () { + var grammar = "start = a:'a' b:'b' c:'c' !{ code }"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 57, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 41, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 25, 4, 25, 26, 0, 0, 3, 2, 1, 0, 13, 2, 2, 6, 3, 6, 1, 15, 3, 4, 11, 4, 9, 8, 4, 7, 3, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a", "b", "c"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }, { + type: "literal", + value: "b", + ignoreCase: false + }, { + type: "literal", + value: "c", + ignoreCase: false + }], [{ + predicate: true, + params: ["a", "b", "c"], + body: " code " + }])); + }); + }); + }); + describe("for rule_ref", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(["start = other", "other = 'other'"].join("\n"), { + rules: [{ + bytecode: [27, 1] + }, {}] + }); + }); + }); + describe("for literal", function () { + describe("when |reportFailures=true|", function () { + describe("empty", function () { + var grammar = "start = ''"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([0])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], [])); + }); + }); + describe("non-empty case-sensitive", function () { + var grammar = "start = 'a'"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "a", + ignoreCase: false + }], [])); + }); + }); + describe("non-empty case-insensitive", function () { + var grammar = "start = 'A'i"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 19, 0, 2, 1, 21, 1, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ + type: "literal", + value: "A", + ignoreCase: true + }], [])); + }); + }); + }); + describe("when |reportFailures=false|", function () { + describe("empty", function () { + var grammar = "start = ''"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([0]), {}, { + reportFailures: false + }); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], []), {}, { + reportFailures: false + }); + }); + }); + describe("non-empty case-sensitive", function () { + var grammar = "start = 'a'"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([18, 0, 2, 1, 22, 0, 3]), {}, { + reportFailures: false + }); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [], []), {}, { + reportFailures: false + }); + }); + }); + describe("non-empty case-insensitive", function () { + var grammar = "start = 'A'i"; + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([19, 0, 2, 1, 21, 1, 3]), {}, { + reportFailures: false + }); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [], []), {}, { + reportFailures: false + }); + }); + }); + }); + }); + describe("for class", function () { + describe("when |reportFailures=true|", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST("start = [a]", bytecodeDetails([23, 0, 20, 0, 2, 1, 21, 1, 3])); + }); + describe("non-inverted case-sensitive", function () { + it("defines correct constants", function () { + expect$6(pass).to.changeAST("start = [a]", constsDetails([], [{ + value: ["a"], + inverted: false, + ignoreCase: false + }], [{ + type: "class", + value: ["a"], + inverted: false, + ignoreCase: false + }], [])); + }); + }); + describe("inverted case-sensitive", function () { + it("defines correct constants", function () { + expect$6(pass).to.changeAST("start = [^a]", constsDetails([], [{ + value: ["a"], + inverted: true, + ignoreCase: false + }], [{ + type: "class", + value: ["a"], + inverted: true, + ignoreCase: false + }], [])); + }); + }); + describe("non-inverted case-insensitive", function () { + it("defines correct constants", function () { + expect$6(pass).to.changeAST("start = [a]i", constsDetails([], [{ + value: ["a"], + inverted: false, + ignoreCase: true + }], [{ + type: "class", + value: ["a"], + inverted: false, + ignoreCase: true + }], [])); + }); + }); + describe("complex", function () { + it("defines correct constants", function () { + expect$6(pass).to.changeAST("start = [ab-def-hij-l]", constsDetails([], [{ + value: ["a", ["b", "d"], "e", ["f", "h"], "i", ["j", "l"]], + inverted: false, + ignoreCase: false + }], [{ + type: "class", + value: ["a", ["b", "d"], "e", ["f", "h"], "i", ["j", "l"]], + inverted: false, + ignoreCase: false + }], [])); + }); + }); + }); + describe("when |reportFailures=false|", function () { + it("generates correct bytecode", function () { + expect$6(pass).to.changeAST("start = [a]", bytecodeDetails([20, 0, 2, 1, 21, 1, 3]), {}, { + reportFailures: false + }); + }); + describe("non-inverted case-sensitive", function () { + it("defines correct constants", function () { + expect$6(pass).to.changeAST("start = [a]", constsDetails([], [{ + value: ["a"], + inverted: false, + ignoreCase: false + }], [], []), {}, { + reportFailures: false + }); + }); + }); + describe("inverted case-sensitive", function () { + it("defines correct constants", function () { + expect$6(pass).to.changeAST("start = [^a]", constsDetails([], [{ + value: ["a"], + inverted: true, + ignoreCase: false + }], [], []), {}, { + reportFailures: false + }); + }); + }); + describe("non-inverted case-insensitive", function () { + it("defines correct constants", function () { + expect$6(pass).to.changeAST("start = [a]i", constsDetails([], [{ + value: ["a"], + inverted: false, + ignoreCase: true + }], [], []), {}, { + reportFailures: false + }); + }); + }); + describe("complex", function () { + it("defines correct constants", function () { + expect$6(pass).to.changeAST("start = [ab-def-hij-l]", constsDetails([], [{ + value: ["a", ["b", "d"], "e", ["f", "h"], "i", ["j", "l"]], + inverted: false, + ignoreCase: false + }], [], []), {}, { + reportFailures: false + }); + }); + }); + }); + }); + describe("for any", function () { + describe("when |reportFailures=true|", function () { + var grammar = "start = ."; + it("generates bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 17, 2, 1, 21, 1, 3])); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails([], [], [{ + type: "any" + }], [])); + }); + }); + describe("when |reportFailures=false|", function () { + var grammar = "start = ."; + it("generates bytecode", function () { + expect$6(pass).to.changeAST(grammar, bytecodeDetails([17, 2, 1, 21, 1, 3]), {}, { + reportFailures: false + }); + }); + it("defines correct constants", function () { + expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], []), {}, { + reportFailures: false + }); + }); + }); + }); + }); + + var pass$1 = peg_1.compiler.passes.generate.inferenceMatchResult; + chai$1.use(helpers); + var expect$7 = chai$1.expect; + describe("compiler pass |inferenceMatchResult|", function () { + it("calculate |match| property for |any| correctly", function () { + expect$7(pass$1).to.changeAST("start = . ", { + rules: [{ + match: 0 + }] + }, {}, {}); + }); + it("calculate |match| property for |literal| correctly", function () { + expect$7(pass$1).to.changeAST("start = '' ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = ''i ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = 'a' ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = 'a'i ", { + rules: [{ + match: 0 + }] + }, {}, {}); + }); + it("calculate |match| property for |class| correctly", function () { + expect$7(pass$1).to.changeAST("start = [] ", { + rules: [{ + match: -1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = []i ", { + rules: [{ + match: -1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [a] ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [a]i ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [a-b] ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [a-b]i ", { + rules: [{ + match: 0 + }] + }, {}, {}); + }); + it("calculate |match| property for |sequence| correctly", function () { + expect$7(pass$1).to.changeAST("start = 'a' 'b' ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = 'a' '' ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = '' 'b' ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = '' '' ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = 'a' [] ", { + rules: [{ + match: -1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [] 'b' ", { + rules: [{ + match: -1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [] [] ", { + rules: [{ + match: -1 + }] + }, {}, {}); + }); + it("calculate |match| property for |choice| correctly", function () { + expect$7(pass$1).to.changeAST("start = 'a' / 'b' ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = 'a' / '' ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = '' / 'b' ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = '' / '' ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = 'a' / [] ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [] / 'b' ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [] / [] ", { + rules: [{ + match: -1 + }] + }, {}, {}); + }); + it("calculate |match| property for predicates correctly", function () { + expect$7(pass$1).to.changeAST("start = &. ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = &'' ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = &[] ", { + rules: [{ + match: -1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = !. ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = !'' ", { + rules: [{ + match: -1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = ![] ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = &{ code } ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = !{ code } ", { + rules: [{ + match: 0 + }] + }, {}, {}); + }); + it("calculate |match| property for |text| correctly", function () { + expect$7(pass$1).to.changeAST("start = $. ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = $'' ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = $[] ", { + rules: [{ + match: -1 + }] + }, {}, {}); + }); + it("calculate |match| property for |action| correctly", function () { + expect$7(pass$1).to.changeAST("start = . { code }", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = '' { code }", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [] { code }", { + rules: [{ + match: -1 + }] + }, {}, {}); + }); + it("calculate |match| property for |labeled| correctly", function () { + expect$7(pass$1).to.changeAST("start = a:. ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = a:'' ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = a:[] ", { + rules: [{ + match: -1 + }] + }, {}, {}); + }); + it("calculate |match| property for |named| correctly", function () { + expect$7(pass$1).to.changeAST("start 'start' = . ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start 'start' = '' ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start 'start' = [] ", { + rules: [{ + match: -1 + }] + }, {}, {}); + }); + it("calculate |match| property for |optional| correctly", function () { + expect$7(pass$1).to.changeAST("start = .? ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = ''? ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = []? ", { + rules: [{ + match: 1 + }] + }, {}, {}); + }); + it("calculate |match| property for |zero_or_more| correctly", function () { + expect$7(pass$1).to.changeAST("start = .* ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = ''* ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = []* ", { + rules: [{ + match: 1 + }] + }, {}, {}); + }); + it("calculate |match| property for |one_or_more| correctly", function () { + expect$7(pass$1).to.changeAST("start = .+ ", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = ''+ ", { + rules: [{ + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = []+ ", { + rules: [{ + match: -1 + }] + }, {}, {}); + }); + it("calculate |match| property for |rule_ref| correctly", function () { + expect$7(pass$1).to.changeAST(["start = end", "end = . "].join("\n"), { + rules: [{ + match: 0 + }, { + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST(["start = end", "end = ''"].join("\n"), { + rules: [{ + match: 1 + }, { + match: 1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST(["start = end", "end = []"].join("\n"), { + rules: [{ + match: -1 + }, { + match: -1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = . start", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = '' start", { + rules: [{ + match: 0 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = [] start", { + rules: [{ + match: -1 + }] + }, {}, {}); + expect$7(pass$1).to.changeAST("start = . start []", { + rules: [{ + match: -1 + }] + }, {}, {}); + }); + }); + + var pass$2 = peg_1.compiler.passes.transform.removeProxyRules; + chai$1.use(helpers); + var expect$8 = chai$1.expect; + describe("compiler pass |removeProxyRules|", function () { + describe("when a proxy rule isn't listed in |allowedStartRules|", function () { + it("updates references and removes it", function () { + expect$8(pass$2).to.changeAST(["start = proxy", "proxy = proxied", "proxied = 'a'"].join("\n"), { + rules: [{ + name: "start", + expression: { + type: "rule_ref", + name: "proxied" + } + }, { + name: "proxied" + }] + }, { + allowedStartRules: ["start"] + }); + }); + }); + describe("when a proxy rule is listed in |allowedStartRules|", function () { + it("updates references but doesn't remove it", function () { + expect$8(pass$2).to.changeAST(["start = proxy", "proxy = proxied", "proxied = 'a'"].join("\n"), { + rules: [{ + name: "start", + expression: { + type: "rule_ref", + name: "proxied" + } + }, { + name: "proxy", + expression: { + type: "rule_ref", + name: "proxied" + } + }, { + name: "proxied" + }] + }, { + allowedStartRules: ["start", "proxy"] + }); + }); + }); + }); + + var pass$3 = peg_1.compiler.passes.check.reportDuplicateLabels; + chai$1.use(helpers); + var expect$9 = chai$1.expect; + describe("compiler pass |reportDuplicateLabels|", function () { + describe("in a sequence", function () { + it("reports labels duplicate with labels of preceding elements", function () { + expect$9(pass$3).to.reportError("start = a:'a' a:'a'", { + message: "Label \"a\" is already defined at line 1, column 9.", + location: { + start: { + offset: 14, + line: 1, + column: 15 + }, + end: { + offset: 19, + line: 1, + column: 20 + } + } + }); + }); + it("doesn't report labels duplicate with labels in subexpressions", function () { + expect$9(pass$3).to.not.reportError("start = ('a' / a:'a' / 'a') a:'a'"); + expect$9(pass$3).to.not.reportError("start = (a:'a' { }) a:'a'"); + expect$9(pass$3).to.not.reportError("start = ('a' a:'a' 'a') a:'a'"); + expect$9(pass$3).to.not.reportError("start = b:(a:'a') a:'a'"); + expect$9(pass$3).to.not.reportError("start = $(a:'a') a:'a'"); + expect$9(pass$3).to.not.reportError("start = &(a:'a') a:'a'"); + expect$9(pass$3).to.not.reportError("start = !(a:'a') a:'a'"); + expect$9(pass$3).to.not.reportError("start = (a:'a')? a:'a'"); + expect$9(pass$3).to.not.reportError("start = (a:'a')* a:'a'"); + expect$9(pass$3).to.not.reportError("start = (a:'a')+ a:'a'"); + expect$9(pass$3).to.not.reportError("start = (a:'a') a:'a'"); + }); + }); + describe("in a choice", function () { + it("doesn't report labels duplicate with labels of preceding alternatives", function () { + expect$9(pass$3).to.not.reportError("start = a:'a' / a:'a'"); + }); + }); + describe("in outer sequence", function () { + it("reports labels duplicate with labels of preceding elements", function () { + expect$9(pass$3).to.reportError("start = a:'a' (a:'a')", { + message: "Label \"a\" is already defined at line 1, column 9.", + location: { + start: { + offset: 15, + line: 1, + column: 16 + }, + end: { + offset: 20, + line: 1, + column: 21 + } + } + }); + }); + it("doesn't report labels duplicate with the label of the current element", function () { + expect$9(pass$3).to.not.reportError("start = a:(a:'a')"); + }); + it("doesn't report labels duplicate with labels of following elements", function () { + expect$9(pass$3).to.not.reportError("start = (a:'a') a:'a'"); + }); + }); + }); + + var pass$4 = peg_1.compiler.passes.check.reportDuplicateRules; + chai$1.use(helpers); + var expect$a = chai$1.expect; + describe("compiler pass |reportDuplicateRules|", function () { + it("reports duplicate rules", function () { + expect$a(pass$4).to.reportError(["start = 'a'", "start = 'b'"].join("\n"), { + message: "Rule \"start\" is already defined at line 1, column 1.", + location: { + start: { + offset: 12, + line: 2, + column: 1 + }, + end: { + offset: 23, + line: 2, + column: 12 + } + } + }); + }); + }); + + var expect$b = chai$1.expect, + use = chai$1.use; + var pass$5 = peg_1.compiler.passes.check.reportIncorrectPlucking; + use(helpers); + describe("compiler pass |reportIncorrectPlucking|", function () { + function reports(error, edgecases) { + it(error.slice(0, -1), function () { + edgecases.forEach(function (grammar) { + return expect$b(pass$5).to.reportError(grammar, error); + }); + }); + } + + reports("\"@\" cannot be used with an action block.", ["start1 = 'a' @'b' 'c' { /* empty action block */ }", "start2 = 'a' @('b' @'c' { /* empty action block */ })"]); + reports("\"@\" cannot be used on a semantic predicate.", ["start1 = 'a' @&{ /* semantic_and */ } 'c'", "start2 = 'a' @!{ /* semantic_not */ } 'c'"]); + it("allows valid plucking", function () { + expect$b(pass$5).not.to.reportError("\n\n start1 = @'1' // return '1'\n start2 = @'1' / @'2' // return '1' or '2'\n start2 = '1' @'2' '3' // return '2'\n start3 = '1' @b:'2' '3' // return '2', label \"b\" can be used in semantic predicates\n start4 = a:'1' @b:'2' '3' // return '2', labels \"a\" and \"b\" can be used in semantic predicates\n start5 = @'1' @'2' '3' // return ['1', '2']\n start6 = @'1' @b:'2' '3' // return ['1', '2'], label \"b\" can be used in semantic predicates\n start7 = a:'1' @'2' &{} // return '2' if the semantic predicate doesnt fail\n\n "); + }); + }); + + var pass$6 = peg_1.compiler.passes.check.reportInfiniteRecursion; + chai$1.use(helpers); + var expect$c = chai$1.expect; + describe("compiler pass |reportInfiniteRecursion|", function () { + it("reports direct left recursion", function () { + expect$c(pass$6).to.reportError("start = start", { + message: "Possible infinite loop when parsing (left recursion: start -> start).", + location: { + start: { + offset: 8, + line: 1, + column: 9 + }, + end: { + offset: 13, + line: 1, + column: 14 + } + } + }); + }); + it("reports indirect left recursion", function () { + expect$c(pass$6).to.reportError(["start = stop", "stop = start"].join("\n"), { + message: "Possible infinite loop when parsing (left recursion: start -> stop -> start).", + location: { + start: { + offset: 20, + line: 2, + column: 8 + }, + end: { + offset: 25, + line: 2, + column: 13 + } + } + }); + }); + describe("in sequences", function () { + it("reports left recursion if all preceding elements match empty string", function () { + expect$c(pass$6).to.reportError("start = '' '' '' start"); + }); + it("doesn't report left recursion if some preceding element doesn't match empty string", function () { + expect$c(pass$6).to.not.reportError("start = 'a' '' '' start"); + expect$c(pass$6).to.not.reportError("start = '' 'a' '' start"); + expect$c(pass$6).to.not.reportError("start = '' '' 'a' start"); + }); + it("reports left recursion when rule reference is wrapped in an expression", function () { + expect$c(pass$6).to.reportError("start = '' start?"); + }); + it("computes expressions that always consume input on success correctly", function () { + expect$c(pass$6).to.reportError(["start = a start", "a 'a' = ''"].join("\n")); + expect$c(pass$6).to.not.reportError(["start = a start", "a 'a' = 'a'"].join("\n")); + expect$c(pass$6).to.reportError("start = ('' / 'a' / 'b') start"); + expect$c(pass$6).to.reportError("start = ('a' / '' / 'b') start"); + expect$c(pass$6).to.reportError("start = ('a' / 'b' / '') start"); + expect$c(pass$6).to.not.reportError("start = ('a' / 'b' / 'c') start"); + expect$c(pass$6).to.reportError("start = ('' { }) start"); + expect$c(pass$6).to.not.reportError("start = ('a' { }) start"); + expect$c(pass$6).to.reportError("start = ('' '' '') start"); + expect$c(pass$6).to.not.reportError("start = ('a' '' '') start"); + expect$c(pass$6).to.not.reportError("start = ('' 'a' '') start"); + expect$c(pass$6).to.not.reportError("start = ('' '' 'a') start"); + expect$c(pass$6).to.reportError("start = a:'' start"); + expect$c(pass$6).to.not.reportError("start = a:'a' start"); + expect$c(pass$6).to.reportError("start = $'' start"); + expect$c(pass$6).to.not.reportError("start = $'a' start"); + expect$c(pass$6).to.reportError("start = &'' start"); + expect$c(pass$6).to.reportError("start = &'a' start"); + expect$c(pass$6).to.reportError("start = !'' start"); + expect$c(pass$6).to.reportError("start = !'a' start"); + expect$c(pass$6).to.reportError("start = ''? start"); + expect$c(pass$6).to.reportError("start = 'a'? start"); + expect$c(pass$6).to.reportError("start = ''* start"); + expect$c(pass$6).to.reportError("start = 'a'* start"); + expect$c(pass$6).to.reportError("start = ''+ start"); + expect$c(pass$6).to.not.reportError("start = 'a'+ start"); + expect$c(pass$6).to.reportError("start = ('') start"); + expect$c(pass$6).to.not.reportError("start = ('a') start"); + expect$c(pass$6).to.reportError("start = &{ } start"); + expect$c(pass$6).to.reportError("start = !{ } start"); + expect$c(pass$6).to.reportError(["start = a start", "a = ''"].join("\n")); + expect$c(pass$6).to.not.reportError(["start = a start", "a = 'a'"].join("\n")); + expect$c(pass$6).to.reportError("start = '' start"); + expect$c(pass$6).to.not.reportError("start = 'a' start"); + expect$c(pass$6).to.not.reportError("start = [a-d] start"); + expect$c(pass$6).to.not.reportError("start = . start"); + }); + }); + }); + + var pass$7 = peg_1.compiler.passes.check.reportInfiniteRepetition; + chai$1.use(helpers); + var expect$d = chai$1.expect; + describe("compiler pass |reportInfiniteRepetition|", function () { + it("reports infinite loops for zero_or_more", function () { + expect$d(pass$7).to.reportError("start = ('')*", { + message: "Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", + location: { + start: { + offset: 8, + line: 1, + column: 9 + }, + end: { + offset: 13, + line: 1, + column: 14 + } + } + }); + }); + it("reports infinite loops for one_or_more", function () { + expect$d(pass$7).to.reportError("start = ('')+", { + message: "Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", + location: { + start: { + offset: 8, + line: 1, + column: 9 + }, + end: { + offset: 13, + line: 1, + column: 14 + } + } + }); + }); + it("computes expressions that always consume input on success correctly", function () { + expect$d(pass$7).to.reportError(["start = a*", "a 'a' = ''"].join("\n")); + expect$d(pass$7).to.not.reportError(["start = a*", "a 'a' = 'a'"].join("\n")); + expect$d(pass$7).to.reportError("start = ('' / 'a' / 'b')*"); + expect$d(pass$7).to.reportError("start = ('a' / '' / 'b')*"); + expect$d(pass$7).to.reportError("start = ('a' / 'b' / '')*"); + expect$d(pass$7).to.not.reportError("start = ('a' / 'b' / 'c')*"); + expect$d(pass$7).to.reportError("start = ('' { })*"); + expect$d(pass$7).to.not.reportError("start = ('a' { })*"); + expect$d(pass$7).to.reportError("start = ('' '' '')*"); + expect$d(pass$7).to.not.reportError("start = ('a' '' '')*"); + expect$d(pass$7).to.not.reportError("start = ('' 'a' '')*"); + expect$d(pass$7).to.not.reportError("start = ('' '' 'a')*"); + expect$d(pass$7).to.reportError("start = (a:'')*"); + expect$d(pass$7).to.not.reportError("start = (a:'a')*"); + expect$d(pass$7).to.reportError("start = ($'')*"); + expect$d(pass$7).to.not.reportError("start = ($'a')*"); + expect$d(pass$7).to.reportError("start = (&'')*"); + expect$d(pass$7).to.reportError("start = (&'a')*"); + expect$d(pass$7).to.reportError("start = (!'')*"); + expect$d(pass$7).to.reportError("start = (!'a')*"); + expect$d(pass$7).to.reportError("start = (''?)*"); + expect$d(pass$7).to.reportError("start = ('a'?)*"); + expect$d(pass$7).to.reportError("start = (''*)*"); + expect$d(pass$7).to.reportError("start = ('a'*)*"); + expect$d(pass$7).to.reportError("start = (''+)*"); + expect$d(pass$7).to.not.reportError("start = ('a'+)*"); + expect$d(pass$7).to.reportError("start = ('')*"); + expect$d(pass$7).to.not.reportError("start = ('a')*"); + expect$d(pass$7).to.reportError("start = (&{ })*"); + expect$d(pass$7).to.reportError("start = (!{ })*"); + expect$d(pass$7).to.reportError(["start = a*", "a = ''"].join("\n")); + expect$d(pass$7).to.not.reportError(["start = a*", "a = 'a'"].join("\n")); + expect$d(pass$7).to.reportError("start = ''*"); + expect$d(pass$7).to.not.reportError("start = 'a'*"); + expect$d(pass$7).to.not.reportError("start = [a-d]*"); + expect$d(pass$7).to.not.reportError("start = .*"); + }); + }); + + var pass$8 = peg_1.compiler.passes.check.reportUndefinedRules; + chai$1.use(helpers); + var expect$e = chai$1.expect; + describe("compiler pass |reportUndefinedRules|", function () { + it("reports undefined rules", function () { + expect$e(pass$8).to.reportError("start = undefined", { + message: "Rule \"undefined\" is not defined.", + location: { + start: { + offset: 8, + line: 1, + column: 9 + }, + end: { + offset: 17, + line: 1, + column: 18 + } + } + }); + }); + it("checks allowedStartRules", function () { + expect$e(pass$8).to.reportError("start = 'a'", { + message: "Start rule \"missing\" is not defined." + }, { + allowedStartRules: ["missing"] + }); + }); + }); + + var pass$9 = peg_1.compiler.passes.check.reportUnusedRules; + chai$1.use(helpers); + var expect$f = chai$1.expect; + describe("compiler pass |reportUnusedRules|", function () { + it("should report rules that are not referenced", function () { + expect$f(pass$9).to.reportWarning("\n start = .\n unused = .\n ", "Rule \"unused\" is not referenced."); + expect$f(pass$9).to.reportWarning("\n start = .\n unused = .\n used = .\n ", ["Rule \"used\" is not referenced.", "Rule \"unused\" is not referenced."]); + }); + it("does not report rules that are referenced", function () { + expect$f(pass$9).not.to.reportWarning("start = ."); + expect$f(pass$9).not.to.reportWarning("\n start = used\n used = .\n "); + }); + it("does not report any rules that the generated parser starts parsing from", function () { + expect$f(pass$9).not.to.reportWarning("\n a = \"x\"\n b = a\n c = .+\n ", null, { + allowedStartRules: ["b", "c"] + }); + }); + }); + + var parser$1 = peg_1.parser, + util$2 = peg_1.util, + ast$1 = peg_1.ast; + var expect$g = chai$1.expect; + chai$1.config.truncateThreshold = 0; + + function varyParserOptions(block) { + var optionsVariants = [{}, { + extractComments: false + }, { + extractComments: true + }]; + optionsVariants.forEach(function (variant) { + describe("with options " + chai$1.util.inspect(variant), function () { + return block(variant); + }); + }); + } + + describe("PEG.js grammar parser", function () { + var literalAbcd = { + type: "literal", + value: "abcd", + ignoreCase: false + }; + var literalEfgh = { + type: "literal", + value: "efgh", + ignoreCase: false + }; + var literalIjkl = { + type: "literal", + value: "ijkl", + ignoreCase: false + }; + var literalMnop = { + type: "literal", + value: "mnop", + ignoreCase: false + }; + var semanticAnd = { + type: "semantic_and", + code: " code " + }; + var semanticNot = { + type: "semantic_not", + code: " code " + }; + var optional = { + type: "optional", + expression: literalAbcd + }; + var zeroOrMore = { + type: "zero_or_more", + expression: literalAbcd + }; + var oneOrMore = { + type: "one_or_more", + expression: literalAbcd + }; + var textOptional = { + type: "text", + expression: optional + }; + var simpleNotAbcd = { + type: "simple_not", + expression: literalAbcd + }; + var simpleAndOptional = { + type: "simple_and", + expression: optional + }; + var simpleNotOptional = { + type: "simple_not", + expression: optional + }; + var labeledAbcd = { + type: "labeled", + label: "a", + expression: literalAbcd + }; + var labeledEfgh = { + type: "labeled", + label: "b", + expression: literalEfgh + }; + var labeledIjkl = { + type: "labeled", + label: "c", + expression: literalIjkl + }; + var labeledMnop = { + type: "labeled", + label: "d", + expression: literalMnop + }; + var labeledSimpleNot = { + type: "labeled", + label: "a", + expression: simpleNotAbcd + }; + var sequence = { + type: "sequence", + elements: [literalAbcd, literalEfgh, literalIjkl] + }; + var sequence2 = { + type: "sequence", + elements: [labeledAbcd, labeledEfgh] + }; + var sequence4 = { + type: "sequence", + elements: [labeledAbcd, labeledEfgh, labeledIjkl, labeledMnop] + }; + var groupLabeled = { + type: "group", + expression: labeledAbcd + }; + var groupSequence = { + type: "group", + expression: sequence + }; + var actionAbcd = { + type: "action", + expression: literalAbcd, + code: " code " + }; + var actionEfgh = { + type: "action", + expression: literalEfgh, + code: " code " + }; + var actionIjkl = { + type: "action", + expression: literalIjkl, + code: " code " + }; + var actionMnop = { + type: "action", + expression: literalMnop, + code: " code " + }; + var actionSequence = { + type: "action", + expression: sequence, + code: " code " + }; + var choice = { + type: "choice", + alternatives: [literalAbcd, literalEfgh, literalIjkl] + }; + var choice2 = { + type: "choice", + alternatives: [actionAbcd, actionEfgh] + }; + var choice4 = { + type: "choice", + alternatives: [actionAbcd, actionEfgh, actionIjkl, actionMnop] + }; + var named = { + type: "named", + name: "start rule", + expression: literalAbcd + }; + var ruleA = { + type: "rule", + name: "a", + expression: literalAbcd + }; + var ruleB = { + type: "rule", + name: "b", + expression: literalEfgh + }; + var ruleC = { + type: "rule", + name: "c", + expression: literalIjkl + }; + var ruleStart = { + type: "rule", + name: "start", + expression: literalAbcd + }; + var initializer = { + type: "initializer", + code: " code " + }; + + function oneRuleGrammar(expression) { + return { + type: "grammar", + initializer: null, + comments: null, + rules: [{ + type: "rule", + name: "start", + expression: expression + }] + }; + } + + function actionGrammar(code) { + return oneRuleGrammar({ + type: "action", + expression: literalAbcd, + code: code + }); + } + + function literalGrammar(value, ignoreCase) { + return oneRuleGrammar({ + type: "literal", + value: value, + ignoreCase: ignoreCase + }); + } + + function classGrammar(parts, inverted, ignoreCase) { + return oneRuleGrammar({ + type: "class", + parts: parts, + inverted: inverted, + ignoreCase: ignoreCase + }); + } + + function anyGrammar() { + return oneRuleGrammar({ + type: "any" + }); + } + + function ruleRefGrammar(name) { + return oneRuleGrammar({ + type: "rule_ref", + name: name + }); + } + + function commented(grammar, comments, options) { + function toObject(result, comment) { + result[comment.offset] = { + text: comment.text, + multiline: comment.multiline + }; + return result; + } + + grammar = util$2.clone(grammar); + grammar.comments = options.extractComments ? comments.reduce(toObject, {}) : null; + return grammar; + } + + var trivialGrammar = literalGrammar("abcd", false); + var twoRuleGrammar = { + type: "grammar", + initializer: null, + comments: null, + rules: [ruleA, ruleB] + }; + + var stripProperties = function () { + var strip; + + function stripLeaf(node) { + delete node.location; + } + + function stripExpression(node) { + delete node.location; + strip(node.expression); + } + + function stripChildren(property) { + return function (node) { + delete node.location; + node[property].forEach(strip); + }; + } + + strip = ast$1.visitor.build({ + grammar: function grammar(node) { + delete node.location; + delete node._alwaysConsumesOnSuccess; + + if (node.initializer) { + strip(node.initializer); + } + + if (node.comments) { + util$2.each(node.comments, stripLeaf); + } + + node.rules.forEach(strip); + }, + initializer: stripLeaf, + rule: stripExpression, + named: stripExpression, + choice: stripChildren("alternatives"), + action: stripExpression, + sequence: stripChildren("elements"), + labeled: stripExpression, + text: stripExpression, + simple_and: stripExpression, + simple_not: stripExpression, + optional: stripExpression, + zero_or_more: stripExpression, + one_or_more: stripExpression, + group: stripExpression, + semantic_and: stripLeaf, + semantic_not: stripLeaf, + rule_ref: stripLeaf, + literal: stripLeaf, + class: stripLeaf, + any: stripLeaf + }); + return strip; + }(); + + function helpers(chai, utils) { + var Assertion = chai.Assertion; + Assertion.addMethod("parseAs", function (expected, options) { + options = typeof options === "undefined" ? {} : options; + var result = parser$1.parse(utils.flag(this, "object"), options); + stripProperties(result); + this.assert(utils.eql(result, expected), "expected #{this} to parse as #{exp} but got #{act}", "expected #{this} to not parse as #{exp}", expected, result, !utils.flag(this, "negate")); + }); + Assertion.addMethod("failToParse", function (props) { + var passed, result; + + try { + result = parser$1.parse(utils.flag(this, "object")); + passed = true; + } catch (e) { + result = e; + passed = false; + } + + if (passed) { + stripProperties(result); + } + + this.assert(!passed, "expected #{this} to fail to parse but got #{act}", "expected #{this} to not fail to parse but it failed with #{act}", null, result); + + if (!passed && typeof props !== "undefined") { + Object.keys(props).forEach(function (key) { + new Assertion(result).to.have.property(key).that.is.deep.equal(props[key]); + }); + } + }); + } + + beforeEach(function () { + chai$1.use(helpers); + }); + it("parses Rule+", function () { + expect$g("start = a").to.parseAs(ruleRefGrammar("a")); + var grammar = ruleRefGrammar("a"); + grammar.initializer = { + "type": "initializer", + "code": "" + }; + expect$g("{}\nstart = a").to.parseAs(grammar); + expect$g("").to.failToParse(); + expect$g("{}").to.failToParse(); + }); + it("parses Grammar", function () { + expect$g("\na = 'abcd';\n").to.parseAs({ + type: "grammar", + comments: null, + initializer: null, + rules: [ruleA] + }); + expect$g("\na = 'abcd';\nb = 'efgh';\nc = 'ijkl';\n").to.parseAs({ + type: "grammar", + comments: null, + initializer: null, + rules: [ruleA, ruleB, ruleC] + }); + expect$g("\n{ code };\na = 'abcd';\n").to.parseAs({ + type: "grammar", + comments: null, + initializer: initializer, + rules: [ruleA] + }); + }); + it("parses Initializer", function () { + expect$g("{ code };start = 'abcd'").to.parseAs({ + type: "grammar", + comments: null, + initializer: initializer, + rules: [ruleStart] + }); + }); + it("parses Rule", function () { + expect$g("start\n=\n'abcd';").to.parseAs(oneRuleGrammar(literalAbcd)); + expect$g("start\n'start rule'\n=\n'abcd';").to.parseAs(oneRuleGrammar(named)); + }); + it("parses Expression", function () { + expect$g("start = 'abcd' / 'efgh' / 'ijkl'").to.parseAs(oneRuleGrammar(choice)); + }); + it("parses ChoiceExpression", function () { + expect$g("start = 'abcd' { code }").to.parseAs(oneRuleGrammar(actionAbcd)); + expect$g("start = 'abcd' { code }\n/\n'efgh' { code }").to.parseAs(oneRuleGrammar(choice2)); + expect$g("start = 'abcd' { code }\n/\n'efgh' { code }\n/\n'ijkl' { code }\n/\n'mnop' { code }").to.parseAs(oneRuleGrammar(choice4)); + }); + it("parses ActionExpression", function () { + expect$g("start = 'abcd' 'efgh' 'ijkl'").to.parseAs(oneRuleGrammar(sequence)); + expect$g("start = 'abcd' 'efgh' 'ijkl'\n{ code }").to.parseAs(oneRuleGrammar(actionSequence)); + }); + it("parses SequenceExpression", function () { + expect$g("start = a:'abcd'").to.parseAs(oneRuleGrammar(labeledAbcd)); + expect$g("start = a:'abcd'\nb:'efgh'").to.parseAs(oneRuleGrammar(sequence2)); + expect$g("start = a:'abcd'\nb:'efgh'\nc:'ijkl'\nd:'mnop'").to.parseAs(oneRuleGrammar(sequence4)); + }); + it("parses `@` (value plucking)", function () { + function $S() { + for (var _len = arguments.length, elements = new Array(_len), _key = 0; _key < _len; _key++) { + elements[_key] = arguments[_key]; + } + + return oneRuleGrammar({ + type: "sequence", + elements: elements + }); + } + + function $P(label, expression) { + return { + type: "labeled", + pick: true, + label: label, + expression: expression + }; + } + + expect$g("start = @'abcd'").to.parseAs($S($P(null, literalAbcd))); + expect$g("start = @a:'abcd'").to.parseAs($S($P("a", literalAbcd))); + expect$g("start = 'abcd' @'efgh'").to.parseAs($S(literalAbcd, $P(null, literalEfgh))); + expect$g("start = a:'abcd' @b:'efgh'").to.parseAs($S(labeledAbcd, $P("b", literalEfgh))); + expect$g("start = @'abcd' b:'efgh'").to.parseAs($S($P(null, literalAbcd), labeledEfgh)); + expect$g("start = a:'abcd' @'efgh' 'ijkl' @d:'mnop'").to.parseAs($S(labeledAbcd, $P(null, literalEfgh), literalIjkl, $P("d", literalMnop))); + }); + it("parses LabeledExpression", function () { + expect$g("start = a\n:\n!'abcd'").to.parseAs(oneRuleGrammar(labeledSimpleNot)); + expect$g("start = !'abcd'").to.parseAs(oneRuleGrammar(simpleNotAbcd)); + }); + it("parses PrefixedExpression", function () { + expect$g("start = !\n'abcd'?").to.parseAs(oneRuleGrammar(simpleNotOptional)); + expect$g("start = 'abcd'?").to.parseAs(oneRuleGrammar(optional)); + }); + it("parses PrefixedOperator", function () { + expect$g("start = $'abcd'?").to.parseAs(oneRuleGrammar(textOptional)); + expect$g("start = &'abcd'?").to.parseAs(oneRuleGrammar(simpleAndOptional)); + expect$g("start = !'abcd'?").to.parseAs(oneRuleGrammar(simpleNotOptional)); + }); + it("parses SuffixedExpression", function () { + expect$g("start = 'abcd'\n?").to.parseAs(oneRuleGrammar(optional)); + expect$g("start = 'abcd'").to.parseAs(oneRuleGrammar(literalAbcd)); + }); + it("parses SuffixedOperator", function () { + expect$g("start = 'abcd'?").to.parseAs(oneRuleGrammar(optional)); + expect$g("start = 'abcd'*").to.parseAs(oneRuleGrammar(zeroOrMore)); + expect$g("start = 'abcd'+").to.parseAs(oneRuleGrammar(oneOrMore)); + }); + it("parses PrimaryExpression", function () { + expect$g("start = 'abcd'").to.parseAs(trivialGrammar); + expect$g("start = [a-d]").to.parseAs(classGrammar([["a", "d"]], false, false)); + expect$g("start = .").to.parseAs(anyGrammar()); + expect$g("start = a").to.parseAs(ruleRefGrammar("a")); + expect$g("start = &{ code }").to.parseAs(oneRuleGrammar(semanticAnd)); + expect$g("start = (\na:'abcd'\n)").to.parseAs(oneRuleGrammar(groupLabeled)); + expect$g("start = (\n'abcd' 'efgh' 'ijkl'\n)").to.parseAs(oneRuleGrammar(groupSequence)); + expect$g("start = (\n'abcd'\n)").to.parseAs(trivialGrammar); + }); + it("parses RuleReferenceExpression", function () { + expect$g("start = a").to.parseAs(ruleRefGrammar("a")); + expect$g("start = a\n=").to.failToParse(); + expect$g("start = a\n'abcd'\n=").to.failToParse(); + }); + it("parses SemanticPredicateExpression", function () { + expect$g("start = !\n{ code }").to.parseAs(oneRuleGrammar(semanticNot)); + }); + it("parses SemanticPredicateOperator", function () { + expect$g("start = &{ code }").to.parseAs(oneRuleGrammar(semanticAnd)); + expect$g("start = !{ code }").to.parseAs(oneRuleGrammar(semanticNot)); + }); + it("parses WhiteSpace", function () { + expect$g("start =\t'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\v'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\f'abcd'").to.parseAs(trivialGrammar); + expect$g("start = 'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\xA0'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\uFEFF'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\u1680'abcd'").to.parseAs(trivialGrammar); + }); + it("parses LineTerminator", function () { + expect$g("start = '\n'").to.failToParse(); + expect$g("start = '\r'").to.failToParse(); + expect$g("start = '\u2028'").to.failToParse(); + expect$g("start = '\u2029'").to.failToParse(); + }); + it("parses LineTerminatorSequence", function () { + expect$g("start =\n'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\r\n'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\r'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\u2028'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\u2029'abcd'").to.parseAs(trivialGrammar); + }); + varyParserOptions(function (options) { + it("parses Comment", function () { + expect$g("start =// comment\n'abcd'").to.parseAs(commented(trivialGrammar, [{ + offset: 7, + text: " comment", + multiline: false + }], options), options); + expect$g("start =/* comment */'abcd'").to.parseAs(commented(trivialGrammar, [{ + offset: 7, + text: " comment ", + multiline: true + }], options), options); + }); + it("parses MultiLineComment", function () { + expect$g("start =/**/'abcd'").to.parseAs(commented(trivialGrammar, [{ + offset: 7, + text: "", + multiline: true + }], options), options); + expect$g("start =/*a*/'abcd'").to.parseAs(commented(trivialGrammar, [{ + offset: 7, + text: "a", + multiline: true + }], options), options); + expect$g("start =/*abc*/'abcd'").to.parseAs(commented(trivialGrammar, [{ + offset: 7, + text: "abc", + multiline: true + }], options), options); + expect$g("start =/**/*/'abcd'").to.failToParse(); + }); + it("parses MultiLineCommentNoLineTerminator", function () { + expect$g("a = 'abcd'/**/\r\nb = 'efgh'").to.parseAs(commented(twoRuleGrammar, [{ + offset: 10, + text: "", + multiline: true + }], options), options); + expect$g("a = 'abcd'/*a*/\r\nb = 'efgh'").to.parseAs(commented(twoRuleGrammar, [{ + offset: 10, + text: "a", + multiline: true + }], options), options); + expect$g("a = 'abcd'/*abc*/\r\nb = 'efgh'").to.parseAs(commented(twoRuleGrammar, [{ + offset: 10, + text: "abc", + multiline: true + }], options), options); + expect$g("a = 'abcd'/**/*/\r\nb = 'efgh'").to.failToParse(); + expect$g("a = 'abcd'/*\n*/\r\nb = 'efgh'").to.failToParse(); + }); + it("parses SingleLineComment", function () { + expect$g("start =//\n'abcd'").to.parseAs(commented(trivialGrammar, [{ + offset: 7, + text: "", + multiline: false + }], options), options); + expect$g("start =//a\n'abcd'").to.parseAs(commented(trivialGrammar, [{ + offset: 7, + text: "a", + multiline: false + }], options), options); + expect$g("start =//abc\n'abcd'").to.parseAs(commented(trivialGrammar, [{ + offset: 7, + text: "abc", + multiline: false + }], options), options); + expect$g("start =//\n>\n'abcd'").to.failToParse(); + }); + }); + it("parses Identifier", function () { + expect$g("start = a:'abcd'").to.parseAs(oneRuleGrammar(labeledAbcd)); + }); + it("parses IdentifierName", function () { + expect$g("start = a").to.parseAs(ruleRefGrammar("a")); + expect$g("start = ab").to.parseAs(ruleRefGrammar("ab")); + expect$g("start = abcd").to.parseAs(ruleRefGrammar("abcd")); + }); + it("parses IdentifierStart", function () { + expect$g("start = a").to.parseAs(ruleRefGrammar("a")); + expect$g("start = $").to.parseAs(ruleRefGrammar("$")); + expect$g("start = _").to.parseAs(ruleRefGrammar("_")); + expect$g("start = \\u0061").to.parseAs(ruleRefGrammar("a")); + }); + it("parses IdentifierPart", function () { + expect$g("start = aa").to.parseAs(ruleRefGrammar("aa")); + expect$g("start = a\u0300").to.parseAs(ruleRefGrammar("a\u0300")); + expect$g("start = a0").to.parseAs(ruleRefGrammar("a0")); + expect$g("start = a\u203F").to.parseAs(ruleRefGrammar("a\u203F")); + expect$g("start = a\u200C").to.parseAs(ruleRefGrammar("a\u200C")); + expect$g("start = a\u200D").to.parseAs(ruleRefGrammar("a\u200D")); + }); + it("parses LiteralMatcher", function () { + expect$g("start = 'abcd'").to.parseAs(literalGrammar("abcd", false)); + expect$g("start = 'abcd'i").to.parseAs(literalGrammar("abcd", true)); + }); + it("parses StringLiteral", function () { + expect$g("start = \"\"").to.parseAs(literalGrammar("", false)); + expect$g("start = \"a\"").to.parseAs(literalGrammar("a", false)); + expect$g("start = \"abc\"").to.parseAs(literalGrammar("abc", false)); + expect$g("start = ''").to.parseAs(literalGrammar("", false)); + expect$g("start = 'a'").to.parseAs(literalGrammar("a", false)); + expect$g("start = 'abc'").to.parseAs(literalGrammar("abc", false)); + }); + it("parses DoubleStringCharacter", function () { + expect$g("start = \"a\"").to.parseAs(literalGrammar("a", false)); + expect$g("start = \"\\n\"").to.parseAs(literalGrammar("\n", false)); + expect$g("start = \"\\\n\"").to.parseAs(literalGrammar("", false)); + expect$g("start = \"\"\"").to.failToParse(); + expect$g("start = \"\\\"").to.failToParse(); + expect$g("start = \"\n\"").to.failToParse(); + }); + it("parses SingleStringCharacter", function () { + expect$g("start = 'a'").to.parseAs(literalGrammar("a", false)); + expect$g("start = '\\n'").to.parseAs(literalGrammar("\n", false)); + expect$g("start = '\\\n'").to.parseAs(literalGrammar("", false)); + expect$g("start = '''").to.failToParse(); + expect$g("start = '\\'").to.failToParse(); + expect$g("start = '\n'").to.failToParse(); + }); + it("parses CharacterClassMatcher", function () { + expect$g("start = []").to.parseAs(classGrammar([], false, false)); + expect$g("start = [a-d]").to.parseAs(classGrammar([["a", "d"]], false, false)); + expect$g("start = [a]").to.parseAs(classGrammar(["a"], false, false)); + expect$g("start = [a-de-hi-l]").to.parseAs(classGrammar([["a", "d"], ["e", "h"], ["i", "l"]], false, false)); + expect$g("start = [^a-d]").to.parseAs(classGrammar([["a", "d"]], true, false)); + expect$g("start = [a-d]i").to.parseAs(classGrammar([["a", "d"]], false, true)); + expect$g("start = [\\\n]").to.parseAs(classGrammar([], false, false)); + }); + it("parses ClassCharacterRange", function () { + expect$g("start = [a-d]").to.parseAs(classGrammar([["a", "d"]], false, false)); + expect$g("start = [a-a]").to.parseAs(classGrammar([["a", "a"]], false, false)); + expect$g("start = [b-a]").to.failToParse({ + message: "Invalid character range: b-a." + }); + }); + it("parses ClassCharacter", function () { + expect$g("start = [a]").to.parseAs(classGrammar(["a"], false, false)); + expect$g("start = [\\n]").to.parseAs(classGrammar(["\n"], false, false)); + expect$g("start = [\\\n]").to.parseAs(classGrammar([], false, false)); + expect$g("start = []]").to.failToParse(); + expect$g("start = [\\]").to.failToParse(); + expect$g("start = [\n]").to.failToParse(); + }); + it("parses LineContinuation", function () { + expect$g("start = '\\\r\n'").to.parseAs(literalGrammar("", false)); + }); + it("parses EscapeSequence", function () { + expect$g("start = '\\n'").to.parseAs(literalGrammar("\n", false)); + expect$g("start = '\\0'").to.parseAs(literalGrammar("\x00", false)); + expect$g("start = '\\xFF'").to.parseAs(literalGrammar("\xFF", false)); + expect$g("start = '\\uFFFF'").to.parseAs(literalGrammar("\uFFFF", false)); + expect$g("start = '\\09'").to.failToParse(); + }); + it("parses CharacterEscapeSequence", function () { + expect$g("start = '\\n'").to.parseAs(literalGrammar("\n", false)); + expect$g("start = '\\a'").to.parseAs(literalGrammar("a", false)); + }); + it("parses SingleEscapeCharacter", function () { + expect$g("start = '\\''").to.parseAs(literalGrammar("'", false)); + expect$g("start = '\\\"'").to.parseAs(literalGrammar("\"", false)); + expect$g("start = '\\\\'").to.parseAs(literalGrammar("\\", false)); + expect$g("start = '\\b'").to.parseAs(literalGrammar("\b", false)); + expect$g("start = '\\f'").to.parseAs(literalGrammar("\f", false)); + expect$g("start = '\\n'").to.parseAs(literalGrammar("\n", false)); + expect$g("start = '\\r'").to.parseAs(literalGrammar("\r", false)); + expect$g("start = '\\t'").to.parseAs(literalGrammar("\t", false)); + expect$g("start = '\\v'").to.parseAs(literalGrammar("\v", false)); + }); + it("parses NonEscapeCharacter", function () { + expect$g("start = '\\a'").to.parseAs(literalGrammar("a", false)); + }); + it("parses HexEscapeSequence", function () { + expect$g("start = '\\xFF'").to.parseAs(literalGrammar("\xFF", false)); + }); + it("parses UnicodeEscapeSequence", function () { + expect$g("start = '\\uFFFF'").to.parseAs(literalGrammar("\uFFFF", false)); + }); + it("parses AnyMatcher", function () { + expect$g("start = .").to.parseAs(anyGrammar()); + }); + it("parses CodeBlock", function () { + expect$g("start = 'abcd' { code }").to.parseAs(actionGrammar(" code ")); + }); + it("parses Code", function () { + expect$g("start = 'abcd' {a}").to.parseAs(actionGrammar("a")); + expect$g("start = 'abcd' {abc}").to.parseAs(actionGrammar("abc")); + expect$g("start = 'abcd' {{a}}").to.parseAs(actionGrammar("{a}")); + expect$g("start = 'abcd' {{a}{b}{c}}").to.parseAs(actionGrammar("{a}{b}{c}")); + expect$g("start = 'abcd' {{}").to.failToParse(); + expect$g("start = 'abcd' {}}").to.failToParse(); + }); + it("parses __", function () { + expect$g("start ='abcd'").to.parseAs(trivialGrammar); + expect$g("start = 'abcd'").to.parseAs(trivialGrammar); + expect$g("start =\r\n'abcd'").to.parseAs(trivialGrammar); + expect$g("start =/* comment */'abcd'").to.parseAs(trivialGrammar); + expect$g("start = 'abcd'").to.parseAs(trivialGrammar); + }); + it("parses _", function () { + expect$g("a = 'abcd'\r\nb = 'efgh'").to.parseAs(twoRuleGrammar); + expect$g("a = 'abcd' \r\nb = 'efgh'").to.parseAs(twoRuleGrammar); + expect$g("a = 'abcd'/* comment */\r\nb = 'efgh'").to.parseAs(twoRuleGrammar); + expect$g("a = 'abcd' \r\nb = 'efgh'").to.parseAs(twoRuleGrammar); + }); + it("parses EOS", function () { + expect$g("a = 'abcd'\n;b = 'efgh'").to.parseAs(twoRuleGrammar); + expect$g("a = 'abcd' \r\nb = 'efgh'").to.parseAs(twoRuleGrammar); + expect$g("a = 'abcd' // comment\r\nb = 'efgh'").to.parseAs(twoRuleGrammar); + expect$g("a = 'abcd'\nb = 'efgh'").to.parseAs(twoRuleGrammar); + }); + it("parses EOF", function () { + expect$g("start = 'abcd'\n").to.parseAs(trivialGrammar); + }); + it("reports unmatched brace", function () { + var text = "rule = \n 'x' { y \n z"; + var errorLocation = { + start: { + offset: 13, + line: 2, + column: 6 + }, + end: { + offset: 14, + line: 2, + column: 7 + } + }; + expect$g(function () { + return parser$1.parse(text); + }).to.throw("Unbalanced brace.").with.property("location").that.deep.equals(errorLocation); + }); + }); + + exports.__moduleExports = generatedParserApi_spec; + + return exports; + +}({})); diff --git a/tools/pegjs.org/online.html b/tools/pegjs.org/online.html new file mode 100644 index 0000000..67bf773 --- /dev/null +++ b/tools/pegjs.org/online.html @@ -0,0 +1,105 @@ + + + + + + + + + + Online version » PEG.js – Parser Generator for JavaScript + + + + + + + + + +
+
Loading...
+
+ +
+ + + + + +
+ + + + + + + +
+
+ +
+
+
Loading...
+
+
+ + + + + + + + + + +
+
+ +
+
+
Parser not available.
+
+

Output

+
Output not available.
+
+
+ + + + + + + +
+ + + + \ No newline at end of file diff --git a/tools/pegjs.org/vendor/codemirror/codemirror.css b/tools/pegjs.org/vendor/codemirror/codemirror.css new file mode 100644 index 0000000..911556b --- /dev/null +++ b/tools/pegjs.org/vendor/codemirror/codemirror.css @@ -0,0 +1 @@ +.CodeMirror{font-family:monospace;height:300px;color:black}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes "blink"{0%{}50%{background-color:transparent;}100%{}}@-webkit-keyframes "blink"{0%{}50%{background-color:transparent;}100%{}}@keyframes "blink"{0%{}50%{background-color:transparent;}100%{}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:#f00}.cm-invalidchar{color:#f00}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:rgba(255, 150, 0, .3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll !important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;margin-bottom:-30px;*zoom:1;*display:inline}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none !important;border:none !important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line > span::selection,.CodeMirror-line > span > span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line > span::-moz-selection,.CodeMirror-line > span > span::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255, 255, 0, .4)}.CodeMirror span{*vertical-align:text-bottom}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none} \ No newline at end of file diff --git a/tools/pegjs.org/vendor/codemirror/codemirror.js b/tools/pegjs.org/vendor/codemirror/codemirror.js new file mode 100644 index 0000000..a171fe1 --- /dev/null +++ b/tools/pegjs.org/vendor/codemirror/codemirror.js @@ -0,0 +1,17 @@ +/* CodeMirror - Minified & Bundled + Generated on 9/20/2015 with http://codemirror.net/doc/compress.html + Version: 5.6 + + CodeMirror Library: + - codemirror.js + Modes: + - javascript.js + - pegjs.js + */ + +!function(a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else{if("function"==typeof define&&define.amd)return define([],a);this.CodeMirror=a()}}(function(){"use strict";function v(a,b){if(!(this instanceof v))return new v(a,b);this.options=b=b?hg(b):{},hg(Ad,b,!1),I(b);var c=b.value;"string"==typeof c&&(c=new af(c,b.mode,null,b.lineSeparator)),this.doc=c;var g=new v.inputStyles[b.inputStyle](this),h=this.display=new w(a,c,g);h.wrapper.CodeMirror=this,E(this),C(this),b.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),b.autofocus&&!n&&h.input.focus(),M(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new Yf,keySeq:null,specialChars:null};var i=this;d&&11>e&&setTimeout(function(){i.display.input.reset(!0)},20),pc(this),Bg(),Vb(this),this.curOp.forceUpdate=!0,ef(this,c),b.autofocus&&!n||i.hasFocus()?setTimeout(ig(Zc,this),20):$c(this);for(var j in Bd)Bd.hasOwnProperty(j)&&Bd[j](this,b[j],Dd);R(this),b.finishInit&&b.finishInit(this);for(var k=0;ke&&(h.gutters.style.zIndex=-1,h.scroller.style.paddingRight=0),f||a&&n||(h.scroller.draggable=!0),b&&(b.appendChild?b.appendChild(h.wrapper):b(h.wrapper)),h.viewFrom=h.viewTo=c.first,h.reportedViewFrom=h.reportedViewTo=c.first,h.view=[],h.renderedView=null,h.externalMeasured=null,h.viewOffset=0,h.lastWrapHeight=h.lastWrapWidth=0,h.updateLineNumbers=null,h.nativeBarWidth=h.barHeight=h.barWidth=0,h.scrollbarsClipped=!1,h.lineNumWidth=h.lineNumInnerWidth=h.lineNumChars=null,h.alignWidgets=!1,h.cachedCharWidth=h.cachedTextHeight=h.cachedPaddingH=null,h.maxLine=null,h.maxLineLength=0,h.maxLineChanged=!1,h.wheelDX=h.wheelDY=h.wheelStartX=h.wheelStartY=null,h.shift=!1,h.selForContextMenu=null,h.activeTouch=null,g.init(h)}function x(a){a.doc.mode=v.getMode(a.options,a.doc.modeOption),y(a)}function y(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null)}),a.doc.frontier=a.doc.first,ib(a,100),a.state.modeGen++,a.curOp&&ic(a)}function z(a){a.options.lineWrapping?(xg(a.display.wrapper,"CodeMirror-wrap"),a.display.sizer.style.minWidth="",a.display.sizerWidth=null):(wg(a.display.wrapper,"CodeMirror-wrap"),H(a)),B(a),ic(a),Fb(a),setTimeout(function(){N(a)},100)}function A(a){var b=Rb(a.display),c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/Sb(a.display)-3);return function(e){if(we(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;gb.maxLineLength&&(b.maxLineLength=c,b.maxLine=a)})}function I(a){var b=dg(a.gutters,"CodeMirror-linenumbers");-1==b&&a.lineNumbers?a.gutters=a.gutters.concat(["CodeMirror-linenumbers"]):b>-1&&!a.lineNumbers&&(a.gutters=a.gutters.slice(0),a.gutters.splice(b,1))}function J(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc.height+nb(a.display));return{clientHeight:b.scroller.clientHeight,viewHeight:b.wrapper.clientHeight,scrollWidth:b.scroller.scrollWidth,clientWidth:b.scroller.clientWidth,viewWidth:b.wrapper.clientWidth,barLeft:a.options.fixedGutter?c:0,docHeight:d,scrollHeight:d+pb(a)+b.barHeight,nativeBarWidth:b.nativeBarWidth,gutterWidth:c}}function K(a,b,c){this.cm=c;var f=this.vert=pg("div",[pg("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),g=this.horiz=pg("div",[pg("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");a(f),a(g),Jf(f,"scroll",function(){f.clientHeight&&b(f.scrollTop,"vertical")}),Jf(g,"scroll",function(){g.clientWidth&&b(g.scrollLeft,"horizontal")}),this.checkedOverlay=!1,d&&8>e&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}function L(){}function M(a){a.display.scrollbars&&(a.display.scrollbars.clear(),a.display.scrollbars.addClass&&wg(a.display.wrapper,a.display.scrollbars.addClass)),a.display.scrollbars=new v.scrollbarModel[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller),Jf(b,"mousedown",function(){a.state.focused&&setTimeout(function(){a.display.input.focus()},0)}),b.setAttribute("cm-not-content","true")},function(b,c){"horizontal"==c?Ic(a,b):Hc(a,b)},a),a.display.scrollbars.addClass&&xg(a.display.wrapper,a.display.scrollbars.addClass)}function N(a,b){b||(b=J(a));var c=a.display.barWidth,d=a.display.barHeight;O(a,b);for(var e=0;4>e&&c!=a.display.barWidth||d!=a.display.barHeight;e++)c!=a.display.barWidth&&a.options.lineWrapping&&$(a),O(a,J(a)),c=a.display.barWidth,d=a.display.barHeight}function O(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+"px",c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+"px",d.right&&d.bottom?(c.scrollbarFiller.style.display="block",c.scrollbarFiller.style.height=d.bottom+"px",c.scrollbarFiller.style.width=d.right+"px"):c.scrollbarFiller.style.display="",d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display="block",c.gutterFiller.style.height=d.bottom+"px",c.gutterFiller.style.width=b.gutterWidth+"px"):c.gutterFiller.style.display=""}function P(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop;d=Math.floor(d-mb(a));var e=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,f=lf(b,d),g=lf(b,e);if(c&&c.ensure){var h=c.ensure.from.line,i=c.ensure.to.line;f>h?(f=h,g=lf(b,mf(ff(b,h))+a.wrapper.clientHeight)):Math.min(i,b.lastLine())>=g&&(f=lf(b,mf(ff(b,i))-a.wrapper.clientHeight),g=i)}return{from:f,to:Math.max(g,f+1)}}function Q(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=T(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+"px",g=0;g=c.viewFrom&&b.visible.to<=c.viewTo&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo)&&c.renderedView==c.view&&0==oc(a))return!1;R(a)&&(kc(a),b.dims=aa(a));var e=d.first+d.size,f=Math.max(b.visible.from-a.options.viewportMargin,d.first),g=Math.min(e,b.visible.to+a.options.viewportMargin);c.viewFromg&&c.viewTo-g<20&&(g=Math.min(e,c.viewTo)),u&&(f=ue(a.doc,f),g=ve(a.doc,g));var h=f!=c.viewFrom||g!=c.viewTo||c.lastWrapHeight!=b.wrapperHeight||c.lastWrapWidth!=b.wrapperWidth;nc(a,f,g),c.viewOffset=mf(ff(a.doc,c.viewFrom)),a.display.mover.style.top=c.viewOffset+"px";var i=oc(a);if(!h&&0==i&&!b.force&&c.renderedView==c.view&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo))return!1;var j=ug();return i>4&&(c.lineDiv.style.display="none"),ba(a,c.updateLineNumbers,b.dims),i>4&&(c.lineDiv.style.display=""),c.renderedView=c.view,j&&ug()!=j&&j.offsetHeight&&j.focus(),rg(c.cursorDiv),rg(c.selectionDiv),c.gutters.style.height=c.sizer.style.minHeight=0,h&&(c.lastWrapHeight=b.wrapperHeight,c.lastWrapWidth=b.wrapperWidth,ib(a,400)),c.updateLineNumbers=null,!0}function X(a,b){for(var c=b.viewport,d=!0;(d&&a.options.lineWrapping&&b.oldDisplayWidth!=qb(a)||(c&&null!=c.top&&(c={top:Math.min(a.doc.height+nb(a.display)-rb(a),c.top)}),b.visible=P(a.display,a.doc,c),!(b.visible.from>=a.display.viewFrom&&b.visible.to<=a.display.viewTo)))&&W(a,b);d=!1){$(a);var e=J(a);db(a),Z(a,e),N(a,e)}b.signal(a,"update",a),(a.display.viewFrom!=a.display.reportedViewFrom||a.display.viewTo!=a.display.reportedViewTo)&&(b.signal(a,"viewportChange",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo)}function Y(a,b){var c=new U(a,b);if(W(a,c)){$(a),X(a,c);var d=J(a);db(a),Z(a,d),N(a,d),c.finish()}}function Z(a,b){a.display.sizer.style.minHeight=b.docHeight+"px";var c=b.docHeight+a.display.barHeight;a.display.heightForcer.style.top=c+"px",a.display.gutters.style.height=Math.max(c+pb(a),b.clientHeight)+"px"}function $(a){for(var b=a.display,c=b.lineDiv.offsetTop,f=0;fe){var i=g.node.offsetTop+g.node.offsetHeight;h=i-c,c=i}else{var j=g.node.getBoundingClientRect();h=j.bottom-j.top}var k=g.line.height-h;if(2>h&&(h=Rb(b)),(k>.001||-.001>k)&&(jf(g.line,h),_(g.line),g.rest))for(var l=0;l=b&&m.lineNumber;m.changes&&(dg(m.changes,"gutter")>-1&&(p=!1),ca(a,m,k,c)),p&&(rg(m.lineNumber),m.lineNumber.appendChild(document.createTextNode(S(a.options,k)))),h=m.node.nextSibling}else{var n=ka(a,m,k,c);g.insertBefore(n,h)}k+=m.size}for(;h;)h=i(h)}function ca(a,b,c,d){for(var e=0;ee&&(a.node.style.zIndex=2)),a.node}function ea(a){var b=a.bgClass?a.bgClass+" "+(a.line.bgClass||""):a.line.bgClass;if(b&&(b+=" CodeMirror-linebackground"),a.background)b?a.background.className=b:(a.background.parentNode.removeChild(a.background),a.background=null);else if(b){var c=da(a);a.background=c.insertBefore(pg("div",null,b),c.firstChild)}}function fa(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):Qe(a,b)}function ga(a,b){var c=b.text.className,d=fa(a,b);b.text==b.node&&(b.node=d.pre),b.text.parentNode.replaceChild(d.pre,b.text),b.text=d.pre,d.bgClass!=b.bgClass||d.textClass!=b.textClass?(b.bgClass=d.bgClass,b.textClass=d.textClass,ha(b)):c&&(b.text.className=c)}function ha(a){ea(a),a.line.wrapClass?da(a).className=a.line.wrapClass:a.node!=a.text&&(a.node.className="");var b=a.textClass?a.textClass+" "+(a.line.textClass||""):a.line.textClass;a.text.className=b||""}function ia(a,b,c,d){if(b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null),b.gutterBackground&&(b.node.removeChild(b.gutterBackground),b.gutterBackground=null),b.line.gutterClass){var e=da(b);b.gutterBackground=pg("div",null,"CodeMirror-gutter-background "+b.line.gutterClass,"left: "+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+"px; width: "+d.gutterTotalWidth+"px"),e.insertBefore(b.gutterBackground,b.text)}var f=b.line.gutterMarkers;if(a.options.lineNumbers||f){var e=da(b),g=b.gutter=pg("div",null,"CodeMirror-gutter-wrapper","left: "+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+"px");if(a.display.input.setUneditable(g),e.insertBefore(g,b.text),b.line.gutterClass&&(g.className+=" "+b.line.gutterClass),!a.options.lineNumbers||f&&f["CodeMirror-linenumbers"]||(b.lineNumber=g.appendChild(pg("div",S(a.options,c),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+d.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+a.display.lineNumInnerWidth+"px"))),f)for(var h=0;h1)if(va&&va.join("\n")==b){if(d.ranges.length%va.length==0){i=[];for(var j=0;j=0;j--){var k=d.ranges[j],l=k.from(),m=k.to();k.empty()&&(c&&c>0?l=oa(l.line,l.ch-c):a.state.overwrite&&!g&&(m=oa(m.line,Math.min(ff(f,m.line).text.length,m.ch+bg(h).length))));var n=a.curOp.updateInput,o={from:l,to:m,text:i?i[j%i.length]:h,origin:e||(g?"paste":a.state.cutIncoming?"cut":"+input")};hd(a.doc,o),Nf(a,"inputRead",a,o)}b&&!g&&ya(a,b),td(a),a.curOp.updateInput=n,a.curOp.typing=!0,a.state.pasteIncoming=a.state.cutIncoming=!1}function xa(a,b){var c=a.clipboardData&&a.clipboardData.getData("text/plain");return c?(a.preventDefault(),ua(b)||b.options.disableInput||cc(b,function(){wa(b,c,0,null,"paste")}),!0):void 0}function ya(a,b){if(a.options.electricChars&&a.options.smartIndent)for(var c=a.doc.sel,d=c.ranges.length-1;d>=0;d--){var e=c.ranges[d];if(!(e.head.ch>100||d&&c.ranges[d-1].head.line==e.head.line)){var f=a.getModeAt(e.head),g=!1;if(f.electricChars){for(var h=0;h-1){g=vd(a,e.head.line,"smart");break}}else f.electricInput&&f.electricInput.test(ff(a.doc,e.head.line).text.slice(0,e.head.ch))&&(g=vd(a,e.head.line,"smart"));g&&Nf(a,"electricInput",a,e.head.line)}}}function za(a){for(var b=[],c=[],d=0;de?i.map:j[e],g=0;ge?a.line:a.rest[e]),l=f[g]+d;return(0>d||h!=b)&&(l=f[g+(d?1:0)]),oa(k,l)}}}var d=a.text.firstChild,e=!1;if(!b||!tg(d,b))return Fa(oa(kf(a.line),0),!0);if(b==d&&(e=!0,b=d.childNodes[c],c=0,!b)){var f=a.rest?bg(a.rest):a.line;return Fa(oa(kf(f),f.text.length),e)}var g=3==b.nodeType?b:null,h=b;for(g||1!=b.childNodes.length||3!=b.firstChild.nodeType||(g=b.firstChild,c&&(c=g.nodeValue.length));h.parentNode!=d;)h=h.parentNode;var i=a.measure,j=i.maps,l=k(g,h,c);if(l)return Fa(l,e);for(var m=h.nextSibling,n=g?g.nodeValue.length-c:0;m;m=m.nextSibling){if(l=k(m,m.firstChild,0))return Fa(oa(l.line,l.ch-n),e);n+=m.textContent.length}for(var o=h.previousSibling,n=c;o;o=o.previousSibling){if(l=k(o,o.firstChild,-1))return Fa(oa(l.line,l.ch+n),e);n+=m.textContent.length}}function Ia(a,b,c,d,e){function i(a){return function(b){return b.id==a}}function j(b){if(1==b.nodeType){var c=b.getAttribute("cm-text");if(null!=c)return""==c&&(c=b.textContent.replace(/\u200b/g,"")),void(f+=c);var l,k=b.getAttribute("cm-marker");if(k){var m=a.findMarks(oa(d,0),oa(e+1,0),i(+k));return void(m.length&&(l=m[0].find())&&(f+=gf(a.doc,l.from,l.to).join(h)))}if("false"==b.getAttribute("contenteditable"))return;for(var n=0;n=0){var g=sa(f.from(),e.from()),h=ra(f.to(),e.to()),i=f.empty()?e.from()==e.head:f.from()==f.head;b>=d&&--b,a.splice(--d,2,new Ka(i?h:g,i?g:h))}}return new Ja(a,b)}function Ma(a,b){return new Ja([new Ka(a,b||a)],0)}function Na(a,b){return Math.max(a.first,Math.min(b,a.first+a.size-1))}function Oa(a,b){if(b.linec?oa(c,ff(a,c).text.length):Pa(b,ff(a,b.line).text.length)}function Pa(a,b){var c=a.ch;return null==c||c>b?oa(a.line,b):0>c?oa(a.line,0):a}function Qa(a,b){return b>=a.first&&b=f.ch:j.to>f.ch))){if(d&&(Lf(k,"beforeCursorEnter"),k.explicitlyCleared)){if(h.markedSpans){--i;continue}break}if(!k.atomic)continue;var l=k.find(0>g?-1:1);if(0==pa(l,f)&&(l.ch+=g,l.ch<0?l=l.line>a.first?Oa(a,oa(l.line-1)):null:l.ch>h.text.length&&(l=l.lineb&&(b=0),b=Math.round(b),d=Math.round(d),f.appendChild(pg("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px; top: "+b+"px; width: "+(null==c?i-a:c)+"px; height: "+(d-b)+"px"))}function k(b,c,d){function m(c,d){return Kb(a,oa(b,c),"div",f,d)}var k,l,f=ff(e,b),g=f.text.length;return Og(nf(f),c||0,null==d?g:d,function(a,b,e){var n,o,p,f=m(a,"left");if(a==b)n=f,o=p=f.left;else{if(n=m(b-1,"right"),"rtl"==e){var q=f;f=n,n=q}o=f.left,p=n.right}null==c&&0==a&&(o=h),n.top-f.top>3&&(j(o,f.top,null,f.bottom),o=h,f.bottoml.bottom||n.bottom==l.bottom&&n.right>l.right)&&(l=n),h+1>o&&(o=h),j(o,n.top,p-o,n.bottom)}),{start:k,end:l}}var d=a.display,e=a.doc,f=document.createDocumentFragment(),g=ob(a.display),h=g.left,i=Math.max(d.sizerWidth,qb(a)-d.sizer.offsetLeft)-g.right,l=b.from(),m=b.to();if(l.line==m.line)k(l.line,l.ch,m.ch);else{var n=ff(e,l.line),o=ff(e,m.line),p=se(n)==se(o),q=k(l.line,l.ch,p?n.text.length+1:null).end,r=k(m.line,p?0:null,m.ch).start;p&&(q.top0?b.blinker=setInterval(function(){b.cursorDiv.style.visibility=(c=!c)?"":"hidden"},a.options.cursorBlinkRate):a.options.cursorBlinkRate<0&&(b.cursorDiv.style.visibility="hidden")}}function ib(a,b){a.doc.mode.startState&&a.doc.frontier=a.display.viewTo)){var c=+new Date+a.options.workTime,d=Jd(b.mode,lb(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,a.display.viewTo+500),function(f){if(b.frontier>=a.display.viewFrom){var g=f.styles,h=f.text.length>a.options.maxHighlightLength,i=Ke(a,f,h?Jd(b.mode,d):d,!0);f.styles=i.styles;var j=f.styleClasses,k=i.classes;k?f.styleClasses=k:j&&(f.styleClasses=null);for(var l=!g||g.length!=f.styles.length||j!=k&&(!j||!k||j.bgClass!=k.bgClass||j.textClass!=k.textClass),m=0;!l&&mc?(ib(a,a.options.workDelay),!0):void 0}),e.length&&cc(a,function(){for(var b=0;bg;--h){if(h<=f.first)return f.first;var i=ff(f,h-1);if(i.stateAfter&&(!c||h<=f.frontier))return h;var j=Zf(i.text,null,a.options.tabSize);(null==e||d>j)&&(e=h-1,d=j)}return e}function lb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!0;var f=kb(a,b,c),g=f>d.first&&ff(d,f-1).stateAfter;return g=g?Jd(d.mode,g):Kd(d.mode),d.iter(f,b,function(c){Me(a,c.text,g);var h=f==b-1||f%5==0||f>=e.viewFrom&&f2&&f.push((i.bottom+j.top)/2-c.top)}}f.push(c.bottom-c.top)}}function tb(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure.cache};for(var d=0;dc)return{map:a.measure.maps[d],cache:a.measure.caches[d],before:!0}}function ub(a,b){b=se(b);var c=kf(b),d=a.display.externalMeasured=new gc(a.doc,b,c);d.lineN=c;var e=d.built=Qe(a,d);return d.text=e.pre,sg(a.display.lineMeasure,e.pre),d}function vb(a,b,c,d){return yb(a,xb(a,b),c,d)}function wb(a,b){if(b>=a.display.viewFrom&&b=c.lineN&&bb?(e=0,f=1,g="left"):j>b?(e=b-i,f=e+1):(h==a.length-3||b==j&&a[h+3]>b)&&(f=j-i,e=f-1,b>=j&&(g="right")),null!=e){if(d=a[h+2],i==j&&c==(d.insertLeft?"left":"right")&&(g=c),"left"==c&&0==e)for(;h&&a[h-2]==a[h-3]&&a[h-1].insertLeft;)d=a[(h-=3)+2],g="left";if("right"==c&&e==j-i)for(;hm;m++){for(;i&&og(b.line.text.charAt(g.coverStart+i));)--i;for(;g.coverStart+je&&0==i&&j==g.coverEnd-g.coverStart)l=h.parentNode.getBoundingClientRect();else if(d&&a.options.lineWrapping){var n=qg(h,i,j).getClientRects();l=n.length?n["right"==f?n.length-1:0]:zb}else l=qg(h,i,j).getBoundingClientRect()||zb;if(l.left||l.right||0==i)break;j=i,i-=1,k="right"}d&&11>e&&(l=Cb(a.display.measure,l))}else{i>0&&(k=f="right");var n;l=a.options.lineWrapping&&(n=h.getClientRects()).length>1?n["right"==f?n.length-1:0]:h.getBoundingClientRect()}if(d&&9>e&&!i&&(!l||!l.left&&!l.right)){var o=h.parentNode.getClientRects()[0];l=o?{left:o.left,right:o.left+Sb(a.display),top:o.top,bottom:o.bottom}:zb}for(var p=l.top-b.rect.top,q=l.bottom-b.rect.top,r=(p+q)/2,s=b.view.measure.heights,m=0;mc.from?g(a-1):g(a,d)}d=d||ff(a.doc,b.line),e||(e=xb(a,d));var i=nf(d),j=b.ch;if(!i)return g(j);var k=Yg(i,j),l=h(j,k);return null!=Xg&&(l.other=h(j,Xg)),l}function Mb(a,b){var c=0,b=Oa(a.doc,b);a.options.lineWrapping||(c=Sb(a.display)*b.ch);var d=ff(a.doc,b.line),e=mf(d)+mb(a.display);return{left:c,right:c,top:e,bottom:e+d.height}}function Nb(a,b,c,d){var e=oa(a,b);return e.xRel=d,c&&(e.outside=!0),e}function Ob(a,b,c){var d=a.doc;if(c+=a.display.viewOffset,0>c)return Nb(d.first,0,!0,-1);var e=lf(d,c),f=d.first+d.size-1;if(e>f)return Nb(d.first+d.size-1,ff(d,f).text.length,!0,1);0>b&&(b=0);for(var g=ff(d,e);;){var h=Pb(a,g,e,b,c),i=qe(g),j=i&&i.find(0,!0);if(!i||!(h.ch>j.from.ch||h.ch==j.from.ch&&h.xRel>0))return h;e=kf(g=j.to.line)}}function Pb(a,b,c,d,e){function j(d){var e=Lb(a,oa(c,d),"line",b,i);return g=!0,f>e.bottom?e.left-h:fq)return Nb(c,n,r,1);for(;;){if(k?n==m||n==$g(b,m,1):1>=n-m){for(var s=o>d||q-d>=d-o?m:n,t=d-(s==m?o:q);og(b.text.charAt(s));)++s;var u=Nb(c,s,s==m?p:r,-1>t?-1:t>1?1:0);return u}var v=Math.ceil(l/2),w=m+v;if(k){w=m;for(var x=0;v>x;++x)w=$g(b,w,1)}var y=j(w);y>d?(n=w,q=y,(r=g)&&(q+=1e3),l=v):(m=w,o=y,p=g,l-=v)}}function Rb(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==Qb){Qb=pg("pre");for(var b=0;49>b;++b)Qb.appendChild(document.createTextNode("x")),Qb.appendChild(pg("br"));Qb.appendChild(document.createTextNode("x"))}sg(a.measure,Qb);var c=Qb.offsetHeight/50;return c>3&&(a.cachedTextHeight=c),rg(a.measure),c||1}function Sb(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b=pg("span","xxxxxxxxxx"),c=pg("pre",[b]);sg(a.measure,c);var d=b.getBoundingClientRect(),e=(d.right-d.left)/10;return e>2&&(a.cachedCharWidth=e),e||10}function Vb(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ub},Tb?Tb.ops.push(a.curOp):a.curOp.ownsGroup=Tb={ops:[a.curOp],delayedCallbacks:[]}}function Wb(a){var b=a.delayedCallbacks,c=0;do{for(;c=c.viewTo)||c.maxLineChanged&&b.options.lineWrapping,a.update=a.mustUpdate&&new U(b,a.mustUpdate&&{top:a.scrollTop,ensure:a.scrollToPos},a.forceUpdate)}function $b(a){a.updatedDisplay=a.mustUpdate&&W(a.cm,a.update)}function _b(a){var b=a.cm,c=b.display;a.updatedDisplay&&$(b),a.barMeasure=J(b),c.maxLineChanged&&!b.options.lineWrapping&&(a.adjustWidthTo=vb(b,c.maxLine,c.maxLine.text.length).left+3,b.display.sizerWidth=a.adjustWidthTo,a.barMeasure.scrollWidth=Math.max(c.scroller.clientWidth,c.sizer.offsetLeft+a.adjustWidthTo+pb(b)+b.display.barWidth),a.maxScrollLeft=Math.max(0,c.sizer.offsetLeft+a.adjustWidthTo-qb(b))),(a.updatedDisplay||a.selectionChanged)&&(a.preparedSelection=c.input.prepareSelection())}function ac(a){var b=a.cm;null!=a.adjustWidthTo&&(b.display.sizer.style.minWidth=a.adjustWidthTo+"px",a.maxScrollLeftf;f=e){var g=new gc(a.doc,ff(a.doc,f),f);e=f+g.size,d.push(g)}return d}function ic(a,b,c,d){null==b&&(b=a.doc.first),null==c&&(c=a.doc.first+a.doc.size),d||(d=0);var e=a.display;if(d&&cb)&&(e.updateLineNumbers=b),a.curOp.viewChanged=!0,b>=e.viewTo)u&&ue(a.doc,b)e.viewFrom?kc(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)kc(a);else if(b<=e.viewFrom){var f=mc(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):kc(a)}else if(c>=e.viewTo){var f=mc(a,b,b,-1);f?(e.view=e.view.slice(0,f.index),e.viewTo=f.lineN):kc(a)}else{var g=mc(a,b,b,-1),h=mc(a,c,c+d,1);g&&h?(e.view=e.view.slice(0,g.index).concat(hc(a,g.lineN,h.lineN)).concat(e.view.slice(h.index)),e.viewTo+=d):kc(a)}var i=e.externalMeasured;i&&(c=e.lineN&&b=d.viewTo)){var f=d.view[lc(a,b)];if(null!=f.node){var g=f.changes||(f.changes=[]);-1==dg(g,c)&&g.push(c)}}}function kc(a){a.display.viewFrom=a.display.viewTo=a.doc.first,a.display.view=[],a.display.viewOffset=0}function lc(a,b){if(b>=a.display.viewTo)return null;if(b-=a.display.viewFrom,0>b)return null;for(var c=a.display.view,d=0;db)return d}function mc(a,b,c,d){var f,e=lc(a,b),g=a.display.view;if(!u||c==a.doc.first+a.doc.size)return{index:e,lineN:c};for(var h=0,i=a.display.viewFrom;e>h;h++)i+=g[h].size;if(i!=b){if(d>0){if(e==g.length-1)return null;f=i+g[e].size-b,e++}else f=i-b;b+=f,c+=f}for(;ue(a.doc,c)!=c;){if(e==(0>d?0:g.length-1))return null;c+=d*g[e-(0>d?1:0)].size,e+=d}return{index:e,lineN:c}}function nc(a,b,c){var d=a.display,e=d.view;0==e.length||b>=d.viewTo||c<=d.viewFrom?(d.view=hc(a,b,c),d.viewFrom=b):(d.viewFrom>b?d.view=hc(a,b,d.viewFrom).concat(d.view):d.viewFromc&&(d.view=d.view.slice(0,lc(a,c)))),d.viewTo=c}function oc(a){for(var b=a.display.view,c=0,d=0;d400}var b=a.display;Jf(b.scroller,"mousedown",dc(a,uc)),d&&11>e?Jf(b.scroller,"dblclick",dc(a,function(b){if(!Pf(a,b)){var c=tc(a,b);if(c&&!Bc(a,b)&&!sc(a.display,b)){Df(b);var d=a.findWordAt(c);Ta(a.doc,d.anchor,d.head)}}})):Jf(b.scroller,"dblclick",function(b){Pf(a,b)||Df(b)}),s||Jf(b.scroller,"contextmenu",function(b){_c(a,b)});var c,f={end:0};Jf(b.scroller,"touchstart",function(a){if(!h(a)){clearTimeout(c);var d=+new Date;b.activeTouch={start:d,moved:!1,prev:d-f.end<=300?f:null},1==a.touches.length&&(b.activeTouch.left=a.touches[0].pageX,b.activeTouch.top=a.touches[0].pageY)}}),Jf(b.scroller,"touchmove",function(){b.activeTouch&&(b.activeTouch.moved=!0)}),Jf(b.scroller,"touchend",function(c){var d=b.activeTouch;if(d&&!sc(b,c)&&null!=d.left&&!d.moved&&new Date-d.start<300){var f,e=a.coordsChar(b.activeTouch,"page");f=!d.prev||i(d,d.prev)?new Ka(e,e):!d.prev.prev||i(d,d.prev.prev)?a.findWordAt(e):new Ka(oa(e.line,0),Oa(a.doc,oa(e.line+1,0))),a.setSelection(f.anchor,f.head),a.focus(),Df(c)}g()}),Jf(b.scroller,"touchcancel",g),Jf(b.scroller,"scroll",function(){b.scroller.clientHeight&&(Hc(a,b.scroller.scrollTop),Ic(a,b.scroller.scrollLeft,!0),Lf(a,"scroll",a))}),Jf(b.scroller,"mousewheel",function(b){Mc(a,b)}),Jf(b.scroller,"DOMMouseScroll",function(b){Mc(a,b)}),Jf(b.wrapper,"scroll",function(){b.wrapper.scrollTop=b.wrapper.scrollLeft=0}),b.dragFunctions={enter:function(b){Pf(a,b)||Gf(b)},over:function(b){Pf(a,b)||(Fc(a,b),Gf(b))},start:function(b){Ec(a,b)},drop:dc(a,Dc),leave:function(){Gc(a)}};var j=b.input.getField();Jf(j,"keyup",function(b){Wc.call(a,b)}),Jf(j,"keydown",dc(a,Uc)),Jf(j,"keypress",dc(a,Xc)),Jf(j,"focus",ig(Zc,a)),Jf(j,"blur",ig($c,a))}function qc(a,b,c){var d=c&&c!=v.Init;if(!b!=!d){var e=a.display.dragFunctions,f=b?Jf:Kf;f(a.display.scroller,"dragstart",e.start),f(a.display.scroller,"dragenter",e.enter),f(a.display.scroller,"dragover",e.over),f(a.display.scroller,"dragleave",e.leave),f(a.display.scroller,"drop",e.drop)}}function rc(a){var b=a.display;(b.lastWrapHeight!=b.wrapper.clientHeight||b.lastWrapWidth!=b.wrapper.clientWidth)&&(b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize())}function sc(a,b){for(var c=Hf(b);c!=a.wrapper;c=c.parentNode)if(!c||1==c.nodeType&&"true"==c.getAttribute("cm-ignore-events")||c.parentNode==a.sizer&&c!=a.mover)return!0}function tc(a,b,c,d){var e=a.display;if(!c&&"true"==Hf(b).getAttribute("cm-not-content"))return null;var f,g,h=e.lineSpace.getBoundingClientRect();try{f=b.clientX-h.left,g=b.clientY-h.top}catch(b){return null}var j,i=Ob(a,f,g);if(d&&1==i.xRel&&(j=ff(a.doc,i.line).text).length==i.ch){var k=Zf(j,j.length,a.options.tabSize)-j.length;i=oa(i.line,Math.max(0,Math.round((f-ob(a.display).left)/Sb(a.display))-k))}return i}function uc(a){var b=this,c=b.display;if(!(c.activeTouch&&c.input.supportsTouch()||Pf(b,a))){if(c.shift=a.shiftKey,sc(c,a))return void(f||(c.scroller.draggable=!1,setTimeout(function(){c.scroller.draggable=!0},100)));if(!Bc(b,a)){var d=tc(b,a);switch(window.focus(),If(a)){case 1:b.state.selectingText?b.state.selectingText(a):d?xc(b,a,d):Hf(a)==c.scroller&&Df(a);break;case 2:f&&(b.state.lastMiddleDown=+new Date),d&&Ta(b.doc,d),setTimeout(function(){c.input.focus()},20),Df(a);break;case 3:s?_c(b,a):Yc(b)}}}}function xc(a,b,c){d?setTimeout(ig(ta,a),0):a.curOp.focus=ug();var f,e=+new Date;wc&&wc.time>e-400&&0==pa(wc.pos,c)?f="triple":vc&&vc.time>e-400&&0==pa(vc.pos,c)?(f="double",wc={time:e,pos:c}):(f="single",vc={time:e,pos:c});var i,g=a.doc.sel,h=o?b.metaKey:b.ctrlKey;a.options.dragDrop&&Dg&&!ua(a)&&"single"==f&&(i=g.contains(c))>-1&&(pa((i=g.ranges[i]).from(),c)<0||c.xRel>0)&&(pa(i.to(),c)>0||c.xRel<0)?yc(a,b,c,h):zc(a,b,c,f,h)}function yc(a,b,c,g){var h=a.display,i=+new Date,j=dc(a,function(k){f&&(h.scroller.draggable=!1),a.state.draggingText=!1,Kf(document,"mouseup",j),Kf(h.scroller,"drop",j),Math.abs(b.clientX-k.clientX)+Math.abs(b.clientY-k.clientY)<10&&(Df(k),!g&&+new Date-200=p;p++){var r=ff(g,p).text,s=$f(r,m,f);m==o?e.push(new Ka(oa(p,s),oa(p,s))):r.length>s&&e.push(new Ka(oa(p,s),oa(p,$f(r,o,f))))}e.length||e.push(new Ka(c,c)),Za(g,La(j.ranges.slice(0,i).concat(e),i),{origin:"*mouse",scroll:!1}),a.scrollIntoView(b)}else{var t=h,u=t.anchor,v=b;if("single"!=d){if("double"==d)var w=a.findWordAt(b);else var w=new Ka(oa(b.line,0),Oa(g,oa(b.line+1,0)));pa(w.anchor,u)>0?(v=w.head,u=sa(t.from(),w.anchor)):(v=w.anchor,u=ra(t.to(),w.head))}var e=j.ranges.slice(0);e[i]=new Ka(Oa(g,u),v),Za(g,La(e,i),Wf)}}function r(b){var c=++q,e=tc(a,b,!0,"rect"==d);if(e)if(0!=pa(e,n)){a.curOp.focus=ug(),o(e);var h=P(f,g);(e.line>=h.to||e.linep.bottom?20:0;i&&setTimeout(dc(a,function(){q==c&&(f.scroller.scrollTop+=i,r(b))}),50)}}function s(b){a.state.selectingText=!1,q=1/0,Df(b),f.input.focus(),Kf(document,"mousemove",t),Kf(document,"mouseup",u),g.history.lastSelOrigin=null}var f=a.display,g=a.doc;Df(b);var h,i,j=g.sel,k=j.ranges;if(e&&!b.shiftKey?(i=g.sel.contains(c),h=i>-1?k[i]:new Ka(c,c)):(h=g.sel.primary(),i=g.sel.primIndex),b.altKey)d="rect",e||(h=new Ka(c,c)),c=tc(a,b,!0,!0),i=-1;else if("double"==d){var l=a.findWordAt(c);h=a.display.shift||g.extend?Sa(g,h,l.anchor,l.head):l}else if("triple"==d){var m=new Ka(oa(c.line,0),Oa(g,oa(c.line+1,0)));h=a.display.shift||g.extend?Sa(g,h,m.anchor,m.head):m}else h=Sa(g,h,c);e?-1==i?(i=k.length,Za(g,La(k.concat([h]),i),{scroll:!1,origin:"*mouse"})):k.length>1&&k[i].empty()&&"single"==d&&!b.shiftKey?(Za(g,La(k.slice(0,i).concat(k.slice(i+1)),0),{scroll:!1,origin:"*mouse"}),j=g.sel):Va(g,i,h,Wf):(i=0,Za(g,new Ja([h],0),Wf),j=g.sel);var n=c,p=f.wrapper.getBoundingClientRect(),q=0,t=dc(a,function(a){If(a)?r(a):s(a)}),u=dc(a,s);a.state.selectingText=u,Jf(document,"mousemove",t),Jf(document,"mouseup",u)}function Ac(a,b,c,d,e){try{var f=b.clientX,g=b.clientY}catch(b){return!1}if(f>=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&Df(b);var h=a.display,i=h.lineDiv.getBoundingClientRect();if(g>i.bottom||!Rf(a,c))return Ff(b);g-=i.top-h.viewOffset;for(var j=0;j=f){var l=lf(a.doc,g),m=a.options.gutters[j];return e(a,c,a,l,m,b),Ff(b)}}}function Bc(a,b){return Ac(a,b,"gutterClick",!0,Nf)}function Dc(a){var b=this;if(Gc(b),!Pf(b,a)&&!sc(b.display,a)){Df(a),d&&(Cc=+new Date);var c=tc(b,a,!0),e=a.dataTransfer.files;if(c&&!ua(b))if(e&&e.length&&window.FileReader&&window.File)for(var f=e.length,g=Array(f),h=0,i=function(a,d){var e=new FileReader;e.onload=dc(b,function(){if(g[d]=e.result,++h==f){c=Oa(b.doc,c);var a={from:c,to:c,text:b.doc.splitLines(g.join(b.doc.lineSeparator())),origin:"paste"};hd(b.doc,a),Ya(b.doc,Ma(c,bd(a)))}}),e.readAsText(a)},j=0;f>j;++j)i(e[j],j);else{if(b.state.draggingText&&b.doc.sel.contains(c)>-1)return b.state.draggingText(a),void setTimeout(function(){b.display.input.focus()},20);try{var g=a.dataTransfer.getData("Text");if(g){if(b.state.draggingText&&!(o?a.altKey:a.ctrlKey))var k=b.listSelections();if($a(b.doc,Ma(c,c)),k)for(var j=0;jj.clientWidth||g&&j.scrollHeight>j.clientHeight){if(g&&o&&f)a:for(var k=c.target,l=h.view;k!=j;k=k.parentNode)for(var m=0;mn?p=Math.max(0,p+n-50):q=Math.min(b.doc.height,q+n+50),Y(b,{top:p,bottom:q})}20>Jc&&(null==h.wheelStartX?(h.wheelStartX=j.scrollLeft,h.wheelStartY=j.scrollTop,h.wheelDX=e,h.wheelDY=g,setTimeout(function(){if(null!=h.wheelStartX){var a=j.scrollLeft-h.wheelStartX,b=j.scrollTop-h.wheelStartY,c=b&&h.wheelDY&&b/h.wheelDY||a&&h.wheelDX&&a/h.wheelDX;h.wheelStartX=h.wheelStartY=null,c&&(Kc=(Kc*Jc+c)/(Jc+1),++Jc)}},200)):(h.wheelDX+=e,h.wheelDY+=g))}}function Nc(a,b,c){if("string"==typeof b&&(b=Ld[b],!b))return!1;a.display.input.ensurePolled();var d=a.display.shift,e=!1;try{ua(a)&&(a.state.suppressEdits=!0),c&&(a.display.shift=!1),e=b(a)!=Uf}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function Oc(a,b,c){for(var d=0;de&&27==a.keyCode&&(a.returnValue=!1);var c=a.keyCode;b.display.shift=16==c||a.shiftKey;var f=Rc(b,a);i&&(Tc=f?c:null,!f&&88==c&&!Kg&&(o?a.metaKey:a.ctrlKey)&&b.replaceSelection("",null,"cut")),18!=c||/\bCodeMirror-crosshair\b/.test(b.display.lineDiv.className)||Vc(b)}}function Vc(a){function c(a){18!=a.keyCode&&a.altKey||(wg(b,"CodeMirror-crosshair"),Kf(document,"keyup",c),Kf(document,"mouseover",c))}var b=a.display.lineDiv;xg(b,"CodeMirror-crosshair"),Jf(document,"keyup",c),Jf(document,"mouseover",c)}function Wc(a){16==a.keyCode&&(this.doc.sel.shift=!1),Pf(this,a)}function Xc(a){var b=this;if(!(sc(b.display,a)||Pf(b,a)||a.ctrlKey&&!a.altKey||o&&a.metaKey)){var c=a.keyCode,d=a.charCode;if(i&&c==Tc)return Tc=null,void Df(a);if(!i||a.which&&!(a.which<10)||!Rc(b,a)){var e=String.fromCharCode(null==d?c:d);Sc(b,a,e)||b.display.input.onKeyPress(a)}}}function Yc(a){a.state.delayingBlurEvent=!0,setTimeout(function(){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1,$c(a))},100)}function Zc(a){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1),"nocursor"!=a.options.readOnly&&(a.state.focused||(Lf(a,"focus",a),a.state.focused=!0,xg(a.display.wrapper,"CodeMirror-focused"),a.curOp||a.display.selForContextMenu==a.doc.sel||(a.display.input.reset(),f&&setTimeout(function(){a.display.input.reset(!0)},20)),a.display.input.receivedFocus()),hb(a))}function $c(a){a.state.delayingBlurEvent||(a.state.focused&&(Lf(a,"blur",a),a.state.focused=!1,wg(a.display.wrapper,"CodeMirror-focused")),clearInterval(a.display.blinker),setTimeout(function(){a.state.focused||(a.display.shift=!1)},150))}function _c(a,b){sc(a.display,b)||ad(a,b)||a.display.input.onContextMenu(b)}function ad(a,b){return Rf(a,"gutterContextMenu")?Ac(a,b,"gutterContextMenu",!1,Lf):!1}function cd(a,b){if(pa(a,b.from)<0)return a;if(pa(a,b.to)<=0)return bd(b);var c=a.line+b.text.length-(b.to.line-b.from.line)-1,d=a.ch;return a.line==b.to.line&&(d+=bd(b).ch-b.to.ch),oa(c,d)}function dd(a,b){for(var c=[],d=0;d=0;--e)id(a,{from:d[e].from,to:d[e].to,text:e?[""]:b.text});else id(a,b)}}function id(a,b){if(1!=b.text.length||""!=b.text[0]||0!=pa(b.from,b.to)){var c=dd(a,b);sf(a,b,c,a.cm?a.cm.curOp.id:NaN),ld(a,b,c,fe(a,b));var d=[];df(a,function(a,c){c||-1!=dg(d,a.history)||(Cf(a.history,b),d.push(a.history)),ld(a,b,null,fe(a,b))})}}function jd(a,b,c){if(!a.cm||!a.cm.state.suppressEdits){for(var e,d=a.history,f=a.sel,g="undo"==b?d.done:d.undone,h="undo"==b?d.undone:d.done,i=0;i=0;--i){var l=e.changes[i];if(l.origin=b,k&&!gd(a,l,!1))return void(g.length=0);j.push(pf(a,l));var m=i?dd(a,l):bg(g);ld(a,l,m,he(a,l)),!i&&a.cm&&a.cm.scrollIntoView({from:l.from,to:bd(l)});var n=[];df(a,function(a,b){b||-1!=dg(n,a.history)||(Cf(a.history,l),n.push(a.history)),ld(a,l,null,he(a,l))})}}}}function kd(a,b){if(0!=b&&(a.first+=b,a.sel=new Ja(eg(a.sel.ranges,function(a){return new Ka(oa(a.anchor.line+b,a.anchor.ch),oa(a.head.line+b,a.head.ch))}),a.sel.primIndex),a.cm)){ic(a.cm,a.first,a.first-b,b);for(var c=a.cm.display,d=c.viewFrom;da.lastLine())){if(b.from.linef&&(b={from:b.from,to:oa(f,ff(a,f).text.length),text:[b.text[0]],origin:b.origin}),b.removed=gf(a,b.from,b.to),c||(c=dd(a,b)),a.cm?md(a.cm,b,d):Ye(a,b,d),$a(a,c,Vf)}}function md(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,i=f.line;a.options.lineWrapping||(i=kf(se(ff(d,f.line))),d.iter(i,g.line+1,function(a){return a==e.maxLine?(h=!0,!0):void 0})),d.sel.contains(b.from,b.to)>-1&&Qf(a),Ye(d,b,c,A(a)),a.options.lineWrapping||(d.iter(i,f.line+b.text.length,function(a){var b=G(a);b>e.maxLineLength&&(e.maxLine=a,e.maxLineLength=b,e.maxLineChanged=!0,h=!1)}),h&&(a.curOp.updateMaxLine=!0)),d.frontier=Math.min(d.frontier,f.line),ib(a,400);var j=b.text.length-(g.line-f.line)-1;b.full?ic(a):f.line!=g.line||1!=b.text.length||Xe(a.doc,b)?ic(a,f.line,g.line+1,j):jc(a,f.line,"text");var k=Rf(a,"changes"),l=Rf(a,"change");if(l||k){var m={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin};l&&Nf(a,"change",a,m),k&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(m)}a.display.selForContextMenu=null}function nd(a,b,c,d,e){if(d||(d=c),pa(d,c)<0){var f=d;d=c,c=f}"string"==typeof b&&(b=a.splitLines(b)),hd(a,{from:c,to:d,text:b,origin:e})}function od(a,b){if(!Pf(a,"scrollCursorIntoView")){var c=a.display,d=c.sizer.getBoundingClientRect(),e=null;if(b.top+d.top<0?e=!0:b.bottom+d.top>(window.innerHeight||document.documentElement.clientHeight)&&(e=!1),null!=e&&!l){var f=pg("div","\u200b",null,"position: absolute; top: "+(b.top-c.viewOffset-mb(a.display))+"px; height: "+(b.bottom-b.top+pb(a)+c.barHeight)+"px; left: "+b.left+"px; width: 2px;");a.display.lineSpace.appendChild(f),f.scrollIntoView(e),a.display.lineSpace.removeChild(f)}}}function pd(a,b,c,d){null==d&&(d=0);for(var e=0;5>e;e++){var f=!1,g=Lb(a,b),h=c&&c!=b?Lb(a,c):g,i=rd(a,Math.min(g.left,h.left),Math.min(g.top,h.top)-d,Math.max(g.left,h.left),Math.max(g.bottom,h.bottom)+d),j=a.doc.scrollTop,k=a.doc.scrollLeft;if(null!=i.scrollTop&&(Hc(a,i.scrollTop),Math.abs(a.doc.scrollTop-j)>1&&(f=!0)),null!=i.scrollLeft&&(Ic(a,i.scrollLeft),Math.abs(a.doc.scrollLeft-k)>1&&(f=!0)),!f)break}return g}function qd(a,b,c,d,e){var f=rd(a,b,c,d,e);null!=f.scrollTop&&Hc(a,f.scrollTop),null!=f.scrollLeft&&Ic(a,f.scrollLeft)}function rd(a,b,c,d,e){var f=a.display,g=Rb(a.display);0>c&&(c=0);var h=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:f.scroller.scrollTop,i=rb(a),j={};e-c>i&&(e=c+i);var k=a.doc.height+nb(f),l=g>c,m=e>k-g;if(h>c)j.scrollTop=l?0:c;else if(e>h+i){var n=Math.min(c,(m?k:e)-i);n!=h&&(j.scrollTop=n)}var o=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:f.scroller.scrollLeft,p=qb(a)-(a.options.fixedGutter?f.gutters.offsetWidth:0),q=d-b>p;return q&&(d=b+p),10>b?j.scrollLeft=0:o>b?j.scrollLeft=Math.max(0,b-(q?0:10)):d>p+o-3&&(j.scrollLeft=d+(q?0:10)-p),j}function sd(a,b,c){(null!=b||null!=c)&&ud(a),null!=b&&(a.curOp.scrollLeft=(null==a.curOp.scrollLeft?a.doc.scrollLeft:a.curOp.scrollLeft)+b),null!=c&&(a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+c)}function td(a){ud(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping||(c=b.ch?oa(b.line,b.ch-1):b,d=oa(b.line,b.ch+1)),a.curOp.scrollToPos={from:c,to:d,margin:a.options.cursorScrollMargin,isCursor:!0}}function ud(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;var c=Mb(a,b.from),d=Mb(a,b.to),e=rd(a,Math.min(c.left,d.left),Math.min(c.top,d.top)-b.margin,Math.max(c.right,d.right),Math.max(c.bottom,d.bottom)+b.margin);a.scrollTo(e.scrollLeft,e.scrollTop)}}function vd(a,b,c,d){var f,e=a.doc;null==c&&(c="add"),"smart"==c&&(e.mode.indent?f=lb(a,b):c="prev");var g=a.options.tabSize,h=ff(e,b),i=Zf(h.text,null,g);h.stateAfter&&(h.stateAfter=null);var k,j=h.text.match(/^\s*/)[0];if(d||/\S/.test(h.text)){if("smart"==c&&(k=e.mode.indent(f,h.text.slice(j.length),h.text),k==Uf||k>150)){if(!d)return;c="prev"}}else k=0,c="not";"prev"==c?k=b>e.first?Zf(ff(e,b-1).text,null,g):0:"add"==c?k=i+a.options.indentUnit:"subtract"==c?k=i-a.options.indentUnit:"number"==typeof c&&(k=i+c),k=Math.max(0,k); +var l="",m=0;if(a.options.indentWithTabs)for(var n=Math.floor(k/g);n;--n)m+=g,l+=" ";if(k>m&&(l+=ag(k-m)),l!=j)return nd(e,l,oa(b,0),oa(b,j.length),"+input"),h.stateAfter=null,!0;for(var n=0;n=0;b--)nd(a.doc,"",d[b].from,d[b].to,"+delete");td(a)})}function yd(a,b,c,d,e){function k(){var b=f+c;return b=a.first+a.size?j=!1:(f=b,i=ff(a,b))}function l(a){var b=(e?$g:_g)(i,g,c,!0);if(null==b){if(a||!k())return j=!1;g=e?(0>c?Sg:Rg)(i):0>c?i.text.length:0}else g=b;return!0}var f=b.line,g=b.ch,h=c,i=ff(a,f),j=!0;if("char"==d)l();else if("column"==d)l(!0);else if("word"==d||"group"==d)for(var m=null,n="group"==d,o=a.cm&&a.cm.getHelper(b,"wordChars"),p=!0;!(0>c)||l(!p);p=!1){var q=i.text.charAt(g)||"\n",r=lg(q,o)?"w":n&&"\n"==q?"n":!n||/\s/.test(q)?null:"p";if(!n||p||r||(r="s"),m&&m!=r){0>c&&(c=1,l());break}if(r&&(m=r),c>0&&!l(!p))break}var s=cb(a,oa(f,g),h,!0);return j||(s.hitSide=!0),s}function zd(a,b,c,d){var g,e=a.doc,f=b.left;if("page"==d){var h=Math.min(a.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);g=b.top+c*(h-(0>c?1.5:.5)*Rb(a.display))}else"line"==d&&(g=c>0?b.bottom+3:b.top-3);for(;;){var i=Ob(a,f,g);if(!i.outside)break;if(0>c?0>=g:g>=e.height){i.hitSide=!0;break}g+=5*c}return i}function Cd(a,b,c,d){v.defaults[a]=b,c&&(Bd[a]=d?function(a,b,d){d!=Dd&&c(a,b,d)}:c)}function Nd(a){for(var c,d,e,f,b=a.split(/-(?!$)/),a=b[b.length-1],g=0;g0||0==g&&f.clearWhenEmpty!==!1)return f;if(f.replacedWith&&(f.collapsed=!0,f.widgetNode=pg("span",[f.replacedWith],"CodeMirror-widget"),d.handleMouseEvents||f.widgetNode.setAttribute("cm-ignore-events","true"),d.insertLeft&&(f.widgetNode.insertLeft=!0)),f.collapsed){if(re(a,b.line,b,c,f)||b.line!=c.line&&re(a,c.line,b,c,f))throw new Error("Inserting collapsed marker partially overlapping an existing one");u=!0}f.addToHistory&&sf(a,{from:b,to:c,origin:"markText"},a.sel,NaN);var j,h=b.line,i=a.cm;if(a.iter(h,c.line+1,function(a){i&&f.collapsed&&!i.options.lineWrapping&&se(a)==i.display.maxLine&&(j=!0),f.collapsed&&h!=b.line&&jf(a,0),ce(a,new _d(f,h==b.line?b.ch:null,h==c.line?c.ch:null)),++h}),f.collapsed&&a.iter(b.line,c.line+1,function(b){we(a,b)&&jf(b,0)}),f.clearOnEnter&&Jf(f,"beforeCursorEnter",function(){f.clear()}),f.readOnly&&(t=!0,(a.history.done.length||a.history.undone.length)&&a.clearHistory()),f.collapsed&&(f.id=++Td,f.atomic=!0),i){if(j&&(i.curOp.updateMaxLine=!0),f.collapsed)ic(i,b.line,c.line+1);else if(f.className||f.title||f.startStyle||f.endStyle||f.css)for(var k=b.line;k<=c.line;k++)jc(i,k,"text");f.atomic&&ab(i.doc),Nf(i,"markerAdded",i,f)}return f}function Xd(a,b,c,d,e){d=hg(d),d.shared=!1;var f=[Vd(a,b,c,d,e)],g=f[0],h=d.widgetNode;return df(a,function(a){h&&(d.widgetNode=h.cloneNode(!0)),f.push(Vd(a,Oa(a,b),Oa(a,c),d,e));for(var i=0;i=b:f.to>b);(e||(e=[])).push(new _d(g,f.from,i?null:f.to))}}return e}function ee(a,b,c){if(a)for(var e,d=0;d=b:f.to>b);if(h||f.from==b&&"bookmark"==g.type&&(!c||f.marker.insertLeft)){var i=null==f.from||(g.inclusiveLeft?f.from<=b:f.from0&&h)for(var l=0;ll;++l)o.push(q);o.push(i)}return o}function ge(a){for(var b=0;b0)){var k=[i,1],l=pa(j.from,h.from),m=pa(j.to,h.to);(0>l||!g.inclusiveLeft&&!l)&&k.push({from:j.from,to:h.from}),(m>0||!g.inclusiveRight&&!m)&&k.push({from:h.to,to:j.to}),e.splice.apply(e,k),i+=k.length-1}}return e}function je(a){var b=a.markedSpans;if(b){for(var c=0;c=0&&0>=l||0>=k&&l>=0)&&(0>=k&&(pa(j.to,c)>0||i.marker.inclusiveRight&&e.inclusiveLeft)||k>=0&&(pa(j.from,d)<0||i.marker.inclusiveLeft&&e.inclusiveRight)))return!0}}}function se(a){for(var b;b=pe(a);)a=b.find(-1,!0).line;return a}function te(a){for(var b,c;b=qe(a);)a=b.find(1,!0).line,(c||(c=[])).push(a);return c}function ue(a,b){var c=ff(a,b),d=se(c);return c==d?b:kf(d)}function ve(a,b){if(b>a.lastLine())return b;var d,c=ff(a,b);if(!we(a,c))return b;for(;d=qe(c);)c=d.find(1,!0).line;return kf(c)+1}function we(a,b){var c=u&&b.markedSpans;if(c)for(var d,e=0;ee;e++){d&&(d[0]=v.innerMode(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw new Error("Mode "+a.name+" failed to advance stream.")}function Ie(a,b,c,d){function e(a){return{start:k.start,end:k.pos,string:k.current(),type:h||null,state:a?Jd(f.mode,j):j}}var h,f=a.doc,g=f.mode;b=Oa(f,b);var l,i=ff(f,b.line),j=lb(a,b.line,c),k=new Sd(i.text,a.options.tabSize);for(d&&(l=[]);(d||k.posa.options.maxHighlightLength?(h=!1,g&&Me(a,b,d,k.pos),k.pos=b.length,l=null):l=Fe(He(c,k,d,m),f),m){var n=m[0].name;n&&(l="m-"+(l?n+" "+l:n))}if(!h||j!=l){for(;ij;){var d=e[i];d>a&&e.splice(i,1,a,e[i+1],d),i+=2,j=Math.min(a,d)}if(b)if(h.opaque)e.splice(c,i-c,a,"cm-overlay "+b),i=c+2;else for(;i>c;c+=2){var f=e[c+1];e[c+1]=(f?f+" ":"")+"cm-overlay "+b}},f)}return{styles:e,classes:f.bgClass||f.textClass?f:null}}function Le(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=lb(a,kf(b)),e=Ke(a,b,b.text.length>a.options.maxHighlightLength?Jd(a.doc.mode,d):d);b.stateAfter=d,b.styles=e.styles,e.classes?b.styleClasses=e.classes:b.styleClasses&&(b.styleClasses=null),c===a.doc.frontier&&a.doc.frontier++}return b.styles}function Me(a,b,c,d){var e=a.doc.mode,f=new Sd(b,a.options.tabSize);for(f.start=f.pos=d||0,""==b&&Ge(e,c);!f.eol();)He(e,f,c),f.start=f.pos}function Pe(a,b){if(!a||/^\s*$/.test(a))return null;var c=b.addModeClass?Oe:Ne;return c[a]||(c[a]=a.replace(/\S+/g,"cm-$&"))}function Qe(a,b){var c=pg("span",null,null,f?"padding-right: .1px":null),e={pre:pg("pre",[c],"CodeMirror-line"),content:c,col:0,pos:0,cm:a,splitSpaces:(d||f)&&a.getOption("lineWrapping")};b.measure={};for(var g=0;g<=(b.rest?b.rest.length:0);g++){var i,h=g?b.rest[g-1]:b.line;e.pos=0,e.addToken=Se,Hg(a.display.measure)&&(i=nf(h))&&(e.addToken=Ue(e.addToken,i)),e.map=[];var j=b!=a.display.externalMeasured&&kf(h);We(h,e,Le(a,h,j)),h.styleClasses&&(h.styleClasses.bgClass&&(e.bgClass=yg(h.styleClasses.bgClass,e.bgClass||"")),h.styleClasses.textClass&&(e.textClass=yg(h.styleClasses.textClass,e.textClass||""))),0==e.map.length&&e.map.push(0,0,e.content.appendChild(Fg(a.display.measure))),0==g?(b.measure.map=e.map,b.measure.cache={}):((b.measure.maps||(b.measure.maps=[])).push(e.map),(b.measure.caches||(b.measure.caches=[])).push({}))}return f&&/\bcm-tab\b/.test(e.content.lastChild.className)&&(e.content.className="cm-tab-wrap-hack"),Lf(a,"renderLine",a,b.line,e.pre),e.pre.className&&(e.textClass=yg(e.pre.className,e.textClass||"")),e}function Re(a){var b=pg("span","\u2022","cm-invalidchar");return b.title="\\u"+a.charCodeAt(0).toString(16),b.setAttribute("aria-label",b.title),b}function Se(a,b,c,f,g,h,i){if(b){var j=a.splitSpaces?b.replace(/ {3,}/g,Te):b,k=a.cm.state.specialChars,l=!1;if(k.test(b))for(var m=document.createDocumentFragment(),n=0;;){k.lastIndex=n;var o=k.exec(b),p=o?o.index-n:b.length-n;if(p){var q=document.createTextNode(j.slice(n,n+p));d&&9>e?m.appendChild(pg("span",[q])):m.appendChild(q),a.map.push(a.pos,a.pos+p,q),a.col+=p,a.pos+=p}if(!o)break;if(n+=p+1," "==o[0]){var r=a.cm.options.tabSize,s=r-a.col%r,q=m.appendChild(pg("span",ag(s),"cm-tab"));q.setAttribute("role","presentation"),q.setAttribute("cm-text"," "),a.col+=s}else if("\r"==o[0]||"\n"==o[0]){var q=m.appendChild(pg("span","\r"==o[0]?"\u240d":"\u2424","cm-invalidchar"));q.setAttribute("cm-text",o[0]),a.col+=1}else{var q=a.cm.options.specialCharPlaceholder(o[0]);q.setAttribute("cm-text",o[0]),d&&9>e?m.appendChild(pg("span",[q])):m.appendChild(q),a.col+=1}a.map.push(a.pos,a.pos+1,q),a.pos++}else{a.col+=b.length;var m=document.createTextNode(j);a.map.push(a.pos,a.pos+b.length,m),d&&9>e&&(l=!0),a.pos+=b.length}if(c||f||g||l||i){var t=c||"";f&&(t+=f),g&&(t+=g);var u=pg("span",[m],t,i);return h&&(u.title=h),a.content.appendChild(u)}a.content.appendChild(m)}}function Te(a){for(var b=" ",c=0;cj&&m.from<=j)break}if(m.to>=k)return a(c,d,e,f,g,h,i);a(c,d.slice(0,m.to-j),e,f,null,h,i),f=null,d=d.slice(m.to-j),j=m.to}}}function Ve(a,b,c,d){var e=!d&&c.widgetNode;e&&a.map.push(a.pos,a.pos+b,e),!d&&a.cm.display.input.needsContentAttribute&&(e||(e=a.content.appendChild(document.createElement("span"))),e.setAttribute("cm-marker",c.id)),e&&(a.cm.display.input.setUneditable(e),a.content.appendChild(e)),a.pos+=b}function We(a,b,c){var d=a.markedSpans,e=a.text,f=0;if(d)for(var k,l,n,o,p,q,r,h=e.length,i=0,g=1,j="",m=0;;){if(m==i){n=o=p=q=l="",r=null,m=1/0;for(var s=[],t=0;ti||v.collapsed&&u.to==i&&u.from==i)?(null!=u.to&&u.to!=i&&m>u.to&&(m=u.to,o=""),v.className&&(n+=" "+v.className),v.css&&(l=v.css),v.startStyle&&u.from==i&&(p+=" "+v.startStyle),v.endStyle&&u.to==m&&(o+=" "+v.endStyle),v.title&&!q&&(q=v.title),v.collapsed&&(!r||ne(r.marker,v)<0)&&(r=u)):u.from>i&&m>u.from&&(m=u.from)}if(r&&(r.from||0)==i){if(Ve(b,(null==r.to?h+1:r.to)-i,r.marker,null==r.from),null==r.to)return;r.to==i&&(r=!1)}if(!r&&s.length)for(var t=0;t=h)break;for(var w=Math.min(h,m);;){if(j){var x=i+j.length;if(!r){var y=x>w?j.slice(0,w-i):j;b.addToken(b,y,k?k+n:n,p,i+y.length==m?o:"",q,l)}if(x>=w){j=j.slice(w-i),i=w;break}i=x,p=""}j=e.slice(f,f=c[g++]),k=Pe(c[g++],b.cm.options)}}else for(var g=1;gc;++c)f.push(new Ce(j[c],e(c),d));return f}var h=b.from,i=b.to,j=b.text,k=ff(a,h.line),l=ff(a,i.line),m=bg(j),n=e(j.length-1),o=i.line-h.line;if(b.full)a.insert(0,g(0,j.length)),a.remove(j.length,a.size-j.length);else if(Xe(a,b)){var p=g(0,j.length-1);f(l,l.text,n),o&&a.remove(h.line,o),p.length&&a.insert(h.line,p)}else if(k==l)if(1==j.length)f(k,k.text.slice(0,h.ch)+m+k.text.slice(i.ch),n);else{var p=g(1,j.length-1);p.push(new Ce(m+k.text.slice(i.ch),n,d)),f(k,k.text.slice(0,h.ch)+j[0],e(0)),a.insert(h.line+1,p)}else if(1==j.length)f(k,k.text.slice(0,h.ch)+j[0]+l.text.slice(i.ch),e(0)),a.remove(h.line+1,o);else{f(k,k.text.slice(0,h.ch)+j[0],e(0)),f(l,m+l.text.slice(i.ch),n);var p=g(1,j.length-1);o>1&&a.remove(h.line+1,o-1),a.insert(h.line+1,p)}Nf(a,"change",a,b)}function Ze(a){this.lines=a,this.parent=null;for(var b=0,c=0;bb||b>=a.size)throw new Error("There is no line "+(b+a.first)+" in the document.");for(var c=a;!c.lines;)for(var d=0;;++d){var e=c.children[d],f=e.chunkSize();if(f>b){c=e;break}b-=f}return c.lines[b]}function gf(a,b,c){var d=[],e=b.line;return a.iter(b.line,c.line+1,function(a){var f=a.text;e==c.line&&(f=f.slice(0,c.ch)),e==b.line&&(f=f.slice(b.ch)),d.push(f),++e}),d}function hf(a,b,c){var d=[];return a.iter(b,c,function(a){d.push(a.text)}),d}function jf(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height+=c}function kf(a){if(null==a.parent)return null;for(var b=a.parent,c=dg(b.lines,a),d=b.parent;d;b=d,d=d.parent)for(var e=0;d.children[e]!=b;++e)c+=d.children[e].chunkSize();return c+b.first}function lf(a,b){var c=a.first;a:do{for(var d=0;db){a=e;continue a}b-=f,c+=e.chunkSize()}return c}while(!a.lines);for(var d=0;db)break;b-=h}return c+d}function mf(a){a=se(a);for(var b=0,c=a.parent,d=0;d1&&!a.done[a.done.length-2].ranges?(a.done.pop(),bg(a.done)):void 0}function sf(a,b,c,d){var e=a.history;e.undone.length=0;var g,f=+new Date;if((e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&("+"==b.origin.charAt(0)&&a.cm&&e.lastModTime>f-a.cm.options.historyEventDelay||"*"==b.origin.charAt(0)))&&(g=rf(e,e.lastOp==d))){var h=bg(g.changes);0==pa(b.from,b.to)&&0==pa(b.from,h.to)?h.to=bd(b):g.changes.push(pf(a,b))}else{var i=bg(e.done);for(i&&i.ranges||vf(a.sel,e.done),g={changes:[pf(a,b)],generation:e.generation},e.done.push(g);e.done.length>e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift()}e.done.push(c),e.generation=++e.maxGeneration,e.lastModTime=e.lastSelTime=f,e.lastOp=e.lastSelOp=d,e.lastOrigin=e.lastSelOrigin=b.origin,h||Lf(a,"historyAdded")}function tf(a,b,c,d){var e=b.charAt(0);return"*"==e||"+"==e&&c.ranges.length==d.ranges.length&&c.somethingSelected()==d.somethingSelected()&&new Date-a.history.lastSelTime<=(a.cm?a.cm.options.historyEventDelay:500)}function uf(a,b,c,d){var e=a.history,f=d&&d.origin;c==e.lastSelOp||f&&e.lastSelOrigin==f&&(e.lastModTime==e.lastSelTime&&e.lastOrigin==f||tf(a,f,bg(e.done),b))?e.done[e.done.length-1]=b:vf(b,e.done),e.lastSelTime=+new Date,e.lastSelOrigin=f,e.lastSelOp=c,d&&d.clearRedo!==!1&&qf(e.undone)}function vf(a,b){var c=bg(b);c&&c.ranges&&c.equals(a)||b.push(a)}function wf(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+a.size,d),function(c){c.markedSpans&&((e||(e=b["spans_"+a.id]={}))[f]=c.markedSpans),++f})}function xf(a){if(!a)return null;for(var c,b=0;b-1&&(bg(h)[l]=j[l],delete j[l])}}}return e}function Af(a,b,c,d){c0}function Sf(a){a.prototype.on=function(a,b){Jf(this,a,b)},a.prototype.off=function(a,b){Kf(this,a,b)}}function Yf(){this.id=null}function $f(a,b,c){for(var d=0,e=0;;){var f=a.indexOf(" ",d);-1==f&&(f=a.length);var g=f-d;if(f==a.length||e+g>=b)return d+Math.min(g,b-e);if(e+=f-d,e+=c-e%c,d=f+1,e>=b)return d}}function ag(a){for(;_f.length<=a;)_f.push(bg(_f)+" ");return _f[a]}function bg(a){return a[a.length-1]}function dg(a,b){for(var c=0;c-1&&kg(a)?!0:b.test(a):kg(a)}function mg(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;return!0}function og(a){return a.charCodeAt(0)>=768&&ng.test(a)}function pg(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=c),d&&(e.style.cssText=d),"string"==typeof b)e.appendChild(document.createTextNode(b));else if(b)for(var f=0;f0;--b)a.removeChild(a.firstChild);return a}function sg(a,b){return rg(a).appendChild(b)}function ug(){for(var a=document.activeElement;a&&a.root&&a.root.activeElement;)a=a.root.activeElement;return a}function vg(a){return new RegExp("(^|\\s)"+a+"(?:$|\\s)\\s*")}function yg(a,b){for(var c=a.split(" "),d=0;d2&&!(d&&8>e))}var c=Eg?pg("span","\u200b"):pg("span","\xa0",null,"display: inline-block; width: 1px; margin-right: -1px");return c.setAttribute("cm-text",""),c}function Hg(a){if(null!=Gg)return Gg;var b=sg(a,document.createTextNode("A\u062eA")),c=qg(b,0,1).getBoundingClientRect();if(!c||c.left==c.right)return!1;var d=qg(b,1,2).getBoundingClientRect();return Gg=d.right-c.right<3}function Mg(a){if(null!=Lg)return Lg;var b=sg(a,pg("span","x")),c=b.getBoundingClientRect(),d=qg(b,0,1).getBoundingClientRect();return Lg=Math.abs(c.left-d.left)>1}function Og(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=!1,f=0;fb||b==c&&g.to==b)&&(d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?"rtl":"ltr"),e=!0)}e||d(b,c,"ltr")}function Pg(a){return a.level%2?a.to:a.from}function Qg(a){return a.level%2?a.from:a.to}function Rg(a){var b=nf(a);return b?Pg(b[0]):0}function Sg(a){var b=nf(a);return b?Qg(bg(b)):a.text.length}function Tg(a,b){var c=ff(a.doc,b),d=se(c);d!=c&&(b=kf(d));var e=nf(d),f=e?e[0].level%2?Sg(d):Rg(d):0;return oa(b,f)}function Ug(a,b){for(var c,d=ff(a.doc,b);c=qe(d);)d=c.find(1,!0).line,b=null;var e=nf(d),f=e?e[0].level%2?Rg(d):Sg(d):d.text.length;return oa(null==b?kf(d):b,f)}function Vg(a,b){var c=Tg(a,b.line),d=ff(a.doc,c.line),e=nf(d);if(!e||0==e[0].level){var f=Math.max(0,d.text.search(/\S/)),g=b.line==c.line&&b.ch<=f&&b.ch;return oa(c.line,g?0:f)}return c}function Wg(a,b,c){var d=a[0].level;return b==d?!0:c==d?!1:c>b}function Yg(a,b){Xg=null;for(var d,c=0;cb)return c;if(e.from==b||e.to==b){if(null!=d)return Wg(a,e.level,a[d].level)?(e.from!=e.to&&(Xg=d),c):(e.from!=e.to&&(Xg=c),d);d=c}}return d}function Zg(a,b,c,d){if(!d)return b+c;do b+=c;while(b>0&&og(a.text.charAt(b)));return b}function $g(a,b,c,d){var e=nf(a);if(!e)return _g(a,b,c,d);for(var f=Yg(e,b),g=e[f],h=Zg(a,b,g.level%2?-c:c,d);;){if(h>g.from&&h0==g.level%2?g.to:g.from);if(g=e[f+=c],!g)return null;h=c>0==g.level%2?Zg(a,g.to,-1,d):Zg(a,g.from,1,d)}}function _g(a,b,c,d){var e=b+c;if(d)for(;e>0&&og(a.text.charAt(e));)e+=c;return 0>e||e>a.text.length?null:e}var a=/gecko\/\d/i.test(navigator.userAgent),b=/MSIE \d/.test(navigator.userAgent),c=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),d=b||c,e=d&&(b?document.documentMode||6:c[1]),f=/WebKit\//.test(navigator.userAgent),g=f&&/Qt\/\d+\.\d+/.test(navigator.userAgent),h=/Chrome\//.test(navigator.userAgent),i=/Opera\//.test(navigator.userAgent),j=/Apple Computer/.test(navigator.vendor),k=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),l=/PhantomJS/.test(navigator.userAgent),m=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),n=m||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),o=m||/Mac/.test(navigator.platform),p=/win/i.test(navigator.platform),q=i&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);q&&(q=Number(q[1])),q&&q>=15&&(i=!1,f=!0);var r=o&&(g||i&&(null==q||12.11>q)),s=a||d&&e>=9,t=!1,u=!1;K.prototype=hg({update:function(a){var b=a.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;if(c){this.vert.style.display="block",this.vert.style.bottom=b?d+"px":"0";var e=a.viewHeight-(b?d:0);this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+e)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(b){this.horiz.style.display="block",this.horiz.style.right=c?d+"px":"0",this.horiz.style.left=a.barLeft+"px";var f=a.viewWidth-a.barLeft-(c?d:0);this.horiz.firstChild.style.width=a.scrollWidth-a.clientWidth+f+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedOverlay&&a.clientHeight>0&&(0==d&&this.overlayHack(),this.checkedOverlay=!0),{right:c?d:0,bottom:b?d:0}},setScrollLeft:function(a){this.horiz.scrollLeft!=a&&(this.horiz.scrollLeft=a)},setScrollTop:function(a){this.vert.scrollTop!=a&&(this.vert.scrollTop=a)},overlayHack:function(){var a=o&&!k?"12px":"18px";this.horiz.style.minHeight=this.vert.style.minWidth=a;var b=this,c=function(a){Hf(a)!=b.vert&&Hf(a)!=b.horiz&&dc(b.cm,uc)(a)};Jf(this.vert,"mousedown",c),Jf(this.horiz,"mousedown",c)},clear:function(){var a=this.horiz.parentNode;a.removeChild(this.horiz),a.removeChild(this.vert)}},K.prototype),L.prototype=hg({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},L.prototype),v.scrollbarModel={"native":K,"null":L},U.prototype.signal=function(a,b){Rf(a,b)&&this.events.push(arguments)},U.prototype.finish=function(){for(var a=0;a=9&&b.hasSelection&&(b.hasSelection=null),b.poll()}),Jf(g,"paste",function(a){return xa(a,c)?!0:(c.state.pasteIncoming=!0,void b.fastPoll())}),Jf(g,"cut",h),Jf(g,"copy",h),Jf(a.scroller,"paste",function(d){ +sc(a,d)||(c.state.pasteIncoming=!0,b.focus())}),Jf(a.lineSpace,"selectstart",function(b){sc(a,b)||Df(b)}),Jf(g,"compositionstart",function(){var a=c.getCursor("from");b.composing={start:a,range:c.markText(a,c.getCursor("to"),{className:"CodeMirror-composing"})}}),Jf(g,"compositionend",function(){b.composing&&(b.poll(),b.composing.range.clear(),b.composing=null)})},prepareSelection:function(){var a=this.cm,b=a.display,c=a.doc,d=eb(a);if(a.options.moveInputWithCursor){var e=Lb(a,c.sel.primary().head,"div"),f=b.wrapper.getBoundingClientRect(),g=b.lineDiv.getBoundingClientRect();d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-10,e.top+g.top-f.top)),d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,e.left+g.left-f.left))}return d},showSelection:function(a){var b=this.cm,c=b.display;sg(c.cursorDiv,a.cursors),sg(c.selectionDiv,a.selection),null!=a.teTop&&(this.wrapper.style.top=a.teTop+"px",this.wrapper.style.left=a.teLeft+"px")},reset:function(a){if(!this.contextMenuPending){var b,c,f=this.cm,g=f.doc;if(f.somethingSelected()){this.prevInput="";var h=g.sel.primary();b=Kg&&(h.to().line-h.from().line>100||(c=f.getSelection()).length>1e3);var i=b?"-":c||f.getSelection();this.textarea.value=i,f.state.focused&&cg(this.textarea),d&&e>=9&&(this.hasSelection=i)}else a||(this.prevInput=this.textarea.value="",d&&e>=9&&(this.hasSelection=null));this.inaccurateSelection=b}},getField:function(){return this.textarea},supportsTouch:function(){return!1},focus:function(){if("nocursor"!=this.cm.options.readOnly&&(!n||ug()!=this.textarea))try{this.textarea.focus()}catch(a){}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var a=this;a.pollingFast||a.polling.set(this.cm.options.pollInterval,function(){a.poll(),a.cm.state.focused&&a.slowPoll()})},fastPoll:function(){function c(){var d=b.poll();d||a?(b.pollingFast=!1,b.slowPoll()):(a=!0,b.polling.set(60,c))}var a=!1,b=this;b.pollingFast=!0,b.polling.set(20,c)},poll:function(){var a=this.cm,b=this.textarea,c=this.prevInput;if(this.contextMenuPending||!a.state.focused||Jg(b)&&!c&&!this.composing||ua(a)||a.options.disableInput||a.state.keySeq)return!1;var f=b.value;if(f==c&&!a.somethingSelected())return!1;if(d&&e>=9&&this.hasSelection===f||o&&/[\uf700-\uf7ff]/.test(f))return a.display.input.reset(),!1;if(a.doc.sel==a.display.selForContextMenu){var g=f.charCodeAt(0);if(8203!=g||c||(c="\u200b"),8666==g)return this.reset(),this.cm.execCommand("undo")}for(var h=0,i=Math.min(c.length,f.length);i>h&&c.charCodeAt(h)==f.charCodeAt(h);)++h;var j=this;return cc(a,function(){wa(a,f.slice(h),c.length-h,null,j.composing?"*compose":null),f.length>1e3||f.indexOf("\n")>-1?b.value=j.prevInput="":j.prevInput=f,j.composing&&(j.composing.range.clear(),j.composing.range=a.markText(j.composing.start,a.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},ensurePolled:function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},onKeyPress:function(){d&&e>=9&&(this.hasSelection=null),this.fastPoll()},onContextMenu:function(a){function o(){if(null!=h.selectionStart){var a=c.somethingSelected(),d="\u200b"+(a?h.value:"");h.value="\u21da",h.value=d,b.prevInput=a?"":"\u200b",h.selectionStart=1,h.selectionEnd=d.length,g.selForContextMenu=c.doc.sel}}function p(){if(b.contextMenuPending=!1,b.wrapper.style.position="relative",h.style.cssText=m,d&&9>e&&g.scrollbars.setScrollTop(g.scroller.scrollTop=k),null!=h.selectionStart){(!d||d&&9>e)&&o();var a=0,f=function(){g.selForContextMenu==c.doc.sel&&0==h.selectionStart&&h.selectionEnd>0&&"\u200b"==b.prevInput?dc(c,Ld.selectAll)(c):a++<10?g.detectingSelectAll=setTimeout(f,500):g.input.reset()};g.detectingSelectAll=setTimeout(f,200)}}var b=this,c=b.cm,g=c.display,h=b.textarea,j=tc(c,a),k=g.scroller.scrollTop;if(j&&!i){var l=c.options.resetSelectionOnContextMenu;l&&-1==c.doc.sel.contains(j)&&dc(c,Za)(c.doc,Ma(j),Vf);var m=h.style.cssText;if(b.wrapper.style.position="absolute",h.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(a.clientY-5)+"px; left: "+(a.clientX-5)+"px; z-index: 1000; background: "+(d?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",f)var n=window.scrollY;if(g.input.focus(),f&&window.scrollTo(null,n),g.input.reset(),c.somethingSelected()||(h.value=b.prevInput=" "),b.contextMenuPending=!0,g.selForContextMenu=c.doc.sel,clearTimeout(g.detectingSelectAll),d&&e>=9&&o(),s){Gf(a);var q=function(){Kf(window,"mouseup",q),setTimeout(p,20)};Jf(window,"mouseup",q)}else setTimeout(p,50)}},setUneditable:fg,needsContentAttribute:!1},Ba.prototype),Da.prototype=hg({init:function(a){function e(a){if(c.somethingSelected())va=c.getSelections(),"cut"==a.type&&c.replaceSelection("",null,"cut");else{if(!c.options.lineWiseCopyCut)return;var b=za(c);va=b.text,"cut"==a.type&&c.operation(function(){c.setSelections(b.ranges,0,Vf),c.replaceSelection("",null,"cut")})}if(a.clipboardData&&!m)a.preventDefault(),a.clipboardData.clearData(),a.clipboardData.setData("text/plain",va.join("\n"));else{var d=Ca(),e=d.firstChild;c.display.lineSpace.insertBefore(d,c.display.lineSpace.firstChild),e.value=va.join("\n");var f=document.activeElement;cg(e),setTimeout(function(){c.display.lineSpace.removeChild(d),f.focus()},50)}}var b=this,c=b.cm,d=b.div=a.lineDiv;d.contentEditable="true",Aa(d),Jf(d,"paste",function(a){xa(a,c)}),Jf(d,"compositionstart",function(a){var d=a.data;if(b.composing={sel:c.doc.sel,data:d,startData:d},d){var e=c.doc.sel.primary(),f=c.getLine(e.head.line),g=f.indexOf(d,Math.max(0,e.head.ch-d.length));g>-1&&g<=e.head.ch&&(b.composing.sel=Ma(oa(e.head.line,g),oa(e.head.line,g+d.length)))}}),Jf(d,"compositionupdate",function(a){b.composing.data=a.data}),Jf(d,"compositionend",function(a){var c=b.composing;c&&(a.data==c.startData||/\u200b/.test(a.data)||(c.data=a.data),setTimeout(function(){c.handled||b.applyComposition(c),b.composing==c&&(b.composing=null)},50))}),Jf(d,"touchstart",function(){b.forceCompositionEnd()}),Jf(d,"input",function(){b.composing||b.pollContent()||cc(b.cm,function(){ic(c)})}),Jf(d,"copy",e),Jf(d,"cut",e)},prepareSelection:function(){var a=eb(this.cm,!1);return a.focus=this.cm.state.focused,a},showSelection:function(a){a&&this.cm.display.view.length&&(a.focus&&this.showPrimarySelection(),this.showMultipleSelections(a))},showPrimarySelection:function(){var b=window.getSelection(),c=this.cm.doc.sel.primary(),d=Ga(this.cm,b.anchorNode,b.anchorOffset),e=Ga(this.cm,b.focusNode,b.focusOffset);if(!d||d.bad||!e||e.bad||0!=pa(sa(d,e),c.from())||0!=pa(ra(d,e),c.to())){var f=Ea(this.cm,c.from()),g=Ea(this.cm,c.to());if(f||g){var h=this.cm.display.view,i=b.rangeCount&&b.getRangeAt(0);if(f){if(!g){var j=h[h.length-1].measure,k=j.maps?j.maps[j.maps.length-1]:j.map;g={node:k[k.length-1],offset:k[k.length-2]-k[k.length-3]}}}else f={node:h[0].measure.map[2],offset:0};try{var l=qg(f.node,f.offset,g.offset,g.node)}catch(m){}l&&(b.removeAllRanges(),b.addRange(l),i&&null==b.anchorNode?b.addRange(i):a&&this.startGracePeriod()),this.rememberSelection()}}},startGracePeriod:function(){var a=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){a.gracePeriod=!1,a.selectionChanged()&&a.cm.operation(function(){a.cm.curOp.selectionChanged=!0})},20)},showMultipleSelections:function(a){sg(this.cm.display.cursorDiv,a.cursors),sg(this.cm.display.selectionDiv,a.selection)},rememberSelection:function(){var a=window.getSelection();this.lastAnchorNode=a.anchorNode,this.lastAnchorOffset=a.anchorOffset,this.lastFocusNode=a.focusNode,this.lastFocusOffset=a.focusOffset},selectionInEditor:function(){var a=window.getSelection();if(!a.rangeCount)return!1;var b=a.getRangeAt(0).commonAncestorContainer;return tg(this.div,b)},focus:function(){"nocursor"!=this.cm.options.readOnly&&this.div.focus()},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return!0},receivedFocus:function(){function b(){a.cm.state.focused&&(a.pollSelection(),a.polling.set(a.cm.options.pollInterval,b))}var a=this;this.selectionInEditor()?this.pollSelection():cc(this.cm,function(){a.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,b)},selectionChanged:function(){var a=window.getSelection();return a.anchorNode!=this.lastAnchorNode||a.anchorOffset!=this.lastAnchorOffset||a.focusNode!=this.lastFocusNode||a.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var a=window.getSelection(),b=this.cm;this.rememberSelection();var c=Ga(b,a.anchorNode,a.anchorOffset),d=Ga(b,a.focusNode,a.focusOffset);c&&d&&cc(b,function(){Za(b.doc,Ma(c,d),Vf),(c.bad||d.bad)&&(b.curOp.selectionChanged=!0)})}},pollContent:function(){var a=this.cm,b=a.display,c=a.doc.sel.primary(),d=c.from(),e=c.to();if(d.lineb.viewTo-1)return!1;var f;if(d.line==b.viewFrom||0==(f=lc(a,d.line)))var g=kf(b.view[0].line),h=b.view[0].node;else var g=kf(b.view[f].line),h=b.view[f-1].node.nextSibling;var i=lc(a,e.line);if(i==b.view.length-1)var j=b.viewTo-1,k=b.lineDiv.lastChild;else var j=kf(b.view[i+1].line)-1,k=b.view[i+1].node.previousSibling;for(var l=a.doc.splitLines(Ia(a,h,k,g,j)),m=gf(a.doc,oa(g,0),oa(j,ff(a.doc,j).text.length));l.length>1&&m.length>1;)if(bg(l)==bg(m))l.pop(),m.pop(),j--;else{if(l[0]!=m[0])break;l.shift(),m.shift(),g++}for(var n=0,o=0,p=l[0],q=m[0],r=Math.min(p.length,q.length);r>n&&p.charCodeAt(n)==q.charCodeAt(n);)++n;for(var s=bg(l),t=bg(m),u=Math.min(s.length-(1==l.length?n:0),t.length-(1==m.length?n:0));u>o&&s.charCodeAt(s.length-o-1)==t.charCodeAt(t.length-o-1);)++o;l[l.length-1]=s.slice(0,s.length-o),l[0]=l[0].slice(n);var v=oa(g,n),w=oa(j,m.length?bg(m).length-o:0);return l.length>1||l[0]||pa(v,w)?(nd(a.doc,l,v,w,"+input"),!0):void 0},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){this.composing&&!this.composing.handled&&(this.applyComposition(this.composing),this.composing.handled=!0,this.div.blur(),this.div.focus())},applyComposition:function(a){a.data&&a.data!=a.startData&&dc(this.cm,wa)(this.cm,a.data,0,a.sel)},setUneditable:function(a){a.setAttribute("contenteditable","false")},onKeyPress:function(a){a.preventDefault(),dc(this.cm,wa)(this.cm,String.fromCharCode(null==a.charCode?a.keyCode:a.charCode),0)},onContextMenu:fg,resetPosition:fg,needsContentAttribute:!0},Da.prototype),v.inputStyles={textarea:Ba,contenteditable:Da},Ja.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(a){if(a==this)return!0;if(a.primIndex!=this.primIndex||a.ranges.length!=this.ranges.length)return!1;for(var b=0;b=0&&pa(a,d.to())<=0)return c}return-1}},Ka.prototype={from:function(){return sa(this.anchor,this.head)},to:function(){return ra(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var Qb,vc,wc,zb={left:0,right:0,top:0,bottom:0},Tb=null,Ub=0,Cc=0,Jc=0,Kc=null;d?Kc=-.53:a?Kc=15:h?Kc=-.7:j&&(Kc=-1/3);var Lc=function(a){var b=a.wheelDeltaX,c=a.wheelDeltaY;return null==b&&a.detail&&a.axis==a.HORIZONTAL_AXIS&&(b=a.detail),null==c&&a.detail&&a.axis==a.VERTICAL_AXIS?c=a.detail:null==c&&(c=a.wheelDelta),{x:b,y:c}};v.wheelEventPixels=function(a){var b=Lc(a);return b.x*=Kc,b.y*=Kc,b};var Pc=new Yf,Tc=null,bd=v.changeEnd=function(a){return a.text?oa(a.from.line+a.text.length-1,bg(a.text).length+(1==a.text.length?a.from.ch:0)):a.to};v.prototype={constructor:v,focus:function(){window.focus(),this.display.input.focus()},setOption:function(a,b){var c=this.options,d=c[a];(c[a]!=b||"mode"==a)&&(c[a]=b,Bd.hasOwnProperty(a)&&dc(this,Bd[a])(this,b,d))},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?"push":"unshift"](Rd(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;cc&&(vd(this,e.head.line,a,!0),c=e.head.line,d==this.doc.sel.primIndex&&td(this));else{var f=e.from(),g=e.to(),h=Math.max(c,f.line);c=Math.min(this.lastLine(),g.line-(g.ch?0:1))+1;for(var i=h;c>i;++i)vd(this,i,a);var j=this.doc.sel.ranges;0==f.ch&&b.length==j.length&&j[d].from().ch>0&&Va(this.doc,d,new Ka(f,j[d].to()),Vf)}}}),getTokenAt:function(a,b){return Ie(this,a,b)},getLineTokens:function(a,b){return Ie(this,oa(a),b,!0)},getTokenTypeAt:function(a){a=Oa(this.doc,a);var f,b=Le(this,ff(this.doc,a.line)),c=0,d=(b.length-1)/2,e=a.ch;if(0==e)f=b[2];else for(;;){var g=c+d>>1;if((g?b[2*g-1]:0)>=e)d=g;else{if(!(b[2*g+1]h?f:0==h?null:f.slice(0,h-1)},getModeAt:function(a){var b=this.doc.mode;return b.innerMode?v.innerMode(b,this.getTokenAt(a).state).mode:b},getHelper:function(a,b){return this.getHelpers(a,b)[0]},getHelpers:function(a,b){var c=[];if(!Id.hasOwnProperty(b))return c;var d=Id[b],e=this.getModeAt(a);if("string"==typeof e[b])d[e[b]]&&c.push(d[e[b]]);else if(e[b])for(var f=0;fe&&(a=e,c=!0),d=ff(this.doc,a)}else d=a;return Ib(this,d,{top:0,left:0},b||"page").top+(c?this.doc.height-mf(d):0)},defaultTextHeight:function(){return Rb(this.display)},defaultCharWidth:function(){return Sb(this.display)},setGutterMarker:ec(function(a,b,c){return wd(this.doc,a,"gutter",function(a){var d=a.gutterMarkers||(a.gutterMarkers={});return d[b]=c,!c&&mg(d)&&(a.gutterMarkers=null),!0})}),clearGutter:ec(function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){c.gutterMarkers&&c.gutterMarkers[a]&&(c.gutterMarkers[a]=null,jc(b,d,"gutter"),mg(c.gutterMarkers)&&(c.gutterMarkers=null)),++d})}),lineInfo:function(a){if("number"==typeof a){if(!Qa(this.doc,a))return null;var b=a;if(a=ff(this.doc,a),!a)return null}else{var b=kf(a);if(null==b)return null}return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=Lb(this,Oa(this.doc,a));var g=a.bottom,h=a.left;if(b.style.position="absolute",b.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(b),f.sizer.appendChild(b),"over"==d)g=a.top;else if("above"==d||"near"==d){var i=Math.max(f.wrapper.clientHeight,this.doc.height),j=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);("above"==d||a.bottom+b.offsetHeight>i)&&a.top>b.offsetHeight?g=a.top-b.offsetHeight:a.bottom+b.offsetHeight<=i&&(g=a.bottom),h+b.offsetWidth>j&&(h=j-b.offsetWidth)}b.style.top=g+"px",b.style.left=b.style.right="","right"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right="0px"):("left"==e?h=0:"middle"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+"px"),c&&qd(this,h,g,h+b.offsetWidth,g+b.offsetHeight)},triggerOnKeyDown:ec(Uc),triggerOnKeyPress:ec(Xc),triggerOnKeyUp:Wc,execCommand:function(a){return Ld.hasOwnProperty(a)?Ld[a].call(null,this):void 0},triggerElectric:ec(function(a){ya(this,a)}),findPosH:function(a,b,c,d){var e=1;0>b&&(e=-1,b=-b);for(var f=0,g=Oa(this.doc,a);b>f&&(g=yd(this.doc,g,e,c,d),!g.hitSide);++f);return g},moveH:ec(function(a,b){var c=this;c.extendSelectionsBy(function(d){return c.display.shift||c.doc.extend||d.empty()?yd(c.doc,d.head,a,b,c.options.rtlMoveVisually):0>a?d.from():d.to()},Xf)}),deleteH:ec(function(a,b){var c=this.doc.sel,d=this.doc;c.somethingSelected()?d.replaceSelection("",null,"+delete"):xd(this,function(c){var e=yd(d,c.head,a,b,!1);return 0>a?{from:e,to:c.head}:{from:c.head,to:e}})}),findPosV:function(a,b,c,d){var e=1,f=d;0>b&&(e=-1,b=-b);for(var g=0,h=Oa(this.doc,a);b>g;++g){var i=Lb(this,h,"div");if(null==f?f=i.left:i.left=f,h=zd(this,i,e,c),h.hitSide)break}return h},moveV:ec(function(a,b){var c=this,d=this.doc,e=[],f=!c.display.shift&&!d.extend&&d.sel.somethingSelected();if(d.extendSelectionsBy(function(g){if(f)return 0>a?g.from():g.to();var h=Lb(c,g.head,"div");null!=g.goalColumn&&(h.left=g.goalColumn),e.push(h.left);var i=zd(c,h,a,b);return"page"==b&&g==d.sel.primary()&&sd(c,null,Kb(c,i,"div").top-h.top),i},Xf),e.length)for(var g=0;g0&&h(c.charAt(d-1));)--d;for(;e.5)&&B(this),Lf(this,"refresh",this)}),swapDoc:ec(function(a){var b=this.doc;return b.cm=null,ef(this,a),Fb(this),this.display.input.reset(),this.scrollTo(a.scrollLeft,a.scrollTop),this.curOp.forceScroll=!0,Nf(this,"swapDoc",this,b),b}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Sf(v);var Ad=v.defaults={},Bd=v.optionHandlers={},Dd=v.Init={toString:function(){return"CodeMirror.Init"}};Cd("value","",function(a,b){a.setValue(b)},!0),Cd("mode",null,function(a,b){a.doc.modeOption=b,x(a)},!0),Cd("indentUnit",2,x,!0),Cd("indentWithTabs",!1),Cd("smartIndent",!0),Cd("tabSize",4,function(a){y(a),Fb(a),ic(a)},!0),Cd("lineSeparator",null,function(a,b){if(a.doc.lineSep=b,b){var c=[],d=a.doc.first;a.doc.iter(function(a){for(var e=0;;){var f=a.text.indexOf(b,e);if(-1==f)break;e=f+b.length,c.push(oa(d,f))}d++});for(var e=c.length-1;e>=0;e--)nd(a.doc,b,c[e],oa(c[e].line,c[e].ch+b.length))}}),Cd("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(a,b,c){a.state.specialChars=new RegExp(b.source+(b.test(" ")?"":"| "),"g"),c!=v.Init&&a.refresh()}),Cd("specialCharPlaceholder",Re,function(a){a.refresh()},!0),Cd("electricChars",!0),Cd("inputStyle",n?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Cd("rtlMoveVisually",!p),Cd("wholeLineUpdateBefore",!0),Cd("theme","default",function(a){C(a),D(a)},!0),Cd("keyMap","default",function(a,b,c){var d=Rd(b),e=c!=v.Init&&Rd(c);e&&e.detach&&e.detach(a,d),d.attach&&d.attach(a,e||null)}),Cd("extraKeys",null),Cd("lineWrapping",!1,z,!0),Cd("gutters",[],function(a){I(a.options),D(a)},!0),Cd("fixedGutter",!0,function(a,b){a.display.gutters.style.left=b?T(a.display)+"px":"0",a.refresh()},!0),Cd("coverGutterNextToScrollbar",!1,function(a){N(a)},!0),Cd("scrollbarStyle","native",function(a){M(a),N(a),a.display.scrollbars.setScrollTop(a.doc.scrollTop),a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)},!0),Cd("lineNumbers",!1,function(a){I(a.options),D(a)},!0),Cd("firstLineNumber",1,D,!0),Cd("lineNumberFormatter",function(a){return a},D,!0),Cd("showCursorWhenSelecting",!1,db,!0),Cd("resetSelectionOnContextMenu",!0),Cd("lineWiseCopyCut",!0),Cd("readOnly",!1,function(a,b){"nocursor"==b?($c(a),a.display.input.blur(),a.display.disabled=!0):(a.display.disabled=!1,b||a.display.input.reset())}),Cd("disableInput",!1,function(a,b){b||a.display.input.reset()},!0),Cd("dragDrop",!0,qc),Cd("cursorBlinkRate",530),Cd("cursorScrollMargin",0),Cd("cursorHeight",1,db,!0),Cd("singleCursorHeightPerLine",!0,db,!0),Cd("workTime",100),Cd("workDelay",100),Cd("flattenSpans",!0,y,!0),Cd("addModeClass",!1,y,!0),Cd("pollInterval",100),Cd("undoDepth",200,function(a,b){a.doc.history.undoDepth=b}),Cd("historyEventDelay",1250),Cd("viewportMargin",10,function(a){a.refresh()},!0),Cd("maxHighlightLength",1e4,y,!0),Cd("moveInputWithCursor",!0,function(a,b){b||a.display.input.resetPosition()}),Cd("tabindex",null,function(a,b){a.display.input.getField().tabIndex=b||""}),Cd("autofocus",null);var Ed=v.modes={},Fd=v.mimeModes={};v.defineMode=function(a,b){v.defaults.mode||"null"==a||(v.defaults.mode=a),arguments.length>2&&(b.dependencies=Array.prototype.slice.call(arguments,2)),Ed[a]=b},v.defineMIME=function(a,b){Fd[a]=b},v.resolveMode=function(a){if("string"==typeof a&&Fd.hasOwnProperty(a))a=Fd[a];else if(a&&"string"==typeof a.name&&Fd.hasOwnProperty(a.name)){var b=Fd[a.name];"string"==typeof b&&(b={name:b}),a=gg(b,a),a.name=b.name}else if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return v.resolveMode("application/xml");return"string"==typeof a?{name:a}:a||{name:"null"}},v.getMode=function(a,b){var b=v.resolveMode(b),c=Ed[b.name];if(!c)return v.getMode(a,"text/plain");var d=c(a,b);if(Gd.hasOwnProperty(b.name)){var e=Gd[b.name];for(var f in e)e.hasOwnProperty(f)&&(d.hasOwnProperty(f)&&(d["_"+f]=d[f]),d[f]=e[f])}if(d.name=b.name,b.helperType&&(d.helperType=b.helperType),b.modeProps)for(var f in b.modeProps)d[f]=b.modeProps[f];return d},v.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}}),v.defineMIME("text/plain","null");var Gd=v.modeExtensions={};v.extendMode=function(a,b){var c=Gd.hasOwnProperty(a)?Gd[a]:Gd[a]={};hg(b,c)},v.defineExtension=function(a,b){v.prototype[a]=b},v.defineDocExtension=function(a,b){af.prototype[a]=b},v.defineOption=Cd;var Hd=[];v.defineInitHook=function(a){Hd.push(a)};var Id=v.helpers={};v.registerHelper=function(a,b,c){Id.hasOwnProperty(a)||(Id[a]=v[a]={_global:[]}),Id[a][b]=c},v.registerGlobalHelper=function(a,b,c,d){v.registerHelper(a,b,d),Id[a]._global.push({pred:c,val:d})};var Jd=v.copyState=function(a,b){if(b===!0)return b;if(a.copyState)return a.copyState(b);var c={};for(var d in b){var e=b[d];e instanceof Array&&(e=e.concat([])),c[d]=e}return c},Kd=v.startState=function(a,b,c){return a.startState?a.startState(b,c):!0};v.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);if(!c||c.mode==a)break;b=c.state,a=c.mode}return c||{mode:a,state:b}};var Ld=v.commands={selectAll:function(a){a.setSelection(oa(a.firstLine(),0),oa(a.lastLine()),Vf)},singleSelection:function(a){a.setSelection(a.getCursor("anchor"),a.getCursor("head"),Vf)},killLine:function(a){xd(a,function(b){if(b.empty()){var c=ff(a.doc,b.head.line).text.length;return b.head.ch==c&&b.head.line0)e=new oa(e.line,e.ch+1),a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),oa(e.line,e.ch-2),e,"+transpose");else if(e.line>a.doc.first){var g=ff(a.doc,e.line-1).text;g&&a.replaceRange(f.charAt(0)+a.doc.lineSeparator()+g.charAt(g.length-1),oa(e.line-1,g.length-1),oa(e.line,1),"+transpose")}c.push(new Ka(e,e))}a.setSelections(c)})},newlineAndIndent:function(a){cc(a,function(){for(var b=a.listSelections().length,c=0;b>c;c++){var d=a.listSelections()[c];a.replaceRange(a.doc.lineSeparator(),d.anchor,d.head,"+input"),a.indentLine(d.from().line+1,null,!0),td(a)}})},toggleOverwrite:function(a){a.toggleOverwrite()}},Md=v.keyMap={};Md.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Md.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Md.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},Md.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace", +"Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Md["default"]=o?Md.macDefault:Md.pcDefault,v.normalizeKeyMap=function(a){var b={};for(var c in a)if(a.hasOwnProperty(c)){var d=a[c];if(/^(name|fallthrough|(de|at)tach)$/.test(c))continue;if("..."==d){delete a[c];continue}for(var e=eg(c.split(" "),Nd),f=0;f=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){return this.posb},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){var b=this.string.indexOf(a,this.pos);return b>-1?(this.pos=b,!0):void 0},backUp:function(a){this.pos-=a},column:function(){return this.lastColumnPos0?null:(f&&b!==!1&&(this.pos+=f[0].length),f)}var d=function(a){return c?a.toLowerCase():a},e=this.string.substr(this.pos,a.length);return d(e)==d(a)?(b!==!1&&(this.pos+=a.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}}};var Td=0,Ud=v.TextMarker=function(a,b){this.lines=[],this.type=b,this.doc=a,this.id=++Td};Sf(Ud),Ud.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;if(b&&Vb(a),Rf(this,"clear")){var c=this.find();c&&Nf(this,"clear",c.from,c.to)}for(var d=null,e=null,f=0;fa.display.maxLineLength&&(a.display.maxLine=i,a.display.maxLineLength=j,a.display.maxLineChanged=!0)}null!=d&&a&&this.collapsed&&ic(a,d,e+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&ab(a.doc)),a&&Nf(a,"markerCleared",a,this),b&&Xb(a),this.parent&&this.parent.clear()}},Ud.prototype.find=function(a,b){null==a&&"bookmark"==this.type&&(a=1);for(var c,d,e=0;ec;++c){var e=this.lines[c];this.height-=e.height,Ee(e),Nf(e,"delete")}this.lines.splice(a,b)},collapse:function(a){a.push.apply(a,this.lines)},insertInner:function(a,b,c){this.height+=c,this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(var d=0;da;++a)if(c(this.lines[a]))return!0}},$e.prototype={chunkSize:function(){return this.size},removeInner:function(a,b){this.size-=b;for(var c=0;ca){var f=Math.min(b,e-a),g=d.height;if(d.removeInner(a,f),this.height-=g-d.height,e==f&&(this.children.splice(c--,1),d.parent=null),0==(b-=f))break;a=0}else a-=e}if(this.size-b<25&&(this.children.length>1||!(this.children[0]instanceof Ze))){var h=[];this.collapse(h),this.children=[new Ze(h)],this.children[0].parent=this}},collapse:function(a){for(var b=0;b=a){if(e.insertInner(a,b,c),e.lines&&e.lines.length>50){for(;e.lines.length>50;){var g=e.lines.splice(e.lines.length-25,25),h=new Ze(g);e.height-=h.height,this.children.splice(d+1,0,h),h.parent=this}this.maybeSpill()}break}a-=f}},maybeSpill:function(){if(!(this.children.length<=10)){var a=this;do{var b=a.children.splice(a.children.length-5,5),c=new $e(b);if(a.parent){a.size-=c.size,a.height-=c.height;var e=dg(a.parent.children,a);a.parent.children.splice(e+1,0,c)}else{var d=new $e(a.children);d.parent=a,a.children=[d,c],a=d}c.parent=a.parent}while(a.children.length>10);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;da){var g=Math.min(b,f-a);if(e.iterN(a,g,c))return!0;if(0==(b-=g))break;a=0}else a-=f}}};var _e=0,af=v.Doc=function(a,b,c,d){if(!(this instanceof af))return new af(a,b,c,d);null==c&&(c=0),$e.call(this,[new Ze([new Ce("",null)])]),this.first=c,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.frontier=c;var e=oa(c,0);this.sel=Ma(e),this.history=new of(null),this.id=++_e,this.modeOption=b,this.lineSep=d,"string"==typeof a&&(a=this.splitLines(a)),Ye(this,{from:e,to:e,text:a}),Za(this,Ma(e),Vf)};af.prototype=gg($e.prototype,{constructor:af,iter:function(a,b,c){c?this.iterN(a-this.first,b-a,c):this.iterN(this.first,this.first+this.size,a)},insert:function(a,b){for(var c=0,d=0;d=0;f--)hd(this,d[f]);h?Ya(this,h):this.cm&&td(this.cm)}),undo:fc(function(){jd(this,"undo")}),redo:fc(function(){jd(this,"redo")}),undoSelection:fc(function(){jd(this,"undo",!0)}),redoSelection:fc(function(){jd(this,"redo",!0)}),setExtending:function(a){this.extend=a},getExtending:function(){return this.extend},historySize:function(){for(var a=this.history,b=0,c=0,d=0;d=a.ch)&&b.push(e.marker.parent||e.marker)}return b},findMarks:function(a,b,c){a=Oa(this,a),b=Oa(this,b);var d=[],e=a.line;return this.iter(a.line,b.line+1,function(f){var g=f.markedSpans;if(g)for(var h=0;hi.to||null==i.from&&e!=a.line||e==b.line&&i.from>b.ch||c&&!c(i.marker)||d.push(i.marker.parent||i.marker)}++e}),d},getAllMarks:function(){var a=[];return this.iter(function(b){var c=b.markedSpans;if(c)for(var d=0;da?(b=a,!0):(a-=e,void++c)}),Oa(this,oa(c,b))},indexFromPos:function(a){a=Oa(this,a);var b=a.ch;return a.lineb&&(b=a.from),null!=a.to&&a.toh||h>=b)return g+(b-f);g+=h-f,g+=c-g%c,f=h+1}},_f=[""],cg=function(a){a.select()};m?cg=function(a){a.selectionStart=0,a.selectionEnd=a.value.length}:d&&(cg=function(a){try{a.select()}catch(b){}});var qg,jg=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,kg=v.isWordChar=function(a){return/\w/.test(a)||a>"\x80"&&(a.toUpperCase()!=a.toLowerCase()||jg.test(a))},ng=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;qg=document.createRange?function(a,b,c,d){var e=document.createRange();return e.setEnd(d||a,c),e.setStart(a,b),e}:function(a,b,c){var d=document.body.createTextRange();try{d.moveToElementText(a.parentNode)}catch(e){return d}return d.collapse(!0),d.moveEnd("character",c),d.moveStart("character",b),d};var tg=v.contains=function(a,b){if(3==b.nodeType&&(b=b.parentNode),a.contains)return a.contains(b);do if(11==b.nodeType&&(b=b.host),b==a)return!0;while(b=b.parentNode)};d&&11>e&&(ug=function(){try{return document.activeElement}catch(a){return document.body}});var Eg,Gg,wg=v.rmClass=function(a,b){var c=a.className,d=vg(b).exec(c);if(d){var e=c.slice(d.index+d[0].length);a.className=c.slice(0,d.index)+(e?d[1]+e:"")}},xg=v.addClass=function(a,b){var c=a.className;vg(b).test(c)||(a.className+=(c?" ":"")+b)},Ag=!1,Dg=function(){if(d&&9>e)return!1;var a=pg("div");return"draggable"in a||"dragDrop"in a}(),Ig=v.splitLines=3!="\n\nb".split(/\n/).length?function(a){for(var b=0,c=[],d=a.length;d>=b;){var e=a.indexOf("\n",b);-1==e&&(e=a.length);var f=a.slice(b,"\r"==a.charAt(e-1)?e-1:e),g=f.indexOf("\r");-1!=g?(c.push(f.slice(0,g)),b+=g+1):(c.push(f),b=e+1)}return c}:function(a){return a.split(/\r\n?|\n/)},Jg=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(b){return!1}}:function(a){try{var b=a.ownerDocument.selection.createRange()}catch(c){}return b&&b.parentElement()==a?0!=b.compareEndPoints("StartToEnd",b):!1},Kg=function(){var a=pg("div");return"oncopy"in a?!0:(a.setAttribute("oncopy","return;"),"function"==typeof a.oncopy)}(),Lg=null,Ng={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};v.keyNames=Ng,function(){for(var a=0;10>a;a++)Ng[a+48]=Ng[a+96]=String(a);for(var a=65;90>=a;a++)Ng[a]=String.fromCharCode(a);for(var a=1;12>=a;a++)Ng[a+111]=Ng[a+63235]="F"+a}();var Xg,ah=function(){function c(c){return 247>=c?a.charAt(c):c>=1424&&1524>=c?"R":c>=1536&&1773>=c?b.charAt(c-1536):c>=1774&&2220>=c?"r":c>=8192&&8203>=c?"w":8204==c?"b":"L"}function j(a,b,c){this.level=a,this.from=b,this.to=c}var a="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",b="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",d=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,e=/[stwN]/,f=/[LRr]/,g=/[Lb1n]/,h=/[1n]/,i="L";return function(a){if(!d.test(a))return!1;for(var m,b=a.length,k=[],l=0;b>l;++l)k.push(m=c(a.charCodeAt(l)));for(var l=0,n=i;b>l;++l){var m=k[l];"m"==m?k[l]=n:n=m}for(var l=0,o=i;b>l;++l){var m=k[l];"1"==m&&"r"==o?k[l]="n":f.test(m)&&(o=m,"r"==m&&(k[l]="R"))}for(var l=1,n=k[0];b-1>l;++l){var m=k[l];"+"==m&&"1"==n&&"1"==k[l+1]?k[l]="1":","!=m||n!=k[l+1]||"1"!=n&&"n"!=n||(k[l]=n),n=m}for(var l=0;b>l;++l){var m=k[l];if(","==m)k[l]="N";else if("%"==m){for(var p=l+1;b>p&&"%"==k[p];++p);for(var q=l&&"!"==k[l-1]||b>p&&"1"==k[p]?"1":"N",r=l;p>r;++r)k[r]=q;l=p-1}}for(var l=0,o=i;b>l;++l){var m=k[l];"L"==o&&"1"==m?k[l]="L":f.test(m)&&(o=m)}for(var l=0;b>l;++l)if(e.test(k[l])){for(var p=l+1;b>p&&e.test(k[p]);++p);for(var s="L"==(l?k[l-1]:i),t="L"==(b>p?k[p]:i),q=s||t?"L":"R",r=l;p>r;++r)k[r]=q;l=p-1}for(var v,u=[],l=0;b>l;)if(g.test(k[l])){var w=l;for(++l;b>l&&g.test(k[l]);++l);u.push(new j(0,w,l))}else{var x=l,y=u.length;for(++l;b>l&&"L"!=k[l];++l);for(var r=x;l>r;)if(h.test(k[r])){r>x&&u.splice(y,0,new j(1,x,r));var z=r;for(++r;l>r&&h.test(k[r]);++r);u.splice(y,0,new j(2,z,r)),x=r}else++r;l>x&&u.splice(y,0,new j(1,x,l))}return 1==u[0].level&&(v=a.match(/^\s+/))&&(u[0].from=v[0].length,u.unshift(new j(0,0,v[0].length))),1==bg(u).level&&(v=a.match(/\s+$/))&&(bg(u).to-=v[0].length,u.push(new j(0,b-v[0].length,b))),2==u[0].level&&u.unshift(new j(1,u[0].to,u[0].to)),u[0].level!=bg(u).level&&u.push(new j(u[0].level,b,b)),u}}();return v.version="5.6.0",v}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";a.defineMode("javascript",function(b,c){function m(a){for(var c,b=!1,d=!1;null!=(c=a.next());){if(!b){if("/"==c&&!d)return;"["==c?d=!0:d&&"]"==c&&(d=!1)}b=!b&&"\\"==c}}function p(a,b,c){return n=a,o=c,b}function q(a,b){var c=a.next();if('"'==c||"'"==c)return b.tokenize=r(c),b.tokenize(a,b);if("."==c&&a.match(/^\d+(?:[eE][+\-]?\d+)?/))return p("number","number");if("."==c&&a.match(".."))return p("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(c))return p(c);if("="==c&&a.eat(">"))return p("=>","operator");if("0"==c&&a.eat(/x/i))return a.eatWhile(/[\da-f]/i),p("number","number");if(/\d/.test(c))return a.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),p("number","number");if("/"==c)return a.eat("*")?(b.tokenize=s,s(a,b)):a.eat("/")?(a.skipToEnd(),p("comment","comment")):"operator"==b.lastType||"keyword c"==b.lastType||"sof"==b.lastType||/^[\[{}\(,;:]$/.test(b.lastType)?(m(a),a.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/),p("regexp","string-2")):(a.eatWhile(k),p("operator","operator",a.current()));if("`"==c)return b.tokenize=t,t(a,b);if("#"==c)return a.skipToEnd(),p("error","error");if(k.test(c))return a.eatWhile(k),p("operator","operator",a.current());if(i.test(c)){a.eatWhile(i);var d=a.current(),e=j.propertyIsEnumerable(d)&&j[d];return e&&"."!=b.lastType?p(e.type,e.style,d):p("variable","variable",d)}}function r(a){return function(b,c){var e,d=!1;if(f&&"@"==b.peek()&&b.match(l))return c.tokenize=q,p("jsonld-keyword","meta");for(;null!=(e=b.next())&&(e!=a||d);)d=!d&&"\\"==e;return d||(c.tokenize=q),p("string","string")}}function s(a,b){for(var d,c=!1;d=a.next();){if("/"==d&&c){b.tokenize=q;break}c="*"==d}return p("comment","comment")}function t(a,b){for(var d,c=!1;null!=(d=a.next());){if(!c&&("`"==d||"$"==d&&a.eat("{"))){b.tokenize=q;break}c=!c&&"\\"==d}return p("quasi","string-2",a.current())}function v(a,b){b.fatArrowAt&&(b.fatArrowAt=null);var c=a.string.indexOf("=>",a.start);if(!(0>c)){for(var d=0,e=!1,f=c-1;f>=0;--f){var g=a.string.charAt(f),h=u.indexOf(g);if(h>=0&&3>h){if(!d){++f;break}if(0==--d)break}else if(h>=3&&6>h)++d;else if(i.test(g))e=!0;else{if(/["'\/]/.test(g))return;if(e&&!d){++f;break}}}e&&!d&&(b.fatArrowAt=f)}}function x(a,b,c,d,e,f){this.indented=a,this.column=b,this.type=c,this.prev=e,this.info=f,null!=d&&(this.align=d)}function y(a,b){for(var c=a.localVars;c;c=c.next)if(c.name==b)return!0;for(var d=a.context;d;d=d.prev)for(var c=d.vars;c;c=c.next)if(c.name==b)return!0}function z(a,b,c,d,e){var f=a.cc;for(A.state=a,A.stream=e,A.marked=null,A.cc=f,A.style=b,a.lexical.hasOwnProperty("align")||(a.lexical.align=!0);;){var h=f.length?f.pop():g?L:K;if(h(c,d)){for(;f.length&&f[f.length-1].lex;)f.pop()();return A.marked?A.marked:"variable"==c&&y(a,d)?"variable-2":b}}}function B(){for(var a=arguments.length-1;a>=0;a--)A.cc.push(arguments[a])}function C(){return B.apply(null,arguments),!0}function D(a){function b(b){for(var c=b;c;c=c.next)if(c.name==a)return!0;return!1}var d=A.state;if(d.context){if(A.marked="def",b(d.localVars))return;d.localVars={name:a,next:d.localVars}}else{if(b(d.globalVars))return;c.globalVars&&(d.globalVars={name:a,next:d.globalVars})}}function F(){A.state.context={prev:A.state.context,vars:A.state.localVars},A.state.localVars=E}function G(){A.state.localVars=A.state.context.vars,A.state.context=A.state.context.prev}function H(a,b){var c=function(){var c=A.state,d=c.indented;if("stat"==c.lexical.type)d=c.lexical.indented;else for(var e=c.lexical;e&&")"==e.type&&e.align;e=e.prev)d=e.indented;c.lexical=new x(d,A.stream.column(),a,null,c.lexical,b)};return c.lex=!0,c}function I(){var a=A.state;a.lexical.prev&&(")"==a.lexical.type&&(a.indented=a.lexical.indented),a.lexical=a.lexical.prev)}function J(a){function b(c){return c==a?C():";"==a?B():C(b)}return b}function K(a,b){return"var"==a?C(H("vardef",b.length),fa,J(";"),I):"keyword a"==a?C(H("form"),L,K,I):"keyword b"==a?C(H("form"),K,I):"{"==a?C(H("}"),ba,I):";"==a?C():"if"==a?("else"==A.state.lexical.info&&A.state.cc[A.state.cc.length-1]==I&&A.state.cc.pop()(),C(H("form"),L,K,I,ka)):"function"==a?C(qa):"for"==a?C(H("form"),la,K,I):"variable"==a?C(H("stat"),W):"switch"==a?C(H("form"),L,H("}","switch"),J("{"),ba,I,I):"case"==a?C(L,J(":")):"default"==a?C(J(":")):"catch"==a?C(H("form"),F,J("("),ra,J(")"),K,I,G):"class"==a?C(H("form"),sa,I):"export"==a?C(H("form"),wa,I):"import"==a?C(H("form"),xa,I):B(H("stat"),L,J(";"),I)}function L(a){return N(a,!1)}function M(a){return N(a,!0)}function N(a,b){if(A.state.fatArrowAt==A.stream.start){var c=b?V:U;if("("==a)return C(F,H(")"),_(ga,")"),I,J("=>"),c,G);if("variable"==a)return B(F,ga,J("=>"),c,G)}var d=b?R:Q;return w.hasOwnProperty(a)?C(d):"function"==a?C(qa,d):"keyword c"==a?C(b?P:O):"("==a?C(H(")"),O,Da,J(")"),I,d):"operator"==a||"spread"==a?C(b?M:L):"["==a?C(H("]"),Ba,I,d):"{"==a?aa(Y,"}",null,d):"quasi"==a?B(S,d):C()}function O(a){return a.match(/[;\}\)\],]/)?B():B(L)}function P(a){return a.match(/[;\}\)\],]/)?B():B(M)}function Q(a,b){return","==a?C(L):R(a,b,!1)}function R(a,b,c){var d=0==c?Q:R,e=0==c?L:M;return"=>"==a?C(F,c?V:U,G):"operator"==a?/\+\+|--/.test(b)?C(d):"?"==b?C(L,J(":"),e):C(e):"quasi"==a?B(S,d):";"!=a?"("==a?aa(M,")","call",d):"."==a?C(X,d):"["==a?C(H("]"),O,J("]"),I,d):void 0:void 0}function S(a,b){return"quasi"!=a?B():"${"!=b.slice(b.length-2)?C(S):C(L,T)}function T(a){return"}"==a?(A.marked="string-2",A.state.tokenize=t,C(S)):void 0}function U(a){return v(A.stream,A.state),B("{"==a?K:L)}function V(a){return v(A.stream,A.state),B("{"==a?K:M)}function W(a){return":"==a?C(I,K):B(Q,J(";"),I)}function X(a){return"variable"==a?(A.marked="property",C()):void 0}function Y(a,b){return"variable"==a||"keyword"==A.style?(A.marked="property",C("get"==b||"set"==b?Z:$)):"number"==a||"string"==a?(A.marked=f?"property":A.style+" property",C($)):"jsonld-keyword"==a?C($):"["==a?C(L,J("]"),$):void 0}function Z(a){return"variable"!=a?B($):(A.marked="property",C(qa))}function $(a){return":"==a?C(M):"("==a?B(qa):void 0}function _(a,b){function c(d){if(","==d){var e=A.state.lexical;return"call"==e.info&&(e.pos=(e.pos||0)+1),C(a,c)}return d==b?C():C(J(b))}return function(d){return d==b?C():B(a,c)}}function aa(a,b,c){for(var d=3;d!?|~^]/,l=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,u="([{}])",w={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,"this":!0,"jsonld-keyword":!0},A={state:null,column:null,marked:null,cc:null},E={name:"this",next:{name:"arguments"}};return I.lex=!0,{startState:function(a){var b={tokenize:q,lastType:"sof",cc:[],lexical:new x((a||0)-d,0,"block",!1),localVars:c.localVars,context:c.localVars&&{vars:c.localVars},indented:0};return c.globalVars&&"object"==typeof c.globalVars&&(b.globalVars=c.globalVars),b},token:function(a,b){if(a.sol()&&(b.lexical.hasOwnProperty("align")||(b.lexical.align=!1),b.indented=a.indentation(),v(a,b)),b.tokenize!=s&&a.eatSpace())return null;var c=b.tokenize(a,b);return"comment"==n?c:(b.lastType="operator"!=n||"++"!=o&&"--"!=o?n:"incdec",z(b,c,n,o,a))},indent:function(b,f){if(b.tokenize==s)return a.Pass;if(b.tokenize!=q)return 0;var g=f&&f.charAt(0),h=b.lexical;if(!/^\s*else\b/.test(f))for(var i=b.cc.length-1;i>=0;--i){var j=b.cc[i];if(j==I)h=h.prev;else if(j!=ka)break}"stat"==h.type&&"}"==g&&(h=h.prev),e&&")"==h.type&&"stat"==h.prev.type&&(h=h.prev);var k=h.type,l=g==k;return"vardef"==k?h.indented+("operator"==b.lastType||","==b.lastType?h.info+1:0):"form"==k&&"{"==g?h.indented:"form"==k?h.indented+d:"stat"==k?h.indented+(Ea(b,f)?e||d:0):"switch"!=h.info||l||0==c.doubleIndentSwitch?h.align?h.column+(l?0:1):h.indented+(l?0:d):h.indented+(/^(?:case|default)\b/.test(f)?d:2*d)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:g?null:"/*",blockCommentEnd:g?null:"*/",lineComment:g?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:g?"json":"javascript",jsonldMode:f,jsonMode:g}}),a.registerHelper("wordChars","javascript",/[\w$]/),a.defineMIME("text/javascript","javascript"),a.defineMIME("text/ecmascript","javascript"),a.defineMIME("application/javascript","javascript"),a.defineMIME("application/x-javascript","javascript"),a.defineMIME("application/ecmascript","javascript"),a.defineMIME("application/json",{name:"javascript",json:!0}),a.defineMIME("application/x-json",{name:"javascript",json:!0}),a.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),a.defineMIME("text/typescript",{name:"javascript",typescript:!0}),a.defineMIME("application/typescript",{name:"javascript",typescript:!0})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../javascript/javascript")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../javascript/javascript"],a):a(CodeMirror)}(function(a){"use strict";a.defineMode("pegjs",function(b){function d(a){return a.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)}var c=a.getMode(b,"javascript");return{startState:function(){return{inString:!1,stringType:null,inComment:!1,inChracterClass:!1,braced:0,lhs:!0,localState:null}},token:function(a,b){if(a&&(b.inString||b.inComment||'"'!=a.peek()&&"'"!=a.peek()||(b.stringType=a.peek(),a.next(),b.inString=!0)),b.inString||b.inComment||!a.match(/^\/\*/)||(b.inComment=!0),b.inString){for(;b.inString&&!a.eol();)a.peek()===b.stringType?(a.next(),b.inString=!1):"\\"===a.peek()?(a.next(),a.next()):a.match(/^.[^\\\"\']*/);return b.lhs?"property string":"string"}if(b.inComment){for(;b.inComment&&!a.eol();)a.match(/\*\//)?b.inComment=!1:a.match(/^.[^\*]*/);return"comment"}if(b.inChracterClass)for(;b.inChracterClass&&!a.eol();)a.match(/^[^\]\\]+/)||a.match(/^\\./)||(b.inChracterClass=!1);else{if("["===a.peek())return a.next(),b.inChracterClass=!0,"bracket";if(a.match(/^\/\//))return a.skipToEnd(),"comment";if(b.braced||"{"===a.peek()){null===b.localState&&(b.localState=c.startState());var e=c.token(a,b.localState),f=a.current();if(!e)for(var g=0;g' : '\n' : this.HTML ? ' ' : ' '; + }, + indent:function( extra ){// extra can be a number, shortcut for increasing-calling-decreasing + if( !this.multiline ) + return ''; + var chr = this.indentChar; + if( this.HTML ) + chr = chr.replace(/\t/g,' ').replace(/ /g,' '); + return Array( this._depth_ + (extra||0) ).join(chr); + }, + up:function( a ){ + this._depth_ += a || 1; + }, + down:function( a ){ + this._depth_ -= a || 1; + }, + setParser:function( name, parser ){ + this.parsers[name] = parser; + }, + // The next 3 are exposed so you can use them + quote:quote, + literal:literal, + join:join, + _depth_: 1, + // This is the list of parsers, to modify them, use jsDump.setParser + parsers:{ + window: '[Window]', + document: '[Document]', + error:'[ERROR]', //when no parser is found, shouldn't happen + unknown: '[Unknown]', + 'null':'null', + undefined:'undefined', + 'function':function( fn ){ + var ret = 'function', + name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE + if( name ) + ret += ' ' + name; + ret += '('; + ret = [ ret, this.parse( fn, 'functionArgs' ), '){'].join(''); + return join( ret, this.parse(fn,'functionCode'), '}' ); + }, + array: array, + nodelist: array, + arguments: array, + jquery:array, + object:function( map ){ + if (this._depth_ >= this.maxDepth) { + this._depth_ = 1; // Reset for future use + throw new Error("Object nesting exceeded jsDump.maxDepth (" + jsDump.maxDepth + ")"); + } + var ret = [ ]; + this.up(); + for( var key in map ) + ret.push( this.parse(key,'key') + ': ' + this.parse(map[key]) ); + this.down(); + return join( '{', ret, '}' ); + }, + node:function( node ){ + var open = this.HTML ? '<' : '<', + close = this.HTML ? '>' : '>'; + var tag = node.nodeName.toLowerCase(), + ret = open + tag; + for( var a in this.DOMAttrs ){ + var val = node[this.DOMAttrs[a]]; + if( val ) + ret += ' ' + a + '=' + this.parse( val, 'attribute' ); + } + return ret + close + open + '/' + tag + close; + }, + functionArgs:function( fn ){//function calls it internally, it's the arguments part of the function + var l = fn.length; + if( !l ) return ''; + var args = Array(l); + while( l-- ) + args[l] = String.fromCharCode(97+l);//97 is 'a' + return ' ' + args.join(', ') + ' '; + }, + key:quote, //object calls it internally, the key part of an item in a map + functionCode:'[code]', //function calls it internally, it's the content of the function + attribute:quote, //node calls it internally, it's an html attribute value + string:quote, + date:quote, + regexp:literal, //regex + number:literal, + 'boolean':literal + }, + DOMAttrs:{//attributes to dump from nodes, name=>realName + id:'id', + name:'name', + 'class':'className' + }, + HTML:false,//if true, entities are escaped ( <, >, \t, space and \n ) + indentChar:' ',//indentation unit + multiline:true, //if true, items in a collection, are separated by a \n, else just a space. + maxDepth:100 //maximum depth of object nesting + }; + +})(); + +if (typeof exports !== 'undefined') { + module.exports = jsDump; +} diff --git a/tools/pegjs.org/vendor/pegjs/peg.js b/tools/pegjs.org/vendor/pegjs/peg.js new file mode 100644 index 0000000..3d88516 --- /dev/null +++ b/tools/pegjs.org/vendor/pegjs/peg.js @@ -0,0 +1,12 @@ +/* + * PEG.js 0.10.0 + * + * http://pegjs.org/ + * + * Copyright (c) 2010-2016 David Majda + * Licensed under the MIT license. + */ +!function(u){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=u();else if("function"==typeof define&&define.amd)define([],u);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.peg=u()}}(function(){var define,module,exports;return function u(e,t,r){function n(s,i){if(!t[s]){if(!e[s]){var a="function"==typeof require&&require;if(!i&&a)return a(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=t[s]={exports:{}};e[s][0].call(p.exports,function(u){var t=e[s][1][u];return n(t?t:u)},p,p.exports,u,e,t,r)}return t[s].exports}for(var o="function"==typeof require&&require,s=0;s1?p([a.IF_ERROR],r([a.POP],t(u.slice(1),e)),[]):[])}return t(u.alternatives,e)},action:function(u,e){var n=o.clone(e.env),s="sequence"!==u.expression.type||0===u.expression.elements.length,i=d(u.expression,{sp:e.sp+(s?1:0),env:n,action:u}),c=t(o.keys(n),u.code);return s?r([a.PUSH_CURR_POS],i,p([a.IF_NOT_ERROR],r([a.LOAD_SAVED_POS,1],l(c,1,n,e.sp+2)),[]),[a.NIP]):i},sequence:function(u,e){function n(e,s){var i,c;return e.length>0?(i=u.elements.length-e.slice(1).length,r(d(e[0],{sp:s.sp,env:s.env,action:null}),p([a.IF_NOT_ERROR],n(e.slice(1),{sp:s.sp+1,env:s.env,action:s.action}),r(i>1?[a.POP_N,i]:[a.POP],[a.POP_CURR_POS],[a.PUSH_FAILED])))):s.action?(c=t(o.keys(s.env),s.action.code),r([a.LOAD_SAVED_POS,u.elements.length],l(c,u.elements.length,s.env,s.sp),[a.NIP])):r([a.WRAP,u.elements.length],[a.NIP])}return r([a.PUSH_CURR_POS],n(u.elements,{sp:e.sp+1,env:e.env,action:e.action}))},labeled:function(u,e){var t=o.clone(e.env);return e.env[u.label]=e.sp+1,d(u.expression,{sp:e.sp,env:t,action:null})},text:function(u,e){return r([a.PUSH_CURR_POS],d(u.expression,{sp:e.sp+1,env:o.clone(e.env),action:null}),p([a.IF_NOT_ERROR],r([a.POP],[a.TEXT]),[a.NIP]))},simple_and:function(u,e){return E(u.expression,!1,e)},simple_not:function(u,e){return E(u.expression,!0,e)},optional:function(u,e){return r(d(u.expression,{sp:e.sp,env:o.clone(e.env),action:null}),p([a.IF_ERROR],r([a.POP],[a.PUSH_NULL]),[]))},zero_or_more:function(u,e){var t=d(u.expression,{sp:e.sp+1,env:o.clone(e.env),action:null});return r([a.PUSH_EMPTY_ARRAY],t,f(t),[a.POP])},one_or_more:function(u,e){var t=d(u.expression,{sp:e.sp+1,env:o.clone(e.env),action:null});return r([a.PUSH_EMPTY_ARRAY],t,p([a.IF_NOT_ERROR],r(f(t),[a.POP]),r([a.POP],[a.POP],[a.PUSH_FAILED])))},group:function(u,e){return d(u.expression,{sp:e.sp,env:o.clone(e.env),action:null})},semantic_and:function(u,e){return C(u.code,!1,e)},semantic_not:function(u,e){return C(u.code,!0,e)},rule_ref:function(e){return[a.RULE,s.indexOfRule(u,e.name)]},literal:function(u){var t,r;return u.value.length>0?(t=e('"'+c.stringEscape(u.ignoreCase?u.value.toLowerCase():u.value)+'"'),r=e('peg$literalExpectation("'+c.stringEscape(u.value)+'", '+u.ignoreCase+")"),p(u.ignoreCase?[a.MATCH_STRING_IC,t]:[a.MATCH_STRING,t],u.ignoreCase?[a.ACCEPT_N,u.value.length]:[a.ACCEPT_STRING,t],[a.FAIL,r])):(t=e('""'),[a.PUSH,t])},class:function(u){var t,r,o,s;return t=u.parts.length>0?"/^["+(u.inverted?"^":"")+n.map(u.parts,function(u){return u instanceof Array?c.regexpClassEscape(u[0])+"-"+c.regexpClassEscape(u[1]):c.regexpClassEscape(u)}).join("")+"]/"+(u.ignoreCase?"i":""):u.inverted?"/^[\\S\\s]/":"/^(?!)/",r="["+n.map(u.parts,function(u){return u instanceof Array?'["'+c.stringEscape(u[0])+'", "'+c.stringEscape(u[1])+'"]':'"'+c.stringEscape(u)+'"'}).join(", ")+"]",o=e(t),s=e("peg$classExpectation("+r+", "+u.inverted+", "+u.ignoreCase+")"),p([a.MATCH_REGEXP,o],[a.ACCEPT_N,1],[a.FAIL,s])},any:function(){var u=e("peg$anyExpectation()");return p([a.MATCH_ANY],[a.ACCEPT_N,1],[a.FAIL,u])}});d(u)}var n=u("../../utils/arrays"),o=u("../../utils/objects"),s=u("../asts"),i=u("../visitor"),a=u("../opcodes"),c=u("../js");e.exports=r},{"../../utils/arrays":17,"../../utils/objects":19,"../asts":1,"../js":3,"../opcodes":4,"../visitor":13}],6:[function(require,module,exports){"use strict";function generateJS(ast,options){function indent2(u){return u.replace(/^(.+)$/gm," $1")}function indent6(u){return u.replace(/^(.+)$/gm," $1")}function indent10(u){return u.replace(/^(.+)$/gm," $1")}function generateTables(){return"size"===options.optimize?["peg$consts = [",indent2(ast.consts.join(",\n")),"],","","peg$bytecode = [",indent2(arrays.map(ast.rules,function(u){return'peg$decode("'+js.stringEscape(arrays.map(u.bytecode,function(u){return String.fromCharCode(u+32)}).join(""))+'")'}).join(",\n")),"],"].join("\n"):arrays.map(ast.consts,function(u,e){return"peg$c"+e+" = "+u+","}).join("\n")}function generateRuleHeader(u,e){var t=[];return t.push(""),options.trace&&t.push(["peg$tracer.trace({",' type: "rule.enter",'," rule: "+u+","," location: peg$computeLocation(startPos, startPos)","});",""].join("\n")),options.cache&&(t.push(["var key = peg$currPos * "+ast.rules.length+" + "+e+","," cached = peg$resultsCache[key];","","if (cached) {"," peg$currPos = cached.nextPos;",""].join("\n")),options.trace&&t.push(["if (cached.result !== peg$FAILED) {"," peg$tracer.trace({",' type: "rule.match",'," rule: "+u+","," result: cached.result,"," location: peg$computeLocation(startPos, peg$currPos)"," });","} else {"," peg$tracer.trace({",' type: "rule.fail",'," rule: "+u+","," location: peg$computeLocation(startPos, startPos)"," });","}",""].join("\n")),t.push([" return cached.result;","}",""].join("\n"))),t.join("\n")}function generateRuleFooter(u,e){var t=[];return options.cache&&t.push(["","peg$resultsCache[key] = { nextPos: peg$currPos, result: "+e+" };"].join("\n")),options.trace&&t.push(["","if ("+e+" !== peg$FAILED) {"," peg$tracer.trace({",' type: "rule.match",'," rule: "+u+","," result: "+e+","," location: peg$computeLocation(startPos, peg$currPos)"," });","} else {"," peg$tracer.trace({",' type: "rule.fail",'," rule: "+u+","," location: peg$computeLocation(startPos, startPos)"," });","}"].join("\n")),t.push(["","return "+e+";"].join("\n")),t.join("\n")}function generateInterpreter(){function u(u,e){var t=e+3,r="bc[ip + "+(t-2)+"]",n="bc[ip + "+(t-1)+"]";return["ends.push(end);","ips.push(ip + "+t+" + "+r+" + "+n+");","","if ("+u+") {"," end = ip + "+t+" + "+r+";"," ip += "+t+";","} else {"," end = ip + "+t+" + "+r+" + "+n+";"," ip += "+t+" + "+r+";","}","","break;"].join("\n")}function e(u){var e=2,t="bc[ip + "+(e-1)+"]";return["if ("+u+") {"," ends.push(end);"," ips.push(ip);",""," end = ip + "+e+" + "+t+";"," ip += "+e+";","} else {"," ip += "+e+" + "+t+";","}","","break;"].join("\n")}function t(){var u=4,e="bc[ip + "+(u-1)+"]";return["params = bc.slice(ip + "+u+", ip + "+u+" + "+e+");","for (i = 0; i < "+e+"; i++) {"," params[i] = stack[stack.length - 1 - params[i]];","}","","stack.splice("," stack.length - bc[ip + 2],"," bc[ip + 2],"," peg$consts[bc[ip + 1]].apply(null, params)",");","","ip += "+u+" + "+e+";","break;"].join("\n")}var r=[];return r.push(["function peg$decode(s) {"," var bc = new Array(s.length), i;",""," for (i = 0; i < s.length; i++) {"," bc[i] = s.charCodeAt(i) - 32;"," }",""," return bc;","}","","function peg$parseRule(index) {"].join("\n")),options.trace?r.push([" var bc = peg$bytecode[index],"," ip = 0,"," ips = [],"," end = bc.length,"," ends = [],"," stack = [],"," startPos = peg$currPos,"," params, i;"].join("\n")):r.push([" var bc = peg$bytecode[index],"," ip = 0,"," ips = [],"," end = bc.length,"," ends = [],"," stack = [],"," params, i;"].join("\n")),r.push(indent2(generateRuleHeader("peg$ruleNames[index]","index"))),r.push([" while (true) {"," while (ip < end) {"," switch (bc[ip]) {"," case "+op.PUSH+":"," stack.push(peg$consts[bc[ip + 1]]);"," ip += 2;"," break;",""," case "+op.PUSH_UNDEFINED+":"," stack.push(void 0);"," ip++;"," break;",""," case "+op.PUSH_NULL+":"," stack.push(null);"," ip++;"," break;",""," case "+op.PUSH_FAILED+":"," stack.push(peg$FAILED);"," ip++;"," break;",""," case "+op.PUSH_EMPTY_ARRAY+":"," stack.push([]);"," ip++;"," break;",""," case "+op.PUSH_CURR_POS+":"," stack.push(peg$currPos);"," ip++;"," break;",""," case "+op.POP+":"," stack.pop();"," ip++;"," break;",""," case "+op.POP_CURR_POS+":"," peg$currPos = stack.pop();"," ip++;"," break;",""," case "+op.POP_N+":"," stack.length -= bc[ip + 1];"," ip += 2;"," break;",""," case "+op.NIP+":"," stack.splice(-2, 1);"," ip++;"," break;",""," case "+op.APPEND+":"," stack[stack.length - 2].push(stack.pop());"," ip++;"," break;",""," case "+op.WRAP+":"," stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1]));"," ip += 2;"," break;",""," case "+op.TEXT+":"," stack.push(input.substring(stack.pop(), peg$currPos));"," ip++;"," break;",""," case "+op.IF+":",indent10(u("stack[stack.length - 1]",0)),""," case "+op.IF_ERROR+":",indent10(u("stack[stack.length - 1] === peg$FAILED",0)),""," case "+op.IF_NOT_ERROR+":",indent10(u("stack[stack.length - 1] !== peg$FAILED",0)),""," case "+op.WHILE_NOT_ERROR+":",indent10(e("stack[stack.length - 1] !== peg$FAILED")),""," case "+op.MATCH_ANY+":",indent10(u("input.length > peg$currPos",0)),""," case "+op.MATCH_STRING+":",indent10(u("input.substr(peg$currPos, peg$consts[bc[ip + 1]].length) === peg$consts[bc[ip + 1]]",1)),""," case "+op.MATCH_STRING_IC+":",indent10(u("input.substr(peg$currPos, peg$consts[bc[ip + 1]].length).toLowerCase() === peg$consts[bc[ip + 1]]",1)),""," case "+op.MATCH_REGEXP+":",indent10(u("peg$consts[bc[ip + 1]].test(input.charAt(peg$currPos))",1)),""," case "+op.ACCEPT_N+":"," stack.push(input.substr(peg$currPos, bc[ip + 1]));"," peg$currPos += bc[ip + 1];"," ip += 2;"," break;",""," case "+op.ACCEPT_STRING+":"," stack.push(peg$consts[bc[ip + 1]]);"," peg$currPos += peg$consts[bc[ip + 1]].length;"," ip += 2;"," break;",""," case "+op.FAIL+":"," stack.push(peg$FAILED);"," if (peg$silentFails === 0) {"," peg$fail(peg$consts[bc[ip + 1]]);"," }"," ip += 2;"," break;",""," case "+op.LOAD_SAVED_POS+":"," peg$savedPos = stack[stack.length - 1 - bc[ip + 1]];"," ip += 2;"," break;",""," case "+op.UPDATE_SAVED_POS+":"," peg$savedPos = peg$currPos;"," ip++;"," break;",""," case "+op.CALL+":",indent10(t()),""," case "+op.RULE+":"," stack.push(peg$parseRule(bc[ip + 1]));"," ip += 2;"," break;",""," case "+op.SILENT_FAILS_ON+":"," peg$silentFails++;"," ip++;"," break;",""," case "+op.SILENT_FAILS_OFF+":"," peg$silentFails--;"," ip++;"," break;",""," default:",' throw new Error("Invalid opcode: " + bc[ip] + ".");'," }"," }",""," if (ends.length > 0) {"," end = ends.pop();"," ip = ips.pop();"," } else {"," break;"," }"," }"].join("\n")),r.push(indent2(generateRuleFooter("peg$ruleNames[index]","stack[0]"))),r.push("}"),r.join("\n")}function generateRuleFunction(rule){function c(u){return"peg$c"+u}function s(u){return"s"+u}function compile(bc){function compileCondition(u,e){var t,r,n,o,s=e+3,i=bc[ip+s-2],a=bc[ip+s-1],c=stack.sp;if(ip+=s,t=compile(bc.slice(ip,ip+i)),n=stack.sp,ip+=i,a>0&&(stack.sp=c,r=compile(bc.slice(ip,ip+a)),o=stack.sp,ip+=a,n!==o))throw new Error("Branches of a condition must move the stack pointer in the same way.");parts.push("if ("+u+") {"),parts.push(indent2(t)),a>0&&(parts.push("} else {"),parts.push(indent2(r))),parts.push("}")}function compileLoop(u){var e,t,r=2,n=bc[ip+r-1],o=stack.sp;if(ip+=r,e=compile(bc.slice(ip,ip+n)),t=stack.sp,ip+=n,t!==o)throw new Error("Body of a loop can't move the stack pointer.");parts.push("while ("+u+") {"),parts.push(indent2(e)),parts.push("}")}function compileCall(){var u=4,e=bc[ip+u-1],t=c(bc[ip+1])+"("+arrays.map(bc.slice(ip+u,ip+u+e),function(u){return stack.index(u)}).join(", ")+")";stack.pop(bc[ip+2]),parts.push(stack.push(t)),ip+=u+e}for(var ip=0,end=bc.length,parts=[],value;ip peg$currPos",0);break;case op.MATCH_STRING:compileCondition(eval(ast.consts[bc[ip+1]]).length>1?"input.substr(peg$currPos, "+eval(ast.consts[bc[ip+1]]).length+") === "+c(bc[ip+1]):"input.charCodeAt(peg$currPos) === "+eval(ast.consts[bc[ip+1]]).charCodeAt(0),1);break;case op.MATCH_STRING_IC:compileCondition("input.substr(peg$currPos, "+eval(ast.consts[bc[ip+1]]).length+").toLowerCase() === "+c(bc[ip+1]),1);break;case op.MATCH_REGEXP:compileCondition(c(bc[ip+1])+".test(input.charAt(peg$currPos))",1);break;case op.ACCEPT_N:parts.push(stack.push(bc[ip+1]>1?"input.substr(peg$currPos, "+bc[ip+1]+")":"input.charAt(peg$currPos)")),parts.push(bc[ip+1]>1?"peg$currPos += "+bc[ip+1]+";":"peg$currPos++;"),ip+=2;break;case op.ACCEPT_STRING:parts.push(stack.push(c(bc[ip+1]))),parts.push(eval(ast.consts[bc[ip+1]]).length>1?"peg$currPos += "+eval(ast.consts[bc[ip+1]]).length+";":"peg$currPos++;"),ip+=2;break;case op.FAIL:parts.push(stack.push("peg$FAILED")),parts.push("if (peg$silentFails === 0) { peg$fail("+c(bc[ip+1])+"); }"),ip+=2;break;case op.LOAD_SAVED_POS:parts.push("peg$savedPos = "+stack.index(bc[ip+1])+";"),ip+=2;break;case op.UPDATE_SAVED_POS:parts.push("peg$savedPos = peg$currPos;"),ip++;break;case op.CALL:compileCall();break;case op.RULE:parts.push(stack.push("peg$parse"+ast.rules[bc[ip+1]].name+"()")),ip+=2;break;case op.SILENT_FAILS_ON:parts.push("peg$silentFails++;"),ip++;break;case op.SILENT_FAILS_OFF:parts.push("peg$silentFails--;"),ip++;break;default:throw new Error("Invalid opcode: "+bc[ip]+".")}return parts.join("\n")}var parts=[],code,stack={sp:-1,maxSp:-1,push:function(u){var e=s(++this.sp)+" = "+u+";";return this.sp>this.maxSp&&(this.maxSp=this.sp),e},pop:function(u){var e;return void 0===u?s(this.sp--):(e=arrays.map(arrays.range(this.sp-u+1,this.sp+1),s),this.sp-=u,e)},top:function(){return s(this.sp)},index:function(u){return s(this.sp-u)}};return code=compile(rule.bytecode),parts.push("function peg$parse"+rule.name+"() {"),options.trace?parts.push([" var "+arrays.map(arrays.range(0,stack.maxSp+1),s).join(", ")+","," startPos = peg$currPos;"].join("\n")):parts.push(" var "+arrays.map(arrays.range(0,stack.maxSp+1),s).join(", ")+";"),parts.push(indent2(generateRuleHeader('"'+js.stringEscape(rule.name)+'"',asts.indexOfRule(ast,rule.name)))),parts.push(indent2(code)),parts.push(indent2(generateRuleFooter('"'+js.stringEscape(rule.name)+'"',s(0)))),parts.push("}"),parts.join("\n")}function generateToplevel(){var u,e,t,r,n,o=[];return o.push(["function peg$subclass(child, parent) {"," function ctor() { this.constructor = child; }"," ctor.prototype = parent.prototype;"," child.prototype = new ctor();","}","","function peg$SyntaxError(message, expected, found, location) {"," this.message = message;"," this.expected = expected;"," this.found = found;"," this.location = location;",' this.name = "SyntaxError";',"",' if (typeof Error.captureStackTrace === "function") {'," Error.captureStackTrace(this, peg$SyntaxError);"," }","}","","peg$subclass(peg$SyntaxError, Error);","","peg$SyntaxError.buildMessage = function(expected, found) {"," var DESCRIBE_EXPECTATION_FNS = {"," literal: function(expectation) {",' return "\\"" + literalEscape(expectation.text) + "\\"";'," },","",' "class": function(expectation) {',' var escapedParts = "",'," i;",""," for (i = 0; i < expectation.parts.length; i++) {"," escapedParts += expectation.parts[i] instanceof Array",' ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])'," : classEscape(expectation.parts[i]);"," }","",' return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";'," },",""," any: function(expectation) {",' return "any character";'," },",""," end: function(expectation) {",' return "end of input";'," },",""," other: function(expectation) {"," return expectation.description;"," }"," };",""," function hex(ch) {"," return ch.charCodeAt(0).toString(16).toUpperCase();"," }",""," function literalEscape(s) {"," return s"," .replace(/\\\\/g, '\\\\\\\\')"," .replace(/\"/g, '\\\\\"')"," .replace(/\\0/g, '\\\\0')"," .replace(/\\t/g, '\\\\t')"," .replace(/\\n/g, '\\\\n')"," .replace(/\\r/g, '\\\\r')"," .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })"," .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });"," }",""," function classEscape(s) {"," return s"," .replace(/\\\\/g, '\\\\\\\\')"," .replace(/\\]/g, '\\\\]')"," .replace(/\\^/g, '\\\\^')"," .replace(/-/g, '\\\\-')"," .replace(/\\0/g, '\\\\0')"," .replace(/\\t/g, '\\\\t')"," .replace(/\\n/g, '\\\\n')"," .replace(/\\r/g, '\\\\r')"," .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })"," .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });"," }",""," function describeExpectation(expectation) {"," return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);"," }",""," function describeExpected(expected) {"," var descriptions = new Array(expected.length),"," i, j;",""," for (i = 0; i < expected.length; i++) {"," descriptions[i] = describeExpectation(expected[i]);"," }",""," descriptions.sort();",""," if (descriptions.length > 0) {"," for (i = 1, j = 1; i < descriptions.length; i++) {"," if (descriptions[i - 1] !== descriptions[i]) {"," descriptions[j] = descriptions[i];"," j++;"," }"," }"," descriptions.length = j;"," }",""," switch (descriptions.length) {"," case 1:"," return descriptions[0];",""," case 2:",' return descriptions[0] + " or " + descriptions[1];',""," default:",' return descriptions.slice(0, -1).join(", ")',' + ", or "'," + descriptions[descriptions.length - 1];"," }"," }",""," function describeFound(found) {",' return found ? "\\"" + literalEscape(found) + "\\"" : "end of input";'," }","",' return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";',"};",""].join("\n")),options.trace&&o.push(["function peg$DefaultTracer() {"," this.indentLevel = 0;","}","","peg$DefaultTracer.prototype.trace = function(event) {"," var that = this;",""," function log(event) {"," function repeat(string, n) {",' var result = "", i;',""," for (i = 0; i < n; i++) {"," result += string;"," }",""," return result;"," }",""," function pad(string, length) {",' return string + repeat(" ", length - string.length);'," }","",' if (typeof console === "object") {'," console.log(",' event.location.start.line + ":" + event.location.start.column + "-"',' + event.location.end.line + ":" + event.location.end.column + " "',' + pad(event.type, 10) + " "',' + repeat(" ", that.indentLevel) + event.rule'," );"," }"," }",""," switch (event.type) {",' case "rule.enter":'," log(event);"," this.indentLevel++;"," break;","",' case "rule.match":'," this.indentLevel--;"," log(event);"," break;","",' case "rule.fail":'," this.indentLevel--;"," log(event);"," break;",""," default:",' throw new Error("Invalid event type: " + event.type + ".");'," }","};",""].join("\n")),o.push(["function peg$parse(input, options) {"," options = options !== void 0 ? options : {};",""," var peg$FAILED = {},",""].join("\n")),"size"===options.optimize?(u="{ "+arrays.map(options.allowedStartRules,function(u){return u+": "+asts.indexOfRule(ast,u)}).join(", ")+" }",e=asts.indexOfRule(ast,options.allowedStartRules[0]),o.push([" peg$startRuleIndices = "+u+","," peg$startRuleIndex = "+e+","].join("\n"))):(t="{ "+arrays.map(options.allowedStartRules,function(u){return u+": peg$parse"+u}).join(", ")+" }",r="peg$parse"+options.allowedStartRules[0],o.push([" peg$startRuleFunctions = "+t+","," peg$startRuleFunction = "+r+","].join("\n"))),o.push(""),o.push(indent6(generateTables())),o.push([""," peg$currPos = 0,"," peg$savedPos = 0,"," peg$posDetailsCache = [{ line: 1, column: 1 }],"," peg$maxFailPos = 0,"," peg$maxFailExpected = [],"," peg$silentFails = 0,",""].join("\n")),options.cache&&o.push([" peg$resultsCache = {},",""].join("\n")),options.trace&&("size"===options.optimize&&(n="["+arrays.map(ast.rules,function(u){return'"'+js.stringEscape(u.name)+'"'}).join(", ")+"]",o.push([" peg$ruleNames = "+n+",",""].join("\n"))),o.push([' peg$tracer = "tracer" in options ? options.tracer : new peg$DefaultTracer(),',""].join("\n"))),o.push([" peg$result;",""].join("\n")),"size"===options.optimize?o.push([' if ("startRule" in options) {'," if (!(options.startRule in peg$startRuleIndices)) {",' throw new Error("Can\'t start parsing from rule \\"" + options.startRule + "\\".");'," }",""," peg$startRuleIndex = peg$startRuleIndices[options.startRule];"," }"].join("\n")):o.push([' if ("startRule" in options) {'," if (!(options.startRule in peg$startRuleFunctions)) {",' throw new Error("Can\'t start parsing from rule \\"" + options.startRule + "\\".");'," }",""," peg$startRuleFunction = peg$startRuleFunctions[options.startRule];"," }"].join("\n")),o.push([""," function text() {"," return input.substring(peg$savedPos, peg$currPos);"," }",""," function location() {"," return peg$computeLocation(peg$savedPos, peg$currPos);"," }",""," function expected(description, location) {"," location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)",""," throw peg$buildStructuredError("," [peg$otherExpectation(description)],"," input.substring(peg$savedPos, peg$currPos),"," location"," );"," }",""," function error(message, location) {"," location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)",""," throw peg$buildSimpleError(message, location);"," }",""," function peg$literalExpectation(text, ignoreCase) {",' return { type: "literal", text: text, ignoreCase: ignoreCase };'," }",""," function peg$classExpectation(parts, inverted, ignoreCase) {",' return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };'," }",""," function peg$anyExpectation() {",' return { type: "any" };'," }",""," function peg$endExpectation() {",' return { type: "end" };'," }",""," function peg$otherExpectation(description) {",' return { type: "other", description: description };'," }",""," function peg$computePosDetails(pos) {"," var details = peg$posDetailsCache[pos], p;",""," if (details) {"," return details;"," } else {"," p = pos - 1;"," while (!peg$posDetailsCache[p]) {"," p--;"," }",""," details = peg$posDetailsCache[p];"," details = {"," line: details.line,"," column: details.column"," };",""," while (p < pos) {"," if (input.charCodeAt(p) === 10) {"," details.line++;"," details.column = 1;"," } else {"," details.column++;"," }",""," p++;"," }",""," peg$posDetailsCache[pos] = details;"," return details;"," }"," }",""," function peg$computeLocation(startPos, endPos) {"," var startPosDetails = peg$computePosDetails(startPos),"," endPosDetails = peg$computePosDetails(endPos);",""," return {"," start: {"," offset: startPos,"," line: startPosDetails.line,"," column: startPosDetails.column"," },"," end: {"," offset: endPos,"," line: endPosDetails.line,"," column: endPosDetails.column"," }"," };"," }",""," function peg$fail(expected) {"," if (peg$currPos < peg$maxFailPos) { return; }",""," if (peg$currPos > peg$maxFailPos) {"," peg$maxFailPos = peg$currPos;"," peg$maxFailExpected = [];"," }",""," peg$maxFailExpected.push(expected);"," }",""," function peg$buildSimpleError(message, location) {"," return new peg$SyntaxError(message, null, null, location);"," }",""," function peg$buildStructuredError(expected, found, location) {"," return new peg$SyntaxError("," peg$SyntaxError.buildMessage(expected, found),"," expected,"," found,"," location"," );"," }",""].join("\n")),"size"===options.optimize?(o.push(indent2(generateInterpreter())), +o.push("")):arrays.each(ast.rules,function(u){o.push(indent2(generateRuleFunction(u))),o.push("")}),ast.initializer&&(o.push(indent2(ast.initializer.code)),o.push("")),"size"===options.optimize?o.push(" peg$result = peg$parseRule(peg$startRuleIndex);"):o.push(" peg$result = peg$startRuleFunction();"),o.push([""," if (peg$result !== peg$FAILED && peg$currPos === input.length) {"," return peg$result;"," } else {"," if (peg$result !== peg$FAILED && peg$currPos < input.length) {"," peg$fail(peg$endExpectation());"," }",""," throw peg$buildStructuredError("," peg$maxFailExpected,"," peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,"," peg$maxFailPos < input.length"," ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)"," : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)"," );"," }","}"].join("\n")),o.join("\n")}function generateWrapper(u){function e(){return["/*"," * Generated by PEG.js 0.10.0."," *"," * http://pegjs.org/"," */"].join("\n")}function t(){return options.trace?["{"," SyntaxError: peg$SyntaxError,"," DefaultTracer: peg$DefaultTracer,"," parse: peg$parse","}"].join("\n"):["{"," SyntaxError: peg$SyntaxError,"," parse: peg$parse","}"].join("\n")}var r={bare:function(){return[e(),"(function() {",' "use strict";',"",indent2(u),"",indent2("return "+t()+";"),"})()"].join("\n")},commonjs:function(){var r=[],n=objects.keys(options.dependencies),o=arrays.map(n,function(u){return u+' = require("'+js.stringEscape(options.dependencies[u])+'")'});return r.push([e(),"",'"use strict";',""].join("\n")),o.length>0&&(r.push("var "+o.join(", ")+";"),r.push("")),r.push([u,"","module.exports = "+t()+";",""].join("\n")),r.join("\n")},amd:function(){var r=objects.values(options.dependencies),n=objects.keys(options.dependencies),o="["+arrays.map(r,function(u){return'"'+js.stringEscape(u)+'"'}).join(", ")+"]",s=n.join(", ");return[e(),"define("+o+", function("+s+") {",' "use strict";',"",indent2(u),"",indent2("return "+t()+";"),"});",""].join("\n")},globals:function(){return[e(),"(function(root) {",' "use strict";',"",indent2(u),"",indent2("root."+options.exportVar+" = "+t()+";"),"})(this);",""].join("\n")},umd:function(){var r=[],n=objects.values(options.dependencies),o=objects.keys(options.dependencies),s="["+arrays.map(n,function(u){return'"'+js.stringEscape(u)+'"'}).join(", ")+"]",i=arrays.map(n,function(u){return'require("'+js.stringEscape(u)+'")'}).join(", "),a=o.join(", ");return r.push([e(),"(function(root, factory) {",' if (typeof define === "function" && define.amd) {'," define("+s+", factory);",' } else if (typeof module === "object" && module.exports) {'," module.exports = factory("+i+");"].join("\n")),null!==options.exportVar&&r.push([" } else {"," root."+options.exportVar+" = factory();"].join("\n")),r.push([" }","})(this, function("+a+") {",' "use strict";',"",indent2(u),"",indent2("return "+t()+";"),"});",""].join("\n")),r.join("\n")}};return r[options.format]()}ast.code=generateWrapper(generateToplevel())}var arrays=require("../../utils/arrays"),objects=require("../../utils/objects"),asts=require("../asts"),op=require("../opcodes"),js=require("../js");module.exports=generateJS},{"../../utils/arrays":17,"../../utils/objects":19,"../asts":1,"../js":3,"../opcodes":4}],7:[function(u,e,t){"use strict";function r(u,e){function t(u){return"rule"===u.type&&"rule_ref"===u.expression.type}function r(u,e,t){var r=o.build({rule_ref:function(u){u.name===e&&(u.name=t)}});r(u)}var s=[];n.each(u.rules,function(o,i){t(o)&&(r(u,o.name,o.expression.name),n.contains(e.allowedStartRules,o.name)||s.push(i))}),s.reverse(),n.each(s,function(e){u.rules.splice(e,1)})}var n=u("../../utils/arrays"),o=u("../visitor");e.exports=r},{"../../utils/arrays":17,"../visitor":13}],8:[function(u,e,t){"use strict";function r(u){function e(u,e){t(u.expression,s.clone(e))}var t=i.build({rule:function(u){t(u.expression,{})},choice:function(u,e){o.each(u.alternatives,function(u){t(u,s.clone(e))})},action:e,labeled:function(u,e){if(e.hasOwnProperty(u.label))throw new n('Label "'+u.label+'" is already defined at line '+e[u.label].start.line+", column "+e[u.label].start.column+".",u.location);t(u.expression,e),e[u.label]=u.location},text:e,simple_and:e,simple_not:e,optional:e,zero_or_more:e,one_or_more:e,group:e});t(u)}var n=u("../../grammar-error"),o=u("../../utils/arrays"),s=u("../../utils/objects"),i=u("../visitor");e.exports=r},{"../../grammar-error":14,"../../utils/arrays":17,"../../utils/objects":19,"../visitor":13}],9:[function(u,e,t){"use strict";function r(u){var e={},t=o.build({rule:function(u){if(e.hasOwnProperty(u.name))throw new n('Rule "'+u.name+'" is already defined at line '+e[u.name].start.line+", column "+e[u.name].start.column+".",u.location);e[u.name]=u.location}});t(u)}var n=u("../../grammar-error"),o=u("../visitor");e.exports=r},{"../../grammar-error":14,"../visitor":13}],10:[function(u,e,t){"use strict";function r(u){var e=[],t=i.build({rule:function(u){e.push(u.name),t(u.expression),e.pop(u.name)},sequence:function(e){n.every(e.elements,function(e){return t(e),!s.alwaysConsumesOnSuccess(u,e)})},rule_ref:function(r){if(n.contains(e,r.name))throw e.push(r.name),new o("Possible infinite loop when parsing (left recursion: "+e.join(" -> ")+").",r.location);t(s.findRule(u,r.name))}});t(u)}var n=u("../../utils/arrays"),o=u("../../grammar-error"),s=u("../asts"),i=u("../visitor");e.exports=r},{"../../grammar-error":14,"../../utils/arrays":17,"../asts":1,"../visitor":13}],11:[function(u,e,t){"use strict";function r(u){var e=s.build({zero_or_more:function(e){if(!o.alwaysConsumesOnSuccess(u,e.expression))throw new n("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).",e.location)},one_or_more:function(e){if(!o.alwaysConsumesOnSuccess(u,e.expression))throw new n("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).",e.location)}});e(u)}var n=u("../../grammar-error"),o=u("../asts"),s=u("../visitor");e.exports=r},{"../../grammar-error":14,"../asts":1,"../visitor":13}],12:[function(u,e,t){"use strict";function r(u){var e=s.build({rule_ref:function(e){if(!o.findRule(u,e.name))throw new n('Rule "'+e.name+'" is not defined.',e.location)}});e(u)}var n=u("../../grammar-error"),o=u("../asts"),s=u("../visitor");e.exports=r},{"../../grammar-error":14,"../asts":1,"../visitor":13}],13:[function(u,e,t){"use strict";var r=u("../utils/objects"),n=u("../utils/arrays"),o={build:function(u){function e(e){return u[e.type].apply(null,arguments)}function t(){}function o(u){var t=Array.prototype.slice.call(arguments,1);e.apply(null,[u.expression].concat(t))}function s(u){return function(t){var r=Array.prototype.slice.call(arguments,1);n.each(t[u],function(u){e.apply(null,[u].concat(r))})}}var i={grammar:function(u){var t=Array.prototype.slice.call(arguments,1);u.initializer&&e.apply(null,[u.initializer].concat(t)),n.each(u.rules,function(u){e.apply(null,[u].concat(t))})},initializer:t,rule:o,named:o,choice:s("alternatives"),action:o,sequence:s("elements"),labeled:o,text:o,simple_and:o,simple_not:o,optional:o,zero_or_more:o,one_or_more:o,group:o,semantic_and:t,semantic_not:t,rule_ref:t,literal:t,class:t,any:t};return r.defaults(u,i),e}};e.exports=o},{"../utils/arrays":17,"../utils/objects":19}],14:[function(u,e,t){"use strict";function r(u,e){this.name="GrammarError",this.message=u,this.location=e,"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,r)}var n=u("./utils/classes");n.subclass(r,Error),e.exports=r},{"./utils/classes":18}],15:[function(u,e,t){"use strict";function r(u,e){function t(){this.constructor=u}t.prototype=e.prototype,u.prototype=new t}function n(u,e,t,r){this.message=u,this.expected=e,this.found=t,this.location=r,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,n)}function o(u,e){function t(){return u.substring(Yo,Vo)}function r(){return l(Yo,Vo)}function o(u,e){throw e=void 0!==e?e:l(Yo,Vo),C(u,e)}function s(u,e){return{type:"literal",text:u,ignoreCase:e}}function i(u,e,t){return{type:"class",parts:u,inverted:e,ignoreCase:t}}function a(){return{type:"any"}}function c(){return{type:"end"}}function p(u){return{type:"other",description:u}}function A(e){var t,r=Wo[e];if(r)return r;for(t=e-1;!Wo[t];)t--;for(r=Wo[t],r={line:r.line,column:r.column};tXo&&(Xo=Vo,Jo=[]),Jo.push(u))}function C(u,e){return new n(u,null,null,e)}function f(u,e,t){return new n(n.buildMessage(u,e),u,e,t)}function F(){var u,e,t,r,n,o,s;if(u=Vo,e=ae(),e!==de)if(t=Vo,r=d(),r!==de?(n=ae(),n!==de?(r=[r,n],t=r):(Vo=t,t=de)):(Vo=t,t=de),t===de&&(t=null),t!==de){if(r=[],n=Vo,o=h(),o!==de?(s=ae(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),n!==de)for(;n!==de;)r.push(n),n=Vo,o=h(),o!==de?(s=ae(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);else r=de;r!==de?(Yo=u,e=De(t,r),u=e):(Vo=u,u=de)}else Vo=u,u=de;else Vo=u,u=de;return u}function d(){var u,e,t;return u=Vo,e=Eu(),e!==de?(t=pe(),t!==de?(Yo=u,e=Be(e),u=e):(Vo=u,u=de)):(Vo=u,u=de),u}function h(){var e,t,r,n,o,s,i,a;return e=Vo,t=U(),t!==de?(r=ae(),r!==de?(n=Vo,o=J(),o!==de?(s=ae(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),n===de&&(n=null),n!==de?(61===u.charCodeAt(Vo)?(o=ve,Vo++):(o=de,0===Zo&&E(me)),o!==de?(s=ae(),s!==de?(i=g(),i!==de?(a=pe(),a!==de?(Yo=e,t=be(t,n,i),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),e}function g(){var e,t,r,n,o,s,i,a;if(e=Vo,t=D(),t!==de){for(r=[],n=Vo,o=ae(),o!==de?(47===u.charCodeAt(Vo)?(s=xe,Vo++):(s=de,0===Zo&&E(Pe)),s!==de?(i=ae(),i!==de?(a=D(),a!==de?(o=[o,s,i,a],n=o):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de);n!==de;)r.push(n),n=Vo,o=ae(),o!==de?(47===u.charCodeAt(Vo)?(s=xe,Vo++):(s=de,0===Zo&&E(Pe)),s!==de?(i=ae(),i!==de?(a=D(),a!==de?(o=[o,s,i,a],n=o):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de);r!==de?(Yo=e,t=_e(t,r),e=t):(Vo=e,e=de)}else Vo=e,e=de;return e}function D(){var u,e,t,r,n;return u=Vo,e=B(),e!==de?(t=Vo,r=ae(),r!==de?(n=Eu(),n!==de?(r=[r,n],t=r):(Vo=t,t=de)):(Vo=t,t=de),t===de&&(t=null),t!==de?(Yo=u,e=ye(e,t),u=e):(Vo=u,u=de)):(Vo=u,u=de),u}function B(){var u,e,t,r,n,o;if(u=Vo,e=v(),e!==de){for(t=[],r=Vo,n=ae(),n!==de?(o=v(),o!==de?(n=[n,o],r=n):(Vo=r,r=de)):(Vo=r,r=de);r!==de;)t.push(r),r=Vo,n=ae(),n!==de?(o=v(),o!==de?(n=[n,o],r=n):(Vo=r,r=de)):(Vo=r,r=de);t!==de?(Yo=u,e=$e(e,t),u=e):(Vo=u,u=de)}else Vo=u,u=de;return u}function v(){var e,t,r,n,o,s;return e=Vo,t=N(),t!==de?(r=ae(),r!==de?(58===u.charCodeAt(Vo)?(n=Re,Vo++):(n=de,0===Zo&&E(ke)),n!==de?(o=ae(),o!==de?(s=m(),s!==de?(Yo=e,t=Se(t,s),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=m()),e}function m(){var u,e,t,r;return u=Vo,e=b(),e!==de?(t=ae(),t!==de?(r=x(),r!==de?(Yo=u,e=Ie(e,r),u=e):(Vo=u,u=de)):(Vo=u,u=de)):(Vo=u,u=de),u===de&&(u=x()),u}function b(){var e;return 36===u.charCodeAt(Vo)?(e=Oe,Vo++):(e=de,0===Zo&&E(je)),e===de&&(38===u.charCodeAt(Vo)?(e=Le,Vo++):(e=de,0===Zo&&E(we)),e===de&&(33===u.charCodeAt(Vo)?(e=Te,Vo++):(e=de,0===Zo&&E(Ne)))),e}function x(){var u,e,t,r;return u=Vo,e=_(),e!==de?(t=ae(),t!==de?(r=P(),r!==de?(Yo=u,e=Ue(e,r),u=e):(Vo=u,u=de)):(Vo=u,u=de)):(Vo=u,u=de),u===de&&(u=_()),u}function P(){var e;return 63===u.charCodeAt(Vo)?(e=He,Vo++):(e=de,0===Zo&&E(qe)),e===de&&(42===u.charCodeAt(Vo)?(e=ze,Vo++):(e=de,0===Zo&&E(Me)),e===de&&(43===u.charCodeAt(Vo)?(e=Ge,Vo++):(e=de,0===Zo&&E(Ve)))),e}function _(){var e,t,r,n,o,s;return e=X(),e===de&&(e=Q(),e===de&&(e=lu(),e===de&&(e=y(),e===de&&(e=$(),e===de&&(e=Vo,40===u.charCodeAt(Vo)?(t=Ye,Vo++):(t=de,0===Zo&&E(We)),t!==de?(r=ae(),r!==de?(n=g(),n!==de?(o=ae(),o!==de?(41===u.charCodeAt(Vo)?(s=Xe,Vo++):(s=de,0===Zo&&E(Je)),s!==de?(Yo=e,t=Ze(n),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)))))),e}function y(){var e,t,r,n,o,s,i,a;return e=Vo,t=U(),t!==de?(r=Vo,Zo++,n=Vo,o=ae(),o!==de?(s=Vo,i=J(),i!==de?(a=ae(),a!==de?(i=[i,a],s=i):(Vo=s,s=de)):(Vo=s,s=de),s===de&&(s=null),s!==de?(61===u.charCodeAt(Vo)?(i=ve,Vo++):(i=de,0===Zo&&E(me)),i!==de?(o=[o,s,i],n=o):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(Yo=e,t=Ke(t),e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function $(){var u,e,t,r;return u=Vo,e=R(),e!==de?(t=ae(),t!==de?(r=Eu(),r!==de?(Yo=u,e=Qe(e,r),u=e):(Vo=u,u=de)):(Vo=u,u=de)):(Vo=u,u=de),u}function R(){var e;return 38===u.charCodeAt(Vo)?(e=Le,Vo++):(e=de,0===Zo&&E(we)),e===de&&(33===u.charCodeAt(Vo)?(e=Te,Vo++):(e=de,0===Zo&&E(Ne))),e}function k(){var e;return u.length>Vo?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(ut)),e}function S(){var e,t;return Zo++,9===u.charCodeAt(Vo)?(e=tt,Vo++):(e=de,0===Zo&&E(rt)),e===de&&(11===u.charCodeAt(Vo)?(e=nt,Vo++):(e=de,0===Zo&&E(ot)),e===de&&(12===u.charCodeAt(Vo)?(e=st,Vo++):(e=de,0===Zo&&E(it)),e===de&&(32===u.charCodeAt(Vo)?(e=at,Vo++):(e=de,0===Zo&&E(ct)),e===de&&(160===u.charCodeAt(Vo)?(e=pt,Vo++):(e=de,0===Zo&&E(At)),e===de&&(65279===u.charCodeAt(Vo)?(e=lt,Vo++):(e=de,0===Zo&&E(Et)),e===de&&(e=xu())))))),Zo--,e===de&&(t=de,0===Zo&&E(et)),e}function I(){var e;return Ct.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(ft)),e}function O(){var e,t;return Zo++,10===u.charCodeAt(Vo)?(e=dt,Vo++):(e=de,0===Zo&&E(ht)),e===de&&(u.substr(Vo,2)===gt?(e=gt,Vo+=2):(e=de,0===Zo&&E(Dt)),e===de&&(13===u.charCodeAt(Vo)?(e=Bt,Vo++):(e=de,0===Zo&&E(vt)),e===de&&(8232===u.charCodeAt(Vo)?(e=mt,Vo++):(e=de,0===Zo&&E(bt)),e===de&&(8233===u.charCodeAt(Vo)?(e=xt,Vo++):(e=de,0===Zo&&E(Pt)))))),Zo--,e===de&&(t=de,0===Zo&&E(Ft)),e}function j(){var u,e;return Zo++,u=L(),u===de&&(u=T()),Zo--,u===de&&(e=de,0===Zo&&E(_t)),u}function L(){var e,t,r,n,o,s;if(e=Vo,u.substr(Vo,2)===yt?(t=yt,Vo+=2):(t=de,0===Zo&&E($t)),t!==de){for(r=[],n=Vo,o=Vo,Zo++,u.substr(Vo,2)===Rt?(s=Rt,Vo+=2):(s=de,0===Zo&&E(kt)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);n!==de;)r.push(n),n=Vo,o=Vo,Zo++,u.substr(Vo,2)===Rt?(s=Rt,Vo+=2):(s=de,0===Zo&&E(kt)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);r!==de?(u.substr(Vo,2)===Rt?(n=Rt,Vo+=2):(n=de,0===Zo&&E(kt)),n!==de?(t=[t,r,n],e=t):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;return e}function w(){var e,t,r,n,o,s;if(e=Vo,u.substr(Vo,2)===yt?(t=yt,Vo+=2):(t=de,0===Zo&&E($t)),t!==de){for(r=[],n=Vo,o=Vo,Zo++,u.substr(Vo,2)===Rt?(s=Rt,Vo+=2):(s=de,0===Zo&&E(kt)),s===de&&(s=I()),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);n!==de;)r.push(n),n=Vo,o=Vo,Zo++,u.substr(Vo,2)===Rt?(s=Rt,Vo+=2):(s=de,0===Zo&&E(kt)),s===de&&(s=I()),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);r!==de?(u.substr(Vo,2)===Rt?(n=Rt,Vo+=2):(n=de,0===Zo&&E(kt)),n!==de?(t=[t,r,n],e=t):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;return e}function T(){var e,t,r,n,o,s;if(e=Vo,u.substr(Vo,2)===St?(t=St,Vo+=2):(t=de,0===Zo&&E(It)),t!==de){for(r=[],n=Vo,o=Vo,Zo++,s=I(),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);n!==de;)r.push(n),n=Vo,o=Vo,Zo++,s=I(),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);r!==de?(t=[t,r],e=t):(Vo=e,e=de)}else Vo=e,e=de;return e}function N(){var u,e,t;return u=Vo,e=Vo,Zo++,t=G(),Zo--,t===de?e=void 0:(Vo=e,e=de),e!==de?(t=U(),t!==de?(Yo=u,e=Ot(t),u=e):(Vo=u,u=de)):(Vo=u,u=de),u}function U(){var u,e,t,r;if(Zo++,u=Vo,e=H(),e!==de){for(t=[],r=q();r!==de;)t.push(r),r=q();t!==de?(Yo=u,e=Lt(e,t),u=e):(Vo=u,u=de)}else Vo=u,u=de;return Zo--,u===de&&(e=de,0===Zo&&E(jt)),u}function H(){var e,t,r;return e=z(),e===de&&(36===u.charCodeAt(Vo)?(e=Oe,Vo++):(e=de,0===Zo&&E(je)),e===de&&(95===u.charCodeAt(Vo)?(e=wt,Vo++):(e=de,0===Zo&&E(Tt)),e===de&&(e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=cu(),r!==de?(Yo=e,t=Ht(r),e=t):(Vo=e,e=de)):(Vo=e,e=de)))),e}function q(){var e;return e=H(),e===de&&(e=M(),e===de&&(e=vu(),e===de&&(e=bu(),e===de&&(8204===u.charCodeAt(Vo)?(e=qt,Vo++):(e=de,0===Zo&&E(zt)),e===de&&(8205===u.charCodeAt(Vo)?(e=Mt,Vo++):(e=de,0===Zo&&E(Gt))))))),e}function z(){var u;return u=gu(),u===de&&(u=fu(),u===de&&(u=hu(),u===de&&(u=Fu(),u===de&&(u=du(),u===de&&(u=mu()))))),u}function M(){var u;return u=Bu(),u===de&&(u=Du()),u}function G(){var u;return u=V(),u===de&&(u=Y(),u===de&&(u=Xu(),u===de&&(u=W()))),u}function V(){var u;return u=Pu(),u===de&&(u=_u(),u===de&&(u=yu(),u===de&&(u=ku(),u===de&&(u=Su(),u===de&&(u=Iu(),u===de&&(u=Ou(),u===de&&(u=ju(),u===de&&(u=Lu(),u===de&&(u=Hu(),u===de&&(u=qu(),u===de&&(u=zu(),u===de&&(u=Mu(),u===de&&(u=Vu(),u===de&&(u=Yu(),u===de&&(u=Wu(),u===de&&(u=Ju(),u===de&&(u=Ku(),u===de&&(u=Qu(),u===de&&(u=ue(),u===de&&(u=te(),u===de&&(u=re(),u===de&&(u=ne(),u===de&&(u=oe(),u===de&&(u=se(),u===de&&(u=ie()))))))))))))))))))))))))),u}function Y(){var u;return u=$u(),u===de&&(u=Ru(),u===de&&(u=wu(),u===de&&(u=Tu(),u===de&&(u=Nu(),u===de&&(u=Gu(),u===de&&(u=Zu())))))),u}function W(){var u;return u=ee(),u===de&&(u=Uu()),u}function X(){var e,t,r;return Zo++,e=Vo,t=J(),t!==de?(105===u.charCodeAt(Vo)?(r=Yt,Vo++):(r=de,0===Zo&&E(Wt)),r===de&&(r=null),r!==de?(Yo=e,t=Xt(t,r),e=t):(Vo=e,e=de)):(Vo=e,e=de),Zo--,e===de&&(t=de,0===Zo&&E(Vt)),e}function J(){var e,t,r,n;if(Zo++,e=Vo,34===u.charCodeAt(Vo)?(t=Zt,Vo++):(t=de,0===Zo&&E(Kt)),t!==de){for(r=[],n=Z();n!==de;)r.push(n),n=Z();r!==de?(34===u.charCodeAt(Vo)?(n=Zt,Vo++):(n=de,0===Zo&&E(Kt)),n!==de?(Yo=e,t=Qt(r),e=t):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;if(e===de)if(e=Vo,39===u.charCodeAt(Vo)?(t=ur,Vo++):(t=de,0===Zo&&E(er)),t!==de){for(r=[],n=K();n!==de;)r.push(n),n=K();r!==de?(39===u.charCodeAt(Vo)?(n=ur,Vo++):(n=de,0===Zo&&E(er)),n!==de?(Yo=e,t=Qt(r),e=t):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;return Zo--,e===de&&(t=de,0===Zo&&E(Jt)),e}function Z(){var e,t,r;return e=Vo,t=Vo,Zo++,34===u.charCodeAt(Vo)?(r=Zt,Vo++):(r=de,0===Zo&&E(Kt)),r===de&&(92===u.charCodeAt(Vo)?(r=Nt,Vo++):(r=de,0===Zo&&E(Ut)),r===de&&(r=I())),Zo--,r===de?t=void 0:(Vo=t,t=de),t!==de?(r=k(),r!==de?(Yo=e,t=tr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=ru(),r!==de?(Yo=e,t=Ht(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=tu())),e}function K(){var e,t,r;return e=Vo,t=Vo,Zo++,39===u.charCodeAt(Vo)?(r=ur,Vo++):(r=de,0===Zo&&E(er)),r===de&&(92===u.charCodeAt(Vo)?(r=Nt,Vo++):(r=de,0===Zo&&E(Ut)),r===de&&(r=I())),Zo--,r===de?t=void 0:(Vo=t,t=de),t!==de?(r=k(),r!==de?(Yo=e,t=tr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=ru(),r!==de?(Yo=e,t=Ht(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=tu())),e}function Q(){var e,t,r,n,o,s;if(Zo++,e=Vo,91===u.charCodeAt(Vo)?(t=nr,Vo++):(t=de,0===Zo&&E(or)),t!==de)if(94===u.charCodeAt(Vo)?(r=sr,Vo++):(r=de,0===Zo&&E(ir)),r===de&&(r=null),r!==de){for(n=[],o=uu(),o===de&&(o=eu());o!==de;)n.push(o),o=uu(),o===de&&(o=eu());n!==de?(93===u.charCodeAt(Vo)?(o=ar,Vo++):(o=de,0===Zo&&E(cr)),o!==de?(105===u.charCodeAt(Vo)?(s=Yt,Vo++):(s=de,0===Zo&&E(Wt)),s===de&&(s=null),s!==de?(Yo=e,t=pr(r,n,s),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;else Vo=e,e=de;return Zo--,e===de&&(t=de,0===Zo&&E(rr)),e}function uu(){var e,t,r,n;return e=Vo,t=eu(),t!==de?(45===u.charCodeAt(Vo)?(r=Ar,Vo++):(r=de,0===Zo&&E(lr)),r!==de?(n=eu(),n!==de?(Yo=e,t=Er(t,n),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),e}function eu(){var e,t,r;return e=Vo,t=Vo,Zo++,93===u.charCodeAt(Vo)?(r=ar,Vo++):(r=de,0===Zo&&E(cr)),r===de&&(92===u.charCodeAt(Vo)?(r=Nt,Vo++):(r=de,0===Zo&&E(Ut)),r===de&&(r=I())),Zo--,r===de?t=void 0:(Vo=t,t=de),t!==de?(r=k(),r!==de?(Yo=e,t=tr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=ru(),r!==de?(Yo=e,t=Ht(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=tu())),e}function tu(){var e,t,r;return e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=O(),r!==de?(Yo=e,t=Cr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ru(){var e,t,r,n;return e=nu(),e===de&&(e=Vo,48===u.charCodeAt(Vo)?(t=fr,Vo++):(t=de,0===Zo&&E(Fr)),t!==de?(r=Vo,Zo++,n=pu(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(Yo=e,t=dr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=au(),e===de&&(e=cu()))),e}function nu(){var u;return u=ou(),u===de&&(u=su()),u}function ou(){var e,t;return 39===u.charCodeAt(Vo)?(e=ur,Vo++):(e=de,0===Zo&&E(er)),e===de&&(34===u.charCodeAt(Vo)?(e=Zt,Vo++):(e=de,0===Zo&&E(Kt)),e===de&&(92===u.charCodeAt(Vo)?(e=Nt,Vo++):(e=de,0===Zo&&E(Ut)),e===de&&(e=Vo,98===u.charCodeAt(Vo)?(t=hr,Vo++):(t=de,0===Zo&&E(gr)),t!==de&&(Yo=e,t=Dr()),e=t,e===de&&(e=Vo,102===u.charCodeAt(Vo)?(t=Br,Vo++):(t=de,0===Zo&&E(vr)),t!==de&&(Yo=e,t=mr()),e=t,e===de&&(e=Vo,110===u.charCodeAt(Vo)?(t=br,Vo++):(t=de,0===Zo&&E(xr)),t!==de&&(Yo=e,t=Pr()),e=t,e===de&&(e=Vo,114===u.charCodeAt(Vo)?(t=_r,Vo++):(t=de,0===Zo&&E(yr)),t!==de&&(Yo=e,t=$r()),e=t,e===de&&(e=Vo,116===u.charCodeAt(Vo)?(t=Rr,Vo++):(t=de,0===Zo&&E(kr)),t!==de&&(Yo=e,t=Sr()),e=t,e===de&&(e=Vo,118===u.charCodeAt(Vo)?(t=Ir,Vo++):(t=de,0===Zo&&E(Or)),t!==de&&(Yo=e,t=jr()),e=t)))))))),e}function su(){var u,e,t;return u=Vo,e=Vo,Zo++,t=iu(),t===de&&(t=I()),Zo--,t===de?e=void 0:(Vo=e,e=de),e!==de?(t=k(),t!==de?(Yo=u,e=tr(),u=e):(Vo=u,u=de)):(Vo=u,u=de),u}function iu(){var e;return e=ou(),e===de&&(e=pu(),e===de&&(120===u.charCodeAt(Vo)?(e=Lr,Vo++):(e=de,0===Zo&&E(wr)),e===de&&(117===u.charCodeAt(Vo)?(e=Tr,Vo++):(e=de,0===Zo&&E(Nr))))),e}function au(){var e,t,r,n,o,s;return e=Vo,120===u.charCodeAt(Vo)?(t=Lr,Vo++):(t=de,0===Zo&&E(wr)),t!==de?(r=Vo,n=Vo,o=Au(),o!==de?(s=Au(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),r=n!==de?u.substring(r,Vo):n,r!==de?(Yo=e,t=Ur(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function cu(){var e,t,r,n,o,s,i,a;return e=Vo,117===u.charCodeAt(Vo)?(t=Tr,Vo++):(t=de,0===Zo&&E(Nr)),t!==de?(r=Vo,n=Vo,o=Au(),o!==de?(s=Au(),s!==de?(i=Au(),i!==de?(a=Au(),a!==de?(o=[o,s,i,a],n=o):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de),r=n!==de?u.substring(r,Vo):n,r!==de?(Yo=e,t=Ur(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function pu(){var e;return Hr.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(qr)),e}function Au(){var e;return zr.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(Mr)),e}function lu(){var e,t;return e=Vo,46===u.charCodeAt(Vo)?(t=Gr,Vo++):(t=de,0===Zo&&E(Vr)),t!==de&&(Yo=e,t=Yr()),e=t}function Eu(){var e,t,r,n;return Zo++,e=Vo,123===u.charCodeAt(Vo)?(t=Xr,Vo++):(t=de,0===Zo&&E(Jr)),t!==de?(r=Cu(),r!==de?(125===u.charCodeAt(Vo)?(n=Zr,Vo++):(n=de,0===Zo&&E(Kr)),n!==de?(Yo=e,t=Qr(r),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),Zo--,e===de&&(t=de,0===Zo&&E(Wr)),e}function Cu(){var e,t,r,n,o,s;if(e=Vo,t=[],r=[],n=Vo,o=Vo,Zo++,un.test(u.charAt(Vo))?(s=u.charAt(Vo),Vo++):(s=de,0===Zo&&E(en)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),n!==de)for(;n!==de;)r.push(n),n=Vo,o=Vo,Zo++,un.test(u.charAt(Vo))?(s=u.charAt(Vo),Vo++):(s=de,0===Zo&&E(en)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);else r=de;for(r===de&&(r=Vo,123===u.charCodeAt(Vo)?(n=Xr,Vo++):(n=de,0===Zo&&E(Jr)),n!==de?(o=Cu(),o!==de?(125===u.charCodeAt(Vo)?(s=Zr,Vo++):(s=de,0===Zo&&E(Kr)),s!==de?(n=[n,o,s],r=n):(Vo=r,r=de)):(Vo=r,r=de)):(Vo=r,r=de));r!==de;){if(t.push(r),r=[],n=Vo,o=Vo,Zo++,un.test(u.charAt(Vo))?(s=u.charAt(Vo),Vo++):(s=de,0===Zo&&E(en)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),n!==de)for(;n!==de;)r.push(n),n=Vo,o=Vo,Zo++,un.test(u.charAt(Vo))?(s=u.charAt(Vo),Vo++):(s=de,0===Zo&&E(en)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);else r=de;r===de&&(r=Vo,123===u.charCodeAt(Vo)?(n=Xr,Vo++):(n=de,0===Zo&&E(Jr)),n!==de?(o=Cu(),o!==de?(125===u.charCodeAt(Vo)?(s=Zr,Vo++):(s=de,0===Zo&&E(Kr)),s!==de?(n=[n,o,s],r=n):(Vo=r,r=de)):(Vo=r,r=de)):(Vo=r,r=de))}return e=t!==de?u.substring(e,Vo):t}function fu(){var e;return tn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(rn)),e}function Fu(){var e;return nn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(on)),e}function du(){var e;return sn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(an)),e}function hu(){var e;return cn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(pn)),e}function gu(){var e;return An.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(ln)),e}function Du(){var e;return En.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(Cn)),e}function Bu(){var e;return fn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(Fn)),e}function vu(){var e;return dn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(hn)),e}function mu(){var e;return gn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(Dn)),e}function bu(){var e;return Bn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(vn)),e}function xu(){var e;return mn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(bn)),e}function Pu(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===xn?(t=xn,Vo+=5):(t=de,0===Zo&&E(Pn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function _u(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===_n?(t=_n,Vo+=4):(t=de,0===Zo&&E(yn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function yu(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===$n?(t=$n,Vo+=5):(t=de,0===Zo&&E(Rn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function $u(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===kn?(t=kn,Vo+=5):(t=de,0===Zo&&E(Sn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Ru(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===In?(t=In,Vo+=5):(t=de,0===Zo&&E(On)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ku(){var e,t,r,n;return e=Vo,u.substr(Vo,8)===jn?(t=jn,Vo+=8):(t=de,0===Zo&&E(Ln)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Su(){var e,t,r,n;return e=Vo,u.substr(Vo,8)===wn?(t=wn,Vo+=8):(t=de,0===Zo&&E(Tn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Iu(){var e,t,r,n;return e=Vo,u.substr(Vo,7)===Nn?(t=Nn,Vo+=7):(t=de,0===Zo&&E(Un)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Ou(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===Hn?(t=Hn,Vo+=6):(t=de,0===Zo&&E(qn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ju(){var e,t,r,n;return e=Vo,u.substr(Vo,2)===zn?(t=zn,Vo+=2):(t=de,0===Zo&&E(Mn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Lu(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===Gn?(t=Gn,Vo+=4):(t=de,0===Zo&&E(Vn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function wu(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===Yn?(t=Yn,Vo+=4):(t=de,0===Zo&&E(Wn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Tu(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===Xn?(t=Xn,Vo+=6):(t=de,0===Zo&&E(Jn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Nu(){var e,t,r,n;return e=Vo,u.substr(Vo,7)===Zn?(t=Zn,Vo+=7):(t=de,0===Zo&&E(Kn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Uu(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===Qn?(t=Qn,Vo+=5):(t=de,0===Zo&&E(uo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Hu(){var e,t,r,n;return e=Vo,u.substr(Vo,7)===eo?(t=eo,Vo+=7):(t=de,0===Zo&&E(to)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function qu(){var e,t,r,n;return e=Vo,u.substr(Vo,3)===ro?(t=ro,Vo+=3):(t=de,0===Zo&&E(no)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function zu(){var e,t,r,n;return e=Vo,u.substr(Vo,8)===oo?(t=oo,Vo+=8):(t=de,0===Zo&&E(so)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Mu(){var e,t,r,n;return e=Vo,u.substr(Vo,2)===io?(t=io,Vo+=2):(t=de,0===Zo&&E(ao)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Gu(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===co?(t=co,Vo+=6):(t=de,0===Zo&&E(po)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Vu(){var e,t,r,n;return e=Vo,u.substr(Vo,10)===Ao?(t=Ao,Vo+=10):(t=de,0===Zo&&E(lo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Yu(){var e,t,r,n;return e=Vo,u.substr(Vo,2)===Eo?(t=Eo,Vo+=2):(t=de,0===Zo&&E(Co)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Wu(){var e,t,r,n;return e=Vo,u.substr(Vo,3)===fo?(t=fo,Vo+=3):(t=de,0===Zo&&E(Fo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Xu(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===ho?(t=ho,Vo+=4):(t=de,0===Zo&&E(go)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Ju(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===Do?(t=Do,Vo+=6):(t=de,0===Zo&&E(Bo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Zu(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===vo?(t=vo,Vo+=5):(t=de,0===Zo&&E(mo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Ku(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===bo?(t=bo,Vo+=6):(t=de,0===Zo&&E(xo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Qu(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===Po?(t=Po,Vo+=4):(t=de,0===Zo&&E(_o)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ue(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===yo?(t=yo,Vo+=5):(t=de,0===Zo&&E($o)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ee(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===Ro?(t=Ro,Vo+=4):(t=de,0===Zo&&E(ko)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function te(){var e,t,r,n;return e=Vo,u.substr(Vo,3)===So?(t=So,Vo+=3):(t=de,0===Zo&&E(Io)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function re(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===Oo?(t=Oo,Vo+=6):(t=de,0===Zo&&E(jo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ne(){var e,t,r,n;return e=Vo,u.substr(Vo,3)===Lo?(t=Lo,Vo+=3):(t=de,0===Zo&&E(wo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function oe(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===To?(t=To,Vo+=4):(t=de,0===Zo&&E(No)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function se(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===Uo?(t=Uo, +Vo+=5):(t=de,0===Zo&&E(Ho)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ie(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===qo?(t=qo,Vo+=4):(t=de,0===Zo&&E(zo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ae(){var u,e;for(u=[],e=S(),e===de&&(e=O(),e===de&&(e=j()));e!==de;)u.push(e),e=S(),e===de&&(e=O(),e===de&&(e=j()));return u}function ce(){var u,e;for(u=[],e=S(),e===de&&(e=w());e!==de;)u.push(e),e=S(),e===de&&(e=w());return u}function pe(){var e,t,r,n;return e=Vo,t=ae(),t!==de?(59===u.charCodeAt(Vo)?(r=Mo,Vo++):(r=de,0===Zo&&E(Go)),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,t=ce(),t!==de?(r=T(),r===de&&(r=null),r!==de?(n=O(),n!==de?(t=[t,r,n],e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,t=ae(),t!==de?(r=Ae(),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de))),e}function Ae(){var e,t;return e=Vo,Zo++,u.length>Vo?(t=u.charAt(Vo),Vo++):(t=de,0===Zo&&E(ut)),Zo--,t===de?e=void 0:(Vo=e,e=de),e}function le(u){var e,t=[];for(e=0;e0?{type:"choice",alternatives:fe(u,e,3),location:r()}:u},ye=function(u,e){return null!==e?{type:"action",expression:u,code:e[1],location:r()}:u},$e=function(u,e){return e.length>0?{type:"sequence",elements:fe(u,e,1),location:r()}:u},Re=":",ke=s(":",!1),Se=function(u,e){return{type:"labeled",label:u,expression:e,location:r()}},Ie=function(u,e){return{type:Ko[u],expression:e,location:r()}},Oe="$",je=s("$",!1),Le="&",we=s("&",!1),Te="!",Ne=s("!",!1),Ue=function(u,e){return{type:Qo[e],expression:u,location:r()}},He="?",qe=s("?",!1),ze="*",Me=s("*",!1),Ge="+",Ve=s("+",!1),Ye="(",We=s("(",!1),Xe=")",Je=s(")",!1),Ze=function(u){return"labeled"===u.type||"sequence"===u.type?{type:"group",expression:u}:u},Ke=function(u){return{type:"rule_ref",name:u,location:r()}},Qe=function(u,e){return{type:us[u],code:e,location:r()}},ut=a(),et=p("whitespace"),tt="\t",rt=s("\t",!1),nt="\v",ot=s("\v",!1),st="\f",it=s("\f",!1),at=" ",ct=s(" ",!1),pt=" ",At=s(" ",!1),lt="\ufeff",Et=s("\ufeff",!1),Ct=/^[\n\r\u2028\u2029]/,ft=i(["\n","\r","\u2028","\u2029"],!1,!1),Ft=p("end of line"),dt="\n",ht=s("\n",!1),gt="\r\n",Dt=s("\r\n",!1),Bt="\r",vt=s("\r",!1),mt="\u2028",bt=s("\u2028",!1),xt="\u2029",Pt=s("\u2029",!1),_t=p("comment"),yt="/*",$t=s("/*",!1),Rt="*/",kt=s("*/",!1),St="//",It=s("//",!1),Ot=function(u){return u},jt=p("identifier"),Lt=function(u,e){return u+e.join("")},wt="_",Tt=s("_",!1),Nt="\\",Ut=s("\\",!1),Ht=function(u){return u},qt="‌",zt=s("‌",!1),Mt="‍",Gt=s("‍",!1),Vt=p("literal"),Yt="i",Wt=s("i",!1),Xt=function(u,e){return{type:"literal",value:u,ignoreCase:null!==e,location:r()}},Jt=p("string"),Zt='"',Kt=s('"',!1),Qt=function(u){return u.join("")},ur="'",er=s("'",!1),tr=function(){return t()},rr=p("character class"),nr="[",or=s("[",!1),sr="^",ir=s("^",!1),ar="]",cr=s("]",!1),pr=function(u,e,t){return{type:"class",parts:le(e),inverted:null!==u,ignoreCase:null!==t,location:r()}},Ar="-",lr=s("-",!1),Er=function(u,e){return u.charCodeAt(0)>e.charCodeAt(0)&&o("Invalid character range: "+t()+"."),[u,e]},Cr=function(){return""},fr="0",Fr=s("0",!1),dr=function(){return"\0"},hr="b",gr=s("b",!1),Dr=function(){return"\b"},Br="f",vr=s("f",!1),mr=function(){return"\f"},br="n",xr=s("n",!1),Pr=function(){return"\n"},_r="r",yr=s("r",!1),$r=function(){return"\r"},Rr="t",kr=s("t",!1),Sr=function(){return"\t"},Ir="v",Or=s("v",!1),jr=function(){return"\v"},Lr="x",wr=s("x",!1),Tr="u",Nr=s("u",!1),Ur=function(u){return String.fromCharCode(parseInt(u,16))},Hr=/^[0-9]/,qr=i([["0","9"]],!1,!1),zr=/^[0-9a-f]/i,Mr=i([["0","9"],["a","f"]],!1,!0),Gr=".",Vr=s(".",!1),Yr=function(){return{type:"any",location:r()}},Wr=p("code block"),Xr="{",Jr=s("{",!1),Zr="}",Kr=s("}",!1),Qr=function(u){return u},un=/^[{}]/,en=i(["{","}"],!1,!1),tn=/^[a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A]/,rn=i([["a","z"],"µ",["ß","ö"],["ø","ÿ"],"ā","ă","ą","ć","ĉ","ċ","č","ď","đ","ē","ĕ","ė","ę","ě","ĝ","ğ","ġ","ģ","ĥ","ħ","ĩ","ī","ĭ","į","ı","ij","ĵ",["ķ","ĸ"],"ĺ","ļ","ľ","ŀ","ł","ń","ņ",["ň","ʼn"],"ŋ","ō","ŏ","ő","œ","ŕ","ŗ","ř","ś","ŝ","ş","š","ţ","ť","ŧ","ũ","ū","ŭ","ů","ű","ų","ŵ","ŷ","ź","ż",["ž","ƀ"],"ƃ","ƅ","ƈ",["ƌ","ƍ"],"ƒ","ƕ",["ƙ","ƛ"],"ƞ","ơ","ƣ","ƥ","ƨ",["ƪ","ƫ"],"ƭ","ư","ƴ","ƶ",["ƹ","ƺ"],["ƽ","ƿ"],"dž","lj","nj","ǎ","ǐ","ǒ","ǔ","ǖ","ǘ","ǚ",["ǜ","ǝ"],"ǟ","ǡ","ǣ","ǥ","ǧ","ǩ","ǫ","ǭ",["ǯ","ǰ"],"dz","ǵ","ǹ","ǻ","ǽ","ǿ","ȁ","ȃ","ȅ","ȇ","ȉ","ȋ","ȍ","ȏ","ȑ","ȓ","ȕ","ȗ","ș","ț","ȝ","ȟ","ȡ","ȣ","ȥ","ȧ","ȩ","ȫ","ȭ","ȯ","ȱ",["ȳ","ȹ"],"ȼ",["ȿ","ɀ"],"ɂ","ɇ","ɉ","ɋ","ɍ",["ɏ","ʓ"],["ʕ","ʯ"],"ͱ","ͳ","ͷ",["ͻ","ͽ"],"ΐ",["ά","ώ"],["ϐ","ϑ"],["ϕ","ϗ"],"ϙ","ϛ","ϝ","ϟ","ϡ","ϣ","ϥ","ϧ","ϩ","ϫ","ϭ",["ϯ","ϳ"],"ϵ","ϸ",["ϻ","ϼ"],["а","џ"],"ѡ","ѣ","ѥ","ѧ","ѩ","ѫ","ѭ","ѯ","ѱ","ѳ","ѵ","ѷ","ѹ","ѻ","ѽ","ѿ","ҁ","ҋ","ҍ","ҏ","ґ","ғ","ҕ","җ","ҙ","қ","ҝ","ҟ","ҡ","ң","ҥ","ҧ","ҩ","ҫ","ҭ","ү","ұ","ҳ","ҵ","ҷ","ҹ","һ","ҽ","ҿ","ӂ","ӄ","ӆ","ӈ","ӊ","ӌ",["ӎ","ӏ"],"ӑ","ӓ","ӕ","ӗ","ә","ӛ","ӝ","ӟ","ӡ","ӣ","ӥ","ӧ","ө","ӫ","ӭ","ӯ","ӱ","ӳ","ӵ","ӷ","ӹ","ӻ","ӽ","ӿ","ԁ","ԃ","ԅ","ԇ","ԉ","ԋ","ԍ","ԏ","ԑ","ԓ","ԕ","ԗ","ԙ","ԛ","ԝ","ԟ","ԡ","ԣ","ԥ","ԧ","ԩ","ԫ","ԭ","ԯ",["ա","և"],["ᏸ","ᏽ"],["ᴀ","ᴫ"],["ᵫ","ᵷ"],["ᵹ","ᶚ"],"ḁ","ḃ","ḅ","ḇ","ḉ","ḋ","ḍ","ḏ","ḑ","ḓ","ḕ","ḗ","ḙ","ḛ","ḝ","ḟ","ḡ","ḣ","ḥ","ḧ","ḩ","ḫ","ḭ","ḯ","ḱ","ḳ","ḵ","ḷ","ḹ","ḻ","ḽ","ḿ","ṁ","ṃ","ṅ","ṇ","ṉ","ṋ","ṍ","ṏ","ṑ","ṓ","ṕ","ṗ","ṙ","ṛ","ṝ","ṟ","ṡ","ṣ","ṥ","ṧ","ṩ","ṫ","ṭ","ṯ","ṱ","ṳ","ṵ","ṷ","ṹ","ṻ","ṽ","ṿ","ẁ","ẃ","ẅ","ẇ","ẉ","ẋ","ẍ","ẏ","ẑ","ẓ",["ẕ","ẝ"],"ẟ","ạ","ả","ấ","ầ","ẩ","ẫ","ậ","ắ","ằ","ẳ","ẵ","ặ","ẹ","ẻ","ẽ","ế","ề","ể","ễ","ệ","ỉ","ị","ọ","ỏ","ố","ồ","ổ","ỗ","ộ","ớ","ờ","ở","ỡ","ợ","ụ","ủ","ứ","ừ","ử","ữ","ự","ỳ","ỵ","ỷ","ỹ","ỻ","ỽ",["ỿ","ἇ"],["ἐ","ἕ"],["ἠ","ἧ"],["ἰ","ἷ"],["ὀ","ὅ"],["ὐ","ὗ"],["ὠ","ὧ"],["ὰ","ώ"],["ᾀ","ᾇ"],["ᾐ","ᾗ"],["ᾠ","ᾧ"],["ᾰ","ᾴ"],["ᾶ","ᾷ"],"ι",["ῂ","ῄ"],["ῆ","ῇ"],["ῐ","ΐ"],["ῖ","ῗ"],["ῠ","ῧ"],["ῲ","ῴ"],["ῶ","ῷ"],"ℊ",["ℎ","ℏ"],"ℓ","ℯ","ℴ","ℹ",["ℼ","ℽ"],["ⅆ","ⅉ"],"ⅎ","ↄ",["ⰰ","ⱞ"],"ⱡ",["ⱥ","ⱦ"],"ⱨ","ⱪ","ⱬ","ⱱ",["ⱳ","ⱴ"],["ⱶ","ⱻ"],"ⲁ","ⲃ","ⲅ","ⲇ","ⲉ","ⲋ","ⲍ","ⲏ","ⲑ","ⲓ","ⲕ","ⲗ","ⲙ","ⲛ","ⲝ","ⲟ","ⲡ","ⲣ","ⲥ","ⲧ","ⲩ","ⲫ","ⲭ","ⲯ","ⲱ","ⲳ","ⲵ","ⲷ","ⲹ","ⲻ","ⲽ","ⲿ","ⳁ","ⳃ","ⳅ","ⳇ","ⳉ","ⳋ","ⳍ","ⳏ","ⳑ","ⳓ","ⳕ","ⳗ","ⳙ","ⳛ","ⳝ","ⳟ","ⳡ",["ⳣ","ⳤ"],"ⳬ","ⳮ","ⳳ",["ⴀ","ⴥ"],"ⴧ","ⴭ","ꙁ","ꙃ","ꙅ","ꙇ","ꙉ","ꙋ","ꙍ","ꙏ","ꙑ","ꙓ","ꙕ","ꙗ","ꙙ","ꙛ","ꙝ","ꙟ","ꙡ","ꙣ","ꙥ","ꙧ","ꙩ","ꙫ","ꙭ","ꚁ","ꚃ","ꚅ","ꚇ","ꚉ","ꚋ","ꚍ","ꚏ","ꚑ","ꚓ","ꚕ","ꚗ","ꚙ","ꚛ","ꜣ","ꜥ","ꜧ","ꜩ","ꜫ","ꜭ",["ꜯ","ꜱ"],"ꜳ","ꜵ","ꜷ","ꜹ","ꜻ","ꜽ","ꜿ","ꝁ","ꝃ","ꝅ","ꝇ","ꝉ","ꝋ","ꝍ","ꝏ","ꝑ","ꝓ","ꝕ","ꝗ","ꝙ","ꝛ","ꝝ","ꝟ","ꝡ","ꝣ","ꝥ","ꝧ","ꝩ","ꝫ","ꝭ","ꝯ",["ꝱ","ꝸ"],"ꝺ","ꝼ","ꝿ","ꞁ","ꞃ","ꞅ","ꞇ","ꞌ","ꞎ","ꞑ",["ꞓ","ꞕ"],"ꞗ","ꞙ","ꞛ","ꞝ","ꞟ","ꞡ","ꞣ","ꞥ","ꞧ","ꞩ","ꞵ","ꞷ","ꟺ",["ꬰ","ꭚ"],["ꭠ","ꭥ"],["ꭰ","ꮿ"],["ff","st"],["ﬓ","ﬗ"],["a","z"]],!1,!1),nn=/^[\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C-\uA69D\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3-\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E-\uFF9F]/,on=i([["ʰ","ˁ"],["ˆ","ˑ"],["ˠ","ˤ"],"ˬ","ˮ","ʹ","ͺ","ՙ","ـ",["ۥ","ۦ"],["ߴ","ߵ"],"ߺ","ࠚ","ࠤ","ࠨ","ॱ","ๆ","ໆ","ჼ","ៗ","ᡃ","ᪧ",["ᱸ","ᱽ"],["ᴬ","ᵪ"],"ᵸ",["ᶛ","ᶿ"],"ⁱ","ⁿ",["ₐ","ₜ"],["ⱼ","ⱽ"],"ⵯ","ⸯ","々",["〱","〵"],"〻",["ゝ","ゞ"],["ー","ヾ"],"ꀕ",["ꓸ","ꓽ"],"ꘌ","ꙿ",["ꚜ","ꚝ"],["ꜗ","ꜟ"],"ꝰ","ꞈ",["ꟸ","ꟹ"],"ꧏ","ꧦ","ꩰ","ꫝ",["ꫳ","ꫴ"],["ꭜ","ꭟ"],"ー",["゙","゚"]],!1,!1),sn=/^[\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,an=i(["ª","º","ƻ",["ǀ","ǃ"],"ʔ",["א","ת"],["װ","ײ"],["ؠ","ؿ"],["ف","ي"],["ٮ","ٯ"],["ٱ","ۓ"],"ە",["ۮ","ۯ"],["ۺ","ۼ"],"ۿ","ܐ",["ܒ","ܯ"],["ݍ","ޥ"],"ޱ",["ߊ","ߪ"],["ࠀ","ࠕ"],["ࡀ","ࡘ"],["ࢠ","ࢴ"],["ऄ","ह"],"ऽ","ॐ",["क़","ॡ"],["ॲ","ঀ"],["অ","ঌ"],["এ","ঐ"],["ও","ন"],["প","র"],"ল",["শ","হ"],"ঽ","ৎ",["ড়","ঢ়"],["য়","ৡ"],["ৰ","ৱ"],["ਅ","ਊ"],["ਏ","ਐ"],["ਓ","ਨ"],["ਪ","ਰ"],["ਲ","ਲ਼"],["ਵ","ਸ਼"],["ਸ","ਹ"],["ਖ਼","ੜ"],"ਫ਼",["ੲ","ੴ"],["અ","ઍ"],["એ","ઑ"],["ઓ","ન"],["પ","ર"],["લ","ળ"],["વ","હ"],"ઽ","ૐ",["ૠ","ૡ"],"ૹ",["ଅ","ଌ"],["ଏ","ଐ"],["ଓ","ନ"],["ପ","ର"],["ଲ","ଳ"],["ଵ","ହ"],"ଽ",["ଡ଼","ଢ଼"],["ୟ","ୡ"],"ୱ","ஃ",["அ","ஊ"],["எ","ஐ"],["ஒ","க"],["ங","ச"],"ஜ",["ஞ","ட"],["ண","த"],["ந","ப"],["ம","ஹ"],"ௐ",["అ","ఌ"],["ఎ","ఐ"],["ఒ","న"],["ప","హ"],"ఽ",["ౘ","ౚ"],["ౠ","ౡ"],["ಅ","ಌ"],["ಎ","ಐ"],["ಒ","ನ"],["ಪ","ಳ"],["ವ","ಹ"],"ಽ","ೞ",["ೠ","ೡ"],["ೱ","ೲ"],["അ","ഌ"],["എ","ഐ"],["ഒ","ഺ"],"ഽ","ൎ",["ൟ","ൡ"],["ൺ","ൿ"],["අ","ඖ"],["ක","න"],["ඳ","ර"],"ල",["ව","ෆ"],["ก","ะ"],["า","ำ"],["เ","ๅ"],["ກ","ຂ"],"ຄ",["ງ","ຈ"],"ຊ","ຍ",["ດ","ທ"],["ນ","ຟ"],["ມ","ຣ"],"ລ","ວ",["ສ","ຫ"],["ອ","ະ"],["າ","ຳ"],"ຽ",["ເ","ໄ"],["ໜ","ໟ"],"ༀ",["ཀ","ཇ"],["ཉ","ཬ"],["ྈ","ྌ"],["က","ဪ"],"ဿ",["ၐ","ၕ"],["ၚ","ၝ"],"ၡ",["ၥ","ၦ"],["ၮ","ၰ"],["ၵ","ႁ"],"ႎ",["ა","ჺ"],["ჽ","ቈ"],["ቊ","ቍ"],["ቐ","ቖ"],"ቘ",["ቚ","ቝ"],["በ","ኈ"],["ኊ","ኍ"],["ነ","ኰ"],["ኲ","ኵ"],["ኸ","ኾ"],"ዀ",["ዂ","ዅ"],["ወ","ዖ"],["ዘ","ጐ"],["ጒ","ጕ"],["ጘ","ፚ"],["ᎀ","ᎏ"],["ᐁ","ᙬ"],["ᙯ","ᙿ"],["ᚁ","ᚚ"],["ᚠ","ᛪ"],["ᛱ","ᛸ"],["ᜀ","ᜌ"],["ᜎ","ᜑ"],["ᜠ","ᜱ"],["ᝀ","ᝑ"],["ᝠ","ᝬ"],["ᝮ","ᝰ"],["ក","ឳ"],"ៜ",["ᠠ","ᡂ"],["ᡄ","ᡷ"],["ᢀ","ᢨ"],"ᢪ",["ᢰ","ᣵ"],["ᤀ","ᤞ"],["ᥐ","ᥭ"],["ᥰ","ᥴ"],["ᦀ","ᦫ"],["ᦰ","ᧉ"],["ᨀ","ᨖ"],["ᨠ","ᩔ"],["ᬅ","ᬳ"],["ᭅ","ᭋ"],["ᮃ","ᮠ"],["ᮮ","ᮯ"],["ᮺ","ᯥ"],["ᰀ","ᰣ"],["ᱍ","ᱏ"],["ᱚ","ᱷ"],["ᳩ","ᳬ"],["ᳮ","ᳱ"],["ᳵ","ᳶ"],["ℵ","ℸ"],["ⴰ","ⵧ"],["ⶀ","ⶖ"],["ⶠ","ⶦ"],["ⶨ","ⶮ"],["ⶰ","ⶶ"],["ⶸ","ⶾ"],["ⷀ","ⷆ"],["ⷈ","ⷎ"],["ⷐ","ⷖ"],["ⷘ","ⷞ"],"〆","〼",["ぁ","ゖ"],"ゟ",["ァ","ヺ"],"ヿ",["ㄅ","ㄭ"],["ㄱ","ㆎ"],["ㆠ","ㆺ"],["ㇰ","ㇿ"],["㐀","䶵"],["一","鿕"],["ꀀ","ꀔ"],["ꀖ","ꒌ"],["ꓐ","ꓷ"],["ꔀ","ꘋ"],["ꘐ","ꘟ"],["ꘪ","ꘫ"],"ꙮ",["ꚠ","ꛥ"],"ꞏ","ꟷ",["ꟻ","ꠁ"],["ꠃ","ꠅ"],["ꠇ","ꠊ"],["ꠌ","ꠢ"],["ꡀ","ꡳ"],["ꢂ","ꢳ"],["ꣲ","ꣷ"],"ꣻ","ꣽ",["ꤊ","ꤥ"],["ꤰ","ꥆ"],["ꥠ","ꥼ"],["ꦄ","ꦲ"],["ꧠ","ꧤ"],["ꧧ","ꧯ"],["ꧺ","ꧾ"],["ꨀ","ꨨ"],["ꩀ","ꩂ"],["ꩄ","ꩋ"],["ꩠ","ꩯ"],["ꩱ","ꩶ"],"ꩺ",["ꩾ","ꪯ"],"ꪱ",["ꪵ","ꪶ"],["ꪹ","ꪽ"],"ꫀ","ꫂ",["ꫛ","ꫜ"],["ꫠ","ꫪ"],"ꫲ",["ꬁ","ꬆ"],["ꬉ","ꬎ"],["ꬑ","ꬖ"],["ꬠ","ꬦ"],["ꬨ","ꬮ"],["ꯀ","ꯢ"],["가","힣"],["ힰ","ퟆ"],["ퟋ","ퟻ"],["豈","舘"],["並","龎"],"יִ",["ײַ","ﬨ"],["שׁ","זּ"],["טּ","לּ"],"מּ",["נּ","סּ"],["ףּ","פּ"],["צּ","ﮱ"],["ﯓ","ﴽ"],["ﵐ","ﶏ"],["ﶒ","ﷇ"],["ﷰ","ﷻ"],["ﹰ","ﹴ"],["ﹶ","ﻼ"],["ヲ","ッ"],["ア","ン"],["ᅠ","ᄒ"],["ᅡ","ᅦ"],["ᅧ","ᅬ"],["ᅭ","ᅲ"],["ᅳ","ᅵ"]],!1,!1),cn=/^[\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]/,pn=i(["Dž","Lj","Nj","Dz",["ᾈ","ᾏ"],["ᾘ","ᾟ"],["ᾨ","ᾯ"],"ᾼ","ῌ","ῼ"],!1,!1),An=/^[A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AD\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A]/,ln=i([["A","Z"],["À","Ö"],["Ø","Þ"],"Ā","Ă","Ą","Ć","Ĉ","Ċ","Č","Ď","Đ","Ē","Ĕ","Ė","Ę","Ě","Ĝ","Ğ","Ġ","Ģ","Ĥ","Ħ","Ĩ","Ī","Ĭ","Į","İ","IJ","Ĵ","Ķ","Ĺ","Ļ","Ľ","Ŀ","Ł","Ń","Ņ","Ň","Ŋ","Ō","Ŏ","Ő","Œ","Ŕ","Ŗ","Ř","Ś","Ŝ","Ş","Š","Ţ","Ť","Ŧ","Ũ","Ū","Ŭ","Ů","Ű","Ų","Ŵ","Ŷ",["Ÿ","Ź"],"Ż","Ž",["Ɓ","Ƃ"],"Ƅ",["Ɔ","Ƈ"],["Ɖ","Ƌ"],["Ǝ","Ƒ"],["Ɠ","Ɣ"],["Ɩ","Ƙ"],["Ɯ","Ɲ"],["Ɵ","Ơ"],"Ƣ","Ƥ",["Ʀ","Ƨ"],"Ʃ","Ƭ",["Ʈ","Ư"],["Ʊ","Ƴ"],"Ƶ",["Ʒ","Ƹ"],"Ƽ","DŽ","LJ","NJ","Ǎ","Ǐ","Ǒ","Ǔ","Ǖ","Ǘ","Ǚ","Ǜ","Ǟ","Ǡ","Ǣ","Ǥ","Ǧ","Ǩ","Ǫ","Ǭ","Ǯ","DZ","Ǵ",["Ƕ","Ǹ"],"Ǻ","Ǽ","Ǿ","Ȁ","Ȃ","Ȅ","Ȇ","Ȉ","Ȋ","Ȍ","Ȏ","Ȑ","Ȓ","Ȕ","Ȗ","Ș","Ț","Ȝ","Ȟ","Ƞ","Ȣ","Ȥ","Ȧ","Ȩ","Ȫ","Ȭ","Ȯ","Ȱ","Ȳ",["Ⱥ","Ȼ"],["Ƚ","Ⱦ"],"Ɂ",["Ƀ","Ɇ"],"Ɉ","Ɋ","Ɍ","Ɏ","Ͱ","Ͳ","Ͷ","Ϳ","Ά",["Έ","Ί"],"Ό",["Ύ","Ώ"],["Α","Ρ"],["Σ","Ϋ"],"Ϗ",["ϒ","ϔ"],"Ϙ","Ϛ","Ϝ","Ϟ","Ϡ","Ϣ","Ϥ","Ϧ","Ϩ","Ϫ","Ϭ","Ϯ","ϴ","Ϸ",["Ϲ","Ϻ"],["Ͻ","Я"],"Ѡ","Ѣ","Ѥ","Ѧ","Ѩ","Ѫ","Ѭ","Ѯ","Ѱ","Ѳ","Ѵ","Ѷ","Ѹ","Ѻ","Ѽ","Ѿ","Ҁ","Ҋ","Ҍ","Ҏ","Ґ","Ғ","Ҕ","Җ","Ҙ","Қ","Ҝ","Ҟ","Ҡ","Ң","Ҥ","Ҧ","Ҩ","Ҫ","Ҭ","Ү","Ұ","Ҳ","Ҵ","Ҷ","Ҹ","Һ","Ҽ","Ҿ",["Ӏ","Ӂ"],"Ӄ","Ӆ","Ӈ","Ӊ","Ӌ","Ӎ","Ӑ","Ӓ","Ӕ","Ӗ","Ә","Ӛ","Ӝ","Ӟ","Ӡ","Ӣ","Ӥ","Ӧ","Ө","Ӫ","Ӭ","Ӯ","Ӱ","Ӳ","Ӵ","Ӷ","Ӹ","Ӻ","Ӽ","Ӿ","Ԁ","Ԃ","Ԅ","Ԇ","Ԉ","Ԋ","Ԍ","Ԏ","Ԑ","Ԓ","Ԕ","Ԗ","Ԙ","Ԛ","Ԝ","Ԟ","Ԡ","Ԣ","Ԥ","Ԧ","Ԩ","Ԫ","Ԭ","Ԯ",["Ա","Ֆ"],["Ⴀ","Ⴥ"],"Ⴧ","Ⴭ",["Ꭰ","Ᏽ"],"Ḁ","Ḃ","Ḅ","Ḇ","Ḉ","Ḋ","Ḍ","Ḏ","Ḑ","Ḓ","Ḕ","Ḗ","Ḙ","Ḛ","Ḝ","Ḟ","Ḡ","Ḣ","Ḥ","Ḧ","Ḩ","Ḫ","Ḭ","Ḯ","Ḱ","Ḳ","Ḵ","Ḷ","Ḹ","Ḻ","Ḽ","Ḿ","Ṁ","Ṃ","Ṅ","Ṇ","Ṉ","Ṋ","Ṍ","Ṏ","Ṑ","Ṓ","Ṕ","Ṗ","Ṙ","Ṛ","Ṝ","Ṟ","Ṡ","Ṣ","Ṥ","Ṧ","Ṩ","Ṫ","Ṭ","Ṯ","Ṱ","Ṳ","Ṵ","Ṷ","Ṹ","Ṻ","Ṽ","Ṿ","Ẁ","Ẃ","Ẅ","Ẇ","Ẉ","Ẋ","Ẍ","Ẏ","Ẑ","Ẓ","Ẕ","ẞ","Ạ","Ả","Ấ","Ầ","Ẩ","Ẫ","Ậ","Ắ","Ằ","Ẳ","Ẵ","Ặ","Ẹ","Ẻ","Ẽ","Ế","Ề","Ể","Ễ","Ệ","Ỉ","Ị","Ọ","Ỏ","Ố","Ồ","Ổ","Ỗ","Ộ","Ớ","Ờ","Ở","Ỡ","Ợ","Ụ","Ủ","Ứ","Ừ","Ử","Ữ","Ự","Ỳ","Ỵ","Ỷ","Ỹ","Ỻ","Ỽ","Ỿ",["Ἀ","Ἇ"],["Ἐ","Ἕ"],["Ἠ","Ἧ"],["Ἰ","Ἷ"],["Ὀ","Ὅ"],"Ὑ","Ὓ","Ὕ","Ὗ",["Ὠ","Ὧ"],["Ᾰ","Ά"],["Ὲ","Ή"],["Ῐ","Ί"],["Ῠ","Ῥ"],["Ὸ","Ώ"],"ℂ","ℇ",["ℋ","ℍ"],["ℐ","ℒ"],"ℕ",["ℙ","ℝ"],"ℤ","Ω","ℨ",["K","ℭ"],["ℰ","ℳ"],["ℾ","ℿ"],"ⅅ","Ↄ",["Ⰰ","Ⱞ"],"Ⱡ",["Ɫ","Ɽ"],"Ⱨ","Ⱪ","Ⱬ",["Ɑ","Ɒ"],"Ⱳ","Ⱶ",["Ȿ","Ⲁ"],"Ⲃ","Ⲅ","Ⲇ","Ⲉ","Ⲋ","Ⲍ","Ⲏ","Ⲑ","Ⲓ","Ⲕ","Ⲗ","Ⲙ","Ⲛ","Ⲝ","Ⲟ","Ⲡ","Ⲣ","Ⲥ","Ⲧ","Ⲩ","Ⲫ","Ⲭ","Ⲯ","Ⲱ","Ⲳ","Ⲵ","Ⲷ","Ⲹ","Ⲻ","Ⲽ","Ⲿ","Ⳁ","Ⳃ","Ⳅ","Ⳇ","Ⳉ","Ⳋ","Ⳍ","Ⳏ","Ⳑ","Ⳓ","Ⳕ","Ⳗ","Ⳙ","Ⳛ","Ⳝ","Ⳟ","Ⳡ","Ⳣ","Ⳬ","Ⳮ","Ⳳ","Ꙁ","Ꙃ","Ꙅ","Ꙇ","Ꙉ","Ꙋ","Ꙍ","Ꙏ","Ꙑ","Ꙓ","Ꙕ","Ꙗ","Ꙙ","Ꙛ","Ꙝ","Ꙟ","Ꙡ","Ꙣ","Ꙥ","Ꙧ","Ꙩ","Ꙫ","Ꙭ","Ꚁ","Ꚃ","Ꚅ","Ꚇ","Ꚉ","Ꚋ","Ꚍ","Ꚏ","Ꚑ","Ꚓ","Ꚕ","Ꚗ","Ꚙ","Ꚛ","Ꜣ","Ꜥ","Ꜧ","Ꜩ","Ꜫ","Ꜭ","Ꜯ","Ꜳ","Ꜵ","Ꜷ","Ꜹ","Ꜻ","Ꜽ","Ꜿ","Ꝁ","Ꝃ","Ꝅ","Ꝇ","Ꝉ","Ꝋ","Ꝍ","Ꝏ","Ꝑ","Ꝓ","Ꝕ","Ꝗ","Ꝙ","Ꝛ","Ꝝ","Ꝟ","Ꝡ","Ꝣ","Ꝥ","Ꝧ","Ꝩ","Ꝫ","Ꝭ","Ꝯ","Ꝺ","Ꝼ",["Ᵹ","Ꝿ"],"Ꞁ","Ꞃ","Ꞅ","Ꞇ","Ꞌ","Ɥ","Ꞑ","Ꞓ","Ꞗ","Ꞙ","Ꞛ","Ꞝ","Ꞟ","Ꞡ","Ꞣ","Ꞥ","Ꞧ","Ꞩ",["Ɦ","Ɬ"],["Ʞ","Ꞵ"],"Ꞷ",["A","Z"]],!1,!1),En=/^[\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E-\u094F\u0982-\u0983\u09BE-\u09C0\u09C7-\u09C8\u09CB-\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB-\u0ACC\u0B02-\u0B03\u0B3E\u0B40\u0B47-\u0B48\u0B4B-\u0B4C\u0B57\u0BBE-\u0BBF\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82-\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CD5-\u0CD6\u0D02-\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82-\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2-\u0DF3\u0F3E-\u0F3F\u0F7F\u102B-\u102C\u1031\u1038\u103B-\u103C\u1056-\u1057\u1062-\u1064\u1067-\u106D\u1083-\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7-\u17C8\u1923-\u1926\u1929-\u192B\u1930-\u1931\u1933-\u1938\u1A19-\u1A1A\u1A55\u1A57\u1A61\u1A63-\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43-\u1B44\u1B82\u1BA1\u1BA6-\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2-\u1BF3\u1C24-\u1C2B\u1C34-\u1C35\u1CE1\u1CF2-\u1CF3\u302E-\u302F\uA823-\uA824\uA827\uA880-\uA881\uA8B4-\uA8C3\uA952-\uA953\uA983\uA9B4-\uA9B5\uA9BA-\uA9BB\uA9BD-\uA9C0\uAA2F-\uAA30\uAA33-\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE-\uAAEF\uAAF5\uABE3-\uABE4\uABE6-\uABE7\uABE9-\uABEA\uABEC]/,Cn=i(["ः","ऻ",["ा","ी"],["ॉ","ौ"],["ॎ","ॏ"],["ং","ঃ"],["া","ী"],["ে","ৈ"],["ো","ৌ"],"ৗ","ਃ",["ਾ","ੀ"],"ઃ",["ા","ી"],"ૉ",["ો","ૌ"],["ଂ","ଃ"],"ା","ୀ",["େ","ୈ"],["ୋ","ୌ"],"ୗ",["ா","ி"],["ு","ூ"],["ெ","ை"],["ொ","ௌ"],"ௗ",["ఁ","ః"],["ు","ౄ"],["ಂ","ಃ"],"ಾ",["ೀ","ೄ"],["ೇ","ೈ"],["ೊ","ೋ"],["ೕ","ೖ"],["ം","ഃ"],["ാ","ീ"],["െ","ൈ"],["ൊ","ൌ"],"ൗ",["ං","ඃ"],["ා","ෑ"],["ෘ","ෟ"],["ෲ","ෳ"],["༾","༿"],"ཿ",["ါ","ာ"],"ေ","း",["ျ","ြ"],["ၖ","ၗ"],["ၢ","ၤ"],["ၧ","ၭ"],["ႃ","ႄ"],["ႇ","ႌ"],"ႏ",["ႚ","ႜ"],"ា",["ើ","ៅ"],["ះ","ៈ"],["ᤣ","ᤦ"],["ᤩ","ᤫ"],["ᤰ","ᤱ"],["ᤳ","ᤸ"],["ᨙ","ᨚ"],"ᩕ","ᩗ","ᩡ",["ᩣ","ᩤ"],["ᩭ","ᩲ"],"ᬄ","ᬵ","ᬻ",["ᬽ","ᭁ"],["ᭃ","᭄"],"ᮂ","ᮡ",["ᮦ","ᮧ"],"᮪","ᯧ",["ᯪ","ᯬ"],"ᯮ",["᯲","᯳"],["ᰤ","ᰫ"],["ᰴ","ᰵ"],"᳡",["ᳲ","ᳳ"],["〮","〯"],["ꠣ","ꠤ"],"ꠧ",["ꢀ","ꢁ"],["ꢴ","ꣃ"],["ꥒ","꥓"],"ꦃ",["ꦴ","ꦵ"],["ꦺ","ꦻ"],["ꦽ","꧀"],["ꨯ","ꨰ"],["ꨳ","ꨴ"],"ꩍ","ꩻ","ꩽ","ꫫ",["ꫮ","ꫯ"],"ꫵ",["ꯣ","ꯤ"],["ꯦ","ꯧ"],["ꯩ","ꯪ"],"꯬"],!1,!1),fn=/^[\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962-\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2-\u09E3\u0A01-\u0A02\u0A3C\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A51\u0A70-\u0A71\u0A75\u0A81-\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7-\u0AC8\u0ACD\u0AE2-\u0AE3\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62-\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C62-\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC-\u0CCD\u0CE2-\u0CE3\u0D01\u0D41-\u0D44\u0D4D\u0D62-\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86-\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039-\u103A\u103D-\u103E\u1058-\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17B4-\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193B\u1A17-\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80-\u1B81\u1BA2-\u1BA5\u1BA8-\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8-\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8-\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099-\u309A\uA66F\uA674-\uA67D\uA69E-\uA69F\uA6F0-\uA6F1\uA802\uA806\uA80B\uA825-\uA826\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31-\uAA32\uAA35-\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7-\uAAB8\uAABE-\uAABF\uAAC1\uAAEC-\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/,Fn=i([["̀","ͯ"],["҃","҇"],["֑","ֽ"],"ֿ",["ׁ","ׂ"],["ׄ","ׅ"],"ׇ",["ؐ","ؚ"],["ً","ٟ"],"ٰ",["ۖ","ۜ"],["۟","ۤ"],["ۧ","ۨ"],["۪","ۭ"],"ܑ",["ܰ","݊"],["ަ","ް"],["߫","߳"],["ࠖ","࠙"],["ࠛ","ࠣ"],["ࠥ","ࠧ"],["ࠩ","࠭"],["࡙","࡛"],["ࣣ","ं"],"ऺ","़",["ु","ै"],"्",["॑","ॗ"],["ॢ","ॣ"],"ঁ","়",["ু","ৄ"],"্",["ৢ","ৣ"],["ਁ","ਂ"],"਼",["ੁ","ੂ"],["ੇ","ੈ"],["ੋ","੍"],"ੑ",["ੰ","ੱ"],"ੵ",["ઁ","ં"],"઼",["ુ","ૅ"],["ે","ૈ"],"્",["ૢ","ૣ"],"ଁ","଼","ି",["ୁ","ୄ"],"୍","ୖ",["ୢ","ୣ"],"ஂ","ீ","்","ఀ",["ా","ీ"],["ె","ై"],["ొ","్"],["ౕ","ౖ"],["ౢ","ౣ"],"ಁ","಼","ಿ","ೆ",["ೌ","್"],["ೢ","ೣ"],"ഁ",["ു","ൄ"],"്",["ൢ","ൣ"],"්",["ි","ු"],"ූ","ั",["ิ","ฺ"],["็","๎"],"ັ",["ິ","ູ"],["ົ","ຼ"],["່","ໍ"],["༘","༙"],"༵","༷","༹",["ཱ","ཾ"],["ྀ","྄"],["྆","྇"],["ྍ","ྗ"],["ྙ","ྼ"],"࿆",["ိ","ူ"],["ဲ","့"],["္","်"],["ွ","ှ"],["ၘ","ၙ"],["ၞ","ၠ"],["ၱ","ၴ"],"ႂ",["ႅ","ႆ"],"ႍ","ႝ",["፝","፟"],["ᜒ","᜔"],["ᜲ","᜴"],["ᝒ","ᝓ"],["ᝲ","ᝳ"],["឴","឵"],["ិ","ួ"],"ំ",["៉","៓"],"៝",["᠋","᠍"],"ᢩ",["ᤠ","ᤢ"],["ᤧ","ᤨ"],"ᤲ",["᤹","᤻"],["ᨗ","ᨘ"],"ᨛ","ᩖ",["ᩘ","ᩞ"],"᩠","ᩢ",["ᩥ","ᩬ"],["ᩳ","᩼"],"᩿",["᪰","᪽"],["ᬀ","ᬃ"],"᬴",["ᬶ","ᬺ"],"ᬼ","ᭂ",["᭫","᭳"],["ᮀ","ᮁ"],["ᮢ","ᮥ"],["ᮨ","ᮩ"],["᮫","ᮭ"],"᯦",["ᯨ","ᯩ"],"ᯭ",["ᯯ","ᯱ"],["ᰬ","ᰳ"],["ᰶ","᰷"],["᳐","᳒"],["᳔","᳠"],["᳢","᳨"],"᳭","᳴",["᳸","᳹"],["᷀","᷵"],["᷼","᷿"],["⃐","⃜"],"⃡",["⃥","⃰"],["⳯","⳱"],"⵿",["ⷠ","ⷿ"],["〪","〭"],["゙","゚"],"꙯",["ꙴ","꙽"],["ꚞ","ꚟ"],["꛰","꛱"],"ꠂ","꠆","ꠋ",["ꠥ","ꠦ"],"꣄",["꣠","꣱"],["ꤦ","꤭"],["ꥇ","ꥑ"],["ꦀ","ꦂ"],"꦳",["ꦶ","ꦹ"],"ꦼ","ꧥ",["ꨩ","ꨮ"],["ꨱ","ꨲ"],["ꨵ","ꨶ"],"ꩃ","ꩌ","ꩼ","ꪰ",["ꪲ","ꪴ"],["ꪷ","ꪸ"],["ꪾ","꪿"],"꫁",["ꫬ","ꫭ"],"꫶","ꯥ","ꯨ","꯭","ﬞ",["︀","️"],["︠","︯"]],!1,!1),dn=/^[0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]/,hn=i([["0","9"],["٠","٩"],["۰","۹"],["߀","߉"],["०","९"],["০","৯"],["੦","੯"],["૦","૯"],["୦","୯"],["௦","௯"],["౦","౯"],["೦","೯"],["൦","൯"],["෦","෯"],["๐","๙"],["໐","໙"],["༠","༩"],["၀","၉"],["႐","႙"],["០","៩"],["᠐","᠙"],["᥆","᥏"],["᧐","᧙"],["᪀","᪉"],["᪐","᪙"],["᭐","᭙"],["᮰","᮹"],["᱀","᱉"],["᱐","᱙"],["꘠","꘩"],["꣐","꣙"],["꤀","꤉"],["꧐","꧙"],["꧰","꧹"],["꩐","꩙"],["꯰","꯹"],["0","9"]],!1,!1),gn=/^[\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]/,Dn=i([["ᛮ","ᛰ"],["Ⅰ","ↂ"],["ↅ","ↈ"],"〇",["〡","〩"],["〸","〺"],["ꛦ","ꛯ"]],!1,!1),Bn=/^[_\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F]/,vn=i(["_",["‿","⁀"],"⁔",["︳","︴"],["﹍","﹏"],"_"],!1,!1),mn=/^[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/,bn=i([" "," "," ",[" "," "]," "," "," "],!1,!1),xn="break",Pn=s("break",!1),_n="case",yn=s("case",!1),$n="catch",Rn=s("catch",!1),kn="class",Sn=s("class",!1),In="const",On=s("const",!1),jn="continue",Ln=s("continue",!1),wn="debugger",Tn=s("debugger",!1),Nn="default",Un=s("default",!1),Hn="delete",qn=s("delete",!1),zn="do",Mn=s("do",!1),Gn="else",Vn=s("else",!1),Yn="enum",Wn=s("enum",!1),Xn="export",Jn=s("export",!1),Zn="extends",Kn=s("extends",!1),Qn="false",uo=s("false",!1),eo="finally",to=s("finally",!1),ro="for",no=s("for",!1),oo="function",so=s("function",!1),io="if",ao=s("if",!1),co="import",po=s("import",!1),Ao="instanceof",lo=s("instanceof",!1),Eo="in",Co=s("in",!1),fo="new",Fo=s("new",!1),ho="null",go=s("null",!1),Do="return",Bo=s("return",!1),vo="super",mo=s("super",!1),bo="switch",xo=s("switch",!1),Po="this",_o=s("this",!1),yo="throw",$o=s("throw",!1),Ro="true",ko=s("true",!1),So="try",Io=s("try",!1),Oo="typeof",jo=s("typeof",!1),Lo="var",wo=s("var",!1),To="void",No=s("void",!1),Uo="while",Ho=s("while",!1),qo="with",zo=s("with",!1),Mo=";",Go=s(";",!1),Vo=0,Yo=0,Wo=[{ +line:1,column:1}],Xo=0,Jo=[],Zo=0;if("startRule"in e){if(!(e.startRule in he))throw new Error("Can't start parsing from rule \""+e.startRule+'".');ge=he[e.startRule]}var Ko={$:"text","&":"simple_and","!":"simple_not"},Qo={"?":"optional","*":"zero_or_more","+":"one_or_more"},us={"&":"semantic_and","!":"semantic_not"};if(Fe=ge(),Fe!==de&&Vo===u.length)return Fe;throw Fe!==de&&Vo0){for(e=1,t=1;e