From ac5ea4a7cc4a47f19353f5ac972a72c4920e5b97 Mon Sep 17 00:00:00 2001 From: hydroper Date: Sun, 12 May 2024 17:04:05 +0000 Subject: [PATCH] Automated report --- .github/workflows/demo.yml | 41 - .gitignore | 1 - Cargo.lock | 639 -- Cargo.toml | 8 - LICENSE | 202 - README.md | 19 - as3/promise/AggregateError.as | 10 - as3/promise/Promise.as | 354 -- as3/promise/PromiseHandler.as | 16 - crates/parser/Cargo.toml | 34 - crates/parser/README.md | 3 - crates/parser/compilation_unit.rs | 8 - crates/parser/compilation_unit/comment.rs | 59 - .../compilation_unit/compilation_unit.rs | 245 - crates/parser/compilation_unit/location.rs | 176 - crates/parser/diagnostics.rs | 6 - crates/parser/diagnostics/diagnostic_kind.rs | 77 - crates/parser/diagnostics/diagnostics.rs | 175 - .../diagnostics_english_resources.rs | 76 - crates/parser/lib.rs | 11 - crates/parser/ns.rs | 8 - crates/parser/operator.rs | 6 - crates/parser/operator/operator.rs | 127 - crates/parser/operator/operator_precedence.rs | 77 - crates/parser/parser.rs | 23 - crates/parser/parser/character_validator.rs | 147 - crates/parser/parser/context.rs | 174 - crates/parser/parser/css_parser.rs | 847 --- crates/parser/parser/css_tokenizer.rs | 434 -- crates/parser/parser/parser.rs | 5319 ----------------- crates/parser/parser/parser_error.rs | 20 - crates/parser/parser/reserved_word.rs | 110 - crates/parser/parser/token.rs | 470 -- crates/parser/parser/tokenizer.rs | 1307 ---- crates/parser/tree.rs | 165 - crates/parser/tree/array_literal.rs | 18 - crates/parser/tree/asdoc.rs | 52 - crates/parser/tree/assignment_expression.rs | 15 - crates/parser/tree/attributes.rs | 170 - crates/parser/tree/binary_expression.rs | 10 - crates/parser/tree/block.rs | 9 - crates/parser/tree/boolean_literal.rs | 8 - crates/parser/tree/break_statement.rs | 8 - crates/parser/tree/call_expression.rs | 9 - crates/parser/tree/class_definition.rs | 14 - .../parser/tree/computed_member_expression.rs | 12 - crates/parser/tree/conditional_expression.rs | 10 - crates/parser/tree/configuration_directive.rs | 16 - crates/parser/tree/continue_statement.rs | 8 - crates/parser/tree/css.rs | 471 -- .../tree/default_xml_namespace_statement.rs | 8 - crates/parser/tree/descendants_expression.rs | 9 - crates/parser/tree/destructuring.rs | 9 - crates/parser/tree/directive.rs | 106 - .../parser/tree/directive_injection_node.rs | 9 - crates/parser/tree/do_statement.rs | 10 - crates/parser/tree/empty_statement.rs | 7 - crates/parser/tree/enum_definition.rs | 13 - crates/parser/tree/expression.rs | 294 - crates/parser/tree/expression_statement.rs | 8 - .../tree/expression_with_type_arguments.rs | 10 - crates/parser/tree/filter_expression.rs | 10 - crates/parser/tree/for_statement.rs | 32 - crates/parser/tree/function_definition.rs | 111 - crates/parser/tree/function_expression.rs | 9 - crates/parser/tree/if_statement.rs | 10 - crates/parser/tree/import_directive.rs | 27 - crates/parser/tree/import_meta.rs | 8 - crates/parser/tree/include_directive.rs | 12 - crates/parser/tree/interface_definition.rs | 13 - crates/parser/tree/invalidated_node.rs | 8 - crates/parser/tree/labeled_statement.rs | 9 - crates/parser/tree/member_expression.rs | 9 - crates/parser/tree/mxml.rs | 217 - crates/parser/tree/namespace_definition.rs | 11 - crates/parser/tree/new_expression.rs | 9 - .../tree/normal_configuration_directive.rs | 13 - crates/parser/tree/null_literal.rs | 7 - crates/parser/tree/numeric_literal.rs | 157 - crates/parser/tree/object_initializer.rs | 63 - .../tree/optional_chaining_expression.rs | 21 - .../parser/tree/package_concat_directive.rs | 10 - crates/parser/tree/package_definition.rs | 10 - crates/parser/tree/paren_expression.rs | 8 - crates/parser/tree/program.rs | 9 - crates/parser/tree/qualified_identifier.rs | 49 - crates/parser/tree/regexp_literal.rs | 9 - .../tree/reserved_namespace_expression.rs | 41 - crates/parser/tree/return_statement.rs | 8 - crates/parser/tree/sequence_expression.rs | 10 - crates/parser/tree/string_literal.rs | 8 - crates/parser/tree/super_expression.rs | 18 - crates/parser/tree/super_statement.rs | 8 - crates/parser/tree/switch_statement.rs | 46 - crates/parser/tree/this_literal.rs | 7 - crates/parser/tree/throw_statement.rs | 8 - crates/parser/tree/tree_semantics.rs | 242 - crates/parser/tree/try_statement.rs | 23 - crates/parser/tree/type_definition.rs | 11 - crates/parser/tree/type_expression.rs | 56 - crates/parser/tree/type_parameter.rs | 9 - crates/parser/tree/unary_expression.rs | 9 - crates/parser/tree/use_namespace_directive.rs | 8 - crates/parser/tree/variable_definition.rs | 36 - crates/parser/tree/vector_literal.rs | 9 - crates/parser/tree/while_statement.rs | 9 - crates/parser/tree/with_statement.rs | 9 - crates/parser/tree/xml_expression.rs | 57 - crates/parser/util.rs | 36 - crates/parser/util/arena.rs | 19 - crates/parser/util/character_reader.rs | 138 - crates/parser/util/css.rs | 163 - crates/parser/util/escaping.rs | 11 - crates/parser_test/Cargo.toml | 23 - crates/parser_test/main.rs | 62 - demo/Cargo.toml | 18 - demo/dist/as3_parser_demo.d.ts | 40 + demo/dist/as3_parser_demo.js | 199 + demo/dist/as3_parser_demo_bg.wasm | Bin 0 -> 2505195 bytes demo/dist/as3_parser_demo_bg.wasm.d.ts | 8 + demo/src/lib.rs | 58 - examples/asdoc/.gitignore | 1 - examples/asdoc/Cargo.toml | 11 - examples/asdoc/Example.as | 10 - examples/asdoc/example.rs | 61 - tests/parser/ASDoc.as | 24 - tests/parser/ASDoc.diag | 0 tests/parser/ASDoc.tree | 235 - tests/parser/Attributes.as | 17 - tests/parser/Attributes.diag | 0 tests/parser/Attributes.tree | 293 - tests/parser/Configuration.as | 21 - tests/parser/Configuration.diag | 0 tests/parser/Configuration.tree | 386 -- tests/parser/E4X.as | 18 - tests/parser/E4X.diag | 0 tests/parser/E4X.tree | 324 - tests/parser/MXML1.diag | 0 tests/parser/MXML1.mxml | 16 - tests/parser/MXML1.tree | 215 - tests/parser/MXML2.diag | 0 tests/parser/MXML2.mxml | 4 - tests/parser/MXML2.tree | 38 - tests/parser/Misc.as | 19 - tests/parser/Misc.diag | 0 tests/parser/Misc.tree | 341 -- tests/parser/Qualifier.as | 9 - tests/parser/Qualifier.diag | 0 tests/parser/Qualifier.tree | 351 -- tests/parser/README.md | 17 - tests/parser/Super.as | 12 - tests/parser/Super.diag | 1 - tests/parser/Super.tree | 215 - tests/parser/css/mediaQuery.css | 5 - tests/parser/css/mediaQuery.diag | 0 tests/parser/css/mediaQuery.tree | 92 - tests/parser/css/selectors.css | 9 - tests/parser/css/selectors.diag | 0 tests/parser/css/selectors.tree | 200 - 159 files changed, 247 insertions(+), 17663 deletions(-) delete mode 100644 .github/workflows/demo.yml delete mode 100644 .gitignore delete mode 100644 Cargo.lock delete mode 100644 Cargo.toml delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 as3/promise/AggregateError.as delete mode 100644 as3/promise/Promise.as delete mode 100644 as3/promise/PromiseHandler.as delete mode 100644 crates/parser/Cargo.toml delete mode 100644 crates/parser/README.md delete mode 100644 crates/parser/compilation_unit.rs delete mode 100644 crates/parser/compilation_unit/comment.rs delete mode 100644 crates/parser/compilation_unit/compilation_unit.rs delete mode 100644 crates/parser/compilation_unit/location.rs delete mode 100644 crates/parser/diagnostics.rs delete mode 100644 crates/parser/diagnostics/diagnostic_kind.rs delete mode 100644 crates/parser/diagnostics/diagnostics.rs delete mode 100644 crates/parser/diagnostics/diagnostics_english_resources.rs delete mode 100644 crates/parser/lib.rs delete mode 100644 crates/parser/ns.rs delete mode 100644 crates/parser/operator.rs delete mode 100644 crates/parser/operator/operator.rs delete mode 100644 crates/parser/operator/operator_precedence.rs delete mode 100644 crates/parser/parser.rs delete mode 100644 crates/parser/parser/character_validator.rs delete mode 100644 crates/parser/parser/context.rs delete mode 100644 crates/parser/parser/css_parser.rs delete mode 100644 crates/parser/parser/css_tokenizer.rs delete mode 100644 crates/parser/parser/parser.rs delete mode 100644 crates/parser/parser/parser_error.rs delete mode 100644 crates/parser/parser/reserved_word.rs delete mode 100644 crates/parser/parser/token.rs delete mode 100644 crates/parser/parser/tokenizer.rs delete mode 100644 crates/parser/tree.rs delete mode 100644 crates/parser/tree/array_literal.rs delete mode 100644 crates/parser/tree/asdoc.rs delete mode 100644 crates/parser/tree/assignment_expression.rs delete mode 100644 crates/parser/tree/attributes.rs delete mode 100644 crates/parser/tree/binary_expression.rs delete mode 100644 crates/parser/tree/block.rs delete mode 100644 crates/parser/tree/boolean_literal.rs delete mode 100644 crates/parser/tree/break_statement.rs delete mode 100644 crates/parser/tree/call_expression.rs delete mode 100644 crates/parser/tree/class_definition.rs delete mode 100644 crates/parser/tree/computed_member_expression.rs delete mode 100644 crates/parser/tree/conditional_expression.rs delete mode 100644 crates/parser/tree/configuration_directive.rs delete mode 100644 crates/parser/tree/continue_statement.rs delete mode 100644 crates/parser/tree/css.rs delete mode 100644 crates/parser/tree/default_xml_namespace_statement.rs delete mode 100644 crates/parser/tree/descendants_expression.rs delete mode 100644 crates/parser/tree/destructuring.rs delete mode 100644 crates/parser/tree/directive.rs delete mode 100644 crates/parser/tree/directive_injection_node.rs delete mode 100644 crates/parser/tree/do_statement.rs delete mode 100644 crates/parser/tree/empty_statement.rs delete mode 100644 crates/parser/tree/enum_definition.rs delete mode 100644 crates/parser/tree/expression.rs delete mode 100644 crates/parser/tree/expression_statement.rs delete mode 100644 crates/parser/tree/expression_with_type_arguments.rs delete mode 100644 crates/parser/tree/filter_expression.rs delete mode 100644 crates/parser/tree/for_statement.rs delete mode 100644 crates/parser/tree/function_definition.rs delete mode 100644 crates/parser/tree/function_expression.rs delete mode 100644 crates/parser/tree/if_statement.rs delete mode 100644 crates/parser/tree/import_directive.rs delete mode 100644 crates/parser/tree/import_meta.rs delete mode 100644 crates/parser/tree/include_directive.rs delete mode 100644 crates/parser/tree/interface_definition.rs delete mode 100644 crates/parser/tree/invalidated_node.rs delete mode 100644 crates/parser/tree/labeled_statement.rs delete mode 100644 crates/parser/tree/member_expression.rs delete mode 100644 crates/parser/tree/mxml.rs delete mode 100644 crates/parser/tree/namespace_definition.rs delete mode 100644 crates/parser/tree/new_expression.rs delete mode 100644 crates/parser/tree/normal_configuration_directive.rs delete mode 100644 crates/parser/tree/null_literal.rs delete mode 100644 crates/parser/tree/numeric_literal.rs delete mode 100644 crates/parser/tree/object_initializer.rs delete mode 100644 crates/parser/tree/optional_chaining_expression.rs delete mode 100644 crates/parser/tree/package_concat_directive.rs delete mode 100644 crates/parser/tree/package_definition.rs delete mode 100644 crates/parser/tree/paren_expression.rs delete mode 100644 crates/parser/tree/program.rs delete mode 100644 crates/parser/tree/qualified_identifier.rs delete mode 100644 crates/parser/tree/regexp_literal.rs delete mode 100644 crates/parser/tree/reserved_namespace_expression.rs delete mode 100644 crates/parser/tree/return_statement.rs delete mode 100644 crates/parser/tree/sequence_expression.rs delete mode 100644 crates/parser/tree/string_literal.rs delete mode 100644 crates/parser/tree/super_expression.rs delete mode 100644 crates/parser/tree/super_statement.rs delete mode 100644 crates/parser/tree/switch_statement.rs delete mode 100644 crates/parser/tree/this_literal.rs delete mode 100644 crates/parser/tree/throw_statement.rs delete mode 100644 crates/parser/tree/tree_semantics.rs delete mode 100644 crates/parser/tree/try_statement.rs delete mode 100644 crates/parser/tree/type_definition.rs delete mode 100644 crates/parser/tree/type_expression.rs delete mode 100644 crates/parser/tree/type_parameter.rs delete mode 100644 crates/parser/tree/unary_expression.rs delete mode 100644 crates/parser/tree/use_namespace_directive.rs delete mode 100644 crates/parser/tree/variable_definition.rs delete mode 100644 crates/parser/tree/vector_literal.rs delete mode 100644 crates/parser/tree/while_statement.rs delete mode 100644 crates/parser/tree/with_statement.rs delete mode 100644 crates/parser/tree/xml_expression.rs delete mode 100644 crates/parser/util.rs delete mode 100644 crates/parser/util/arena.rs delete mode 100644 crates/parser/util/character_reader.rs delete mode 100644 crates/parser/util/css.rs delete mode 100644 crates/parser/util/escaping.rs delete mode 100644 crates/parser_test/Cargo.toml delete mode 100644 crates/parser_test/main.rs delete mode 100644 demo/Cargo.toml create mode 100644 demo/dist/as3_parser_demo.d.ts create mode 100644 demo/dist/as3_parser_demo.js create mode 100644 demo/dist/as3_parser_demo_bg.wasm create mode 100644 demo/dist/as3_parser_demo_bg.wasm.d.ts delete mode 100644 demo/src/lib.rs delete mode 100644 examples/asdoc/.gitignore delete mode 100644 examples/asdoc/Cargo.toml delete mode 100644 examples/asdoc/Example.as delete mode 100644 examples/asdoc/example.rs delete mode 100644 tests/parser/ASDoc.as delete mode 100644 tests/parser/ASDoc.diag delete mode 100644 tests/parser/ASDoc.tree delete mode 100644 tests/parser/Attributes.as delete mode 100644 tests/parser/Attributes.diag delete mode 100644 tests/parser/Attributes.tree delete mode 100644 tests/parser/Configuration.as delete mode 100644 tests/parser/Configuration.diag delete mode 100644 tests/parser/Configuration.tree delete mode 100644 tests/parser/E4X.as delete mode 100644 tests/parser/E4X.diag delete mode 100644 tests/parser/E4X.tree delete mode 100644 tests/parser/MXML1.diag delete mode 100644 tests/parser/MXML1.mxml delete mode 100644 tests/parser/MXML1.tree delete mode 100644 tests/parser/MXML2.diag delete mode 100644 tests/parser/MXML2.mxml delete mode 100644 tests/parser/MXML2.tree delete mode 100644 tests/parser/Misc.as delete mode 100644 tests/parser/Misc.diag delete mode 100644 tests/parser/Misc.tree delete mode 100644 tests/parser/Qualifier.as delete mode 100644 tests/parser/Qualifier.diag delete mode 100644 tests/parser/Qualifier.tree delete mode 100644 tests/parser/README.md delete mode 100644 tests/parser/Super.as delete mode 100644 tests/parser/Super.diag delete mode 100644 tests/parser/Super.tree delete mode 100644 tests/parser/css/mediaQuery.css delete mode 100644 tests/parser/css/mediaQuery.diag delete mode 100644 tests/parser/css/mediaQuery.tree delete mode 100644 tests/parser/css/selectors.css delete mode 100644 tests/parser/css/selectors.diag delete mode 100644 tests/parser/css/selectors.tree diff --git a/.github/workflows/demo.yml b/.github/workflows/demo.yml deleted file mode 100644 index cad5473..0000000 --- a/.github/workflows/demo.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Demo - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - -permissions: - contents: write - -env: - CARGO_TERM_COLOR: always - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Use nightly Rust - run: rustup default nightly - - name: Add wasm32 target - run: rustup target add wasm32-unknown-unknown - - name: Install wasm-bindgen CLI - run: cargo install wasm-bindgen-cli - - name: Build demo - run: cargo build -p as3_parser_demo --release --target wasm32-unknown-unknown - - name: Update demo/dist - run: wasm-bindgen --target web --out-dir demo/dist target/wasm32-unknown-unknown/release/as3_parser_demo.wasm - - name: Git commit report - run: | - git config --global user.name 'hydroper' - git config --global user.email 'matheusdiasdesouzads@gmail.com' - git switch -C demo - git rm --cached -r . - git add demo - git rm --cached -r demo/src - git rm --cached demo/Cargo.toml - git commit -m "Automated report" - git push origin -f demo diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c41cc9e..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 9c628d4..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,639 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "anstream" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" - -[[package]] -name = "anstyle-parse" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "anyhow" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" - -[[package]] -name = "as3_parser" -version = "1.0.24" -dependencies = [ - "bitflags", - "by_address", - "bytes", - "conv", - "file_paths", - "htmlentity", - "hydroper_source_text", - "late_format", - "lazy-regex", - "lazy_static", - "maplit", - "num-bigint", - "num-derive", - "num-traits", - "serde", - "serde_json", - "unicode-general-category", -] - -[[package]] -name = "as3_parser_demo" -version = "0.1.0" -dependencies = [ - "as3_parser", - "maplit", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "as3_parser_test" -version = "0.4.0" -dependencies = [ - "as3_parser", - "clap", - "file_paths", - "maplit", - "serde", - "serde_json", -] - -[[package]] -name = "asdoc-example" -version = "0.1.0" -dependencies = [ - "as3_parser", -] - -[[package]] -name = "autocfg" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "conv" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299" -dependencies = [ - "custom_derive", -] - -[[package]] -name = "custom_derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9" - -[[package]] -name = "file_paths" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6655a548f719048f152b0349acf5f1b0fa7ce430acb49d4afc1d42513f160549" -dependencies = [ - "lazy-regex", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "htmlentity" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab11d4e4796b618b77cabd8f0729eb8033891609820303af715e9306dbb95cd" -dependencies = [ - "anyhow", - "lazy_static", - "thiserror", -] - -[[package]] -name = "hydroper_source_text" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce3d21a188729674efc26164f9a201d567ab2fe28b6789cb802d7ca66ee7aaf" - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "late_format" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20a4c2785e13b46810cdd5b6df71b2bbacd6195d18d37b99098c6f52631dc6d" -dependencies = [ - "lazy-regex", - "maplit", -] - -[[package]] -name = "lazy-regex" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d12be4595afdf58bd19e4a9f4e24187da2a66700786ff660a418e9059937a4c" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "proc-macro2" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "serde" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.115" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "syn" -version = "2.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "unicode-general-category" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index d173730..0000000 --- a/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[workspace] -members = [ - "crates/parser", - "crates/parser_test", - "demo", - "examples/asdoc", -] -resolver = "2" \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 9820eb1..0000000 --- a/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2024 Hydroper - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index e9b92ac..0000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# ActionScript 3 Parser - -

- - - -

- -ActionScript 3 parser in the Rust language. - -[Online demo](https://hydroper.github.io/as3parser/demo) - -## Documentation - -Refer to the [wiki](https://github.com/hydroper/as3parser/wiki) of this repository for various informations, including a getting started point. - -## License - -Apache License 2.0, copyright 2024 Hydroper diff --git a/as3/promise/AggregateError.as b/as3/promise/AggregateError.as deleted file mode 100644 index c09f54c..0000000 --- a/as3/promise/AggregateError.as +++ /dev/null @@ -1,10 +0,0 @@ -package { - public class AggregateError extends Error { - public var errors: Array; - - public function AggregateError(errors: Array, message: String = "") { - super(message); - this.errors = errors.slice(0); - } - } -} \ No newline at end of file diff --git a/as3/promise/Promise.as b/as3/promise/Promise.as deleted file mode 100644 index eba7d44..0000000 --- a/as3/promise/Promise.as +++ /dev/null @@ -1,354 +0,0 @@ -package { - import flash.utils.setTimeout; - import __AS3__.promise.*; - - /** - * The Promise object represents the eventual completion (or failure) - * of an asynchronous operation and its resulting value. - * - * For more information, consult [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). - * - * # Examples - * - * ``` - * const promise = new Promise.<*>(function(resolve: Function, reject: Function): void { - * // - * }); - * - * promise - * .then(function(): * {}) - * .catch(function(error: *): * {}) - * .finally(function(): void {}); - * ``` - */ - public final class Promise. { - // Implementation based on - // https://github.com/taylorhakes/promise-polyfill - - private var m_state:Number = 0; - private var m_handled:Boolean = false; - private var m_value:* = undefined; - private var m_deferreds:Vector. = new Vector.; - - private static function bindFunction(fn:Function, thisArg:*):Function { - return function(...argumentsList):void { - fn.apply(thisArg, argumentsList); - }; - } - - public function Promise(fn: Function) { - doResolve(fn, this); - } - - private static function handle(self:Promise., deferred:PromiseHandler):void { - while (self.m_state === 3) { - self = self.m_value; - } - if (self.m_state === 0) { - self.m_deferreds.push(deferred); - return; - } - self.m_handled = true; - Promise.._immediateFn(function():void { - var cb:Function = self.m_state === 1 ? deferred.onFulfilled : deferred.onRejected; - if (cb === null) { - (self.m_state === 1 ? Promise..privateResolve : Promise..privateReject)(deferred.promise, self.m_value); - return; - } - var ret:* = undefined; - try { - ret = cb(self.m_value); - } - catch (e:*) { - Promise..privateReject(deferred.promise, e); - return; - } - Promise..privateResolve(deferred.promise, ret); - }); - } - - private static function privateResolve(self:Promise., newValue:*):void { - try { - // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) { - throw new TypeError('A promise cannot be resolved with itself.'); - } - if (newValue is Promise) { - self.m_state = 3; - self.m_value = newValue; - Promise..finale(self); - return; - } - self.m_state = 1; - self.m_value = newValue; - Promise..finale(self); - } - catch (e:*) { - Promise..privateReject(self, e); - } - } - - private static function privateReject(self:Promise., newValue:*):void { - self.m_state = 2; - self.m_value = newValue; - Promise..finale(self); - } - - private static function finale(self:Promise.):void { - if (self.m_state === 2 && self.m_deferreds.length === 0) { - Promise.._immediateFn(function():void { - if (!self.m_handled) { - Promise.._unhandledRejectionFn(self.m_value); - } - }); - } - - for (var i:Number = 0, len:Number = self.m_deferreds.length; i < len; i++) { - handle(self, self.m_deferreds[i]); - } - self.m_deferreds = null; - } - - /** - * Takes a potentially misbehaving resolver function and make sure - * `onFulfilled` and `onRejected` are only called once. - * - * Makes no guarantees about asynchrony. - */ - private static function doResolve(fn:Function, self:Promise.):void { - var done:Boolean = false; - try { - fn( - function(value:*):* { - if (done) return; - done = true; - Promise..privateResolve(self, value); - }, - function(reason:*):* { - if (done) return; - done = true; - Promise..privateReject(self, reason); - } - ); - } - catch (ex:*) { - if (done) return; - done = true; - Promise..privateReject(self, ex); - } - } - - /** - * The `Promise.allSettled()` static method takes an iterable of promises - * as input and returns a single Promise. - * This returned promise fulfills when all of the input's promises settle - * (including when an empty iterable is passed), with an array of objects that - * describe the outcome of each promise. - * - * # Example - * - * ``` - * const promise1 = Promise..resolve(3); - * const promise2 = new Promise.(function(resolve: Function, reject: Function): void { - * setTimeout(reject, 100, "foo"); - * }); - * Promise..allSettled([promise1, promise2]) - * .then(function(results: Array): void { - * for each (const result in results) { - * trace(result.status); - * } - * }); - * // Expected output: - * // "fulfilled" - * // "rejected" - * ``` - * - * @return A `Promise` that is: - * - * - **Already fulfilled,** if the iterable passed is empty. - * - **Asynchronously fulfilled,** when all promises in the given - * iterable have settled (either fulfilled or rejected). - * The fulfillment value is an array of objects, each describing the - * outcome of one promise in the iterable, in the order of the promises passed, - * regardless of completion order. Each outcome object has the following properties: - * - `status`: A string, either `"fulfilled"` or `"rejected"`, indicating the eventual state of the promise. - * - `value`: Only present if `status` is `"fulfilled"`. The value that the promise was fulfilled with. - * - `reason`: Only present if `status` is `"rejected"`. The reason that the promise was rejected with. - * - * If the iterable passed is non-empty but contains no pending promises, - * the returned promise is still asynchronously (instead of synchronously) fulfilled. - */ - public static function allSettled(promises: Array): Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - resolve([]); - return; - } - var remaining:Number = args.length; - function res(i:Number, val:*):void { - if (val is Promise) { - Promise(val).then( - function(val:*):* { - res(i, val); - }, - function(e:*):* { - args[i] = { status: 'rejected', reason: e }; - if (--remaining === 0) { - resolve(args); - } - } - ); - return; - } - args[i] = { status: 'fulfilled', value: val }; - if (--remaining === 0) { - resolve(args); - } - } - for (var i:Number = 0; i < args.length; ++i) { - res(i, args[i]); - } - }); - } // allSettled - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any) - */ - public static function any(promises:Array):Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - reject(undefined); - return; - } - var rejectionReasons:Array = []; - for (var i:Number = 0; i < args.length; ++i) { - try { - Promise..resolve(args[i]) - .then(resolve) - .catch(function(error:*):* { - rejectionReasons.push(error); - if (rejectionReasons.length === args.length) { - reject( - new AggregateError( - rejectionReasons, - 'All promises were rejected' - ) - ); - } - }); - } - catch (ex:*) { - reject(ex); - } - } - }); - } // any - - public function finally(callback:Function):Promise. { - return this.then( - function(value:*):* { - return Promise..resolve(callback()).then(function(_:*):* { - return value; - }); - }, - function(reason:*):* { - return Promise..resolve(callback()).then(function(_:*):* { - return Promise..reject(reason); - }); - } - ); - } - - public function catch(onRejected: Function):Promise. { - return this.then(null, onRejected); - } - - public function then(onFulfilled: Function, onRejected: Function = null):Promise.<*> { - var prom = new Promise.<*>(function(_a:*, _b:*):void {}); - Promise..handle(this, new PromiseHandler(onFulfilled, onRejected, prom)); - return prom; - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) - */ - public static function all(promises: Array):Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - resolve([]); - return; - } - var remaining:Number = args.length; - - function res(i:Number, val:*):void { - try { - if (val is Promise) { - Promise(val).then( - function(val): * { - res(i, val); - }, - reject - ); - return; - } - args[i] = val; - if (--remaining === 0) { - resolve(args); - } - } - catch (ex:*) { - reject(ex); - } - } - - for (var i:Number = 0; i < args.length; i++) { - res(i, args[i]); - } - }); - } // all - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve) - */ - public static function resolve(value: *):Promise. { - if (value is Promise) { - return Promise.(value); - } - - return new Promise.(function(resolve: Function, reject: Function): void { - resolve(value); - }); - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject) - */ - public static function reject(value: *): Promise. { - return new Promise(function(resolve: Function, reject: Function): void { - reject(value); - }); - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race) - */ - public static function race(promises:Array):Promise. { - return new Promise.(function(resolve:Function, reject:Function):void { - for each (var arg:* in promises) { - Promise..resolve(arg).then(resolve, reject); - } - }); - } - - private static function _immediateFn(fn:Function):void { - setTimeout(fn, 0); - } - - private static function _unhandledRejectionFn(err:*):void { - trace("Possible unhandled Promise rejection:", err); - } - } -} diff --git a/as3/promise/PromiseHandler.as b/as3/promise/PromiseHandler.as deleted file mode 100644 index 708f554..0000000 --- a/as3/promise/PromiseHandler.as +++ /dev/null @@ -1,16 +0,0 @@ -package __AS3__.promise { - /** - * @private - */ - public final class PromiseHandler { - public var onFulfilled: Function; - public var onRejected: Function; - public var promise: Promise; - - public function PromiseHandler(onFulfilled: Function, onRejected: Function, promise: Promise) { - this.onFulfilled = onFulfilled; - this.onRejected = onRejected; - this.promise = promise; - } - } -} diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml deleted file mode 100644 index e84ac30..0000000 --- a/crates/parser/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "as3_parser" -version = "1.0.24" -edition = "2021" -authors = ["hydroper "] -repository = "https://github.com/hydroper/as3parser" -keywords = ["actionscript", "as3", "parser"] -description = "ActionScript 3 parser" -license = "Apache-2.0" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -name = "as3_parser" -path = "lib.rs" - -[dependencies] -bitflags = { version = "2.4.1", features = ["serde"] } -bytes = "1" -file_paths = "1.0.0" -conv = "0.3.3" -htmlentity = "1.3.1" -late_format = "1.0.0" -maplit = "1.0.2" -num-bigint = "0.4" -num-derive = "0.4.1" -num-traits = "0.2.17" -lazy-regex = "3.0.2" -lazy_static = "1.4.0" -unicode-general-category = "0.6.0" -by_address = "1.1.0" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" -hydroper_source_text = "1.0.3" diff --git a/crates/parser/README.md b/crates/parser/README.md deleted file mode 100644 index 61237d1..0000000 --- a/crates/parser/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ActionScript 3 Parser - -Refer to the [crate repository](https://github.com/hydroper/as3parser) for full details. diff --git a/crates/parser/compilation_unit.rs b/crates/parser/compilation_unit.rs deleted file mode 100644 index 93b1777..0000000 --- a/crates/parser/compilation_unit.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Defines the compilation unit, comments, and source locations. - -mod compilation_unit; -pub use compilation_unit::*; -mod comment; -pub use comment::*; -mod location; -pub use location::*; \ No newline at end of file diff --git a/crates/parser/compilation_unit/comment.rs b/crates/parser/compilation_unit/comment.rs deleted file mode 100644 index 6046ab7..0000000 --- a/crates/parser/compilation_unit/comment.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::ns::*; - -pub struct Comment { - pub(crate) multiline: bool, - pub(crate) content: RefCell, - pub(crate) location: RefCell, -} - -impl Comment { - pub fn new(multiline: bool, content: String, location: Location) -> Self { - Self { - multiline, - content: RefCell::new(content), - location: RefCell::new(location), - } - } - - pub fn multiline(&self) -> bool { - self.multiline - } - - /// The content of the comment. - /// * If it is a multi-line comment, it includes all the characters after `/*` until `*/` (exclusive). - /// * If it is a single-line comment, it includes all the characters after `//` - /// until the next line terminator (exclusive) or end of program. - pub fn content(&self) -> String { - self.content.borrow().clone() - } - - pub fn set_content(&self, content: String) { - self.content.replace(content); - } - - pub fn location(&self) -> Location { - self.location.borrow().clone() - } - - pub fn set_location(&self, location: Location) { - self.location.replace(location); - } - - /// Indicates whether the comment is an AsDoc comment preceding - /// a specific location. - pub fn is_asdoc(&self, location_to_precede: &Location) -> bool { - if self.multiline && self.content.borrow().starts_with('*') { - let mut i: usize = self.location.borrow().last_offset; - for (i_1, ch) in self.location.borrow().compilation_unit().text()[i..].char_indices() { - i = i_1; - if !(CharacterValidator::is_whitespace(ch) || CharacterValidator::is_line_terminator(ch)) { - break; - } - } - i += self.location.borrow().last_offset; - location_to_precede.first_offset == i - } else { - false - } - } -} \ No newline at end of file diff --git a/crates/parser/compilation_unit/compilation_unit.rs b/crates/parser/compilation_unit/compilation_unit.rs deleted file mode 100644 index fe900a5..0000000 --- a/crates/parser/compilation_unit/compilation_unit.rs +++ /dev/null @@ -1,245 +0,0 @@ -use std::{any::Any, cell::RefMut}; -use crate::ns::*; -use hydroper_source_text::SourceText; - -/// `CompilationUnit` identifies an AS3 compilation unit and contains -/// a source text. -pub struct CompilationUnit { - pub(crate) file_path: Option, - pub(crate) source_text: SourceText, - pub(crate) compiler_options: RefCell>>, - pub(crate) diagnostics: RefCell>, - pub(crate) error_count: Cell, - pub(crate) warning_count: Cell, - pub(crate) invalidated: Cell, - pub(crate) comments: RefCell>>, - pub(crate) included_from: RefCell>>, - pub(crate) nested_compilation_units: RefCell>>, -} - -impl Default for CompilationUnit { - fn default() -> Self { - Self { - file_path: None, - source_text: SourceText::new("".into()), - compiler_options: RefCell::new(None), - diagnostics: RefCell::new(vec![]), - invalidated: Cell::new(false), - error_count: Cell::new(0), - warning_count: Cell::new(0), - comments: RefCell::new(vec![]), - nested_compilation_units: RefCell::new(vec![]), - included_from: RefCell::new(None), - } - } -} - -impl CompilationUnit { - /// Constructs a source file in unparsed and non verified state. - pub fn new(file_path: Option, text: String) -> Rc { - Rc::new(Self { - file_path, - source_text: SourceText::new(text), - compiler_options: RefCell::new(None), - diagnostics: RefCell::new(vec![]), - invalidated: Cell::new(false), - error_count: Cell::new(0), - warning_count: Cell::new(0), - comments: RefCell::new(vec![]), - nested_compilation_units: RefCell::new(vec![]), - included_from: RefCell::new(None), - }) - } - - /// File path of the source or `None` if not a file. - pub fn file_path(&self) -> Option { - self.file_path.clone() - } - - /// Source text. - pub fn text(&self) -> &String { - &self.source_text.contents - } - - /// Compiler options. - pub fn compiler_options(&self) -> Option> { - self.compiler_options.borrow().clone() - } - - /// Set compiler options. - pub fn set_compiler_options(&self, options: Option>) { - self.compiler_options.replace(options); - } - - /// Whether the source contains any errors after parsing - /// and/or verification. - pub fn invalidated(&self) -> bool { - self.invalidated.get() - } - - /// The comments present in the source file. To get mutable access to the - /// collection of comments, use the `comments_mut()` method instead. - pub fn comments(&self) -> Vec> { - let mut collection = vec![]; - for c in self.comments.borrow().iter() { - collection.push(c.clone()); - } - collection - } - - /// The comments present in the source file, as a mutable collection. - pub fn comments_mut(&self) -> RefMut>> { - self.comments.borrow_mut() - } - - /// Contributes a comment if there is no other comment - /// in the same location. - pub fn add_comment(&self, comment: Rc) { - let mut dup = false; - let i = comment.location.borrow().first_offset(); - for c1 in self.comments.borrow().iter() { - if c1.location.borrow().first_offset == i { - dup = true; - break; - } - } - if !dup { - self.comments.borrow_mut().push(comment); - } - } - - /// Diagnostics of the source file after parsing and/or - /// verification. - pub fn diagnostics(&self) -> Vec { - self.diagnostics.borrow().clone() - } - - /// Diagnostics of the source file after parsing and/or - /// verification, including those of nested compilation units. - pub fn nested_diagnostics(&self) -> Vec { - let mut result = self.diagnostics(); - for unit in self.nested_compilation_units.borrow().iter() { - result.extend(unit.nested_diagnostics()); - } - result - } - - /// Sort diagnostics from the compilation unit - /// and any nested compilation units. - pub fn sort_diagnostics(&self) { - self.diagnostics.borrow_mut().sort(); - for unit in self.nested_compilation_units.borrow().iter() { - unit.sort_diagnostics(); - } - } - - /// Determines whether to skip contributing an error when it - /// occurs at the same offset of another error. - pub fn prevent_equal_offset_error(&self, location: &Location) -> bool { - let diag_list = self.diagnostics.borrow(); - for diag in diag_list.iter() { - if diag.is_warning() { - continue; - } - if diag.location.first_offset == location.first_offset { - return true; - } - } - false - } - - /// Determines whether to skip contributing a warning when it - /// occurs at the same offset of another warning. - pub fn prevent_equal_offset_warning(&self, location: &Location) -> bool { - let diag_list = self.diagnostics.borrow(); - for diag in diag_list.iter() { - if diag.is_error() { - continue; - } - if diag.location.first_offset == location.first_offset { - return true; - } - } - false - } - - /// If this compilation unit is subsequent of an include directive in another - /// compilation unit, returns the compilation unit of that include directive. - pub fn included_from(&self) -> Option> { - self.included_from.borrow().clone() - } - - pub(crate) fn set_included_from(&self, included_from: Option>) { - self.included_from.replace(included_from); - } - - pub(crate) fn include_directive_is_circular(&self, file_path: &str) -> bool { - if canonicalize_path(&self.file_path.clone().unwrap_or("".into())) == canonicalize_path(file_path) { - return true; - } - if let Some(included_from) = self.included_from() { - return included_from.include_directive_is_circular(file_path); - } - return false; - } - - pub fn nested_compilation_units(&self) -> Vec> { - let mut result = vec![]; - for unit in self.nested_compilation_units.borrow().iter() { - result.push(unit.clone()); - } - result - } - - pub fn add_nested_compilation_unit(&self, unit: Rc) { - self.nested_compilation_units.borrow_mut().push(unit); - } - - pub fn add_diagnostic(&self, diagnostic: Diagnostic) { - if diagnostic.is_warning() { - self.warning_count.set(self.warning_count.get() + 1); - } else { - self.error_count.set(self.error_count.get() + 1); - self.invalidated.set(true); - } - self.diagnostics.borrow_mut().push(diagnostic); - } - - pub fn error_count(&self) -> u32 { - self.error_count.get() - } - - pub fn warning_count(&self) -> u32 { - self.warning_count.get() - } - - /// Retrieves line number from an offset. The resulting line number - /// is counted from one. - pub fn get_line_number(&self, offset: usize) -> usize { - self.source_text.get_line_number(offset) - } - - /// Returns the zero based column of an offset. - pub fn get_column(&self, offset: usize) -> usize { - self.source_text.get_column(offset) - } - - /// Retrieves offset from line number (counted from one). - pub fn get_line_offset(&self, line: usize) -> Option { - self.source_text.get_line_offset(line) - } - - /// Retrieves the offset from the corresponding line of an offset. - pub fn get_line_offset_from_offset(&self, offset: usize) -> usize { - self.source_text.get_line_offset_from_offset(offset) - } - - pub fn get_line_indent(&self, line: usize) -> usize { - let line_offset = self.get_line_offset(line).unwrap(); - CharacterValidator::indent_count(&self.source_text.contents[line_offset..]) - } -} - -fn canonicalize_path(path: &str) -> String { - std::path::Path::new(path).canonicalize().unwrap_or(std::path::PathBuf::new()).to_string_lossy().into_owned() -} \ No newline at end of file diff --git a/crates/parser/compilation_unit/location.rs b/crates/parser/compilation_unit/location.rs deleted file mode 100644 index 44d46ed..0000000 --- a/crates/parser/compilation_unit/location.rs +++ /dev/null @@ -1,176 +0,0 @@ -use std::cmp::Ordering; -use std::fmt::Debug; -use serde::{Serialize, Deserialize, Serializer}; -use std::rc::Rc; -use crate::compilation_unit::*; -use crate::util::{CharacterReader, count_first_whitespace_characters}; - -/// Represents a source location. This location includes -/// spanning lines and columns and the reference compilation unit. -#[derive(Clone, Deserialize)] -pub struct Location { - /// The compilation unit that this location belongs to. - #[serde(skip)] - pub(crate) compilation_unit: Rc, - - /// First UTF-8 offset. - #[serde(skip)] - pub(crate) first_offset: usize, - - /// Last UTF-8 offset. - #[serde(skip)] - pub(crate) last_offset: usize, -} - -impl Serialize for Location { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&format!("{}:{}-{}:{}", self.first_line_number(), self.first_column() + 1, self.last_line_number(), self.last_column() + 1)) - } -} - -impl Debug for Location { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, - "Location(first_line_number={}, first_column={}, first_offset={}, last_line_number={}, last_column={}, last_offset={})", - self.first_line_number(), - self.first_column(), - self.first_offset, - self.last_line_number(), - self.last_column(), - self.last_offset - ) - } -} - -impl Eq for Location {} - -impl PartialEq for Location { - fn eq(&self, other: &Self) -> bool { - Rc::ptr_eq(&self.compilation_unit, &other.compilation_unit) && - self.first_offset == other.first_offset && - self.last_offset == other.last_offset - } -} - -impl Ord for Location { - fn cmp(&self, other: &Self) -> Ordering { - self.partial_cmp(other).unwrap_or(Ordering::Equal) - } -} - -impl PartialOrd for Location { - fn partial_cmp(&self, other: &Self) -> Option { - self.first_offset.partial_cmp(&other.first_offset) - } -} - -impl Location { - /// Builds a location. - pub fn with_offsets( - compilation_unit: &Rc, - first_offset: usize, - last_offset: usize, - ) -> Self { - Self { - compilation_unit: compilation_unit.clone(), - first_offset, - last_offset, - } - } - - /// Builds a location. - pub fn with_offset(compilation_unit: &Rc, offset: usize) -> Self { - Self::with_offsets(compilation_unit, offset, offset) - } - - /// Build a location by combining two locations. `self` - /// serves as the first location, while `other` serves as the - /// last location. - pub fn combine_with(&self, other: Location) -> Self { - Self { - compilation_unit: self.compilation_unit.clone(), - first_offset: self.first_offset, - last_offset: other.last_offset, - } - } - - /// Build a location by combining two locations. `self` - /// serves as the first location, while the first column and first line - /// of `other` serve as the last location. - pub fn combine_with_start_of(&self, other: Location) -> Self { - Self { - compilation_unit: self.compilation_unit.clone(), - first_offset: self.first_offset, - last_offset: other.first_offset, - } - } - - /// The compilation unit that this location belongs to. - pub fn compilation_unit(&self) -> Rc { - self.compilation_unit.clone() - } - - /// First line number, counted from one. - pub fn first_line_number(&self) -> usize { - self.compilation_unit.get_line_number(self.first_offset) - } - - /// Last line number, counted from one. - pub fn last_line_number(&self) -> usize { - self.compilation_unit.get_line_number(self.last_offset) - } - - // The first byte offset of this location. - pub fn first_offset(&self) -> usize { - self.first_offset - } - - // The last byte offset of this location. - pub fn last_offset(&self) -> usize { - self.last_offset - } - - /// Zero based first column of the location in code points. - pub fn first_column(&self) -> usize { - self.compilation_unit.get_column(self.first_offset) - } - - /// Zero based last column of the location in code points. - pub fn last_column(&self) -> usize { - self.compilation_unit.get_column(self.last_offset) - } - - pub fn character_count(&self) -> usize { - self.compilation_unit.text()[self.first_offset..self.last_offset].chars().count() - } - - /// Indicates whether a previous location and a next location - /// have a line break in between. - pub fn line_break(&self, other: &Self) -> bool { - self.last_line_number() != other.first_line_number() - } - - /// Returns the source text comprising the source location. - pub fn text(&self) -> String { - self.compilation_unit.text()[self.first_offset..self.last_offset].to_owned() - } - - /// Shifts a count of characters off this location until end-of-file. - pub fn shift_until_eof(&self, count: usize) -> Location { - let mut ch = CharacterReader::from(&self.compilation_unit.text()[self.first_offset..]); - for _ in 0..count { - if ch.next().is_none() { - break; - } - } - Self::with_offsets(&self.compilation_unit, self.first_offset + ch.index(), self.last_offset) - } - - /// Shifts the count of whitespace characters in a text off this location. - pub fn shift_whitespace(&self, text: &str) -> Location { - self.shift_until_eof(count_first_whitespace_characters(text)) - } -} \ No newline at end of file diff --git a/crates/parser/diagnostics.rs b/crates/parser/diagnostics.rs deleted file mode 100644 index 34522bf..0000000 --- a/crates/parser/diagnostics.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! Defines the diagnostics produced by the parser. - -mod diagnostics; -pub use diagnostics::*; -mod diagnostic_kind; -pub use diagnostic_kind::*; \ No newline at end of file diff --git a/crates/parser/diagnostics/diagnostic_kind.rs b/crates/parser/diagnostics/diagnostic_kind.rs deleted file mode 100644 index 6931fe4..0000000 --- a/crates/parser/diagnostics/diagnostic_kind.rs +++ /dev/null @@ -1,77 +0,0 @@ -#[repr(i32)] -#[derive(Eq, PartialEq, Clone, Copy)] -pub enum DiagnosticKind { - InvalidEscapeValue = 1024, - UnexpectedEnd = 1025, - UnallowedNumericSuffix = 1026, - StringLiteralMustBeTerminatedBeforeLineBreak = 1027, - Expecting = 1028, - ExpectingIdentifier = 1029, - ExpectingExpression = 1030, - ExpectingXmlName = 1031, - ExpectingXmlAttributeValue = 1032, - IllegalNullishCoalescingLeftOperand = 1033, - WrongParameterPosition = 1034, - DuplicateRestParameter = 1035, - NotAllowedHere = 1036, - MalformedRestParameter = 1037, - IllegalForInInitializer = 1038, - MultipleForInBindings = 1039, - UndefinedLabel = 1040, - IllegalContinue = 1041, - IllegalBreak = 1042, - ExpressionMustNotFollowLineBreak = 1043, - TokenMustNotFollowLineBreak = 1044, - ExpectingStringLiteral = 1045, - DuplicateAttribute = 1046, - DuplicateAccessModifier = 1047, - ExpectingDirectiveKeyword = 1048, - UnallowedAttribute = 1049, - UseDirectiveMustContainPublic = 1050, - MalformedEnumMember = 1051, - FunctionMayNotBeGenerator = 1052, - FunctionMayNotBeAsynchronous = 1053, - FunctionMustNotContainBody = 1054, - FunctionMustContainBody = 1055, - FunctionMustNotContainAnnotations = 1056, - NestedClassesNotAllowed = 1057, - UnexpectedDirective = 1058, - FailedParsingAsDocTag = 1059, - UnrecognizedAsDocTag = 1060, - UnrecognizedProxy = 1061, - EnumMembersMustBeConst = 1062, - ConstructorMustNotSpecifyResultType = 1063, - UnrecognizedMetadataSyntax = 1064, - FailedToIncludeFile = 1065, - ParentSourceIsNotAFile = 1066, - CircularIncludeDirective = 1067, - MalformedDestructuring = 1068, - XmlPrefixNotDefined = 1069, - RedefiningXmlAttribute = 1070, - InvalidXmlPi = 1071, - XmlPiUnknownAttribute = 1072, - XmlPiVersion = 1073, - XmlPiEncoding = 1074, - XmlMustConsistOfExactly1Element = 1075, - XmlNameAtMostOneColon = 1076, - UnexpectedCharacter = 1077, - InputEndedBeforeReachingClosingQuoteForString = 1078, - InputEndedBeforeReachingClosingSeqForCData = 1079, - InputEndedBeforeReachingClosingSeqForPi = 1080, - InputEndedBeforeReachingClosingSeqForXmlComment = 1081, - InputEndedBeforeReachingClosingSeqForMultiLineComment = 1082, - InputEndedBeforeReachingClosingSlashForRegExp = 1083, - InputEndedBeforeReachingClosingQuoteForAttributeValue = 1084, - ExpectingEitherSemicolonOrNewLineHere = 1085, - CssInvalidHexEscape = 1086, - ExpectingDirective = 1087, - ExpectingStatement = 1088, - Unexpected = 1089, - XmlClosingTagNameMustBeEquals = 1090, -} - -impl DiagnosticKind { - pub fn id(&self) -> i32 { - *self as i32 - } -} \ No newline at end of file diff --git a/crates/parser/diagnostics/diagnostics.rs b/crates/parser/diagnostics/diagnostics.rs deleted file mode 100644 index 351b58c..0000000 --- a/crates/parser/diagnostics/diagnostics.rs +++ /dev/null @@ -1,175 +0,0 @@ -use std::any::Any; - -use maplit::hashmap; -use crate::ns::*; - -#[path = "diagnostics_english_resources.rs"] -mod diagnostics_english_resources; - -/// Represents a diagnostic originated from a compilation unit. -/// -/// Arguments are formatted using integer keys counted from 1 (one). -#[derive(Clone)] -pub struct Diagnostic { - pub(crate) location: Location, - pub(crate) kind: DiagnosticKind, - pub(crate) is_warning: bool, - pub(crate) is_verify_error: bool, - pub(crate) arguments: Vec>, - pub(crate) custom_kind: RefCell>>, -} - -impl Eq for Diagnostic {} - -impl PartialEq for Diagnostic { - fn eq(&self, other: &Self) -> bool { - self.location == other.location && - self.kind == other.kind - } -} - -impl Ord for Diagnostic { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.location.cmp(&other.location) - } -} - -impl PartialOrd for Diagnostic { - fn partial_cmp(&self, other: &Self) -> Option { - self.location.partial_cmp(&other.location) - } -} - -impl Diagnostic { - pub fn new_syntax_error(location: &Location, kind: DiagnosticKind, arguments: Vec>) -> Self { - Self { - location: location.clone(), - kind, - is_verify_error: false, - is_warning: false, - arguments, - custom_kind: RefCell::new(None), - } - } - - pub fn new_verify_error(location: &Location, kind: DiagnosticKind, arguments: Vec>) -> Self { - Self { - location: location.clone(), - kind, - is_verify_error: true, - is_warning: false, - arguments, - custom_kind: RefCell::new(None), - } - } - - pub fn new_warning(location: &Location, kind: DiagnosticKind, arguments: Vec>) -> Self { - Self { - location: location.clone(), - kind, - is_verify_error: false, - is_warning: true, - arguments, - custom_kind: RefCell::new(None), - } - } - - pub fn location(&self) -> Location { - self.location.clone() - } - - pub fn kind(&self) -> DiagnosticKind { - self.kind.clone() - } - - pub fn is_warning(&self) -> bool { - self.is_warning - } - - pub fn is_error(&self) -> bool { - !self.is_warning - } - - pub fn is_syntax_error(&self) -> bool { - !self.is_verify_error && !self.is_warning - } - - pub fn is_verify_error(&self) -> bool { - self.is_verify_error - } - - pub fn arguments(&self) -> Vec> { - self.arguments.clone() - } - - pub fn id(&self) -> i32 { - self.kind.id() - } - - pub fn custom_kind(&self) -> Option> { - self.custom_kind.borrow().clone() - } - - pub fn set_custom_kind(&self, id: Option>) { - self.custom_kind.replace(id); - } - - /// Formats the diagnostic by overriding the message text. - pub fn format_with_message(&self, message: &str, id: Option) -> String { - let category = (if self.is_verify_error { - "Verify error" - } else if self.is_warning { - "Warning" - } else { - "Syntax error" - }).to_owned(); - - let file_path = self.location.compilation_unit.file_path.clone().map_or("".to_owned(), |s| format!("{s}:")); - let line = self.location.first_line_number(); - let column = self.location.first_column() + 1; - if let Some(id) = id { - format!("{file_path}{line}:{column}: {category} #{}: {message}", id.to_string()) - } else { - format!("{file_path}{line}:{column}: {category}: {message}") - } - } - - /// Formats the diagnostic in English. - pub fn format_english(&self) -> String { - self.format_with_message(&self.format_message_english(), Some(self.id())) - } - - pub fn format_message_english(&self) -> String { - self.format_message(&diagnostics_english_resources::DATA) - } - - pub fn format_message(&self, messages: &HashMap) -> String { - let mut string_arguments: HashMap = hashmap!{}; - let mut i = 1; - for argument in &self.arguments { - string_arguments.insert(i.to_string(), argument.to_string()); - i += 1; - } - use late_format::LateFormat; - let Some(msg) = messages.get(&self.id()) else { - let id = self.id(); - panic!("Message resource is missing for ID {id}"); - }; - msg.late_format(string_arguments) - } -} - -/// The `diagarg![...]` literal is used for initializing -/// diagnostic arguments. -/// -/// For example: `diagarg![token, "foo".to_owned()]`. -pub macro diagarg { - ($($value:expr),*) => { vec![ $(Rc::new($value)),* ] }, -} - -pub trait DiagnosticArgument: Any + ToString + 'static { -} - -impl DiagnosticArgument for String {} - -impl DiagnosticArgument for Token {} \ No newline at end of file diff --git a/crates/parser/diagnostics/diagnostics_english_resources.rs b/crates/parser/diagnostics/diagnostics_english_resources.rs deleted file mode 100644 index dd28ee6..0000000 --- a/crates/parser/diagnostics/diagnostics_english_resources.rs +++ /dev/null @@ -1,76 +0,0 @@ -use lazy_static::lazy_static; -use maplit::hashmap; -use crate::ns::*; - -lazy_static! { - pub static ref DATA: HashMap = hashmap! { - // DiagnosticKind::K.id() => ".".into(), - DiagnosticKind::InvalidEscapeValue.id() => "Invalid escape value.".into(), - DiagnosticKind::UnexpectedEnd.id() => "Unexpected end-of-file.".into(), - DiagnosticKind::UnallowedNumericSuffix.id() => "Unallowed numeric suffix.".into(), - DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak.id() => "A string literal must be terminated before the line break.".into(), - DiagnosticKind::Expecting.id() => "Expecting {1} before {2}.".into(), - DiagnosticKind::ExpectingIdentifier.id() => "Expecting identifier before {1}.".into(), - DiagnosticKind::ExpectingExpression.id() => "Expecting expression before {1}.".into(), - DiagnosticKind::ExpectingXmlName.id() => "Expecting XML name before {1}.".into(), - DiagnosticKind::ExpectingXmlAttributeValue.id() => "Expecting XML attribute value before {1}.".into(), - DiagnosticKind::IllegalNullishCoalescingLeftOperand.id() => "Illegal nullish coalescing left operand.".into(), - DiagnosticKind::WrongParameterPosition.id() => "Wrong parameter position.".into(), - DiagnosticKind::DuplicateRestParameter.id() => "Duplicate rest parameter.".into(), - DiagnosticKind::NotAllowedHere.id() => "{1} not allowed here.".into(), - DiagnosticKind::MalformedRestParameter.id() => "Malformed rest parameter.".into(), - DiagnosticKind::IllegalForInInitializer.id() => "Illegal 'for..in' initializer.".into(), - DiagnosticKind::MultipleForInBindings.id() => "Multiple 'for..in' bindings are not allowed.".into(), - DiagnosticKind::UndefinedLabel.id() => "Undefined label '{1}'.".into(), - DiagnosticKind::IllegalContinue.id() => "Illegal continue statement.".into(), - DiagnosticKind::IllegalBreak.id() => "Illegal break statement.".into(), - DiagnosticKind::ExpressionMustNotFollowLineBreak.id() => "Expression must not follow line break.".into(), - DiagnosticKind::TokenMustNotFollowLineBreak.id() => "Token must not follow line break.".into(), - DiagnosticKind::ExpectingStringLiteral.id() => "Expecting string literal before {1}.".into(), - DiagnosticKind::DuplicateAttribute.id() => "Duplicate attribute.".into(), - DiagnosticKind::DuplicateAccessModifier.id() => "Duplicate access modifier.".into(), - DiagnosticKind::ExpectingDirectiveKeyword.id() => "Expecting either 'var', 'const', 'function', 'class' or 'interface'.".into(), - DiagnosticKind::UnallowedAttribute.id() => "Unallowed attribute.".into(), - DiagnosticKind::UseDirectiveMustContainPublic.id() => "Use directive must contain the 'public' attribute.".into(), - DiagnosticKind::MalformedEnumMember.id() => "Malformed enumeration member.".into(), - DiagnosticKind::FunctionMayNotBeGenerator.id() => "Function may not be generator.".into(), - DiagnosticKind::FunctionMayNotBeAsynchronous.id() => "Function may not be asynchronous.".into(), - DiagnosticKind::FunctionMustNotContainBody.id() => "Function must not contain body.".into(), - DiagnosticKind::FunctionMustContainBody.id() => "Function must contain body.".into(), - DiagnosticKind::FunctionMustNotContainAnnotations.id() => "Function must not contain annotations.".into(), - DiagnosticKind::NestedClassesNotAllowed.id() => "Nested classes are not allowed.".into(), - DiagnosticKind::UnexpectedDirective.id() => "Unexpected directive.".into(), - DiagnosticKind::FailedParsingAsDocTag.id() => "Failed parsing contents of ASDoc tag: '@{1}'.".into(), - DiagnosticKind::UnrecognizedAsDocTag.id() => "Unrecognized ASDoc tag: '@{1}'.".into(), - DiagnosticKind::UnrecognizedProxy.id() => "Unrecognized proxy: '{1}'.".into(), - DiagnosticKind::EnumMembersMustBeConst.id() => "Enumeration members must be 'const'.".into(), - DiagnosticKind::UnrecognizedMetadataSyntax.id() => "Unrecognized meta-data syntax.".into(), - DiagnosticKind::FailedToIncludeFile.id() => "Failed to include file.".into(), - DiagnosticKind::ParentSourceIsNotAFile.id() => "Parent source is not a file.".into(), - DiagnosticKind::CircularIncludeDirective.id() => "Circular include directive.".into(), - DiagnosticKind::MalformedDestructuring.id() => "Malformed destructuring.".into(), - DiagnosticKind::XmlPrefixNotDefined.id() => "Prefix not defined: '{1}'.".into(), - DiagnosticKind::RedefiningXmlAttribute.id() => "Redefining attribute: '{1}'.".into(), - DiagnosticKind::InvalidXmlPi.id() => "Invalid processing instruction.".into(), - DiagnosticKind::XmlPiUnknownAttribute.id() => "Unknown attribute at processing instruction: '{1}'.".into(), - DiagnosticKind::XmlPiVersion.id() => "XML version must be '1.0'.".into(), - DiagnosticKind::XmlPiEncoding.id() => "XML encoding must be either 'utf-8' or 'utf-16'.".into(), - DiagnosticKind::XmlMustConsistOfExactly1Element.id() => "Document must consist of exactly one element.".into(), - DiagnosticKind::XmlNameAtMostOneColon.id() => "XML name may have at most one colon.".into(), - DiagnosticKind::UnexpectedCharacter.id() => "Unexpected character. '{1}' is not allowed here".into(), - DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString.id() => "Input ended before reaching the closing quotation mark for a string literal.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForCData.id() => "Input ended before reaching the closing ']]>' for a CDATA.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForPi.id() => "Input ended before reaching the closing '?>' for a processing instruction.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForXmlComment.id() => "Input ended before reaching the closing '-->' for a comment.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment.id() => "Input ended before reaching the closing '*/' for a comment.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp.id() => "Input ended before reaching the closing slash for a regular expression.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingQuoteForAttributeValue.id() => "Input ended before reaching the closing quotation mark for an attribute value.".into(), - DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere.id() => "Expecting either a semicolon or a new line here.".into(), - DiagnosticKind::CssInvalidHexEscape.id() => "Invalid hexadecimal escape: '\\{1}'.".into(), - DiagnosticKind::ExpectingDirective.id() => "Expecting directive before {1}.".into(), - DiagnosticKind::ExpectingStatement.id() => "Expecting statement before {1}.".into(), - DiagnosticKind::Unexpected.id() => "Unexpected {1}.".into(), - DiagnosticKind::XmlClosingTagNameMustBeEquals.id() => "Closing tag name must be equals '{1}'.".into(), - // DiagnosticKind::K.id() => ".".into(), - }; -} diff --git a/crates/parser/lib.rs b/crates/parser/lib.rs deleted file mode 100644 index c82a279..0000000 --- a/crates/parser/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![feature(decl_macro)] -#![feature(try_blocks)] - -pub mod tree; -pub mod compilation_unit; -pub mod diagnostics; -pub mod operator; -pub mod parser; -pub mod util; - -pub mod ns; \ No newline at end of file diff --git a/crates/parser/ns.rs b/crates/parser/ns.rs deleted file mode 100644 index 09adc4b..0000000 --- a/crates/parser/ns.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! The `ns` module is an union of all of the parser modules. - -pub use crate::tree::*; -pub use crate::compilation_unit::*; -pub use crate::diagnostics::*; -pub use crate::operator::*; -pub use crate::parser::*; -pub use crate::util::*; \ No newline at end of file diff --git a/crates/parser/operator.rs b/crates/parser/operator.rs deleted file mode 100644 index bbad3db..0000000 --- a/crates/parser/operator.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! Defines the ActionScript 3 operators. - -mod operator; -pub use operator::*; -mod operator_precedence; -pub use operator_precedence::*; \ No newline at end of file diff --git a/crates/parser/operator/operator.rs b/crates/parser/operator/operator.rs deleted file mode 100644 index 69cd19a..0000000 --- a/crates/parser/operator/operator.rs +++ /dev/null @@ -1,127 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents an ActionScript operator. -#[derive(Copy, Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub enum Operator { - PostIncrement, - PostDecrement, - NonNull, - Delete, - Void, - Typeof, - Await, - Yield, - PreIncrement, - PreDecrement, - Positive, - Negative, - BitwiseNot, - LogicalNot, - - Power, - Multiply, - Divide, - Remainder, - Add, - Subtract, - ShiftLeft, - ShiftRight, - ShiftRightUnsigned, - Lt, - Gt, - Le, - Ge, - Instanceof, - In, - NotIn, - Is, - IsNot, - As, - Equals, - NotEquals, - StrictEquals, - StrictNotEquals, - BitwiseAnd, - BitwiseXor, - BitwiseOr, - LogicalAnd, - LogicalXor, - LogicalOr, - NullCoalescing, -} - -/// Represents binary operator associativity. -#[derive(Copy, Clone, PartialEq, Eq)] -pub enum BinaryAssociativity { - LeftToRight, - RightToLeft, -} - -/// Represents an ActionScript binary operator. -#[derive(Copy, Clone, PartialEq, Eq)] -pub struct BinaryOperator(pub Operator, pub OperatorPrecedence, pub BinaryAssociativity); - -impl BinaryOperator { - pub fn operator(&self) -> Operator { - self.0 - } - - pub fn precedence(&self) -> OperatorPrecedence { - self.1 - } - - pub fn associativity(&self) -> BinaryAssociativity { - self.2 - } - - pub fn right_precedence(&self) -> OperatorPrecedence { - if self.operator() == Operator::NullCoalescing { - OperatorPrecedence::BitwiseOr - } else { - self.precedence().add(if self.associativity() == BinaryAssociativity::LeftToRight { 1 } else { 0 }).unwrap() - } - } -} - -impl TryFrom for BinaryOperator { - type Error = (); - /// Constructs `BinaryOperator` from abstract operator. - fn try_from(value: Operator) -> Result { - match value { - Operator::Multiply => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Divide => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Remainder => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Add => Ok(BinaryOperator(value, OperatorPrecedence::Additive, BinaryAssociativity::LeftToRight)), - Operator::Subtract => Ok(BinaryOperator(value, OperatorPrecedence::Additive, BinaryAssociativity::LeftToRight)), - Operator::ShiftLeft => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::ShiftRight => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::ShiftRightUnsigned => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::Lt => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Gt => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Le => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Ge => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::As => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::In => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::NotIn => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Instanceof => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Is => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::IsNot => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Equals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::NotEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::StrictEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::StrictNotEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::BitwiseAnd => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseAnd, BinaryAssociativity::LeftToRight)), - Operator::BitwiseXor => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseXor, BinaryAssociativity::LeftToRight)), - Operator::BitwiseOr => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseOr, BinaryAssociativity::LeftToRight)), - Operator::LogicalAnd => Ok(BinaryOperator(value, OperatorPrecedence::LogicalAnd, BinaryAssociativity::LeftToRight)), - Operator::LogicalXor => Ok(BinaryOperator(value, OperatorPrecedence::LogicalXor, BinaryAssociativity::LeftToRight)), - Operator::LogicalOr => Ok(BinaryOperator(value, OperatorPrecedence::LogicalOrAndOther, BinaryAssociativity::LeftToRight)), - Operator::NullCoalescing => Ok(BinaryOperator(value, OperatorPrecedence::LogicalOrAndOther, BinaryAssociativity::LeftToRight)), - - Operator::Power => Ok(BinaryOperator(value, OperatorPrecedence::Exponentiation, BinaryAssociativity::RightToLeft)), - - _ => Err(()), - } - } -} \ No newline at end of file diff --git a/crates/parser/operator/operator_precedence.rs b/crates/parser/operator/operator_precedence.rs deleted file mode 100644 index 68b0abe..0000000 --- a/crates/parser/operator/operator_precedence.rs +++ /dev/null @@ -1,77 +0,0 @@ -use num_derive::FromPrimitive; -use num_traits::FromPrimitive; - -#[derive(FromPrimitive)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[repr(u32)] -pub enum OperatorPrecedence { - Postfix = 16, - Unary = 15, - Exponentiation = 14, - Multiplicative = 13, - Additive = 12, - Shift = 11, - Relational = 10, - Equality = 9, - BitwiseAnd = 8, - BitwiseXor = 7, - BitwiseOr = 6, - LogicalAnd = 5, - LogicalXor = 4, - /// Includes logical OR and nullish coalescing (`??`). - LogicalOrAndOther = 3, - /// Includes assignment operators, conditional operator, function expression and `yield` operator. - AssignmentAndOther = 2, - List = 1, -} - -impl OperatorPrecedence { - pub fn add(&self, value: u32) -> Option { - FromPrimitive::from_u32(*self as u32 + value) - } - - pub fn value_of(&self) -> u32 { - *self as u32 - } - - pub fn includes(&self, other: &Self) -> bool { - *self <= *other - } -} - -impl TryFrom for OperatorPrecedence { - type Error = (); - fn try_from(value: u32) -> Result { - if let Some(v) = FromPrimitive::from_u32(value as u32) { Ok(v) } else { Err(()) } - } -} - -#[derive(FromPrimitive)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[repr(u32)] -pub enum CssOperatorPrecedence { - Unary = 3, - MultiValue = 2, - Array = 1, -} - -impl CssOperatorPrecedence { - pub fn add(&self, value: u32) -> Option { - FromPrimitive::from_u32(*self as u32 + value) - } - - pub fn value_of(&self) -> u32 { - *self as u32 - } - - pub fn includes(&self, other: &Self) -> bool { - *self <= *other - } -} - -impl TryFrom for CssOperatorPrecedence { - type Error = (); - fn try_from(value: u32) -> Result { - if let Some(v) = FromPrimitive::from_u32(value as u32) { Ok(v) } else { Err(()) } - } -} \ No newline at end of file diff --git a/crates/parser/parser.rs b/crates/parser/parser.rs deleted file mode 100644 index 897a3e2..0000000 --- a/crates/parser/parser.rs +++ /dev/null @@ -1,23 +0,0 @@ -//! Defines the parser and the tokenizer. -//! -//! Using the methods of the `ParserFacade` structure is the most common way of parsing -//! programs until end-of-file. - -mod character_validator; -pub use character_validator::*; -mod context; -pub use context::*; -mod reserved_word; -pub use reserved_word::*; -mod parser; -pub use parser::*; -mod css_parser; -pub use css_parser::*; -mod css_tokenizer; -pub use css_tokenizer::*; -mod parser_error; -pub use parser_error::*; -mod token; -pub use token::*; -mod tokenizer; -pub use tokenizer::*; \ No newline at end of file diff --git a/crates/parser/parser/character_validator.rs b/crates/parser/parser/character_validator.rs deleted file mode 100644 index ef06b61..0000000 --- a/crates/parser/parser/character_validator.rs +++ /dev/null @@ -1,147 +0,0 @@ -//use lazy_regex::{Lazy, Regex, lazy_regex}; -use unicode_general_category::{get_general_category, GeneralCategory}; - -// pub(crate) static CR_OR_CRLF_REGEX: Lazy = lazy_regex!(r"\r\n?"); - -/// The `CharacterValidator` structure defines static methods for character -/// validation. -pub struct CharacterValidator; - -impl CharacterValidator { - /// Returns the count of indentation characters in a string. - pub fn indent_count(string: &str) -> usize { - let mut n: usize = 0; - for ch in string.chars() { - if !CharacterValidator::is_whitespace(ch) { - break; - } - n += 1; - } - n - } - - pub fn is_whitespace(ch: char) -> bool { - if ch == '\x20' || ch == '\x09' || ch == '\x08' - || ch == '\x0C' || ch == '\u{A0}' { - return true; - } - let category = get_general_category(ch); - category == GeneralCategory::SpaceSeparator - } - - pub fn is_line_terminator(ch: char) -> bool { - ch == '\x0A' || ch == '\x0D' || ch == '\u{2028}' || ch == '\u{2029}' - } - - pub fn is_bin_digit(ch: char) -> bool { - ch == '\x30' || ch == '\x31' - } - - pub fn is_dec_digit(ch: char) -> bool { - ch >= '\x30' && ch <= '\x39' - } - - pub fn is_hex_digit(ch: char) -> bool { - CharacterValidator::is_dec_digit(ch) || (ch >= '\x41' && ch <= '\x46') || (ch >= '\x61' && ch <= '\x66') - } - - /// Returns the mathematical value of a hexadecimal digit. - pub fn hex_digit_mv(ch: char) -> Option { - if ch >= 'A' && ch <= 'F' { - Some((ch as u32) - 0x41 + 10) - } else if ch >= 'a' && ch <= 'f' { - Some((ch as u32) - 0x61 + 10) - } else if ch >= '0' && ch <= '9' { - Some((ch as u32) - 0x30) - } else { - None - } - } - - /// Returns the mathematical value of a binary digit. - pub fn bin_digit_mv(ch: char) -> Option { - if ch >= '0' && ch <= '1' { - Some((ch as u32) - 0x30) - } else { - None - } - } - - pub fn is_css_identifier_start(ch: char) -> bool { - (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') - } - - pub fn is_css_identifier_part(ch: char) -> bool { - (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' - } - - pub fn is_identifier_start(ch: char) -> bool { - if ch == '\x5f' || ch == '\x24' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - ].contains(&category) - } - - pub fn is_identifier_part(ch: char) -> bool { - if ch == '\x5f' || ch == '\x24' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - GeneralCategory::NonspacingMark, - GeneralCategory::SpacingMark, - GeneralCategory::ConnectorPunctuation, - GeneralCategory::DecimalNumber, - ].contains(&category) - } - - pub fn is_xml_name_start(ch: char) -> bool { - if ch == '\x5f' || ch == ':' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - ].contains(&category) - } - - pub fn is_xml_name_part(ch: char) -> bool { - if ch == '\x5f' || ch == ':' || ch == '.' || ch == '-' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - GeneralCategory::DecimalNumber, - ].contains(&category) - } - - pub fn is_xml_whitespace(ch: char) -> bool { - ch == '\x20' || ch == '\x09' || ch == '\x0A' || ch == '\x0D' - } -} \ No newline at end of file diff --git a/crates/parser/parser/context.rs b/crates/parser/parser/context.rs deleted file mode 100644 index 3132d5b..0000000 --- a/crates/parser/parser/context.rs +++ /dev/null @@ -1,174 +0,0 @@ -use crate::ns::*; - -/// Context used to control the parsing of an expression. -#[derive(Clone)] -pub struct ParserExpressionContext { - pub min_precedence: OperatorPrecedence, - pub allow_in: bool, - pub allow_assignment: bool, -} - -impl Default for ParserExpressionContext { - fn default() -> Self { - Self { - min_precedence: OperatorPrecedence::List, - allow_in: true, - allow_assignment: true, - } - } -} - -#[derive(Clone)] -pub enum ParserDirectiveContext { - Default, - TopLevel, - PackageBlock, - ClassBlock { - name: String, - }, - InterfaceBlock, - EnumBlock, - ConstructorBlock { - super_statement_found: Rc>, - }, - WithControl { - super_statement_found: Option>>, - to_be_labeled: Option, - control_context: ParserControlFlowContext, - labels: HashMap, - }, -} - -impl ParserDirectiveContext { - pub fn may_contain_super_statement(&self) -> bool { - matches!(self, Self::ConstructorBlock { .. }) || matches!(self, Self::WithControl { .. }) - } - - pub fn super_statement_found(&self) -> bool { - match self { - Self::ConstructorBlock { super_statement_found } => super_statement_found.get(), - Self::WithControl { super_statement_found, .. } => super_statement_found.as_ref().or(Some(&Rc::new(Cell::new(false)))).unwrap().get(), - _ => false, - } - } - - pub fn set_super_statement_found(&self, value: bool) { - match self { - Self::ConstructorBlock { super_statement_found } => { super_statement_found.set(value) }, - Self::WithControl { super_statement_found, .. } => { - if let Some(found) = super_statement_found.as_ref() { - found.set(value); - } - }, - _ => {}, - } - } - - pub fn function_name_is_constructor(&self, name: &(String, Location)) -> bool { - if let ParserDirectiveContext::ClassBlock { name: ref name_1 } = self { - &name.0 == name_1 - } else { - false - } - } - - pub fn is_top_level_or_package(&self) -> bool { - matches!(self, ParserDirectiveContext::TopLevel) || matches!(self, ParserDirectiveContext::PackageBlock) - } - - pub fn is_type_block(&self) -> bool { - match self { - Self::ClassBlock { .. } | - Self::InterfaceBlock | - Self::EnumBlock => true, - _ => false, - } - } - - pub fn clone_control(&self) -> Self { - match self { - Self::WithControl { .. } => self.clone(), - _ => Self::Default, - } - } - - pub fn override_control_context(&self, label_only: bool, mut context: ParserControlFlowContext) -> Self { - let mut prev_context = None; - let mut label = None; - let mut super_statement_found: Option>> = None; - let mut labels = match self { - Self::WithControl { control_context, labels, to_be_labeled: label1, super_statement_found: super_found_1 } => { - prev_context = Some(control_context.clone()); - label = label1.clone(); - super_statement_found = super_found_1.clone(); - labels.clone() - }, - _ => HashMap::new(), - }; - if let Some(label) = label.clone() { - labels.insert(label, context.clone()); - } - if label_only { - context = prev_context.unwrap_or(ParserControlFlowContext { - breakable: false, - iteration: false, - }); - } - Self::WithControl { control_context: context, labels, to_be_labeled: None, super_statement_found } - } - - pub fn put_label(&self, label: String) -> Self { - match self { - Self::WithControl { control_context, labels, to_be_labeled: _, super_statement_found } => Self::WithControl { - to_be_labeled: Some(label), - control_context: control_context.clone(), - labels: labels.clone(), - super_statement_found: super_statement_found.clone(), - }, - _ => Self::WithControl { - to_be_labeled: Some(label), - control_context: ParserControlFlowContext { - breakable: false, - iteration: false, - }, - labels: HashMap::new(), - super_statement_found: match self { - Self::ConstructorBlock { super_statement_found } => Some(super_statement_found.clone()), - _ => None, - }, - }, - } - } - - pub fn is_label_defined(&self, label: String) -> bool { - self.resolve_label(label).is_some() - } - - pub fn resolve_label(&self, label: String) -> Option { - if let Self::WithControl { labels, .. } = &self { labels.get(&label).map(|c| c.clone()) } else { None } - } - - pub fn is_break_allowed(&self, label: Option) -> bool { - if let Some(label) = label { - let context = self.resolve_label(label); - if let Some(context) = context { context.breakable } else { false } - } else { - if let Self::WithControl { control_context, .. } = &self { control_context.breakable } else { false } - } - } - - pub fn is_continue_allowed(&self, label: Option) -> bool { - if let Some(label) = label { - let context = self.resolve_label(label); - if let Some(context) = context { context.iteration } else { false } - } else { - if let Self::WithControl { control_context, .. } = &self { control_context.iteration } else { false } - } - } -} - -#[derive(Clone)] -pub struct ParserControlFlowContext { - pub breakable: bool, - pub iteration: bool, -} \ No newline at end of file diff --git a/crates/parser/parser/css_parser.rs b/crates/parser/parser/css_parser.rs deleted file mode 100644 index c7f64a1..0000000 --- a/crates/parser/parser/css_parser.rs +++ /dev/null @@ -1,847 +0,0 @@ -use crate::ns::*; -use num_traits::ToPrimitive; - -pub struct CssParser<'input> { - tokenizer: CssTokenizer<'input>, - previous_token: (Token, Location), - token: (Token, Location), - locations: Vec, - expecting_token_error: bool, -} - -impl<'input> CssParser<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - Self { - tokenizer: CssTokenizer::new(compilation_unit, options), - previous_token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - locations: vec![], - expecting_token_error: false, - } - } - - fn options(&self) -> ParserOptions { - ParserOptions { - ..default() - } - } - - fn compilation_unit(&self) -> &Rc { - self.tokenizer.compilation_unit() - } - - fn token_location(&self) -> Location { - self.token.1.clone() - } - - fn mark_location(&mut self) { - self.locations.push(self.token.1.clone()); - } - - fn duplicate_location(&mut self) { - self.locations.push(self.locations.last().unwrap().clone()); - } - - fn push_location(&mut self, location: &Location) { - self.locations.push(location.clone()); - } - - fn pop_location(&mut self) -> Location { - self.locations.pop().unwrap().combine_with(self.previous_token.1.clone()) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - /* - fn add_warning(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_warning(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_warning(location, kind, arguments)); - } - */ - - fn next(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan(); - } - - fn peek(&self, token: Token) -> bool { - self.token.0 == token - } - - fn peek_identifier(&self) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - Some((id, location)) - } else { - None - } - } - - fn peek_keyword(&self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { id == name && self.token.1.character_count() == name.len() } else { false } - } - - fn consume(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next(); - true - } else { - false - } - } - - fn consume_identifier(&mut self) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - self.next(); - Some((id, location)) - } else { - None - } - } - - fn consume_keyword(&mut self, name: &str) -> bool { - if let Token::Identifier(name1) = self.token.0.clone() { - if name1 == name { - self.next(); - return true; - } - } - false - } - - /// Expects a token in non-greedy mode: if it fails, does not skip any token. - fn expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next(); - } - } - - fn expect_identifier(&mut self) -> (String, Location) { - if let Token::Identifier(id) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (id, location) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - (INVALIDATED_IDENTIFIER.to_owned(), self.tokenizer.cursor_location()) - } - } - - fn expect_unitless_number(&mut self) -> Option { - if let Token::CssNumber { value, .. } = self.token.0.clone() { - self.expecting_token_error = false; - self.next(); - Some(value) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - None - } - } - - fn expect_string(&mut self) -> (String, Location) { - if let Token::String(v) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (v, location) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingStringLiteral, diagarg![self.token.0.clone()]); - ("".into(), self.tokenizer.cursor_location()) - } - } - - pub fn expect_eof(&mut self) { - self.expect(Token::Eof); - } - - fn create_invalidated_directive(&self, location: &Location) -> Rc { - Rc::new(CssDirective::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_property_value(&self, location: &Location) -> Rc { - Rc::new(CssPropertyValue::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn _create_invalidated_selector(&self, location: &Location) -> Rc { - Rc::new(CssSelector::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_selector_condition(&self, location: &Location) -> Rc { - Rc::new(CssSelectorCondition::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_media_query_condition(&self, location: &Location) -> Rc { - Rc::new(CssMediaQueryCondition::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn eof(&self) -> bool { - matches!(self.token.0, Token::Eof) - } - - pub fn parse_document(&mut self) -> Rc { - self.mark_location(); - let just_eof = self.peek(Token::Eof); - let mut directives: Vec> = vec![]; - while !self.eof() { - directives.push(self.parse_directive()); - } - let loc = self.pop_location(); - Rc::new(CssDocument { - location: if just_eof { - self.token.1.clone() - } else { - loc - }, - directives, - }) - } - - fn parse_directive(&mut self) -> Rc { - if let Some(rule) = self.parse_opt_rule() { - Rc::new(CssDirective::Rule(rule)) - } else if self.peek(Token::CssAtNamespace) { - self.mark_location(); - self.next(); - let prefix = self.expect_identifier(); - let uri = if self.expecting_token_error { - (String::new(), self.tokenizer.cursor_location()) - } else { - self.expect_string() - }; - if !self.expecting_token_error { - self.expect(Token::CssSemicolons); - } - let loc = self.pop_location(); - Rc::new(CssDirective::NamespaceDefinition(CssNamespaceDefinition { - location: loc, - prefix, - uri, - })) - } else if self.peek(Token::CssAtMedia) { - self.parse_media_query() - } else if self.peek(Token::CssAtFontFace) { - self.parse_font_face() - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::ExpectingDirective, diagarg![self.token.0.clone()]); - let d = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.next(); - d - } - } - - fn parse_media_query(&mut self) -> Rc { - self.mark_location(); - self.next(); - let mut conditions: Vec> = vec![]; - let condition = self.parse_opt_media_query_condition(); - if let Some(condition) = condition { - conditions.push(condition); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - } - loop { - if let Some(condition) = self.parse_opt_media_query_condition() { - conditions.push(condition); - } else if self.eof() || self.peek(Token::BlockOpen) { - break; - } else if !self.consume(Token::Comma) { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.next(); - } - } - let mut rules: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - while !(self.eof() || self.peek(Token::BlockClose)) { - if let Some(rule) = self.parse_opt_rule() { - rules.push(Rc::new(rule)); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.next(); - } - } - self.expect(Token::BlockClose); - } - Rc::new(CssDirective::MediaQuery(CssMediaQuery { - location: self.pop_location(), - conditions, - rules, - })) - } - - fn parse_font_face(&mut self) -> Rc { - self.mark_location(); - self.next(); - let mut properties: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - self.consume(Token::CssSemicolons); - while !(self.eof() || self.peek(Token::BlockClose)) { - properties.push(self.parse_property()); - if !self.consume(Token::CssSemicolons) { - break; - } - } - self.expect(Token::BlockClose); - } - Rc::new(CssDirective::FontFace(CssFontFace { - location: self.pop_location(), - properties, - })) - } - - fn parse_opt_media_query_condition(&mut self) -> Option> { - let mut base: Option> = None; - if self.peek_keyword("only") { - self.mark_location(); - self.next(); - let id = self.expect_identifier(); - base = Some(Rc::new(CssMediaQueryCondition::OnlyId { - location: self.pop_location(), - id, - })); - } - if let Some(id) = self.consume_identifier() { - base = Some(Rc::new(CssMediaQueryCondition::Id(id))); - } - if self.peek(Token::ParenOpen) { - self.mark_location(); - let property = self.parse_arguments().unwrap().parse_property(); - let loc = self.pop_location(); - base = Some(Rc::new(CssMediaQueryCondition::ParenProperty((property, loc)))); - } - if let Some(mut base) = base.clone() { - while self.consume_keyword("and") { - self.push_location(&base.location()); - if let Some(right) = self.parse_opt_media_query_condition() { - base = Rc::new(CssMediaQueryCondition::And { - location: self.pop_location(), - left: base, - right, - }); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - base = Rc::new(CssMediaQueryCondition::And { - location: self.pop_location(), - left: base, - right: self.create_invalidated_media_query_condition(&self.tokenizer.cursor_location()), - }); - } - } - return Some(base); - } - base - } - - fn parse_arguments(&mut self) -> Result { - if !self.peek(Token::ParenOpen) { - self.add_syntax_error(&self.token.1, DiagnosticKind::Expecting, diagarg![Token::ParenOpen, self.token.0.clone()]); - return Err(ParserError::Common); - } - let (byte_range, token) = self.tokenizer.scan_arguments(); - self.previous_token = self.token.clone(); - self.token = token; - self.next(); - Ok(CssParserFacade(self.compilation_unit(), ParserOptions { - byte_range: Some(byte_range), - ..self.options() - })) - } - - fn parse_opt_rule(&mut self) -> Option { - let mut selectors: Vec> = vec![self.parse_opt_selector()?]; - while self.consume(Token::Comma) { - if let Some(s) = self.parse_opt_selector() { - selectors.push(s); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - } - } - let mut properties: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - self.consume(Token::CssSemicolons); - while !(self.eof() || self.peek(Token::BlockClose)) { - properties.push(self.parse_property()); - if !self.consume(Token::CssSemicolons) { - break; - } - } - self.expect(Token::BlockClose); - } - self.push_location(&selectors[0].location()); - Some(CssRule { - location: self.pop_location(), - selectors, - properties, - }) - } - - fn parse_opt_selector(&mut self) -> Option> { - let mut base = self.parse_opt_base_selector()?; - - // Parse descendant combinators - while let Some(right) = self.parse_opt_base_selector() { - self.push_location(&base.location()); - base = Rc::new(CssSelector::Combinator(CssCombinatorSelector { - location: self.pop_location(), - left: base, - right, - combinator_type: CssCombinatorType::Descendant, - })); - } - - Some(base) - } - - fn parse_opt_base_selector(&mut self) -> Option> { - self.mark_location(); - let mut namespace_prefix: Option<(String, Location)> = None; - let mut element_name: Option<(String, Location)> = self.consume_identifier(); - let mut conditions: Vec> = vec![]; - if self.consume(Token::Pipe) { - namespace_prefix = element_name.clone(); - element_name = Some(self.expect_identifier()); - } - // Parse conditions as long as they are not separated by whitespace - while (element_name.is_none() && conditions.is_empty()) || (self.token.1.first_offset() - self.previous_token.1.last_offset() == 0) { - if let Some(condition) = self.parse_opt_selector_condition() { - conditions.push(condition); - } else { - break; - } - } - if element_name.is_none() && conditions.is_empty() { - self.pop_location(); - return None; - } - Some(Rc::new(CssSelector::Base(CssBaseSelector { - location: self.pop_location(), - namespace_prefix, - element_name, - conditions, - }))) - } - - fn parse_selector_condition(&mut self) -> Rc { - let Some(c) = self.parse_opt_selector_condition() else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - return self.create_invalidated_selector_condition(&self.tokenizer.cursor_location()); - }; - c - } - - fn parse_opt_selector_condition(&mut self) -> Option> { - if self.peek(Token::Dot) { - self.mark_location(); - self.next(); - let class_name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::Class((class_name, self.pop_location())))); - } - if let Token::CssHashWord(id_value) = self.token.0.clone() { - let loc = self.token.1.clone(); - self.next(); - return Some(Rc::new(CssSelectorCondition::Id((id_value, loc)))); - } - if self.peek(Token::Colon) { - self.mark_location(); - self.next(); - if self.consume_keyword("not") { - let condition = if let Ok(a) = self.parse_arguments() { - a.parse_selector_condition() - } else { - self.duplicate_location(); - let loc = self.pop_location(); - self.create_invalidated_selector_condition(&loc) - }; - return Some(Rc::new(CssSelectorCondition::Not { - location: self.pop_location(), - condition, - })); - } else { - let name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::Pseudo((name, self.pop_location())))); - } - } - if self.peek(Token::ColonColon) { - self.mark_location(); - self.next(); - let name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::PseudoElement((name, self.pop_location())))); - } - if self.peek(Token::SquareOpen) { - self.mark_location(); - self.next(); - let name = self.expect_identifier(); - let mut operator: Option = None; - let mut value: Option<(String, Location)> = None; - while let Some(t1) = self.consume_attribute_operator() { - operator = Some(t1); - } - while let Token::String(s1) = self.token.0.clone() { - value = Some((s1, self.token.1.clone())); - self.next(); - } - self.expect(Token::SquareClose); - return Some(Rc::new(CssSelectorCondition::Attribute { - location: self.pop_location(), - name, - operator, - value, - })); - } - None - } - - fn consume_attribute_operator(&mut self) -> Option { - if self.consume(Token::CssBeginsWith) { - Some(CssAttributeOperator::BeginsWith) - } else if self.consume(Token::CssEndsWith) { - Some(CssAttributeOperator::EndsWith) - } else if self.consume(Token::CssContains) { - Some(CssAttributeOperator::Contains) - } else if self.consume(Token::CssListMatch) { - Some(CssAttributeOperator::ListMatch) - } else if self.consume(Token::CssHreflangMatch) { - Some(CssAttributeOperator::HreflangMatch) - } else if self.consume(Token::Assign) { - Some(CssAttributeOperator::Equals) - } else { - None - } - } - - fn parse_property(&mut self) -> Rc { - self.mark_location(); - let name = self.expect_identifier(); - let mut value = self.create_invalidated_property_value(&self.tokenizer.cursor_location()); - if !self.expecting_token_error { - self.expect(Token::Colon); - if !self.expecting_token_error { - value = self.parse_property_value(CssOperatorPrecedence::Array); - } - } - Rc::new(CssProperty::new(self.pop_location(), name, value)) - } - - fn parse_property_value(&mut self, min_precedence: CssOperatorPrecedence) -> Rc { - let Some(v) = self.parse_opt_property_value(min_precedence) else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - return self.create_invalidated_property_value(&self.tokenizer.cursor_location()); - }; - v - } - - fn parse_opt_property_value(&mut self, min_precedence: CssOperatorPrecedence) -> Option> { - let base: Option>; - let t1 = self.token.0.clone(); - - // #HHH - // #HHHHHH - if let Token::CssHashWord(word) = t1 { - self.mark_location(); - self.next(); - let loc = self.pop_location(); - if let Ok(v) = CssColorPropertyValue::from_hex(loc.clone(), &word) { - base = Some(Rc::new(CssPropertyValue::Color(v))); - } else { - base = Some(self.create_invalidated_property_value(&loc)); - } - // "..." - // '...' - } else if let Token::String(value) = t1 { - self.mark_location(); - self.next(); - base = Some(Rc::new(CssPropertyValue::String(CssStringPropertyValue { - location: self.pop_location(), - value - }))); - // DECIMAL - } else if let Token::CssNumber { value, unit } = t1 { - self.mark_location(); - self.next(); - let loc = self.pop_location(); - base = Some(Rc::new(CssPropertyValue::Number(CssNumberPropertyValue { - location: loc, - value, - unit, - }))); - } else if let Some(id) = self.peek_identifier() { - self.mark_location(); - self.next(); - let color_int = css_color_constant_to_int(&id.0); - // COLOR_NAME such as "red" - if let Some(color_int) = color_int { - base = Some(Rc::new(CssPropertyValue::Color(CssColorPropertyValue { - location: self.pop_location(), - color_int, - }))); - // rgb(...) - } else if id.0 == "rgb" && self.peek(Token::ParenOpen) { - if let Some(color_int) = self.parse_arguments().unwrap().parse_rgb() { - base = Some(Rc::new(CssPropertyValue::RgbColor(CssRgbColorPropertyValue { - location: self.pop_location(), - color_int, - }))); - } else { - let loc = self.pop_location(); - base = Some(self.create_invalidated_property_value(&loc)); - } - } else if id.0 == "ClassReference" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::ClassReference(CssClassReferencePropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "PropertyReference" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::PropertyReference(CssPropertyReferencePropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "url" && self.peek(Token::ParenOpen) { - let url = self.parse_arguments().unwrap().parse_text(); - let mut format: Option<(String, Location)> = None; - if self.consume_keyword("format") { - if let Ok(a) = self.parse_arguments() { - format = Some(a.parse_text()); - } - } - base = Some(Rc::new(CssPropertyValue::Url(CssUrlPropertyValue { - location: self.pop_location(), - url, - format, - }))); - } else if id.0 == "local" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::Local(CssLocalPropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "Embed" && self.peek(Token::ParenOpen) { - let entries = self.parse_arguments().unwrap().parse_embed_entries(); - base = Some(Rc::new(CssPropertyValue::Embed(CssEmbedPropertyValue { - location: self.pop_location(), - entries, - }))); - } else { - if self.peek(Token::ParenOpen) { - self.add_syntax_error(&self.token_location(), DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.parse_arguments().unwrap(); - } - base = Some(Rc::new(CssPropertyValue::Identifier(CssIdentifierPropertyValue { - location: self.pop_location(), - value: id.0, - }))); - } - } else if self.peek(Token::Plus) || self.peek(Token::Minus) - || self.peek(Token::Times) || self.peek(Token::Div) { - base = Some(self.create_invalidated_property_value(&self.token.1)); - self.next(); - } else { - return None; - } - - let mut base = base.unwrap(); - - loop { - if self.peek(Token::Comma) && min_precedence.includes(&CssOperatorPrecedence::Array) { - self.push_location(&base.location()); - let mut elements: Vec> = vec![base]; - while self.consume(Token::Comma) { - elements.push(self.parse_property_value(CssOperatorPrecedence::MultiValue)); - } - base = Rc::new(CssPropertyValue::Array(CssArrayPropertyValue { - location: self.pop_location(), - elements, - })); - } else if min_precedence.includes(&CssOperatorPrecedence::MultiValue) { - if let Some(mv1) = self.parse_opt_property_value(CssOperatorPrecedence::MultiValue.add(1).unwrap()) { - self.push_location(&base.location()); - let mut values: Vec> = vec![base, mv1]; - while let Some(mv1) = self.parse_opt_property_value(CssOperatorPrecedence::MultiValue.add(1).unwrap()) { - values.push(mv1); - } - base = Rc::new(CssPropertyValue::MultiValue(CssMultiValuePropertyValue { - location: self.pop_location(), - values, - })); - } else { - break; - } - } else { - break; - } - } - - Some(base) - } - - fn parse_embed_entry(&mut self) -> Rc { - self.mark_location(); - if let Some(key) = self.consume_identifier() { - if self.consume(Token::Assign) { - let value = self.expect_string(); - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: Some(key), - value, - }) - } else { - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: None, - value: key, - }) - } - } else { - let value = self.expect_string(); - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: None, - value, - }) - } - } -} - -fn rgb_bytes_to_integer(r: f64, g: f64, b: f64) -> u32 { - (calc_rgb_byte(r) << 16) | (calc_rgb_byte(g) << 8) | calc_rgb_byte(b) -} - -fn calc_rgb_byte(value: f64) -> u32 { - // Integer - if value.round() == value { - value.round().to_u32().unwrap_or(0).clamp(0, 255) - // Float - } else { - (value * 255.0).round().to_u32().unwrap_or(0).clamp(0, 255) - } -} - -/// A simplified interface for executing the CSS parser. -pub struct CssParserFacade<'input>(pub &'input Rc, pub ParserOptions); - -impl<'input> CssParserFacade<'input> { - fn create_parser(&self) -> CssParser<'input> { - CssParser::new(self.0, &self.1) - } - - /// Parses `CssDocument` until end-of-file. - pub fn parse_document(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_document() - } - - /// Parses either a string or return source text as is. - pub fn parse_text(&self) -> (String, Location) { - let mut parser = self.create_parser(); - while parser.tokenizer.consume_whitespace() { - // Consumed whitespace - } - let d = parser.tokenizer.characters().peek_or_zero(); - if ['"', '\''].contains(&d) { - parser.next(); - let mut v: (String, Location) = ("".into(), parser.tokenizer.cursor_location()); - while let Token::String(v1) = parser.token.0.clone() { - v = (v1, parser.token.1.clone()); - parser.next(); - } - parser.expect_eof(); - v - } else { - let mut s = String::new(); - let i = parser.tokenizer.characters().index(); - while let Some(ch) = parser.tokenizer.characters_mut().next() { - s.push(ch); - } - let j = parser.tokenizer.characters().index(); - (s, Location::with_offsets(parser.compilation_unit(), i, j)) - } - } - - /// Parses `CssSelectorCondition` until end-of-file. - pub fn parse_selector_condition(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_selector_condition(); - parser.expect_eof(); - r - } - - pub fn parse_property(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_property(); - parser.expect_eof(); - r - } - - pub fn parse_property_value(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_property_value(CssOperatorPrecedence::Array); - parser.expect_eof(); - r - } - - pub fn parse_rgb(&self) -> Option { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.expect_unitless_number()?; - let g: f64; - let b: f64; - if parser.consume(Token::Comma) { - g = parser.expect_unitless_number()?; - parser.expect(Token::Comma); - b = parser.expect_unitless_number()?; - } else { - g = parser.expect_unitless_number()?; - b = parser.expect_unitless_number()?; - } - parser.expect_eof(); - Some(rgb_bytes_to_integer(r, g, b)) - } - - pub fn parse_embed_entries(&self) -> Vec> { - let mut parser = self.create_parser(); - let mut entries: Vec> = vec![]; - parser.next(); - if !parser.eof() { - entries.push(parser.parse_embed_entry()); - } - while parser.consume(Token::Comma) { - entries.push(parser.parse_embed_entry()); - } - parser.expect_eof(); - entries - } -} diff --git a/crates/parser/parser/css_tokenizer.rs b/crates/parser/parser/css_tokenizer.rs deleted file mode 100644 index 8c12cae..0000000 --- a/crates/parser/parser/css_tokenizer.rs +++ /dev/null @@ -1,434 +0,0 @@ -use crate::ns::*; -use std::str::FromStr; - -pub struct CssTokenizer<'input> { - compilation_unit: Rc, - characters: CharacterReader<'input>, -} - -impl<'input> CssTokenizer<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - let text: &'input str = compilation_unit.text(); - let compilation_unit = compilation_unit.clone(); - let characters: CharacterReader<'input>; - if let Some(range) = options.byte_range { - characters = CharacterReader::from_offset(&text[0..range.1], range.0); - } else { - characters = CharacterReader::from(text); - } - Self { - compilation_unit, - characters, - } - } - - pub fn compilation_unit(&self) -> &Rc { - &self.compilation_unit - } - - pub fn characters(&self) -> &CharacterReader<'input> { - &self.characters - } - - pub fn characters_mut(&mut self) -> &mut CharacterReader<'input> { - &mut self.characters - } - - fn character_ahead_location(&self) -> Location { - if self.characters.reached_end() { - return self.cursor_location(); - } - let offset = self.characters.index(); - let mut next_characters = self.characters.clone(); - next_characters.next().unwrap(); - Location::with_offsets(&self.compilation_unit, offset, next_characters.index()) - } - - pub fn cursor_location(&self) -> Location { - let offset = self.characters.index(); - Location::with_offset(&self.compilation_unit, offset) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - fn add_unexpected_error(&self) { - if self.characters.has_remaining() { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::UnexpectedCharacter, diagarg![self.characters.peek_or_zero().to_string()]) - } else { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::UnexpectedEnd, vec![]) - } - } - - fn add_unexpected_eof_error(&self, kind: DiagnosticKind) { - self.add_syntax_error(&self.cursor_location(), kind, vec![]); - } - - pub fn scan(&mut self) -> (Token, Location) { - while self.consume_whitespace() || self.consume_comment() { - // Do nothing - } - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - if let Some(id) = self.consume_css_id() { - return (Token::Identifier(id), start.combine_with(self.cursor_location())); - } - - // DECIMAL - // DECIMAL.PART - if CharacterValidator::is_dec_digit(ch) { - self.characters.next(); - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - if self.characters.peek_or_zero() == '.' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - } - return self.finish_number(start); - } - - if ch == '#' { - self.characters.next(); - let mut word = String::new(); - loop { - let ch = self.characters.peek_or_zero(); - if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || ch == '-' || ch == '_' { - word.push(ch); - self.characters.next(); - } else { - break; - } - } - if word.is_empty() { - self.add_unexpected_error(); - word = INVALIDATED_IDENTIFIER.to_owned(); - } - return (Token::CssHashWord(word), start.combine_with(self.cursor_location())); - } - - if ch == '@' { - // @namespace - if self.characters.peek_seq(10) == "@namespace" { - self.characters.skip_count_in_place(10); - return (Token::CssAtNamespace, start.combine_with(self.cursor_location())); - } - // @font-face - if self.characters.peek_seq(10) == "@font-face" { - self.characters.skip_count_in_place(10); - return (Token::CssAtFontFace, start.combine_with(self.cursor_location())); - } - // @media - if self.characters.peek_seq(6) == "@media" { - self.characters.skip_count_in_place(6); - return (Token::CssAtMedia, start.combine_with(self.cursor_location())); - } - } - - if ch == '!' && self.characters.peek_seq(10) == "!important" { - self.characters.skip_count_in_place(10); - return (Token::CssImportant, start.combine_with(self.cursor_location())); - } - - match ch { - // . - // .DECIMAL - '.' => { - self.characters.next(); - if CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - return self.finish_number(start); - } - (Token::Dot, start.combine_with(self.cursor_location())) - }, - '"' | '\'' => { - self.scan_string(ch, start) - }, - ';' => { - while self.characters.peek_or_zero() == ';' { - self.characters.next(); - } - (Token::CssSemicolons, start.combine_with(self.cursor_location())) - }, - '^' => { - self.characters.next(); - if self.characters.peek_or_zero() != '=' { - self.add_unexpected_error(); - self.characters.next(); - self.scan() - } else { - self.characters.next(); - (Token::CssBeginsWith, start.combine_with(self.cursor_location())) - } - }, - '$' => { - self.characters.next(); - if self.characters.peek_or_zero() != '=' { - self.add_unexpected_error(); - self.characters.next(); - self.scan() - } else { - self.characters.next(); - (Token::CssEndsWith, start.combine_with(self.cursor_location())) - } - }, - '*' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssContains, start.combine_with(self.cursor_location())) - } else { - (Token::Times, start.combine_with(self.cursor_location())) - } - }, - '~' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssListMatch, start.combine_with(self.cursor_location())) - } else { - (Token::Tilde, start.combine_with(self.cursor_location())) - } - }, - '|' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssHreflangMatch, start.combine_with(self.cursor_location())) - } else { - (Token::Pipe, start.combine_with(self.cursor_location())) - } - }, - '{' => { - self.characters.next(); - (Token::BlockOpen, start.combine_with(self.cursor_location())) - }, - '}' => { - self.characters.next(); - (Token::BlockClose, start.combine_with(self.cursor_location())) - }, - '[' => { - self.characters.next(); - (Token::SquareOpen, start.combine_with(self.cursor_location())) - }, - ']' => { - self.characters.next(); - (Token::SquareClose, start.combine_with(self.cursor_location())) - }, - '(' => { - self.characters.next(); - (Token::ParenOpen, start.combine_with(self.cursor_location())) - }, - ')' => { - self.characters.next(); - (Token::ParenClose, start.combine_with(self.cursor_location())) - }, - ',' => { - self.characters.next(); - (Token::Comma, start.combine_with(self.cursor_location())) - }, - '%' => { - self.characters.next(); - (Token::Percent, start.combine_with(self.cursor_location())) - }, - '=' => { - self.characters.next(); - (Token::Assign, start.combine_with(self.cursor_location())) - }, - ':' => { - self.characters.next(); - if self.characters.peek_or_zero() == ':' { - self.characters.next(); - (Token::ColonColon, start.combine_with(self.cursor_location())) - } else { - (Token::Colon, start.combine_with(self.cursor_location())) - } - }, - '>' => { - self.characters.next(); - (Token::Gt, start.combine_with(self.cursor_location())) - }, - '+' => { - self.characters.next(); - (Token::Plus, start.combine_with(self.cursor_location())) - }, - _ => { - if self.characters.reached_end() { - return (Token::Eof, start); - } - self.add_unexpected_error(); - self.characters.next(); - self.scan() - }, - } - } - - pub fn consume_whitespace(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if [' ', '\t', '\n', '\r'].contains(&ch) { - self.characters.next(); - true - } else { - false - } - } - - fn consume_comment(&mut self) -> bool { - if self.characters.peek_or_zero() == '/' && self.characters.peek_at_or_zero(1) == '*' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - loop { - if self.characters.peek_or_zero() == '*' && self.characters.peek_at_or_zero(1) == '/' { - self.characters.skip_count_in_place(2); - break; - } else if self.characters.has_remaining() { - self.characters.skip_in_place(); - } else { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment); - break; - } - } - - let location = start.combine_with(self.cursor_location()); - let i = location.first_offset() + 2; - let j = decrease_last_offset(i, location.last_offset(), 2); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: true, - content: RefCell::new(self.compilation_unit.text()[i..j].to_owned()), - location: RefCell::new(location), - })); - - true - } else { - false - } - } - - fn consume_css_id(&mut self) -> Option { - let i = self.characters.index(); - let mut prefix_n = 0; - if self.characters.peek_or_zero() == '_' { - prefix_n += 1; - if self.characters.peek_at_or_zero(prefix_n) == '_' { - prefix_n += 1; - if self.characters.peek_at_or_zero(prefix_n) == '_' { - prefix_n += 1; - } - } - } else if self.characters.peek_or_zero() == '-' { - prefix_n += 1; - } - if CharacterValidator::is_css_identifier_start(self.characters.peek_at_or_zero(prefix_n)) { - self.characters.skip_count_in_place(prefix_n + 1); - while CharacterValidator::is_css_identifier_part(self.characters.peek_or_zero()) { - self.characters.next(); - } - return Some(self.compilation_unit.text()[i..self.characters.index()].to_owned()); - } - None - } - - fn finish_number(&mut self, start: Location) -> (Token, Location) { - let digits = &self.compilation_unit.text()[start.first_offset..self.characters.index()]; - let mut mv = f64::from_str(digits).unwrap_or(f64::NAN); - let mut unit: Option = None; - if self.characters.peek_or_zero() == '%' { - self.characters.next(); - mv /= 100.0; - } else { - unit = self.consume_css_id(); - } - (Token::CssNumber { - value: mv, - unit, - }, start.combine_with(self.cursor_location())) - } - - fn scan_string(&mut self, delim: char, start: Location) -> (Token, Location) { - let mut builder = String::new(); - self.characters.next(); - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if ch == '\\' { - let mut loc = self.cursor_location(); - self.characters.next(); - let mut digits = String::new(); - for _ in 0..6 { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_hex_digit(ch) { - digits.push(ch); - self.characters.next(); - } else { - break; - } - } - if digits.is_empty() { - self.add_unexpected_error(); - } else { - loc = loc.combine_with(self.cursor_location()); - let mv = u32::from_str_radix(&digits, 16).ok().and_then(|mv| char::from_u32(mv)); - if let Some(mv) = mv { - builder.push(mv); - } else { - self.add_syntax_error(&loc, DiagnosticKind::CssInvalidHexEscape, diagarg![digits]); - } - } - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - let loc = start.combine_with(self.cursor_location()); - (Token::String(builder), loc) - } - - pub fn scan_arguments(&mut self) -> ((usize, usize), (Token, Location)) { - let i = self.characters.index(); - let mut j: usize; - let mut nesting = 1; - let token: (Token, Location); - loop { - j = self.characters.index(); - let ch = self.characters.peek_or_zero(); - if ch == ')' { - self.characters.next(); - nesting -= 1; - if nesting == 0 { - token = (Token::ParenClose, Location::with_offsets(&self.compilation_unit, j, self.characters.index())); - break; - } - } else if ch == '(' { - self.characters.next(); - nesting += 1; - } else if self.characters.reached_end() { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::Expecting, diagarg![Token::ParenClose, Token::Eof]); - token = (Token::Eof, self.cursor_location()); - break; - } else { - self.characters.next(); - } - } - ((i, j), token) - } -} \ No newline at end of file diff --git a/crates/parser/parser/parser.rs b/crates/parser/parser/parser.rs deleted file mode 100644 index 30d3cfc..0000000 --- a/crates/parser/parser/parser.rs +++ /dev/null @@ -1,5319 +0,0 @@ -use crate::ns::*; -use lazy_regex::*; - -pub struct Parser<'input> { - tokenizer: Tokenizer<'input>, - previous_token: (Token, Location), - token: (Token, Location), - locations: Vec, - activations: Vec, - ignore_xml_whitespace: bool, - expecting_token_error: bool, -} - -impl<'input> Parser<'input> { - /// Constructs a parser. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - Self { - tokenizer: Tokenizer::new(compilation_unit, options), - previous_token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - locations: vec![], - activations: vec![], - ignore_xml_whitespace: options.ignore_xml_whitespace, - expecting_token_error: false, - } - } - - fn options(&self) -> ParserOptions { - ParserOptions { - ignore_xml_whitespace: self.ignore_xml_whitespace, - ..default() - } - } - - fn compilation_unit(&self) -> &Rc { - self.tokenizer.compilation_unit() - } - - fn token_location(&self) -> Location { - self.token.1.clone() - } - - fn mark_location(&mut self) { - self.locations.push(self.token.1.clone()); - } - - fn duplicate_location(&mut self) { - self.locations.push(self.locations.last().unwrap().clone()); - } - - fn push_location(&mut self, location: &Location) { - self.locations.push(location.clone()); - } - - fn pop_location(&mut self) -> Location { - self.locations.pop().unwrap().combine_with(self.previous_token.1.clone()) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - fn patch_syntax_error(&self, original: DiagnosticKind, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().diagnostics.borrow().is_empty() { - return; - } - if self.compilation_unit().diagnostics.borrow().last().unwrap().kind == original { - let loc = self.compilation_unit().diagnostics.borrow_mut().pop().unwrap().location(); - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(&loc, kind, arguments)); - } - } - - /* - fn add_warning(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_warning(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_warning(location, kind, arguments)); - } - */ - - fn next(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_div(); - } - - fn next_ie_xml_tag(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_xml_tag(); - } - - fn next_ie_xml_content(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_xml_content(); - } - - fn peek(&self, token: Token) -> bool { - self.token.0 == token - } - - fn peek_identifier(&self, reserved_words: bool) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - Some((id, location)) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - let location = self.token.1.clone(); - return Some((id, location)); - } - } - None - } - } - - fn peek_context_keyword(&self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { id == name && self.token.1.character_count() == name.len() } else { false } - } - - fn consume(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next(); - true - } else { - false - } - } - - fn consume_and_ie_xml_tag(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next_ie_xml_tag(); - true - } else { - false - } - } - - fn consume_and_ie_xml_content(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next_ie_xml_content(); - true - } else { - false - } - } - - fn consume_identifier(&mut self, reserved_words: bool) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - self.next(); - Some((id, location)) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - let location = self.token.1.clone(); - self.next(); - return Some((id, location)); - } - } - None - } - } - - fn _consume_context_keyword(&mut self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.next(); - true - } else { - false - } - } else { - false - } - } - - fn expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - let expecting_identifier_name = token.is_identifier_name(); - while self.token.0 != Token::Eof && (if expecting_identifier_name { self.token.0.is_identifier_name() } else { true }) { - self.next(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next(); - } - } - - /// Expects a token; but if it fails, does not skip any token. - fn non_greedy_expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next(); - } - } - - fn non_greedy_expect_virtual_semicolon(&mut self) { - self.expecting_token_error = false; - if !self.parse_semicolon() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere, vec![]); - } - } - - fn expect_and_ie_xml_tag(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next_ie_xml_tag(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next_ie_xml_tag(); - } - } - - /// Expects a token; but if it fails, does not skip any token. - fn non_greedy_expect_and_ie_xml_tag(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next_ie_xml_tag(); - } - } - - fn expect_and_ie_xml_content(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next_ie_xml_content(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next_ie_xml_content(); - } - } - - fn non_greedy_expect_and_ie_xml_content(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next_ie_xml_content(); - } - } - - fn expect_identifier(&mut self, reserved_words: bool) -> (String, Location) { - if let Token::Identifier(id) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (id, location) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - return (id, location); - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - /* - while self.token.0 != Token::Eof && self.token.0.is_identifier_name() { - if let Some(id) = self.consume_identifier(reserved_words) { - return id; - } else { - self.next(); - } - } - */ - (INVALIDATED_IDENTIFIER.to_owned(), self.tokenizer.cursor_location()) - } - } - - fn _expect_context_keyword(&mut self, name: &str) { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.expecting_token_error = false; - self.next(); - return; - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![format!("'{name}'"), self.token.0.clone()]); - while self.token.0 != Token::Eof && self.token.0.is_identifier_name() { - if self._consume_context_keyword(name) { - return; - } else { - self.next(); - } - } - } - - fn non_greedy_expect_context_keyword(&mut self, name: &str) { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.expecting_token_error = false; - self.next(); - return; - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![format!("'{name}'"), self.token.0.clone()]); - } - - /// Expects a greater-than symbol. If the facing token is not greater-than, - /// but starts with a greater-than symbol, the first character is shifted off - /// from the facing token. - fn _expect_type_parameters_gt(&mut self) { - self.expecting_token_error = false; - if !self.consume_type_parameters_gt() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Gt, self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next(); - if self.consume_type_parameters_gt() { - return; - } - } - } - } - - fn non_greedy_expect_type_parameters_gt(&mut self) { - self.expecting_token_error = false; - if !self.consume_type_parameters_gt() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Gt, self.token.0.clone()]); - } - } - - /// Consumes a greater-than symbol. If the facing token is not greater-than, - /// but starts with a greater-than symbol, the first character is shifted off - /// from the facing token. - fn consume_type_parameters_gt(&mut self) -> bool { - match self.token.0 { - Token::Gt => { - self.next(); - true - }, - Token::Ge => { - self.token.0 = Token::Assign; - self.token.1.first_offset += 1; - true - }, - Token::RightShift => { - self.token.0 = Token::Gt; - self.token.1.first_offset += 1; - true - }, - Token::RightShiftAssign => { - self.token.0 = Token::Ge; - self.token.1.first_offset += 1; - true - }, - Token::UnsignedRightShift => { - self.token.0 = Token::RightShift; - self.token.1.first_offset += 1; - true - }, - Token::UnsignedRightShiftAssign => { - self.token.0 = Token::RightShiftAssign; - self.token.1.first_offset += 1; - true - }, - _ => { - false - }, - } - } - - fn offending_token_is_inline_or_higher_indented(&self) -> bool { - if !self.previous_token.1.line_break(&self.token.1) { - return true; - } - let i1 = self.compilation_unit().get_line_indent(self.previous_token.1.first_line_number()); - let i2 = self.compilation_unit().get_line_indent(self.token.1.first_line_number()); - i2 > i1 - } - - pub fn expect_eof(&mut self) { - self.expect(Token::Eof) - } - - fn create_invalidated_expression(&self, location: &Location) -> Rc { - Rc::new(Expression::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_directive(&self, location: &Location) -> Rc { - Rc::new(Directive::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - pub fn parse_expression(&mut self, context: ParserExpressionContext) -> Rc { - if let Some(exp) = self.parse_opt_expression(context) { - exp - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - pub fn parse_opt_expression(&mut self, context: ParserExpressionContext) -> Option> { - let exp: Option> = self.parse_opt_start_expression(context.clone()); - - // Parse subexpressions - if let Some(exp) = exp { - return Some(self.parse_subexpressions(exp, context.clone())); - } - None - } - - fn parse_subexpressions(&mut self, mut base: Rc, context: ParserExpressionContext) -> Rc { - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::OptionalChaining) { - base = self.parse_optional_chaining(base); - } else if self.peek(Token::SquareOpen) { - let asdoc = self.parse_asdoc(); - self.next(); - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base, asdoc, key, location: self.pop_location() - })); - } else if self.consume(Token::Descendants) { - self.push_location(&base.location()); - let id = self.parse_qualified_identifier(); - base = Rc::new(Expression::Descendants(DescendantsExpression { - location: self.pop_location(), - base, - identifier: id, - })); - } else if self.peek(Token::ParenOpen) { - self.push_location(&base.location()); - let arguments = self.parse_arguments(); - base = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base, - arguments, - })); - } else if self.peek(Token::Increment) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, - operator: Operator::PostIncrement, - })); - } else if self.peek(Token::Decrement) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, - operator: Operator::PostDecrement, - })); - } else if self.peek(Token::Exclamation) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::NonNull, - })); - // `not in` - } else if self.token.0 == Token::Not && context.allow_in && context.min_precedence.includes(&OperatorPrecedence::Relational) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - self.non_greedy_expect(Token::In); - base = self.parse_binary_operator(base, Operator::NotIn, OperatorPrecedence::Relational.add(1).unwrap(), context.clone()); - // ConditionalExpression - } else if self.peek(Token::Question) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - self.push_location(&base.location()); - self.next(); - let consequent = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - let mut alternative = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Colon); - if !self.expecting_token_error { - alternative = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - } - base = Rc::new(Expression::Conditional(ConditionalExpression { - location: self.pop_location(), - test: base, consequent, alternative, - })); - } else if let Some(binary_operator) = self.check_binary_operator(context.clone()) { - let BinaryOperator(operator, required_precedence, _) = binary_operator; - if context.min_precedence.includes(&required_precedence) { - self.next(); - base = self.parse_binary_operator(base, operator, binary_operator.right_precedence(), context.clone()); - } else { - break; - } - // AssignmentExpression - } else if self.peek(Token::Assign) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) && context.allow_assignment { - self.push_location(&base.location()); - self.next(); - let left = base.clone(); - if !left.is_valid_assignment_left_hand_side() { - self.add_syntax_error(&left.location(), DiagnosticKind::MalformedDestructuring, vec![]) - } - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Assignment(AssignmentExpression { - location: self.pop_location(), - left, compound: None, right, - })); - // CompoundAssignment and LogicalAssignment - } else if let Some(compound) = self.token.0.compound_assignment() { - if context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) && context.allow_assignment { - self.push_location(&base.location()); - self.next(); - let left = base.clone(); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Assignment(AssignmentExpression { - location: self.pop_location(), - left, compound: Some(compound), right, - })); - } else { - break; - } - } else if self.peek(Token::Comma) && context.min_precedence.includes(&OperatorPrecedence::List) { - self.push_location(&base.location()); - self.next(); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Sequence(SequenceExpression { - location: self.pop_location(), - left: base, right, - })); - } else { - break; - } - } - - base - } - - fn parse_binary_operator(&mut self, base: Rc, mut operator: Operator, right_precedence: OperatorPrecedence, context: ParserExpressionContext) -> Rc { - // The left operand of a null-coalescing operation must not be - // a logical AND, XOR or OR operation. - if operator == Operator::NullCoalescing { - if let Expression::Unary(UnaryExpression { expression, operator, .. }) = base.as_ref() { - if [Operator::LogicalAnd, Operator::LogicalXor, Operator::LogicalOr].contains(&operator) { - self.add_syntax_error(&expression.location(), DiagnosticKind::IllegalNullishCoalescingLeftOperand, vec![]); - } - } - } - - if operator == Operator::Is && self.consume(Token::Not) { - operator = Operator::IsNot; - } - - self.push_location(&base.location()); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: right_precedence, - ..context - }); - Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - left: base, operator, right, - })) - } - - fn check_binary_operator(&self, context: ParserExpressionContext) -> Option { - if let Some(operator) = self.token.0.to_binary_operator() { - if operator == Operator::In && !context.allow_in { - return None; - } - BinaryOperator::try_from(operator).ok() - } else { - None - } - } - - fn parse_optional_chaining(&mut self, base: Rc) -> Rc { - self.push_location(&base.location()); - self.duplicate_location(); - let mut operation = Rc::new(Expression::OptionalChainingPlaceholder(OptionalChainingPlaceholder { - location: base.location(), - })); - if self.peek(Token::ParenOpen) { - let arguments: Vec> = self.parse_arguments(); - if arguments.len() == 1 && self.peek(Token::ColonColon) { - self.duplicate_location(); - let ql = self.pop_location(); - let q = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: arguments[0].clone(), - })); - let identifier = self.finish_qualified_identifier(false, ql, q); - operation = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: operation, - identifier, - })); - } else { - operation = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base: operation, arguments - })); - } - } else if self.peek(Token::SquareOpen) { - let asdoc = self.parse_asdoc(); - self.next(); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - operation = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base: operation, asdoc, key, - })); - } else { - let identifier = self.parse_qualified_identifier(); - operation = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: operation, identifier - })); - } - - // Parse postfix subexpressions - operation = self.parse_optional_chaining_subexpressions(operation); - - Rc::new(Expression::OptionalChaining(OptionalChainingExpression { - location: self.pop_location(), - base, expression: operation, - })) - } - - fn parse_optional_chaining_subexpressions(&mut self, mut base: Rc) -> Rc { - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::OptionalChaining) { - base = self.parse_optional_chaining(base); - } else if self.peek(Token::SquareOpen) { - self.next(); - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base, asdoc: None, key, location: self.pop_location() - })); - } else if self.consume(Token::Descendants) { - self.push_location(&base.location()); - let id = self.parse_qualified_identifier(); - base = Rc::new(Expression::Descendants(DescendantsExpression { - location: self.pop_location(), - base, - identifier: id, - })); - } else if self.peek(Token::ParenOpen) { - self.push_location(&base.location()); - let arguments = self.parse_arguments(); - base = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base, - arguments, - })); - } else if self.peek(Token::Exclamation) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::NonNull, - })); - } else { - break; - } - } - - base - } - - fn parse_dot_subexpression(&mut self, base: Rc) -> Rc { - self.push_location(&base.location()); - if self.peek(Token::ParenOpen) { - let paren_location = self.token_location(); - let paren_exp = self.parse_paren_list_expression(); - if !matches!(paren_exp.as_ref(), Expression::Sequence(_)) && self.peek(Token::ColonColon) { - let q = Rc::new(Expression::Paren(ParenExpression { - location: paren_location.clone(), - expression: paren_exp.clone(), - })); - let id = self.finish_qualified_identifier(false, paren_location, q); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier: id - })) - } else { - Rc::new(Expression::Filter(FilterExpression { - location: self.pop_location(), - base, test: paren_exp - })) - } - } else if self.consume(Token::Lt) { - let mut arguments = vec![]; - arguments.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - arguments.push(self.parse_type_expression()); - } - self.non_greedy_expect_type_parameters_gt(); - Rc::new(Expression::WithTypeArguments(ExpressionWithTypeArguments { - location: self.pop_location(), - base, arguments - })) - } else { - let id = self.parse_qualified_identifier(); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier: id - })) - } - } - - /// Ensures a parameter list consists of zero or more required parameters followed by - /// zero or more optional parameters optionally followed by a rest parameter. - fn validate_parameter_list(&mut self, params: Vec<(ParameterKind, Location)>) { - let mut least_kind = ParameterKind::Required; - let mut has_rest = false; - for (param_kind, param_loc) in params { - if !least_kind.may_be_followed_by(param_kind) { - self.add_syntax_error(¶m_loc, DiagnosticKind::WrongParameterPosition, vec![]); - } - least_kind = param_kind; - if param_kind == ParameterKind::Rest && has_rest { - self.add_syntax_error(¶m_loc, DiagnosticKind::DuplicateRestParameter, vec![]); - } - has_rest = param_kind == ParameterKind::Rest; - } - } - - fn parse_opt_start_expression(&mut self, context: ParserExpressionContext) -> Option> { - if let Token::Identifier(id) = self.token.0.clone() { - let id_location = self.token_location(); - self.next(); - Some(self.parse_expression_starting_with_identifier((id, id_location))) - } else if self.peek(Token::Null) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::NullLiteral(NullLiteral { - location: self.pop_location(), - }))) - } else if self.peek(Token::False) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: false, - }))) - } else if self.peek(Token::True) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: true, - }))) - } else if let Token::Number(n, suffix) = self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::NumericLiteral(NumericLiteral { - location: self.pop_location(), - value: n, - suffix, - }))) - } else if let Token::String(ref s) = self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value: s.clone(), - }))) - } else if self.peek(Token::This) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::ThisLiteral(ThisLiteral { - location: self.pop_location(), - }))) - } else if self.peek(Token::Div) || self.peek(Token::DivideAssign) { - self.mark_location(); - self.token = self.tokenizer.scan_regexp_literal(self.token.1.clone(), if self.peek(Token::DivideAssign) { "=".into() } else { "".into() }); - let Token::RegExp { ref body, ref flags } = self.token.0.clone() else { - panic!(); - }; - self.next(); - Some(Rc::new(Expression::RegExpLiteral(RegExpLiteral { - location: self.pop_location(), - body: body.clone(), flags: flags.clone(), - }))) - // `@` - } else if self.peek(Token::Attribute) { - self.mark_location(); - let id = self.parse_qualified_identifier(); - Some(Rc::new(Expression::QualifiedIdentifier(id))) - // Parentheses - } else if self.peek(Token::ParenOpen) { - Some(self.parse_paren_list_expr_or_qual_id()) - // XMLList, XMLElement, XMLMarkup - } else if self.peek(Token::Lt) { - if let Some(token) = self.tokenizer.scan_xml_markup(self.token_location()) { - self.token = token; - } - let start = self.token_location(); - if let Token::XmlMarkup(content) = &self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::XmlMarkup(XmlMarkupExpression { - location: self.pop_location(), - markup: content.clone(), - }))) - } else { - Some(self.parse_xml_element_or_xml_list(start)) - } - // ArrayInitializer - } else if self.peek(Token::SquareOpen) { - Some(self.parse_array_initializer()) - // NewExpression - } else if self.peek(Token::New) && context.min_precedence.includes(&OperatorPrecedence::Unary) { - let start = self.token_location(); - self.next(); - Some(self.parse_new_expression(start)) - } else if self.peek(Token::BlockOpen) { - Some(self.parse_object_initializer()) - } else if self.peek(Token::Function) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - Some(self.parse_function_expression(context.clone())) - // SuperExpression - } else if self.peek(Token::Super) && context.min_precedence.includes(&OperatorPrecedence::Postfix) { - Some(self.parse_super_expression_followed_by_property_operator()) - // AwaitExpression - } else if self.peek(Token::Await) && context.min_precedence.includes(&OperatorPrecedence::Unary) { - self.mark_location(); - let operator_token = self.token.clone(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::Unary, - ..default() - }); - if let Some(activation) = self.activations.last_mut() { - activation.uses_await = true; - } else { - self.add_syntax_error(&operator_token.1, DiagnosticKind::NotAllowedHere, diagarg![operator_token.0]); - } - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::Await, - }))) - // YieldExpression - } else if self.peek(Token::Yield) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - self.mark_location(); - let operator_token = self.token.clone(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - if let Some(activation) = self.activations.last_mut() { - activation.uses_yield = true; - } else { - self.add_syntax_error(&operator_token.1, DiagnosticKind::NotAllowedHere, diagarg![operator_token.0]); - } - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::Yield, - }))) - // Miscellaneous prefix unary expressions - } else if let Some((operator, subexp_precedence)) = self.check_prefix_operator() { - if context.min_precedence.includes(&OperatorPrecedence::Unary) { - self.mark_location(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { min_precedence: subexp_precedence, ..default() }); - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator, - }))) - } else { - None - } - // ImportMeta - } else if self.peek(Token::Import) && context.min_precedence.includes(&OperatorPrecedence::Postfix) { - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::Dot); - self.non_greedy_expect_context_keyword("meta"); - Some(Rc::new(Expression::ImportMeta(ImportMeta { - location: self.pop_location(), - }))) - // QualifiedIdentifier - } else if - self.peek(Token::Times) - || self.peek(Token::Public) || self.peek(Token::Private) - || self.peek(Token::Protected) || self.peek(Token::Internal) { - let id = self.parse_qualified_identifier(); - Some(Rc::new(Expression::QualifiedIdentifier(id))) - } else { - None - } - } - - fn parse_expression_starting_with_identifier(&mut self, id: (String, Location)) -> Rc { - let id_location = id.1.clone(); - let id = id.0; - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id == "embed" && self.previous_token.1.character_count() == "embed".len() { - return self.finish_embed_expression(id_location); - } - */ - - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - id - } - } - - fn check_prefix_operator(&self) -> Option<(Operator, OperatorPrecedence)> { - match self.token.0 { - Token::Delete => Some((Operator::Delete, OperatorPrecedence::Postfix)), - Token::Void => Some((Operator::Void, OperatorPrecedence::Unary)), - Token::Typeof => Some((Operator::Typeof, OperatorPrecedence::Unary)), - Token::Increment => Some((Operator::PreIncrement, OperatorPrecedence::Postfix)), - Token::Decrement => Some((Operator::PreDecrement, OperatorPrecedence::Postfix)), - Token::Plus => Some((Operator::Positive, OperatorPrecedence::Unary)), - Token::Minus => Some((Operator::Negative, OperatorPrecedence::Unary)), - Token::Tilde => Some((Operator::BitwiseNot, OperatorPrecedence::Unary)), - Token::Exclamation => Some((Operator::LogicalNot, OperatorPrecedence::Unary)), - _ => None, - } - } - - fn parse_function_expression(&mut self, context: ParserExpressionContext) -> Rc { - self.mark_location(); - self.next(); - let mut name = None; - if let Token::Identifier(id) = self.token.0.clone() { - name = Some((id, self.token.1.clone())); - self.next(); - } - let common = self.parse_function_common(true, ParserDirectiveContext::Default, context.allow_in); - Rc::new(Expression::Function(FunctionExpression { - location: self.pop_location(), - name, - common, - })) - } - - fn parse_function_common(&mut self, function_expr: bool, block_context: ParserDirectiveContext, allow_in: bool) -> Rc { - self.mark_location(); - self.duplicate_location(); - let mut params: Vec> = vec![]; - let mut return_annotation = Some(self.create_invalidated_expression(&self.tokenizer.cursor_location())); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - if !self.peek(Token::ParenClose) { - params.push(self.parse_parameter()); - while self.consume(Token::Comma) { - params.push(self.parse_parameter()); - } - } - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - return_annotation = if self.consume(Token::Colon) { Some(self.parse_type_expression()) } else { None }; - } - self.validate_parameter_list(params.iter().map(|p| (p.kind, p.location.clone())).collect::>()); - } - - let signature_location = self.pop_location(); - - // Enter activation - self.activations.push(ParserActivation::new()); - - // Body - let body = if self.peek(Token::BlockOpen) { - Some(FunctionBody::Block(Rc::new(self.parse_block(block_context)))) - } else if !(self.offending_token_is_inline_or_higher_indented() || self.peek(Token::ParenOpen)) { - None - } else { - self.parse_opt_expression(ParserExpressionContext { - allow_in, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }).map(|e| FunctionBody::Expression(e)) - }; - - // Body is required by function expressions - if body.is_none() && function_expr { - self.non_greedy_expect(Token::BlockOpen); - } - - // Exit activation - let activation = self.activations.pop().unwrap(); - - Rc::new(FunctionCommon { - location: self.pop_location(), - contains_await: activation.uses_await, - contains_yield: activation.uses_yield, - signature: FunctionSignature { - location: signature_location, - parameters: params, - result_type: return_annotation, - }, - body, - }) - } - - fn parse_parameter(&mut self) -> Rc { - self.mark_location(); - let rest = self.consume(Token::Ellipsis); - let binding: Rc = Rc::new(self.parse_variable_binding(true)); - let has_initializer = binding.initializer.is_some(); - let location = self.pop_location(); - if rest && has_initializer { - self.add_syntax_error(&location.clone(), DiagnosticKind::MalformedRestParameter, vec![]); - } - Rc::new(Parameter { - location, - destructuring: binding.destructuring.clone(), - default_value: binding.initializer.clone(), - kind: if rest { - ParameterKind::Rest - } else if has_initializer { - ParameterKind::Optional - } else { - ParameterKind::Required - }, - }) - } - - fn parse_object_initializer(&mut self) -> Rc { - self.mark_location(); - self.non_greedy_expect(Token::BlockOpen); - let mut fields: Vec> = vec![]; - while !self.peek(Token::BlockClose) { - fields.push(self.parse_field()); - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::BlockClose); - - Rc::new(Expression::ObjectInitializer(ObjectInitializer { - location: self.pop_location(), - fields, - })) - } - - fn parse_field(&mut self) -> Rc { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - let subexp = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - return Rc::new(InitializerField::Rest((subexp, self.pop_location()))); - } - - let name = self.parse_field_name(); - - let non_null = self.consume(Token::Exclamation); - let mut value = None; - - if self.consume(Token::Colon) { - value = Some(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } else if !matches!(name.0, FieldName::Identifier(_)) { - self.non_greedy_expect(Token::Colon); - } - - Rc::new(InitializerField::Field { - name, - non_null, - value, - }) - } - - fn parse_field_name(&mut self) -> (FieldName, Location) { - if let Token::String(value) = &self.token.0.clone() { - let location = self.token_location(); - self.next(); - (FieldName::StringLiteral(Rc::new(Expression::StringLiteral(StringLiteral { - location: location.clone(), - value: value.clone(), - }))), location) - } else if let Token::Number(value, suffix) = &self.token.0.clone() { - let location = self.token_location(); - self.next(); - (FieldName::NumericLiteral(Rc::new(Expression::NumericLiteral(NumericLiteral { - location: location.clone(), - value: value.clone(), - suffix: *suffix, - }))), location) - } else if self.peek(Token::SquareOpen) { - self.mark_location(); - self.next(); - let key_expr = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - self.non_greedy_expect(Token::SquareClose); - let location = self.pop_location(); - (FieldName::Brackets(key_expr), location) - } else { - let id = self.parse_non_attribute_qualified_identifier(); - let l = id.location.clone(); - (FieldName::Identifier(id), l) - } - } - - fn parse_new_expression(&mut self, start: Location) -> Rc { - self.push_location(&start); - if self.consume(Token::Lt) { - let element_type = self.parse_type_expression(); - self.non_greedy_expect_type_parameters_gt(); - let mut elements: Vec = vec![]; - self.non_greedy_expect(Token::SquareOpen); - if !self.expecting_token_error { - while !self.peek(Token::SquareClose) { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - elements.push(Element::Rest((self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }), self.pop_location()))); - } else { - elements.push(Element::Expression(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }))); - } - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::SquareClose); - } - Rc::new(Expression::VectorLiteral(VectorLiteral { - location: self.pop_location(), - element_type, - elements, - })) - } else { - let base = self.parse_new_subexpression(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - Rc::new(Expression::New(NewExpression { - location: self.pop_location(), - base, arguments, - })) - } - } - - fn parse_new_expression_start(&mut self) -> Rc { - if self.peek(Token::New) { - let start = self.token_location(); - self.next(); - self.parse_new_expression(start) - } else if self.peek(Token::Super) { - self.parse_super_expression_followed_by_property_operator() - } else { - self.parse_primary_expression() - } - } - - fn parse_super_expression_followed_by_property_operator(&mut self) -> Rc { - self.mark_location(); - self.duplicate_location(); - self.next(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - let super_expr = Rc::new(Expression::Super(SuperExpression { - location: self.pop_location(), - object: arguments, - })); - - if self.consume(Token::SquareOpen) { - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base: super_expr, asdoc: None, key, - })) - } else { - self.non_greedy_expect(Token::Dot); - let identifier = self.parse_qualified_identifier(); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: super_expr, identifier, - })) - } - } - - fn parse_arguments(&mut self) -> Vec> { - self.non_greedy_expect(Token::ParenOpen); - let mut arguments = vec![]; - if !self.peek(Token::ParenClose) { - arguments.push(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - while self.consume(Token::Comma) { - arguments.push(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } - } - self.non_greedy_expect(Token::ParenClose); - arguments - } - - fn parse_new_subexpression(&mut self) -> Rc { - let mut base = self.parse_new_expression_start(); - loop { - if self.consume(Token::SquareOpen) { - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base, asdoc: None, key, - })); - } else if self.consume(Token::Dot) { - self.push_location(&base.location()); - if self.consume(Token::Lt) { - let mut arguments = vec![]; - arguments.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - arguments.push(self.parse_type_expression()); - } - self.non_greedy_expect_type_parameters_gt(); - base = Rc::new(Expression::WithTypeArguments(ExpressionWithTypeArguments { - location: self.pop_location(), - base, arguments - })); - } else { - let identifier = self.parse_qualified_identifier(); - base = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier, - })); - } - } else { - break; - } - } - base - } - - fn parse_primary_expression(&mut self) -> Rc { - if let Token::Identifier(id) = self.token.0.clone() { - let id_location = self.token_location(); - self.next(); - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id == "embed" && self.previous_token.1.character_count() == "embed".len() { - return self.finish_embed_expression(id_location); - } - */ - - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - id - } - } else if self.peek(Token::Null) { - self.mark_location(); - self.next(); - Rc::new(Expression::NullLiteral(NullLiteral { - location: self.pop_location(), - })) - } else if self.peek(Token::False) { - self.mark_location(); - self.next(); - Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: false, - })) - } else if self.peek(Token::True) { - self.mark_location(); - self.next(); - Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: true, - })) - } else if let Token::Number(n, suffix) = self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::NumericLiteral(NumericLiteral { - location: self.pop_location(), - value: n, - suffix, - })) - } else if let Token::String(ref s) = self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value: s.clone(), - })) - } else if self.peek(Token::This) { - self.mark_location(); - self.next(); - Rc::new(Expression::ThisLiteral(ThisLiteral { - location: self.pop_location(), - })) - } else if self.peek(Token::Div) || self.peek(Token::DivideAssign) { - self.mark_location(); - self.token = self.tokenizer.scan_regexp_literal(self.token.1.clone(), if self.peek(Token::DivideAssign) { "=".into() } else { "".into() }); - let Token::RegExp { ref body, ref flags } = self.token.0.clone() else { - panic!(); - }; - self.next(); - Rc::new(Expression::RegExpLiteral(RegExpLiteral { - location: self.pop_location(), - body: body.clone(), flags: flags.clone(), - })) - // `@` - } else if self.peek(Token::Attribute) { - self.mark_location(); - let id = self.parse_qualified_identifier(); - Rc::new(Expression::QualifiedIdentifier(id)) - // Parentheses - } else if self.peek(Token::ParenOpen) { - return self.parse_paren_list_expr_or_qual_id(); - // XMLList, XMLElement, XMLMarkup - } else if self.peek(Token::Lt) { - if let Some(token) = self.tokenizer.scan_xml_markup(self.token_location()) { - self.token = token; - } - let start = self.token_location(); - if let Token::XmlMarkup(content) = &self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::XmlMarkup(XmlMarkupExpression { - location: self.pop_location(), - markup: content.clone(), - })) - } else { - self.parse_xml_element_or_xml_list(start) - } - // ArrayInitializer - } else if self.peek(Token::SquareOpen) { - self.parse_array_initializer() - } else if self.peek(Token::BlockOpen) { - self.parse_object_initializer() - // QualifiedIdentifier - } else if - self.peek(Token::Times) - || self.peek(Token::Public) || self.peek(Token::Private) - || self.peek(Token::Protected) || self.peek(Token::Internal) { - let id = self.parse_qualified_identifier(); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - /* - fn finish_embed_expression(&mut self, start: Location) -> Rc { - self.push_location(&start); - let descriptor = self.parse_object_initializer().clone(); - let Expression::ObjectInitializer(descriptor) = descriptor.as_ref() else { - panic!(); - }; - return Rc::new(Expression::Embed(EmbedExpression { - location: self.pop_location(), - description: descriptor.clone(), - })); - } - */ - - fn parse_array_initializer(&mut self) -> Rc { - self.mark_location(); - - let asdoc = self.parse_asdoc(); - - self.non_greedy_expect(Token::SquareOpen); - - let mut elements: Vec = vec![]; - - while !self.peek(Token::SquareClose) { - let mut ellipses = false; - while self.consume(Token::Comma) { - elements.push(Element::Elision); - ellipses = true; - } - if !ellipses { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - elements.push(Element::Rest((self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }), self.pop_location()))); - } else { - elements.push(Element::Expression(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }))); - } - } - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::SquareClose); - Rc::new(Expression::ArrayLiteral(ArrayLiteral { - location: self.pop_location(), - asdoc, - elements, - })) - } - - fn parse_xml_element_or_xml_list(&mut self, start: Location) -> Rc { - self.next_ie_xml_tag(); - if self.consume_and_ie_xml_content(Token::Gt) { - self.push_location(&start); - let content = self.parse_xml_content(); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - self.non_greedy_expect(Token::Gt); - return Rc::new(Expression::XmlList(XmlListExpression { - location: self.pop_location(), - content, - })); - } - - self.push_location(&start); - let element = Rc::new(self.parse_xml_element(start, true)); - return Rc::new(Expression::Xml(XmlExpression { - location: self.pop_location(), - element, - })); - } - - /// Parses XMLElement starting from its XMLTagContent. - fn parse_xml_element(&mut self, start: Location, ends_at_ie_div: bool) -> XmlElement { - self.push_location(&start); - let name = self.parse_xml_tag_name(); - let mut attributes: Vec> = vec![]; - let mut attribute_expression: Option> = None; - while self.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_tag(Token::BlockClose); - attribute_expression = Some(expr); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - break; - } else if matches!(self.token.0, Token::XmlName(_)) { - self.mark_location(); - let name = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_tag(Token::Assign); - let mut value = XmlAttributeValue::Value(("".into(), self.token.1.clone())); - if !self.expecting_token_error { - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_tag(Token::BlockClose); - value = XmlAttributeValue::Expression(expr); - } else { - value = XmlAttributeValue::Value(self.parse_xml_attribute_value()); - } - } - attributes.push(Rc::new(XmlAttribute { - location: self.pop_location(), - name, value - })); - } else { - break; - } - } - - let mut content: Option>> = None; - let mut closing_name: Option = None; - - let is_empty; - - if ends_at_ie_div { - is_empty = self.consume(Token::XmlSlashGt); - } else { - is_empty = self.consume_and_ie_xml_content(Token::XmlSlashGt); - } - - if !is_empty { - self.expect_and_ie_xml_content(Token::Gt); - content = Some(self.parse_xml_content()); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - closing_name = Some(self.parse_xml_tag_name()); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - if ends_at_ie_div { - self.non_greedy_expect(Token::Gt); - } else { - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - } - - XmlElement { - location: self.pop_location(), - name, - attributes, - attribute_expression, - content, - closing_name, - } - } - - fn parse_xml_attribute_value(&mut self) -> (String, Location) { - if let Token::XmlAttributeValue(value) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_tag(); - return (value, location); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingXmlAttributeValue, diagarg![self.token.0.clone()]); - ("".into(), self.tokenizer.cursor_location()) - } - } - - fn parse_xml_tag_name(&mut self) -> XmlTagName { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - self.expect_and_ie_xml_tag(Token::BlockClose); - XmlTagName::Expression(expr) - } else { - XmlTagName::Name(self.parse_xml_name()) - } - } - - fn parse_xml_name(&mut self) -> (String, Location) { - if let Token::XmlName(name) = self.token.0.clone() { - let name_location = self.token_location(); - self.next_ie_xml_tag(); - return (name, name_location); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingXmlName, diagarg![self.token.0.clone()]); - (INVALIDATED_IDENTIFIER.into(), self.tokenizer.cursor_location()) - } - } - - /// Parses XMLContent until a ` Vec> { - let mut content = vec![]; - while !self.peek(Token::XmlLtSlash) { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_content(Token::BlockClose); - content.push(Rc::new(XmlContent::Expression(expr))); - } else if let Token::XmlMarkup(markup) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(XmlContent::Markup((markup, location)))); - } else if let Token::XmlText(text) = self.token.0.clone() { - if self.tokenizer.characters().reached_end() { - self.expect_and_ie_xml_content(Token::XmlLtSlash); - break; - } - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(XmlContent::Characters((text, location)))); - } else if self.consume_and_ie_xml_tag(Token::Lt) { - let start = self.token_location(); - let element = self.parse_xml_element(start, false); - content.push(Rc::new(XmlContent::Element(Rc::new(element)))); - } else if self.peek(Token::Eof) { - break; - } else { - self.expect_and_ie_xml_content(Token::XmlLtSlash); - } - } - content - } - - fn finish_paren_list_expr_or_qual_id(&mut self, start: Location, left: Rc) -> Rc { - if self.peek(Token::ColonColon) && !matches!(left.as_ref(), Expression::Sequence(_)) { - self.push_location(&start); - let ql = self.pop_location(); - let left = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: left, - })); - let id = self.finish_qualified_identifier(false, ql, left); - return Rc::new(Expression::QualifiedIdentifier(id)); - } - self.push_location(&start); - return Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression: left, - })); - } - - /// Parses either a ParenListExpression, (), or a QualifiedIdentifier - fn parse_paren_list_expr_or_qual_id(&mut self) -> Rc { - let start = self.token_location(); - self.non_greedy_expect(Token::ParenOpen); - - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - - self.non_greedy_expect(Token::ParenClose); - self.finish_paren_list_expr_or_qual_id(start, expr) - } - - fn parse_opt_reserved_namespace(&mut self) -> Option> { - let loc = self.token.1.clone(); - if self.consume(Token::Public) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Public(loc)))) - } else if self.consume(Token::Private) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Private(loc)))) - } else if self.consume(Token::Protected) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Protected(loc)))) - } else if self.consume(Token::Internal) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Internal(loc)))) - } else { - None - } - } - - fn parse_qualified_identifier(&mut self) -> QualifiedIdentifier { - self.mark_location(); - - let attribute = self.consume(Token::Attribute); - if attribute && self.peek(Token::SquareOpen) { - let brackets = self.parse_brackets(); - return QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Brackets(brackets), - }; - } - - // public, private, protected, internal - if let Some(qual) = self.parse_opt_reserved_namespace() { - if self.peek(Token::ColonColon) { - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, qual); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((qual.to_reserved_namespace_string().unwrap(), qual.location())), - }; - return id; - } - } - - let mut id: Option = None; - - // IdentifierName - if let Token::Identifier(id_1) = self.token.0.clone() { - id = Some(id_1); - } else { - if let Some(id_1) = self.token.0.reserved_word_name() { - id = Some(id_1); - } else if self.peek(Token::Times) { - id = Some("*".to_owned()); - } - } - - if let Some(id) = id { - let id_location = self.token_location(); - self.next(); - if self.peek(Token::ColonColon) { - let id = QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - let id = Rc::new(Expression::QualifiedIdentifier(id)); - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, id); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - return id; - } - } - - // (q)::x - if self.peek(Token::ParenOpen) { - let qual = self.parse_paren_expression(); - let ql = self.pop_location(); - let qual = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: qual, - })); - return self.finish_qualified_identifier(attribute, ql, qual); - } - - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - - fn parse_non_attribute_qualified_identifier(&mut self) -> QualifiedIdentifier { - self.mark_location(); - - let attribute = false; - - // public, private, protected, internal - if let Some(qual) = self.parse_opt_reserved_namespace() { - if self.peek(Token::ColonColon) { - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, qual); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((qual.to_reserved_namespace_string().unwrap(), qual.location())), - }; - return id; - } - } - - let mut id: Option = None; - - // IdentifierName - if let Token::Identifier(id_1) = self.token.0.clone() { - id = Some(id_1); - } else { - if let Some(id_1) = self.token.0.reserved_word_name() { - id = Some(id_1); - } else if self.peek(Token::Times) { - id = Some("*".to_owned()); - } - } - - if let Some(id) = id { - let id_location = self.token_location(); - self.next(); - if self.peek(Token::ColonColon) { - let id = QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - let id = Rc::new(Expression::QualifiedIdentifier(id)); - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, id); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - return id; - } - } - - // (q)::x - if self.peek(Token::ParenOpen) { - let qual = self.parse_paren_expression(); - let ql = self.pop_location(); - let qual = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: qual, - })); - return self.finish_qualified_identifier(attribute, ql, qual); - } - - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - - /// Expects a colon-colon and finishes a qualified identifier. - fn finish_qualified_identifier(&mut self, attribute: bool, start_location: Location, qual: Rc) -> QualifiedIdentifier { - self.push_location(&start_location); - self.non_greedy_expect(Token::ColonColon); - - // `::` may be followed by one of { IdentifierName, `*`, Brackets } - - // IdentifierName - if let Some(id) = self.consume_identifier(true) { - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(id), - } - // `*` - } else if self.peek(Token::Times) { - let id_location = self.token_location(); - self.next(); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(("*".into(), id_location)), - } - // Brackets - } else if self.peek(Token::SquareOpen) { - let brackets = self.parse_brackets(); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Brackets(brackets), - } - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - } - - fn parse_brackets(&mut self) -> Rc { - self.non_greedy_expect(Token::SquareOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::SquareClose); - expr - } - - fn parse_paren_expression(&mut self) -> Rc { - self.non_greedy_expect(Token::ParenOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::ParenClose); - expr - } - - fn parse_paren_list_expression(&mut self) -> Rc { - self.non_greedy_expect(Token::ParenOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::ParenClose); - expr - } - - fn parse_typed_destructuring(&mut self) -> TypedDestructuring { - self.mark_location(); - let mut destructuring: Rc; - if self.peek(Token::BlockOpen) { - destructuring = self.parse_object_initializer(); - } else if self.peek(Token::SquareOpen) { - destructuring = self.parse_array_initializer(); - } else { - let id = self.expect_identifier(true); - let id = QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - }; - destructuring = Rc::new(Expression::QualifiedIdentifier(id)); - } - if self.consume(Token::Exclamation) { - self.push_location(&destructuring.location()); - destructuring = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - operator: Operator::NonNull, - expression: destructuring.clone(), - })); - } - if !destructuring.is_valid_destructuring() { - self.add_syntax_error(&destructuring.location(), DiagnosticKind::MalformedDestructuring, vec![]) - } - let type_annotation = if self.consume(Token::Colon) { Some(self.parse_type_expression()) } else { None }; - TypedDestructuring { - location: self.pop_location(), - destructuring, - type_annotation, - } - } - - pub fn parse_type_expression(&mut self) -> Rc { - let start = self.token_location(); - let (mut base, wrap_nullable) = self.parse_type_expression_start(); - - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::Question) { - self.push_location(&base.location()); - base = Rc::new(Expression::NullableType(NullableTypeExpression { - location: self.pop_location(), - base, - })); - } else if self.consume(Token::Exclamation) { - self.push_location(&base.location()); - base = Rc::new(Expression::NonNullableType(NonNullableTypeExpression { - location: self.pop_location(), - base, - })); - } else { - break; - } - } - - if wrap_nullable { - self.push_location(&start); - base = Rc::new(Expression::NullableType(NullableTypeExpression { - location: self.pop_location(), - base, - })); - } - - base - } - - fn parse_type_expression_start(&mut self) -> (Rc, bool) { - // Allow a `?` prefix to wrap a type into nullable. - let wrap_nullable = self.consume(Token::Question); - - // Parenthesized - if self.peek(Token::ParenOpen) { - self.mark_location(); - let expression = self.parse_type_expression(); - (Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression, - })), wrap_nullable) - } - // `function` - else if self.peek(Token::Function) { - (self.parse_function_type_expression(), wrap_nullable) - // `void` - } else if self.peek(Token::Void) { - self.mark_location(); - self.next(); - (Rc::new(Expression::VoidType(VoidTypeExpression { - location: self.pop_location(), - })), wrap_nullable) - // [T] - // [T1, T2, ...Tn] - } else if self.peek(Token::SquareOpen) { - let mut elements = vec![]; - self.mark_location(); - self.next(); - elements.push(self.parse_type_expression()); - if self.consume(Token::SquareClose) { - (Rc::new(Expression::ArrayType(ArrayTypeExpression { - location: self.pop_location(), - expression: elements[0].clone(), - })), wrap_nullable) - } else { - self.non_greedy_expect(Token::Comma); - elements.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - if self.peek(Token::SquareClose) { - break; - } - elements.push(self.parse_type_expression()); - } - self.non_greedy_expect(Token::SquareClose); - (Rc::new(Expression::TupleType(TupleTypeExpression { - location: self.pop_location(), - expressions: elements, - })), wrap_nullable) - } - } else if self.peek(Token::Times) { - let location = self.token_location(); - self.next(); - (Rc::new(Expression::AnyType(AnyTypeExpression { - location, - })), wrap_nullable) - // Identifier - } else { - let id = self.parse_qualified_identifier(); - (Rc::new(Expression::QualifiedIdentifier(id)), wrap_nullable) - } - } - - fn parse_function_type_expression(&mut self) -> Rc { - self.mark_location(); - self.next(); - - let mut parameters = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - if !self.peek(Token::ParenClose) { - parameters.push(self.parse_function_type_parameter()); - while self.consume(Token::Comma) { - parameters.push(self.parse_function_type_parameter()); - } - } - self.non_greedy_expect(Token::ParenClose); - self.validate_parameter_list(parameters.iter().map(|p| (p.kind, p.location.clone())).collect::>()); - } - - let mut result_type = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Colon); - if !self.expecting_token_error { - result_type = self.parse_type_expression(); - } - Rc::new(Expression::FunctionType(FunctionTypeExpression { - location: self.pop_location(), - parameters, - result_type: Some(result_type), - })) - } - - fn parse_function_type_parameter(&mut self) -> Rc { - self.mark_location(); - let rest = self.consume(Token::Ellipsis); - let type_expression: Option> = if rest && self.peek(Token::ParenClose) { - None - } else { - Some(self.parse_type_expression()) - }; - let optional = !rest && self.consume(Token::Assign); - let location = self.pop_location(); - Rc::new(FunctionTypeParameter { - location, - type_expression, - kind: if rest { - ParameterKind::Rest - } else if optional { - ParameterKind::Optional - } else { - ParameterKind::Required - }, - }) - } - - fn parse_variable_binding(&mut self, allow_in: bool) -> VariableBinding { - let destructuring = self.parse_typed_destructuring(); - let initializer = if self.consume(Token::Assign) { - Some(self.parse_expression(ParserExpressionContext { - allow_in, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })) - } else { - None - }; - VariableBinding { - destructuring, - initializer, - } - } - - fn parse_semicolon(&mut self) -> bool { - self.consume(Token::Semicolon) || self.peek(Token::BlockClose) || self.previous_token.1.line_break(&self.token.1) - } - - fn parse_substatement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.parse_statement(context) - } - - fn parse_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - // ExpressionStatement or LabeledStatement - if let Token::Identifier(id) = &self.token.0.clone() { - let id = (id.clone(), self.token_location()); - self.next(); - self.parse_statement_starting_with_identifier(context, id) - // SuperStatement or ExpressionStatement with `super` - } else if self.peek(Token::Super) { - self.mark_location(); - self.next(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - let mut semicolon = false; - if arguments.is_some() { - semicolon = self.parse_semicolon(); - } - if !semicolon && (self.peek(Token::Dot) || self.peek(Token::SquareOpen)) { - if !(self.peek(Token::Dot) || self.peek(Token::SquareOpen)) { - self.non_greedy_expect(Token::Dot); - } - self.duplicate_location(); - // ExpressionStatement (`super`...) - let mut expr = Rc::new(Expression::Super(SuperExpression { - location: self.pop_location(), - object: arguments, - })); - expr = self.parse_subexpressions(expr, ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: expr, - })), semicolon) - } else { - // SuperStatement - let node = Rc::new(Directive::SuperStatement(SuperStatement { - location: self.pop_location(), - arguments: arguments.unwrap(), - })); - - // Check whether super statement is allowed here - let allowed_here; - if context.may_contain_super_statement() { - allowed_here = !context.super_statement_found(); - context.set_super_statement_found(true); - } else { - allowed_here = false; - } - - if !allowed_here { - self.add_syntax_error(&node.location(), DiagnosticKind::NotAllowedHere, diagarg![Token::Super]); - } - - (node, semicolon) - } - // EmptyStatement - } else if self.peek(Token::Semicolon) { - self.mark_location(); - self.next(); - (Rc::new(Directive::EmptyStatement(EmptyStatement { - location: self.pop_location(), - })), true) - // Block - } else if self.peek(Token::BlockOpen) { - let context = if context.is_top_level_or_package() || context.is_type_block() { - context.clone() - } else { - context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }) - }; - let block = self.parse_block(context); - (Rc::new(Directive::Block(block)), true) - // IfStatement - } else if self.peek(Token::If) { - self.parse_if_statement(context) - // SwitchStatement - // `switch type` - } else if self.peek(Token::Switch) { - self.parse_switch_statement(context) - // DoStatement - } else if self.peek(Token::Do) { - self.parse_do_statement(context) - // WhileStatement - } else if self.peek(Token::While) { - self.parse_while_statement(context) - // ForStatement - // `for..in` - // `for each` - } else if self.peek(Token::For) { - self.parse_for_statement(context) - // WithStatement - } else if self.peek(Token::With) { - self.parse_with_statement(context) - // BreakStatement - } else if self.peek(Token::Break) { - self.parse_break_statement(context) - // ContinueStatement - } else if self.peek(Token::Continue) { - self.parse_continue_statement(context) - // ReturnStatement - } else if self.peek(Token::Return) { - self.parse_return_statement(context) - // ThrowStatement - } else if self.peek(Token::Throw) { - self.parse_throw_statement(context) - // TryStatement - } else if self.peek(Token::Try) { - self.parse_try_statement(context) - // `default xml namespace = expression` - } else if self.peek(Token::Default) { - self.parse_default_xml_namespace_statement() - // ExpressionStatement - } else { - self.mark_location(); - - // Store offset for patching error - let i = self.tokenizer.characters().index(); - - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Patch error - if i == self.tokenizer.characters().index() { - self.patch_syntax_error(DiagnosticKind::ExpectingExpression, DiagnosticKind::ExpectingStatement, diagarg![self.token.0.clone()]); - } - - let semicolon = if exp.is_invalidated() { - self.next(); - true - } else { self.parse_semicolon() }; - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - } - - fn parse_statement_starting_with_identifier(&mut self, context: ParserDirectiveContext, id: (String, Location)) -> (Rc, bool) { - self.push_location(&id.1); - let id_location = id.1.clone(); - - // LabeledStatement - if self.consume(Token::Colon) { - let (substatement, semicolon) = self.parse_substatement(context.put_label(id.0.clone())); - let labeled = Rc::new(Directive::LabeledStatement(LabeledStatement { - location: self.pop_location(), - label: id.clone(), - substatement, - })); - return (labeled, semicolon); - } - - let mut exp: Rc; - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id.0 == "embed" && self.previous_token.1.character_count() == "embed".len() { - exp = self.finish_embed_expression(id_location); - } else { - */ - { - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - exp = Rc::new(Expression::QualifiedIdentifier(id)); - } else { - exp = id; - } - } - - exp = self.parse_subexpressions(exp, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - - fn parse_qualified_identifier_statement_or_normal_config(&mut self, context: ParserDirectiveContext, id: (String, Location), asdoc: Option>) -> (Rc, bool) { - self.push_location(&id.1); - let id_location = id.1.clone(); - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - let mut exp = Rc::new(Expression::QualifiedIdentifier(id)); - exp = self.parse_subexpressions(exp, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Parse CONFIG::VAR_NAME - if let Some(result) = self.parse_opt_normal_config(&exp, asdoc.clone(), context.clone()) { - return result; - } - - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - - fn parse_opt_normal_config(&mut self, exp: &Rc, asdoc: Option>, context: ParserDirectiveContext) -> Option<(Rc, bool)> { - if self.peek_annotatable_directive_identifier_name() { - match exp.to_normal_configuration_identifier(self) { - Ok(Some((q, constant_name, metadata))) => { - self.push_location(&exp.location()); - let mut context = AnnotatableContext { - start_location: exp.location(), - asdoc: self.parse_asdoc().or(asdoc), - attributes: metadata, - context, - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - let (directive, semicolon) = self.parse_annotatable_directive(context); - return Some((Rc::new(Directive::NormalConfigurationDirective(NormalConfigurationDirective { - location: self.pop_location(), - namespace: q, - constant_name, - directive, - })), semicolon)); - }, - Ok(None) => {}, - Err(MetadataRefineError1(MetadataRefineError::Syntax, loc)) => { - self.add_syntax_error(&loc, DiagnosticKind::UnrecognizedMetadataSyntax, diagarg![]); - }, - } - } - if self.peek(Token::BlockOpen) { - if let Some((q, constant_name)) = exp.to_normal_configuration_identifier_no_metadata() { - self.push_location(&exp.location()); - let block = self.parse_block(context); - return Some((Rc::new(Directive::NormalConfigurationDirective(NormalConfigurationDirective { - location: self.pop_location(), - namespace: q, - constant_name, - directive: Rc::new(Directive::Block(block)), - })), true)); - } - } - None - } - - fn parse_block(&mut self, context: ParserDirectiveContext) -> Block { - self.mark_location(); - self.non_greedy_expect(Token::BlockOpen); - let mut directives = vec![]; - if !self.expecting_token_error { - let mut semicolon = false; - while !self.peek(Token::BlockClose) && !self.peek(Token::Eof) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - self.non_greedy_expect(Token::BlockClose); - } - Block { - location: self.pop_location(), - directives, - } - } - - fn parse_if_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - self.mark_location(); - self.next(); - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut consequent: Rc = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let mut alternative: Option> = None; - let semicolon; - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - semicolon = self.parse_semicolon(); - } else { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - consequent = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenClose); - if self.expecting_token_error { - semicolon = self.parse_semicolon(); - } else { - let (consequent_1, semicolon_1) = self.parse_substatement(context.clone()); - consequent = consequent_1; - if self.peek(Token::Else) { - if !semicolon_1 { - self.non_greedy_expect_virtual_semicolon(); - } - self.next(); - let (alternative_2, semicolon_2) = self.parse_substatement(context.clone()); - alternative = Some(alternative_2); - semicolon = semicolon_2; - } else { - semicolon = semicolon_1; - } - } - } - (Rc::new(Directive::IfStatement(IfStatement { - location: self.pop_location(), - test, consequent, alternative, - })), semicolon) - } - - fn parse_switch_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - if self.peek_context_keyword("type") { - self.forbid_line_break_before_token(); - self.next(); - return self.parse_switch_type_statement(context); - } - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - let mut discriminant = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut cases: Vec = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - discriminant = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - self.non_greedy_expect(Token::BlockOpen); - if !self.expecting_token_error { - cases = self.parse_case_elements(context); - self.non_greedy_expect(Token::BlockClose); - } - } - } - (Rc::new(Directive::SwitchStatement(SwitchStatement { - location: self.pop_location(), - discriminant, cases, - })), true) - } - - fn parse_case_elements(&mut self, context: ParserDirectiveContext) -> Vec { - let mut cases = vec![]; - let mut semicolon = false; - while !self.peek(Token::BlockClose) { - if !cases.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - if !(self.peek(Token::Case) || self.peek(Token::Default)) { - break; - } - self.mark_location(); - let mut labels = vec![]; - loop { - if self.peek(Token::Case) { - self.mark_location(); - self.next(); - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - self.non_greedy_expect(Token::Colon); - labels.push(CaseLabel::Case((exp, self.pop_location()))); - } else if self.peek(Token::Default) { - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::Colon); - labels.push(CaseLabel::Default(self.pop_location())); - } else { - break; - } - } - let mut directives = vec![]; - semicolon = false; - while !(self.peek(Token::BlockClose) || self.peek(Token::Case) || self.peek(Token::Default)) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - cases.push(Case { - location: self.pop_location(), - labels, - directives, - }); - } - cases - } - - fn parse_switch_type_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - let mut discriminant = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut cases: Vec = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - discriminant = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - self.non_greedy_expect(Token::BlockOpen); - if !self.expecting_token_error { - cases = self.parse_type_case_elements(context); - self.non_greedy_expect(Token::BlockClose); - } - } - } - (Rc::new(Directive::SwitchTypeStatement(SwitchTypeStatement { - location: self.pop_location(), - discriminant, cases, - })), true) - } - - fn parse_type_case_elements(&mut self, context: ParserDirectiveContext) -> Vec { - let mut cases = vec![]; - while !self.peek(Token::BlockClose) && !self.peek(Token::Eof) { - if self.peek(Token::Default) { - self.mark_location(); - self.next(); - let block = Rc::new(self.parse_block(context.clone())); - cases.push(TypeCase { - location: self.pop_location(), - parameter: None, - block, - }); - } else { - self.mark_location(); - self.non_greedy_expect(Token::Case); - if !self.expecting_token_error { - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - let parameter = Some(self.parse_typed_destructuring()); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let block = Rc::new(self.parse_block(context.clone())); - cases.push(TypeCase { - location: self.pop_location(), - parameter, - block, - }); - } - } - } - } - } - cases - } - - fn parse_do_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // Body - let (body, semicolon_1) = self.parse_substatement(context); - if !semicolon_1 { - self.non_greedy_expect_virtual_semicolon(); - } - - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::While); - if !self.expecting_token_error { - test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - } - } - - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::DoStatement(DoStatement { - location: self.pop_location(), - body, test, - })), semicolon) - } - - fn parse_while_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // Test - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon: bool; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let (body_1, semicolon_1) = self.parse_substatement(context); - body = body_1; - semicolon = semicolon_1; - } else { - semicolon = self.parse_semicolon(); - } - } else { - semicolon = self.parse_semicolon(); - } - - (Rc::new(Directive::WhileStatement(WhileStatement { - location: self.pop_location(), - test, body, - })), semicolon) - } - - /// Parses `for`, `for..in` or `for each`. - fn parse_for_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // `for each` - if self.peek_context_keyword("each") { - self.forbid_line_break_before_token(); - self.next(); - return self.parse_for_each_statement(context); - } - - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - let body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ForStatement(ForStatement { - location: self.pop_location(), - init: None, test: None, update: None, body, - })), semicolon); - } - - let init_variable = if self.peek(Token::Var) || self.peek(Token::Const) { - Some(self.parse_simple_variable_definition(false)) - } else { - None - }; - - if init_variable.is_some() && self.consume(Token::In) { - return self.parse_for_in_statement_with_left_variable(context, init_variable.unwrap()); - } - - let mut init_exp = if init_variable.is_none() && !self.peek(Token::Semicolon) { - self.parse_opt_expression(ParserExpressionContext { - allow_in: false, - min_precedence: OperatorPrecedence::Postfix, - ..default() - }) - } else { - None - }; - - if init_exp.is_some() && self.consume(Token::In) { - return self.parse_for_in_statement_with_left_exp(context, init_exp.unwrap()); - } - - if init_exp.is_none() && init_variable.is_none() && !self.peek(Token::Semicolon) { - init_exp = Some(self.parse_expression(ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::List, ..default() - })); - } else if let Some(exp) = init_exp.as_ref() { - init_exp = Some(self.parse_subexpressions(exp.clone(), ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::List, ..default() - })); - } - - let init = if let Some(exp) = init_exp.as_ref() { - Some(ForInitializer::Expression(exp.clone())) - } else if let Some(variable) = init_variable.as_ref() { - Some(ForInitializer::VariableDefinition(Rc::new(variable.clone()))) - } else { - None - }; - - self.non_greedy_expect(Token::Semicolon); - let test = if self.peek(Token::Semicolon) { - None - } else { - Some(self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - })) - }; - self.non_greedy_expect(Token::Semicolon); - let update = if self.peek(Token::ParenClose) { - None - } else { - Some(self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - })) - }; - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForStatement(ForStatement { - location: self.pop_location(), - init, test, update, body, - })), semicolon) - } - - fn parse_for_each_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - let left = ForInBinding::Expression(self.create_invalidated_expression(&self.tokenizer.cursor_location())); - let right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: true, left, right, body, - })), semicolon); - } - - let left = if self.peek(Token::Var) || self.peek(Token::Const) { - self.mark_location(); - let kind = (if self.peek(Token::Var) { VariableDefinitionKind::Var } else { VariableDefinitionKind::Const }, self.token_location()); - self.next(); - let binding = self.parse_variable_binding(false); - if let Some(init) = &binding.initializer { - self.add_syntax_error(&init.location(), DiagnosticKind::IllegalForInInitializer, vec![]); - } - ForInBinding::VariableDefinition(Rc::new(SimpleVariableDefinition { - location: self.pop_location(), - kind, - bindings: vec![Rc::new(binding)], - })) - } else { - ForInBinding::Expression(self.parse_expression(ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::Postfix, ..default() - })) - }; - let mut right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::In); - if !self.expecting_token_error { - right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - } - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: true, left, right, body, - })), semicolon) - } - - fn parse_for_in_statement_with_left_variable(&mut self, context: ParserDirectiveContext, left: SimpleVariableDefinition) -> (Rc, bool) { - let variable_binding = left.bindings[0].clone(); - - if let Some(init) = &variable_binding.initializer { - self.add_syntax_error(&init.location(), DiagnosticKind::IllegalForInInitializer, vec![]); - } - - if left.bindings.len() > 1 { - self.add_syntax_error(&left.kind.1.clone(), DiagnosticKind::MultipleForInBindings, vec![]); - } - - let right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: false, left: ForInBinding::VariableDefinition(Rc::new(left)), right, body, - })), semicolon) - } - - fn parse_for_in_statement_with_left_exp(&mut self, context: ParserDirectiveContext, left: Rc) -> (Rc, bool) { - let right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: false, left: ForInBinding::Expression(left), right, body, - })), semicolon) - } - - fn parse_simple_variable_definition(&mut self, allow_in: bool) -> SimpleVariableDefinition { - self.mark_location(); - let kind: VariableDefinitionKind; - let kind_location = self.token_location(); - if self.consume(Token::Const) { - kind = VariableDefinitionKind::Const; - } else { - self.non_greedy_expect(Token::Var); - kind = VariableDefinitionKind::Var; - } - let mut bindings = vec![Rc::new(self.parse_variable_binding(allow_in))]; - while self.consume(Token::Comma) { - bindings.push(Rc::new(self.parse_variable_binding(allow_in))); - } - SimpleVariableDefinition { - location: self.pop_location(), - kind: (kind, kind_location), - bindings, - } - } - - fn parse_with_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - self.mark_location(); - self.next(); - - let mut object = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - object = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - } - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::WithStatement(WithStatement { - location: self.pop_location(), - object, body, - })), semicolon) - } - - fn parse_break_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let label = if self.previous_token.1.line_break(&self.token.1) { None } else { self.consume_identifier(false) }; - let label_location = label.clone().map(|label| label.1.clone()); - let label = label.map(|label| label.0.clone()); - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::BreakStatement(BreakStatement { - location: self.pop_location(), - label: label.clone().map(|l| (l.clone(), label_location.clone().unwrap())), - })); - - if label.is_some() && !context.is_label_defined(label.clone().unwrap()) { - self.add_syntax_error(&label_location.unwrap(), DiagnosticKind::UndefinedLabel, diagarg![label.clone().unwrap()]); - } else if !context.is_break_allowed(label) { - self.add_syntax_error(&node.location(), DiagnosticKind::IllegalBreak, vec![]); - } - - (node, semicolon) - } - - fn parse_continue_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let label = if self.previous_token.1.line_break(&self.token.1) { None } else { self.consume_identifier(false) }; - let label_location = label.clone().map(|label| label.1.clone()); - let label = label.map(|label| label.0.clone()); - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ContinueStatement(ContinueStatement { - location: self.pop_location(), - label: label.clone().map(|l| (l.clone(), label_location.clone().unwrap())), - })); - - if label.is_some() && !context.is_label_defined(label.clone().unwrap()) { - self.add_syntax_error(&label_location.unwrap(), DiagnosticKind::UndefinedLabel, diagarg![label.clone().unwrap()]); - } else if !context.is_continue_allowed(label) { - self.add_syntax_error(&node.location(), DiagnosticKind::IllegalContinue, vec![]); - } - - (node, semicolon) - } - - fn parse_return_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let expression = if self.previous_token.1.line_break(&self.token.1) { None } else { - self.parse_opt_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }) - }; - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ReturnStatement(ReturnStatement { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_throw_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let line_break = self.previous_token.1.line_break(&self.token.1); - - let expression = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - - if line_break { - self.add_syntax_error(&expression.location(), DiagnosticKind::ExpressionMustNotFollowLineBreak, vec![]); - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ThrowStatement(ThrowStatement { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_try_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - let context = context.clone_control(); - let block = Rc::new(self.parse_block(context.clone())); - let mut catch_clauses: Vec = vec![]; - let mut finally_clause: Option = None; - let mut found_catch = false; - loop { - if self.peek(Token::Catch) { - found_catch = true; - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - let parameter = self.parse_typed_destructuring(); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let block = Rc::new(self.parse_block(context.clone())); - catch_clauses.push(CatchClause { - location: self.pop_location(), - parameter, - block, - }); - } - } - } else if self.peek(Token::Finally) { - self.mark_location(); - self.next(); - let block = Rc::new(self.parse_block(context.clone())); - finally_clause = Some(FinallyClause { - location: self.pop_location(), - block, - }); - break; - } else { - break; - } - } - if !found_catch && finally_clause.is_none() { - self.non_greedy_expect(Token::Catch); - } - - let node = Rc::new(Directive::TryStatement(TryStatement { - location: self.pop_location(), - block, catch_clauses, finally_clause, - })); - - (node, true) - } - - fn parse_default_xml_namespace_statement(&mut self) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let mut expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.forbid_line_break_before_token(); - self.non_greedy_expect_context_keyword("xml"); - if !self.expecting_token_error { - expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.forbid_line_break_before_token(); - self.non_greedy_expect_context_keyword("namespace"); - if !self.expecting_token_error { - expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Assign); - - if !self.expecting_token_error { - expression = self.parse_expression(ParserExpressionContext { - allow_in: true, - allow_assignment: false, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::DefaultXmlNamespaceStatement(DefaultXmlNamespaceStatement { - location: self.pop_location(), - right: expression, - })); - - (node, semicolon) - } - - fn forbid_line_break_before_token(&mut self) { - if self.previous_token.1.line_break(&self.token.1) { - self.add_syntax_error(&self.token.1.clone(), DiagnosticKind::TokenMustNotFollowLineBreak, vec![]); - } - } - - fn parse_directive(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let asdoc: Option> = if self.peek(Token::SquareOpen) { None } else { self.parse_asdoc() }; - // ConfigurationDirective or Statement - if let Token::Identifier(id) = &self.token.0 { - let id = (id.clone(), self.token_location()); - self.next(); - - if id.0 == "include" && id.1.character_count() == "include".len() && matches!(self.token.0, Token::String(_)) && !self.previous_token.1.line_break(&self.token.1) { - return self.parse_include_directive(context, id.1); - } - - if self.peek(Token::BlockOpen) && &id.0 == "configuration" && id.1.character_count() == "configuration".len() { - return self.parse_configuration_directive(context, id.1); - } - - // If there is a line break or offending token is "::", - // do not proceed into parsing an expression attribute or annotatble directive. - let eligible_attribute_or_directive - = !self.previous_token.1.line_break(&self.token.1) - && !(matches!(self.token.0, Token::ColonColon)); - - if eligible_attribute_or_directive && (self.peek_annotatable_directive_identifier_name() || self.lookbehind_is_annotatable_directive_identifier_name()) { - let mut context1: AnnotatableContext; - - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) - && id.1.character_count() == id.0.len() - && self.token.0.is_identifier_name() { - context1 = AnnotatableContext { - start_location: id.1.clone(), - asdoc, - attributes: vec![], - context: context.clone(), - directive_context_keyword: Some(id.clone()), - }; - // self.parse_attribute_keywords_or_expressions(&mut context); - } else { - let mut first_attr_expr = self.parse_expression_starting_with_identifier(id); - first_attr_expr = self.parse_subexpressions(first_attr_expr, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Do not proceed into parsing an annotatable directive - // if there is a line break after an expression attribute, - // or if the offending token is not an identifier name, - // or if the expression attribute is not a valid access modifier. - if !first_attr_expr.valid_access_modifier() || self.previous_token.1.line_break(&self.token.1) || !(matches!(self.token.0, Token::Identifier(_)) || self.token.0.is_reserved_word()) { - self.push_location(&first_attr_expr.location()); - - // Parse CONFIG::VAR_NAME - if let Some(result) = self.parse_opt_normal_config(&first_attr_expr, asdoc.clone(), context.clone()) { - return result; - } - - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: first_attr_expr, - })), semicolon); - } - - let first_attr = self.keyword_or_expression_attribute_from_expression(&first_attr_expr); - - context1 = AnnotatableContext { - start_location: first_attr.location(), - asdoc, - attributes: vec![first_attr], - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context1); - } - return self.parse_annotatable_directive(context1); - } else if self.peek(Token::ColonColon) { - self.parse_qualified_identifier_statement_or_normal_config(context, id, asdoc) - } else { - self.parse_statement_starting_with_identifier(context, id) - } - } else if self.peek(Token::Import) { - self.parse_import_directive_or_expression_statement(context) - } else if self.peek(Token::SquareOpen) { - self.mark_location(); - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - if self.peek_annotatable_directive_identifier_name() { - match exp.to_metadata(self) { - Ok(Some(metadata)) => { - let mut context = AnnotatableContext { - start_location: self.pop_location(), - asdoc: self.parse_asdoc(), - attributes: metadata, - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - return self.parse_annotatable_directive(context); - }, - Ok(None) => {}, - Err(MetadataRefineError1(MetadataRefineError::Syntax, loc)) => { - self.add_syntax_error(&loc, DiagnosticKind::UnrecognizedMetadataSyntax, diagarg![]); - }, - } - } - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } else if self.peek(Token::Public) || self.peek(Token::Private) || self.peek(Token::Protected) - || self.peek(Token::Internal) || self.peek(Token::Var) || self.peek(Token::Const) - || self.peek(Token::Function) || self.peek(Token::Class) || self.peek(Token::Interface) { - let is_public = self.peek(Token::Public); - let rns = self.parse_opt_reserved_namespace(); - let mut attributes: Vec = vec![]; - if let Some(rns) = rns { - // The public += ns.*; directive - if self.peek(Token::AddAssign) && is_public { - return self.parse_package_concat_directive(&rns.location(), context); - } - - // Do not proceed into parsing an annotatable directive - // if there is a "::" token. - if matches!(self.token.0, Token::ColonColon) { - self.push_location(&rns.location()); - let rns = Rc::new(Expression::QualifiedIdentifier(self.finish_qualified_identifier(false, rns.location(), rns))); - let rns = self.parse_subexpressions(rns, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: rns, - })), semicolon); - } - attributes.push(rns.to_reserved_namespace_attribute().unwrap()); - } - let mut context = AnnotatableContext { - start_location: self.token_location(), - asdoc, - attributes, - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - return self.parse_annotatable_directive(context); - } else if self.peek(Token::Use) { - self.parse_use_namespace_directive() - } else { - let i = self.tokenizer.characters().index(); - let r = self.parse_statement(context); - if i == self.tokenizer.characters().index() { - self.patch_syntax_error(DiagnosticKind::ExpectingStatement, DiagnosticKind::ExpectingDirective, diagarg![self.token.0.clone()]); - } - r - } - } - - fn parse_directives(&mut self, context: ParserDirectiveContext) -> Vec> { - let mut directives = vec![]; - let mut semicolon = false; - while !self.peek(Token::Eof) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - directives - } - - fn parse_expression_attribute(&mut self, id: &(String, Location)) -> Rc { - let mut result = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - loop { - if self.peek(Token::Dot) { - self.push_location(&result.location()); - self.next(); - let id = self.parse_qualified_identifier(); - result = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: result, identifier: id - })); - } else if self.consume(Token::SquareOpen) { - self.push_location(&result.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - result = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base: result, asdoc: None, key, location: self.pop_location() - })); - } else { - break; - } - } - result - } - - fn report_modifier_errors(&self, context: &AnnotatableContext) { - let mut i = 0usize; - while i < context.attributes.len() { - let a = &context.attributes[i]; - if Attribute::has(&context.attributes[..i], &a) { - self.add_syntax_error(&a.location(), DiagnosticKind::DuplicateAttribute, diagarg![]); - } - if Attribute::is_duplicate_access_modifier(&context.attributes[..i], &a) { - self.add_syntax_error(&a.location(), DiagnosticKind::DuplicateAccessModifier, diagarg![]); - } - i += 1; - } - } - - fn parse_annotatable_directive(&mut self, context: AnnotatableContext) -> (Rc, bool) { - if self.peek(Token::Var) || self.peek(Token::Const) { - self.report_modifier_errors(&context); - self.parse_variable_definition(context) - } else if self.consume(Token::Function) { - self.report_modifier_errors(&context); - self.parse_function_definition(context) - } else if self.consume(Token::Class) { - self.report_modifier_errors(&context); - self.parse_class_definition(context) - } else if context.has_directive_context_keyword("enum") { - self.report_modifier_errors(&context); - self.parse_enum_definition(context) - } else if context.has_directive_context_keyword("namespace") { - self.report_modifier_errors(&context); - self.parse_namespace_definition(context) - } else if self.consume(Token::Interface) { - self.report_modifier_errors(&context); - self.parse_interface_definition(context) - } else if context.has_directive_context_keyword("type") { - self.report_modifier_errors(&context); - self.parse_type_definition(context) - } else { - // In case there is a series of inline modifiers, - // report semicolon error between each. - let mut i = 0usize; - let mut error = false; - while i < context.attributes.len() { - if !context.attributes[i].is_metadata() { - let loc1 = context.attributes[i].location(); - if i + 1 < context.attributes.len() { - let loc2 = context.attributes[i + 1].location(); - if !loc1.line_break(&loc2) { - self.add_syntax_error(&loc2, DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere, vec![]); - error = true; - } - } - } - i += 1; - } - - if !error { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingDirectiveKeyword, diagarg![self.token.0.clone()]); - } - self.push_location(&context.start_location); - let loc = self.pop_location(); - (self.create_invalidated_directive(&loc), true) - } - } - - pub(crate) fn refine_metadata(&self, exp: &Rc, asdoc: Option>) -> Result, MetadataRefineError> { - if let Expression::Call(CallExpression { base, arguments, .. }) = exp.as_ref() { - let Ok(name) = self.refine_metadata_name(base) else { - return Err(MetadataRefineError::Syntax); - }; - Ok(Rc::new(Metadata { - location: exp.location(), - asdoc, - name, - entries: Some(self.refine_metadata_entries(arguments)?), - })) - } else { - if let Ok(name) = self.refine_metadata_name(exp) { - Ok(Rc::new(Metadata { - location: exp.location(), - asdoc, - name, - entries: None, - })) - } else { - Err(MetadataRefineError::Syntax) - } - } - } - - fn refine_metadata_name(&self, exp: &Rc) -> Result<(String, Location), MetadataRefineError> { - if let Expression::QualifiedIdentifier(id) = exp.as_ref() { - if id.attribute { - return Err(MetadataRefineError::Syntax); - } - let qual = id.qualifier.as_ref().and_then(|q| q.to_identifier_name().map(|n| n.0)); - if id.qualifier.is_some() && qual.is_none() { - return Err(MetadataRefineError::Syntax); - } - if let QualifiedIdentifierIdentifier::Id((s, _)) = &id.id { - if s == "*" { Err(MetadataRefineError::Syntax) } else { Ok((if let Some(q) = qual { format!("{q}::{s}") } else { s.to_string() }, exp.location())) } - } else { - Err(MetadataRefineError::Syntax) - } - } else { - Err(MetadataRefineError::Syntax) - } - } - - fn refine_metadata_entries(&self, list: &Vec>) -> Result>, MetadataRefineError> { - let mut r = Vec::>::new(); - for entry in list { - r.push(self.refine_metadata_entry(&entry)?); - } - Ok(r) - } - - fn refine_metadata_entry(&self, exp: &Rc) -> Result, MetadataRefineError> { - match exp.as_ref() { - Expression::Assignment(AssignmentExpression { compound, left, right, location }) => { - if compound.is_some() { - return Err(MetadataRefineError::Syntax); - } - let key = self.refine_metadata_name(left)?; - if matches!(right.as_ref(), Expression::QualifiedIdentifier(_)) { - return Err(MetadataRefineError::Syntax); - } - let value = self.refine_metadata_value(right)?; - Ok(Rc::new(MetadataEntry { - location: location.clone(), - key: Some(key), - value: Rc::new(value), - })) - }, - _ => { - let value = self.refine_metadata_value(exp)?; - Ok(Rc::new(MetadataEntry { - location: exp.location(), - key: None, - value: Rc::new(value), - })) - }, - } - } - - fn refine_metadata_value(&self, exp: &Rc) -> Result { - match exp.as_ref() { - Expression::QualifiedIdentifier(_) => { - let name = self.refine_metadata_name(&exp)?; - Ok(MetadataValue::IdentifierString(name)) - }, - Expression::StringLiteral(StringLiteral { value, .. }) => Ok(MetadataValue::String((value.clone(), exp.location()))), - _ => Err(MetadataRefineError::Syntax), - } - } - - fn parse_package_concat_directive(&mut self, start: &Location, context: ParserDirectiveContext) -> (Rc, bool) { - self.push_location(start); - self.next(); - let mut package_name: Vec<(String, Location)> = vec![self.expect_identifier(false)]; - let mut import_specifier = ImportSpecifier::Wildcard(self.token_location()); - - if !self.peek(Token::Dot) { - self.non_greedy_expect(Token::Dot); - } - - while self.consume(Token::Dot) { - if self.peek(Token::Times) { - import_specifier = ImportSpecifier::Wildcard(self.token_location()); - self.next(); - break; - } else if self.peek(Token::Power) { - import_specifier = ImportSpecifier::Recursive(self.token_location()); - self.next(); - break; - } else { - let id1 = self.expect_identifier(true); - if !self.peek(Token::Dot) { - import_specifier = ImportSpecifier::Identifier(id1.clone()); - break; - } else { - package_name.push(id1.clone()); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::PackageConcatDirective(PackageConcatDirective { - location: self.pop_location(), - package_name, - import_specifier, - })); - - if !(matches!(context, ParserDirectiveContext::PackageBlock)) { - self.add_syntax_error(&node.location(), DiagnosticKind::UnexpectedDirective, vec![]); - } - - (node, semicolon) - } - - fn parse_import_directive_or_expression_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - if self.consume(Token::Dot) { - self.duplicate_location(); - self.non_greedy_expect_context_keyword("meta"); - let mut expression = Rc::new(Expression::ImportMeta(ImportMeta { - location: self.pop_location(), - })); - expression = self.parse_subexpressions(expression, ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression, - })), semicolon) - } else { - let mut alias: Option<(String, Location)> = None; - let mut package_name: Vec<(String, Location)> = vec![]; - let mut import_specifier = ImportSpecifier::Wildcard(self.token_location()); - let id1 = self.expect_identifier(false); - if self.consume(Token::Assign) { - alias = Some(id1.clone()); - package_name.push(self.expect_identifier(false)); - } else { - package_name.push(id1); - } - - if !self.peek(Token::Dot) { - self.non_greedy_expect(Token::Dot); - } - - while self.consume(Token::Dot) { - if self.peek(Token::Times) { - import_specifier = ImportSpecifier::Wildcard(self.token_location()); - self.next(); - break; - } else if self.peek(Token::Power) { - import_specifier = ImportSpecifier::Recursive(self.token_location()); - self.next(); - break; - } else { - let id1 = self.expect_identifier(true); - if !self.peek(Token::Dot) { - import_specifier = ImportSpecifier::Identifier(id1.clone()); - break; - } else { - package_name.push(id1.clone()); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ImportDirective(ImportDirective { - location: self.pop_location(), - alias, - package_name, - import_specifier, - })); - - (node, semicolon) - } - } - - fn parse_include_directive(&mut self, context: ParserDirectiveContext, start: Location) -> (Rc, bool) { - self.push_location(&start); - let source_path_location = self.token_location(); - let Token::String(source) = &self.token.0.clone() else { - panic!(); - }; - let source = source.clone(); - self.next(); - let semicolon = self.parse_semicolon(); - - let nested_compilation_unit: Rc; - - // Select origin file path - let origin_file_path = if let Some(file_path) = self.tokenizer.compilation_unit().file_path.clone() { - Some(file_path) - } else { - std::env::current_dir().ok().map(|d| d.to_string_lossy().into_owned()) - }; - - // Resolve source - if let Some(origin_file_path) = origin_file_path { - let sub_file_path = file_paths::FlexPath::from_n_native([origin_file_path.as_ref(), "..", source.as_ref()]).to_string_with_flex_separator(); - if self.tokenizer.compilation_unit().include_directive_is_circular(&sub_file_path) { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::CircularIncludeDirective, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } else { - if let Ok(content) = std::fs::read_to_string(&sub_file_path) { - nested_compilation_unit = CompilationUnit::new(Some(sub_file_path.clone()), content); - } else { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::FailedToIncludeFile, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } - } - } else { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::ParentSourceIsNotAFile, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } - - // Let it be such that the sub compilation unit is subsequent of - // the super compilation unit. - nested_compilation_unit.set_included_from(Some(self.tokenizer.compilation_unit().clone())); - - // Inherit compiler options - nested_compilation_unit.set_compiler_options(self.tokenizer.compilation_unit().compiler_options()); - - // Add sub compilation unit to super compilation unit - self.tokenizer.compilation_unit().add_nested_compilation_unit(nested_compilation_unit.clone()); - - // Parse directives from replacement source - let (nested_packages, nested_directives) = parse_include_directive_source(nested_compilation_unit.clone(), context); - - // Delegate sub compilation unit errors to super compilation unit - if nested_compilation_unit.invalidated() { - self.tokenizer.compilation_unit().invalidated.set(true); - } - - let node = Rc::new(Directive::IncludeDirective(IncludeDirective { - location: self.pop_location(), - source, - nested_packages, - nested_directives, - nested_compilation_unit: nested_compilation_unit.clone(), - })); - - (node, semicolon) - } - - fn parse_use_namespace_directive(&mut self) -> (Rc, bool) { - self.mark_location(); - self.next(); - let mut expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect_context_keyword("namespace"); - if !self.expecting_token_error { - expression = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - ..default() - }); - } - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::UseNamespaceDirective(UseNamespaceDirective { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_variable_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - let has_static = Attribute::find_static(&attributes).is_some(); - self.push_location(&start_location); - let kind_location = self.token_location(); - let kind = if self.consume(Token::Const) { - VariableDefinitionKind::Const - } else { - self.non_greedy_expect(Token::Var); - VariableDefinitionKind::Var - }; - let mut bindings = vec![Rc::new(self.parse_variable_binding(true))]; - while self.consume(Token::Comma) { - bindings.push(Rc::new(self.parse_variable_binding(true))); - } - - // Forbid destructuring bindings in enumerations. - if !has_static && matches!(context, ParserDirectiveContext::EnumBlock) { - if kind != VariableDefinitionKind::Const { - self.add_syntax_error(&kind_location, DiagnosticKind::EnumMembersMustBeConst, diagarg![]); - } - for binding in &bindings { - let malformed = !matches!(binding.destructuring.destructuring.as_ref(), Expression::QualifiedIdentifier(_)) - || binding.destructuring.type_annotation.is_some(); - if malformed { - self.add_syntax_error(&binding.location(), DiagnosticKind::MalformedEnumMember, diagarg![]); - } - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => { - if !context.is_type_block() { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let semicolon = self.parse_semicolon(); - let node = Rc::new(Directive::VariableDefinition(VariableDefinition { - location: self.pop_location(), - asdoc, - attributes, - kind: (kind, kind_location), - bindings, - })); - - (node, semicolon) - } - - fn parse_function_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - let has_native = Attribute::find_native(&attributes).is_some(); - let has_abstract = Attribute::find_abstract(&attributes).is_some(); - self.push_location(&start_location); - let mut name = self.expect_identifier(true); - let mut getter = false; - let mut setter = false; - if self.peek_identifier(true).is_some() { - getter = Token::is_context_keyword(&self.previous_token, "get"); - setter = Token::is_context_keyword(&self.previous_token, "set"); - if getter || setter { - name = self.expect_identifier(true); - } - } - let constructor = !getter && !setter && context.function_name_is_constructor(&name); - let name = if getter { - FunctionName::Getter(name) - } else if setter { - FunctionName::Setter(name) - } else if constructor { - FunctionName::Constructor(name) - } else { - FunctionName::Identifier(name) - }; - let block_context = if constructor { - ParserDirectiveContext::ConstructorBlock { super_statement_found: Rc::new(Cell::new(false)) } - } else { - ParserDirectiveContext::Default - }; - let common = self.parse_function_common(false, block_context, true); - let semicolon = if common.has_block_body() { true } else { self.parse_semicolon() }; - - /* - if constructor && common.signature.result_type.is_some() { - self.add_syntax_error(&name.location(), DiagnosticKind::ConstructorMustNotSpecifyResultType, diagarg![]); - } - */ - - // Not all kinds of functions may be generators. - if common.contains_yield && (constructor || getter || setter) { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMayNotBeGenerator, diagarg![]); - } - - // Not all kinds of functions may be asynchronous. - if common.contains_await && (constructor || getter || setter) { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMayNotBeAsynchronous, diagarg![]); - } - - let interface_method = matches!(context, ParserDirectiveContext::InterfaceBlock); - - // Body verification. - // - // Note that interface methods must never have a body unlike in Java. - if (interface_method || has_native || has_abstract) && common.body.is_some() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustNotContainBody, diagarg![]); - } else if !(interface_method || has_native || has_abstract) && common.body.is_none() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustContainBody, diagarg![]); - } - - // Interface methods must not contain any annotations except for meta-data. - if !attributes.is_empty() && interface_method { - if !attributes.last().unwrap().is_metadata() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustNotContainAnnotations, diagarg![]); - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => { - if !context.is_type_block() { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - Attribute::Final(_) | - Attribute::Override(_) | - Attribute::Abstract(_) => { - if !context.is_type_block() || constructor { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - - Attribute::Native(_) => {}, - - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let node = Rc::new(Directive::FunctionDefinition(FunctionDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - common, - })); - - (node, semicolon) - } - - fn parse_class_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let type_parameters = self.parse_type_parameters_opt(); - let mut extends_clause: Option> = None; - if self.consume(Token::Extends) { - extends_clause = Some(self.parse_type_expression()); - } - let mut implements_clause: Option>> = None; - if self.consume(Token::Implements) { - implements_clause = Some(self.parse_type_expression_list()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::ClassBlock { - name: name.0.clone(), - })); - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => {}, - Attribute::Final(_) => {}, - Attribute::Dynamic(_) => {}, - Attribute::Abstract(_) => {}, - - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let node = Rc::new(Directive::ClassDefinition(ClassDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - type_parameters, - extends_clause, - implements_clause, - block, - })); - - (node, true) - } - - fn parse_enum_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, mut attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let mut as_clause: Option> = None; - if self.consume(Token::As) { - as_clause = Some(self.parse_type_expression()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::EnumBlock)); - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let mut is_set = false; - let metadata = Attribute::find_metadata(&attributes); - for metadata in metadata { - if metadata.name.0 == "Set" { - is_set = true; - Attribute::remove_metadata(&mut attributes, &metadata); - } - } - - let node = Rc::new(Directive::EnumDefinition(EnumDefinition { - location: self.pop_location(), - asdoc, - attributes, - is_set, - name: name.clone(), - as_clause, - block, - })); - - (node, true) - } - - fn parse_interface_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let type_parameters = self.parse_type_parameters_opt(); - let mut extends_clause: Option>> = None; - if self.consume(Token::Extends) { - extends_clause = Some(self.parse_type_expression_list()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::InterfaceBlock)); - - // Interface block must only contain function definitions - for directive in block.directives.iter() { - if !(matches!(directive.as_ref(), Directive::FunctionDefinition(_))) { - self.add_syntax_error(&directive.location(), DiagnosticKind::UnexpectedDirective, diagarg![]); - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let node = Rc::new(Directive::InterfaceDefinition(InterfaceDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - type_parameters, - extends_clause, - block, - })); - - (node, true) - } - - fn parse_type_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let left = self.expect_identifier(true); - let mut right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Assign); - if !self.expecting_token_error { - right = self.parse_type_expression(); - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&left.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::TypeDefinition(TypeDefinition { - location: self.pop_location(), - asdoc, - attributes, - left: left.clone(), - right, - })); - - (node, semicolon) - } - - fn parse_namespace_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let left = self.expect_identifier(true); - let mut right: Option> = None; - if self.consume(Token::Assign) { - right = Some(self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - Attribute::Static(_) => {}, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::NamespaceDefinition(NamespaceDefinition { - location: self.pop_location(), - asdoc, - attributes, - left: left.clone(), - right, - })); - - (node, semicolon) - } - - fn parse_type_expression_list(&mut self) -> Vec> { - let mut list = vec![self.parse_type_expression()]; - while self.consume(Token::Comma) { - list.push(self.parse_type_expression()); - } - list - } - - fn verify_visibility(&self, a: &Attribute, context: &ParserDirectiveContext) { - let mut unallowed = false; - match a { - Attribute::Expression(_) => {}, - Attribute::Public(_) => {}, - Attribute::Private(_) | - Attribute::Protected(_) => { - if !context.is_type_block() { - unallowed = true; - } - }, - Attribute::Internal(_) => {}, - _ => {} - } - if unallowed { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - } - - fn parse_type_parameters_opt(&mut self) -> Option>> { - if !self.consume(Token::Dot) { - return None; - } - let mut list: Vec> = vec![]; - self.non_greedy_expect(Token::Lt); - if !self.expecting_token_error { - list.push(self.parse_type_parameter()); - while self.consume(Token::Comma) { - list.push(self.parse_type_parameter()); - } - self.non_greedy_expect_type_parameters_gt(); - } - Some(list) - } - - fn parse_type_parameter(&mut self) -> Rc { - self.mark_location(); - let name = self.expect_identifier(false); - Rc::new(TypeParameter { - location: self.pop_location(), - name, - }) - } - - fn parse_configuration_directive(&mut self, context: ParserDirectiveContext, start_location: Location) -> (Rc, bool) { - self.push_location(&start_location); - self.non_greedy_expect(Token::BlockOpen); - let subdirective = self.parse_configuration_subdirective(context.clone()); - self.non_greedy_expect(Token::BlockClose); - (Rc::new(Directive::ConfigurationDirective(ConfigurationDirective { - location: self.pop_location(), - directive: subdirective, - })), true) - } - - fn parse_configuration_subdirective(&mut self, context: ParserDirectiveContext) -> Rc { - if self.peek(Token::If) { - self.mark_location(); - self.next(); - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_expression(ParserExpressionContext { ..default() }); - } - self.non_greedy_expect(Token::ParenClose); - let consequent = Rc::new(Directive::Block(self.parse_block(context.clone()))); - let mut alternative: Option> = None; - if self.consume(Token::Else) { - alternative = Some(self.parse_configuration_subdirective(context.clone())); - } - Rc::new(Directive::IfStatement(IfStatement { - location: self.pop_location(), - test, - consequent, - alternative, - })) - } else { - Rc::new(Directive::Block(self.parse_block(context.clone()))) - } - } - - fn keyword_or_expression_attribute_from_expression(&self, expr: &Rc) -> Attribute { - match expr.as_ref() { - Expression::QualifiedIdentifier(id) => { - if id.qualifier.is_some() || id.attribute { - return Attribute::Expression(expr.clone()); - } - match &id.id { - QualifiedIdentifierIdentifier::Id((id, location)) => { - if let Some(attr) = Attribute::from_identifier_name(&id, &location) { - return attr; - } - Attribute::Expression(expr.clone()) - }, - _ => Attribute::Expression(expr.clone()), - } - }, - _ => Attribute::Expression(expr.clone()), - } - } - - fn keyword_attribute_from_previous_token(&self) -> Option { - self.previous_token.0.to_attribute(&self.previous_token.1) - } - - fn _keyword_or_expression_attribute_from_previous_token(&mut self) -> Option { - if let Some(a) = self.keyword_attribute_from_previous_token() { - return Some(a); - } - match &self.previous_token.0 { - Token::Identifier(id) => Some(Attribute::Expression(self.parse_expression_attribute(&(id.clone(), self.previous_token.1.clone())))), - _ => None, - } - } - - fn parse_keyword_or_expression_attribute(&mut self) -> Option { - if let Some(a) = self.token.0.to_attribute(&self.token.1) { - self.next(); - return Some(a); - } - match &self.token.0 { - Token::Identifier(_) => { - let id = self.expect_identifier(false); - Some(Attribute::Expression(self.parse_expression_attribute(&id))) - }, - _ => None, - } - } - - fn peek_annotatable_directive_identifier_name(&self) -> bool { - if self.token.0.to_attribute(&self.token.1).is_some() { - return true; - } - match self.token.0 { - Token::Identifier(_) => true, - Token::Var | - Token::Const | - Token::Function | - Token::Class | - Token::Interface => true, - _ => false, - } - } - - fn lookbehind_is_annotatable_directive_identifier_name(&self) -> bool { - self.keyword_attribute_from_previous_token().is_some() - || matches!(&self.previous_token.0, Token::Identifier(_)) - || Token::is_context_keyword(&self.previous_token, "enum") - || Token::is_context_keyword(&self.previous_token, "type") - || Token::is_context_keyword(&self.previous_token, "namespace") - } - - fn parse_attribute_keywords_or_expressions(&mut self, context: &mut AnnotatableContext) { - if context.directive_context_keyword.is_some() { - unreachable!(); - } - loop { - if let Some(a) = self.parse_keyword_or_expression_attribute() { - if let Attribute::Expression(e) = &a { - let id = e.to_identifier_name(); - if let Some(id) = id { - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) { - context.directive_context_keyword = Some(id); - break; - } - } - } - let last_attribute_is_identifier = context.attributes.last().map_or(false, |a| !a.is_metadata()); - if last_attribute_is_identifier { - self.forbid_line_break_before_token(); - } - context.attributes.push(a); - // self.next(); - } else { - if let Some(id) = self.peek_identifier(false) { - self.forbid_line_break_before_token(); - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) { - self.next(); - context.directive_context_keyword = Some(id); - } - } - break; - } - } - // For meta-data that are not one of certain Flex meta-data, - // delegate the respective ASDoc to the annotatable directive. - let mut new_attributes = Vec::::new(); - for attr in &context.attributes { - if let Attribute::Metadata(metadata) = attr { - if !is_flex_documentable_meta_data(&metadata.name.0) && metadata.asdoc.is_some() { - new_attributes.push(Attribute::Metadata(Rc::new(Metadata { - location: metadata.location.clone(), - asdoc: None, - name: metadata.name.clone(), - entries: metadata.entries.clone(), - }))); - context.asdoc = metadata.asdoc.clone(); - } else { - new_attributes.push(attr.clone()); - } - } else { - new_attributes.push(attr.clone()); - } - } - context.attributes = new_attributes; - } - - pub fn parse_package_definition(&mut self) -> Rc { - self.mark_location(); - let asdoc = self.parse_asdoc(); - self.non_greedy_expect(Token::Package); - let mut name = vec![]; - if let Some(name1) = self.consume_identifier(false) { - name.push(name1.clone()); - while self.consume(Token::Dot) { - name.push(self.expect_identifier(true)); - } - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::PackageBlock)); - Rc::new(PackageDefinition { - location: self.pop_location(), - asdoc, - name, - block, - }) - } - - pub fn parse_program(&mut self) -> Rc { - self.mark_location(); - let just_eof = self.peek(Token::Eof); - let mut packages = vec![]; - while self.peek(Token::Package) { - packages.push(self.parse_package_definition()); - } - let directives = self.parse_directives(ParserDirectiveContext::TopLevel); - Rc::new(Program { - location: if just_eof { - self.pop_location(); - self.token.1.clone() - } else { - self.pop_location() - }, - packages, - directives, - }) - } - - pub fn parse_asdoc(&mut self) -> Option> { - let comments = self.compilation_unit().comments.borrow(); - let last_comment = comments.last().map(|last_comment| last_comment.clone()); - drop(comments); - last_comment.and_then(|comment| { - if comment.is_asdoc(&self.token.1) { - self.compilation_unit().comments_mut().pop(); - let location = comment.location(); - let comment_prefix_length: usize = 3; - let location1 = Location::with_offsets(self.compilation_unit(), location.first_offset + comment_prefix_length, location.last_offset - 2); - let content = &comment.content.borrow()[1..]; - let (main_body, tags) = self.parse_asdoc_content(&location1, content); - Some(Rc::new(AsDoc { - location, - main_body, - tags, - })) - } else { - None - } - }) - } - - fn parse_asdoc_content(&mut self, location: &Location, content: &str) -> (Option<(String, Location)>, Vec<(AsDocTag, Location)>) { - let lines = self.split_asdoc_lines(location, content); - - let mut main_body: Option<(String, Location)> = None; - let mut tags: Vec<(AsDocTag, Location)> = vec![]; - let mut i = 0; - let line_count = lines.len(); - - let mut building_content_tag_name: Option<(String, Location)> = None; - let mut building_content: Vec<(String, Location)> = vec![]; - let mut inside_code_block = false; - - while i < line_count { - let line = &lines[i]; - let tag = if inside_code_block { None } else { - regex_captures!(r"^([\s\t]*\@)([^\s\t]+)(.*)", &line.content) - }; - if let Some((_, tag_prefix, tag_name, tag_content)) = tag { - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - if regex_is_match!(r"^[\s\t]*```([^`]|$)", &tag_content) { - inside_code_block = true; - } - let tag_name_location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + tag_prefix.len() - 1, line.location.first_offset() + tag_prefix.len() + tag_name.len()); - building_content_tag_name = Some((tag_name.into(), tag_name_location)); - let tag_content_location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + tag_prefix.len() + tag_name.len(), line.location.last_offset()); - building_content.push((tag_content.into(), tag_content_location)); - - if ["private", "inheritDoc"].contains(&tag_name) { - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - building_content_tag_name = None; - building_content.clear(); - } - } else { - if regex_is_match!(r"^[\s\t]*```([^`]|$)", &line.content) { - inside_code_block = !inside_code_block; - } - building_content.push((line.content.clone(), line.location.clone())); - } - i += 1; - } - - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - - (main_body, tags) - } - - fn split_asdoc_lines(&mut self, location: &Location, content: &str) -> Vec { - let mut builder = String::new(); - let mut lines = vec![]; - let mut _line_number = location.first_line_number(); - let mut index = location.first_offset(); - let mut line_first_offset = index; - let mut characters = content.chars(); - while let Some(ch) = characters.next() { - if CharacterValidator::is_line_terminator(ch) { - lines.push(ParserAsDocLine { - content: builder, - location: Location::with_offsets(self.compilation_unit(), line_first_offset, index), - }); - index += ch.len_utf8(); - // sequence - if ch == '\r' && characters.clone().next().unwrap_or('\x00') == '\n' { - index += '\n'.len_utf8(); - characters.next(); - } - builder = String::new(); - _line_number += 1; - line_first_offset = index; - } else { - builder.push(ch); - index += ch.len_utf8(); - } - } - lines.push(ParserAsDocLine { - content: builder, - location: Location::with_offsets(self.compilation_unit(), line_first_offset, index), - }); - for line in &mut lines { - let line_content = line.content.to_owned(); - let prefix = regex_captures!(r"^\s*(\*\s?)", &line_content); - if let Some((prefix, _)) = prefix { - line.content = line.content[prefix.len()..].to_owned(); - line.location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + prefix.len(), line.location.last_offset()); - } - } - - lines - } - - fn parse_asdoc_tag_or_main_body( - &self, - building_content_tag_name: &mut Option<(String, Location)>, - building_content: &mut Vec<(String, Location)>, - main_body: &mut Option<(String, Location)>, - tags: &mut Vec<(AsDocTag, Location)> - ) { - if let Some((tag_name, ref tag_location)) = building_content_tag_name.as_ref() { - match tag_name.as_ref() { - // @author Author text - "author" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Author(content), location)); - }, - - // @copy reference - "copy" => { - let (content, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - if let Some(reference) = self.parse_asdoc_reference(&content, &reference_loc, &tag_location, &tag_name) { - tags.push((AsDocTag::Copy(reference), location)); - } - }, - - // @created Date text - "created" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Created(content), location)); - }, - - // @default value - "default" => { - let (reference, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Default(reference), location)); - }, - - // @deprecated - "deprecated" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - let mut message: Option = None; - - if !regex_is_match!(r"^\s*$", &text) { - message = Some(text.clone()); - } - - tags.push((AsDocTag::Deprecated { message }, location)); - }, - - // @eventType typeOrConstant - "eventType" => { - let (_, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_expression(); - tags.push((AsDocTag::EventType(exp), location)); - }, - - // @example text - "example" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Example(text), location)); - }, - - // @inheritDoc - "inheritDoc" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be empty - if !regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::InheritDoc, location)); - }, - - // @internal text - "internal" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Internal(text), location)); - }, - - // @langversion text - "langversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Langversion(text), location)); - }, - - // @param paramName description - "param" => { - let (content, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - if let Some((_, name, description)) = regex_captures!(r"(?x) ([^\s]+) (.*)", &content) { - tags.push((AsDocTag::Param { name: name.into(), description: description.trim_start().into() }, location)); - } else { - tags.push((AsDocTag::Param { name: content, description: "".into() }, location)); - } - }, - - // @playerversion text - "playerversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Playerversion(text), location)); - }, - - // @private - "private" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be empty - if !regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Private, location)); - }, - - // @productversion text - "productversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Productversion(text), location)); - }, - - // @return text - "return" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Return(text), location)); - }, - - // @see reference [displayText] - "see" => { - let (content, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference: String; - let display_text: Option; - let mut reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - if let Some((_, reference_1, display_text_1)) = regex_captures!(r"(?x) ([^\s]+) (.*)", &content) { - reference = reference_1.to_owned(); - reference_loc = Location::with_offsets(self.compilation_unit(), reference_loc.first_offset(), reference_loc.first_offset() + reference.len()); - display_text = Some(display_text_1.trim().to_owned()); - } else { - reference = content; - display_text = None; - } - if let Some(reference) = self.parse_asdoc_reference(&reference, &reference_loc, &tag_location, &tag_name) { - tags.push((AsDocTag::See { reference, display_text }, location)); - } - }, - - // @throws className description - "throws" => { - let (class_name_and_description, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - - let class_name_and_description = regex_captures!(r"^([^\s]+)(\s.*)?", &class_name_and_description); - - if let Some((_, class_name, description)) = class_name_and_description { - let description = description.trim().to_owned(); - let description = if description.is_empty() { - None - } else { - Some(description) - }; - let mut reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - reference_loc = Location::with_offsets(self.compilation_unit(), reference_loc.first_offset(), reference_loc.first_offset() + class_name.len()); - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_type_expression(); - tags.push((AsDocTag::Throws { class_reference: exp, description }, location)); - } else { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - }, - - // @version Version text - "version" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Version(content), location)); - }, - - // Unrecognized tag - _ => { - self.add_syntax_error(&tag_location, DiagnosticKind::UnrecognizedAsDocTag, diagarg![tag_name.clone()]); - }, - } - } else if !building_content.is_empty() { - let content = join_asdoc_content(building_content); - if !content.0.is_empty() { - *main_body = Some(content); - } - } - - *building_content_tag_name = None; - building_content.clear(); - } - - fn parse_asdoc_reference(&self, reference: &str, reference_loc: &Location, tag_location: &Location, tag_name: &str) -> Option> { - let split: Vec<&str> = reference.split("#").collect(); - if split.len() > 2 { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.to_owned()]); - return None; - } - let mut base: Option> = None; - let base_text: String = split[0].to_owned(); - let instance_property_text: Option<(String, Location)> = split.get(1).and_then(|&f| if f.is_empty() { None } else { - Some((f.to_owned(), Location::with_offsets(self.compilation_unit(), reference_loc.first_offset() + base_text.len() + 1, reference_loc.last_offset()))) - }); - - if !base_text.is_empty() { - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.first_offset() + base_text.len())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_expression(); - base = Some(exp); - } - - let mut instance_property: Option> = None; - if let Some(text) = instance_property_text { - let parser_options = ParserOptions { - byte_range: Some((text.1.first_offset(), text.1.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_qualified_identifier(); - instance_property = Some(Rc::new(exp)); - } - - if base.is_none() && instance_property.is_none() { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.to_owned()]); - return None; - } - Some(Rc::new(AsDocReference { base, instance_property, })) - } - - /// Parses MXMLElement starting from its XMLTagContent. - fn parse_mxml_element(&mut self, start: Location, namespace: &Rc, encoding: &mut String) -> MxmlElement { - self.push_location(&start); - let namespace = Rc::new(MxmlNamespace::new(Some(namespace))); - let name = self.parse_xml_name(); - let mut attributes: Vec> = vec![]; - let mut plain_attributes: Vec = vec![]; - while self.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if matches!(self.token.0, Token::XmlName(_)) { - self.mark_location(); - let name = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_tag(Token::Assign); - let mut value = ("".into(), self.token.1.clone()); - if !self.expecting_token_error { - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - value = self.parse_xml_attribute_value(); - } - let attrib = PlainMxmlAttribute { - location: self.pop_location(), - name, - value, - }; - self.process_mxml_xmlns_attribute(&mut attributes, &attrib, &namespace); - plain_attributes.push(attrib); - } else { - break; - } - } - - for attrib in &plain_attributes { - self.process_mxml_attribute(&mut attributes, &attrib, &namespace); - } - - let name = self.process_mxml_tag_name(name, &namespace); - - let mut content: Option>> = None; - let mut closing_name: Option = None; - - let is_empty = self.consume_and_ie_xml_content(Token::XmlSlashGt); - - if !is_empty { - self.expect_and_ie_xml_content(Token::Gt); - content = Some(self.parse_mxml_content(false, &namespace, encoding)); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - let name_1 = self.parse_xml_name(); - let closing_name_1 = self.process_mxml_tag_name(name_1, &namespace); - if let Ok(equal) = name.equals_name(&closing_name_1, &namespace) { - if !equal { - self.add_syntax_error(&closing_name_1.location, DiagnosticKind::XmlClosingTagNameMustBeEquals, diagarg![name.to_string(&namespace)]); - } - } - closing_name = Some(closing_name_1); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - - if let Some(content) = content.as_mut() { - self.filter_mxml_whitespace_out(content); - } - - MxmlElement { - location: self.pop_location(), - name, - attributes, - content, - closing_name, - namespace, - } - } - - /// Filters whitespace chunks out of a content list when - /// they include at least one child element. - fn filter_mxml_whitespace_out(&self, content: &mut Vec>) { - if !self.ignore_xml_whitespace { - return; - } - let mut inc_el = false; - for node in content.iter() { - inc_el = matches!(node.as_ref(), MxmlContent::Element(_)); - if inc_el { - break; - } - } - if inc_el { - let mut indices: Vec = vec![]; - for i in 0..content.len() { - let MxmlContent::Characters((ch, _)) = content[i].as_ref() else { - continue; - }; - if ch.trim().is_empty() { - indices.push(i); - } - } - for i in indices.iter().rev() { - content.remove(*i); - } - } - } - - fn process_mxml_xmlns_attribute(&mut self, output: &mut Vec>, attribute: &PlainMxmlAttribute, namespace: &Rc) { - // xml="uri" - if attribute.name.0 == "xmlns" { - let attribute_value = unescape_xml(&attribute.value.0); - namespace.set(MxmlNamespace::DEFAULT_NAMESPACE, &attribute_value); - output.push(Rc::new(MxmlAttribute { - location: attribute.location.clone(), - name: MxmlName { - location: attribute.name.1.clone(), - prefix: None, - name: "xmlns".into(), - }, - value: (attribute_value, attribute.value.1.clone()), - xmlns: true, - })); - // xmlns:prefix="uri" - } else if attribute.name.0.starts_with("xmlns:") { - let attribute_value = unescape_xml(&attribute.value.0); - namespace.set(&attribute.name.0[6..], &attribute_value); - if attribute.name.0[6..].find(':').is_some() { - self.add_syntax_error(&attribute.name.1, DiagnosticKind::XmlNameAtMostOneColon, vec![]); - } - output.push(Rc::new(MxmlAttribute { - location: attribute.location.clone(), - name: MxmlName { - location: attribute.name.1.clone(), - prefix: Some("xmlns".into()), - name: attribute.name.0[6..].to_owned(), - }, - value: (attribute_value, attribute.value.1.clone()), - xmlns: true, - })); - } - } - - fn process_mxml_attribute(&mut self, output: &mut Vec>, attribute: &PlainMxmlAttribute, namespace: &Rc) { - // attrib="value" - if !(attribute.name.0 == "xmlns" || attribute.name.0.starts_with("xmlns:")) { - let attribute_value = unescape_xml(&attribute.value.0); - let split = attribute.name.0.split(':').collect::>(); - if split.len() > 2 { - self.add_syntax_error(&attribute.name.1, DiagnosticKind::XmlNameAtMostOneColon, vec![]); - } - let prefix: Option = if split.len() > 1 { - Some(split[split.len() - 2].to_owned()) - } else { - None - }; - let name = split.last().unwrap(); - let attrib = Rc::new(MxmlAttribute { - location: attribute.location.clone(), - name: MxmlName { - location: attribute.name.1.clone(), - prefix, - name: (*name).to_owned(), - }, - value: (attribute_value, attribute.value.1.clone()), - xmlns: false, - }); - match attrib.name.resolve_prefix(namespace) { - Ok(_) => { - for prev_attrib in output.iter() { - if prev_attrib.name.equals_name(&attrib.name, namespace).unwrap_or(false) { - self.add_syntax_error(&attrib.name.location, DiagnosticKind::RedefiningXmlAttribute, diagarg![attrib.name.name.clone()]); - } - } - }, - Err(MxmlNameError::PrefixNotDefined(prefix)) => { - self.add_syntax_error(&attrib.name.location, DiagnosticKind::XmlPrefixNotDefined, diagarg![prefix]); - }, - } - output.push(attrib); - } - } - - fn process_mxml_tag_name(&mut self, name: (String, Location), namespace: &Rc) -> MxmlName { - let split = name.0.split(':').collect::>(); - if split.len() > 2 { - self.add_syntax_error(&name.1, DiagnosticKind::XmlNameAtMostOneColon, vec![]); - } - let prefix: Option = if split.len() > 1 { - Some(split[split.len() - 2].to_owned()) - } else { - None - }; - let name_str = split.last().unwrap(); - let name = MxmlName { - location: name.1.clone(), - prefix, - name: (*name_str).to_owned(), - }; - match name.resolve_prefix(namespace) { - Ok(_) => {}, - Err(MxmlNameError::PrefixNotDefined(prefix)) => { - self.add_syntax_error(&name.location, DiagnosticKind::XmlPrefixNotDefined, diagarg![prefix]); - }, - } - name - } - - /// Parses XMLContent until either the `, encoding: &mut String) -> Vec> { - let mut content = vec![]; - while if until_eof { self.tokenizer.characters().has_remaining() } else { !self.peek(Token::XmlLtSlash) } { - if let Token::XmlMarkup(markup) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - // XMLCDATA - if markup.starts_with(" { - self.add_syntax_error(&location, DiagnosticKind::XmlPiUnknownAttribute, diagarg![name.clone()]); - }, - XmlPiError::Version => { - self.add_syntax_error(&location, DiagnosticKind::XmlPiVersion, vec![]); - }, - XmlPiError::Encoding => { - self.add_syntax_error(&location, DiagnosticKind::XmlPiEncoding, vec![]); - }, - } - } - content.push(Rc::new(MxmlContent::ProcessingInstruction { - location, - name, - data: if data.is_empty() { None } else { Some(data) }, - })); - } - } else if let Token::XmlText(text) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(MxmlContent::Characters((unescape_xml(&text), location)))); - } else if self.consume_and_ie_xml_tag(Token::Lt) { - let start = self.token_location(); - let element = self.parse_mxml_element(start, namespace, encoding); - content.push(Rc::new(MxmlContent::Element(Rc::new(element)))); - } else if !until_eof { - self.non_greedy_expect_and_ie_xml_content(Token::XmlLtSlash); - if !self.tokenizer.characters().has_remaining() { - break; - } - } else if self.peek(Token::XmlLtSlash) { - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Eof, self.token.0.clone()]); - self.next_ie_xml_tag(); - let _ = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - } - content - } - - fn parse_mxml(&mut self) -> Rc { - self.mark_location(); - let ns = Rc::new(MxmlNamespace::new(None)); - let mut encoding = "utf-8".to_owned(); - let mut content = self.parse_mxml_content(true, &ns, &mut encoding); - self.filter_mxml_whitespace_out(&mut content); - - let mut element_count = 0usize; - let mut character_count = 0usize; - - for node in content.iter() { - match node.as_ref() { - MxmlContent::Characters(_) | - MxmlContent::CData(_) => { - character_count += 1; - }, - MxmlContent::Element(_) => { - element_count += 1; - }, - _ => {}, - } - } - let location = self.pop_location(); - if element_count != 1 || character_count != 0 { - self.add_syntax_error(&location, DiagnosticKind::XmlMustConsistOfExactly1Element, vec![]); - } - Rc::new(Mxml { - location, - version: XmlVersion::Version10, - encoding, - content, - }) - } -} - -fn parse_include_directive_source(nested_compilation_unit: Rc, context: ParserDirectiveContext) -> (Vec>, Vec>) { - let mut parser = Parser::new(&nested_compilation_unit, &ParserOptions { - ..default() - }); - parser.next(); - let mut packages = vec![]; - if matches!(context, ParserDirectiveContext::TopLevel) { - while parser.peek(Token::Package) { - packages.push(parser.parse_package_definition()); - } - } - (packages, parser.parse_directives(context)) -} - -fn join_asdoc_content(content: &Vec<(String, Location)>) -> (String, Location) { - // Ignore first empty lines - let mut i = 0usize; - for content1 in content.iter() { - if content1.0.trim().is_empty() { - i += 1; - } else { - break; - } - } - - // Ignore last empty lines - let mut j = content.len(); - for content1 in content.iter().rev() { - if content1.0.trim().is_empty() { - j -= 1; - } else { - break; - } - } - - if i > j { - i = j; - } - - let s: Vec = content[i..j].iter().map(|c| c.0.clone()).collect(); - let s = s.join("\n").trim().to_owned(); - let location = if i == j { - content[i].1.clone() - } else { - content[i].1.combine_with(content[i..j].last().unwrap().1.clone()) - }; - (s, location) -} - -fn process_xml_pi(cu: &Rc, byte_range: (usize, usize), name: &str, encoding: &mut String) -> Vec { - if name != "xml" { - return vec![]; - } - let mut parser = Parser::new(&cu, &ParserOptions { - byte_range: Some(byte_range), - ..default() - }); - let mut errors = Vec::::new(); - parser.next_ie_xml_tag(); - while parser.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if matches!(parser.token.0, Token::XmlName(_)) { - let name = parser.parse_xml_name(); - parser.consume_and_ie_xml_tag(Token::XmlWhitespace); - parser.expect_and_ie_xml_tag(Token::Assign); - parser.consume_and_ie_xml_tag(Token::XmlWhitespace); - let value = parser.parse_xml_attribute_value(); - match name.0.as_ref() { - "version" => { - if value.0 != "1.0" { - errors.push(XmlPiError::Version); - } - }, - "encoding" => { - let v = value.0.to_lowercase(); - if ["utf-8", "utf-16"].contains(&v.as_str()) { - *encoding = v; - } else { - errors.push(XmlPiError::Encoding); - } - }, - _ => { - errors.push(XmlPiError::UnknownAttribute(name.0.clone())); - }, - } - } else { - break; - } - } - parser.expect_eof(); - errors -} - -fn is_flex_documentable_meta_data(name: &str) -> bool { - ["Event", "SkinState"].contains(&name) -} - -enum XmlPiError { - UnknownAttribute(String), - Version, - Encoding, -} - -struct ParserAsDocLine { - content: String, - location: Location, -} - -#[derive(Clone)] -struct ParserActivation { - uses_yield: bool, - uses_await: bool, -} - -impl ParserActivation { - pub fn new() -> Self { - Self { - uses_yield: false, - uses_await: false, - } - } -} - -#[derive(Clone)] -struct AnnotatableContext { - start_location: Location, - asdoc: Option>, - attributes: Vec, - context: ParserDirectiveContext, - /// Previous token as a directive context keyword. - directive_context_keyword: Option<(String, Location)>, -} - -impl AnnotatableContext { - pub fn has_directive_context_keyword(&self, name: &str) -> bool { - if let Some((ref k, _)) = self.directive_context_keyword { - k == name - } else { - false - } - } -} - -struct PlainMxmlAttribute { - pub location: Location, - pub name: (String, Location), - pub value: (String, Location), -} - -/// A simplified interface for executing the parser. -pub struct ParserFacade<'input>(pub &'input Rc, pub ParserOptions); - -pub struct ParserOptions { - /// For MXML, indicates whether to ignore XML whitespace chunks when at - /// least one element appears. Default: true. - pub ignore_xml_whitespace: bool, - /// Indicates the range of characters that shall be parsed, - /// the first and last byte indices respectively. - pub byte_range: Option<(usize, usize)>, -} - -impl Default for ParserOptions { - fn default() -> Self { - Self { - ignore_xml_whitespace: true, - byte_range: None, - } - } -} - -impl<'input> ParserFacade<'input> { - fn create_parser(&self) -> Parser<'input> { - Parser::new(self.0, &self.1) - } - - /// Parses `Program` until end-of-file. - pub fn parse_program(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_program() - } - - /// Parses `ListExpression^allowIn` and expects end-of-file. - pub fn parse_expression(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let exp = parser.parse_expression(ParserExpressionContext { - ..default() - }); - parser.expect_eof(); - exp - } - - /// Parses a qualified identifier and expects end-of-file. - pub fn parse_qualified_identifier(&self) -> QualifiedIdentifier { - let mut parser = self.create_parser(); - parser.next(); - let exp = parser.parse_qualified_identifier(); - parser.expect_eof(); - exp - } - - /// Parses `TypeExpression` and expects end-of-file. - pub fn parse_type_expression(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let exp = parser.parse_type_expression(); - parser.expect_eof(); - exp - } - - /// Parses `Directives` until end-of-file. - pub fn parse_directives(&self, context: ParserDirectiveContext) -> Vec> { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_directives(context) - } - - /// Parses `Mxml` until end-of-file. - pub fn parse_mxml(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next_ie_xml_content(); - parser.parse_mxml() - } -} diff --git a/crates/parser/parser/parser_error.rs b/crates/parser/parser/parser_error.rs deleted file mode 100644 index 7921630..0000000 --- a/crates/parser/parser/parser_error.rs +++ /dev/null @@ -1,20 +0,0 @@ -use crate::ns::*; - -/// Indicates a fatal syntax error that leads the parser -/// to complete without a resulting node. -#[derive(Copy, Clone, Debug)] -pub enum ParserError { - Common, -} - -/// Returns the identifier name that is specially reserved -/// for invalidated identifiers that could not be parsed. -pub const INVALIDATED_IDENTIFIER: &'static str = "\x00"; - -#[derive(Clone)] -pub(crate) enum MetadataRefineError { - Syntax, -} - -#[derive(Clone)] -pub(crate) struct MetadataRefineError1(pub MetadataRefineError, pub Location); diff --git a/crates/parser/parser/reserved_word.rs b/crates/parser/parser/reserved_word.rs deleted file mode 100644 index 9a04596..0000000 --- a/crates/parser/parser/reserved_word.rs +++ /dev/null @@ -1,110 +0,0 @@ -use crate::ns::*; - -/// ActionScript reserved word validation. -pub struct As3ReservedWord; - -impl As3ReservedWord { - /// Checks if an *IdentifierName* is a reserved word. - pub fn test(name: &str) -> bool { - As3ReservedWord::token(name).is_some() - } - - /// Attempts to convert an *IdentifierName* into a reserved word token. - pub fn token(name: &str) -> Option { - match name.len() { - 1 => None, - 2 => { - match name { - "as" => Some(Token::As), - "do" => Some(Token::Do), - "if" => Some(Token::If), - "in" => Some(Token::In), - "is" => Some(Token::Is), - _ => None, - } - }, - 3 => { - match name { - "for" => Some(Token::For), - "new" => Some(Token::New), - "not" => Some(Token::Not), - "try" => Some(Token::Try), - "use" => Some(Token::Use), - "var" => Some(Token::Var), - _ => None, - } - }, - 4 => { - match name { - "case" => Some(Token::Case), - "else" => Some(Token::Else), - "null" => Some(Token::Null), - "this" => Some(Token::This), - "true" => Some(Token::True), - "void" => Some(Token::Void), - "with" => Some(Token::With), - _ => None, - } - }, - 5 => { - match name { - "await" => Some(Token::Await), - "break" => Some(Token::Break), - "catch" => Some(Token::Catch), - "class" => Some(Token::Class), - "const" => Some(Token::Const), - "false" => Some(Token::False), - "super" => Some(Token::Super), - "throw" => Some(Token::Throw), - "while" => Some(Token::While), - "yield" => Some(Token::Yield), - _ => None, - } - }, - 6 => { - match name { - "delete" => Some(Token::Delete), - "import" => Some(Token::Import), - "public" => Some(Token::Public), - "return" => Some(Token::Return), - "switch" => Some(Token::Switch), - "typeof" => Some(Token::Typeof), - _ => None, - } - }, - 7 => { - match name { - "default" => Some(Token::Default), - "extends" => Some(Token::Extends), - "finally" => Some(Token::Finally), - "package" => Some(Token::Package), - "private" => Some(Token::Private), - _ => None, - } - }, - 8 => { - match name { - "continue" => Some(Token::Continue), - "function" => Some(Token::Function), - "internal" => Some(Token::Internal), - _ => None, - } - }, - 9 => { - match name { - "interface" => Some(Token::Interface), - "protected" => Some(Token::Protected), - _ => None, - } - }, - 10 => { - match name { - "implements" => Some(Token::Implements), - "instanceof" => Some(Token::Instanceof), - _ => None, - } - }, - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/parser/token.rs b/crates/parser/parser/token.rs deleted file mode 100644 index f0913ae..0000000 --- a/crates/parser/parser/token.rs +++ /dev/null @@ -1,470 +0,0 @@ -use crate::ns::*; - -/// Represents a lexical token. -#[derive(Clone, PartialEq, Debug)] -pub enum Token { - Eof, - Identifier(String), - String(String), - /// Numeric literal token. - /// The numeric value is in character representation, which may be parsed - /// through data type specific methods such as [`NumericLiteral::parse_double()`]. - Number(String, NumberSuffix), - RegExp { - body: String, - flags: String, - }, - - CssNumber { - value: f64, - unit: Option, - }, - CssHashWord(String), - CssBeginsWith, - CssEndsWith, - CssContains, - CssListMatch, - CssHreflangMatch, - CssAtNamespace, - CssAtMedia, - CssAtFontFace, - CssImportant, - CssSemicolons, - - // Punctuator - ColonColon, - /// The `@` token. - Attribute, - /// The `..` token. - Descendants, - /// The `...` token. - Ellipsis, - ParenOpen, - ParenClose, - SquareOpen, - SquareClose, - BlockOpen, - BlockClose, - Dot, - Semicolon, - Comma, - Lt, - Gt, - /// `<=` - Le, - /// `>=` - Ge, - Equals, - NotEquals, - StrictEquals, - StrictNotEquals, - Plus, - Minus, - Times, - Div, - Percent, - Increment, - Decrement, - LeftShift, - RightShift, - UnsignedRightShift, - Ampersand, - Hat, - Pipe, - Tilde, - LogicalAnd, - LogicalXor, - LogicalOr, - Question, - Exclamation, - Colon, - Assign, - AddAssign, - SubtractAssign, - MultiplyAssign, - DivideAssign, - RemainderAssign, - LeftShiftAssign, - RightShiftAssign, - UnsignedRightShiftAssign, - BitwiseAndAssign, - BitwiseXorAssign, - BitwiseOrAssign, - LogicalAndAssign, - LogicalXorAssign, - LogicalOrAssign, - /// `**` - Power, - /// `**=` - PowerAssign, - /// `??` - NullCoalescing, - /// `??=` - NullCoalescingAssign, - /// `?.` - OptionalChaining, - - // Reserved words - As, - Await, - Break, - Case, - Catch, - Class, - Const, - Continue, - Default, - Delete, - Do, - Else, - Extends, - False, - Finally, - For, - Function, - If, - Implements, - Import, - In, - Instanceof, - Interface, - Internal, - Is, - New, - Not, - Null, - Package, - Private, - Protected, - Public, - Return, - Super, - Switch, - This, - Throw, - True, - Try, - Typeof, - Use, - Var, - Void, - While, - With, - Yield, - - XmlWhitespace, - XmlLtSlash, - XmlSlashGt, - XmlText(String), - XmlName(String), - XmlMarkup(String), - XmlAttributeValue(String), -} - -impl ToString for Token { - /// Converts the token into a readable string. - /// - /// The method `Token::to_string` returns the following possible values: - /// - /// * `"end of program"` - /// * `"identifier"` - /// * `"string"` for string literal - /// * `"number"` for numeric literal - /// * `"regular expression"` for regular expression literal - /// * `"'keyword'"` for reserved words - /// * `"'punctuator'"` for various punctuators - /// * `"punctuator"` for various punctuators - /// * `"XML whitespace"` - /// * `"''"` - /// * `"XML text"` - /// * `"XML name"` - /// * `"XML markup"` - /// * `"XML attribute value"` - fn to_string(&self) -> String { - (match self { - Token::Eof => "end-of-file", - Token::Identifier(_) => "identifier", - Token::String(_) => "string", - Token::Number(_, _) => "number", - Token::RegExp { .. } => "regular expression", - - Token::CssNumber { .. } => "number", - Token::CssHashWord(_) => "hash-word", - Token::CssBeginsWith => "'^='", - Token::CssEndsWith => "'$='", - Token::CssContains => "'*='", - Token::CssListMatch => "'~='", - Token::CssHreflangMatch => "'|='", - Token::CssAtNamespace => "at-namespace", - Token::CssAtMedia => "at-media", - Token::CssAtFontFace => "at-font-face", - Token::CssImportant => "'!important'", - Token::CssSemicolons => "semicolon", - - // Punctuators - Token::ColonColon => "colon-colon", - Token::Attribute => "'@'", - Token::Descendants => "'..'", - Token::Ellipsis => "'...'", - Token::ParenOpen => "paren-open", - Token::ParenClose => "paren-close", - Token::SquareOpen => "square-open", - Token::SquareClose => "square-close", - Token::BlockOpen => "block-open", - Token::BlockClose => "block-close", - Token::Dot => "dot", - Token::Semicolon => "semicolon", - Token::Comma => "comma", - Token::Lt => "less-than", - Token::Gt => "greater-than", - Token::Le => "'<='", - Token::Ge => "'>='", - Token::Equals => "'=='", - Token::NotEquals => "'!='", - Token::StrictEquals => "'==='", - Token::StrictNotEquals => "'!=='", - Token::Plus => "plus", - Token::Minus => "minus", - Token::Times => "times", - Token::Div => "slash", - Token::Percent => "percent", - Token::Increment => "'++'", - Token::Decrement => "'--'", - Token::LeftShift => "'<<'", - Token::RightShift => "'>>'", - Token::UnsignedRightShift => "'>>>'", - Token::Ampersand => "ampersand", - Token::Hat => "hat", - Token::Pipe => "pipe", - Token::Tilde => "tilde", - Token::LogicalAnd => "'&&'", - Token::LogicalXor => "'^^'", - Token::LogicalOr => "'||'", - Token::Question => "question-mark", - Token::Exclamation => "exclamation-mark", - Token::Colon => "colon", - Token::Assign => "'='", - Token::AddAssign => "'+='", - Token::SubtractAssign => "'-='", - Token::MultiplyAssign => "'*='", - Token::DivideAssign => "'/='", - Token::RemainderAssign => "'%='", - Token::LeftShiftAssign => "'<<='", - Token::RightShiftAssign => "'>>='", - Token::UnsignedRightShiftAssign => "'>>>='", - Token::BitwiseAndAssign => "'&='", - Token::BitwiseXorAssign => "'^='", - Token::BitwiseOrAssign => "'|='", - Token::LogicalAndAssign => "'&&='", - Token::LogicalXorAssign => "'^^='", - Token::LogicalOrAssign => "'||='", - Token::Power => "'**'", - Token::PowerAssign => "'**='", - Token::NullCoalescing => "'??'", - Token::NullCoalescingAssign => "'??='", - Token::OptionalChaining => "'?.'", - - // Reserved words - Token::As => "'as'", - Token::Await => "'await'", - Token::Break => "'break'", - Token::Case => "'case'", - Token::Catch => "'catch'", - Token::Class => "'class'", - Token::Const => "'const'", - Token::Continue => "'continue'", - Token::Default => "'default'", - Token::Delete => "'delete'", - Token::Do => "'do'", - Token::Else => "'else'", - Token::Extends => "'extends'", - Token::False => "'false'", - Token::Finally => "'finally'", - Token::For => "'for'", - Token::Function => "'function'", - Token::If => "'if'", - Token::Implements => "'implements'", - Token::Import => "'import'", - Token::In => "'in'", - Token::Instanceof => "'instanceof'", - Token::Interface => "'interface'", - Token::Internal => "'internal'", - Token::Is => "'is'", - Token::New => "'new'", - Token::Not => "'not'", - Token::Null => "'null'", - Token::Package => "'package'", - Token::Private => "'private'", - Token::Protected => "'protected'", - Token::Public => "'public'", - Token::Return => "'return'", - Token::Super => "'super'", - Token::Switch => "'switch'", - Token::This => "'this'", - Token::Throw => "'throw'", - Token::True => "'true'", - Token::Try => "'try'", - Token::Typeof => "'typeof'", - Token::Use => "'use'", - Token::Var => "'var'", - Token::Void => "'void'", - Token::While => "'while'", - Token::With => "'with'", - Token::Yield => "'yield'", - - Token::XmlWhitespace => "XML whitespace", - Token::XmlLtSlash => "' "'/>'", - Token::XmlText(_) => "XML text", - Token::XmlName(_) => "XML name", - Token::XmlMarkup(_) => "XML markup", - Token::XmlAttributeValue(_) => "XML attribute value", - }).into() - } -} - -impl Token { - pub fn is_context_keyword(token: &(Token, Location), keyword: &str) -> bool { - if let Token::Identifier(name) = &token.0 { - name == keyword && token.1.character_count() == name.len() - } else { - false - } - } - - /// Indicates whether the token is a reserved word. - pub fn is_reserved_word(&self) -> bool { - self.reserved_word_name().is_some() - } - - pub fn is_identifier_name(&self) -> bool { - matches!(self, Token::Identifier(_)) || self.is_reserved_word() - } - - /// Tests whether the token is a reserved word and returns - /// its *IdentifierName* string. - pub fn reserved_word_name(&self) -> Option { - match *self { - Token::As => Some("as".into()), - Token::Await => Some("await".into()), - Token::Break => Some("break".into()), - Token::Case => Some("case".into()), - Token::Catch => Some("catch".into()), - Token::Class => Some("class".into()), - Token::Const => Some("const".into()), - Token::Continue => Some("continue".into()), - Token::Default => Some("default".into()), - Token::Delete => Some("delete".into()), - Token::Do => Some("do".into()), - Token::Else => Some("else".into()), - Token::Extends => Some("extends".into()), - Token::False => Some("false".into()), - Token::Finally => Some("finally".into()), - Token::For => Some("for".into()), - Token::Function => Some("function".into()), - Token::If => Some("if".into()), - Token::Implements => Some("implements".into()), - Token::Import => Some("import".into()), - Token::In => Some("in".into()), - Token::Instanceof => Some("instanceof".into()), - Token::Interface => Some("interface".into()), - Token::Internal => Some("internal".into()), - Token::Is => Some("is".into()), - Token::New => Some("new".into()), - Token::Not => Some("not".into()), - Token::Null => Some("null".into()), - Token::Package => Some("package".into()), - Token::Private => Some("private".into()), - Token::Protected => Some("protected".into()), - Token::Public => Some("public".into()), - Token::Return => Some("return".into()), - Token::Super => Some("super".into()), - Token::Switch => Some("switch".into()), - Token::This => Some("this".into()), - Token::Throw => Some("throw".into()), - Token::True => Some("true".into()), - Token::Try => Some("try".into()), - Token::Typeof => Some("typeof".into()), - Token::Use => Some("use".into()), - Token::Var => Some("var".into()), - Token::Void => Some("void".into()), - Token::While => Some("while".into()), - Token::With => Some("with".into()), - Token::Yield => Some("yield".into()), - _ => None, - } - } - - /// Converts a compound assignment, a logical assignment, or a nullish coalescing assignment to an *Operator* value. - pub fn compound_assignment(&self) -> Option { - match self { - Self::AddAssign => Some(Operator::Add), - Self::SubtractAssign => Some(Operator::Subtract), - Self::MultiplyAssign => Some(Operator::Multiply), - Self::DivideAssign => Some(Operator::Divide), - Self::RemainderAssign => Some(Operator::Remainder), - Self::PowerAssign => Some(Operator::Power), - Self::LeftShiftAssign => Some(Operator::ShiftLeft), - Self::RightShiftAssign => Some(Operator::ShiftRight), - Self::UnsignedRightShiftAssign => Some(Operator::ShiftRightUnsigned), - Self::BitwiseAndAssign => Some(Operator::BitwiseAnd), - Self::BitwiseXorAssign => Some(Operator::BitwiseXor), - Self::BitwiseOrAssign => Some(Operator::BitwiseOr), - Self::LogicalAndAssign => Some(Operator::LogicalAnd), - Self::LogicalXorAssign => Some(Operator::LogicalXor), - Self::LogicalOrAssign => Some(Operator::LogicalOr), - Self::NullCoalescingAssign => Some(Operator::NullCoalescing), - _ => None, - } - } - - /// Converts this token into a binary operator, excluding - /// `not in`, and `is not`. - pub fn to_binary_operator(&self) -> Option { - match self { - Self::Times => Some(Operator::Multiply), - Self::Div => Some(Operator::Divide), - Self::Percent => Some(Operator::Remainder), - Self::Plus => Some(Operator::Add), - Self::Minus => Some(Operator::Subtract), - Self::LeftShift => Some(Operator::ShiftLeft), - Self::RightShift => Some(Operator::ShiftRight), - Self::UnsignedRightShift => Some(Operator::ShiftRightUnsigned), - Self::Lt => Some(Operator::Lt), - Self::Gt => Some(Operator::Gt), - Self::Le => Some(Operator::Le), - Self::Ge => Some(Operator::Ge), - Self::As => Some(Operator::As), - Self::In => Some(Operator::In), - Self::Is => Some(Operator::Is), - Self::Instanceof => Some(Operator::Instanceof), - Self::Equals => Some(Operator::Equals), - Self::NotEquals => Some(Operator::NotEquals), - Self::StrictEquals => Some(Operator::StrictEquals), - Self::StrictNotEquals => Some(Operator::StrictNotEquals), - Self::Ampersand => Some(Operator::BitwiseAnd), - Self::Hat => Some(Operator::BitwiseXor), - Self::Pipe => Some(Operator::BitwiseOr), - Self::LogicalAnd => Some(Operator::LogicalAnd), - Self::LogicalXor => Some(Operator::LogicalXor), - Self::LogicalOr => Some(Operator::LogicalOr), - Self::NullCoalescing => Some(Operator::NullCoalescing), - Self::Power => Some(Operator::Power), - _ => None, - } - } - - pub(crate) fn to_attribute(&self, location: &Location) -> Option { - match self { - Self::Public => Some(Attribute::Public(location.clone())), - Self::Private => Some(Attribute::Private(location.clone())), - Self::Protected => Some(Attribute::Protected(location.clone())), - Self::Internal => Some(Attribute::Internal(location.clone())), - Self::Identifier(ref name) => { - Attribute::from_identifier_name(name, &location) - }, - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/parser/tokenizer.rs b/crates/parser/parser/tokenizer.rs deleted file mode 100644 index c1fb275..0000000 --- a/crates/parser/parser/tokenizer.rs +++ /dev/null @@ -1,1307 +0,0 @@ -use crate::ns::*; - -pub struct Tokenizer<'input> { - compilation_unit: Rc, - characters: CharacterReader<'input>, -} - -impl<'input> Tokenizer<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - let text: &'input str = compilation_unit.text(); - let compilation_unit = compilation_unit.clone(); - let characters: CharacterReader<'input>; - if let Some(range) = options.byte_range { - characters = CharacterReader::from_offset(&text[0..range.1], range.0); - } else { - characters = CharacterReader::from(text); - } - Self { - compilation_unit, - characters, - } - } - - pub fn compilation_unit(&self) -> &Rc { - &self.compilation_unit - } - - pub fn characters(&self) -> &CharacterReader<'input> { - &self.characters - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit.prevent_equal_offset_error(location) { - return; - } - self.compilation_unit.add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - /// Scans for an *InputElementDiv* token. - pub fn scan_ie_div(&mut self) -> (Token, Location) { - loop { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_whitespace(ch) { - self.characters.next(); - } else if self.consume_line_terminator() || self.consume_comment() { - // Consumed line terminator or comment - } else { - break; - } - } - if let Some(result) = self.scan_identifier() { - return result; - } - if let Some(result) = self.scan_dot_or_numeric_literal() { - return result; - } - if let Some(result) = self.scan_string_literal(false) { - return result; - } - let start = self.cursor_location(); - match self.characters.peek_or_zero() { - ',' => { - // Comma - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Comma, location); - }, - '(' => { - // ParenOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ParenOpen, location); - }, - ')' => { - // ParenClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ParenClose, location); - }, - '[' => { - // SquareOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SquareOpen, location); - }, - ']' => { - // SquareClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SquareClose, location); - }, - '{' => { - // BlockOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BlockOpen, location); - }, - '}' => { - // BlockClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BlockClose, location); - }, - ':' => { - self.characters.next(); - // ColonColon - if self.characters.peek_or_zero() == ':' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ColonColon, location); - } - // Colon - let location = start.combine_with(self.cursor_location()); - return (Token::Colon, location); - }, - '=' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // StrictEquals - if ch == '=' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::StrictEquals, location); - } - // Equals - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Equals, location); - } - // Assign - let location = start.combine_with(self.cursor_location()); - return (Token::Assign, location); - }, - '!' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // StrictNotEquals - if ch == '=' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::StrictNotEquals, location); - } - // NotEquals - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::NotEquals, location); - } - // Exclamation - let location = start.combine_with(self.cursor_location()); - return (Token::Exclamation, location); - }, - '?' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // OptionalChaining - if ch == '.' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::OptionalChaining, location); - } - // NullCoalescingAssign - if ch == '?' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::NullCoalescingAssign, location); - } - // NullCoalescing - if ch == '?' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::NullCoalescing, location); - } - // Question - let location = start.combine_with(self.cursor_location()); - return (Token::Question, location); - }, - ';' => { - // Semicolon - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Semicolon, location); - }, - '<' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Le - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Le, location); - } - // LeftShiftAssign - if ch == '<' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LeftShiftAssign, location); - } - // LeftShift - if ch == '<' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LeftShift, location); - } - // Lt - let location = start.combine_with(self.cursor_location()); - return (Token::Lt, location); - }, - '>' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Ge - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Ge, location); - } - // RightShiftAssign - if ch == '>' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::RightShiftAssign, location); - } - // UnsignedRightShiftAssign - if ch == '>' && self.characters.peek_seq(3) == ">>=" { - self.characters.skip_count_in_place(3); - let location = start.combine_with(self.cursor_location()); - return (Token::UnsignedRightShiftAssign, location); - } - // UnsignedRightShift - if ch == '>' && self.characters.peek_at_or_zero(1) == '>' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::UnsignedRightShift, location); - } - // RightShift - if ch == '>' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::RightShift, location); - } - // Gt - let location = start.combine_with(self.cursor_location()); - return (Token::Gt, location); - }, - '@' => { - // Attribute - self.characters.next(); - if let Some(token) = self.scan_string_literal(true) { - return token; - } - let location = start.combine_with(self.cursor_location()); - return (Token::Attribute, location); - }, - '+' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Increment - if ch == '+' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Increment, location); - } - // AddAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::AddAssign, location); - } - // Plus - let location = start.combine_with(self.cursor_location()); - return (Token::Plus, location); - }, - '-' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Decrement - if ch == '-' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Decrement, location); - } - // SubtractAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SubtractAssign, location); - } - // Minus - let location = start.combine_with(self.cursor_location()); - return (Token::Minus, location); - }, - '*' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // PowerAssign - if ch == '*' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::PowerAssign, location); - } - // Power - if ch == '*' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Power, location); - } - // MultiplyAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::MultiplyAssign, location); - } - // Times - let location = start.combine_with(self.cursor_location()); - return (Token::Times, location); - }, - '/' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // DivideAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::DivideAssign, location); - } - // Div - let location = start.combine_with(self.cursor_location()); - return (Token::Div, location); - }, - '%' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // RemainderAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::RemainderAssign, location); - } - // Percent - let location = start.combine_with(self.cursor_location()); - return (Token::Percent, location); - }, - '&' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalAndAssign - if ch == '&' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalAndAssign, location); - } - // LogicalAnd - if ch == '&' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalAnd, location); - } - // BitwiseAndAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseAndAssign, location); - } - // BitwiseAnd - let location = start.combine_with(self.cursor_location()); - return (Token::Ampersand, location); - }, - '^' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalXorAssign - if ch == '^' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalXorAssign, location); - } - // LogicalXor - if ch == '^' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalXor, location); - } - // BitwiseXorAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseXorAssign, location); - } - // BitwiseXor - let location = start.combine_with(self.cursor_location()); - return (Token::Hat, location); - }, - '|' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalOrAssign - if ch == '|' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalOrAssign, location); - } - // LogicalOr - if ch == '|' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalOr, location); - } - // BitwiseOrAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseOrAssign, location); - } - // BitwiseOr - let location = start.combine_with(self.cursor_location()); - return (Token::Pipe, location); - }, - '~' => { - // BitwiseNot - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Tilde, location); - }, - _ => { - if self.characters.has_remaining() { - self.add_unexpected_error(); - self.characters.next(); - return self.scan_ie_div(); - // Eof - } else { - return (Token::Eof, start) - } - }, - } - } - - /// Scans regular expression after a `/` or `/=` token has been scanned by - /// `scan_ie_div`. - pub fn scan_regexp_literal(&mut self, start: Location, mut body: String) -> (Token, Location) { - loop { - let ch = self.characters.peek_or_zero(); - if ch == '/' { - self.characters.next(); - break; - } else if ch == '\\' { - self.characters.next(); - body.push('\\'); - let ch = self.characters.peek_or_zero(); - if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_unexpected_error(); - self.consume_line_terminator(); - } else { - self.characters.next(); - body.push(ch); - } - } else if CharacterValidator::is_line_terminator(ch) { - body.push('\n'); - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp); - break; - } else { - body.push(ch); - self.characters.next(); - } - } - - let mut flags = String::new(); - while let Some((ch, _)) = self.consume_identifier_part() { - flags.push(ch); - } - - let location = start.combine_with(self.cursor_location()); - (Token::RegExp { body, flags }, location) - } - - fn character_ahead_location(&self) -> Location { - if self.characters.reached_end() { - return self.cursor_location(); - } - let offset = self.characters.index(); - let mut next_characters = self.characters.clone(); - next_characters.next().unwrap(); - Location::with_offsets(&self.compilation_unit, offset, next_characters.index()) - } - - pub fn cursor_location(&self) -> Location { - let offset = self.characters.index(); - Location::with_offset(&self.compilation_unit, offset) - } - - fn add_unexpected_error(&self) { - if self.characters.has_remaining() { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::UnexpectedCharacter, diagarg![self.characters.peek_or_zero().to_string()]) - } else { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::UnexpectedEnd, vec![]) - } - } - - fn add_unexpected_eof_error(&self, kind: DiagnosticKind) { - self.add_syntax_error(&self.cursor_location(), kind, vec![]); - } - - // LineTerminator - fn consume_line_terminator(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if ch == '\x0D' && self.characters.peek_at_or_zero(1) == '\x0A' { - self.characters.skip_count_in_place(2); - // self.line_number += 1; - return true; - } - if CharacterValidator::is_line_terminator(ch) { - self.characters.next(); - // self.line_number += 1; - return true; - } - false - } - - fn consume_comment(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if ch != '/' { - return false; - } - let ch2 = self.characters.peek_at_or_zero(1); - if ch2 == '/' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - while !CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) && self.characters.has_remaining() { - self.characters.skip_in_place(); - } - let location = start.combine_with(self.cursor_location()); - self.consume_line_terminator(); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: false, - content: RefCell::new(self.compilation_unit.text()[(location.first_offset() + 2)..location.last_offset()].to_owned()), - location: RefCell::new(location), - })); - - return true; - } - if ch2 == '*' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - - loop { - if self.characters.peek_or_zero() == '*' && self.characters.peek_at_or_zero(1) == '/' { - self.characters.skip_count_in_place(2); - break; - } else if self.consume_line_terminator() { - // Consumed LineTerminator - } else if self.characters.has_remaining() { - self.characters.skip_in_place(); - } else { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment); - break; - } - } - - let location = start.combine_with(self.cursor_location()); - - let i = location.first_offset() + 2; - let j = decrease_last_offset(i, location.last_offset(), 2); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: true, - content: RefCell::new(self.compilation_unit.text()[i..j].to_owned()), - location: RefCell::new(location), - })); - - return true; - } - false - } - - fn scan_identifier(&mut self) -> Option<(Token, Location)> { - let start = self.cursor_location(); - let mut escaped = false; - let Some((ch, escaped_2)) = self.consume_identifier_start() else { - return None; - }; - escaped = escaped || escaped_2; - let mut name = String::new(); - name.push(ch); - while let Some((ch, escaped_2)) = self.consume_identifier_part() { - escaped = escaped || escaped_2; - name.push(ch); - } - - let location = start.combine_with(self.cursor_location()); - if !escaped { - if let Some(token) = As3ReservedWord::token(name.as_ref()) { - return Some((token, location)); - } - } - Some((Token::Identifier(name), location)) - } - - /// Returns a tuple in the form (*character*, *escaped*). - fn consume_identifier_start(&mut self) -> Option<(char, bool)> { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_identifier_start(ch) { - self.characters.next(); - return Some((ch, false)); - } - if self.characters.peek_or_zero() == '\\' { - self.characters.next(); - return Some((self.expect_unicode_escape_sequence(), true)); - } - None - } - - /// Returns a tuple in the form (*character*, *escaped*). - fn consume_identifier_part(&mut self) -> Option<(char, bool)> { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_identifier_part(ch) { - self.characters.next(); - return Some((ch, false)); - } - if self.characters.peek_or_zero() == '\\' { - self.characters.next(); - return Some((self.expect_unicode_escape_sequence(), true)); - } - None - } - - /// Expects UnicodeEscapeSequence starting from `u`. - fn expect_unicode_escape_sequence(&mut self) -> char { - let start = self.cursor_location(); - if self.characters.peek_or_zero() != 'u' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - - // Scan \uXXXX - if CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - let r = char::from_u32(self.expect_hex_digit() << 12 - | (self.expect_hex_digit() << 8) - | (self.expect_hex_digit() << 4) - | self.expect_hex_digit()); - let Some(r) = r else { - self.add_syntax_error(&start.combine_with(self.cursor_location()), DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - return r; - } - - // Scan \u{} - if self.characters.peek_or_zero() != '{' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - while CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - if self.characters.peek_or_zero() != '}' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - let r = u32::from_str_radix(&self.compilation_unit.text()[(start.first_offset + 2)..(location.last_offset - 1)], 16); - let Ok(r) = r else { - self.add_syntax_error(&location, DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - let r = char::from_u32(r); - let Some(r) = r else { - self.add_syntax_error(&location, DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - r - } - - fn expect_hex_digit(&mut self) -> u32 { - let ch = self.characters.peek_or_zero(); - let mv = CharacterValidator::hex_digit_mv(ch); - if mv.is_none() { - self.add_unexpected_error(); - return 0x5F; - } - self.characters.next(); - mv.unwrap() - } - - fn scan_dot_or_numeric_literal(&mut self) -> Option<(Token, Location)> { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - let mut initial_dot = false; - if ch == '.' { - initial_dot = true; - self.characters.next(); - - let seq = self.characters.peek_seq(2); - // Ellipsis - if seq == ".." { - self.characters.skip_count_in_place(2); - return Some((Token::Ellipsis, start.combine_with(self.cursor_location()))); - } - let ch = seq.get(..1).map(|ch| ch.chars().next().unwrap()).unwrap_or('\x00'); - // Descendants - if ch == '.' { - self.characters.next(); - return Some((Token::Descendants, start.combine_with(self.cursor_location()))); - } - // Dot - if !CharacterValidator::is_dec_digit(ch) { - return Some((Token::Dot, start.combine_with(self.cursor_location()))); - } - - // NumericLiteral - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } else if ch == '0' { - self.characters.next(); - let ch_2 = self.characters.peek_or_zero(); - - // HexLiteral - if ['X', 'x'].contains(&ch_2) { - self.characters.next(); - return self.scan_hex_literal(start.clone()); - } - - // BinLiteral; - if ['B', 'b'].contains(&ch_2) { - self.characters.next(); - return self.scan_bin_literal(start.clone()); - } - } else if CharacterValidator::is_dec_digit(ch) { - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } else { - return None; - } - - if !initial_dot && self.characters.peek_or_zero() == '.' { - self.characters.next(); - /* - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - */ - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } - - // Decimal exponent - if ['E', 'e'].contains(&self.characters.peek_or_zero()) { - self.characters.next(); - if ['+', '-'].contains(&self.characters.peek_or_zero()) { - self.characters.next(); - } - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } - - let string = self.compilation_unit.text()[start.first_offset..self.characters.index()].to_owned(); - - let mut suffix = NumberSuffix::None; - if self.characters.peek_or_zero() == 'f' || self.characters.peek_or_zero() == 'F' { - suffix = NumberSuffix::F; - self.characters.next(); - } - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - - Some((Token::Number(string, suffix), location)) - } - - fn scan_hex_literal(&mut self, start: Location) -> Option<(Token, Location)> { - if !CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_hex_digit(); - } - - let suffix = NumberSuffix::None; - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - let s = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - Some((Token::Number(s, suffix), location)) - } - - fn scan_bin_literal(&mut self, start: Location) -> Option<(Token, Location)> { - if !CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_bin_digit(); - } - - let suffix = NumberSuffix::None; - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - let s = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - Some((Token::Number(s, suffix), location)) - } - - fn consume_underscore_followed_by_dec_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn consume_underscore_followed_by_hex_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn consume_underscore_followed_by_bin_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn unallow_numeric_suffix(&self) { - if CharacterValidator::is_identifier_start(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - } - - fn scan_string_literal(&mut self, raw: bool) -> Option<(Token, Location)> { - let delim = self.characters.peek_or_zero(); - if !['"', '\''].contains(&delim) { - return None; - } - let mut start = self.cursor_location(); - // Include the "@" punctuator as part of raw string literals - if raw { - start = Location::with_offset(&start.compilation_unit(), start.first_offset() - 1); - } - - self.characters.next(); - - // Triple string literal - if self.characters.peek_or_zero() == delim && self.characters.peek_at_or_zero(1) == delim { - self.characters.skip_count_in_place(2); - return self.scan_triple_string_literal(delim, start, raw); - } - - let mut value = String::new(); - - if raw { - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak, vec![]); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - value.push(ch); - self.characters.next(); - } - } - } else { - loop { - if let Some(s) = self.consume_escape_sequence() { - value.push_str(&s); - } else { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak, vec![]); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - value.push(ch); - self.characters.next(); - } - } - } - } - - let location = start.combine_with(self.cursor_location()); - Some((Token::String(value), location)) - } - - fn scan_triple_string_literal(&mut self, delim: char, start: Location, raw: bool) -> Option<(Token, Location)> { - let mut lines: Vec = vec![]; - let mut builder = String::new(); - - if raw { - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim && self.characters.peek_at_or_zero(1) == delim && self.characters.peek_at_or_zero(2) == delim { - self.characters.skip_count_in_place(3); - lines.push(builder.clone()); - break; - } else if CharacterValidator::is_line_terminator(ch) { - lines.push(builder.clone()); - builder.clear(); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - lines.push(builder.clone()); - builder.clear(); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - } else { - loop { - if let Some(s) = self.consume_escape_sequence() { - builder.push_str(&s); - } else { - let ch = self.characters.peek_or_zero(); - if ch == delim && self.characters.peek_at_or_zero(1) == delim && self.characters.peek_at_or_zero(2) == delim { - self.characters.skip_count_in_place(3); - lines.push(builder.clone()); - break; - } else if CharacterValidator::is_line_terminator(ch) { - lines.push(builder.clone()); - builder.clear(); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - lines.push(builder.clone()); - builder.clear(); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - } - } - - let location = start.combine_with(self.cursor_location()); - - if lines[0].is_empty() && lines.len() > 1 { - lines.remove(0); - } - - let last_line = lines.pop().unwrap(); - - let base_indent = CharacterValidator::indent_count(&last_line); - - let mut lines: Vec = lines.iter().map(|line| { - let indent = CharacterValidator::indent_count(line); - line[usize::min(base_indent, indent)..].to_owned() - }).collect(); - - let last_line = last_line[base_indent..].to_owned(); - if !last_line.is_empty() { - lines.push(last_line); - } - - let value = lines.join("\n"); - Some((Token::String(value), location)) - } - - fn consume_escape_sequence(&mut self) -> Option { - if self.characters.peek_or_zero() != '\\' { - return None; - } - self.characters.next(); - if !self.characters.has_remaining() { - self.add_unexpected_error(); - return Some("".into()); - } - if self.consume_line_terminator() { - return Some("".into()); - } - let ch = self.characters.peek_or_zero(); - match ch { - '\'' | '"' | '\\' => { - self.characters.next(); - Some(ch.into()) - }, - 'u' => { - Some(self.expect_unicode_escape_sequence().into()) - }, - 'x' => { - self.characters.next(); - let v = (self.expect_hex_digit() << 4) | self.expect_hex_digit(); - let v = char::from_u32(v).unwrap(); - Some(v.into()) - }, - 'b' => { - self.characters.next(); - Some('\x08'.into()) - }, - 'f' => { - self.characters.next(); - Some('\x0C'.into()) - }, - 'n' => { - self.characters.next(); - Some('\x0A'.into()) - }, - 'r' => { - self.characters.next(); - Some('\x0D'.into()) - }, - 't' => { - self.characters.next(); - Some('\x09'.into()) - }, - 'v' => { - self.characters.next(); - Some('\x0B'.into()) - }, - '0' => { - self.characters.next(); - if CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - Some('\x00'.into()) - }, - ch => { - if CharacterValidator::is_dec_digit(ch) { - self.add_unexpected_error(); - } - self.characters.next(); - Some(ch.into()) - }, - } - } - - /// Scans for an *InputElementXMLTag* token. - pub fn scan_ie_xml_tag(&mut self) -> (Token, Location) { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - // XmlName - if CharacterValidator::is_xml_name_start(ch) { - self.characters.next(); - while CharacterValidator::is_xml_name_part(self.characters.peek_or_zero()) { - self.characters.next(); - } - let location = start.combine_with(self.cursor_location()); - let name = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - return (Token::XmlName(name), location); - } - - // XmlWhitespace - if CharacterValidator::is_xml_whitespace(ch) { - while CharacterValidator::is_xml_whitespace(self.characters.peek_or_zero()) { - if !self.consume_line_terminator() { - self.characters.next(); - } - } - let location = start.combine_with(self.cursor_location()); - return (Token::XmlWhitespace, location); - } - - match ch { - // Assign - '=' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::Assign, location) - }, - - // Gt - '>' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::Gt, location) - }, - - // XmlSlashGt - '/' => { - self.characters.next(); - if self.characters.peek_or_zero() != '>' { - self.add_unexpected_error(); - /* - while self.characters.has_remaining() { - self.characters.next(); - if self.characters.peek_or_zero() == '>' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlSlashGt, location); - } - } - */ - let location = start.combine_with(self.cursor_location()); - return (Token::XmlSlashGt, location); - } - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::XmlSlashGt, location) - }, - - // XmlAttributeValue - '"' | '\'' => { - let delim = ch; - self.characters.next(); - while self.characters.peek_or_zero() != delim && self.characters.has_remaining() { - if !self.consume_line_terminator() { - self.characters.next(); - } - } - if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForAttributeValue); - let value = self.compilation_unit.text()[(start.first_offset + 1)..self.cursor_location().first_offset].to_owned(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlAttributeValue(value), location); - } - let value = self.compilation_unit.text()[(start.first_offset + 1)..self.cursor_location().first_offset].to_owned(); - self.characters.next(); - - let location = start.combine_with(self.cursor_location()); - (Token::XmlAttributeValue(value), location) - }, - - // BlockOpen - '{' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::BlockOpen, location) - }, - - _ => { - if self.characters.reached_end() { - return (Token::Eof, self.cursor_location()); - } - self.add_unexpected_error(); - self.characters.next(); - self.scan_ie_xml_tag() - }, - } - } - - /// Scans for an *InputElementXMLContent* token. - pub fn scan_ie_xml_content(&mut self) -> (Token, Location) { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - match ch { - '<' => { - self.characters.next(); - - // XmlMarkup - if let Some(r) = self.scan_xml_markup(start.clone()) { - return r; - } - - // XmlLtSlash - if self.characters.peek_or_zero() == '/' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlLtSlash, location); - } - - // Lt - let location = start.combine_with(self.cursor_location()); - (Token::Lt, location) - }, - - // BlockOpen - '{' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::BlockOpen, location) - }, - - // XmlName - _ => { - if self.characters.reached_end() { - return (Token::Eof, self.cursor_location()); - } - loop { - let ch = self.characters.peek_or_zero(); - if ['<', '{'].contains(&ch) { - break; - } - if CharacterValidator::is_line_terminator(ch) { - self.consume_line_terminator(); - } else if self.characters.has_remaining() { - self.characters.next(); - } else { - break; - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - (Token::XmlText(content), location) - }, - } - } - - /// Attempts to scan a XMLMarkup token after a `<` character. - pub fn scan_xml_markup(&mut self, start: Location) -> Option<(Token, Location)> { - // XMLComment - if self.characters.peek_seq(3) == "!--" { - self.characters.skip_count_in_place(3); - loop { - if self.characters.peek_or_zero() == '-' && self.characters.peek_seq(3) == "-->" { - self.characters.skip_count_in_place(3); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForXmlComment); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - // XMLCDATA - if self.characters.peek_seq(8) == "![CDATA[" { - self.characters.skip_count_in_place(8); - loop { - if self.characters.peek_or_zero() == ']' && self.characters.peek_seq(3) == "]]>" { - self.characters.skip_count_in_place(3); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForCData); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - // XMLPI - if self.characters.peek_or_zero() == '?' { - self.characters.next(); - loop { - if self.characters.peek_or_zero() == '?' && self.characters.peek_at_or_zero(1) == '>' { - self.characters.skip_count_in_place(2); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForPi); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - None - } -} \ No newline at end of file diff --git a/crates/parser/tree.rs b/crates/parser/tree.rs deleted file mode 100644 index e18f45d..0000000 --- a/crates/parser/tree.rs +++ /dev/null @@ -1,165 +0,0 @@ -//! Defines the syntactic nodes produced by the parser. - -mod invalidated_node; -pub use invalidated_node::*; - -// Expressions -mod expression; -pub use expression::*; -mod qualified_identifier; -pub use qualified_identifier::*; -mod paren_expression; -pub use paren_expression::*; -mod null_literal; -pub use null_literal::*; -mod boolean_literal; -pub use boolean_literal::*; -mod numeric_literal; -pub use numeric_literal::*; -mod string_literal; -pub use string_literal::*; -mod this_literal; -pub use this_literal::*; -mod regexp_literal; -pub use regexp_literal::*; -mod xml_expression; -pub use xml_expression::*; -mod array_literal; -pub use array_literal::*; -mod vector_literal; -pub use vector_literal::*; -mod object_initializer; -pub use object_initializer::*; -mod function_expression; -pub use function_expression::*; -mod import_meta; -pub use import_meta::*; -mod new_expression; -pub use new_expression::*; -mod member_expression; -pub use member_expression::*; -mod computed_member_expression; -pub use computed_member_expression::*; -mod descendants_expression; -pub use descendants_expression::*; -mod filter_expression; -pub use filter_expression::*; -mod super_expression; -pub use super_expression::*; -mod call_expression; -pub use call_expression::*; -mod expression_with_type_arguments; -pub use expression_with_type_arguments::*; -mod unary_expression; -pub use unary_expression::*; -mod optional_chaining_expression; -pub use optional_chaining_expression::*; -mod binary_expression; -pub use binary_expression::*; -mod conditional_expression; -pub use conditional_expression::*; -mod assignment_expression; -pub use assignment_expression::*; -mod sequence_expression; -pub use sequence_expression::*; -mod type_expression; -pub use type_expression::*; -mod reserved_namespace_expression; -pub use reserved_namespace_expression::*; - -// Destructuring -mod destructuring; -pub use destructuring::*; - -// Statements -mod empty_statement; -pub use empty_statement::*; -mod expression_statement; -pub use expression_statement::*; -mod super_statement; -pub use super_statement::*; -mod block; -pub use block::*; -mod labeled_statement; -pub use labeled_statement::*; -mod if_statement; -pub use if_statement::*; -mod switch_statement; -pub use switch_statement::*; -mod do_statement; -pub use do_statement::*; -mod while_statement; -pub use while_statement::*; -mod for_statement; -pub use for_statement::*; -mod continue_statement; -pub use continue_statement::*; -mod break_statement; -pub use break_statement::*; -mod with_statement; -pub use with_statement::*; -mod return_statement; -pub use return_statement::*; -mod throw_statement; -pub use throw_statement::*; -mod try_statement; -pub use try_statement::*; -mod default_xml_namespace_statement; -pub use default_xml_namespace_statement::*; - -// Directives -mod directive; -pub use directive::*; -mod configuration_directive; -pub use configuration_directive::*; -mod import_directive; -pub use import_directive::*; -mod use_namespace_directive; -pub use use_namespace_directive::*; -mod include_directive; -pub use include_directive::*; -mod normal_configuration_directive; -pub use normal_configuration_directive::*; -mod package_concat_directive; -pub use package_concat_directive::*; -mod directive_injection_node; -pub use directive_injection_node::*; - -// Miscellaneous -mod attributes; -pub use attributes::*; -mod asdoc; -pub use asdoc::*; -mod type_parameter; -pub use type_parameter::*; - -// Definitions -mod variable_definition; -pub use variable_definition::*; -mod function_definition; -pub use function_definition::*; -mod class_definition; -pub use class_definition::*; -mod enum_definition; -pub use enum_definition::*; -mod interface_definition; -pub use interface_definition::*; -mod type_definition; -pub use type_definition::*; -mod namespace_definition; -pub use namespace_definition::*; -mod package_definition; -pub use package_definition::*; -mod program; -pub use program::*; - -// MXML document -mod mxml; -pub use mxml::*; - -// CSS -mod css; -pub use css::*; - -mod tree_semantics; -pub use tree_semantics::*; \ No newline at end of file diff --git a/crates/parser/tree/array_literal.rs b/crates/parser/tree/array_literal.rs deleted file mode 100644 index 3ddf080..0000000 --- a/crates/parser/tree/array_literal.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ArrayLiteral { - pub location: Location, - /// ASDoc. Always ignore this field; it is used solely - /// when parsing meta-data. - pub asdoc: Option>, - pub elements: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum Element { - Elision, - Expression(Rc), - Rest((Rc, Location)), -} \ No newline at end of file diff --git a/crates/parser/tree/asdoc.rs b/crates/parser/tree/asdoc.rs deleted file mode 100644 index 95d7756..0000000 --- a/crates/parser/tree/asdoc.rs +++ /dev/null @@ -1,52 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct AsDoc { - pub location: Location, - pub main_body: Option<(String, Location)>, - pub tags: Vec<(AsDocTag, Location)>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum AsDocTag { - Author(String), - Copy(Rc), - Created(String), - Default(String), - Deprecated { - message: Option, - }, - EventType(Rc), - Example(String), - InheritDoc, - Internal(String), - Langversion(String), - Param { - name: String, - description: String, - }, - Playerversion(String), - Private, - Productversion(String), - Return(String), - See { - reference: Rc, - display_text: Option, - }, - Throws { - class_reference: Rc, - description: Option, - }, - Version(String), -} - -/// An ASDoc reference consisting of an optional base and -/// an optional instance property fragment (`#x`). -#[derive(Clone, Serialize, Deserialize)] -pub struct AsDocReference { - /// Base expression. - pub base: Option>, - /// Instance property fragment following the hash character. - pub instance_property: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/assignment_expression.rs b/crates/parser/tree/assignment_expression.rs deleted file mode 100644 index 52db6f3..0000000 --- a/crates/parser/tree/assignment_expression.rs +++ /dev/null @@ -1,15 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct AssignmentExpression { - pub location: Location, - pub compound: Option, - /// Assignment left-hand side. - /// - /// If the left-hand side is an `ObjectInitializer` or an `ArrayLiteral`, - /// possibly followed by a non-null operator, - /// and there is no compound assignment, it is a destructuring pattern. - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/attributes.rs b/crates/parser/tree/attributes.rs deleted file mode 100644 index 6e248d0..0000000 --- a/crates/parser/tree/attributes.rs +++ /dev/null @@ -1,170 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub enum Attribute { - Metadata(Rc), - Expression(Rc), - Public(Location), - Private(Location), - Protected(Location), - Internal(Location), - Final(Location), - Native(Location), - Static(Location), - Abstract(Location), - Override(Location), - Dynamic(Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Metadata { - pub location: Location, - pub asdoc: Option>, - pub name: (String, Location), - pub entries: Option>>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MetadataEntry { - pub location: Location, - pub key: Option<(String, Location)>, - pub value: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum MetadataValue { - IdentifierString((String, Location)), - String((String, Location)), -} - -impl MetadataValue { - pub fn location(&self) -> Location { - match self { - Self::IdentifierString((_, l)) => l.clone(), - Self::String((_, l)) => l.clone(), - } - } -} - -impl Attribute { - pub fn location(&self) -> Location { - match self { - Self::Expression(m) => m.location(), - Self::Metadata(m) => m.location.clone(), - Self::Public(a) => a.clone(), - Self::Private(a) => a.clone(), - Self::Protected(a) => a.clone(), - Self::Internal(a) => a.clone(), - Self::Final(a) => a.clone(), - Self::Native(a) => a.clone(), - Self::Static(a) => a.clone(), - Self::Abstract(a) => a.clone(), - Self::Override(a) => a.clone(), - Self::Dynamic(a) => a.clone(), - } - } - - pub fn has_access_modifier(list: &[Attribute]) -> bool { - for a in list { - match a { - Self::Expression(_) | - Self::Public(_) | - Self::Private(_) | - Self::Protected(_) | - Self::Internal(_) => return true, - _ => {} - } - } - false - } - - pub fn remove_metadata(list: &mut Vec, metadata: &Rc) { - for i in 0..list.len() { - if let Attribute::Metadata(metadata_1) = &list[i] { - if Rc::ptr_eq(&metadata_1, metadata) { - list.remove(i); - break; - } - } - } - } - - pub fn find_metadata(list: &[Attribute]) -> Vec> { - let mut r = vec![]; - for a in list { - match &a { - Self::Metadata(e) => { - r.push(e.clone()); - }, - _ => {}, - } - } - r - } - pub fn find_expression(list: &[Attribute]) -> Option> { for a in list { match &a { Self::Expression(e) => return Some(e.clone()), _ => {} } }; None } - pub fn find_public(list: &[Attribute]) -> Option { for a in list { match &a { Self::Public(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_private(list: &[Attribute]) -> Option { for a in list { match &a { Self::Private(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_protected(list: &[Attribute]) -> Option { for a in list { match &a { Self::Protected(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_internal(list: &[Attribute]) -> Option { for a in list { match &a { Self::Internal(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_final(list: &[Attribute]) -> Option { for a in list { match &a { Self::Final(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_native(list: &[Attribute]) -> Option { for a in list { match &a { Self::Native(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_static(list: &[Attribute]) -> Option { for a in list { match &a { Self::Static(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_abstract(list: &[Attribute]) -> Option { for a in list { match &a { Self::Abstract(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_override(list: &[Attribute]) -> Option { for a in list { match &a { Self::Override(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_dynamic(list: &[Attribute]) -> Option { for a in list { match &a { Self::Dynamic(l) => return Some(l.clone()), _ => {} } }; None } - - pub fn has(list: &[Attribute], attribute: &Attribute) -> bool { - match attribute { - Self::Public(_) => Self::find_public(list).is_some(), - Self::Private(_) => Self::find_private(list).is_some(), - Self::Protected(_) => Self::find_protected(list).is_some(), - Self::Internal(_) => Self::find_internal(list).is_some(), - Self::Final(_) => Self::find_final(list).is_some(), - Self::Native(_) => Self::find_native(list).is_some(), - Self::Static(_) => Self::find_static(list).is_some(), - Self::Abstract(_) => Self::find_abstract(list).is_some(), - Self::Override(_) => Self::find_override(list).is_some(), - Self::Dynamic(_) => Self::find_dynamic(list).is_some(), - _ => false, - } - } - - pub fn is_duplicate_access_modifier(list: &[Attribute], attribute: &Attribute) -> bool { - match attribute { - Self::Expression(_) | - Self::Public(_) | - Self::Private(_) | - Self::Protected(_) | - Self::Internal(_) => Self::find_expression(list).is_some() || Self::find_public(list).is_some() || Self::find_private(list).is_some() || Self::find_protected(list).is_some() || Self::find_internal(list).is_some(), - _ => false, - } - } - - pub fn is_metadata(&self) -> bool { matches!(self, Self::Metadata(_)) } - pub fn is_public(&self) -> bool { matches!(self, Self::Public(_)) } - pub fn is_private(&self) -> bool { matches!(self, Self::Private(_)) } - pub fn is_protected(&self) -> bool { matches!(self, Self::Protected(_)) } - pub fn is_internal(&self) -> bool { matches!(self, Self::Internal(_)) } - pub fn is_final(&self) -> bool { matches!(self, Self::Final(_)) } - pub fn is_native(&self) -> bool { matches!(self, Self::Native(_)) } - pub fn is_static(&self) -> bool { matches!(self, Self::Static(_)) } - pub fn is_abstract(&self) -> bool { matches!(self, Self::Abstract(_)) } - pub fn is_override(&self) -> bool { matches!(self, Self::Override(_)) } - pub fn is_dynamic(&self) -> bool { matches!(self, Self::Dynamic(_)) } - - pub fn from_identifier_name(name: &str, location: &Location) -> Option { - if location.character_count() != name.chars().count() { - return None; - } - match name.as_ref() { - "final" => Some(Attribute::Final(location.clone())), - "native" => Some(Attribute::Native(location.clone())), - "static" => Some(Attribute::Static(location.clone())), - "abstract" => Some(Attribute::Abstract(location.clone())), - "override" => Some(Attribute::Override(location.clone())), - "dynamic" => Some(Attribute::Dynamic(location.clone())), - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/binary_expression.rs b/crates/parser/tree/binary_expression.rs deleted file mode 100644 index 26bee27..0000000 --- a/crates/parser/tree/binary_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BinaryExpression { - pub location: Location, - pub operator: Operator, - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/block.rs b/crates/parser/tree/block.rs deleted file mode 100644 index 1349d32..0000000 --- a/crates/parser/tree/block.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Block statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct Block { - pub location: Location, - pub directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/boolean_literal.rs b/crates/parser/tree/boolean_literal.rs deleted file mode 100644 index 537f41f..0000000 --- a/crates/parser/tree/boolean_literal.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BooleanLiteral { - pub location: Location, - pub value: bool, -} \ No newline at end of file diff --git a/crates/parser/tree/break_statement.rs b/crates/parser/tree/break_statement.rs deleted file mode 100644 index 4b75262..0000000 --- a/crates/parser/tree/break_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BreakStatement { - pub location: Location, - pub label: Option<(String, Location)>, -} \ No newline at end of file diff --git a/crates/parser/tree/call_expression.rs b/crates/parser/tree/call_expression.rs deleted file mode 100644 index 2f502b2..0000000 --- a/crates/parser/tree/call_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct CallExpression { - pub location: Location, - pub base: Rc, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/class_definition.rs b/crates/parser/tree/class_definition.rs deleted file mode 100644 index fb9d6b3..0000000 --- a/crates/parser/tree/class_definition.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ClassDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: (String, Location), - pub type_parameters: Option>>, - pub extends_clause: Option>, - pub implements_clause: Option>>, - pub block: Rc, -} diff --git a/crates/parser/tree/computed_member_expression.rs b/crates/parser/tree/computed_member_expression.rs deleted file mode 100644 index c869f5e..0000000 --- a/crates/parser/tree/computed_member_expression.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ComputedMemberExpression { - pub location: Location, - pub base: Rc, - /// ASDoc. Always ignore this field; it is used solely - /// when parsing meta-data. - pub asdoc: Option>, - pub key: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/conditional_expression.rs b/crates/parser/tree/conditional_expression.rs deleted file mode 100644 index cbf1f8d..0000000 --- a/crates/parser/tree/conditional_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ConditionalExpression { - pub location: Location, - pub test: Rc, - pub consequent: Rc, - pub alternative: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/configuration_directive.rs b/crates/parser/tree/configuration_directive.rs deleted file mode 100644 index d6399c4..0000000 --- a/crates/parser/tree/configuration_directive.rs +++ /dev/null @@ -1,16 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `configuration {}` directive. -/// -/// # Syntax -/// -/// The directive consists of a block of `if..else` branches. -/// The top-level if statement takes a block, as well as its -/// optional else clause. The `configuration` directive -/// may consist of solely a block, in which case it is redundant. -#[derive(Clone, Serialize, Deserialize)] -pub struct ConfigurationDirective { - pub location: Location, - pub directive: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/continue_statement.rs b/crates/parser/tree/continue_statement.rs deleted file mode 100644 index 70338d7..0000000 --- a/crates/parser/tree/continue_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ContinueStatement { - pub location: Location, - pub label: Option<(String, Location)>, -} \ No newline at end of file diff --git a/crates/parser/tree/css.rs b/crates/parser/tree/css.rs deleted file mode 100644 index c10a14f..0000000 --- a/crates/parser/tree/css.rs +++ /dev/null @@ -1,471 +0,0 @@ -use std::{marker::PhantomData, str::FromStr}; - -use crate::ns::*; -use num_traits::ToPrimitive; -use serde::{Serialize, Deserialize}; - -/// CSS3 selector combinators. -/// -/// See also: [CSS3 selectors: combinators](http://www.w3.org/TR/css3-selectors/#combinators). -#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum CssCombinatorType { - Descendant, - Child, - Preceded, - Sibling, -} - -impl ToString for CssCombinatorType { - /// Symbol that represents the combinator type. - fn to_string(&self) -> String { - match self { - Self::Descendant => " ".into(), - Self::Child => ">".into(), - Self::Preceded => "+".into(), - Self::Sibling => "~".into(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssDirective { - Invalidated(InvalidatedNode), - FontFace(CssFontFace), - MediaQuery(CssMediaQuery), - NamespaceDefinition(CssNamespaceDefinition), - Rule(CssRule), -} - -impl CssDirective { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::FontFace(v) => v.location.clone(), - Self::MediaQuery(v) => v.location.clone(), - Self::NamespaceDefinition(v) => v.location.clone(), - Self::Rule(v) => v.location.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssPropertyValue { - Invalidated(InvalidatedNode), - /// Example: `yellow, #fff` - Array(CssArrayPropertyValue), - /// Example: `1px solid red` - MultiValue(CssMultiValuePropertyValue), - /// Example: `yellow`, `#fff` - Color(CssColorPropertyValue), - /// Example: `10, 10.0, 10pt` - Number(CssNumberPropertyValue), - /// Example: `rgb(10% 10% 10%)`, `rgb(10%, 10%, 10%)` - RgbColor(CssRgbColorPropertyValue), - /// Example: `"string"` - String(CssStringPropertyValue), - /// Example: `solid`, `_serif` - Identifier(CssIdentifierPropertyValue), - /// `ClassReference(...)` - ClassReference(CssClassReferencePropertyValue), - /// `PropertyReference(...)` - PropertyReference(CssPropertyReferencePropertyValue), - //// `url(...) [format(...)]` - Url(CssUrlPropertyValue), - /// `local(...)` - Local(CssLocalPropertyValue), - /// `Embed(...)` - Embed(CssEmbedPropertyValue), -} - -impl CssPropertyValue { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Array(v) => v.location.clone(), - Self::MultiValue(v) => v.location.clone(), - Self::Color(v) => v.location.clone(), - Self::Number(v) => v.location.clone(), - Self::RgbColor(v) => v.location.clone(), - Self::String(v) => v.location.clone(), - Self::Identifier(v) => v.location.clone(), - Self::ClassReference(v) => v.location.clone(), - Self::PropertyReference(v) => v.location.clone(), - Self::Url(v) => v.location.clone(), - Self::Local(v) => v.location.clone(), - Self::Embed(v) => v.location.clone(), - } - } - - pub fn as_array(&self) -> Option<&CssArrayPropertyValue> { - let Self::Array(v) = self else { return None; }; - Some(v) - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssSelector { - Invalidated(InvalidatedNode), - Base(CssBaseSelector), - Combinator(CssCombinatorSelector), -} - -impl CssSelector { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Base(v) => v.location.clone(), - Self::Combinator(v) => v.location.clone(), - } - } -} - -/// Array property values are comma-separated values in CSS properties. -/// -/// For example: -/// -/// ```css -/// fillColors: #FFFFFF, #CCCCCC, #FFFFFF, #EEEEEE; -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct CssArrayPropertyValue { - pub location: Location, - pub elements: Vec>, -} - -/// Multi-value property values are space-separated values in CSS properties. -/// -/// For example: -/// -/// ```css -/// 1px solid blue -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct CssMultiValuePropertyValue { - pub location: Location, - pub values: Vec>, -} - -/// A CSS base selector. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssBaseSelector { - pub location: Location, - pub namespace_prefix: Option<(String, Location)>, - pub element_name: Option<(String, Location)>, - pub conditions: Vec>, -} - -/// Supported condition types for [`CssSelectorCondition`]. -#[derive(Clone, Serialize, Deserialize)] -pub enum CssSelectorCondition { - Invalidated(InvalidatedNode), - /// For example: `s|Label.className` - Class((String, Location)), - /// For example: `s|Label#idValue` - Id((String, Location)), - /// For example: `s|Label:loadingState` - Pseudo((String, Location)), - /// For example: `s|Label::loadingState` - PseudoElement((String, Location)), - /// For example: `s|Panel:not(:first-child)` - Not { - location: Location, - condition: Rc, - }, - /// For example: `s|Label[loadingState]` - Attribute { - location: Location, - name: (String, Location), - operator: Option, - value: Option<(String, Location)>, - }, -} - -impl CssSelectorCondition { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Class((_, l)) => l.clone(), - Self::Id((_, l)) => l.clone(), - Self::Pseudo((_, l)) => l.clone(), - Self::PseudoElement((_, l)) => l.clone(), - Self::Not { location, .. } => location.clone(), - Self::Attribute { location, .. } => location.clone(), - } - } -} - -#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum CssAttributeOperator { - Equals, - BeginsWith, - EndsWith, - Contains, - ListMatch, - HreflangMatch, -} - -impl ToString for CssAttributeOperator { - fn to_string(&self) -> String { - match self { - Self::Equals => "=".into(), - Self::BeginsWith => "^=".into(), - Self::EndsWith => "$=".into(), - Self::Contains => "*=".into(), - Self::ListMatch => "~=".into(), - Self::HreflangMatch => "|=".into(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssColorPropertyValue { - pub location: Location, - pub color_int: u32, -} - -impl CssColorPropertyValue { - pub fn from_hex(location: Location, token_text: &str) -> Result { - let mut token_text = if token_text.starts_with('#') { token_text.to_owned() } else { - "#".to_owned() + token_text - }; - if token_text.len() == 4 { - let mut six = String::new(); - let chars: Vec<_> = token_text.chars().collect(); - six.push('#'); - six.push(chars[1]); - six.push(chars[1]); - six.push(chars[2]); - six.push(chars[2]); - six.push(chars[3]); - six.push(chars[3]); - token_text = six; - } - Ok(Self { - location, - color_int: u32::from_str_radix(&token_text[1..], 16).map_err(|_| ParserError::Common)?.clamp(0x000000, 0xFFFFFF), - }) - } - - pub fn text(&self) -> String { - self.location.text() - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssNumberPropertyValue { - pub location: Location, - pub value: f64, - pub unit: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssRgbColorPropertyValue { - pub location: Location, - pub color_int: u32, -} - -impl CssRgbColorPropertyValue { - pub fn from_raw_arguments(location: &Location, raw_arguments: &[String]) -> Result { - Ok(CssRgbColorPropertyValue { - location: location.clone(), - color_int: (Self::parse_component(&raw_arguments[0])? << 16) - | (Self::parse_component(&raw_arguments[1])? << 8) - | Self::parse_component(&raw_arguments[2])?, - }) - } - - fn parse_component(input: &str) -> Result { - let i = input.find('%'); - let v: u32; - if let Some(i) = i { - let percent = f64::from_str(&input[..i]).map_err(|_| ParserError::Common)?.clamp(0.0, 100.0); - v = (255.0 * (percent / 100.0)).round().to_u32().ok_or(ParserError::Common)?; - } else if input.contains('.') { - let ratio = f64::from_str(input).map_err(|_| ParserError::Common)?.clamp(0.0, 1.0); - v = (255.0 * ratio).round().to_u32().ok_or(ParserError::Common)?; - } else { - v = u32::from_str(input).map_err(|_| ParserError::Common)?; - } - Ok(v.clamp(0, 255)) - } -} - -/// A CSS text is a string value written without quotes. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssStringPropertyValue { - pub location: Location, - pub value: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssIdentifierPropertyValue { - pub location: Location, - pub value: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssClassReferencePropertyValue { - pub location: Location, - /// Name or "null". - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssPropertyReferencePropertyValue { - pub location: Location, - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssUrlPropertyValue { - pub location: Location, - pub url: (String, Location), - pub format: Option<(String, Location)>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssLocalPropertyValue { - pub location: Location, - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssEmbedPropertyValue { - pub location: Location, - pub entries: Vec>, -} - -/// Represents a key-value entry for an `Embed` function call property value. -/// It may be a keyless entry. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssEmbedEntry { - pub location: Location, - pub key: Option<(String, Location)>, - pub value: (String, Location), -} - -/// A CSS selector containing a combinator. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssCombinatorSelector { - pub location: Location, - pub left: Rc, - pub right: Rc, - pub combinator_type: CssCombinatorType, -} - -/// The root object of a CSS DOM. The CSS3 DOM objects serve not only IDE -/// features in code model, but also CSS compilation. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssDocument { - pub location: Location, - pub directives: Vec>, -} - -/// CSS DOM for an `@font-face` statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssFontFace { - pub location: Location, - pub properties: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssProperty { - pub location: Location, - pub name: (String, Location), - pub value: Rc, - #[serde(skip)] - _phantom: PhantomData<()>, -} - -impl CssProperty { - pub fn new(location: Location, name: (String, Location), value: Rc) -> Self { - Self { - location, - name: (Self::normalize(&name.0), name.1), - value, - _phantom: PhantomData::default(), - } - } - - /// Normalize CSS property names to camel-case style names. Names already in - /// camel-case will be returned as-is. - fn normalize(name: &str) -> String { - let mut split = name.split('-').map(|s| s.to_owned()).collect::>(); - let mut v = split[0].chars(); - let mut v1 = String::new(); - if let Some(ch) = v.next() { - v1.push_str(&ch.to_lowercase().to_string()); - for ch in v { - v1.push(ch); - } - } - split[0] = v1; - for i in 1..split.len() { - let mut v = split[i].chars(); - let mut v1 = String::new(); - if let Some(ch) = v.next() { - v1.push_str(&ch.to_uppercase().to_string()); - for ch in v { - v1.push(ch); - } - } - split[i] = v1; - } - split.join("") - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssMediaQuery { - pub location: Location, - pub conditions: Vec>, - pub rules: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssMediaQueryCondition { - Invalidated(InvalidatedNode), - /// Identifier. Example: "screen". - Id((String, Location)), - /// The `only` keyword followed by an identifier. - /// Example: "only screen". - OnlyId { - location: Location, - id: (String, Location), - }, - /// A parenthesized property, such as - /// `(application-dpi: 240)`. - ParenProperty((Rc, Location)), - /// A `condition1 and condition2` expression. - And { - location: Location, - left: Rc, - right: Rc, - }, -} - -impl CssMediaQueryCondition { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Id((_, l)) => l.clone(), - Self::OnlyId { location, .. } => location.clone(), - Self::ParenProperty((_, l)) => l.clone(), - Self::And { location, .. } => location.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssRule { - pub location: Location, - pub selectors: Vec>, - pub properties: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssNamespaceDefinition { - pub location: Location, - pub prefix: (String, Location), - pub uri: (String, Location), -} \ No newline at end of file diff --git a/crates/parser/tree/default_xml_namespace_statement.rs b/crates/parser/tree/default_xml_namespace_statement.rs deleted file mode 100644 index 08084e2..0000000 --- a/crates/parser/tree/default_xml_namespace_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct DefaultXmlNamespaceStatement { - pub location: Location, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/descendants_expression.rs b/crates/parser/tree/descendants_expression.rs deleted file mode 100644 index d4e7bce..0000000 --- a/crates/parser/tree/descendants_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct DescendantsExpression { - pub location: Location, - pub base: Rc, - pub identifier: QualifiedIdentifier, -} \ No newline at end of file diff --git a/crates/parser/tree/destructuring.rs b/crates/parser/tree/destructuring.rs deleted file mode 100644 index 3205c3d..0000000 --- a/crates/parser/tree/destructuring.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypedDestructuring { - pub location: Location, - pub destructuring: Rc, - pub type_annotation: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/directive.rs b/crates/parser/tree/directive.rs deleted file mode 100644 index 3bc0a5f..0000000 --- a/crates/parser/tree/directive.rs +++ /dev/null @@ -1,106 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Directive attached with a source location. -#[derive(Clone, Serialize, Deserialize)] -pub enum Directive { - EmptyStatement(EmptyStatement), - ExpressionStatement(ExpressionStatement), - SuperStatement(SuperStatement), - Block(Block), - LabeledStatement(LabeledStatement), - IfStatement(IfStatement), - SwitchStatement(SwitchStatement), - SwitchTypeStatement(SwitchTypeStatement), - DoStatement(DoStatement), - WhileStatement(WhileStatement), - ForStatement(ForStatement), - ForInStatement(ForInStatement), - BreakStatement(BreakStatement), - ContinueStatement(ContinueStatement), - WithStatement(WithStatement), - ReturnStatement(ReturnStatement), - ThrowStatement(ThrowStatement), - DefaultXmlNamespaceStatement(DefaultXmlNamespaceStatement), - TryStatement(TryStatement), - Invalidated(InvalidatedNode), - ConfigurationDirective(ConfigurationDirective), - ImportDirective(ImportDirective), - UseNamespaceDirective(UseNamespaceDirective), - IncludeDirective(IncludeDirective), - NormalConfigurationDirective(NormalConfigurationDirective), - PackageConcatDirective(PackageConcatDirective), - DirectiveInjection(DirectiveInjectionNode), - VariableDefinition(VariableDefinition), - FunctionDefinition(FunctionDefinition), - ClassDefinition(ClassDefinition), - EnumDefinition(EnumDefinition), - InterfaceDefinition(InterfaceDefinition), - TypeDefinition(TypeDefinition), - NamespaceDefinition(NamespaceDefinition), -} - -impl Directive { - pub fn location(&self) -> Location { - match self { - Self::EmptyStatement(d) => d.location.clone(), - Self::ExpressionStatement(d) => d.location.clone(), - Self::SuperStatement(d) => d.location.clone(), - Self::Block(d) => d.location.clone(), - Self::LabeledStatement(d) => d.location.clone(), - Self::IfStatement(d) => d.location.clone(), - Self::SwitchStatement(d) => d.location.clone(), - Self::SwitchTypeStatement(d) => d.location.clone(), - Self::DoStatement(d) => d.location.clone(), - Self::WhileStatement(d) => d.location.clone(), - Self::ForStatement(d) => d.location.clone(), - Self::ForInStatement(d) => d.location.clone(), - Self::BreakStatement(d) => d.location.clone(), - Self::ContinueStatement(d) => d.location.clone(), - Self::WithStatement(d) => d.location.clone(), - Self::ReturnStatement(d) => d.location.clone(), - Self::ThrowStatement(d) => d.location.clone(), - Self::DefaultXmlNamespaceStatement(d) => d.location.clone(), - Self::TryStatement(d) => d.location.clone(), - Self::Invalidated(d) => d.location.clone(), - Self::ConfigurationDirective(d) => d.location.clone(), - Self::ImportDirective(d) => d.location.clone(), - Self::UseNamespaceDirective(d) => d.location.clone(), - Self::IncludeDirective(d) => d.location.clone(), - Self::NormalConfigurationDirective(d) => d.location.clone(), - Self::PackageConcatDirective(d) => d.location.clone(), - Self::DirectiveInjection(d) => d.location.clone(), - Self::VariableDefinition(d) => d.location.clone(), - Self::FunctionDefinition(d) => d.location.clone(), - Self::ClassDefinition(d) => d.location.clone(), - Self::EnumDefinition(d) => d.location.clone(), - Self::InterfaceDefinition(d) => d.location.clone(), - Self::TypeDefinition(d) => d.location.clone(), - Self::NamespaceDefinition(d) => d.location.clone(), - } - } - - #[inline(always)] - pub fn is_statement(&self) -> bool { - !self.is_directive() - } - - pub fn is_directive(&self) -> bool { - matches!( - self, - Self::ConfigurationDirective(_) | - Self::ImportDirective(_) | - Self::UseNamespaceDirective(_) | - Self::IncludeDirective(_) | - Self::NormalConfigurationDirective(_) | - Self::PackageConcatDirective(_) | - Self::VariableDefinition(_) | - Self::FunctionDefinition(_) | - Self::ClassDefinition(_) | - Self::EnumDefinition(_) | - Self::InterfaceDefinition(_) | - Self::TypeDefinition(_) | - Self::NamespaceDefinition(_) - ) - } -} \ No newline at end of file diff --git a/crates/parser/tree/directive_injection_node.rs b/crates/parser/tree/directive_injection_node.rs deleted file mode 100644 index bb73b64..0000000 --- a/crates/parser/tree/directive_injection_node.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Node that allows modification to the directive sequence. -#[derive(Clone, Serialize, Deserialize)] -pub struct DirectiveInjectionNode { - pub location: Location, - pub directives: RefCell>>, -} \ No newline at end of file diff --git a/crates/parser/tree/do_statement.rs b/crates/parser/tree/do_statement.rs deleted file mode 100644 index 2c6400e..0000000 --- a/crates/parser/tree/do_statement.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `do..while` statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct DoStatement { - pub location: Location, - pub body: Rc, - pub test: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/empty_statement.rs b/crates/parser/tree/empty_statement.rs deleted file mode 100644 index 73ac431..0000000 --- a/crates/parser/tree/empty_statement.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct EmptyStatement { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/enum_definition.rs b/crates/parser/tree/enum_definition.rs deleted file mode 100644 index b1892eb..0000000 --- a/crates/parser/tree/enum_definition.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct EnumDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub is_set: bool, - pub name: (String, Location), - pub as_clause: Option>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/expression.rs b/crates/parser/tree/expression.rs deleted file mode 100644 index edb8c5a..0000000 --- a/crates/parser/tree/expression.rs +++ /dev/null @@ -1,294 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Expression attached with a source location. -#[derive(Clone, Serialize, Deserialize)] -pub enum Expression { - QualifiedIdentifier(QualifiedIdentifier), - Paren(ParenExpression), - NullLiteral(NullLiteral), - BooleanLiteral(BooleanLiteral), - NumericLiteral(NumericLiteral), - StringLiteral(StringLiteral), - ThisLiteral(ThisLiteral), - RegExpLiteral(RegExpLiteral), - Xml(XmlExpression), - XmlMarkup(XmlMarkupExpression), - XmlList(XmlListExpression), - ArrayLiteral(ArrayLiteral), - VectorLiteral(VectorLiteral), - ObjectInitializer(ObjectInitializer), - Function(FunctionExpression), - ImportMeta(ImportMeta), - New(NewExpression), - Member(MemberExpression), - ComputedMember(ComputedMemberExpression), - Descendants(DescendantsExpression), - Filter(FilterExpression), - Super(SuperExpression), - Call(CallExpression), - WithTypeArguments(ExpressionWithTypeArguments), - Unary(UnaryExpression), - OptionalChaining(OptionalChainingExpression), - OptionalChainingPlaceholder(OptionalChainingPlaceholder), - Binary(BinaryExpression), - Conditional(ConditionalExpression), - Assignment(AssignmentExpression), - Sequence(SequenceExpression), - NullableType(NullableTypeExpression), - NonNullableType(NonNullableTypeExpression), - AnyType(AnyTypeExpression), - VoidType(VoidTypeExpression), - ArrayType(ArrayTypeExpression), - TupleType(TupleTypeExpression), - FunctionType(FunctionTypeExpression), - Invalidated(InvalidatedNode), - ReservedNamespace(ReservedNamespaceExpression), -} - -impl Expression { - pub fn location(&self) -> Location { - match self { - Self::QualifiedIdentifier(e) => e.location.clone(), - Self::Paren(e) => e.location.clone(), - Self::NullLiteral(e) => e.location.clone(), - Self::BooleanLiteral(e) => e.location.clone(), - Self::NumericLiteral(e) => e.location.clone(), - Self::StringLiteral(e) => e.location.clone(), - Self::ThisLiteral(e) => e.location.clone(), - Self::RegExpLiteral(e) => e.location.clone(), - Self::Xml(e) => e.location.clone(), - Self::XmlMarkup(e) => e.location.clone(), - Self::XmlList(e) => e.location.clone(), - Self::ArrayLiteral(e) => e.location.clone(), - Self::VectorLiteral(e) => e.location.clone(), - Self::ObjectInitializer(e) => e.location.clone(), - Self::Function(e) => e.location.clone(), - Self::ImportMeta(e) => e.location.clone(), - Self::New(e) => e.location.clone(), - Self::Member(e) => e.location.clone(), - Self::ComputedMember(e) => e.location.clone(), - Self::Descendants(e) => e.location.clone(), - Self::Filter(e) => e.location.clone(), - Self::Super(e) => e.location.clone(), - Self::Call(e) => e.location.clone(), - Self::WithTypeArguments(e) => e.location.clone(), - Self::Unary(e) => e.location.clone(), - Self::OptionalChaining(e) => e.location.clone(), - Self::OptionalChainingPlaceholder(e) => e.location.clone(), - Self::Binary(e) => e.location.clone(), - Self::Conditional(e) => e.location.clone(), - Self::Assignment(e) => e.location.clone(), - Self::Sequence(e) => e.location.clone(), - Self::NullableType(e) => e.location.clone(), - Self::NonNullableType(e) => e.location.clone(), - Self::AnyType(e) => e.location.clone(), - Self::VoidType(e) => e.location.clone(), - Self::ArrayType(e) => e.location.clone(), - Self::TupleType(e) => e.location.clone(), - Self::FunctionType(e) => e.location.clone(), - Self::Invalidated(e) => e.location.clone(), - Self::ReservedNamespace(e) => e.location(), - } - } - - pub(crate) fn to_metadata(&self, parser: &Parser) -> Result>, MetadataRefineError1> { - match self { - Self::ArrayLiteral(ArrayLiteral { elements, asdoc, .. }) => { - if elements.len() != 1 { - return Ok(None); - } - if let Element::Expression(ref exp) = elements[0] { - Ok(Some(vec![Attribute::Metadata(parser.refine_metadata(exp, asdoc.clone()).map_err(|e| MetadataRefineError1(e, exp.location()))?)])) - } else { - Ok(None) - } - }, - Self::ComputedMember(ComputedMemberExpression { base, asdoc, key, .. }) => { - let a = base.to_metadata(parser)?; - if a.is_none() { - return Ok(None); - } - let mut a = a.unwrap(); - if matches!(key.as_ref(), Self::Sequence(_)) { - return Ok(None); - } - a.push(Attribute::Metadata(parser.refine_metadata(key, asdoc.clone()).map_err(|e| MetadataRefineError1(e, key.location()))?)); - Ok(Some(a)) - }, - _ => Ok(None), - } - } - - pub fn to_identifier_name_or_asterisk(&self) -> Option<(String, Location)> { - match self { - Self::QualifiedIdentifier(id) => id.to_identifier_name_or_asterisk(), - _ => None, - } - } - - pub fn to_identifier_name(&self) -> Option<(String, Location)> { - match self { - Self::QualifiedIdentifier(id) => id.to_identifier_name(), - _ => None, - } - } - - pub fn valid_access_modifier(&self) -> bool { - match self { - Self::QualifiedIdentifier(id) => id.is_identifier_token(), - Self::Member(e) => e.base.valid_access_modifier(), - Self::ComputedMember(e) => e.base.valid_access_modifier(), - _ => false, - } - } - - pub(crate) fn to_reserved_namespace_string(&self) -> Option { - if let Self::ReservedNamespace(e) = self { - Some(e.to_string()) - } else { - None - } - } - - pub(crate) fn to_reserved_namespace_attribute(&self) -> Option { - if let Self::ReservedNamespace(e) = self { - Some(e.to_attribute()) - } else { - None - } - } - - pub fn is_invalidated(&self) -> bool { - matches!(self, Self::Invalidated(_)) - } - - pub fn is_non_null_operation(&self) -> bool { - match self { - Self::Unary(expr) => expr.operator == Operator::NonNull, - _ => false, - } - } - - pub fn is_valid_assignment_left_hand_side(&self) -> bool { - match self { - Self::Invalidated(_) => true, - Self::Unary(e) => if e.operator == Operator::NonNull { - e.expression.is_valid_assignment_left_hand_side() - } else { - true - }, - Self::ArrayLiteral(_) | Self::ObjectInitializer(_) => self.is_valid_destructuring(), - _ => true, - } - } - - pub fn is_valid_destructuring(&self) -> bool { - match self { - Self::Invalidated(_) => true, - Self::QualifiedIdentifier(id) => !id.attribute && id.qualifier.is_none() && match &id.id { - QualifiedIdentifierIdentifier::Id(id) => id.0 != "*", - _ => false, - }, - Self::ArrayLiteral(expr) => { - for el in &expr.elements { - match el { - Element::Elision => {}, - Element::Expression(expr) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - Element::Rest((expr, _)) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - } - } - true - }, - Self::ObjectInitializer(init) => { - for field in init.fields.iter() { - match field.as_ref() { - InitializerField::Field { value, .. } => { - if let Some(val) = value { - if !val.is_valid_destructuring() { - return false; - } - } - }, - InitializerField::Rest((expr, _)) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - } - } - true - }, - Self::Unary(expr) => expr.operator == Operator::NonNull && expr.expression.is_valid_destructuring(), - _ => false, - } - } - - /// `CONFIG::VAR_NAME` - pub(crate) fn to_normal_configuration_identifier(&self, parser: &Parser) -> Result)>, MetadataRefineError1> { - if let Self::QualifiedIdentifier(id) = self { - if id.attribute { - return Ok(None); - } - if let Some(q) = &id.qualifier { - if let Some(q) = q.to_identifier_name() { - if let QualifiedIdentifierIdentifier::Id(id) = &id.id { - return Ok(Some((q, id.clone(), vec![]))); - } - } - } - } - if let Self::ComputedMember(ComputedMemberExpression { base, asdoc, key, .. }) = self { - let a = base.to_normal_configuration_identifier(parser)?; - if a.is_none() { - return Ok(None); - } - let (ns, name, mut a) = a.unwrap(); - if matches!(key.as_ref(), Self::Sequence(_)) { - return Ok(None); - } - a.push(Attribute::Metadata(parser.refine_metadata(key, asdoc.clone()).map_err(|e| MetadataRefineError1(e, key.location()))?)); - return Ok(Some((ns, name, a))); - } - Ok(None) - } - - /// `CONFIG::VAR_NAME` - pub(crate) fn to_normal_configuration_identifier_no_metadata(&self) -> Option<((String, Location), (String, Location))> { - if let Self::QualifiedIdentifier(id) = self { - if id.attribute { - return None; - } - if let Some(q) = &id.qualifier { - if let Some(q) = q.to_identifier_name() { - if let QualifiedIdentifierIdentifier::Id(id) = &id.id { - return Some((q, id.clone())); - } - } - } - } - None - } - - pub fn search_optional_chaining_placeholder(self: &Rc) -> Option> { - match self.as_ref() { - Self::OptionalChainingPlaceholder(_) => Some(self.clone()), - Self::Member(e) => e.base.search_optional_chaining_placeholder(), - Self::ComputedMember(e) => e.base.search_optional_chaining_placeholder(), - Self::Descendants(e) => e.base.search_optional_chaining_placeholder(), - Self::Filter(e) => e.base.search_optional_chaining_placeholder(), - Self::Unary(e) => e.expression.search_optional_chaining_placeholder(), - Self::Call(e) => e.base.search_optional_chaining_placeholder(), - Self::WithTypeArguments(e) => e.base.search_optional_chaining_placeholder(), - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/expression_statement.rs b/crates/parser/tree/expression_statement.rs deleted file mode 100644 index 779fc81..0000000 --- a/crates/parser/tree/expression_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ExpressionStatement { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/expression_with_type_arguments.rs b/crates/parser/tree/expression_with_type_arguments.rs deleted file mode 100644 index 8cf5e84..0000000 --- a/crates/parser/tree/expression_with_type_arguments.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `o.<...>` expression. -#[derive(Clone, Serialize, Deserialize)] -pub struct ExpressionWithTypeArguments { - pub location: Location, - pub base: Rc, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/filter_expression.rs b/crates/parser/tree/filter_expression.rs deleted file mode 100644 index 734b6e7..0000000 --- a/crates/parser/tree/filter_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Filter operation `o.(condition)`. -#[derive(Clone, Serialize, Deserialize)] -pub struct FilterExpression { - pub location: Location, - pub base: Rc, - pub test: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/for_statement.rs b/crates/parser/tree/for_statement.rs deleted file mode 100644 index f648a97..0000000 --- a/crates/parser/tree/for_statement.rs +++ /dev/null @@ -1,32 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ForStatement { - pub location: Location, - pub init: Option, - pub test: Option>, - pub update: Option>, - pub body: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ForInitializer { - Expression(Rc), - VariableDefinition(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct ForInStatement { - pub location: Location, - pub each: bool, - pub left: ForInBinding, - pub right: Rc, - pub body: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ForInBinding { - Expression(Rc), - VariableDefinition(Rc), -} \ No newline at end of file diff --git a/crates/parser/tree/function_definition.rs b/crates/parser/tree/function_definition.rs deleted file mode 100644 index 6da842e..0000000 --- a/crates/parser/tree/function_definition.rs +++ /dev/null @@ -1,111 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: FunctionName, - pub common: Rc, -} - -impl FunctionDefinition { - /// Indicates whether the function definition is not a getter, setter, - /// or constructor. - pub fn is_normal(&self) -> bool { - matches!(self.name, FunctionName::Identifier(_)) - } - pub fn is_getter(&self) -> bool { - matches!(self.name, FunctionName::Getter(_)) - } - pub fn is_setter(&self) -> bool { - matches!(self.name, FunctionName::Setter(_)) - } - pub fn is_constructor(&self) -> bool { - matches!(self.name, FunctionName::Constructor(_)) - } - pub fn name_identifier(&self) -> (String, Location) { - match &self.name { - FunctionName::Identifier(name) => name.clone(), - FunctionName::Getter(name) => name.clone(), - FunctionName::Setter(name) => name.clone(), - FunctionName::Constructor(name) => name.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FunctionName { - Identifier((String, Location)), - Getter((String, Location)), - Setter((String, Location)), - /// A `FunctionName` is a `Constructor` variant - /// when the corresponding function definition is a constructor. - Constructor((String, Location)), -} - -impl FunctionName { - pub fn location(&self) -> Location { - match self { - Self::Identifier((_, l)) => l.clone(), - Self::Getter((_, l)) => l.clone(), - Self::Setter((_, l)) => l.clone(), - Self::Constructor((_, l)) => l.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionCommon { - pub location: Location, - /// Indicates whether the corresponding function - /// contains the `yield` operator. - pub contains_yield: bool, - /// Indicates whether the corresponding function - /// contains the `await` operator. - pub contains_await: bool, - pub signature: FunctionSignature, - pub body: Option, -} - -impl FunctionCommon { - pub(crate) fn has_block_body(&self) -> bool { - if let Some(ref body) = self.body { matches!(body, FunctionBody::Block(_)) } else { false } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionSignature { - pub location: Location, - pub parameters: Vec>, - pub result_type: Option>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Parameter { - pub location: Location, - pub kind: ParameterKind, - pub destructuring: TypedDestructuring, - pub default_value: Option>, -} - -#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] -#[repr(u32)] -pub enum ParameterKind { - Required = 1, - Optional = 2, - Rest = 3, -} - -impl ParameterKind { - pub fn may_be_followed_by(&self, other: Self) -> bool { - (*self as u32) <= (other as u32) - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FunctionBody { - Expression(Rc), - Block(Rc), -} \ No newline at end of file diff --git a/crates/parser/tree/function_expression.rs b/crates/parser/tree/function_expression.rs deleted file mode 100644 index 377512e..0000000 --- a/crates/parser/tree/function_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionExpression { - pub location: Location, - pub name: Option<(String, Location)>, - pub common: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/if_statement.rs b/crates/parser/tree/if_statement.rs deleted file mode 100644 index cf84ca0..0000000 --- a/crates/parser/tree/if_statement.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct IfStatement { - pub location: Location, - pub test: Rc, - pub consequent: Rc, - pub alternative: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/import_directive.rs b/crates/parser/tree/import_directive.rs deleted file mode 100644 index 40b6cdf..0000000 --- a/crates/parser/tree/import_directive.rs +++ /dev/null @@ -1,27 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ImportDirective { - pub location: Location, - pub alias: Option<(String, Location)>, - pub package_name: Vec<(String, Location)>, - pub import_specifier: ImportSpecifier, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ImportSpecifier { - Wildcard(Location), - Recursive(Location), - Identifier((String, Location)), -} - -impl ImportSpecifier { - pub fn location(&self) -> Location { - match self { - Self::Wildcard(l) | - Self::Recursive(l) => l.clone(), - Self::Identifier((_, l)) => l.clone(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/import_meta.rs b/crates/parser/tree/import_meta.rs deleted file mode 100644 index be968ce..0000000 --- a/crates/parser/tree/import_meta.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `import.meta` expression. -#[derive(Clone, Serialize, Deserialize)] -pub struct ImportMeta { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/include_directive.rs b/crates/parser/tree/include_directive.rs deleted file mode 100644 index 01faef3..0000000 --- a/crates/parser/tree/include_directive.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct IncludeDirective { - pub location: Location, - pub source: String, - #[serde(skip)] - pub nested_compilation_unit: Rc, - pub nested_packages: Vec>, - pub nested_directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/interface_definition.rs b/crates/parser/tree/interface_definition.rs deleted file mode 100644 index 00dcb67..0000000 --- a/crates/parser/tree/interface_definition.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct InterfaceDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: (String, Location), - pub type_parameters: Option>>, - pub extends_clause: Option>>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/invalidated_node.rs b/crates/parser/tree/invalidated_node.rs deleted file mode 100644 index f15957d..0000000 --- a/crates/parser/tree/invalidated_node.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents a construct that failed to parse. -#[derive(Clone, Serialize, Deserialize)] -pub struct InvalidatedNode { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/labeled_statement.rs b/crates/parser/tree/labeled_statement.rs deleted file mode 100644 index 81cb248..0000000 --- a/crates/parser/tree/labeled_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct LabeledStatement { - pub location: Location, - pub label: (String, Location), - pub substatement: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/member_expression.rs b/crates/parser/tree/member_expression.rs deleted file mode 100644 index 66bb70e..0000000 --- a/crates/parser/tree/member_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct MemberExpression { - pub location: Location, - pub base: Rc, - pub identifier: QualifiedIdentifier, -} \ No newline at end of file diff --git a/crates/parser/tree/mxml.rs b/crates/parser/tree/mxml.rs deleted file mode 100644 index d7dfbca..0000000 --- a/crates/parser/tree/mxml.rs +++ /dev/null @@ -1,217 +0,0 @@ -use std::collections::BTreeMap; - -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct Mxml { - pub location: Location, - pub version: XmlVersion, - pub encoding: String, - pub content: Vec>, -} - -#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub enum XmlVersion { - /// XML version 1.0. - Version10, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlElement { - pub location: Location, - pub name: MxmlName, - /// Attribute list, including `xmlns` and `xmlns:` namespace prefixes. - pub attributes: Vec>, - /// The namespace mapping relative to the XML element. - #[serde(skip)] - pub namespace: Rc, - pub content: Option>>, - pub closing_name: Option, -} - -impl MxmlElement { - pub fn inner_text(&self) -> String { - let mut j = String::new(); - if let Some(c) = self.content.as_ref() { - for c1 in c.iter() { - j.push_str(&c1.inner_text()); - } - } - j - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlAttribute { - pub location: Location, - /// Indicates whether the attribute is a `xmlns` or `xmlns:` attribute. - pub xmlns: bool, - pub name: MxmlName, - /// Attribute value. The location data includes the quotes. - pub value: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlName { - pub location: Location, - /// The unresolved prefix of the name. - pub prefix: Option, - pub name: String, -} - -impl MxmlName { - pub fn resolve_prefix(&self, namespace: &Rc) -> Result { - let Some(p) = self.prefix.as_ref() else { - return if let Some(v) = namespace.get(MxmlNamespace::DEFAULT_NAMESPACE) { - Ok(v) - } else { - Err(MxmlNameError::PrefixNotDefined(MxmlNamespace::DEFAULT_NAMESPACE.into())) - }; - }; - if let Some(v) = namespace.get(p) { - Ok(v) - } else { - Err(MxmlNameError::PrefixNotDefined(p.clone())) - } - } - - pub fn resolve_name(&self, namespace: &Rc) -> Result<(String, String), MxmlNameError> { - let p = self.resolve_prefix(namespace)?; - Ok((p, self.name.clone())) - } - - pub fn equals_name(&self, other: &Self, namespace: &Rc) -> Result { - if self.name != other.name { - return Ok(false); - } - let p1 = self.resolve_prefix(namespace)?; - let p2 = other.resolve_prefix(namespace)?; - Ok(&p1 == &p2) - } - - pub fn to_string(&self, namespace: &Rc) -> String { - self.resolve_name(namespace).map(|(uri, localname)| { - if uri.is_empty() { - return localname; - } - format!("{uri}:{localname}") - }).unwrap_or("[error]".into()) - } -} - -#[derive(Clone)] -pub enum MxmlNameError { - PrefixNotDefined(String), -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum MxmlContent { - Characters((String, Location)), - /// A CDATA construct, including the first `` characters. - CData((String, Location)), - /// A comment construct, including the first `` characters. - Comment((String, Location)), - ProcessingInstruction { - location: Location, - name: String, - data: Option, - }, - Element(Rc), -} - -impl MxmlContent { - pub fn location(&self) -> Location { - match self { - Self::Characters((_, l)) => l.clone(), - Self::CData((_, l)) => l.clone(), - Self::Comment((_, l)) => l.clone(), - Self::ProcessingInstruction { location: l, .. } => l.clone(), - Self::Element(e) => e.location.clone(), - } - } - - pub fn inner_text(&self) -> String { - match self { - Self::Characters((data, _)) => data.clone(), - Self::CData((data, _)) => data[" String::new(), - Self::ProcessingInstruction { .. } => String::new(), - Self::Element(e) => e.inner_text(), - } - } -} - -/// Mapping of namespace prefixes. -#[derive(Clone, PartialEq)] -pub struct MxmlNamespace { - parent: Option>, - mappings: RefCell>, -} - -impl Default for MxmlNamespace { - fn default() -> Self { - Self::new(None) - } -} - -impl MxmlNamespace { - /// Returns the prefix used for the default XML namespace. - pub const DEFAULT_NAMESPACE: &'static str = ""; - - /// Constructs an empty set of namespace mappings. - pub fn new(parent: Option<&Rc>) -> Self { - let mut ns = Self { - parent: parent.map(|p| p.clone()), - mappings: RefCell::new(BTreeMap::new()), - }; - if ns.parent.is_none() { - ns.mappings.get_mut().insert(Self::DEFAULT_NAMESPACE.into(), "".into()); - ns.mappings.get_mut().insert("xmlns".into(), "http://www.w3.org/xml/xmlns".into()); - } - ns - } - - pub fn includes(&self, prefix: &str) -> bool { - self.mappings.borrow().contains_key(prefix) || match &self.parent { - Some(p) => p.includes(prefix), - None => false, - } - } - - /// Retrieves the value of a prefix either in the actual - /// set of mappings or in the parent set of mappings. - pub fn get(&self, prefix: &str) -> Option { - if let Some(value) = self.mappings.borrow().get(prefix) { - return Some(value.clone()); - } - self.parent.as_ref().and_then(|p| p.get(prefix)) - } - - pub fn set(&self, prefix: &str, value: &str) { - self.mappings.borrow_mut().insert(prefix.to_owned(), value.to_owned()); - } - - pub fn delete(&self, prefix: &str) -> bool { - self.mappings.borrow_mut().remove(prefix).is_some() - } - - pub fn clear(&self) { - self.mappings.borrow_mut().clear(); - } - - /// Returns the actual set of prefix mappings. - pub fn listing(&self) -> BTreeMap { - self.mappings.borrow().clone() - } - - /// Returns a concatenation of the parent set of prefix mappings - /// and the actual set of prefix mappings. - pub fn full_listing(&self) -> BTreeMap { - let mut listing = self.parent.as_ref().map_or(BTreeMap::new(), |p| p.full_listing()); - listing.extend(self.listing()); - listing - } -} diff --git a/crates/parser/tree/namespace_definition.rs b/crates/parser/tree/namespace_definition.rs deleted file mode 100644 index 1f77880..0000000 --- a/crates/parser/tree/namespace_definition.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NamespaceDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub left: (String, Location), - pub right: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/new_expression.rs b/crates/parser/tree/new_expression.rs deleted file mode 100644 index 862e2da..0000000 --- a/crates/parser/tree/new_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NewExpression { - pub location: Location, - pub base: Rc, - pub arguments: Option>>, -} \ No newline at end of file diff --git a/crates/parser/tree/normal_configuration_directive.rs b/crates/parser/tree/normal_configuration_directive.rs deleted file mode 100644 index 3083db8..0000000 --- a/crates/parser/tree/normal_configuration_directive.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents a `CONFIG::x ...` directive. -#[derive(Clone, Serialize, Deserialize)] -pub struct NormalConfigurationDirective { - pub location: Location, - /// The namespace, most commonly the `CONFIG` identifier. - pub namespace: (String, Location), - /// The constant name without including the qualifier. - pub constant_name: (String, Location), - pub directive: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/null_literal.rs b/crates/parser/tree/null_literal.rs deleted file mode 100644 index 6f286b7..0000000 --- a/crates/parser/tree/null_literal.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NullLiteral { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/numeric_literal.rs b/crates/parser/tree/numeric_literal.rs deleted file mode 100644 index b695ebd..0000000 --- a/crates/parser/tree/numeric_literal.rs +++ /dev/null @@ -1,157 +0,0 @@ -use crate::ns::*; -use num_bigint::BigInt; -use serde::{Serialize, Deserialize}; -use std::str::FromStr; -use conv::ValueFrom; -use num_traits::ToPrimitive; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NumericLiteral { - pub location: Location, - /// The numeric value in character representation. Such representation may be parsed - /// through data type specific methods such as [`NumericLiteral::parse_double()`]. - pub value: String, - pub suffix: NumberSuffix, -} - -#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] -pub enum NumberSuffix { - None, - F, -} - -impl NumericLiteral { - /// Parses a double-precision floating point either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_double(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f64::value_from(n).map_err(|_| ParserError::Common)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f64::value_from(n).map_err(|_| ParserError::Common)); - } - } - f64::from_str(&(if negative { "-" } else { "" }.to_owned() + &s)).map_err(|_| ParserError::Common) - } - - /// Parses a single-precision floating point either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_float(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f32::value_from(n).map_err(|_| ParserError::Common)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f32::value_from(n).map_err(|_| ParserError::Common)); - } - } - f32::from_str(&(if negative { "-" } else { "" }.to_owned() + &s)).map_err(|_| ParserError::Common) - } - - /// Parses a signed long either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_long(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = i64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = i64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common); - } - } - i64::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses a signed integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_int(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = i32::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = i32::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common); - } - } - i32::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses an unsigned integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_uint(&self) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u32::from_str_radix(&s[2..], 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u32::from_str_radix(&s[2..], 2); - return n.map_err(|_| ParserError::Common); - } - } - u32::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses a big integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_big_int(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let mut digits: Vec = vec![]; - for ch in s[2..].chars() { - digits.push(CharacterValidator::hex_digit_mv(ch).unwrap().to_u8().unwrap()); - } - let n = BigInt::from_radix_be(if negative { num_bigint::Sign::Minus } else { num_bigint::Sign::Plus }, &digits, 16); - return n.map_or(Err(ParserError::Common), |n| Ok(n)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let mut digits: Vec = vec![]; - for ch in s[2..].chars() { - digits.push(CharacterValidator::bin_digit_mv(ch).unwrap().to_u8().unwrap()); - } - let n = BigInt::from_radix_be(if negative { num_bigint::Sign::Minus } else { num_bigint::Sign::Plus }, &digits, 2); - return n.map_or(Err(ParserError::Common), |n| Ok(n)); - } - } - BigInt::from_str(&s).map_err(|_| ParserError::Common) - } -} - -mod tests { - #[allow(unused)] - use crate::ns::*; - #[allow(unused)] - use std::rc::Rc; - - #[test] - fn test_minimum_maximum() { - // Long.MIN_VALUE - let literal = NumericLiteral { - location: Location::with_offset(&Rc::new(CompilationUnit::default()), 0), - value: "0x8000_0000_0000_0000".to_owned(), - suffix: NumberSuffix::None, - }; - assert_eq!(i64::MIN, literal.parse_long(true).unwrap()); - - // Long.MAX_VALUE - let literal = NumericLiteral { - location: Location::with_offset(&Rc::new(CompilationUnit::default()), 0), - value: "0x7FFF_FFFF_FFFF_FFFF".to_owned(), - suffix: NumberSuffix::None, - }; - assert_eq!(i64::MAX, literal.parse_long(false).unwrap()); - } -} \ No newline at end of file diff --git a/crates/parser/tree/object_initializer.rs b/crates/parser/tree/object_initializer.rs deleted file mode 100644 index d7e6cbb..0000000 --- a/crates/parser/tree/object_initializer.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ObjectInitializer { - pub location: Location, - pub fields: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum InitializerField { - Field { - name: (FieldName, Location), - /// Non-null operator used for destructuring. - non_null: bool, - value: Option>, - }, - Rest((Rc, Location)), -} - -impl InitializerField { - pub fn location(&self) -> Location { - match self { - Self::Field { ref name, ref value, .. } => { - value.clone().map_or(name.1.clone(), |v| name.1.combine_with(v.location())) - }, - Self::Rest((_, ref l)) => l.clone(), - } - } - - pub fn shorthand(&self) -> Option<&QualifiedIdentifier> { - if let Self::Field { name, .. } = self { - if let FieldName::Identifier(qid) = &name.0 { - Some(qid) - } else { - None - } - } else { - None - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FieldName { - Identifier(QualifiedIdentifier), - Brackets(Rc), - StringLiteral(Rc), - NumericLiteral(Rc), -} - -impl FieldName { - pub(crate) fn id(&self) -> Option<&QualifiedIdentifier> { - let Self::Identifier(id) = &self else { - return None; - }; - Some(id) - } - - pub fn id_equals(&self, name: &str) -> bool { - self.id().map(|name1| name == name1.to_identifier_name_or_asterisk().map(|id| id.0.clone()).unwrap_or("".into())).unwrap_or(false) - } -} \ No newline at end of file diff --git a/crates/parser/tree/optional_chaining_expression.rs b/crates/parser/tree/optional_chaining_expression.rs deleted file mode 100644 index b78c630..0000000 --- a/crates/parser/tree/optional_chaining_expression.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// An expression followed by optional chaining operations. -#[derive(Clone, Serialize, Deserialize)] -pub struct OptionalChainingExpression { - pub location: Location, - pub base: Rc, - /// Optional chaining operations. - /// - /// An `OptionalChainingPlaceholder` node is is the topmost expression - /// in the `expression` field. - pub expression: Rc, -} - -/// Internal expression used as the topmost expression -/// of a sequence of optional chaining operations. -#[derive(Clone, Serialize, Deserialize)] -pub struct OptionalChainingPlaceholder { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/package_concat_directive.rs b/crates/parser/tree/package_concat_directive.rs deleted file mode 100644 index dfed500..0000000 --- a/crates/parser/tree/package_concat_directive.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `public += ns.*;` directive. -#[derive(Clone, Serialize, Deserialize)] -pub struct PackageConcatDirective { - pub location: Location, - pub package_name: Vec<(String, Location)>, - pub import_specifier: ImportSpecifier, -} \ No newline at end of file diff --git a/crates/parser/tree/package_definition.rs b/crates/parser/tree/package_definition.rs deleted file mode 100644 index 8b447ce..0000000 --- a/crates/parser/tree/package_definition.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct PackageDefinition { - pub location: Location, - pub asdoc: Option>, - pub name: Vec<(String, Location)>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/paren_expression.rs b/crates/parser/tree/paren_expression.rs deleted file mode 100644 index ee3a330..0000000 --- a/crates/parser/tree/paren_expression.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ParenExpression { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/program.rs b/crates/parser/tree/program.rs deleted file mode 100644 index 2cabb41..0000000 --- a/crates/parser/tree/program.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct Program { - pub location: Location, - pub packages: Vec>, - pub directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/qualified_identifier.rs b/crates/parser/tree/qualified_identifier.rs deleted file mode 100644 index 34d2cf2..0000000 --- a/crates/parser/tree/qualified_identifier.rs +++ /dev/null @@ -1,49 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct QualifiedIdentifier { - pub location: Location, - pub attribute: bool, - pub qualifier: Option>, - pub id: QualifiedIdentifierIdentifier, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum QualifiedIdentifierIdentifier { - Id((String, Location)), - Brackets(Rc), -} - -impl QualifiedIdentifier { - pub fn to_identifier_name_or_asterisk(&self) -> Option<(String, Location)> { - if self.attribute || self.qualifier.is_some() { - None - } else { - if let QualifiedIdentifierIdentifier::Id(id) = &self.id { - Some(id.clone()) - } else { - None - } - } - } - - pub fn to_identifier_name(&self) -> Option<(String, Location)> { - if self.attribute || self.qualifier.is_some() { - None - } else { - if let QualifiedIdentifierIdentifier::Id(id) = &self.id { - if id.0 == "*" { None } else { Some(id.clone()) } - } else { - None - } - } - } - - pub fn is_identifier_token(&self) -> bool { - self.qualifier.is_none() && !self.attribute && match &self.id { - QualifiedIdentifierIdentifier::Id((id, _)) => id != "*", - _ => false, - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/regexp_literal.rs b/crates/parser/tree/regexp_literal.rs deleted file mode 100644 index 366bf7a..0000000 --- a/crates/parser/tree/regexp_literal.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct RegExpLiteral { - pub location: Location, - pub body: String, - pub flags: String, -} \ No newline at end of file diff --git a/crates/parser/tree/reserved_namespace_expression.rs b/crates/parser/tree/reserved_namespace_expression.rs deleted file mode 100644 index 0e6e509..0000000 --- a/crates/parser/tree/reserved_namespace_expression.rs +++ /dev/null @@ -1,41 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub enum ReservedNamespaceExpression { - Public(Location), - Private(Location), - Protected(Location), - Internal(Location), -} - -impl ReservedNamespaceExpression { - pub fn location(&self) -> Location { - match self { - Self::Public(l) => l.clone(), - Self::Private(l) => l.clone(), - Self::Protected(l) => l.clone(), - Self::Internal(l) => l.clone(), - } - } - - pub fn to_attribute(&self) -> Attribute { - match self { - Self::Public(l) => Attribute::Public(l.clone()), - Self::Private(l) => Attribute::Private(l.clone()), - Self::Protected(l) => Attribute::Protected(l.clone()), - Self::Internal(l) => Attribute::Internal(l.clone()), - } - } -} - -impl ToString for ReservedNamespaceExpression { - fn to_string(&self) -> String { - match self { - Self::Public(_) => "public".into(), - Self::Private(_) => "private".into(), - Self::Protected(_) => "protected".into(), - Self::Internal(_) => "internal".into(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/return_statement.rs b/crates/parser/tree/return_statement.rs deleted file mode 100644 index d31d41a..0000000 --- a/crates/parser/tree/return_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ReturnStatement { - pub location: Location, - pub expression: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/sequence_expression.rs b/crates/parser/tree/sequence_expression.rs deleted file mode 100644 index c6b9dfc..0000000 --- a/crates/parser/tree/sequence_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Sequence expression (`x, y`). -#[derive(Clone, Serialize, Deserialize)] -pub struct SequenceExpression { - pub location: Location, - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/string_literal.rs b/crates/parser/tree/string_literal.rs deleted file mode 100644 index 2361c16..0000000 --- a/crates/parser/tree/string_literal.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct StringLiteral { - pub location: Location, - pub value: String, -} \ No newline at end of file diff --git a/crates/parser/tree/super_expression.rs b/crates/parser/tree/super_expression.rs deleted file mode 100644 index 8d47cdd..0000000 --- a/crates/parser/tree/super_expression.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Super expression. -/// -/// The super expression must always be followed by a property operator. -/// When the super expression appears in evaluation, the immediately -/// following property operator is limited to access a property from the base class -/// or invoke a method of the base class. -/// -/// ``` -/// super.f() -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct SuperExpression { - pub location: Location, - pub object: Option>>, -} \ No newline at end of file diff --git a/crates/parser/tree/super_statement.rs b/crates/parser/tree/super_statement.rs deleted file mode 100644 index 22a520a..0000000 --- a/crates/parser/tree/super_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct SuperStatement { - pub location: Location, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/switch_statement.rs b/crates/parser/tree/switch_statement.rs deleted file mode 100644 index 652ec62..0000000 --- a/crates/parser/tree/switch_statement.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct SwitchStatement { - pub location: Location, - pub discriminant: Rc, - pub cases: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Case { - pub location: Location, - pub labels: Vec, - pub directives: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CaseLabel { - Case((Rc, Location)), - Default(Location), -} - -impl CaseLabel { - pub fn location(&self) -> Location { - match self { - Self::Case((_, l)) => l.clone(), - Self::Default(l) => l.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct SwitchTypeStatement { - pub location: Location, - pub discriminant: Rc, - pub cases: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeCase { - pub location: Location, - /// Case parameter. If `None`, designates a `default {}` case. - pub parameter: Option, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/this_literal.rs b/crates/parser/tree/this_literal.rs deleted file mode 100644 index 4d4eeaf..0000000 --- a/crates/parser/tree/this_literal.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ThisLiteral { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/throw_statement.rs b/crates/parser/tree/throw_statement.rs deleted file mode 100644 index 48b71ff..0000000 --- a/crates/parser/tree/throw_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ThrowStatement { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/tree_semantics.rs b/crates/parser/tree/tree_semantics.rs deleted file mode 100644 index 8b178fd..0000000 --- a/crates/parser/tree/tree_semantics.rs +++ /dev/null @@ -1,242 +0,0 @@ -use crate::ns::*; -use by_address::ByAddress; - -const LARGE_BYTES: usize = 26_000; - -/// Represents a mapping of nodes to something. -/// -/// A limited set of nodes may be mapped to something within this -/// structure through using the implemented `TreeSemanticsAccessor` -/// methods, such as `.get()` and `.set()`. -pub struct TreeSemantics { - common: TreeSemantics1, - large_units: RefCell>, TreeSemantics1>>, -} - -impl TreeSemantics { - pub fn new() -> Self { - Self { - common: TreeSemantics1::new(), - large_units: RefCell::new(HashMap::new()), - } - } - - pub fn clear(&self) { - self.common.clear(); - self.large_units.borrow_mut().clear(); - } -} - -/// Defines access methods for the `TreeSemantics` structure, -/// used for attaching semantics to the syntactic tree, -/// where `T` is the node type, and `S` is the symbol type. -pub trait TreeSemanticsAccessor { - fn get(&self, node: &Rc) -> Option; - fn set(&self, node: &Rc, symbol: Option); - fn delete(&self, node: &Rc) -> bool; - fn has(&self, node: &Rc) -> bool; -} - -macro impl_semantics_with_loc_call { - (struct $tree_semantics_id:ident, $($nodetype:ident),*$(,)?) => { - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.get(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.and_then(|m1| m1.get(node)) - } - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.set(node, symbol); - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu.clone())); - if let Some(m1) = m1 { - m1.set(node, symbol); - } else { - let m1 = TreeSemantics1::new(); - m1.set(node, symbol); - large_units.insert(ByAddress(cu), m1); - } - } - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.delete(node) - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu)); - m1.map(|m1| m1.delete(node)).unwrap_or(false) - } - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.has(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.map(|m1| m1.has(node)).unwrap_or(false) - } - } - } - )* - }, -} - -macro impl_semantics_with_loc_field { - (struct $tree_semantics_id:ident, $($nodetype:ident),*$(,)?) => { - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.get(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.and_then(|m1| m1.get(node)) - } - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.set(node, symbol); - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu.clone())); - if let Some(m1) = m1 { - m1.set(node, symbol); - } else { - let m1 = TreeSemantics1::new(); - m1.set(node, symbol); - large_units.insert(ByAddress(cu), m1); - } - } - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.delete(node) - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu)); - m1.map(|m1| m1.delete(node)).unwrap_or(false) - } - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.has(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.map(|m1| m1.has(node)).unwrap_or(false) - } - } - } - )* - }, -} - -macro impl_semantics_1 { - (struct $tree_semantics_1_id:ident, fn $new_id:ident, fn $clear_id:ident, $($nodetype:ident),*$(,)?) => { - #[allow(non_snake_case)] - struct $tree_semantics_1_id { - $($nodetype: RefCell>, Option>>,)* - } - - impl $tree_semantics_1_id { - pub fn $new_id() -> Self { - Self { - $($nodetype: RefCell::new(HashMap::new()),)* - } - } - - pub fn $clear_id(&self) { - $(self.$nodetype.borrow_mut().clear();)* - } - } - - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_1_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - self.$nodetype.borrow().get(&NodeAsKey(node.clone())).map(|v| v.clone().unwrap()) - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - self.$nodetype.borrow_mut().insert(NodeAsKey(node.clone()), symbol); - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - self.$nodetype.borrow_mut().remove(&NodeAsKey(node.clone())).is_some() - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - self.$nodetype.borrow().contains_key(&NodeAsKey(node.clone())) - } - } - )* - }, -} - -impl_semantics_with_loc_call!( - struct TreeSemantics, - Expression, - InitializerField, - Directive, - MxmlContent, - CssDirective, - CssMediaQueryCondition, - CssSelectorCondition, - CssPropertyValue, - CssSelector, -); - -impl_semantics_with_loc_field!( - struct TreeSemantics, - FunctionCommon, - Block, - Program, - PackageDefinition, - SimpleVariableDefinition, - Mxml, - MxmlElement, - MxmlAttribute, - CssProperty, - CssRule, - CssDocument, - QualifiedIdentifier, -); - -impl_semantics_1!( - struct TreeSemantics1, - fn new, - fn clear, - Expression, - InitializerField, - Directive, - FunctionCommon, - Block, - Program, - PackageDefinition, - SimpleVariableDefinition, - QualifiedIdentifier, - Mxml, - MxmlContent, - MxmlElement, - MxmlAttribute, - CssDirective, - CssRule, - CssMediaQueryCondition, - CssSelectorCondition, - CssPropertyValue, - CssSelector, - CssProperty, - CssDocument, -); \ No newline at end of file diff --git a/crates/parser/tree/try_statement.rs b/crates/parser/tree/try_statement.rs deleted file mode 100644 index 31a1922..0000000 --- a/crates/parser/tree/try_statement.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TryStatement { - pub location: Location, - pub block: Rc, - pub catch_clauses: Vec, - pub finally_clause: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CatchClause { - pub location: Location, - pub parameter: TypedDestructuring, - pub block: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FinallyClause { - pub location: Location, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/type_definition.rs b/crates/parser/tree/type_definition.rs deleted file mode 100644 index 95dce41..0000000 --- a/crates/parser/tree/type_definition.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub left: (String, Location), - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/type_expression.rs b/crates/parser/tree/type_expression.rs deleted file mode 100644 index 0b0eec9..0000000 --- a/crates/parser/tree/type_expression.rs +++ /dev/null @@ -1,56 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NullableTypeExpression { - pub location: Location, - pub base: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct NonNullableTypeExpression { - pub location: Location, - pub base: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct AnyTypeExpression { - pub location: Location, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct VoidTypeExpression { - pub location: Location, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct ArrayTypeExpression { - pub location: Location, - pub expression: Rc, -} - -/// A tuple type expression consisting of at least two elements. -#[derive(Clone, Serialize, Deserialize)] -pub struct TupleTypeExpression { - pub location: Location, - pub expressions: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionTypeExpression { - pub location: Location, - pub parameters: Vec>, - pub result_type: Option>, -} - -/// ```plain -/// function(T, T=, ...) -/// function(...[T]) -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionTypeParameter { - pub location: Location, - pub kind: ParameterKind, - /// Possibly `None` for the rest parameter. - pub type_expression: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/type_parameter.rs b/crates/parser/tree/type_parameter.rs deleted file mode 100644 index adf800c..0000000 --- a/crates/parser/tree/type_parameter.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// A type parameter as in `function f.(): void {}`. -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeParameter { - pub location: Location, - pub name: (String, Location), -} \ No newline at end of file diff --git a/crates/parser/tree/unary_expression.rs b/crates/parser/tree/unary_expression.rs deleted file mode 100644 index 64fbcc3..0000000 --- a/crates/parser/tree/unary_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct UnaryExpression { - pub location: Location, - pub operator: Operator, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/use_namespace_directive.rs b/crates/parser/tree/use_namespace_directive.rs deleted file mode 100644 index 7317395..0000000 --- a/crates/parser/tree/use_namespace_directive.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct UseNamespaceDirective { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/variable_definition.rs b/crates/parser/tree/variable_definition.rs deleted file mode 100644 index 234492f..0000000 --- a/crates/parser/tree/variable_definition.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct VariableDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub kind: (VariableDefinitionKind, Location), - pub bindings: Vec>, -} - -#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub enum VariableDefinitionKind { - Var, - Const, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct SimpleVariableDefinition { - pub location: Location, - pub kind: (VariableDefinitionKind, Location), - pub bindings: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct VariableBinding { - pub destructuring: TypedDestructuring, - pub initializer: Option>, -} - -impl VariableBinding { - pub fn location(&self) -> Location { - self.initializer.as_ref().map_or(self.destructuring.location.clone(), |init| self.destructuring.location.combine_with(init.location())) - } -} \ No newline at end of file diff --git a/crates/parser/tree/vector_literal.rs b/crates/parser/tree/vector_literal.rs deleted file mode 100644 index e506ed8..0000000 --- a/crates/parser/tree/vector_literal.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct VectorLiteral { - pub location: Location, - pub element_type: Rc, - pub elements: Vec, -} \ No newline at end of file diff --git a/crates/parser/tree/while_statement.rs b/crates/parser/tree/while_statement.rs deleted file mode 100644 index 2f20a97..0000000 --- a/crates/parser/tree/while_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct WhileStatement { - pub location: Location, - pub test: Rc, - pub body: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/with_statement.rs b/crates/parser/tree/with_statement.rs deleted file mode 100644 index 0f254c3..0000000 --- a/crates/parser/tree/with_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct WithStatement { - pub location: Location, - pub object: Rc, - pub body: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/xml_expression.rs b/crates/parser/tree/xml_expression.rs deleted file mode 100644 index 06857a8..0000000 --- a/crates/parser/tree/xml_expression.rs +++ /dev/null @@ -1,57 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlExpression { - pub location: Location, - pub element: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlMarkupExpression { - pub location: Location, - pub markup: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlListExpression { - pub location: Location, - pub content: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlElement { - pub location: Location, - pub name: XmlTagName, - pub attributes: Vec>, - pub attribute_expression: Option>, - pub content: Option>>, - pub closing_name: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlTagName { - Name((String, Location)), - Expression(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlAttribute { - pub location: Location, - pub name: (String, Location), - pub value: XmlAttributeValue, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlAttributeValue { - Value((String, Location)), - Expression(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlContent { - Characters((String, Location)), - Markup((String, Location)), - Element(Rc), - Expression(Rc), -} \ No newline at end of file diff --git a/crates/parser/util.rs b/crates/parser/util.rs deleted file mode 100644 index 256a627..0000000 --- a/crates/parser/util.rs +++ /dev/null @@ -1,36 +0,0 @@ -//! Miscellaneous. - -mod arena; -pub use arena::*; - -pub use by_address::ByAddress as NodeAsKey; - -mod character_reader; -pub use character_reader::*; - -mod escaping; -pub use escaping::*; - -mod css; -pub use css::*; - -pub use std::cell::{Cell, RefCell}; -pub use std::collections::{HashMap, HashSet}; -pub use std::rc::{Rc, Weak}; - -pub fn default() -> T { - T::default() -} - -/// Counts the first whitespace characters of a string. -pub fn count_first_whitespace_characters(input: &str) -> usize { - input.chars().count() - input.trim_start().chars().count() -} - -/// Decreases the last offset of a range without ever going behind the first offset. -pub fn decrease_last_offset(first_offset: usize, mut last_offset: usize, count: usize) -> usize { - for _ in 0..count { - last_offset = if first_offset < last_offset { last_offset - 1 } else { last_offset }; - } - last_offset -} \ No newline at end of file diff --git a/crates/parser/util/arena.rs b/crates/parser/util/arena.rs deleted file mode 100644 index e9027f4..0000000 --- a/crates/parser/util/arena.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::{cell::RefCell, rc::{Rc, Weak}}; - -pub struct Arena { - data: RefCell>>, -} - -impl Arena { - pub fn new() -> Self { - Self { - data: RefCell::new(vec![]), - } - } - - pub fn allocate(&self, value: T) -> Weak { - let obj = Rc::new(value); - self.data.borrow_mut().push(obj.clone()); - Rc::downgrade(&obj) - } -} \ No newline at end of file diff --git a/crates/parser/util/character_reader.rs b/crates/parser/util/character_reader.rs deleted file mode 100644 index c6af904..0000000 --- a/crates/parser/util/character_reader.rs +++ /dev/null @@ -1,138 +0,0 @@ -use std::str::CharIndices; - -/// `CharacterReader` may be used for iterating characters from left-to-right -/// in a string with miscellaneous operation methods. -#[derive(Clone)] -pub struct CharacterReader<'a> { - length: usize, - start_offset: usize, - char_indices: CharIndices<'a>, -} - -impl<'a> CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string starting at the given offset. - pub fn from_offset(value: &'a str, offset: usize) -> Self { - CharacterReader { length: value.len(), start_offset: offset, char_indices: value[offset..].char_indices() } - } - - /// Indicates if there are remaining code points to read. - pub fn has_remaining(&self) -> bool { - self.clone().char_indices.next().is_some() - } - - /// Indicates if the reader has reached the end of the string. - pub fn reached_end(&self) -> bool { - self.clone().char_indices.next().is_none() - } - - /// Skips a code point in the reader. This is equivalent to - /// calling `next()`. - pub fn skip_in_place(&mut self) { - self.next(); - } - - /// Skips the given number of code points in the reader. - pub fn skip_count_in_place(&mut self, count: usize) { - for _ in 0..count { - if self.next().is_none() { - break; - } - } - } - - /// Returns the current byte offset in the string. - pub fn index(&self) -> usize { - self.clone().char_indices.next().map_or(self.length, |(i, _)| self.start_offset + i) - } - - /// Returns the next code point. If there are no code points - /// available, returns U+00. - pub fn next_or_zero(&mut self) -> char { - self.char_indices.next().map_or('\x00', |(_, cp)| cp) - } - - /// Peeks the next code point. - pub fn peek(&self) -> Option { - self.clone().char_indices.next().map(|(_, cp)| cp) - } - - /// Peeks the next code point. If there are no code points - /// available, returns U+00. - pub fn peek_or_zero(&self) -> char { - self.clone().next_or_zero() - } - - /// Peeks the next code point at the given zero based code point index. - pub fn peek_at(&self, index: usize) -> Option { - let mut indices = self.clone().char_indices; - for _ in 0..index { - if indices.next().is_none() { - break; - } - } - indices.next().map(|(_, cp)| cp) - } - - /// Peeks the next code point at the given zero based code point index. - /// If there are no code points available, returns U+00. - pub fn peek_at_or_zero(&self, index: usize) -> char { - self.peek_at(index).unwrap_or('\x00') - } - - /// Peeks a number of code points until the string's end. - pub fn peek_seq(&self, num_code_points: u64) -> String { - let mut r = String::new(); - let mut next_indices = self.char_indices.clone(); - for _ in 0..num_code_points { - match next_indices.next() { - None => { - break; - }, - Some(cp) => { - r.push(cp.1); - } - } - } - r - } -} - -impl<'a> From<&'a str> for CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string. - fn from(value: &'a str) -> Self { - CharacterReader { length: value.len(), start_offset: 0, char_indices: value.char_indices() } - } -} - -impl<'a> From<&'a String> for CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string. - fn from(value: &'a String) -> Self { - CharacterReader { length: value.len(), start_offset: 0, char_indices: value.char_indices() } - } -} - -impl<'a> Iterator for CharacterReader<'a> { - type Item = char; - - fn next(&mut self) -> Option { - self.char_indices.next().map(|(_, cp)| cp) - } -} - -#[cfg(test)] -mod test { - use super::CharacterReader; - #[test] - fn test() { - let mut reader = CharacterReader::from("foo"); - assert!(reader.has_remaining()); - assert_eq!(reader.peek_seq(5), "foo"); - assert_eq!(reader.peek_seq(1), "f"); - assert_eq!(reader.peek_or_zero(), 'f'); - for _ in 0..3 { - reader.next(); - } - assert_eq!(reader.peek_or_zero(), '\x00'); - assert!(reader.reached_end()); - } -} \ No newline at end of file diff --git a/crates/parser/util/css.rs b/crates/parser/util/css.rs deleted file mode 100644 index fa1fbf8..0000000 --- a/crates/parser/util/css.rs +++ /dev/null @@ -1,163 +0,0 @@ -use std::collections::HashMap; -use lazy_static::lazy_static; -use maplit::hashmap; - -/// Converts a CSS [color constant](http://www.w3schools.com/css/css_colorsfull.asp) into an integer. -pub fn css_color_constant_to_int(name: &str) -> Option { - COLOR_MAP.get(&name.to_lowercase()).map(|i| *i) -} - -lazy_static! { - /// Map color constant names to 24-bit RGB integer values. - /// - /// See also: [CSS colors](http://www.w3schools.com/css/css_colorsfull.asp) - static ref COLOR_MAP: HashMap = hashmap! { - "black".into() => 0x000000, - "navy".into() => 0x000080, - "darkblue".into() => 0x00008b, - "mediumblue".into() => 0x0000cd, - "blue".into() => 0x0000ff, - "darkgreen".into() => 0x006400, - "green".into() => 0x008000, - "teal".into() => 0x008080, - "darkcyan".into() => 0x008b8b, - "deepskyblue".into() => 0x00bfff, - "darkturquoise".into() => 0x00ced1, - "mediumspringgreen".into() => 0x00fa9a, - "lime".into() => 0x00ff00, - "springgreen".into() => 0x00ff7f, - "aqua".into() => 0x00ffff, - "cyan".into() => 0x00ffff, - "midnightblue".into() => 0x191970, - "dodgerblue".into() => 0x1e90ff, - "lightseagreen".into() => 0x20b2aa, - "forestgreen".into() => 0x228b22, - "seagreen".into() => 0x2e8b57, - "darkslategray".into() => 0x2f4f4f, - "darkslategrey".into() => 0x2f4f4f, - "limegreen".into() => 0x32cd32, - "mediumseagreen".into() => 0x3cb371, - "turquoise".into() => 0x40e0d0, - "royalblue".into() => 0x4169e1, - "steelblue".into() => 0x4682b4, - "darkslateblue".into() => 0x483d8b, - "mediumturquoise".into() => 0x48d1cc, - "indigo ".into() => 0x4b0082, - "darkolivegreen".into() => 0x556b2f, - "cadetblue".into() => 0x5f9ea0, - "cornflowerblue".into() => 0x6495ed, - "mediumaquamarine".into() => 0x66cdaa, - "dimgray".into() => 0x696969, - "dimgrey".into() => 0x696969, - "slateblue".into() => 0x6a5acd, - "olivedrab".into() => 0x6b8e23, - "slategray".into() => 0x708090, - "slategrey".into() => 0x708090, - "lightslategray".into() => 0x778899, - "lightslategrey".into() => 0x778899, - "mediumslateblue".into() => 0x7b68ee, - "lawngreen".into() => 0x7cfc00, - "chartreuse".into() => 0x7fff00, - "aquamarine".into() => 0x7fffd4, - "maroon".into() => 0x800000, - "purple".into() => 0x800080, - "olive".into() => 0x808000, - "gray".into() => 0x808080, - "grey".into() => 0x808080, - "skyblue".into() => 0x87ceeb, - "lightskyblue".into() => 0x87cefa, - "blueviolet".into() => 0x8a2be2, - "darkred".into() => 0x8b0000, - "darkmagenta".into() => 0x8b008b, - "saddlebrown".into() => 0x8b4513, - "darkseagreen".into() => 0x8fbc8f, - "lightgreen".into() => 0x90ee90, - "mediumpurple".into() => 0x9370d8, - "darkviolet".into() => 0x9400d3, - "palegreen".into() => 0x98fb98, - "darkorchid".into() => 0x9932cc, - "yellowgreen".into() => 0x9acd32, - "sienna".into() => 0xa0522d, - "brown".into() => 0xa52a2a, - "darkgray".into() => 0xa9a9a9, - "darkgrey".into() => 0xa9a9a9, - "lightblue".into() => 0xadd8e6, - "greenyellow".into() => 0xadff2f, - "paleturquoise".into() => 0xafeeee, - "lightsteelblue".into() => 0xb0c4de, - "powderblue".into() => 0xb0e0e6, - "firebrick".into() => 0xb22222, - "darkgoldenrod".into() => 0xb8860b, - "mediumorchid".into() => 0xba55d3, - "rosybrown".into() => 0xbc8f8f, - "darkkhaki".into() => 0xbdb76b, - "silver".into() => 0xc0c0c0, - "mediumvioletred".into() => 0xc71585, - "indianred ".into() => 0xcd5c5c, - "peru".into() => 0xcd853f, - "chocolate".into() => 0xd2691e, - "tan".into() => 0xd2b48c, - "lightgray".into() => 0xd3d3d3, - "lightgrey".into() => 0xd3d3d3, - "palevioletred".into() => 0xd87093, - "thistle".into() => 0xd8bfd8, - "orchid".into() => 0xda70d6, - "goldenrod".into() => 0xdaa520, - "crimson".into() => 0xdc143c, - "gainsboro".into() => 0xdcdcdc, - "plum".into() => 0xdda0dd, - "burlywood".into() => 0xdeb887, - "lightcyan".into() => 0xe0ffff, - "lavender".into() => 0xe6e6fa, - "darksalmon".into() => 0xe9967a, - "violet".into() => 0xee82ee, - "palegoldenrod".into() => 0xeee8aa, - "lightcoral".into() => 0xf08080, - "khaki".into() => 0xf0e68c, - "aliceblue".into() => 0xf0f8ff, - "honeydew".into() => 0xf0fff0, - "azure".into() => 0xf0ffff, - "sandybrown".into() => 0xf4a460, - "wheat".into() => 0xf5deb3, - "beige".into() => 0xf5f5dc, - "whitesmoke".into() => 0xf5f5f5, - "mintcream".into() => 0xf5fffa, - "ghostwhite".into() => 0xf8f8ff, - "salmon".into() => 0xfa8072, - "antiquewhite".into() => 0xfaebd7, - "linen".into() => 0xfaf0e6, - "lightgoldenrodyellow".into() => 0xfafad2, - "oldlace".into() => 0xfdf5e6, - "red".into() => 0xff0000, - "fuchsia".into() => 0xff00ff, - "magenta".into() => 0xff00ff, - "deeppink".into() => 0xff1493, - "orangered".into() => 0xff4500, - "tomato".into() => 0xff6347, - "hotpink".into() => 0xff69b4, - "coral".into() => 0xff7f50, - "darkorange".into() => 0xff8c00, - "lightsalmon".into() => 0xffa07a, - "orange".into() => 0xffa500, - "lightpink".into() => 0xffb6c1, - "pink".into() => 0xffc0cb, - "gold".into() => 0xffd700, - "peachpuff".into() => 0xffdab9, - "navajowhite".into() => 0xffdead, - "moccasin".into() => 0xffe4b5, - "bisque".into() => 0xffe4c4, - "mistyrose".into() => 0xffe4e1, - "blanchedalmond".into() => 0xffebcd, - "papayawhip".into() => 0xffefd5, - "lavenderblush".into() => 0xfff0f5, - "seashell".into() => 0xfff5ee, - "cornsilk".into() => 0xfff8dc, - "lemonchiffon".into() => 0xfffacd, - "floralwhite".into() => 0xfffaf0, - "snow".into() => 0xfffafa, - "yellow".into() => 0xffff00, - "lightyellow".into() => 0xffffe0, - "ivory".into() => 0xfffff0, - "white".into() => 0xffffff, - }; -} \ No newline at end of file diff --git a/crates/parser/util/escaping.rs b/crates/parser/util/escaping.rs deleted file mode 100644 index ffa020f..0000000 --- a/crates/parser/util/escaping.rs +++ /dev/null @@ -1,11 +0,0 @@ -/// Escapes XML special characters. -pub fn escape_xml(characters: &str) -> String { - let escaped = htmlentity::entity::encode(characters.as_ref(), &htmlentity::entity::EncodeType::NamedOrHex, &htmlentity::entity::CharacterSet::SpecialChars); - String::from_utf8_lossy(&escaped.bytes().into_owned()).into_owned() -} - -/// Unescapes XML entities conforming to HTML entities. -pub fn unescape_xml(input: &str) -> String { - let unescaped = htmlentity::entity::decode(input.as_ref()); - String::from_utf8_lossy(&unescaped.bytes().into_owned()).into_owned() -} \ No newline at end of file diff --git a/crates/parser_test/Cargo.toml b/crates/parser_test/Cargo.toml deleted file mode 100644 index ba62f77..0000000 --- a/crates/parser_test/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "as3_parser_test" -version = "0.4.0" -edition = "2021" -authors = ["hydroper "] -repository = "https://github.com/hydroper/as3_parser" -keywords = ["actionscript", "as3", "parser"] -description = "ActionScript 3 Parser Test" -license = "Apache-2.0" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[[bin]] -name = "as3_parser_test" -path = "main.rs" - -[dependencies] -clap = { version = "4.4.8", features = ["derive"] } -file_paths = "1.0.0" -as3_parser = { path = "../parser", version = "1" } -maplit = "1.0.2" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" diff --git a/crates/parser_test/main.rs b/crates/parser_test/main.rs deleted file mode 100644 index 6abee8f..0000000 --- a/crates/parser_test/main.rs +++ /dev/null @@ -1,62 +0,0 @@ -use clap::Parser; -use file_paths::FlexPath; -use std::{env, fs, io}; -use as3_parser::ns::*; - -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Arguments { - #[arg(short, long)] - source_path: String, - - #[arg(short, long)] - file_log: bool, - - #[arg(short, long)] - mxml: bool, - - #[arg(short, long)] - css: bool, -} - -fn main() -> io::Result<()> { - let arguments = Arguments::parse(); - let source_path = FlexPath::from_n_native([env::current_dir().unwrap().to_string_lossy().into_owned().as_ref(), arguments.source_path.as_ref()]).to_string_with_flex_separator(); - - // Canonicalize path - // let source_path = std::path::Path::new(&source_path).canonicalize().unwrap().to_string_lossy().into_owned(); - - let source_path_ast_json = FlexPath::new_native(&source_path).change_extension(".tree").to_string_with_flex_separator(); - let source_path_diagnostics = FlexPath::new_native(&source_path).change_extension(".diag").to_string_with_flex_separator(); - let source_content = fs::read_to_string(&source_path)?; - let compilation_unit = CompilationUnit::new(Some(source_path), source_content); - if arguments.mxml { - let document = ParserFacade(&compilation_unit, default()).parse_mxml(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&document).unwrap())?; - } - } else if arguments.css { - let document = CssParserFacade(&compilation_unit, default()).parse_document(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&document).unwrap())?; - } - } else { - let program = ParserFacade(&compilation_unit, default()).parse_program(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&program).unwrap())?; - } - } - let mut diagnostics = vec![]; - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - diagnostics.push(diagnostic.format_english()); - } - if arguments.file_log { - fs::write(&source_path_diagnostics, diagnostics.join("\n"))?; - } else { - for diagnostic in diagnostics { - println!("{diagnostic}"); - } - } - Ok(()) -} \ No newline at end of file diff --git a/demo/Cargo.toml b/demo/Cargo.toml deleted file mode 100644 index 7614571..0000000 --- a/demo/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "as3_parser_demo" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -as3_parser = { path = "../crates/parser", version = "1" } -maplit = "1.0.2" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" -wasm-bindgen = "0.2.92" - -[dependencies.web-sys] -version = "0.3.4" -features = ["Document", "Window"] \ No newline at end of file diff --git a/demo/dist/as3_parser_demo.d.ts b/demo/dist/as3_parser_demo.d.ts new file mode 100644 index 0000000..68bc12b --- /dev/null +++ b/demo/dist/as3_parser_demo.d.ts @@ -0,0 +1,40 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {string} input +* @param {string} source_type +* @returns {string} +*/ +export function parse(input: string, source_type: string): string; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly parse: (a: number, b: number, c: number, d: number, e: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {SyncInitInput} module +* +* @returns {InitOutput} +*/ +export function initSync(module: SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/demo/dist/as3_parser_demo.js b/demo/dist/as3_parser_demo.js new file mode 100644 index 0000000..0e1f671 --- /dev/null +++ b/demo/dist/as3_parser_demo.js @@ -0,0 +1,199 @@ +let wasm; + +let WASM_VECTOR_LEN = 0; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} +/** +* @param {string} input +* @param {string} source_type +* @returns {string} +*/ +export function parse(input, source_type) { + let deferred3_0; + let deferred3_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(input, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(source_type, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + wasm.parse(retptr, ptr0, len0, ptr1, len1); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred3_0 = r0; + deferred3_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('as3_parser_demo_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync } +export default __wbg_init; diff --git a/demo/dist/as3_parser_demo_bg.wasm b/demo/dist/as3_parser_demo_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..f39929b6d3c9955b4219cf25c62671873de1e530 GIT binary patch literal 2505195 zcmeFaeVi24o&VcaUER|?)6d(`ePt3kpY!hOs_IkKr>f5Re7_w#{a5EWu~^J`$o%7a z?uAtOhr0f~;I#OKBKj9(iwjQkr~z#OO{hw}Rsxb1Kt=?pu7+TN0;WbFG?d_UfVIhn zuwwThe@Io5CCcwYBltak0gt?7cl3hV2cY0n@vnQ~1*|N7;RTjlpo&Muey$7nV+mE_ z7ubzDe{}wMn)^q#A75IzztWIMrIM*^(oLn(iByA|Po)~NV#$>2CKJiH{+CFk(+#}B zYnfC$ktVrryq}!u7ELXF@(vWRtX>+i)1~$(P~@k5;t@ox{SKYkxZU9MM!6H&#S#{GwTzuvwC@)(f0&vP4nrr$F)BlaGgzRMw*-xlTVN4q^G&#I%s@E8rXj3kvEOJOpEB) z#`*BPw;}#FoWI)gD4oZ_25P0w*AoA|x3(AbG#(28tY z-x|J+fA=0?4kHJdR*?B`=RwG+~g zSI2)e5>2Dk>CZ03KRWF3xNS}P6q->-y&=i&sIQ5;oI&0MhZPA6+WitDgbG^Ove9G{glt)U^$zSZ{I?f_fS>ErU%5Y~0e{^?Y+A12Pp_U=DE z!pNJ|R-88PUVyKVQ`-miUD}5JXaDS?bf7@JccfcSxa!?g$&o58`>ythwvdkJ-Hh5X z!yfBYPuq4&TQJ%bn~mOURU*#iHJhzbec4q}&!O(T)~DC5G4Fcc|DnnzGO<|g zBmRZOqCG>gAx;&0!nlVYemHGuKXh8x411Va!N?bgW2%dkP7BA0ryQqts@58^_7QoD zn|G32zFFtU3%0FC4vID%=RAJ@``Pa`O{qj8)yI6H=u1Cj=WBD-lEOa?lgpI ze`%c;$Po~7?U?;z?VQ2(>`8FPYxl?QxmHzVks=?}uGs!FvXRk@G%_BY8ix8&8v#(`Kv-LI0#bIv^H7w7%njU~=K z{k&hD89V3wKls6KfB3VXpYfA3fBu8h&p6`;=l|jdzdHZ)AD#7sbAR!(pPzr`d9lG# z@sLH%IsNRjfAOQ(rTNk!@Vql?bb29w2>tPSXPy~*wU}i*-NU7A z<%dd-6j$c%t$U!fF0(XsS!qS_(cId)m8BQUD@rSit8z=~t|)CUUS67!S?o+HJzAVu zo?Kd(x~90xTadav)t$OEb#v;D)SaoW)GevoQu9*1srjizsh(74YE^M|`K9usr6=mH z&AeP*Rca}%F5XzaF0-@nSaEf3UES)^_VQz;9p%>i@3bG^%fs44CP)awwCTJK2mt7u%mcwX<>0iVW9YW z`P%$Yac%CYx}nnB#hInG#V2x4*X=GpQQA|U=3Sp&S9+tow|qnC+G1a7Pi9r(uGDqK z>x*}%_LZ;8uP-&n?@6^4-z;CBf3mbV@m9GlKdZE>_(XACZbRKurTyinOK+E7%pWLk zD7{lYSlpbwsJJb2d1iTbeW5EiE59Y%nteF)a{kWpgZbgojQG6zP369FPy9Le&iGBv z-PuPAujHOBwZ^;a?ZH*FEmumF>*EoO`-_L%Ol@O!=A8?z+{fp7g7Auhq>gF3%q*?8t2> zx2HFjhs#@2FQlKT-Q|%=q@FLll$%$cnVy&KO<$3IICV|x z?$S+#$FjZ2rrafkgXNj|8;TF*I|>tugZZ7gxrKKMHx%wKwB!yJ=9Zo;+@8B5JFBoY z(_U!K&MsV8e`Dc5eo4BqI5GD^W=`Rq{G0hVviq`cW?#=vNWWO>$hPNS%HNxNDg9t} zWButD7hf&hQogp~F7M*Xp1R4oNp%-hZY^)mZz)|;Y{@*7eY$XS?#ANv*{0%z?5;vr zp)=8vf4;oAd_(^F#Ln!l+-z@gc2@C`{A~@-W$r0&DKAW3l3QK3Bz0MKbE&hit)Vgh zTzO*g;ryd@tLpm8&z4`!y^`Oa9?Wj4pH#d$|5~m$`&Oo@@>+gp!#$;&3peIx=U>k+ z%+D+C$zPS9Sh>IWMrKy#&dihPy_u=G8#22}JMxQ)FO-^#{iS(@NtIg)msGCE?a9u` zzn*KZTw3Wa^rzm)52SYIZ)&)t?y^ct<<`RGm7c=<^1{RVAex~qHd9ZwO{+;6H!efP-vOii{d_2Cr zbYp2t@&0mq!}X~L${P#I%1g`L#RJ6`3Xd0t>z~YBlz+K2yR^BuxO`{6EqiZyLt&u2 zqHaAI#iU9L(&^Psr~} zZp%KBnUR~8o134WyE=DO?wZ`I*}mdKnJaV4Go1}9GVP@+D-#Nf^1E}>Dz_J!@@rC; z7O$#2l^Td&U0IoL%iWZ}E_ZG2?dFEux;J%A<&MJi%EZFL!WEg;%A=W;nd>T#=C7^XS?Ddys5BKW$q%J2 zE3V4V&UNNzC?5fN?#m6!&g~^2}#g{TuGLK}RD|F{>s=S!JA^UjdiozAe z*9x7LDTSL$U6rRZYcf*{2eNPFZm!%?dONqc(3786=`7w-*^pmXd^$H=cTxG)$~&c= z%5d?v{3Ye>+3w1^?2+9qTyOcM)ci_Q z`9Nty=HC3`{Ot`3Djm6Zvg?Z*a?jS?RykPeDP3HiTYR#(G51{E?Uf1Tr;5+yp0B&3 z(pwoQEUes~pIAPaU65Z~T$|}HK9RYza&@6G_jGZ4W>Mv#+=k-*+^wbIhFzKG8u}{x zOD)-Hg#)>}DtF{BE#F?6UVlevcJ}Vdr1Hk%rrgrH=JMohPknp#w$g&qaIUv>TXB7Q zTIQb0{L;eG&dj6P{z`9tapm&z&Bb?et*Mssy_M(llgn3>Hx-}FU0t41UQ(G_zOwv! z@wH-8X;G=Kw5)V(;gZySl{-rVmDX~XcW3UJa{cU8KfS+l)!wB0Sn|U31s{l2S08@X z81IOfd;DMepYM!yV`CCy-BZWK-dA;gnH^cKx?pH|%uiH5KHg7^i+!dVKl!jR$#Jnv z)%}7N5j=5Bvg)3kjrmF5cM=0TzE>TL+2v0dQ&)|B!FT<5;VRGf#=2h|lj0VovGI2& zXI;Jb1d|s2`k4BvcfLtVpE9PwWa7vB$&*+lSv_|=I8)7xH(83pc$4w7<6^OFEW=|d zuY2R!ab8Pm|1*9@g;RCLAMM6`r+VQj**f3zvq!t1p~xKVep(BrSc&KBV;mbhvBrjIg26T07e09JTe)m!0v)Y#X z)tF3`k5aAs(qXx}WXy5nUV?r1s;TjQ)=w86YN!rBy*yTH%#^9u2lHsS+J~s7&iAwW zH0SyC)x!Db73MWm`<@CGFR-{he$7Sg&|QV`9LbS=e6I++@IXU#*OS3J-pe~YHsIGE z8~Z**`q;74>Fs>_=tGP0alw52kq=G97vZ(S(uQhF_(6QO z6Cc^m2450(VXXVz+Lz=sowZf=>kkz1quui< zTu#DFbx-_DhaDUHW9`+S*IxZ8g>!7|j2ir*@11ZFr_aZau?K{e{D~JD-Q%2dwcK&e z?`p-_wc<1i&T#(aK=^4tQ+UMX%Wlu}YFu9s+lriWWBATiyDL$Hc}Kb(m1E*MCgWl~ z6~2os&*;(de&!^7lT0#B2UPpIIwB)qVZN+R;jWUt(tOwTmA`QOm`patmpp6V$Z4B7 zyXx6xMmmu%WF5Bd@+Gz>`BBcT6_bGIeB#@{7kuO>dPlND$He#P8yKsdli|lJTyL9x zT~7ed~vOImhyOOtSi3Hr-qrQ=fIJUiH0&tIDyF1E?+4`h(Q?Bjd4S z;xrDYN4%X@IJLT&^P&1t7SP!~bv>09&V<748Qxy6??=k7KVbqJEgVCKRj)Vh%O2xq zkcs1*(G(oSQG8eJ(P+$#G<4LQ3EQ0XS9Dftr$ntsq#0|?nNV{k4rxx_`rjIKWF0_9oqVQxkiXb? zod~})S)Jt^YRi5(Ce1;v#=oZKHfeoZ>UHHX4yRo9ETf%C>q@{IzOJ>7sYBO&g)0!` zwEsrVeK$GeEu2wKb-=E>fu7JCKPJuIGn^N+2G<|Ieth-4Y`wNgy*bVH(qB2uzL`sp z!#T)VnYCx7SN(MG1xXg3^=$7{I~UbY)s*d2{%o=Ei%|c+_#&{$Kl>u2bb#yq6#F{z zMM&sM#gQMm;3ajzi&b5d)N$g{T(uWwj@W0|d5TX5m&iYR2QTTxIwN3E)kjq>wc@;P>#(+QKUI>upN*vkT! ze!DklT?rlf=NNZeg)(-GJFL<>#$7*BUrniRZLjLAl@X3(-0njw?W*vO zL6y8XaOjJDRP^?)kry}6Go7HXxmKfYikImOj&|4UGD26zzq&#kR8PVSg-vN)q9Zlz zXc6jMy+$r8z0UY*>^Mi=BE?ef2&&uaj&=tS+OIy9!Jc=}+JbE=*@bB;gBM$(!kqr#{MB2JPC8b5@M3 zZGrZKCHquo7Y0-Yn_fM#(0a-${Rlk?H+#p%&ZO!d7yA(n)o^U=hZJn%bRZqmY1Fv4 z(xu+vsE^_7(DlA{JEKd7?)*-vUD@nO!&$a3OIPp_+jZ!q+t2&gmwA&e`5kn{^jzGY zgeUGPCguO7+d8g0di&RF2i8v=O*akVtZlE1oUb}ZY)|G@hsqKBf7SMy%`p#~-RP)k+nyj97E>Q~8!>Z8;N z&%d>XR1@wPxfTqS$E3!^PU5cAe!J=Rd3ZR%HBThzzKdK^ILG*Q573(S+*8T9w_v2+ zMX58sMfKoZY&x`}tG3?JKJt#%LtmUqMQ?8$d2x^%vhdqoyHnHY$Y;}?T2oG+LAPr5 z+sz9j-|k4&zTMRSfBfy{imh+8^MC)X9{EDkAF_P-h1Qw3x~Q-5$ywe1O)2TNgvSYW z*rO^F^Tni9+I4Jlp0QL#Nm!*_RFtfgc)ea5=Y zrP{+(Q^|}{y|H9Q>-GIb^B&dr70r89-(56+qx!C*q0c@tzO881*>CvfV(p8vp*ZrD zUtg?!=ZA{=(np;SZ*H&9@o}L=F0G6?%s)(5*u%K+^GL~;`>@&*qE}tYwPByVgJ8*S zmOQEUrUez2iJxCh*;`d!>x*9N*K2NY^-lVU^Jpp_Y|rD~zT~IQGw<^&e)&9m-OOtb z`U?75=@QDvTTvLJPTAh&1sC=KSnVbtQQJlOZTkpopJNL5Wo!eke)m#bm-DqH)!nZy z=%d)jm7`)aMP@l8hefY;|e}a+*^+ zkW-!7foySV2eR3z9mpo9b|4#_+JXEX$5FRVtg5y6-y5L?_CGX23zzbdMri)aOL0-O z&$Tpw?$?frEmWVf$lhw}5xLd?J%aNiXd7UzU}pqv1I!eh6+znoy}4QgEXdUwpgUJ< zfUaDv0XlNE258UK8lWv#Yk<~VtpTRyM$Y7xTHv!8Tpoti+wA+E%@U9_y!&zf&CaD#6XIN!IE})u2$!?M zzWRpR5C%ImR2)-0+THMH_ank1*SLh;zP-3<9SjNCC);=5vG5JhP}j(|xgy%pD4u9f zvG)G4|pNKE6 zo<@&~ZK-F$t@Yto_wNKZ3T}!Z7s8`rYX#Ru@cn`-1y@DT7hEQ|Jc4xBN5vKkE{UM+ zwHFF5iXdJ1QL!Gu`4K!!aIRoy1dZTK!C4U;BRE}fMg%_~I9YH?1dkA$C^#vC9~3;m z*jx2rI&6>+3GNZx8^I3??hxD=!Lfo{1h+=;NWqPQn4GyN_<6y}f>R=RqTocqNfA6r@PKYU4%UV3d9vUh!Mzdug5VCpoe}(^;1bugUPTxzazLuaBl?vO>l?c z&It0{N_z@!jo`lvZWP=U!T%7{gJX4F1piZTrQoUv@?1=N3NDY}_XHOUE{Wjx1s4h~ zir^0fdj#i4@HD}>f}IgOU2vx0tO)X`PJ0T@h~SR|CksxA;2DAw1t&$2Cj{D)8~Wm7u+bgDT03xTr0RPg8wDB zQgBrS|0uXjaCrp(B)C{`NdzwtTqw9Gf)@(*2+ogSBR4-ZsAy+ICs;aDbXG(!vUIxW zjEG)r>15F<5!HwojVd}Rq7yAWz*tE2U_5NqODx?Zx;LVeEZrfxGosCwZV}xY(Mv7e zD7q=4msz@2bX`O*w{)fGs)%YNkH!^U9#K6p(Ym5bB6@|T3q==2bc&@tqVpp<)zZ15 zoe{m#(wU;OB6^jj(?w@Q^lD2di%yBCh9PNR(Mb{2V;^U&9+3{ZVf$WV=^oL&5uIV_ z4$++vZMAfZ=+=l{Yw1SOO%c7$(zT-NB6_{0D@9jDRKusVujulK>S2fW6=E?hxG>(Jo83h;EJO&6aKy-4xMVEL|(QE~4`+T`9UMq8d%6eMOf? zw8zrLqDvxrtECG?7e#cwrFutoenb~os?S~Rj40P0I$Xg+1|IAqw$8vq2OjJr_GH0B z1|E2X8W-DKZ*GH+b%*QC?TB%)4fW;@OV-z$UQ34Rjdqjat9qkxa>i8Z%_2(%>y5_6 z$HkV`o4YI-s5f_8(qC`xv81ow^jp$fZ`255-39gLUQ4>`%@Rwx>W#+LneneT_gT_j zZ|=9Gt=>FfNo&1XYRR;Eqb45fPOUc&TGCQ)mRr(XZ!~^CF4k0U9S zq$_QPE$K*`XDw+@o98TPOPl8{X-%8WmP|_NLH zrj)tVlE##|%#!_e=5kB+)tMGccGnqoSe!p~<_b%;*O@7nY^yU&&&54AhzHEa|T^*IUw8XWA_3 ztuyLuIe+TR4VHA*nVQq4tIo7r(ott-+hyA8%#D_`)tNb#wAPspOQzKsb>*~Aow>=9 zmO9gENpqd)vZSfb+-yl>ow>!5{Yf*=l6^_jZOQJW(S?HcNt#E!mbdnpfld zl{B|mGMqHGTe2Z(?yzKi()3y~lr*{w(LPCYrzINuzl}zF$dmmn8#9bGIe^ zNpp`SeM!@ANpI5VB1iiq&Apa%C(RN|x{^loj+{S9bDt&cNprs?ZAtThC9O%LNy>4t zX-TuplBr4apd~Fyv)q#Aq#3lNDQO6gRrv<@*&k*I2S5Zf00A z7&on!ERCCMEg6WL>n!Pyo9ivq}dgDen(|o_;<_1f;<7Sp6U2)THNk`nwwxm67 zZnUH=Zsu6h8aEx5Op6=cs?$DkbCV@4anor@bKG=U(iAs0ThbUen$=}m%Qf>X+2@*W zOLn_P4+6B0Yi_k%aQ@t+-*s}Ywoe6&o%v)^twh5F|?0s?zN=bHA^h%a?OAx9j>|0 zl6KeJZ%LbL9za^g3pvB?}z$j3wQU*p17?~4m zADI(lj?7MOGDl`7H<=@|lbg(u*~v}j$n4}Mb7XdMlew|l z=4SY*v3C_`)Z7fGnY^7Sn9bPyxY(SEo!^of;;7iOpz8D1$!Fh!J@Q_vQurEvxUWiupihW^n@Ithzo%RJrA!T8! zMsL_$A?Clt1VeQ%1pCj#VDhp zqp|MbD07V!OGlX*Rt$_Xtyc7pGS^zsH_BXRMeitcy%h^anKmoBM;Q%Fjdi<5nH#L= z7-eQz(LTzwThTVk%(kL+l)2H0X`{>>E2fSz9aglAG8*=xeMXs^tY{i#I<06NWxA}` zUokgZv9Drov0`_{%(G%w#dKS-y<#+|M*CFEtyXNVnE8ltvEhnYV9ADxxy_RG6?3~K zLltv}C95l@*OC<#qY=AtvB8SD(~_kXv&fQxis`eYzhdsPq_1M`wxqXW?y+P+#q?X! zT`?LC92e`Vn0qbhsF)>|v{%f4C94bOK1)^<%>9-O7R&>dEG?L&mJAfkGE4dk=0QvP z3TC+_ZACL^No&zOWXZImdDxPvMe~RyEk(1!lIEgWX~p`odDOo2Ewjpkubb7jeu{a_ z*1u>T_ZlMiS)lwUk|)H!fs3NpbAo?~|ESl~WY#B{7Ea0Tg(cCiy4LN_a;}!cu~>_V z2wcI{t}ONr?7#_mUK9Rv@#A7MaWneQBc@AiMogC2f|w}r0^$I!UVkfMkHj{_4v7~L zOx-5@XAw--Cj6HWOwlI%mk~_MCj9LPreYKR4g}M$3I7!YQ?3brCxU6#gue^H)M~yh{3P2~`6;%q@@TfN@))+S^3!Zz5LDPp?BWr)cVmm?-hv>3jxDGK{;(EkH zi8cg-Qwe`2g3+#oe*=QyvxGkj!FXK4Z$~h|m+)sJ7%@!vHzF8QL5)%;X zB`!h?NnDIrEzyKnAu$m#C~*m5sl+72fJ8H*U*b|kpTuQ|UWv;Q3nW?)-4c@#T@qIy zIwYnb+9jqU+9a+-v`Sosm?m*GVyeV6M2p09M6<*-h$e{{h(?K4#C~1$u0`yVxDK&f z;(Ej`i8jP`iJ6FP5;q_=OUyzHOSB_4NX$m8m$(rzBrylETA~B7LSimrP~s-UQi)E) zfJ7IfU*cv&pTsSQUWs{#1rpteZiya5m&C1z4vG1Qc8LYvv9UIZ+aRqHw?n2$+yR*? z(F+oHWeG+#=c1zp?*(K2r*)FjdvQ6S%$YzNpkYR}d z$Oeh~AnPUWhYU$P09h@u6tY5M8Dvo6LC8{x<&Xi1K}f&ELy$g+hatTZk3bektblY& ztb}w)tb%k%tcJ8pJO*i#cpTCyaT`$r(NZv44oHhcFQi#wA*4y-PDrD~BFKK- zC-gz~N!$h5Epazwm&84g?GpWvZ4!$in*g$te3bCG9+<7WVOTtkQEY3 zA%hajAWJ14gbYY5hxAJfLi!{gg7iu}3|S!Y2&7wL1*A)2C8R^*QAoSQDoC5eYDlZZ zV~}YQk3*(Ptbw#h3_+SD)=eaw2uK8YtGyCt52?2>pIvRz^WWShiB z$YzOWAj1-yAR8oxA?qccg$zkN2U#ugJY;Z}@d~6}Vke|cVi%-U;#J5riPs=gC0>WLNbH6*OYDI(NxT7R zl-LW|uluZhkbM$wLUv0ierA`%+mP)N`ytyT4nQ_byaO4QI0)Gw(dg1X5)<&w4@q1E zSuJrfWQ9Z%WKd!vWU0g@kO7HFkba3~NT0-|kY0()APXcehjdG{K)NI*Lpmg`fV4|Y zfwW0Xg|tds37IBw6=bT!)sPm6X^>`#>5wLgYaophGa&nQAJ_`nCvh!gx5RajT@u$r zwo9}@wn@x{Y?inIGAuC*vO%I9vR+~~WJuyh$ZCl>kQEXgkU@#LkfjngK?Wo`A^j3v zkUoi*g$te3bC zG9+<7WVOTtkQEY3A%hajAWJ14gbYY5hxAJfLi!{gg7iu}3|S!Y2&7wL1*A)2C8R^* zQAoSQDoC5eYDlZZV~}YQk3*(Ptbw#h3_+SD)=ee`pIvRz^WWShiB$YzOWAj1-yAR8oxA?qccg$zkN2jOX+{s+Q?Km8AcQ3CoO$Wnukx z!ayhe4}_6a`X2~m#PmN929y(iBX^99KGXliX&;G;AdG9%|3DZ7r~iR4Vov`9VR)VX z2f|o9{STyHq8ZXBaVex%;xfnriOV6~5-pG}iOG--i7O!O5>p^;5>p|q5?4Z|Nn8b) zDseTWMPeGHSzf052OEqFnLD*17W6({s+Re z9Q_Z3IXwCw2ort@za7HtApH-7sYLo82=k8gKM*D<>3<;1Xwv^cnEs^yfiPD}{{!il z=z{b~+zjcJxCOF6VjiShq8rjB(F5s_xE0baF(1+jI4aT{cs#O;u&5_dpaBzhsu z5(^ zkaz^rEwKX9C9x9HA@L}rU1AlaO=2~qRpK$oG>OL{Qzh0wS|o-b%@S)NO%hK)8YR|2 z{z$nV@H@&Ush>~z6!mi{pQe5`(oVC%Oi>JkzkFzOgCOmqlik71R#5Jn)wDiI-!Lxxpi zK^Tn;t3-h?CK*gNMi7Tz4r@ej_)K$+v?yU41mFcV;x&8|)(F(_$AmQ^H2e>QH9|A| zBf=Un8U6>u8o?O;hr$|B82*RD8sQiI*sw<2g@0sNBjCdSNLVA%!vAPkBgDf0SXd*r z!XFpb2&(Y^KCBT<;U5*&2&3>n9@dDT@IMjO2%PZ$A*>NG;s0Y;BUHlwWLP6c!v9oQ zBRIl8I;;^D;U5#$2#4@L9oC40@c${S5dh&I8`g+?@Q({?ggp4432VeU_@51H1UdNs z9M-l{`&?KftieA%tP#)PSHl{C4E_mWZ8^2ihc!YM{1d|(F$?}lVU1t~|KzaNN$m?^ zjqn8ji(!qp1piB6jerFI%VBL2wXcLVLJ<5@!Wyv${#U~qK?nZ7gte{Iz82O9Gw{D2 z)`&0gzY*35EbzY>)|ONI*RVz?f&ZbcV3*dh*tPup@e?P3@{`Y?n*0BBir-e2A{{HD<4WqyR z!?1?K-~Ulq!`knk5!UeZ`)7tV%>4e3!x}Dr|0iJ$`@a9vu!e8n|5;eWu~=Si^?zpBvWj-}}D|YZ&kS^TOJ4YQG9=Snd7u z!x|oY|JPv+bG`qYu+~ZKw_y!4z5lzghKb()eOSXh@BbmJO``T+VGXmq|HrU~N#6fc zSi>CeUl7)|QoAs$VTNaHJgnk^XM{YgVt;3xJghFKdT~_6@a{K7Rh;hr#HfnJ-M=KN zc2b=bRWY?QmL9GdH#;NhVHF!Y- z;`C--AbfQa)p=2s|uuI0b6 zGs_M!#ZM+RG0lXt%gCx-AkH1-34XJADv9Wrn@QB|4WmpJmdA4WEYdmUNd?{nmGH|8)# zRAqdBz%h8-#~8zSs%-De968)SV8$?-D%1ONNB;IB%m)}tmF4{*NAC6ynj;uVmErvn zN8a`inGZ6KD!cnioL!FpVe=tIQDt^tg|Ex;$C?i_hAON3W4O8;|41{I5mXu7*Wl@L z{EwI;89$ZHeJzeI$N#AL2&1Pmxv%2`JO0PaM;SYn#r;Vg<%v9F)XK`^k{wK`G88MZy{dvdWVgCp7 z3C2s!u*1-(!NLBI<{ua>m8pHJBmep*%|9|$YBoCzi^{$JDf3B2N@Zw&*^zhsX!9w? zNo8l>;mEmuj5(T7QkmIzI`XZ5+8o0esjTd;I&!W5lle3wq%yL@!QJL8HI`XT3#vI4ks4VPnI&!Oj)_jJMQ5o3ZcH~w6XY*OcMP*+<;K-@| zIrGnqipsox(2-C5c=I{NL}gu{;L4?5HODg|D&zXat~}}|m@4C;vaL^aBLWmLb~l_&kn=1Yu!%BDWul_UKt=F5zJ%A`KSl^^{S z^A*NEWl_J@l^gx5<`hOg%{4BAobsaoi}@&k)tujZSKb{b6SovvZt^;_m&8S6BR z72NC^+~?mm-(sZGU`U_m%6tAD^KHgC4TB0jI6qzg-^_Oy<&+tHKE6-aKh^vjW1O<0 z--hec_5aE<*>G-W)00FS5Z|InPyc&2RU*ooJ93}DJ<{v-24#x!L;UyjSu_0KRrVnkEM z^M~+wy8fBw48}8MJAVX+r|bXNoXKdWOy?_I`OAM|e#}^=Ea$g-vOTSG(rC3{N?AEvl+{j<@{+nV%PtnanYA-{~=2DOdUL%x@XNl+pZE zSDy0Uo8K{hDVzE0t{mlmFu!N?QYP~~uKeWxW&Xg}r7Y%qUAf8sX#R_lOBu}X_GAlt z)0LzAPv(z|Udm+twktpR1?EqTUCLs9z?GZ)LURElmok_ibmb+-jd~#im-3fSh|5Yo z!7+^v1DEobUmTZ}{36Fpa2U9hzZ^?CezS>j8Okqq%ta2vmvWg;ipx;m+!-}Yt7}89m9YXp6_eoj9SWEeuZQ3FkELH=QFLje2QbPa2U#z<9wDimt*Ul z;xLpc$N6k)F2B+-jDWRU$N3yB;m7zQjqjAP1feuHE1f!rOJ2Yqo|cJo<| zxxry@Qy%msaoNq=9W%>ea8n-i`{J^j&vs0^!{DYo=nuqYH^0#_vmFLE7B9CM??5T~5z%i}VgcQ|H_!w{#O=nutZI-l#94u>I5Inf`9%XEH|W9B*xamtCl zGA`43r(FS37vo?$LIFR^GBO{ ze-w#{GUPaVFRt_V;6Q&Lsi+F(Nsqxzvmu$`cCwbxk2}~C#ymx`wJ-R}>UXurc&KO7 z`91Ab8~Ib()OX*E)-}|YYRvH)QUC2#C6-hMz%ks3lDG8y@!ISYAa4w_LK3MlJVTG! z=#kpWJj1pPL#4WVUFUHltIVgY9#nH{dZZs?O;37X$T~_0Ygcww)%y)M++WSw*SPc6 zX2@~OWooT=mf56rp}v%5UP9X&@k#1;f~%reGNR zlN1bNf1HA0?2l0}j6Ie@!`MD0!`Sbm&@gs|l40xu1;f}G3Wlgt6bxf~6bxg>{8&{F zMZp78tja@C@VpeO9uqw-#i~bzk4u@lhH47`Y%PPXZT{-^M@fl$Ux^Psa#RxT@ij?m zSO&}2dDRW!B5OH7F<-|FClEG#9hC$LmTVSirKqc&qqPLZPGOB>PZEy686(M~Z0b%% zBW;o;($ya6hDm$fQ;#8Uue{FPm8^}MAg?!P!&oxF{kQaL$_P4=S!`d{Jnboc+TZk? zaL~C}uHwJ#Y4Wo@Cyc$MiEokbeTuYlV0^}kwU}$S(aE?p>BVS+T#w$8$A`>A;JPHw ze4Y9#ct^(ZTw?@fhwxl;j@Yka0T0@(_C{-weV+4mdfsWD=XxE5HNW5Zm}<--x@X7q zI{xA2{n&2ILOLJrc^v=m%;6Yw6dO$#+2bBV@aFIE?kIeEr6&*duDBsQVU;Hz^&_6_ z);r^77yYCsGxjTSL$JegPgd<6aYIDJGEYYC?Qye%e%O=E`{lUVPA~1r1pZRo5P-47 zlSTa5xFJeou_puhi*ZBf$vvLz<=f(hu#UStna{Vz%{Hzeo~-FF#0{Y#3q2Xvx5N#> zBX@YRwQr7_EnJ&Cnckm|o6Yoo?7zqCi6KPgRd8Xi!dy0>^%u@ix<({G^2(G)#!|kWoic1Kz^Y8*H z@}h|_JZ`Iq!Sk>Z8fK+0CPL4{XsED`37%p)-iez=4-cXuKK65a7RRBec#yZ^3K)4i zu4s{cafOq-8CNXH8*v4j?2RkZWOrPlD0||HLwPN(K$X|yic)#TUT(Pb5bX3Q;fryf z(CN5eN7NAk=^j^`yk8_?8J9Gy`tK!x={*E9y^oBLPb3+g;DS@s^=4$Cqpo%t=_DsK zxs?BW#KRA+HYaQRr1pL2&p~akpsR_N@J3QBp77VPkH3z6{B`W(uVWv79sBs}*vDVT zJ`_^_*RhYkj(z-f?Bjnk_Mv;zCzCwN|E2%=PbW`^f73pRZt{qeA_Y}-FNu12qOZ*u z>RE)aDcz&)Jk-{u=M|!;#J3*m@6t03K~>_L4mEn|xrZ1l@pXqfzVvKF$d&ji_zQuJ zO3zP3V2Lk>Z;iO(O&5zVfrn-=J%GSG*G*`o#3i zM=+PTY;2)nOwWbHc8SZ+7COiD>`17WxQuO~g-p+vM1G0O;TC$y^bAU1T0LA=x6o9k zr&ZctT%NbkU8cuc+FxAex6o$hDJXV}uuO1)-ON*nETOkFJ~XhMc?y^%4wt5f2KF;g z;j;wg((us0hUPJ};L_cL@Ndsi7YTmpy`p7L~c~ zh>#N0OK>pFj3q6wxp@llB~+M3hJGkqmVjRZhiPJHV0-fv{!17!Ees9pZ=QmI2`Z+A zp@9v~Q)nwV z36rLMp@IF*Q?N5Z)3h%%u;FLV! zq1J?K)4tHa&gUucngDLv7y9{d*%N7BQJD)*3@Jg`1b5TESn>j!pXZ-U`-;kJcyhQb z0ow$A)4tHa_U9>ln=o+N7aG|AJOy(T6i)j>0~?^H&~8G+XxCaFBj zq0P`!2>KpTnH>YWp{Ia!0^4a{Xka_^6rR3CbSpHlA9@N_*I1`=Er&KlPoe8;MP-Hz z?1-KM*$IfJeW8IZ(NkFaGSTJGz@F$S$bGS>Op<|3(NoC#LQ$C|1G}Q90C)oFXJxGVwpJ49u=3~Y~{!tb|;%6u8vA3X)*6Vy-pLIWG5 zr_g*t{ApikV2AV+sJ~KFrp&+==_zb~nW)T}XNUW64(%%{lV)I(^c2!hY5>|78rUU0 z1^D-f%Cs5SCOw7w&lQz7OaCX33{8Q3a4 zr3siQDs$)g;r@~|;DCnG4`PW7Y?hu<2<#Ev3k~d+o)QY|5S8gOuw8meFR(>)D>SfQ zdP+9HBoXZk4Q!a6QV%dWMEgPmJEo^Z1dOWFzR$0b5m%B0CR1s2_+=4S&IKlGX?FPK5myQZri5vDcuT~U zkzuj8ysMKVt^^GW#bsi>BI3%|&?7E4>y(HqeZyRF*;=PYT-h9Eip$@6WyF=-VY;}C zu2)4|xgI8q%kg@3#FhGCqPVQD(;}`+5O_0ae=MTYBd){{I6r8A_%#t%o(LQzv_E`C z#FaJzzY6USZ;iOJNZ^K{{o&U}TuCJuZ=(I-*F{`8Ch+jk{_yJ~u9OovglKPO-WzM}R;>wG$LtHN1&WI~b z#ujneb-N<2tQi}{<=eeE;!2{iR$K<&TOzKU8Y{)+|E=zBB#FcVmvADdw zJrP$54rUW+fB3BtS4xf^ak+ixM_eg7=8DVqyCC9BX3rFs{Wq9K<~RIkd{Mc8gZX5B zXON~Bl^Hm&-fG^QxHz7@ZDx<{63XbYSwa~-h9#8IV}pb;daRdt12H6_j2^2cl+j~_ zgfe;zN+_epQVC`B7?4m#kA4Yd^yrgNMvqv6>ka#wu$FPKQe2|62vl%_eLgLvRA7ml%Y(@{V zkTCtuGGrma;KX_cC6wcXEF^fWAp;W1@j(_6&t~)>3yEiQe2|62vl%_eLgLvRA7ml% zY(|eR3FY`83yEhldbCR@#|K$Rur{$~vXFQ-#|K$RJe$#jEF_-I@j(_6&t~*!mQaol zvXE#(pZ1YZj*tC3{@aWmWFf)J1lcX2j2>hm@oYwq?Gno9u}wl5JvK`yqsOp>GJ0%~ zP(}~3kkC+&Aqi#lAPWf%1z92S1nU`;Sj)DSN+`$2fP`{<^h+qm2U$pDPbbP$LODLj zLPFC)x+Rq3qf0_LJ~||nDXl;eXeBs3jlnuKzEkcEV%gS1E}$49e-a(pyN zD91;mgmQe4g@lHJkcEV%gOG*9vpGJt-H6Uamp?x4^A>qt~kcEVv4Kg6193NyM@obI{vXFQ-#|K$R z@W8MPSx9gxu?$&AJe%W#EF?IVAY>u&aIDil63X#G77_+1A!H$8L=r+45{4ilWFcY9 z5keLc1{on_Az@SzLKYIN8jwZ_<@g{A2?h@cSx6WGgph@VAwLLNNEqXTkcEUnJqTGy z7{!B-g@j={$gqTRe2|5Nt{XxY61r{(SxD%*A!H$;>xPhpgsvMx781H{2w6zzx*-D+ z%JD%K61r{(SxD%*A!H$;>xPhpgsvMx781H{2w6zzx*=pCq3b4Uqg_HdKFC5s*9{>H z30*gYEF^T@5VDZabwkKPLe~u;3kh8}ge)X<-H=8J<@g{A30*gYEF^T@5VDZabwkKP zLe~u;3kh8}ge)X<-H^=^%JDHQp&TD%A))JrkcEV<8$uQmx^4(rNa(sDWFevJhLDAX zt{bvcLODJLB$VTWEF^T@5VDZabwkKPLe~u;3kh8}ge)X<-4L>n&~-yPB$VT$T|zlN z$U;Kb4Iv8&T{na*By`;nvXIbqL&!ox*9{>H30*g&NkTb38YPtDV?U3-Hpj<4iFpvR zkkECr3|UC%x*=pCq3echlTeP2%@WG-F)X1RAM#k)93L`R*&H8aA)!ZN8M2VjBe4uw zNa&FugA&T|u~b4iJ_aO|zod3FY`` zmr#z6HVNhUXq9*XLKYJG9|&1UWRa(RB$VT$SwcBJnk1CtqftURKFC5s{{tZl3H=X* zEF|LjMCH3yEyxd<;t{#|K$R=zkz&A))_)kcEW)2SOGS`X2~c zNa%kcWFevdfh?6!j*kHe<@g{A3H=X*EF|LjMCH3km%Xge)ZVKadUy z<@jiqP>v6>kkJ1?$U;K@10f3u{SSmJB=kQJvXIdKK*&Nu{{v}~P>zpA3FY|M&r_$( z@v%?hWyo#`<@neop&TFEC6wc1n}l+FY?e@tk6{Vr_`pO+{{z7_OaB9r+s@|rzz;|N z16d*Q2Fu|3rT>9oXr}*x3`i))N56z}eDp~u$49S(a(pb1P>v5=X!Ji2Y-jX85PW9z zKiosMODM+&PBQu*2-Y$B9|&GC`X319F!~<|ZZP^E2=*`f9|(Rg`X5N6gmQe~=%W9D zVBwr^ z^gj@+&-6bK+|u+v5UkboKM>s5^gj@++w?z>J_+Uc=#@~8j|CFS@zE`z93Nd0%JI=5 zp&TFW63X$>CZQZ3trE)dF-<}_KBh`2$485Va(pyPD91;WgmQc|N+`z%;R^IW5CR+M ze;~v`(EmUPn4tfG5LrS010fJY4td%~LODJN@Sy*J5D7y610iID{s%&Y3H=X*P!#$f z2r(=4KM+D(=zk!@!qERf2%Vw-f%Ho#$48%pa(v)iq5pv_kWh|~ZVBc1=#o&5j}8gt z_-L0zpj63X#0RYEyFS|pU?qgg^ZKAI$y@Z)@i8o+93LAbl;eXSJNh5Ukc4u4td>xYj};P6 zKn5k0<726Wl6(wED9cB`gwlNUNhr?;{#JS$2&Q)W9|%Ty-o`A_mDepAqYDk*Dkv8U-6_k614o!pki-E8AQ6E#P2&A@Iw#u)79a1lU}pr$na@v02{P>*ENOqFHkfk` zp#72BV8S_oII;OzF1>wH^mh9rwZT+#u%ywF!8~&S#|Q?K%mMs>;1)jDp})m@gkUhk z94z@k!C-iEeG&O!C-1RfFBVIW|jl^QNg)dClkv7 z{Fq=cuN=T}g2A+M0PT;|2D8cmv_DciQR`$ zQ^>)RCkO^J$N~JkU@(Ckz!L?7`QredBp6H|2k>OUVD>nGUl0r?j|2Ec!C>w!Zydm{3I@~00kl6-8_XI9(EdnmFlijXuj}o>oN)lZ zAs9><2hjdVZ7^dTK>H)LTj<=XTch81_?F%t%ohhs^79b1r

8IDp>~3}%Z1Xn&-3 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 z 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 cJ-V)eWWT5&ZIu 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�d(9fN)4Q0TQXzK<1NV|?~6KuMf zO~Fc-+$*u^f%9NZX|ArG)qKxJCz`%nHQ%kuyY&ZGm7ibQB0JGHBoDj7iPs@4=&EDJX&=aty8I3;F%*n`Hwx;;P4pa2x90HH}tu(8u zr{V_KLL=0(AJ#Fk*HN3x!|%_AtN(Ovs4V@}A6a1WhezKaI9$t9a<{nj7ymm89sS|z z|C+DPssX?1Ql|Fk{NrBZ*Iqzx)y2-;mct0;S0|bf3Js`81qVg21e7{3wKrf*JDJ>wHw@TGv}gxw$VPBlqpJr#2&g+i%*n(Z#PkSrU2X}# z*38C&^P&V7A5>0Dw^5&yN=|K|d(qOd$Q?IB5FIKf%l_76a(AMO<0(QqKCX}y3pwFt zZkKbk&soJqWs^kRj`B&uni))qxy$Y97jXk-MROMOF8&|PzXSq1*$2r|e%lAw|wghJ|#_DcKfV*iURVB27!>q!`}>tak~TFil4 zN@;OR2@Av=e=TI|vcL$4`Kw9-ur3DVMV3)|IUWTN+gH{69R&_NlD*z4>vR=9@{3dx+OjcM z$TS@JEioEuiFuFybBb2LXd$*E4WFa*hh0intd$v+S;+xNrKIqWkAu zs3jBgPpf|@U4ZKwp8Kc8^&QvMhlo7B=l=0{ftCO95aKTxh`;uDul&UeEc{T+w{(uY zG0Mk#@eeEn@Q17aYrgvT54C&0!NlJE!?XVzy!zi*X!SqScjd*$n$Z;|ySs$Q(_dji z`m8HV&!|^nb0>^g=*7ry5Sb+57Sr%PIyaW&GI&9cb4zL&5m(G|6*F`kxR_=9LQ3q9 zLe6Ru#f4<-72!HUPpo6R&C&%J*T79gEZNcgF2I^{0ai%VN9Pu2OQODr+9W(5bOAOp z=mLx;(Av%G0&IcLfCQ9yeJ;Rm>=UTlTW|q3;$48r^9_RK(ghgS$u=AFxd5Y>B6o$OIT9cz2$(x%s=hBe`sd|d|y((3I_0XsHv&>DKvR0n*ihriA9Ir)j zl1dZfzV)tsiam`U0F9Mgrq$h}N|HNgOTw1B?tavlgdo4}exfAo-!0byj=YIKJQBP= z4Q-~S2;+psTx{KwdichPlv8!t{m=4`?(O1_j|^QJs^cq2`_@7{)o|ID3`c#Om;Hu? zOeKlin3$nKZNl!L6kwYyEK*xj{dZmHQ6xa@*wA;lakvWa0*d|lJ=zJW_vau zSL_e)mG0=6bHB)LLlNZ$eRb+kJ40+>93eBChWm+h?DF2vMu@YU2=>XAGFL+h8g4Gl zH9=wJycI(Q z+V6I<_bI|?2hIPX>6^#=6Q}BHirQ-8`*vLuxZN5w(lDkeAvy zDKx`1Ez7BSr_l@#9GX@xi&+<1#coK@_vVHisaIF$YPdd>F#`mROjPobX}Oq+x)?(h z##OR`&{p7jBxV&1cVZb+LdNkNA7NZ!l(EG!P0Khr^D(83Fu5$0_8xSuB68*yt;r9* z$v(0~RvEHrGtEa!7?$@TJ?Nq45>Ehj#lNoJF;Zj;<=QOQFxH z!8>kjKh0IVZn%m|VHN)^P4Jtoz*vLUOPn9zUo>8eqk6&yWqYxeBi-Qvg6rVu^x%^% z_BJz^je0Dp@L?Hlwb@YYJOiyV6fHbXlF%_bBjAdF3oy*09@@d-Px+4BWli3a?K{0O z4`y;f%CiO8k(H6``N%N<_;l4*;djV6>H%juk%*-?zzGzmh}|v~V@!WX2g-LxJ>VpL zySabm;8lQU!YS4S_*gK+P}7OSX39<+CX<&^cX{IAckJ|blWF(6fE+=8=0lKx{sc!H zE@f5=(;?^$bDxp%gDs)_GF)-X9cC(PAyEW0QuEH>uK7@~KAlzK-nmO~t$1jNNRV$3 z?ZsQ4f+6Cr?_lm#8Y0@;FV_%J0uy`_3V)dK;m6aYvm*@$*eIuCAk)>@=Jt^3yPqN$ z#(>Neg2rpS`flL)m1xK{-b|=-xB8V&1-UXDL$3O5;FvlLc6YVwnRhGn0bDR6pXuay$_MmJb z8M2cFd*kc1>0XK*-Mn@0xrIXx9GfAcCb*b`knNSvAvBD#kRqTc37! zM`GgmxLTW@HGq}jM?QvQ)}F@<@`j%k6H&_cu`MK@7&0Dj=?KPDX!T;O&oB)X=se}o zOUHCRBzMO~T5+u**W@#W>7I=0-2^YiHO>HOILRUx%uAvT&jl0mYHwp$Pb@z^B?@)R z08w`UoA6t*hq65dW|R9XAZi+~8eT4MDVCYb-yt+)f~wn+>94vu)Zg2TR&+NsUuAZA(MDrX4v=|bA> z8v^z68K*n*e>O0lw{?%h9IAo$HACtgD>bd)GBsK$ra+v;z!cb!U{_U&E!fKA&3#4U z*+py*r<*6J%M$`dL4!+lN`GV$MxZV`+Q!btLd2xI13H%q@)&EgMX1Zv6(*GQ&E3e6 zxNGJWOsybbjVUw)%x0nbnVDC3EL(H0+G@85)U6Bj#F#v^P(9gSkFZ4kpH)N4iCRun z{S`B>&~+7irYUU+E#1XiyDF&iqMC||HHL7}sO%ezSm=&PEYn%NDGO<*fZ*-c8Hw5V zM<@}~mOJwEe*r4luQ>4gN`sbKIMtuR!j*usyJggV4vmGPlq0Z z7WKmvG;vB7DVb4nbA_6BGHDvmDfUFBFk`)`W;o(3nO*{z(fwm3h*^N!Y9Zg~f2JHuq8j zwtVB@`(k1SaXfCt0GGmg;z`9MLMUsJtS0bP3&xMa7FvTI$tZw2zL}>!TY`{h6jacczrxN{mT8?%YcK=jYCc1L1Lo+7l zJvL*cBl2v!n0c^7>4bIvgR695+C}^~XsQ(9fSuWCz4hH)v0A}wOc=fRn_x>HzUZztFmtps0 z&x3eVU2NDyGfkpML14Q@ngRUl=mkRBj&{ny=D|lchN=Lqx#+C1Qr|!`O0pZ` z0CS~8NFiL-MI;1hmNIXoMA0>W+J2Uxp?AK1Oz zzpbViQ7{zKj;F5Gs3TkBa%?XFFR8T-SM16hy3Vhwab*I+tD3NSnNU-L5zL`dA{r@1 zLoY{z1QE?X29SI3Ll9$ji~2zEBy4YSfj*WJ`>hcq9O;^93ObBgt0m0h)O-Kxe-i?Q zFLX~VV|C)GTa*8N%<`}f$l~Mcx$0Wm=C1kPVHU+?g<6p0zjm9KcM%R|H+6#RZt7DB zmW?^>CR0zOm-3&qE+%7aPC*NW{2>o=`t4kE9X;=+JlPJ7Y&}}Fed?>xd6a5R?VzyR zVbLknb9pww|6_cyrWz9uh))kaoPWqH?QBEx38aef5J|4ufF&!ip>zD3QfS2 zf=%gv(WSuf(Y$kcp8Tg(dYqzru|2k?lJk@lPt~?htv+v6H^ymW9&hK@mwn=S|GC>( zW&7CuVi~j@Lm|(u;`5KG9N&!M&b3OKT)6m8|G%6D6b@XW-HgA!n|95vciDfoDUWw~ zQY+|uM$CUZd=^mo0YPQBU~ZGMbj2aIFJ( zb=D>($he9n?mW04!=IHb1<%j<7hz{YaW*waU`^jJA!YA4}0GZ+n9R=r3WaS9#67RFxIPcI0Hqg;gs8DTG3VzF^Z54!7%k! z*lUeNcbHE}F7{p7;wMOS85EicFnp&OcET2xKL!&8#eO|tJSyKye+)Vl3e?5D_s4EP z+`N07r(5;(TAm(F69mfPbjH0UPBuw>y6VO0dKGG5m>J6CAY?;2+ zJlm^nNSYvAYIEBWD@ey#qf&3s^Vblv!SVCGqBj79a)kMl1TsrnhoC(j5HJD5*#+q) za&p{t^cxdVx`|nm!j&%57xI{ZiZ5gu5KuL}fQt0(cEn+$`vg=blTv6o#sj0JT__3@ zksIf?c`0>Q=r(pwpMZ*e*e9UUlmdF0QtetDH>2Xg4D1ZAIfzTmL9tcb4Y#v$a_wAE z90s2e_uwbqBnJ@8N9tWxWHNcIZk|efbvn6TtiZ0e(;g(4WZa3l ziK^#urr{l)`o#sTHMW@$rPDR1B?vUUou>68$v%dP#vMVFNo86FDVppA0X^CR^b~+| zROKp4meO6?E~s1#N@oo zR~51kQGOCeY4$cOZ<~OxVSo|36)m&3hcW!4I(jFp!C^Mw>mL7c@CM`V<;ne?dqfGZ zl}`?f*S3P6eUIzV5j<@w5ne}zAacFoS~pGQm-Bmux#M5Y)7!j=hkm@&AoR9i zb?U%=YOSR|*@%EE&%zGh~It)&+G6?3o-fT^Ie95g?FMqMD4M(Qzv3 zydFWX#IDq+hft@o&Z?8DtxhyTR+;fn%GOjjkc{h)0L{e?&DAccA+ON8&#Rso^~}{$ zEF#nF%C=uazKca=a+B;JJgbhCo`2GUQ`Iz7|7k_E&WZc~rpIg0;fXPEGGtn2tcv^i zJMO?(n}IXPBHMI$*K^ z(oBG(4#PFr;C$b~7WC6|v-D0QNGc;xl8wNdH39T{BR~T342?k3^smdK_J?G&A+0~t zu>*Dm>8_sbfuWx(Y7^Dv7AZUY2EYRwyNo0hhann0lb%jXf!oxL)6?%d)C4Yz8I=nO8SU4g#3bdk74ML=nb`+jNX2RwIU-6-cRUbNT zrmRdeOJgpgqP&A$hx<#ot7H>B9>E{exrj8>zj5_%oc@iw9U^we)kAtWN}fLxBP6&6 zjc#Hi3>0BTTMU=53qluV|G?ccX)NFAuj~!Ndq-_|m`DW3Xt6|r=P+zihGAlo@x!4f zB!tXNFm&}wA$Gz_g}Y8vhBZ*BHkyVTKEFS5f9MYKV<`L+C8vupBMuakk;TU1@FZ&8 zb2r6;ri^}F6mcC>kQfl6HW0@ZIzu*u>12`3DBA;Q0$CSQ^&inR8dG#%J3#wDX@j{r z3rvp%Z4e$+E!`1Kx~V{&G-nhXaqoo0(Uy3Qrg_ADvUpYGj1l(=Hk>xdh&m+n-G1alom%VYpcnW3WOdG4x3R%dKf4GlM5U4SI#O6~9m_ z-YuFxk0OK=K_vDS)(``dV;fr4Zbxf?Rko%O9&=o;%kr^&85HZXoUd`Wlam_D1S%in zNI;mXGay&afo+uRwG2QY4UrIPB&&$rr$wU}7MtxV1+W9BwN|)or9} z+78y#+1+uPVTYvo_$oVTIm*8<)uz0X54?!VF$h;{bS9DMb!>LVYRwv=-E~n1j3TwQ zez!7f5)Mm~Hh~(AK8y>SjKUoRsH14~9W5Wdq-pzg`@Y7hdcEGnx$H0B$m0%|ZvZd% z@Mp;><-{*x0aL$#f>(Y4Q!SugD+|c7XaV)Jzyf};)wh7E$SmHl($AN9w07(T^tRk; z>d7r2trZKHE};cHFcc|xzD5j(!T2Y2olit$6E!kFu+*G1L#!1|>SoXX>I@~)69;9g z4xR_2r6TpC`=ZkU4MH>AF~NVcG{bofaIw&RLP0ci=Yoc!#tg2Gw7=U=rh51|*IxnE zXnZV+dpEb_zg3{N!fJSH#21crL-LTz(@GBp~XHq6n*#GNsbx{VOPzR}skfNuuz z&E20w^7}PZkQ)W<@Kx(p7|-BvitD($Bm63EmLJGrkz|Hac`+~qA>Y0$joTHDge{Yr zJkm-2E9Aun5;A2)MQVzH(6&+n*IA&`1WG|wpkwed^hg(53Yo!4?rp8Gz3s|Mi=SLK zq|Edd|D%3Gf#7Op{x+sfBgD-usF&dOmUrZ!Vz}!t7`&Ku6@pQ32-hNozRDIZ6+Xr; zS-nVQ3zr64IMTee6qwAYAug$tmlAnfwNn*1%~zCQ6DP)JlDcdPctLBdm}K;Xk$Y5U ziSEt^f-#)t0kM||dB%>mMF}0~H9s-qo){}G@X!Y6nj9-A!vD9iHsXRf%%yo98De*B zS-;*6lyA!UVEGn9a_>A8dV<7gc(Ixd|Ex!(K@lOhyGA&n)yHE#8~EzC>=S7`l0B+> z^&IKCyHQEV%Pa{J%JR(tjQ8t4kHP_R?xHF2&>3WT9!uQi>%z=SYz`kkb>GP|-I1x8 zPu#G7*{kws`}J()JztDoiEMzM^Et3jJb|IxgQSQMbT{n0BeIKv5fx&+C!Se3w;*=x zWreRE%=+J8(zF-J>GRFX@hV^0d^t?Em5*GH=#utyauHK#ViFkaQz0(8Ga*~#d=KEJp;7o8Nn>pCX~)TYYf_3gzg z&u{e4i8K2ct9c_e^A?8KKe}U&EvK6nN&t*U^VEg@%tAF97Uj(+mEwtnMJ!b5F>*$U zf?VuY*#qut(qf(KVpxTY@vN;G=m-s%0f9(A4=ps+iI_&Sq2LG6ff!>*N(=nB=`2JE zWDvux4I_p?n~oo@j`*BO2od?GWOWDLekV5x+@Y)Q3@QuVTg%|S&)}C%Y~;r_i_$x! zZ=iE^nIkpat$$0Qe*;jde=!qdq$vZC?4Lrb{Wx-d=;>w|BEk15`T{>@r?i$QbzRyG zJ&EmKLG>%9v%dwYv(F}M7z~6L@_-k`D)YNWwpf-Y7hn^uVTuf%2+ku*P*sO|)!&#c zi^RUJY9Ur~jzXf0Fub5grpPK^1en8$7PEJ6F?-(#I+t_XZkPz06-Q@hDTJ9eaK%a0Wq+J zP;F?jp+%uHOf?9xq`1`5Qu$jjbBzd!#*augXIu(RR!-%+C5;1oX`rf4d)*>xTlEMN zJRwReWb^*ujar>unhOMvA42ms>26kF25H{h(Fb|z1;fUleh7xm{YnMHRs{1h77H!-Y0pJ_;c(SY_X4p5WUb z_J31XwO^Pm7iQro*^V)VoZf;suVDOMr#mur0*ZCqg4{ymTL$W)8*5>FhwmF8Wyd zdzC(laPz%MFY!Z4MBW5c&Th4IRfB*oU}FWL08Vx!RA=PsG2+wABM?47K&bEhL4vKm z!~gldD@lxwC0I8}0VsI8_1sKns6d_{_~E$f$EKnw28@PmR^rWGat+!>15(ThOJ{Qe zfQE}R3wFz3W@s9_x+`J4`uo&+`Eyna5WptVlA6F`$t~%1TD=-edZ@C_Z&#uu;%la} zPg?qLN&UuKl1sY2|CH|D$?6HyaeDu@-aDwps)nT=F6q)+(*3Vv=>R@`Q1_q`Iidov zpRSzJLq&RqG41e_g2f8-u#`?|v815%zE$0OrC-%PzOf;VE6Zr*x1! z+P%lGUf+_wPKmJ4!lnN74wrQ4E@|HpeVdjp0A3GZJ$d{$VVxoAhJd$^E?<&>7Y_XLp$={l&O&FVq@xY9>i(k~8| zbg3^XOIKae*Syg$X&(pk86`GYXK?B5!zEqnOUf!$m-HT;Mkt}|qZR4VeM-z&QjYZg z;gT-VB|V~pH^`UnxymPs4El;Kokyg5l^z6wL%vkf)uqUn7E3AzQ`J-YcUnE+(gE`5 zy0EH4@@UCYyv35vy`BKrDs5Dr(jgOr>B5pfr32*AS9Kai39+i*_O94WL-SAJ^k#Pr zrAJE?@ZR`lmQGB}z>;1iBP+!AeH8Colo&KIpC2yiQeVUl|1@qt)8Sr@2M~`4=NE;03GS!k}g$TS_0nH{YzS$QsL4!RaW&) zds$U6JvR-l8kXoOy{=fI>Jfdv62~}=0~GJals*K!bC}aCC9(aSOL{;{H-{$XV39s# zVwNxybNAa=y+P^GHE$;|a4=QA^h%{`saevYzI3VL(m9uOzt(wPQNsWebHz2J2Q#Cqj0N?Q z``0U7fcnEjig$@pyz?#TTeWn8y|AEFbovgZO9lQnLs7$0U(x}A;B{e1gDlq{(f2A* zN0%c#l<_WA@@T$O`T?z;i~$Eu=@9VFdCg-fkw^0_>Bqu>>^r6Vlqlwgb^eK|XNKg_ zuMT^J2NgkU!?>>@j&1&aRLfD?Z=@!#>Hq1(j_p17Y*6Q+~6+I`V6!A}fzim)3OC zo&znaot&uoF0D0Z$vN&`aBvo9Kg0=-oRHxm$R(vgfkTcm{ERQU9v?lWQ!eV< zU|xTCAb7Ke+3%M3eK3bRr`PVKYm&&DH5i#4GV#!-*z293X8?bP_o!F_vhv&K| z!d0I_?=siskd#koGra>H?;6i%=KE%s%7+8WWwhcixc5w zO5VZn&Zm~xm8y~o=`C?*NUyt8Ng5yl5conbDO5H^T<5{27&hfX^_oDAi5z6h6_$e2 z;h_t^P%eFmB5CAua;JW1^m4OGh_QuQsg48}X^?rqq%K1X)li{ack>h4fIy%P+y}{v zpo{o-?FaAn-nH%R)?31x`3~LnA>Qu5pEkOx#2uQ!BdCS`6cCx`+ZW|6v^Z=2*LD-2 zfgu89)j|33CNR0ih>JIYF)YE(|BqA6?p)Km&xK>#Mc zanq@3hVw?E`<_E*G;lvefol8>ldg;$Bj%#Z91zc7!m6IcH=R0-%V7iMn4Xi9s#saK z@AHMvSSHTxFW(eu{cz>2;f|DVDGkru(r5|2w}-j}-YNasSRUM^nJzB!aVi^V?sz=RfZK`YjIENO0zSJa~p^LWIB~LD7T=e8oy?^(~rEL(zord=0#4yMy$>e890ithI)_ zp{$)gYIL0chPyVTTCg~(3O$v7;$B~UNDH=3a9YgX$NeB4^@|R2{EH5%YF6~von-PX zXghOZ5kBNo3rBjwHS)j(q%v5bP%2U~n`0|tcn#h7GB;1rjW3(Q{E9to7wYaCy7cq3 zyr|!v#?8Y0XYeR!F&2at1&4I341chp1S@Bg9e4v4O>?q$ZO1kVB+nW)CvQ1FY@yXY zi@XJHkbhDLoqHAM0>^enBjROp18rIg-iP@W{3i8`;k(R%lvTSQ5#pl=IIT9sDQNiyj#ICP@~|rRYUy5P|aX@cSyTl zuv8#hMf*mP6Fx@mZ4hFyUKpNk;9guStxj{K=I*ieQC*h1P)@t`5gCh(3aZd(4o?XR zP_QQ1`|v@J%SCx~ZNsJv58|_W5RE*Lv%wzUQ+J=el4A+@&AwMS(l(ES*=0DQWB}~dMM%=mG)T5oRIN88OEOlB zrl@zYDZDQ))Re-H!Al84w%gaFNzKOs-;cBU6nD8S3sdm@OAbdM^^e9(Wa{pWn2PKg zsFBI!1t#nXavZv}V|qM^2o|nyXL*_&nSgy~G2zKG_{}LF$zTeY&Z9i%G9}{V5^; zuIZGN*kI!`DMA&seH=xo-)Xg3!I}xgqppD}6U;&iN6dtzX3R#e4Z~@-A^I@tHsJ%l)Ue3qMih-tr%zd#9slK%XRWJ_gt)R0umY{VI35h%hpnAEp z-U=?Np=W*t>Bgc~aK3!czzTjnjbriZN9voqwKW`$ z!GF2-V63fsl=xB(6*W;tjzaHPwBFe5YzP}m6+=&=Z-EONxBs@0mKPRFJgAkCVbh*KC|jT_@+9SH_vNT~nQZ!-)t4%O^6a zm$bzvum;Jd8#2_v5vKh zP9Zv!0HrDVCe2$AcB2ywBew+dL_|WhAg$&PbftPDTFJ;Ebzk%iiTn^_iad%>rWgVC z0C6SJq{bLDlTqH@EO|Z%A?Hi>eWS67R%$aeLGD)0%n-ngFdkl%qI~A#C(7Q6W0 zC+xY_MZv?QNdHA9LOme>pd|(^NiGvYgyg2%Db1H?b=EM5+7OqShHoE1lQR0pjDln) zqLibrF%#8JC8Y#ZN%lCBBa#T4%-PKThFuRD^H=nQxL9{S`kWZs-Av3v5>{vlm^4Bk zQH3oMaXpw8b&ky}X$7)pbxqkw`5Puwa74img(E z`VL$PM7WYp|Gh#SX}Tuo!TG}2i$Xho);DSu%uSl<^3}mYoljIM`{+Ya73zFjszUn) z{}i$a2$dvFR_U8)g(_^%6AO>R^rt{pBdF%pqG4dI~La@Sx z^9j84j2<-L4P7RQEgHZs0}2EQlRcwNGatcnMj%*-Lmw9;Cwnc-57glfv3;t}f7)nD`sfJc|3LW-; z-P8Me)$Fg=_P*XQ`|HiUueVmeYH0g<-|nn_^F2Pm*SQ9FP+5z?shY#RY95?j&B5v% z`M_$FIW&6?d{8JI1cE|kZ`6wJP4y5K;%=rz{IOkyA(aOs5U^tTl*HC9nSj75Xzi6< zS|HjMz`eTj8Ctw9T5AxD&y(Vvln)35YSB~R!G%%)TI9D>$QF+#$N{IS4Wn?X60q$1 z7r=srfaY87B{(ajPT(W}9D$LkTTQ@Dg=ZIpMVDY8j4e1Jfj-J)c3|NAt<_13)G9h- zG8Z88dfl97g{mq$W)h$^ih|9?JuO;GDXK$5r=F4|=nIOZdYY$Y5hD^81AcG#R@rAm zo(j8EjPq=RuZg>@$m4F-2rcrIK==M)yzVeh?o_u|8GjrorE+?Nbxbk=!1v^nsG%I( zj(mfzDO{^CWs3HO*Y<~d0g4(uT2xcGrVA?nXT^ULPXBr$(4dh)M$+ke_Fo`hw8n}G ze7o=w5y1#yP6Sry7r*%WbRhA^n^^R+gJ}r0`AQUK_`ev=WXBT{j7gJdEoO%qXGCL~ zJG3xO)yPLq5OBuwL%YoiK?Skol|onqXx3Fo0D7*G^(vEb zK$w(bW>uFv^kocl%)Fw36^&s;39uFT@9H!`3I8hCh|FYVe!`g|ofLlvF{-dFsojs5 zZF*fK$^zPkq0%7hky=1HQRVD)=A3g;{9~D|G^B^!Py@RI`4kjxywzk>d}&H3WeLyGaca6x7OyY06?{dIgf%6`lIaWkrsye~ zaC9n~`r|3QJHZN^ls2a@CxF)>9$vSV*KV46BEEDxyRk(8Q&zw;A36eL^!6COHXV}D zshF(i8gU(oi{Kb@iV_{{@QwZ<%M3GC$pZ<`fz$e-?ciA1I<>!=2Ap>cboadi$_~+; z0)R5z1wQ`ept~yzba!R35Pj&5)C#)$c-4+c7&sR!<99N9EY|P2z%giJh}_BKylzUW zM=u;ncs?^MgX}l%VKVviF1*8*obKI0idt28(or~JrW?y_*PRi z*=Xvjrf`AhAWumyw)SXR8jSv~!hZU$(rQu?_kOgZNXw5sqIH=U zSBhDDQ?aOTnsZS}eF}^EXi?V?{5~t-cW<$%dy9qW1HYtJ7WJwWv%_SQb}q~163-Pw ztQ!r4c|L-?3E2lCOe9;)U2MEK+=%;2J&Bm8VZ9(0MS|qN&=ZnbS^n~RJ`{l!gO5wZ zg&^^*x&NQNcLB2ND(`&vz_{4Hh84fHHQ#fRmU+!Dg^Q0cT>c2yFsb5JN;F#u{*9LCnN} znHXXwiY?In{l9PTefBx(ZnYkc+nz?a&)#dV$G2YJ`rZp#qvJ0kuVC~{&tX3z*kQHc zcZ_WnC1vV9Nj|MAxGLCBV~g_Uws0+w3NmX1(oHr;2&fRRn;mV_;dLm@1OiU7>F^?1 z7nD|#yX|3-4ZNm!P7{4cFB5oJ6AQeygXcCClHwbSDd1!m03mc`VHM9azC2iZ(X;1=wXbozEu|oYuA=e(@)-=wo!<(tH=zR5C}=z-7NXuIl!g zJ%q_hChZDf6A-{3VM8C}ecIR#V{Q^-nZaOT%608|8vXvb-5xG}%Py<800|+1(oNyrF z##{(nlJ1kjjA1fCNzPOnOCPpK4&d^k3zCBglc0S2K3jT80C~9i-tvvxsFmO7;6{;m zp~@SnW3gLWxMjBJ<*2*1ub3T~7_F*(_3?qM>?yg-dn6>vC$C#@2hk5FYw;V+AP;r* zTv*gy`ze~b>h9Q)sVlFEU5fxGft---(`M=(lkF)qQg;7ZD3hnz)IFi8YcX|eaTizn zt{Vz0^o4i&mV+M1KE1ZHq2P@YTe}>YqgYzRYJjFM4D*|NefF}o zORr8kbstFMUS)M|u{4NxaxX@|vhoIbp}9BrZvui_bQQVv6U9~b29ct)nQ{6?4}y|U zv1PDLo>Q-rAD{gee)oKzYNY9H9P^Bq^YL4juW*4 zx5%khnaFd>a~mjAW($7+nSoObFJd~2d$wF1sUDLLdrH;WwkBP^;Y^6^+X>8W*5kzQ zR%I4MheZ4;f1#h^wk(T$0xFRU%XSOEBWH2yu(lZ`h20<|A??VWL2xX0r5Y5DuYW)=kP@IPDl{aCw% znDT;}P2fLR(_`l^{{akREGAT*UbcaGAl3q-wBfRen7(89ep$asPEwgPMY{Y9!EyYD zamOt`9REmala+?~1q+vH@nYIxeqVYO8TZQp{GI!Ea`S;2l2?5jUvmX1wC78iKt+kN znjtUkfey>XKC*BD{AdJ<9Gd;>Kl_C!%!Hdi$6&nm96UmAJABaNDg-uo8N>jXHQS6e zfLWj-T;)GvAmVBu$Mq9HEP4oRm<~~V1D?P1gihN^Q)El~aM^~wA_}nh6cmRz^K?Ss z%7ud;?h&9Ta+g(b1_qdp5TM?sG3+j31?QbSt`zZ!So1Am{O64OsL0{B4h$V zkUV6<>BN=#Tr*))$}sDU;z|i0$z{jmN?8~si)zVyBYc@s$RP_~YT)k>^ zu!Eld8g?CS_cPGM?0(@`(DW zC=B9Bow&*Z_0VF`lk3N2dZ*ldXuGbSnMV8h=N=Y&rbG# zfh`s@0SOTt6lzqrN4nT8nish{XMHZ>rL#hv<7 zfs9kX#r`Xu`URmPWRy<*28Fe4PW@@+)GuflsKuQ6Ib`J259&J6ssEGa)X#}+J-u3; zx|~NpQ0t%$`|a0)b}`l(+~M!#4O~n4^}lsMWw2GL0Jc>>9l77do7glK^rT;6^_{<{ z^v#jQ?Uh#@6roUA;&FSM7Nhq{57^tVAikR;57;YoQv~c~1zW&g3+r3v@<_eSTBKf1 z4IKw|Y!;84PZs9{-#JzqFN%R;0jC=t=0s;%!(*k4ak&lWLH4!qIzq;#3EKU?@&7E(4afG z!^w7*an`L@y90;u1 zJ-q^$Embw=Yq*E5dV5I)=+?r>crifBGJ;|;K)I~00F;i70Q&Ok+bd3J{nh?$sZJaw zW(U1ko1~}1B>h>MaQj&i->JCKMaNRH@;68SkCsTB-Q5mbz$E^3k&eFfyyR6-c3|IE zPBkC|;_QROW`~w9@)l1Q>ZUPe!UA8nm5KUo!0SBr3CQJt8E(G2B$sdJDO?;LE)%?F z_pU82>ta^|8TAOgSodj+9K5J#nCxow>~|Ks?V7V3wl1NOu7nB6vV}m;@EJi>8t}!X8g1*fQ`s=k&O!PMd>0o z7aXccn{ZS^^=5eGJtEp|)Z zX_r5j^*b9Z1}mQ)=Md%(Ovjj*vv&B^xo{7_Zcsd}J|V4?phwYvWAISp`qh8%P&PY4 zgyw(`{bbk}?!jEq6?s*Gvj~Hw66Q_8xg#bBjzu%pR#W=p5QVP_n6C;L-Iv9ed`>VI zz=+ErLBK#2a;26SA)_>zad;srWGrjII5cV!K)AR-fKYN25Kul5XBj|dK=hai9XKr& zAXfBGkI-D^aoq^}z5>gqV1fU+JfLQZqsPt&W)UDbDnO~H5`6q3i(s$Qp$uaG&lWgz zsYvXjfkT(hHyk*0>3qY1Lzl{@9Xg1?r0HBPaOjUv$cp%gotoyHww)9+15qdghjNdO z2M%2eqPD7I`|K$rhU{51VhE|-FX-973l~42Cs9LS1l=|^liWoCe)d298l61ZaUD1Ct7sy@H{0j9U`r>}dPr7_ zsw}~ZctC|8Q<7pao4g0q{JqCt^E{zx3$jlHNh81PBwepKWkL#8F~6WG;d~e@u|Oan z9SdmyGxq2Z%1(7DS-wl6`jC1KbwM4p&U#0va+=ew=)|;l!YWp$v?2KE$ssPKHXw|% z_Y$>&MBOpWtuB37_4ATxfiF3V)mH;wB_MGpC2|gpu*G6Z=5}}wuB%nmRT&NK7DYH; z>9$-8q@_kRaE#I@~wj{Otp|yMGBuGI+a&bhMc<=}TYlt(r$0^GO)K{>;#C$Yi z6oP0rME34;{01?$8?i(o9n7`VB$WK&mf3B=BJBRlyA{!JJh|fiRv6pIC@q z6cJfed$gH-X{_I7Pg_jJ3!1Xt7o$QskJs)c`v6a;z0nyFU)mn`xUve8rU^xzbfeNWGCJ!2O5V zQV?pI_@K%}O|&$eiInWW$ZFC|kxY4CXrPoAfn=eZ)}>G0b_~eaqv<{p8wiOit0n+T z3MQZ@o^Kz`c>x=?1L(#EupwonS#buKU}1caboUk^P%&@fx*$m?7(0_lVsE4nzhkBX zL^kOv$j;QbhS&cohsN23Bj|uGn@CiJv{FpiOtQ6)8d4@~7B~133|YsJTq@48ERx_a zX+$bcgr~AYAwIHM-iF)%>RyxVwsgM)m*xR(xaAOc=X^?rLEcc_nvK!j0j@V>jrQB6 zT^zlXVX0jYWX%>JFl;l)mUGXwzM7$$EU++G!+=U!GKNt)HJLl=Do1pgnED{jv00HI z2jd<4f(f7{He}xcNa4uai4klzw0b*Oy`5U;fNNks2>7}k?T_{nv{mwi8g!w z;p3)pR5ewK#t;bl?IH!Z!x0Qp7}x^tSN6fEjv)Hj#0qYNNQQd^x9JNJF4b}r-z&IT zSVip#Afx|q`@sZg3;C^k; zPlJtevr5A?S4?pk$CQ0YF%qIIgpJ+!!SCzLO0(_ven2+yKWul};ASHLb&qf#%P;hC zv?7x*h?$g29p?C8K0#Jr>V+Uj<;a7cp;?pwW{W9H>zI`RO?IhK*)P4q-ne`kI)v+Q zjZ71ioYeft3S0%Mdn9pABFQe>#%ivlBg}C_bQb5Q4orM&-g<;%GMm?RZsEY&jzr;q zBNa2UV|w0u{gJ|qjM_@wI#h#f4(voDZ%H!nC=Flt{e$UfKnCb2H10!Q91IC&3a|_q zNboFw3H?DpRA?GyZf}}KrAlpR6l!}e+&(GwA|Dwsx;$K1be~Gb(ov3b`;e)3RK6L!xX^{#17B)o% z`v5K#49lV_*tID-Bk91|nxe;=Yg4q!chO%jBeq%FMNj!I(y8>dWf0vhYiH4!7zUj! zM0fQXo?GR3?r+zQqSa2&eRCN#>e^BClpjT+xj(;*+2h(2t%@mn=Ndt`+7aDfFGJ9+ z?V?q&i{9Q{qv%#SMR#oNEL!b|?r+u*-Kw9WHNI%IPtl=eb`keax2p(yWiX1yR3gO* zsvTJoOv}d*|H{6rDohvST6qiOL2<>%%3V5-LUtoUdXz>)QbXjg_G_OH(6HV7E&%xK*9=yJtVUhcLX7I!o$>n(m4my{aCW zuvGy<&_pSiouZHsPw(u^N@+_m7}m2oD;t&>%~O~ap#0~Wm9L!HtPqBxwKG+u4vgYb zG4J@FckP`8@`mLYp%b83uMFqxZ4jy?Vwf+dXIdc_oB8)l!od-iyA z-R$e%uxt08TNdWyYp2GQ>FDFHk*-#eE>Y`hWfCh)y8$!8^N2Ok&Bx!^ADi9zMyfde z!zcdn?;rfs@oTTSZg#$`XysDl2k(u92PyQ z5fod=-Wy>nmTx=drJkTCZYabOx^a6Xw332+U5&9ECSZ9(K`SuYQjG*Gl=C|FXBa$s zsKSQAVHjkJIcD(-$v_-M&Ai1qX=Z<(Iv4;#pUe)$l-wjMq0=vdTM-^5qH-#nvf57` z+sd+)QLBpBR@Cr1*;ba3tr89Oa6c52u?UEDVyLSGtG6Q570}eWmUP46zj@FjE)G|y zzMAU$Pf{X1jM^&}bHMJ2)-|FyNo7tawYV%_D}DW>>*@)Ds$HC6p*s`p`oXVU5JkLV z1{$3g9eeCoF0@ykAM@uVOv-Pc>SRD_Z(6G8_BZi!@X-fJ$3$>8xiFE5;LqPNo4<+Q z#@rpdE=+Tt-rg>fI+o=2g4)<14<+BiZcO1$MC%Xf#SvlKKou?%CMv1F8Z z!jR$J&vv6{z4`~1FVAeIb6e5Wz?3nUF=HGi&8p$fG--I0BFBBzf~Eh{;W+;zkZL0+ zmZ0K^{j4H6Y>u|D8L-sLz(oA4CmIY#Ty{H3DT3{!>-lM4n6igu%gCU`IsX7vXCZ;- zIE0BKl!7OctxRvaZ~oT|Ih>a+%>SA!P|i#5;z8C9vx(lBMSYsZK9`sHLY2VwBX7^f z*IcN)!l21kt!>U(YpNs{XpxB_jj7Xa;H1nM>gYxB7Tye4>JhNap_z9~>+^Z(;eDYD zU8vV1kE-j+YVZ07#*C!AG%nGh~a!7FDo0=Ay?*!w-^mOg%Ia zdTU?_-SXHIT38m$1C*V&r^ZrjIb~E;qU|WMP%BO&%33688XIj}{e00x z@FmeIW#&a-TMR!l+PAXGQG6eeuA&k=&@7H?ZKd|2u_Qpu#ug|vRH&3ZG?(qw0;h1P*X)ic|qw5J>wZ+0fp0oLI+aA zyEc--yA@?EI=lwD?{bZ}#en(vv%0d!Y8F%i=5dtepavHS1DqDN$a zSybtew&<5EJQ=b*p`$)eEH;&vh}9yDPV2I*N_1cye8&P?Tg<}R%^3vi5njPsFf4jY z)KfG?<#p+6Qv`lpol`V&L9;d&5%|O&7%67BrYB@80+6rG%~8fzJsD2pkCtAipBhO3 zRI@OY=~k-ek(#$D+8+lB6*Xid=@~dd zwA#f>k*u&9mcdR0FoJAuRvx`oj7eZis=Dg5~Dq#Xoofmq?%6Op-tCJVH!S6?yNoHz1(lr+8=;H&b0fEw!;gHr32+?{&LFmJ z5QVvA@-%d9Eg;XE64+76tD$nG#ez(ov8dvz3wfP5RirhIa4?d5Z{W&=pDj*KDHB7~ z@#jfe!+&up7W7|eXYTn~cYZS(`d`9Zqn^^LzeG{YtIL29)Aj&?^@o3Vc<3JaZzIf= ze?Owo@V!PMo9&r2201Q?GaL_+$RZ(ri~=r+LE#|qh#gdcxWq$0TH(LPC3 z#0@3xz9nb&=aPWLuDA=M$67`jH^$IQE`g+yf$W6wU+Bjh1SB#-3)29Qg&gLjs4vnE902%y#;A6%%ueBnttjJ~avlF;)vb(8Vw*%*w}~rO);ZFY%po zHH)S@G06$=A=>gOS2=|2ih&!>_v?U6QXS9IT_o8OO(XZP=n4MA>`EB&LVYtys9f!p zxN%Np^fX;PZ9)dmS3x5Q4Fl6avr)Dvc8uHBmTTDLern3tEtlBYo7#DO@*)$P(knP5 z>y?K8q~PSn!Ci&0RZ~lTUmNDBFP`k%=Q1;maDMimo?Uy`BQ%KE^q|L8u;s)`{{dJ< z|I`^oWQN-4GXM=m8rEmjZe`blwmiXxZF?~)k~Ja%7wCz4FwMGUmU0c7$@p2r@?-~B z%oUqV%Ub^I^1iPp74G--q{9EcOhWLkeaha@!c{%i3+Ik4z5u}Xh*I2Ra@ZTGx)`h<-h-qTF}+8QCl&_6S9PF`PES1|r?MFbJI%VpZ!;~nBkidut5-juEFnAQ z0x|l=nwR9pL2LyrAn=XNQ6uCwN57>R@v+x3Hn&c}$sH+r%h?dFsswzlIpR8jemj`L zO!8xPOWX8jQWhw(zTF8Ud2w+kOuKd`Oy^3Z(ZqA5lyY~Z38RRs&m_LX$5l*yhx35@ zQ!F#?szaGiRGSI^N^O=tsC)ANk|2N4iab7%&rQPoZeT{AQX(IjP4Zx}*j?IGQ^lkc}K?^VT+Q zV_-m8s4M_xDv=yS^P6sS89F-(92?0>!Q`eKON5Bg+?4+uk+nBRU**~)dbK(FS|SYt ztITxWl8Iss{&my{EIw26$hKoY>m#GP@pg`!COXn33K)W;WM(IyLXBvsW|Bi}CykcJy?Wv$y8MWnx0iadt?O zFzv~H%Bm!4x<-w6gxJ*-+NSOGxvDG@lm=qz=MB(ETf*6*^QJMuu=6NPNH|p;X-EgCt!YL<2eE8; zVm(P%SKLM2Jow-FOUGlPV8q)F@wxkou!+GrcvQbF}ZHs~DTE;N`Zu>)ZPCzm4ivsn^A)o*;++6~d z8&IbJ=X+A(Cy8N*`m7#)M2%}VX}-1a%YXXVSx0UWrabpXxDvUcH}Mf=a9 zS0zW)(ZvQp-;bb;tE}~ELud%h^q^tdb9A4Cso^5iMIk#YQ?n#*dRC@p$=Xk4YX0dg zP0f3YgP$X&Q9t-~gkTG)pR8|pJn^LXaCWqC*s-g4)F$)Da8PBsoQmUfn-(FMv^2>+c|U8d`5rMt1)IfXXRHVLV6$VlaD0l7T<8{!UV zS0iF+vmOObZ-Xdsr`Dy0Xo*gE?AX0g_*VvfxaEgD@8gff7~_IVv#{C|yRaY$yNPD_ z$Rh_BIDt9O+s)P6(Ww6R=+N84yxmvjJTmkKrmxiktzLVBw7Fz1JW!Qf7%F*Dz0xgn zVSkkm4(ImjC9l`GzW#E(A3VLno-&>;u_u{SVU$HJpH_vN>`{^h@oHRL#FJ>6D7=U#WD`7H%u~;v zbR1qE^O%I|r90fEJ$ekVLo3|*KlqV!fKke_Bb_PD$)1>Hl1JT-=`@1t#9Xl=-O2-q zt-}J2oLsvKx=kEEw`#3xx1bBsMiWXu4&Q&{LKIlZqIA9;LpWOMKPpu)mZ=b1arh^t zwrZ&??Km7)>O?ISN;c6ZiNp18;uE$q+5HXQ(ex2rE3jbks$ELdJ-#?KnuHs!BfE$o zS~U{~4ahrH#~6v(T=q%XJ&;JZR8b>)bJI!PqP?3eFUP@R?P+|MXm3l=9$CT%1OyvB zdq9mT<^8HvU|lko{Z6w;e4nyu+#pZiUnCBLCF+jv^yM85k2+|#b;MmHrpu8Knzf5+ zC*7zlb;%Q5$7N~RfRs`|I}IRJW1B`AgEXOa zo%>66MBj&rhfzzXfq-`@;z@&1$yPNBH85(l!)N#;^5RSA-F9jhv_78XnwN3S&#D6o5GGx+~`=cb?{F~1JZ%p0!=`mFjTNz zTNO~&OcgJ|kg$zGq(}$q48%rh(f_;n>NCU zlkU3;T22vUA?E0<;}9VL?kZ13&MB@iFOQ*8D5pd3$Ar)mZf=xY4qPKiyU6dNF)ljB z_IDaDcd#sUwzOQLKe2Mz>oNP5WpSnM9l^uiSK)hoixuwK!_ zlAV;HVmZQ^;fUbVjg=xp!=vTfuJZoMQDg}qiM72P&J}Fs;h_`gjL!&Ff`pjHdC2-E z)=MQVMnv=Waau#9snbjZ7ey!vf@QTnQ2H79m z(L9xqC@xYYMeT&J8LbYgr79OnEY28RCYt@-c(=P-QfGB}Id$lgC*SBSoNu>?R#%7u zV!@w-VpgmJU2$t!IbEls107iME~^7AJo5e-b)YNS4@(|*qcgGGepqoOOYMhup7s5( zk`wr}_rp?^kM4(Wu^*TP6Zvz5FCy~i1oy)N><(_{gttQhuE@;t+3WZb2>)+`kJi?2 z5LS|-Qm6v~pm={hNCuAvf)0&`_~mTpF~8n=CK6K~MK9xA7rLLaZ6i`pcUq&VNR2Edyt{~QI@yYH4w^1usQM1P#kn(+LLVimHC(w z#sqfYR*<mv92(+ zR9Zds5&#_cd7el}1a80`6AtAEzqNb<%}9?a!J$HWBgGQcKMGFh(&q{JX)xxDvmF4m zkFEgBk4?U6qqH=ER4|@*r9xsIv_)r8KHPlgktq8NqpxcG%_8I1+H|dxc?m-!%uO*^ zC~=5OORW|kR!6emHXv(WL@*2e3B`7e@^Mqb8K_-#Xd)bs7>e!67hef{obaxw3)c$} zspaXlE_Co{vUrkQg}kcifJ>AfU(rQqKY`GmZp1bY90vp^U*Fd$V|pbEF}pKQeoi#S z&n3NU`|EDa*Ujd;Z{2`)GDd$^mcu>SJUaoA(nLKM@jJXEr=P;1%sl+*~AuIG||i}Qtd$Y>NZ_JubTU4E%0{b;<@UdNRLAT!A( z2_)Qci?1e$tH}i=Mnni-4E`wz z6AHsIPLV<(+P;2JyVi(MAtG)lM?0qhO0~jCack{CUiLTG25iFTq7D?xujDca?W-^j z=HW{_{2nq*B|J|CHEpi4FJ46kx5KZoGd0!i@Im$o`(K1F+H#a0atj%ojb>jw8)bLU z`}5MyZ1iuzk1|8SbE}|9er1Oyk8-VaWn|wR)%pAjWWWGoRfYbOZ^i zxz@g`N?@jdvZYqYa)9}Y902G~GKFy@<$f&YyZN;Q_vhqVh6}tSny5y<^b^~Fvpcm~ z!?QpWwpt+tmE9IOJIUurn2J44+Xyp#Sd#D)gq(>grYAI@IU|^|;1mKy+SRCP zU^%L0OXb>>mM~nySDJbt;uit+OlUMNmF8Oj&`@GfQ=%3_D)-cG1_)52WHIr z(*3mjD@#wkLip!nELVeprIWnSKoKnO^(ayK!OlcWS2GfTa@!T4vg0X!%#3D})R-36 zZB3G9(rns){8Ybs*8lWvx&KM;h-?VudaPdvZXNDT4p?j9_|Kc)G@p*2!;`YGV;HzF zuM@En&wzctx zO<4{NLt;4e^d%)QPO}+)gx_;vThd~ckPXMVDBqQ!Ox`na&BxfbfO9^h6-7eEc#D48bCL)PI-ys|+Ays#F$8PbeU4Hd2NF zCxsOfq9@KI&{|sv(u_>(LMz4VPmyJeu?e7oB-Kz0D&-&{-N;)4i7SxwsQ(Nkju6=} zfJSw2Ll5ZuJE|rw ziqM(luA_|ePGmq44Kd<$4mrg~)(MMYnFjI7SK04bbQkKmzGzK2tFY&wBiUO-Iq`W* z1F6gz{+^B3S@365aoiB{eezXvgQ2km~oWZTBb1dIFC@Z_Nr+@D3 z3wGa{WA2va)T*a!Cr?2N$s2-Exf` zt7;mmojnd;Mj!7)lVqvqBNENgtMjW`v3k?lXamS}BN1jI2MxkYQtcM-hW0(X zp1=Vl>ETjQV!DS7L<5B?lD|R{CZe;q9*IIAM({rrnO!b`b;BdS4f|`xZ+G$(X2JtX zkY7ERwHJ;p`I#sPO{c98TNrHxGPt`PjzVe(FYx$-!Q)r-7>?|x3B33BeX?xB4B|(a z3{2lugLZ)N8ls6H>*DO|AQH_mCRgly<3&t3VCJ+<8A|D^b2g|#r2x@r!9bnIJz#Ao zS_n5$?6TMhJlStU=FkG;E{QihZ&I!(z9`A=GjR)W5ioKtor>A?7cq$_H%rTQNEW{i zi$-Y{p5sE|AlSf9^8*=```bp!!m%lCO`!DvJEpb6J8u#*ioZ0K3*_03pj$(IAj`1gr-WOIB^MpeK#m9;ooqUq%A z4f?#^iDG(P=2z2;e+dUv)9^)srO- zK00~lykt^#x6SYXMP$!`KTg;HRWRvaS@YA%g}{Ua@Xq`eiL@dN~#GMX>?p&SqpVg3WwU7pV`SO-iq7}$#=%ntIFEGL?- z7s3z(8Yw*k8c8#1w2=vCc!Xez*#?G^%tQ&?<75F@(~>^=@PIxVRpgZPk<|q$QKOM| zKSOCGMq_Or3i|1(q*XN!hZEFr;QZKEb^}I)m1uH+M4le0;UciSEoVh>lMvH9Dk zICJp+0CF0f2xg#>;f!sp88;xsq_LDUygY=iT67*B8-s z)ButL_c+7?UN8w#r8#_!0el1KKtss6HEcp+(BqOX$4}7;uW@3hfN7q|+}Klt@z>^I zlq+7F2QU;!;;F>=l1{A6!`eKUq;BneFlpUWvmf@I7Dw>5XDCO&Xgo!DX>A_r=k(e< z$j1GtKOZy?#}YRPQ=o(t^WjwfNw8YTM^cG1vM*Z@@`kI-&4e2s>0e2(mt^}9dP#DF z@e=~NL?%%3Q#I2cvo~p`TX~n?YG0--NJuQkKSH5O03ioc3RmI!y+-q{r%FUt))bPz zYymr6)v8*g(2^a6ys~Lkc2@F(UMReXk-C0LSTY_aiPG}v*=TY`Meijx zFqtG^P5I+7czH*_sxY(F`;6Xa2JggoNRfwD--lxOQXb(YBF5^wMB)HpR>{aFJv>79 zZ<2UShG2zQ8t6*P3KyR7E`6ocl#;tM%#xb&L$3=pC8{)aNm>V8gRS8{K~0J6m5fOe z6-11L5(woP!yq9TI>OCx;OHbt(39-Ex|eNmZ#W+Hda1v{+?M8aR=|~&rkpGaz!AH8 zGavIZVtav5rqMJtxHdc}UV*GaP=0L3md!Mk0!tuBNbSI&($7=XjcJ=6^`BLY?S+Rm zkhqm`9oAJcBqqH6j&wHI8F}EHgvIFpL?I(}5ClB2xEYnyv^0o{Z8;NrVhWoaTfZnh zvG316IzJ?`UzHP!3YM;0FrslfFX<^1a-u*9QZnQ$3wo3NrnZ}6MI%!!d?Hzv zELWMDxzR+sX4Z96nxw9#IRY}N9N=uMO#m#U!f?AXAp60&W}7I$XiOj?-rR_+!~h0F z>)!lT+e5oG4+&kZrq^yeZd$MAjo%gy;w7zHszSk{YXDBuw*zyV_Je6oXh4>I|_AJrCa&&Rwye| zm6uZmu*fh@xxMN^c|6us-q2XDGD5Ot*pN99x8BR>J*MB(@D2A)2Lgq`pC@2e78$%I@Q6;!Qy{4o8=>f%viLB8)zGg2ml^LRvFT zmd!#r`P5^rOS)(Wq|^@7^s9YtpokfkzD5ISBzqU#5g%Ph$^&{cN`Nv@;f-n%m1IW( zYs*j;>N9B)g(++^n5HoIH&leP@8G)QNVXf6v?fz-o~`-)&f)bNQQxpK4wS%6WmMKhsAdq8(@o@>&Y zftc8y=xvHk3}%q?IT%BvPl`?ap9Ojj>L{Fx;$NEyIoS*^BK?tgr5C3 z5Up%+L1r?-mDHGr!U{#^AS|p@((qEL)6(*>ApK0b77{UrwiCcc6pk%kmVoT)r5U!n zSU8iy{y!rwz3k$t-YgEJK(1Ng(Bx!a=7(xLlLm>5EH~8JN>shPP;o_!#UQ&WEjtV( zBI)@Z@Lr*&6z(R=(PdHR^1anmv|ka0=(>G87KC zSpnm)Ay#^#Ar>d+RHB8avs`pdhyJm3L|drOqHz3(E+`zWD#8Sn6pp>h9Ba(ckQL~e z!n&YvJO?HiRHgq)6D~8y@`zIfg#)}DJDRY>V03Hr4M(Zy8^NY0oy(np8J4{+Z-!Np zHjs|Giy(BjV^^=9Pfex#$5OLZl|lqMna7mu{SYCgXpYRXLy>_dOGVocD#aoJvB&kw zRSwBERxQgHEeQ04NLA<@X}k50Y0de-54I>=w@}mz1ot;hdBb-p!_#n^J~@SDZlBND zAydmZ@XM483;>ca6%Kxiv(5ZFRByPYgqAgdft|N4=wv#hg-iR}4C~#m#QS9gE}bo> znoN)rn}0gV3C8E!Zuf9nis)i~4=Mw?)l$Up#Iz`wHiI=%stQL+SWXz<3mD%E79ZbT zH=Mok{khusmi02ecXx~N{W%}s-D+}0<9osA_|BKmo^*Wg){NZ^GqB9~K5*m8$M^2; zGUNMGjPFk^KE5~Ia`wizUmM@DUdH!3tzvxpKE5}r$rX+7PmPZ6jU}`v9pCThMEnkB zn9Gds-uJJ3e81CLW_*8)@%^#I$9KKRYH~&6`~1=IJ@!Whv?m?k8#KN*EI+hy&>6zxYc(*lzmvL7h6c6z_a0!mAKP0GGuy{3eEz8#ErWWt2@p^otwJ%reH( zN3SopTZ}kI{1&5d^!L8({$+OVS$mCeTUEbN-sW)92z!fE6S7cQ0jus38bHfra02I? zyv5NkMwkCC-B5ri?S26wU51=k0ho3|OSU3`m}qdyHK1W=i8#R=lsIHbI-*Dk&a(4Pf`~@$@x6!kL zkd&CDmV*Po%25!A&O%pph@vR#sF9FHSjqmGC@*GoDxjxDAa4;XW5hY&8SP8rCU-#+ z;EWySA6$G&Xajg$Q4KsnN!myC$H~^%>ERA-ICW<>)=Bm;6ej`+(sRhv+#)5IRhFtF zOGP@H5ig!*A}eGV2BhbAziE!1ktls&0z_y(EK1!>8~--#RT5qeJHXGYJfCvPrgdDz zvMl19USa8KTqVBjw;-S%{wS8M7MJ)y^@Me4Q5uWjdAUUe@B*yDiD9JW_@d>3L_{nh z5)rL8R_O&;yov>xil|B>r=J|>UN)E<>2#x8&hs3GJGjZc0#?p*&>6su?OWf>df+2| z(YRQwV@MBJ#IP1NM>5ta>~>`1Gi?20{;neyFtWX6Q;0i{>@>{XkGE2&n_WtGuUVbsH94%Rk}1D|GG@SY=JA^}Mb z0f}dp(Wq*iDvkQZDvI9l=~w(nz?P_SrMO=Wt-w>;I*`a>eb9Qv(5RNh?Tv8wEA62q zH%hzTE7;}SLW(f(tSbK}1;9zdy_k-G{S;z>h1sbh#KEp^(^lK6FfS}PMTi@Oc@ZM? z$SZcQrS{H>W5g8=EFSy?aazuQY-DeZy`+{+1~U{RPJ$JIz^MU~t;itkOVN$hy|WVt=7+)*E~$aDyRX# z@y?|P;h|QCtR_lVdT#P|$xCi0x(;@P`8o(CCDf4$B-RxfMhwU`Zal+>&f4sJ;}tQ9YApxk_Q7P?3cJ?;bB!Hwa~* z7hvf`B8qY_v1z!3FSHOPFwHeao5D@;<%}zjGbY!O_=|P$@U^x{J#bNY3kZ|5M+f$L z?cjDG@}YW@f>D95&(4-8yiDQ^F|@rE?iuZJDR<=FA2`HZhN&>oEPklNO4+6)lVNhU zfGhE?L)C<2l_NmdV%n!B_cu9Tplx92ktP=|8a4@)8wbMHR`FtX-MJAWIdD6I2{-?V z{8!d#e`wk3i($t^N{t?GyU3t5YC=quKH8?&tB`K6M84&Uu=iGu1E|8#^U_Bh4D<^V zc=g_2TFd}xF3T};g}B%op(W%*K+jE&1=+yLc25F(F5Ctrnly)E%V*<=98+2E`hz31 zsOQqdz&>n5kt9GECB(5%={&TVdkAMnMaKU^1#bL5?P-|&gRYo6RBxOacKN63#pGWX zb+8s-nizQId!wkBPywuQ+ zlN-Ei`s*3!c1hui?kYZ+=0l%ikB;r1h$ET(C9P%q0En3mQeb}kS!&)M%0|eiGl|N| zFjOqsDn21lpQIK8<8;O%s*eTEG=*rI)^{Q&hVEl{IaHkhyc+EkUkF8t296g)LZBKa zC7dT&-NG9b!@rU}!ala?rd<{9{*uMBP^oTF%8;k1(5|Lg&?$U}HqbS;Hl#xaDo!gV zl1v~kIVkUbAE?4)uM$WrTuiKH# ztcNe*ncU-AE-|gQwkeg{qHXWcBqVm8>=5-Babh>NU#X>9DZ0!9RxzPmzEK8|imjl^ zES?)!F)Xsy@ppw=)P@#(&{K4r()76Ksd(xs;l_GTqwe1i$nb(t5sa^8-y;k=t~<01 ziHJgZExQwn2Syw#soxf#p`3PpzgCZOZ7=B>zFAWjkP1+Iy(O+l^P9y^N^!@?bCwYH z4M@$`QHE2rk==<+hdxbuJRY9bEAmXPi80d#KcqKZJ|%LK&!7*4NrKj36M%%iI@#7TB|T%%7e#6-06Qo9h`=p?D%M2i;Yjw-oh@VuvKh3c_ zxS_zLsylyiD&dP|M6fX$vW?D$GM1W!1Y?Z@fyZMow$L`d@sx{x(um z;T?u;O1Q&LGDK>G@tdQ?bD%)N7Rf{J=e zrY`GZVZfW{faCRRiB=qHAZClv&sp%YRjD6pu`!44)#eD4>UNf3+Sowc0s^5v>BHMWi_P z09RkkgnfU*ReKE@l^?7z8DcH58Pqaj^nFNKe2fLBA?KWar1s#DV3FDe zh2YS>_ACq@5BgMTJzTHAX+k%3wp3Dk3t!`S!=(1;DJ8Y{Y$muT??7le7by@ zt+Fzg%kI;G>|TfpQJ4_}EM|=!L8Q@OmoX4o6go)#>N@N?OhVm+c?xemPm} zdKPk;rj*9D|Mkk9yRkYUn!uPS9#K=y$4uuso6X*ia71rCdu#2eJ`*2n$~2^!^Rmo2 zqq(X|${Z7x<5@cb?8u{5F(kE6j`s=`wnn?KHvUgiFq`xa_ET)TR+d>A8?vc2?9~F^ zg4dZiQ>>~~1J!OT1YYd%ID35DQjK*e>X-RDUr@xTmE3Ka87f5-4bd}ZNN;$uhV+S3 z9?}(If)&L$_qB6om|#T>*=jTv-WJta!vr+`Bw&J1jyZAb!{cW3-h+sFhky8nhaj}NJjJEdgC2~^D>=3I-Sn&+2qq2=7ICB)N4L(qdLIoF9-r1Kg1=FB| zE3BzEmwk(+4QA!E9hfn6zna9|(iB4kQaQ*B5Eu@ z0z$uQ147u}h&;_c?t}zR%(>9DjeuKZEE0Q7qsJd6BKDl3VRNL9NpOf4n90-QoCdSE znmJhcEYleST3z)Cpmkeal|H-tU?f%=Zu~49v&rHCA?&T*umm$NhR=v4!#3!9u#z(U zP<`O$uOn#0lABIT_6D?~hWyl>ipX;^8y<*RJ7+{AkiFq`@uP70bb&T%wmv!p7%ody zLvVL6s=$*155?m`c;r?q60%YU>Bx+9l*YIL4w8(zB^s3{NjO`Y2Ju*#2J!5~?qa4v zvh#Mqv3M-nQTu7@6UW1(jX74SYCS*#N~k_~?`6-E!7Ar{A8`#>rZXfN=aF}tI<&i zjCuW^Od%qSUSl~xIvdA&*#E|bD73OYDM*j$mB<6DNGZt_@L$g4iMW_|p97jhG$M4A zhEJ=|_-G-WXeSn86?&ojRH!prNX+<&g^;>=p+k!nqR1kJB$_br9#EmN(U!D$Pi%?B z>xI6lLKCBfjM^C;2#OfTkjLHsu5tHskV8bLw9I>*%95Crq?e5FrEKd{V}Vr(*g|OG zO!;WSj8=Sf#YM{+&$wA2qp1N2DekfMVUshXWZ6=FQ2vX~6trB&d#w@;Uv7gJ4)Muu zP&~tNUNPOj+&HhO5+B2V?r~lbXe$|K$cb@Rx@)x|-!4trASflC(D5A6N4_GY)gdTR zj;J)L-kaeV9?{s4F`+W@_?h?}NnchWQ{x06fNn~*imuAXDL01I20OMx@hPtMQHcoz zW1@ty0)g_uuQ3pun=40@$VtgYouDPo+n!)U+ne{?-$0SQd)xAf4gDTMV#0gN|AC-_ zP&2pu2(1c9Gt!k)WvkG1g9(n4l$@#qbDynoDPbvz!IoLdgWnjig<3#R4&2brPF zh|plCDGP&Im=MBdotIp~&4mI9pm?|lh^zxJ1mwn6SGEC$2Q~i08JV%T0Gp%d07 z!V9X?2w8E^U6A0>`$138x6a9OgOf=_K0la%13&-a8!E=0Q%@e0l5Il>*<~*x!8iu< z795rlP_RbDg)KC5HD;O+T|VMiQpr!3BhIP_uYbd?4i=v51QBycf?ZhHyh_*e{P2n2 zKvIj>=M^H~pdPQ1sMt~!M*WH_!#w4$mI_L?&j9Md$;(-h)k@1CHkF84Fc+N?{>0&@ z+w45+0ZI*;L4#syY;(1+j!0p_Lcvl6I})vW$VCk~28dDjZ*`qfdTmHb(-#Nb|LlMAhL^l=lPUANN; zx@73W^deF|?3b_N3uQ@L08xFku@HC*)MV_+X^bx+X;wJC@!I&}U|{UVN?Bw$Px;N% zS!8BTXNt}zVcBfYx#BO1jMX>iHpR+X(plu3WtYmX8e)MTd9z>oTW5hEBh6W0G1GVH ztzxF_&6sJi)(7-WZ){+8K*=71C3quXg?@;^B7_TxyTtC0p?vrI8eYfy{#P4#eZMlm z(~dK|8m${|G~!010Z-RpkPs=!u+M8}8%cEb(_r}l}J+^N7$#MJWryiAn4(T`fdKB{*In|3OD*AIi_!_T51`B}}10+Z$^^(G1UYHE6%?EUG&lcIJ%l;%R@A- z5N4*Qj0c`TqLsaLXj~Z{NL&#WuwY>|gu7lZ<+cuD{XYeyI-4%`1z zBc_QoY6!ZfY&aYoGz(9=NV7$IXxY@>{x_W19^>S_OVlcQva0e&ipmpFz{#L;%}3EE zFG0;%->QLy>&gb0A}H}R>}wkCr%wmHPdq*1Pk;54iP}3)nT-7oqvT>{yq(>_*?!70 z_M6^O+Pez@-B!JoGWL55vnRiq(y;)`XJtC#WwpZS0oc|qrwKKU@yc|;X-Ex20E^-Qvp`!$J?X^;e{=fR+?d91tZdA<13D$&vxq__5ro66 z3Ckqsn(RSSW@Y+T+Wc=^RS4HQa?M(l-P-d>mT%spO{v3XlE<0~FA#ZkJT?4IF`4o6 z){(@C_K!8^va0}q0>>yIFnF9N4`xn~u|?QZ(xPDeWtx55?9+BbtH@Uf@MP+s44mEW zlh1n9K_}f-rW;N;R`>`9?Dpp3)vdGqmZzMF%!6FT(M*Y6fv0fOj-&6phXl@Md2`7a z2C@5*n~_0CWdC$rvNuWyqa9i3e%P-%;_0K26ZG(mm+Y}|n-_WCTT5_QC)xW4Boh;H zq0n9YUPdAl@>FF;G`rUw<*jS2(b${7NV(fQaOxq zC#X*G7oL7rV77x&Iv{bq|TC=KpU}^XVufmW93qhj%CoO`nfdFvHjr4=RUcl#GktgoKa{_u_T_xlArY*7 z$$3NUzW#z(ltaPU>wxEt4yZLARmZEm++o4R>wF!)tM%U+AXQ<-2r&c=ZMz4mBt^N1OioU=JV|{?XcXCBaYwDL0hUq<%_Lb0y;mzIusDsg z2UJi$;suaEHS+EbRx;GQ7I&}D#oG81iu%Xk8U`RI0j-YAfkR8d^M9`O$^G*zL*me*e9!e>0{d63cLcVAxez*GYL)y*(XIxA#8zNck;VTdRK z*612-i3Y?1W4BZwus(t-qj@9@7>!xOH$Mx+KO-xGr}qYM{_&kw=ID{53`8jnk9Hy7 zOk%2UMbw(YQI%*q1w>{zh18^kn=)2&Rw$eyTCeEkaTZeqmTZ6WYoYQ^g z4fHo{>Q8l`>!sEPdPOVxzn|7X*GoMq1ASjo`QbKUClK{XEDP<4ys|(di4?LwPZ$Qa z8@6$vlzz*6@Gxg%D<5lYhvDhB<$g|BP0I>BsJM|_#)B!4@qKV(9)3S$JBk=M;;VMZ zY-uhWPTW+*1aD|VRb0&-wdUB35SC_51sUnV1!Y$vgNtT(^mkG%;Qh)vZvNe+>L{IZN9x#10k1=R=Pkd-n<(2e#Sa7*T4jj% z;nP~S^-@bO+hu$E48lQPgCVucD5Mn!od z3d!z?;i-pYp$uwG22uz$D@ur`^-~cP9GZzSGI7Hb@-$I!m~xmQA32KqW|WsK+@Wr& zL9b_~Z;D60O-m*rt4}`2MhL}^ID78DQA0ct@WMVCc-A@=6arOB6S4b595bb$X#}Mb z0v2vz!_>5Z#k4}!CskMLlTf*Q%TvmiQ0GPL zUI0oULdXk50PdI`qUZo*{zwP9A4?;L_*DMddA07jk$L2`+MTiSZf|1UIoY|-diLaV ze(cBBBT$Z&$0P+E?m+|ynGVQHy2W!G_WtLED6ID{aoDf74dvVYdV5~^_C38lw|sl+ zhj{CiZ|~CEv&**+4!!Ny+q&}G7lz&r>#eHgp`mZzA9|a=z23qNdaEG2LvJrGTlkLN zbQ`4g@3`L1FW)|P2XC9ow+Hn$UA|rSVcse@e@kywkM`NL+0niPA91Br)PBQ$qoy4V%2vozHu z_bq5twT`EXuZ+6Lp=wlh=L?l;XX=kw>Xt?oJiw?5UrE}vXf8&!mJ93I7<5KTrazO? za6+qTV9?uWY#Y_sHhgRwqhnhujye^5p@Ct-u?I7yB?xA7gxQU7k)qd_y_b&=280BN zb8m-JYBtv$2*jLz?AX0nEmMi+`-eR5FZJu5W&h)i!BKC%a}D8V8*$nnHe=8!c^Q1h?*WAGcn^Kg~L$p zqBtXe^5Tppm3i^zP;oO~QbQOoG2vCb`a#=fDvR!v@>nayIpYtO=7(w3igXQSPHggN z-csv(j{(Bx1<^@qTUR)wl~Mn}4<$fH7FoqffgQ|-uvo_)ticA8MPX~0ka3dcu!hm6 zSD0aF4FibI5_8dCEMvKhIgmV~*1NC-z7oO`DEK+D^oc%|-UNlcKLcQ{NkvIxxJJrq z`z>9T)AbZr>uD|WZzTh5ylycScf|jV4I>C~*!?}39x#(~?F$b-TE21HK{!yoaU(-G zTD=_@%DKSX;p!X8bmBn{y-$z4Z>+!P^%n~B|EgKW?`L72epwU)goa-@#M#8tD=bY; zNiVUd@^)3uD$>rkw4A3+_Oy|wX?xQB%G}yYeI1^N?ohNw#0Mvp^y!6sx}1b0JQDFJ zOM;sirqB(CzRwR7jKJ(=M>;l)rc5VB<3VAIf;$%Tr)8?}fDtQNsEedceV+k+(ca+; zd)c7L@Gcg*uEi0u-R0kFQG%%EB4NiE_tNaK4m6x<9%jZ}=Rh*NwLx@-4Z`eJ_|My$ zsTlm}sVJp`*>x!6?YLoh3I<<*z?rJw*TA^O!r3u#l=z_Vp&;}k9_c;qi8F8V!) zDT!Ud8=j*uq@W}ALiUhm=*KRO6mQ!0SyGu@=t$k7aO5&A&%O)R^rv_CfL_X{44@QVkWoEZ)*8c^qQ-P|b{qM?HnXbp#=Y=szdABkxQE`)k zI%fNT!nr0%1il_>$*E(ofkem(Y{$}bAMmoxL5q?M_wf->>TF+J=zpOk}LN(_l zP%>)AZ&bNg!@2wdJxl9l+7~Dx^r{64R<%TiKnsS^5FYYXq;g|RAT)L}zotTbROOqR3&_@c!}>uNc3BYK`D@wVH`twPsDK#vTSb{9uM-s}r!#OQvgK-NFCm zqSV^8kha9eZiL*363}L&=7#6Uj7_5Wo8S-a+)2CRLLS3*sgHg(nHM<@0}5FWEzgd@ zz=-VqCQ#6UBBX)_1%F141>;lI`DS)6lWaAK5|L$6zd0vbkOp}bEsnJr8L-W^iLgo4 z+9Hu|3O0kKfK9`q8_Y$?3&#_Y$U$|WSf_HHK}4#d1z>)lfwalzzfh=UlpOX{Z_%uQ zufQ-y_CsrFC23Q)@3=6{isH9a1tbyOSHAsOc@SYqB8Y4U)s7q4R%L%C?bYJP4H01Z zR5)JPF2!!DFug}Gz=+0-1v{{)TC@;J!bVig@v3?UE!RHd*Q|OqR_MZ8I=iU9xDI?! zqB{5tQr!{06re?gMMWD6U%;VG58}YAq#_2Ii1LRT-4zWYXlQBJ&SVgahYgVSO(Bj8pM@UMJnj?a^E`wVF<*E5&fUl`bg$0n#s$|E}2 z8g7!_hErNZOtKZKk8=>B1H=TndzhPqjbK6c5*{gE6#j;Lx*h5BsMkyFH3@sRC?dN} zN)jF|OQ`r`&DF;x}KmtGtRTV`|FUY$K6F01GtV6xP3AC&~w82IAl z0s&^<1*(YF1V#2mRX{t)TzO!lzI#IDa|prted$%O>-&+P&+pm4Q_(Z6$m8ecO^>^( z0Ex*#;cqI*#}m97om3 zzO>M;I*OP{QMyYC?aI?gJg;SZ1`6%|R72~CZm?m@zJX3}8DWjZRcPEP|CN(*`P!Y(Q;!CmLr`-mOu@0D`8H-3=Yi9avbcG?gL|p#BFjzOTmA7N2 zTM?1RK9;}{*2BkWujk3S=SQvTe{ri(J&!yz@ivE5-{fY-GyVhXCLI7VJlQO|aUIve*Wc5AOlM4$cFPBAgfo({Q)}=`lvmJRBddS{La1{#*T~81Q@Fnyz z3D~`G)UZDctjR$9F{?kLG`D?-B%o+<;U`btF7aWCcJ(!qpMEFo@;kK69xm4 zvg~&}W1=COHw&3W-DvSr-jWGpj0GkM;y}qb-nXBw{CtE2;<<~Xael}DjpFO%k=bb$ zm+`_37?Kc?%-sli0+*j69%$syIKaZujt&N9RMm3N35#eP=Oz}DlDddP5D1XaN#(aB zw{Ti8fk@jLRT6|CZsN#5+B5)Orz=(6cCi}$S6e9mm_6Nrkf&N3VLa?xIO0~BZ%;Yt z2h?V=HOx1{LL`FIwoW3Kumy=;_?<6)7bFAId-1yfaQ0sOZq=&^E-Ueq1QwKF0K4?gW0`E*}0D3y$q8hqL{^65TZi&V4~kCYmG+BNd&J`@XOsi;<} z9H(FrAe<(*g?mA=i|{T|O3m|YU7C+COpkIJ=>&UBzf|}rzY_b}JTS_PwQI*Z)Mzn) z_9ZTNCh%61>Eig@R$N_ytZ*w(H9`i>xFeOB%GW!#SRcCwg!==g*K5{HJ610M2{;=F7 zATwHpO^}9o3S}$9=E^@g&jE(T()#2G?^Ins#yU2>Ny|9QUsK)g1zNZswj>RQfA7mB z@5H^$<;xKBvzv@V+z-xoR`y_-T{C*9d>JY`KUx+-%Z0&=`+|)y1LBNR!b*V3g7Hzx z5{wf|iTPsig+)z78rK-7#)*s*fi+FE$e5nUI2B88p``Q?g`F8+!IXpFAy>t<4A(W_ zP*x%cOSXDd(c+vI7__7obl60W(UG&W(P)@uB(70XMjaZpUe&%A#E2i1m`aY;L4xYA z8_^f3LZ3^~Rrj;y2m)_4f=q9uUT7$mSH6{S4uqP9AjH#Q55SB|8mdYz%D&&BN}h(b z2rJUKt*8~ReI**VH?(YU?L{A==HN(**Le@v-8+^V~tL?LP=@+%poaiBhY)3JiaznY&`uG_f* z32f1mE48~6^f}uKS85K@%9WY`2hvXV$qY4}s~krt36e2-J=)hYX>gek891>%S86xX zp*MAO_dCj%YNBSUxBWVK4G%22jh9nVu4sd4w5O|We0KGc0Py7KCI3#eDTtJ{#*mAv zvvD`n7D~P3=L?qH$#4ol>q(qPhha}R+NA#0su1~aR6p7*sl+gN0h@D`7wH`-tN2Ae zFc+REs6~vf6bYPM)B>Gg)-Y6-u=K*gcPxOY*&LUkIcdo`)6>8FPSROd0ZJ~ru{ro~ zvpztxXLl!q#G8~TVIy%G9;nswUzL6i>1dO0sOA5r($|rW>@|B=t@eM=hjaOWhVpl7 z>AUujE^rXLWPe(;Kz~K*_p%$t#L5%|dfff<1ZM}^mr{87u*rheMz5ie>t=ssA$gOn zP<2Rw5TuHJ;_LOqb!M;@5cIMjHrVk&-4??M8!SfBqP8QMF;Z_NXZXzTL;IIETEbcw z06L2(E8Q8ykak}gRvkHzRIpkU<_ux;K zp$!G=UD(5hUiv@EwJkQcl`}%HlQY>)4;E5ngwYZ+vpmIRi9&j62lIiw#Kn3B4JIhk zZ++ZDoc>q2JdXvCGT(?PZXT~xwR_lMTq!>;%kFweYRN0lO~sF@$V_t6gj)=den2OX z*2tkm3rtV@6CwFb+I4Z!8*$LFhZ%X`C}opny9@4b9$p9a5MDZ7@gc&0=)j|m#{i44 zBs0mw9ulN!ZR_@0@dda119aR>IKYnw-;cxjm%}+3{1ZBL3^02yAR`UPfX^Z0!6D

#qa$OdGnYEb2eJJY%D$Au!53}s@QS^Ge=9w2Lntz3fdeT3W;rA>uH6!Dfbtz9){ zKB*F-m=qwD9S3$M@6i4#ct%05-RRJ8k_#H~D3zHN6>Tgl%7-gDB$yYi2=Z^VqLmHZ zDbR+eF?1`ceYv4KDqE06dwhyR_mxu`x&`f7pQ5@zH_^ULIbHZ9it5n_dXI%04V&AM z((!9Rcq+ue*&n-JZb~dTi=fFOurmmAJ2j-)Q*MsCfoGmIMCvp|rO7X^qM=w>F5R#$ zNn)>JMxJe8ZZ;5~%9si|c8W@|iz#?N@^Axk0gIh-98WY)I>GUa>+b#E6RTm18M`q)!Bt1ivD*PGY-W zP|OOzb=%v@09>ZqSucXibWl}@Ff*V>=OenSa!znd_RhePT_1-m+3!n|)VUH}hJY=l zmVzw@BWRo^EN!O1f;RdEVXwL57?<{o$$<28*k8ta=r{Y6fib=cz{{VY#!;fVr}EL>{C z1H-qA99Bozt-ODui^dc!B7&^Ygpu-UbCyJHFCOl2usMP6HVK1n-h1uM!NNfluNHPxfd{r=8#z& zAEBZda1N&*oLd)kcRwwL4rUlFpPl#p&iVa`cqifO2H{} zSj|zMRN`t0w12{x94r118&$H)-x3pod83GJF=R^{^a2c>vce+%lMqAPKBpR_(KS~t>#gVLfcMT@LgElKnB;ku}n#;{=PjQN6-^MBfP>jyiR zsknwch-cw(!*qPj83SknW8JPP3XyGh>=>HIT``+f9KIP%T+zcc$8P>?5CEVkP7@E7 z(C&_@%IX!{c@0-rgwNaxHLsmpevy0iHH;Ly{U5q=sClT&5$@EJ_I5Z_rrA{BK2?+O zr!{0qTX4iIabMI@>yxAlb(lnL1iqQ!4*Oy%(pVx$5v|3sy*ZMo^tdUp7)wO!wtV$@ z2mK1%Rv*1=&OS(Z!yN~#RVtuLRiHuV{NM^y(wJfnETKoc3Sp4N(E!Qe(Fe*{b&1`v zVKa4wc-YirFu8@Y28Zr@n2h&;wE`PB9IT3|k|Whys+}bl(fPkVpy4<9y6_;c*_Xk7 zPyZ1+w7V2Jon*vzDPuKaH&(?oVxOtrsu6pLq}qr*tQ=os#NIEG1>FCcXezduW-0Oi zS7Li*>#XFBbj2~wU`#s#k#=AEg7rt_f5|Fzgg~DKKgb%FZopKVoKPM}fFPSxN~)(w zKP*jl04pl0!d4rOQA=c0dOzL7I%QYtu3ftu7x8<#Inv2Ar4AClk#)(#uUtlsgdpsB zd?k7CQQoeMx@`AKb%-o}6|Xkm_Ij37Sx9}>c6$G4r0kTZ4hcRqRC_0>iMJ7z3Z`Mx3%9_RBaC#Q{`AbqZaF3fIe)B_-LpV|M)7 zerq=0eXBMxna4Fts>>pbwQfb6iZwk}*+_|)Nu^h9sAl8Y7z-#D&8(zsn8YVRgx5He z>`2t^vNDIq?)Q?U;RKwY0`(|9QO`PynYCl3)QulN$Xfr9_8LBZ%VRcPGQeG9`WrU(lQa#9Qip0PKBFCtK zCJP3>qUz)o;lyvdmNG#klBq-)NIxN-!yso!b3-8vGO&rkJ8K>ry!{XDqfH8ET=+ntkJNqmTi( z3?V>JZ_IGK00)2)k2Ea7p=%qTLdYwz{<^bQDB-9&mEh5#GaCVIJMGUMoed?c5j9Nv zBgLH!zHI)`)_@p9?$kMcmUpp4qm8MB8GF2}#4q_$*b@P|XsfM_sqB~pErEv_vuDkL zVuBym@TgJJUkRK_;PwO@wgo33WgcLWL7ciK#Aqp3u;8&A_TM6}RgOJlD3n*M9_6^* z?O{R7Gk^dj3)wLg4k$;qaI*?UPj$mFh#Z(4o**y`#T&s5#V}#(?P=&w=t}6tY#lh1 z)O$dJ-dYzP=dRZWRNu8uJj~tHUXT>nXm34Ah$%46?*sCyF#yw4R@yWqO5YqHd_YHR zIL}vADzRYwMe;XEd;>h1tpu113=FO#;DzMO9k9)BaQcBoAg4~08uAu^;h{;;=tWfF zKtwo6W}00(RD596>WvE#NJ0SC#Jw2Jz>`3PD6_A?F!HS?rzje1m#x4cZ5F1_>pFrY`x{A^n{Yb9+Z+kVn6kV z6GUtr_vbQX(dUV5N6zk36gk(sG83Job8Bi&7SVb#VDgN%q6^<_#@nul+U8q z#MC;G?aSHO{63tUM-VnHEM(a_h5|K_U)Dszq>3&v2WNtDK@1EQ`+_MNWW5{AE@sP?#pL*KX83RT12lAie&&%oXmw;_t$kn5IR_ z219U1NmW2K+nBrhGyo2Q+Jh!CGl|Y{0V<$jLCl!13qs1*i1(yGS>9Jj+gD*SIq?FX zF-o2MeR4+)y0CdTQ;@tvNIky34GJQS&6#^8MaPWaF9q9?Ly_p)5azPVj21u@SdMQ8X zi^y^?1X@EH8TUhXg@Ztcaw5hxq;ieysyv~0W)}ziu_S@r0zK%jb1Iu-+B>w>k!?+yqoR~H$o!zBV`i7LTnjUtqVA8_a zAL95Z)MTl{k7d>5-hzN_O*9xnQ!XhVeGfD7TAmSfUp}Xshu?>g{|U^fCudG`NIud* zXKu&VlQTCrm^;jVJPC7i*{!=z!rUD3+@V=#?jcc#_DKpc9fjCG>u%i%{V0o*GdJDL z?Kw$X=eS!B&I)rU`MH_-xlOae+-BjqWhZy*bh~x?tT49^`ca;8a^|L+xyNUvttVk_ z=G}V#tT1;H&&@n@le5Cy$(fsZ=AN5%<~}B+z^Nzk+;n(u(|b?Kt#gz3x6BH2Cu!@< zyLIcV{M;Yzd^jmvuj1YM*+Dg%pVv%8&E~VZd4WGOYni_JajLwUb;1MB+;=n+aprFP z1UK9HV>4&o{&>#yY15zm1FHN*auVnu5ud6}-E+Fx^y%5AZp*$$lJd^Q#oa4I#i5A#>#B4n(}YvcD7iCUxacC zb$F8Db72wgZjR)8D=@~$a8*p=DMiPsZzuY;e8}?hd3`>W&1Q_xD;2=Z-==n4fjnl;Kh14UI5N0#OrMC(Fa$r2k6;!|IwNZS3itnSl;)bL z*BffRt=1ZL>#Y%8+i3?=+lby8q1PBIH*`laZ(-{tw*pm~wkpFcNk*Zvtgz%Q{2uTh zRXzDN?E2Dyr2M7wNq#I0>YmJVcL%>;SV3+^7y|XX9OjR;BNY|^# z{~V>m<>g_k5?_cd$Oqo~5DOMz`DJ!eMuabUQv4(fPP70n>mtC#a;{t|28}YE0ytQh zQ(2f5*?^-KGm4+U7(e)S5e3O~$q$8jlHWkc)={SCrX8x_3xHFTe0w?fLGLa1_X>WL zLRvelMQ{Rtu*SEr))v1i@2UxWqp@si@3={rU>SLj=-FDmgtv@)RjE;mW9R`_e2lM@ zyRXv*=0i#orcTh8^C%xRNNEvFtNpu{l8^efQWsQ&GZuw@T%dYX?xQ8o0>T42!uQL= z9Nu1bsfQ2m)|H)ICCvYZymPGLCUr4t;?Cl56Du^`8yp8MtYQnMb|H{-{^GP}ckkDJsAS ztOUrJi<^wq0bhkDv*RnGOeW~g6A@oc9Dysr$FaWx$$+Jj_Jb4lcwt%!Ug zs5`1YOg%P29s;SHA4Zt1bR7TAQ5*$-u#_R-%z!5($2frKaJ>S>vBz43J}V!PJDUhn zg;?Dag6b+z{sB5BNW%+CfuvpePI=&R@LK2qB@XrOT%)_Beba0h9dC|2*XHC^TszdC z)Vw2W7@cAZFYqT|^fkC^fzkDI1V$&h&ACZJgEZ&vjZ-i>NpBR<)hK^Y-*Jpi@IqUy z9f8rkHQYdWYX*#74sYxXU&c3u&++#^Dn2I&tKkUpDk)0Jicpw(@d+I(!yRvvO`^CK>LT+1V-wCtG^( zPIFDtIVU-fvLT@~y*$RtYdhMxcw;JrMj61k1x=Qd_u3G+J|k>r-zY3nsOfpL>79Ur zQ%2;sv`;Zy9Jlc4EK7Yh4|_^K?_}mVN~TglM1D?kF+UwUO+wG#%H8CB zN&xg0f8mY(^9E>Arf-~?y@@x~nz9!h9x^(+R*8T7ITsLNZ4h2KJzFPK%|15&pYnx| zs%0Ln&o!R`MamV7T@;a|?)>o94mB19wr#CFUt!(QX%*(XL@pv04^N^=2&4wY^tqEK zS7+FsSAH5&$@=8LOl)ItL8XEi~_ z!bl*?4nO#gt@OJUOcFk;Y6>S@HI>(zQjs;)LMBjxE@+jSVpEIhSnX{Pq^mo&tMO98 z>P;O}(3I=^H?&0T+p#XYKwkE8(lU=QZD#AL;E54xG30G2Iv~$SAZy>fXb~-Bl0i9b zp-XmgkH>QaW=sKpYCsOkd{1bu3y%bv>ylfH4{A%F!w)RxxqKAbp}lfoi;g;`ZEYST zoAU4cxa6#2iL&xXnYIhue^#DbZ7AKHQ&Dnbr}~ATu#21xiR>zU(8pPXRs1}3gFfEj zvS>{Nr5sr|GHlZu*#xm6_0Y;+BOgvR$j)8BrH%iN0WF>z4*2=WE_Q!+jt% zYyJPcVX+HxHYR!GXsea9n$0vDQe?-}py7x2_)OM=h99FWoC~e>C!m@AsjyyJ-GD!( zIP3a@G&~?6q4<0}s{~JPV)d9|x(jE3k0jS;Fb{ru0*>{tD{`yG6_cnThxa%e1sKb1 zwmOL-oQO>J2qzv>N95CG3Bb={orIH!b&^ME>ak8uML0DGR-y}#b91k4sEk)U>Iqhi z$`HKHGA<-mO|}eV4mS?mKCCJOs59tM8xn#JmRxq=lEn<4k_4m-z0#!lY8JM+-c&TI+xEn-A$pPXRr)Ao68g=j4> zo(WXU3OO`^AuiJn>n%1(|A(=_V|%1CN+4CJI6`2yCVXl|YAMR3JFE_>uHJ-al=pWD zj+C^-wzo=-R2ZihWbB-VR2+P$76=c=Y{HrAJ>n^SNM)V|(FB}cAUr@}&=rGN1VZgc zv#i<2cR5x9i+a@Enq+uU!g`2ODbv3R)Z$GdQAeedW?O1!AAXD*IIwU=)t6o`&l) zDinU6l7{Q^DxW3|*H=`oG+eMt^=w-&#;;DBZR`CbeJY%f9-kR|{4V;g8G|LNCoa3` zZpt-d@U->3Ww)q&>V$njg)J&G?O$m0@|j($@&@HoCh~5Tk5JC>ZS}Ne-&1GwQ6}<; z>}0o1KVN8Y8mmBE5ueX%@Qz3^*tC|4T}-5ih!GU{%T{qaOs2M;2%FVinBh7f>!B^? z3pCLLXE2h2r2PCW?}lTTq0On!ra!OfBix9xThvBR>Vw{CsX{u_)(A&Ty5tU@F7BE? z93LTG=p}_7K_{j(02$Jx4;s6~u%*~HX-!O+0AJKn1jvxS2y%#Tx??6a7u?|3#X7vq zrZ6i%{KSW!NMK;pmDfA>TGMi&6qCZGIyptJbu!B`0Rv?!E?`O`f-7o8&AB^PMHe!2 zP0_`jMm9{_@hYmgBpcBq1=yn7Qi?o94Y_WMj=OLJyLF^)Yv()*(Q93ZX76)i-hvRK z&+z!3#F!<`jLjl^H(-Mvcc5gb4`;5LKNvJLk}*mGWXp%Hkz~TmDtlvje|4v$MPIl& zK0{tAw^z^3u0KK(b7S>{A4BBTrxnhq$<@J9{-iAtR!Su$C;+( zV+^8fmCtYDMnDi4z6v!+ z2jg5MrY;en9v8ri=4HiK+yYzN)bh+Opas^|>_DN)nc4F~rAorUDhrdznhBsoP7oUq zihu%`jc11>Ay98c*R(EN0YV7XbsgE8c-eyJ>=V|Djk7fS9BNA1RjY5UTD`c|D$o`r zYB*9bTA7x6{`k>^V$h)iP0MFLg7N>4NL_N5up3&Oz`>FQM2Ty}$7;(a=cY(I<Ubs-I`%iCZPFK*v={{;Z3s_^CmjLWN$m?M zI;9_qmM$(y>8G7yS|lgErdMatc*QhS0$H7aP+W`dO6^#9#g=9gb&f#FH{R%66aF*6sO zIYYN#lRO}pX5Kyy!^VS(N_yQojT|N>iSHFd1sX#Sij;O_`hr@akDVnIY{^- zEvABv*;N@S9b}!BjSLNP3ERu33@RGs3m?Fgy-0UtC({hIHQk)E*?%S;ZJLb#?o@~(|?L^spNdgn5kP4 zO`%IDYRhZ&2ta}dE^p+z*fmNerQu+GW2No(zE|2=Rf5*lEA3GwQAAqWTU9~DCj)ZVQ?l4YCC!q_1w!Wbd4J3q{3ziDV(*KidwJeVgU37TLLgp-C4dDQ%xWRWaUHpL{a zbRQ?kl$W@4q60+X$2fq`!-1Yh-x%r z6+w&G2USrxSG;LSz})Pj!m4UY5TN{glX{4y-yz&@qA(3pZ?0JwqIS|jDId$_*;-r&zi znOV7zN8+J}agH=Y!;7;Nb86*3u*$V@h@EV(DoIR68}I_1@NMWLt^z54f@iDfCHGZw zqDszFtjnE7+{dA@~rPEZxaW0=PSwt@1L=mCN0=%p6*T zW}|DF%$V+4wwkM!d8kPg?C>FZn8j~_;kAPSL22Z2S&Wrt>!JG&Qh-;REXFvpiC=t} zvT$%7NhoWcXsgt1bEcDFR{m%Jb%XAMZIz2oc3K3h=!_=102g^nIuYjodFh$i zg~Hp#^Gjh7rSQ|uk0~Z)Qt=a*aW-@3$H7;N6%)rwqRK{(9HgF$VH^gqp^2Pn0ayNpld`MMrJ z;ad+R;f%zo#ekA*Bg5n^9m@GH<%m>Gy~&r%RO0yziyzB^;Sy+YD`+xl7n=@EfB+fN z{RReD^Q+_=I6S>g4%`sIOeY`YsoJ+?u9_1{c7fIpJJ55)G6VO(O2`L960tCK>`0@y zbCkY62Ona|vw%W#+0bgT+_gh$@0yNBf=>3?@N9M5CRH(%%52E$^yT4WJ5|h*d@bmY z(GYc6YhJfpi6^@6#IW0K?Qz_*xf@J3ODRSvfUK5@)$URxGoLGSZ;|8E)I_WPnECW9 ztM>(xy>R>sZVj^nL)3JJi1h^#pLaRxPaXFObchG!CpDd@9>Q}gXCqhgxFk8?xV-~A zfb5!!+06Y!UCuGbyNswA=&%LPj7!xcP6B5!QC{(+WaY;fOvD<7Nxoo~@eX!IW)YW- zT{2eda)m+OG&aT41KOE)FfLoa5tCj{J?->`ugiP^`|oZ(cG~GC)&4vjVY#2Dex{Q= zg7-WfTGU1)#08{6iHiwE`LkHyc5FkJKVC z0j^`xLXWu@r-K3x^S1cirhoyC`yw=lEVQ7+-0Y|Z%|@)D92>jJ1)G;kH!s!KP_cd4 zsZLz6tO!>zLshC@Sc!2d_G!YX4-?M9wThk0kiNiJ)ge|x?q-0iwRju3W!cT-k)<{D zlP$o<`WeJJyKUCCI=gM~3sDg-51BEJKTe9`(_Z3~qoZB%C@UKMXSh5Nbw<_dxlia0+H*7#p}|WaP*hNjC;+4QZeIjNF$YzS60r?0{P2 zj>#BPZ8wTuOtjVs)Ryy+V+BP)OU5Wf#(w9tOP@RCsPyqJpCE)-MIQ9J|&I=ATu|Whq%%wL|c(wZk!LGql55r9wiywW8JzCT|t??_GH09$8R2n>7X|9mir@`3@Ivg^SY?00WsorK;U`cs;paz^ZR{Q1NjMXyd5?UT>=g@R02e6TTSL@`lt;hb&fXF zAO>ry3e&4K4kvVxiZxJ68YsnxqmjmF3->mtMGfRs%EI?VhND@SEna(GSzOcNy*X{O zk3bXQ1F~IBxUeU2XL`FUJ~v@UF)zj&0y!!W!_R5ZF6sho8_r2iO6wR`vYtsBDS*VJ_}o$^gg&TGpfvSS zT#U4Yre~FN#HN3F+5;*KUbJ9I*VfI@te{2n?MpcuybNRyGJu{Rc;R~k!OPZTg%{j~ zrjaECg3mN6cxPRnW4W2V9iv@4oFXlEHbEeqQ^EXEzLx~#21J~x8V+5Q+ap}Znb|YO z-#@7a%Ew1H6n9C`lFfd7_FIBGjy*L!F?fX+o|Fa&s4`7IlfY*E5tG4_ZFziBZfDPMkd={-&d~*h^m+3Geay6~jPg71balx{IbBFwaIjxT1EQCaq zHH5#*%5JlR!>);o!lANp4;PQw`PGOy(!&jpkGcRkLMx-tPGbT%3qY?+3=*0&3mOP; zRQflA;xO4|bv*n1S+DTkoA)K9PM$yy-50m;+)X@?lM#N6J8P{xs29d4M`8T8I9;iA zR!zk1h||`M2-VaLuh7gq^8V2EmHnX`Uy0>}Zrqjk=HQ7~4w0>wKc#Z40|<$oE= zQMlLZ|8;1mcqGhMH7~dJ$9ZgVYmC7tP%@bY*@Ja*VQA8z=k46n?6|02-@Hy5AtDk=h4?f7|+ZIVza|8 zmS|jy0174%k8W8Q-W9iI*^rwu9pQqRVamYv>oI?mbFk-=D zDd->@qDn&?eAQ_^&}sbpY-{?C?#O+e5gjdf8hSG*P4O}FTd6t=aneXcW5RhzCNV{x zO?2piv-08c`P*=Ye=V2+jK1@BuJ`cAG5}$ilisfXUq_Y^^y0T)xnc20p6b6wvxQ1L z*NDx+g+Hz7$~1ul)d&Kz;tNgGXF?`Xs063D2&dz(!6`-uOUr@;1u$*n@XW8k-o{s~ zl>uH!d#@OR8{icro%j_)akW>H_Ga;I8XiN61GOtqV0p!*Ce!htvowcGjKf9DSq9|T$-A=U@KV!UD?%y> zp>-r6<@mun7zKjq7;sXNl#!Q=L@9GJPFlnBPk~)#S)u81VAe*hR9cL>;D;%OLhDYd zFljrMfMdl=S?JT}v*~0Y8=?(eefWRf?t@=Tp zk*Q)k*KVo^W{p_)epOmj{-J)vSfKsir|Sb=U@z}_fR{fI>>T<~w8?y~vgz5i!b9ElYb(&;^VQRTr(wCSPHBi=K955ItG!vwnPlH7vU zB$L@W$x^?(ipx{{@@g(Qzscqn1Bp-toH5RzJZ_cCm__**waQbtlABShT*{U5h`}AV zU_9t7DiGsFHxzrY6=dtodB`Bh^6KD9grnF+sz%elX}c4LHolYcviaGG<0U+Xf~F1z zl=b8{PGbX?CI$dR;s;vMkSF{1v)^OX4?~*OUBCNcyn8{<-UCnkNgwTP%)cA9o-rc4(uRFmn)uu)+7626`R9)qjv)Lp|= zCWy*rD;=gKcmX8lr}Y(;UQQ7rRqOL$@UU?9M*E$a=S(>OfTH^qsxvKXWi-UWM`FVY zKED=Lmpi!bzZ1H&t6OCfYzn+&?&cb%cDW`5?``~+ptGOACabC-zdPipBo5mAuOk@akvPFeauVk4-1dS)JS zK?4nni5h4+^a+gummj3af#6~wwcMQH;w7{`2e=rhbv6v~_D?k0KTD4YqVaK&+bF=h z*cuC=$)^jUF<_{|XPP;XQSQ(=_IRV^av+iKL051zL->qVw+fy?3`04iEF$od;t}~_ z;|d(Auo<92aMLP2y4cviYotW5-7R%3aK{EBOlIsI_u(`L$AOwb!7?7XO^dLQeADA) zP7Z%+2-OL*`XBrGUj3i*;qU(WUj2C({%ulxIA@a-yHn$MozE#ZW3V%enia}`C$~~; zAD~uqD{b&!+Az0LL_B90#S3}B<#-AeNQ-;qA0@v{aRR)b8+zswXfq|;sO7zn>+zQlzf5`NTR1|U`yccB4Xx{bfw4VO{Amvrd7_QH@Ey{ z>XpRdl-F7u5H1Bi1I*n}=^<)_r@adkl!+9%IKE(B7qfT&*B+q&PR(5eMdQmV6PUT& zpi$ljyNIEoCwQz$wl8vZj~Ut&Gz;^`TIR*)a`~z=0d96f{DHI6GuhsFe!mtCUCx*% ze`ai~GQh!wMT$sq>go0*>k<(OgqFDk@kHx1-GY`IJ7~2Rd)~Pla^>gX<^9Xu=57y zPfnBE?lT7RL}nR2dF)v8oyrE6hp20F>NVNWqlb!{o0xJ8i{$WeK<4oJf4g}-iK^Gf zu68^ z{hE68c6XTQYqxf>HtZmazwU5=Z|l;FOrHPhYcrVS>oj|6FGV{c z#|H^tjjA;?G1dZ`kgaAOGFBn9-eaAsW=t$Igc^IKHdFv79{Q7RunZQm*qxk;lT&dL zDo$>YfW1!QiaykP5^Xx&J4r!K5>w|*YMjpOxZ=kthL4_KOC|{hJ+%L0UrpLUJ^U8f zdUYQU>QRbno^r5`r_-t*)RRsdd{Fr04=$wlLz#1sx4qvwZHa>P`lBXBt6tFUk{v1=rjo z%E$gvLBqI5NF&&>zLyVumv^QAGL4|CcIK`whIUCuQkfP}hoI$5i`^qoQ&$!D)DfoM za8)rcNx?gSwm3sc&Ht5_prW`{{Y%K4ma#jUT9&;$K z#YfiiRM8Rj6>COr+&>OY%D1FgL~~UM)TL7U;*4Qpjy?lgTu#4*Ql+vL;jqLK6yQm0 zo;1M=6z#G+X=F13Jx)1XOGOrx=^l~Hke#g+zA)@xu)GyX@g*E}XkJzlbD4MNN2r>n z7Mq?X4w4i!#at7hi3v*t#%@;7nkD490LQo$4EFvHekm#cUHQ-*UkX;6$G9rbDmU#2 z1u}uzblf2J)<+E{cX2_cGj%7LAcvy~vH@Lb6x-EL_g$$hkhEY>AptJtz6z5}ORH>t zE!KxY@OCazl9}OA=a!oLKlNlgS{ZWXNQe!DWr9_#ytgjwHi}PK4{U*DCov0vk0Dq~ zG2hMBRSnLaTdgx8!*%-xSz#>C6uyxXY3l^>3T zUCSDi>Bu61n^@HJnrf`7u2z$Y!gd)EuG+lXbHsLQ!zsiY15E?FqVE(;O7b|;OQu1zBJ;=A^zuJWX9oUdv@v5#nU1G=vK*L1ioUXwnTH@HtH<+d z{M@oPdbewmwQi!Cpqo5g#pLqSar4$nY*^f_AP9<|vGK67aAShSMZIZMglsj9^yu8= zml-YR18J%l^aMX3r&auboI3n~oU~O&eO}m4@;A15PdaV0D|JF*=0)Zj?iftiis2C{ z)=Ak|t8t#4%qkmp!)(~i%*;gnhjs{mF(zR%;Z3hnw_p#;;tI~}S+L=g;7O@TOquh! zq;!SF5+_%$w+Or|6o@+)*a>s4*wQN%2+TZdcx*5Ys8N}s>j$k>rf7YpX2xa`eHNHK z8qgxyN5Jq>rx*^G4_1E)4F#~?PQ$0wj`Ddj2j zRGRV5Q)!Z97C#0J*@B`OnGE2OS~#u1C!n|!q`(LIf)D{EmfYBzgUXXZHu}Es7CwjTMa{>d2LQQ-00!0s@W+Ez{>8?(oMu?m85v(Bd__4|@^sWqXVEzc+_&s? zv@UiDx`&i*dcX5wej%RPWo$eh6_B5Qni738GfaVHr&jls^c!BggS(g2vLZF!?u>QD zdPVfOeXkg4Lb$SW@)-hI$ulcK!MrqE!sS!{fmZo&cc}ay8y5e9VnMTXn*UlVYoe+h zqCs27bf3(6Y<_z^FFO}-Lv{zAhC;rZ(hZmu4wxt>57C>kCKpfXqQS-9*gu6lPJTrd zGcF$11#_3y4;3m`Y{dHx=7-|LOcX~B#Z!pNVk5(wJgjCdgReYN3GadQTl!v!e42Ee z)Gq5ZFYB}}I}=2KV`KxF)W{p+xooq%mX+Tob+i6R&dtf(2fpg&61{ib{M|%KZq(X@ zU&4CXvJo=ZHF~C)Jf2)|S~t50SOY&HZO{oxmHIlugT>QU_to(br(RGt2@idnRaj5g zGkuva-XFinTJFx@=48Ko@#crFlpvESYLuB6yBHYX^mlYlLbcKcP3nf8dJt%<7TphA z5p4V`2p>OTInAGX9)h-PchPCM1k^9mE#%`)4n)vheJ+BIqmh-=CNtzF5R=IG zX#`%8O87XFoQlv_SrN<|GSmpqdUzsDt`@tmkzV>87gIll}?$q6^6&tNH}aC&HD zu%Qnam-O-sosYi^L;vhZ`-dsW!B>hI(t>dscmiNOY_Q2}N$X$>K`n3^Zt3jvUuR8# zU=Gpp6Rmgm5u$re?FlwRzDG*LD~`oXY=`r22NccJ&I2 zu2-yE;Omx-<>t*C4+b`H?WFD8s(8RU+Yg6QfuL~(xuvp^P;F_c)8aG2T;eF`RPpPO z7>CV?>_YZCQlG|4C1nXPT#)f)uJP4K%Dl8|l3SievxYL*;nGd{c`Xy!Z)@Vq@u4AQf&){bYAF#L8TIJ--Jl&2VqsJh z^c@ZGDt=tkQeKT*cZEfFmt8|2<)Kfah?Ez3`FOm79mq`MZpLeY5qJfl6s~)Xzc#bru^))}DQC`q4X1|VF0h+9u- z1Sp43uyQ~lqHZ1GD#T4dix958DmaZQv&@h$B_uKcq|lD`G`HHF0{NWgtO=>RmHZG& zr+`TqqOx(>cI*EgoEK`I%G>!ysG7t`Cqa zGXcrC`loX<_x?apCA!B?<*l&<02i8k+6uadog8MzfrV8;Y4usPMO1{|5qkwt;y4XzCIFq6MR&YVWB>tU_qLPd(zzh?${Etw-QSK*-{5R1PYz z{i#NSdgSEbMSp-b@iEemom}~!2e8MIg0w3{C}vw6K+f(4i;Z^h1~Vqo0I5e6y&x{U{UZr{p!CT!7~VAn zhSO0Csh=ymO;b2DInYVynEV%)2@i9b+A-NXWH)C>p!mjRFel7GD+e=TU_{vi?ng_5 z_Gs;8sD{45{SYT$qOcN4Ag_ibpyC4Q*U;E7i+0{=wvLCBu#HK1l}Uh1UAceP!9=2n z+T~eE0~Zw^$$7`j?j)LV{w|fP5z>r49LkLe zg>)D1>rbb7oW_6u@6$z%f1-cqbeo_*>uQo65Q)M;IygU%f ztMUK-f*Ak)+d>!FF!lVi*WOM!Ln?lN!B3nEJE}aO%3++pUjvHkRav-$T&?x;n?oab z!xeutb^W(3=<(kYyFMlT?5%NLepVa*?J5+oFwO|)ny+g7z{LU`|KoSj^=bD1ww;ud z4NY733pEh9HuDx{j(Yh_^iqWM|Xtzs^I^&1+o6s_^0guo9?FHTGF%o z@!u^fXa5V->nQMAm1~^4YH;y&4PN^KB>K=)_+Mb-pMw9Z@w5JQ{2#~PH~6Q*B2UHt z2UQ-BXv7OMt^Z_D{E!b8?S{y|_?Kr zSqSMjbIWJysLS5uC0>Ock?2W-=IXUxAJ7R-aFQxE%a1D5zoo7~j1jH*BCo=uWOT6q zv$K8CKW86?Nzgof1hb)>l;CP|SAAjQG3Ku~0~#Bj;SEgyT5l$yN#80)lqUp`l-cFz zg^eXO4^nZ>tunt{ydu0G-R3A>?0%d>&bQ65(;c>ZDWrx>0EG|j4Eq(SN!3T4B4S)2 z%rb@=W@Z}x)w_IharX?H7r*wVrYn*!a36feI`RG7=^juo0wi>In z)Xli8eFpGY*mE8-{lZ|*bOXB2-A;@RaM$Nq^fI~6y*Ge-)OEgsO3u1&a-P(kfb%>k zIq%6b@*nGr+XF5GY0XOx-q=0)JC-Zu^nBms?~Lav+RKGBKkGByug}iXqxH5;a39ti z>=b3=dHY$a3lDQP+M0>%c@}toR{Ru(oSmnZo_zlW(sk>Q)_hyaFH*!7{R%nk<7TsN zcsQwFwXI*ucj-4)+QCgHKP&I>LtUM+1CE*SnpgPUUcJDJm+1EN{D3};ydtc#U$2YL zIx~BW%W{9Zp*WLmXRO!0)Ld||O-YX8-0hRoG{7|7FBdCd2|xB!c*SEq04VU1d7@k7 z11oq?Ye<0H>sg(r_f1Y7eiwe`VBYl~)6KQqoXyQHZno%#lYQ4ua^oJf(Lkiw#hxCi4GyPNGz=yt5OYglaB&W(eR^%jpll z=ErOiAs}ceLN?XUm$rkLjCPdjwn(t1k?`iBr#bkp6 z4&`nuzk87&^mhO=Js}RFsqG;eBP{_9cbGbdNb<*OG z3xLA(P%$P$wg-y=VOkSXO4XA{jgzpH`UE&AlUZXt5iz#>rKuey#7MO^U7k>>|J`mA zYzNiVLi5zpPg&wA+5o27}a!w>DabHC<`yx0m=Q$t4QUfO4p>b`EiwNPc29y!JnPZTzN2s6EnGnCt<*w~Krdl^e&7p&J6%C(C@Yhwq4D>sdtDO2+@An9!RgcD>{1NGpLl?|(G zM2;ey*h44OnyY0MPC*!5wvIJ#bz;4g01ObEh0P6;AVb`aYO>DdQ|~9d>zB$KZwujF&!%Q86hNkq%Yr|IdL@L$z8UmbJ=-6G z7eS`ky82qAJwBoKgn6fNu&~GbMR)vE^0YW4uQz0hS^73pTk3jfi#DWpdc4sdXta1D zOy4~<8Qn0{EwI5Lqdjeg<}?|7qkZ=1qn)X(BS%Ye>3^#5v{QFq7!F}9{}oR=(q964 zUbejJ*g7B=i+YkgXVDl?oNnVjr*Rk$1Q@o!hT4kHg@{Dxk7@DY>r8w+O0~!mnsn!H ziePDfvKfSxm>oOwk3{)g@=WBAy{q#W_H0)kNvbGj1$r*z{t#srD*u;3Pt2f2oI-|| zzc18j5odme`&Z8VoP>pQB~4`WiHMFfr&?o;3r(|}7@)*(EOLLqj{!2mACAP_^dG%FMcSkrZ`i*)szjlSxyWsVYuK^ImyR&9);4YMm{)dPDJv zlwUAGS|JJz!iP|ic|CsN|qi0xxU8G{numo^% zS4)M2>p*4Wfohg1cW%6?(kB5|{*Gl>O3I8XZmOxOum}2^t-cyFEO{ff3`?wQr7eo& zw*A*Vxa}=D+leuEj9>_Edk`%W%@fffadI!^yyW4&!+s5JX^9PeUwLNs7Qep) zQHJ8T8oDi?;rzN!Im*45{;tMs3ga(NH1~sm06Z ztX}4sp@S?f<`1qk_}Q|i=1@+0012}VGf5YyR!qtA!kZ-#DYpCV-4>Z~OIe+zeR<){ zBs<_Rhu`XEr=6u+_&R)yATVOxThfpKBkmnFg;qX!NHSbMt=x?O>S>iBY9<2~zh4-S z91=1Z)HEMWyR9r%~Z0fe(Z@ z>5zpj)>1=o`BN&(m97IM`a5}eN9WSBE-@hvFmdFI=OnqLcttXdaP|rzFbZC7v`zj;Qh4(8+j}!L8m225dQSLI;ddkH=djA z8-Ld$up{jI5v|fx5-Y081APiDAd2fn9N%ofJR&RukuAOqT7u5<1D)k(oThpt)G_F6 zM6@#kW)s2H{t)8i?M0%vLc6$+Ib|(V+6A92FE`(NP!yEwzy>Hv!=8Nl&M8mi^fwY| z>tEGqtA=_)%B?fWtE+>&dW?e{NTOt=Y(Gc3IIwU&Q0r`*qYd&00$lZCO>(+1Vb+~I zNUXL4J2bHzoj32{c{q_S^{Wj02Eb1)j2|B?{w%9Z2Nsm8Q1={m9R>UIr;+pNdSvbHPygjy zB5Qq9^JT&zUx2fJ104eyh&TmhWtpphR&{d*Vm4dT{OJmWQsqz{2im zsQfsn8`SRdz~s9fvGI^S7y{Q9!W#~6QoJ-?ws^t5udJur1Ww=RhFjNZU~gWMu7UJV}a z#y=1J7AsNr`mK9CR$jlDpJTa13n=XoUcbi)Zl@jRT{SP}*l&%qa)oC6^-cSr>gUYM z!XKv@h-ypsS#^Dgt^}pl*&Q4a$~Q%>wYhmGoisLVR=sxf{$RKApQHu+bl?$7rxi2Yf)&C~VzIKOun zUDuYY@vH*TAE+GOulRIroIh5fVhrGhKRgv~r?|%-C%CP~+2|kVr|zcfq90Gzknn>l z6oU)C`C6^~kyu_s!WG<38RykK+2gX0n01OPNoqvxk!6`@Ym!})za!B} zHxfs6YwzsjLdGqAF(;7|_J8JwSmTxan4uq?t_=OH@+tFzD`bzt{XpN_Z{M?1UDgm1yjfZkKv{~bVrf&?Ez6{9@A90M@Ij;QffwG4I)y5sQM85QLue+Il$Hk7 zQR^|`i>VIOpvht%A%Wiz6JZLJF2e9MdKB8HbUbAycpS9w7;QsUb15`a6`+SZj-+tx zi0GtEBU5`E98@HDo30@>Z5;iKNmJ;O+PFcs4I1fvL&n?SLUcw@@6W7OD1z=}eg}5i zJPho{`5D-sDs&-EqLu_D2S0Kz(fXMVL5T?P3Pfw{?p?CQ@rq7f?Y8#CtVK;_EiyA* zt2}7_0aQp8k;+>-pF;EABBvOMeyogDu`;SDSCNtr4e57mBguzi7NS-!3lW|^I)7LS z2-)v0Qo=A6Q}e*Gr!tRAYY+{CL+CB}`1E>99_UR@=rz41yHeWlAt0q+Z#hmIFG*oZ zs@6V*C2!B8!g44oEWdu#jkdx!8aQog{x9t!map1oG5^=J`z-pE@xrY8Y(RInnbdbE za;0W#&*!*MDb9>P1|8Rcj%`O9*FR~!qJhR$c3A5B9NF>Om3Mcn6zx9f4$W0d;F?R_ ze?$%J_LiMOH5yifMF&5>9^D~+>R?($a-SD8iG1S>f3TVdz`{iDLB}5`^SY53*FEya z7$wn}11`y(F+dMMk{OVO%~pS;0STcpZpUS8$7wbr=w_KZy9h(O+3A=0&RnLiU_uzw zPCuS@mi0C&m#>I%epzilM&o?iM~O053>z&P&;hMy#g62x-pC*ujrvS=;jTtD?Ug|T zLlgy0U1uhHk-BO>#&Pwx!zZkz**iPnh{bc>IO@G#UALRZ2?+Gsc!HV9dF(agn`u8r z-@V$nW?ruWZ4$Fj!5|1^p!GU!mSM$_AM1JzIAX2WO@po1Aj6+!U~#>$N6OGHvrd8s z$Ti9qA`mQp7cE}`N8vctSnPE1P?Jn%I2ps4rsY*vZdjaW{1=SP=JsO1EY88KJLPic zdJ4FRUM@XMDhi*uEP5Dc^5qXM{n}sFkon4GeWoHFb-Mk#rMK&t;hCW`5+(7`K3s*S zWWVKxtTo9S7`h)VP=*BZ`;_kxMBH^Kj?OU}n9QY_oJ`c$=jp8BrC7rzFZiN7kBIcV z+v3+Gk0Z`a`N;m}U>}(ro$`^`jij6$wNJF4cp3d&W_NSBy~&VYE;pBN_AGG@h>oy~ zkCr>7yK?vfG?cHOcnTDLZlP0r3J1h#6C8d@6BsBGrZWE)S6waI&TEKcTQ>`bUjkTv3vap0FGSeI88@x1{#fJ@;ed8%|N4hS&3((TAzKh5YI;c`W(yJ zOf#DAN-V;3v)f_An3tE5K-fgDS)(7|q$HjN;Nt@?V{YK@SGj@TE&D&pjdzc<+h282 z!uE^HeUbs9Kcz(0EJh{Jz2)W{%f*VWIT>c-X)X@UgaZrck-7vX5B9KnFGMp`zKp_R z8mfOqOvSXJ3{>e%`TXj-vZkvB#lPh-$YHeyIV?2&p;_ddF6X1cm^Ai6r&!OS0^%_p{->u4~|S=RVtm*Pm;VY0%u2fx~$d2OgQ zh^#Qz;XIvIwtyzK09*~GH_h=tmJ9@CGtH67S2_&R=0?*TGBD=BF=0MOTxh=}a?ccr zC)G-yO^&zc(I(f7HUKcUpY$^p)L>D2O)upf{?cp!SYUm0^^<;r(x4yj$1Ocn5=@F_~G|9Y%;zf*(KBNJa#*neO3@O;k=WR&Oh=(A?$5R9e zgcv^L@|jv1LJmNbUS}fPG1|?GJqq#J*#!K!^tswQ>MA1Mdz`at`0om3&9O+JXGm91 zIHejWA4lzZ*RbA+id=naKeX7h9#c=Q9%JZ84CrkUe}vtV7PjT_Nx8Ynr2=|b;vXqW z-arn^+rfW8k7tL_9Imdm{9`El`57swCHk(K1j2+%DGoSWvYrFT#mW4+iGKtm> z&&#Na;yi6mfG$;8W!O@61`+Bu7NdB&-G^@ClC!C$r2|r=GLtRAg6E09<75OjB@c$X z{2@_^@s+v~Yqr$3Emyc!Xw%8e$=$GpnqaXHekr-5maM%$XevF*+hI`3UvlkW#_w0@ zQMyqM8#I}t!^?4Y;{T@2YjS=YH-Kx$$NNi!2?L zHgAvk4Ru-F=NCn1rOnf=3@TBZhb>vtV}~z4IzJ+u%&P*8hmC_M%1v_o+P>&rEidD<$gd?<&0w0GsqTV<6oObdJ@=lMwP zet7fJnMZQoi7=8CK9aA0_=#Vfc_b@Ngpo}6NcQ~oWB+#MkxZNjBf&tVEngXkrrq&w zAX?!21ii3EQt5@K9f|9O7x+k!#5Iyi5}$S?E{Pv)Bzs>yWd1l0Wj@KgnS_oX$1^D`~V6mfpxF3LQzl5<^@c>=Gqot3=h(VeHv zEU274kf3s$M>3C0@mxnTPr9%9B=lwkodcntC-9objWXAf%+sRGC!IgeLzz$Zey&6L zQqbr_=anlP2%T&Zk|+xZWOrwd6rP2=#B%eVQF$*Tt{D8v zh+Ah|beN7YF2RVK%JksQxYMfd&4@dPeZK&A%W)pcd}8Cd4rQJoY+LFO_NiUpY0XUS zsUG;ua1!HunKH!zDk+~Pb7e1s zr5riThwN#xOz8ST&uuw+fdaDE#_fFftStoT&E94-UlSn#phA zUG;3Z?<5y=8lxef*YOiOOC)?^e1FFb$b5R)lTnbbYx7twhNN@Vlw0|#;O z(!qk+S=lNIMju$;xvrBuut_KXW#vOdcCVz(D$-e6l0eRs&$T&9;^R#Tk=K(AJ8Xa( z(*CIFT_252lkQ5=)xF%HivVRt(0kT*DgP8lfd327(f(4Mn7P1%a5w%VVF z+oT>oMoPH#l>1Umm(quXRKayB^&2S+=yQ#&{n@sFS2Am&V<8(ZLm#Zc(v^dIyX5=9Ea-0qDYFe9D(^wt}aE6C0aE8VK zWk`Y#9r_#swXZC!T|b1iH=&MfHXJ8?;}O=5ha=Dk1<=lBiV!5GYBrPX0^cd!_Ne#R{KD$rG%D(nf^SI1Nhk7P?dhieCGi6?G`4B&%CLA3* zR2)0-lvjtN2M26lp$Vp5q!xUb7CX~OY*{5= z%)+13o@&}Vr)QidOe6lzJ-idOe=N_F)p3XHsE}wtBPiT=*U&FCuTkE0?LjzG+|0=s zkbrnoJASsjYg1Khb$wF)eYPAg-}H@!+SA|brt43A<05>J)lTmP_8_~^*a>apym*8I zpO}{NdDY>d7t2l{TEcKh!(=~FkuqPrcwb4vc!N&nlggj7cuRLb?=;#^rBz7B5@#8v zo)G~*yTsEwE%EeDB+V4iFR|X3-}B7JFtN3l^a4G&d_{6PEpeyoqz!);b04MR!Hf^0 z_gb2SX%}18HISUbAu*LW>XZ9O5H~%W5;MJMm5mD$3gv2SJOOtmoC#_#+csBDL!n8p zi$8g+OO?n+fGPM?uQTeVce3n+)N03bIN$KOSU|&xd3e|#VP(bPTAWT&9i}?d>O3+3 ztMezvZbTos*o^2mKk`>UN-mh*tzo2JV*s|8Z?}feh6eKCC`JTaJt3Tu*-ERbgG`GrfxWq?+nHWs#_6p{I5p&f3jM!?~uEHyLEUnyuXOo!lzl zqy(?6@)G^PWFcjCa^Ik~e|>*jmRE{>C$>!QR_#VZ7v~d=B{oD27@7i4$G}R(J<(}> zdQoEehr!+??~a+PbW)AZ)-(Og?$p`;Ogu+g+%O74nM^l$rp&C|%%z+rb$k{Ll-qib zcBEuO*5qX6Qwc&44bTZMfLXeq#VuhXH+C{LcCr7w$$zf!pDiiB9OAVTtw%VX4O(dD zn7%Pv=ahy+>ftBIp1C`oGguV9Mal@_-xJC*C*sk8mBhBZR7>51-a zan~g0b&+J1eybs<%HywpVY+u=-D*h_Vu1w$I3K}^r*hlm7 z&k`y2g0e=P(zb{Py*+dD!@v_lpfa^elt2(f3YG@2!=0(XBo1~MG%B;2A`lLG1r_R&s$diDnKqt+K*x)@qT!*AsW?EDsf8tXgP zpOsy~RbFB`5gyIUL*UuGe2zn39w8|Tmnb|ACWiTPVeM6ktRcsUGf0Z5jXjYaZ=CU| zz%8dD>{4Hq`K2PbhISg3txso324#BrcKBiLtON{~YJxU&n^0fOSiio3Bnjz;+D%r! z$*Y@jG;KDqUBxJyT$zbIP-CvT>r_orSB>I$)We+^q%f!*J>^r`&*ne~>9MmpN@FvO zUpBb)ZRIaq9){e<-oRYV$lj=-yoy4GqnVMtf!5lwb^HK)8n(G)EtLNMf#C22?*CD9 zI?gcveF$YH5Ga#)mo*kf@(TyMenDa2;6eq>3idG##DIW$6kNU!+KsJaiDmCvA6nrPGL<-69NM=3HUSWWFvmpm*bY)FAbE z^@6mX@Za!A#oF$W47S$CRKN6b4DL|hX?KQX4T;&v5N;`jotJV1q19M?JAItuhQ3RS zm?Oxur2%tGT}EXByF54^9p$^|p`hQ{M%Y%cY-&ll|83oreL>3*&#SukZt+1=5Tmf(AhCtA2wyzGIjOtm*ngY`YB}9N6=?fRBCwq+*#gDi z;yg*w3Y!#~mz#F(L!Db}L6b4g{$%r)4W)47pGEvYG1$b#txLvJc@en8dE>M%X?q{} zk{i(3s$2C^W9pZXM~{3-sLnF_r)`wGwUlNw1FA)NU!hvZB__9{gT_{1XjkYPWX})T z%sM(oLWtBLmONujiP-?~8-U%AU5<7+`(rogSo{ZAM(7y9i3cY4^G%VILiqx-@{(YP z20x+QL8%SR5~fol{PHz>(}u8wV*wx37>vdt=ofl!St$JoKy`+d(YYj|V%-GnN|9WF z^wTkt$Pcc#S^%_0Mzz+x9%o#=>h+jLBb^;6g~@$+CkfQ;4PH?N_BP(NXm1NuPqDB+ znMvQm#ZN}LfR5;)+FC@F>_exo7-<^W%6s| z!#aY2?$Q$2y7)z*^~U&+y~t(K9WjMA&5Y0i=qFR9afup?k5CLv=p>yHH)CLtF%@&H zHSVpw;8G1*6<;6{K- zE-ymw)MeAim}3sCJVe37q@R-rNB|-Lf~mtT8C6iH!3h*-qq>>xGe9HdP)h)X^DN7& zuHH0Ex=~)IraGe3odP+3oy>TsxU_@@yiB|+ou>U(;wIU-XbLzj%~VWzP%(uKQ`ZpC zyIC~^sEZiWpvmrJkYdtJ&6FDDUKpJ>9h3Muc8p*cW}`9z>ee##E!55rl$&p%cHR^l zC+f_bRDGg$ejsUd8n7|b0yN>qrijw6Qy@-E0cK~nI)b#)nA?2UDdv@}dV6Q9x0ib1 zaIMqx9gAwGc|E)6h?BMsE(+Gp{_n=GR>yg5oBG9ABPqA}_u4<~=ZWa1{s#rD^F|B^ zt8}us0c)hw(#+xrf+(N5TIqtzgZ2Zt!VrFNlA=Q@fB;G8+J5+vr1(G^|45|D>dhZm zjUy|5QWcGpV&3(M!>YKXd{I9^jI$Q4qH#~5;?>tsV_Eq={m4A3Pjg+UV#P5n5K1wS z1ThWZndi~*CUajDRX$O-{9SYGJhDSPqO?7u4=Y*_9Z?Fjos*351NS!EX&dh=b`RF; zrXjenVYskSF2~bOyXUyd3V2bGyqZ#O=CS^_s*4G>x%j!eMZTJ~6H5y)jorkh+W~L#l z#PfZb4{0KMIP){y^6@keTs}&ef)J6%_Fo;66Lx z4kA%zmrFI4Uy2NZ8qq5Lru2Z~TxrdxOBJvD_0vq?$;y3-rO+{PnCg@Az*D{EvT|!| z{AKC-p3Pr6wyr<-P8z7XzO~jI!6NaFxO>i8#`p|eA$urBz~Lk-6T}qFxBoLK*yTux zze)G8+mhKOc%ITX= zl0Nft1&Rl}%hUt#6m&-?L|;W^^DP77%n@yj@t~{J`2;j(VobUH8;@{BCtV$oMOCCe zExecUCuB>Bij1N>#7pICc}ATrPjY?ZH(?Pzff^ZJVuks(eLSu7uE9Z4I7r(s=dJaG zJP1~ST^ozs^sQ|lmo=Ze6o)Dx?qcR!7zotzko8f!efWaY77uaWY@X&)FY$bsj`A~B z{1}%+7D8TT)MUZQ&SHvaF+#?PrM8Atn(myTJXL#)EBau97XrSkj;`&P!q}KpzQP0v z7Xn#eFt)pYy|{CfqUZRal_HjAjk>2A&?tP*tIHAVUw9Ng%NknIC1z`E=?E$%;5Jul zkdC*qHopL2D8HVEh}ALt)wIhH`5C4~(+IS&43vjy%wSgjZ3>@hot01UlUeM{3L~Bd z&65o}pOo+Dr2pg6@QwepNDQO)iugs!Sq7fWR_O!N?hfJJTw7a1wjx-GrQ71|d9 z*=#<6G*^$9t)ik)R#VYv@hGMCfu2UmAwMhs^~D!o95TI^Pd_NAD${a230mL@`;?DM zU6&U7(bd@+vt=2i>4FM$LFo9#_!^Uqf+!pUZy1M3HGWg!bvkRp)Kh>{#3WQ|NpWaMLXSSJfdYTx zn+$ydsdf%T*x})ET6-J-$CYnY13oiUR|6ZZ4Sisx{8no{=e(w4BMAkQ(jy7!xhdHH zNXk$y7Ck5~m-;V|fTY~}EvE_Du@i&BhyhYhT!tQM1KI&?Upiohg&C`s2p8CLPiK^{VPUBFwA(>hGXaFL`DR`*q8|;hQd=@}>^ItEJO_k1E8f5CR7eKuUMEMOJ+?jPOI}_Umx3@wzBQ%iRNRp|9_4a-3Z~0h4pZP8a|piOtpOMk%*(ekFp!|$+bYB&zc_}V z*7&?5|8nOp>>$@KhH=}fs~fliXGTFeT10RqkU0h2zS+b@<2mezK0%?@$zmWwK@&R8 z5;cYIWFj%+xa{IQrXF6%`dPblX~K&}pCP&N1=dQ`Rzx6hqd2KT#MEUoYq@m;awQx2 zfp;UzR5o(ElZ_m$p7lKXm@x7LtZJ?%Pkr`)(LeDQisNVFPr6_&+!vfY^|xG-ha|tgrOO= z6+^DAAY5G9iXqol3<2{@b<|djr?OqeL)5r@MN||+249H!U(`69($-`%z}dhDS}rRT z@W53~F6+Pw*5opA(IWd|kX#(o+3CE62xnD$;u!D`^MnkS>$x43X)v#tAvlHx>nAV} z%dD-SVhLx?r}HEj)^tS`aknSOP|3Q-c^y71a=@yxt*0<^DuO$!LVRm%sCKOLUJha) z!t#nsO|%tAaX=T_*6fzbTVW(bY%-_`><>b+6SdrqPDTcz9y-m7E)70MY_n!yO_3vj zB)#s8=SjFvT&HrJVdmsIoLq;Kbl}xR%kEAy#l}Giz_shA4X0XHCyZb(*0iRLtk*3?560`-T{<{Pg(Pd0&J z^x>ulGK-B{zvpJ>*p8m?h=E8j@PTZ}djr{~{d?oL=XWHHa(g~MBe@Z-bC!_=C4()= zX7R9lo|^BG+?d%&_SJ;u2BIdWt832LvKa9dL*4 z9|Nda@uUhI8&C3e@rkQyTvTVI?wP>}+5L>QRuGAk3ZOi0@*(|hn=NsB*ip&%7B*&+67#CHt~t;%`{Ld=ig0$&^cxVDF< z4k}n4+0nv}rjWgDnR%Z(Iu%lbb_uD8yzoNtgQZD(AW$Zq-^@!IA&l-GGbqQrfxR`E zGbj(#=c9o#nd1imx1q@NjDJkxhtWB`VLh~ z+PkRuNKS*9?$w|6opb5qSqcn%#k#mF5@Tr7u`xWtxU+E}gE0>hbRNeEL9Hz}TnLbg z2)767>44a9_MQ$#8`RS$j_4^kRsuzOWhCL*I`l!Vn-IBgNIUf2We6i_PZDEOm_w<& z6LFW&4zYUyJR-e-zq;?}enszoLie5C{aW2m^zP5r{o39=G7kl3R|V7c)|6Z7?eG!3 zMHEzTB^1_s>q26$xA8vqHr~hH#{1aYcprNk@2lR1f;L7=6D`R44T(E2y&|W z7x1Tf`!E2y2Nty$*)}t(E*&!h-7$3rkJ>?D_*b%rADr65qpop%3Sa&uzB}{}AF8H& zsDMtqp?>vJz`7wft!`_B&R$?%H*|4)naJMW4f*r5SGd2TGlbZ0?wUiMsTRGGv^nUN zOreDTka@`9pR}=YLmTaUb19lDW88YxKK(k*p3*qpR#kr znVZC+KaFlyd>NPwAqCPl$m_aPhEk*=`B*o~GaRL2y;3$%gevKG*vjgs-N`Y<#U%4V zq428g+~k+}UAZB6{UYqetJNWWZNhA&Z#yShYk1j6dT^SEd|L*fGk1#{O{74DBH+$6 z4#q&QHI7CaLD1MAGVxZ09D`-d+3S)a6?T%>CF!{d-bNjMRErkGN9moC%Cusk51G$q zLu)0(q#u@|lfEuV&P{l`!@)^32VUtkxN7^fdQV;YM1#TR*5~z;uglh{97iD&M?D(PZM<%uDq5lMxFFBX`1BvCJcka$au!1rg5e9w0~-*XQCYS@vA=PoA3jz>)Z zA{c;jPC_=sqDC|eG*waoeRVsO-W+QzzZ)27Il{?X;9)V!5m8W+hwH|(c^bZWHBA9d z%M>7^PoHXhg?uciD`E4jJwZ_H)1Wn1EI-DU!@Dttg7z30hH#=r8yj5U+SqElXH=)) zpdg37sw^vyn+0@U&LBeju_OVI+S}N6aA*_ZiKFO&xWsez!%>n*f)g0j?5|?Z{wjv; za&!fl$5{oG;q2$4gUo(RY&c*0NC4>PpMWzLNC|NS5?m40K+AF2U=WG`Q~_Pdzh4u8 z1%9qBl036=Z!34#xDUF~9-HDwJ!~z=IWe;4rWD!P!VN8uNf6C#E1{05QjWuDfjerJ z!0i5dToa;(c2<>u2RGLNvP|gS?@qvgDIRWf&7+f)jCg__g1}qV0T&Jmx1=$E^O7d$ z#RbetA_L;#UkktjQ4^i~23SqtS^}}2BMT78H$s-F<;gQd+>3EgwM>jSdekwk4Wx(3 z5X%Jcly$k5+QkH{Dih55Yv;8C^BU8JrXsuhS-Z$T<>xdBojIq8nKVEtvl$mAWWHK0 zHqVq191#y!S*s#KqARtT^JM1XIuhtZL~vl$I1m}3J{TnnE!D&_-aXBh2 z_jwFAMsYMN-9fSHOoBo@*RCKy}G zW$gS0-nh+;qjL6cY2T3z;^&{=Wt~wr0hGod}@$iUeFu!-h+qQxY2z5dT zkCy5|Ct>!ti=!QT$F72pYd*9O8H}!oDZCGXWB8FxH;4eCVlF(*R-lt?f-hPc7PvOG7#3@5u|7S04D2IE7D zXx9#aF_EnP=DNyX)xIbd=;OApfGkH~lweoD0t4hbH&pW(2ecvJ5(GTlT#XF}m*88B zx(FdgU4%gX4v`+*k2jU@A_N4v<6164K-ejJrA3zY@0SKgEwT0E#$D!Cmw`gar0cX= zT@ke7(R);^hzqrZV(_!EWZqjXiTZY=-vw46{ zT+tlm3|pYSHun$CCL%FXfk9p1-s&uMd|JY(NLK~2Hu5q#*&R}pQT#EO2=zn| z6%$q>CgP@HC4wVIbx2z1pxrow0xV58w4&C46CsNA_%M;5206xXApWsw;|DZVYM6tw zlegAkt^%0G)+fpk0hybZkB}*WMIS+&T9QZCV2dHM4K(o(p@IIW9o+_*6WT%X($*iG z5c-BdPfq#5CxRxy&Kh~IF|t-uJGt$Y%5e?rWKkbPVX9~3FDpZ5$W0nyu(73BuPK66 z!mvdlk>BbWs~!(Ymk3D0K<9cu%}=&Via9B!gd<3K!5TF{>4y{szzN{lHFCISctqk} z<|6SaZI859cT`eNC01?>n{X75f)`uU>acJg7$!Zz>p!<49*LOahuwEjAQPY z9S>}(qwcPjh(H!OUu^xj$=&H%L~+A!B!a?>l$aTyO@bMab@2vW!qHQ%I)>%Qj%s6! zX4-N@B{kjy;?M)Sc92ehH&J!bCd&vL9ZO zn-@7{fEu_Um=8Hqk}z_Ah<)ma;4zxbuumPG(3Rp)3i_5>m5K?PgwpzsN<|NLK&-K$ z)c`FdWOfP#f{Ne;Vve!pjd#@+#m#m!BK&_Id(9*VMpynhV*y?J7n)_p7x@p>TqN8T!!*9kfEbtWctv>?{?qyPv2^hGutvCx`IKKww50 zc_41etYdd?kE4#R&dZEHc^XHQ0lk(n;Cdx6BEb&!W+&yNVKRZZX*#B>gdnYw5Z_Hf z!QZA+KzBjl%{DcPwoPh@16(;=n<|1+)MO+QoIvwVHJqYuQzSS=Zc{io-9etIL?2mW zLVskZnjJgUXz;pmJa_Lxf}tyv?BsPQ6COLxKi<$XfhvSxtUQpI(l8<>Or}=A=}SYn zv2sqC%{T||wQy7%!zK4X+ThtQ59?+?GK5v!oT!u-+%;qDPMbrF0E#vlc?)=j6>6sq z8`>zE(M)DP$HLf)uiB~5{T%KG5-~*<|uY3L#YZbNBC9l}-1iqv}@ z>iicG1k1Gw{FAMMLLJzu;wSY5+h(hNaOeYT+FBQ^!Kb}#l+9X=;tXNN;hGig(7pS& zAkti-HD{WdBC?EOOK=Fj3KBy~!5DI-1cr(6fS+C|A@T;Slqea6lAjczS4!;WN{MI% zb`N;6GN+QEaLtD^0%D1|L}GVMvq@t>E zYD@^7)I|T;KS=8kkf)-n_%=z=5~tCc*ZCqM9maf92viiui5P|Q(3~-XqO#LglWN#$ zD#8VV$Pi;(L7Os0fmQIMkZJQchXpYFszabam&HabluR)ImMC&2h6a^E9fDO$WJJr* z$zu)hrSxA|=W*gHLf%XX9TUPEP2h6k4<}YDUQ@1oEbs}2BVt@E1Um{;^ReQi2Z|pY ziY7xG5AX~JrWln&UG@{OJTC4M-tH1w5(I2vkk^$@5(w}SqeWO!0xvaV(GjD*<6GE+ z0x-3A_Ld||OsQJ4^Vbsa*-|tM$wb*=3_N&L?s(&pBd7*(DcW;dqG ziT5_FpW=WyC7g2->k|^tAsBPmDun0&BSv4No=S=7u4bA_rf|Zi9yqv=1qxCLx6^r# z3o8geqEG`V0-z}t<=`8)D}t5Q>;9+1>c4+9?+fH0MNTLrz=dP6i4J9+!pm}@4OnC$ zLTXG}=>*}yx7E%Bo3p0}nP5f()>3@01~m{GwYD7M0o}6;&=a%57OU6=h!?Gt8v-^J z!MM6jZ!wy#bYo?Dr6eZII8M_lh-0joa)}dVi*J&XbJp1xNDYRA&zL)+Y*R6314v-` zh{c17IU+?(k3~W``zJ;RxT=b_x%_;UQlD{_uA8fz?Sw?O-yTS=ALCy=J2nN0W zTeYezYjl4_{e_jPf36*rfJ2IVPq9N)2y7R}KowV`hi!-o!Hwin6@uv{yN7K6dWWHA z##p$}_VvG3!D~PNYaCuL@xNBZYk&W1HN0M|%8l<~>*KM}k|Y|J5}Aq2fUcvbAf3A8 z$w31xdFRTzf=@;?7OCxD90j%g3pk}uNu*82STY+UBip}#dr(?|tnpZ}S%ZZNyb&VF)qQJ#2JdqZoq}ctZ+`B-FS;zC^XJr~QWI+Aw^Z^8-ae zN+MO2`Op0YR@-OUMg9`HMv4yvVYvK)6@?h?3dC3UZmhfjxDa9@r3O&khpSUagj6T% zxWYPgxio!fDAtn+<~p%XCs^>KJj;ru$C&%|d41;+zMRDy2>z=%rb&9GOw%>zczi-!c(nvsZg0y9|U zHh9E3dwKE`aWw30@O$Amyj8pHmc&?GO@B*bb-Iq&czpeB_*mr%F_Yj^{>)oE)jd_O zc=i@(&i31=sNZ(WEzss%pOAKtMibuU{{y(WZg}nZn!{}N>eZ_|ocO`N82-faC-T24 zkw4)})#}ybs=JKpSoMr^87@4kQo(^45`%RMH?Aix{|$ z0u5Y7E$jG0$bxdZqbrYnQ+-loftn=xN2{imOr&Dj%31sf0bE(p133|gvA0AOYcw89-cLX=@I zSn|1UTdpiZorItbvLJI?3EEg}prDNh1#NvK8XhnNFd^*)rht8`GC6X?eJr{zzS(rq z7Ty3qFUn4_v}U-mo{mQ|Jhm?7QgPzaY_v67flM2#OBK1-ug!aGONYZt(!7(BI7s zyHs&*R1&qG3oI@w6$i)X}eZw>gCs=ih5d&QVl6GlZ}8nhDoJ z%1OW+%ipUJ<}#H!iZb7-9ZZ;6WO|53h;Y)@HYkoUINBS;z}dHljn*dQ5ib?6Jh`|~ zh7beC(wqaqzV!`zv~qC9IhE83H63l@+MNQIKAzHnML%@}h6f-LGV^~`ssley zIbd&9Gz(S$J6)ND4iTS3XdsG0!5}BITUG!&*Qhu(wH1KthROow z6i3i$Lk|CGL;nFhzDbQRxKfN-(#GtQt3@IH;c8KJ+BL(!R_Dzwvblt>KgfO($g2V^ zNIr0!Q5hi)GNbINVi+0W5k%~P*fYU>A6)%0{%Xlu7C@o4t5tnM*>I8|pbcONWWDjV zWAO@#-m7HYhW9t!y=%|cwxLYX%Gs#bD+hPn|JaeebGk5w+?@}=o@ZIZ9?LDJs2Ihv zWGM*4$8yC}lMb+PtVfemV|)Z#%Av<0dMewJ9PQ&YcoR}2 z)?CR-VtfKT6?)^}=Fmi(j-ee02MpTKi zTx!sk_gi2OQmx>xp`;R6Rd6K}+z^7UWZGAiqsEe9X#uemnFZtKzX(lMPISEX&`LwQ*=y`G zUHpDKzuN=8Ynw9@Ib2iq#_Yj~k_0JX#sS)(I@5*eY6bTzh;(d29&Q8TlUF_hEsom8 zyI)ZL_P1bQc=?@}N^wdmPpg1u95D|m@sZ1kd1#rLYK-sV2$gKpvXe0W84J7v}a88-LgSkfl3`)Z0W*9;05piwbS zmXxTEG9#XH)Dp3k20up0Ne4(py+>5ZOht3d4!W0N)eg7_8wa`KP%dpJQ8W%+;2}`G97B}BqK$1JxQi&$ zAdA$gvE35e$)QqX;!At3(#e2714 zvBo&caQ?q^1YAA~7%t=w8MSA;QN-|i{?zq|6VZk*q0R5BCTv1`3f<`7-3(S!OrE58 zDJD(?Uh0%BK#G5YGU_FU0Fezet*x!bc{m>$=T8x{YSA@TmU@-B2+C1!u43G+S>Xk^Uq}FT{z|1|1fPFk>^O-W)&1EO_h(ZhGY>*bJVz-@O)w`mo`hKPP zK|L&AJ+}F=`jhCnoJzV+wJ(tC9vub)~NYAY^4AU(pB3c-}Q!=+XdpdeD2$f5g zW+9;C1qf|!M&f7XB4wsEqJ~?(;UtJSTx(&9hoDtAu=rYFMV?5WMdw#I$ zPKQPjGvJd8_*xE(c;hOD2RP&ar{MSs0usLv1M-$fhh4q7$L2~85;@oz`6_%K5|(?r zzCsb1r5?Fw5q&}lkPv2K3-VilejvXU&tV?9f9Hn}RFLTM!Tx zQdy986CEjnm_@bGVtYb`s`g3I-P3zr}%3A^nSpC&!+8 z`_$vfL<>)_1VYjcRb!-(KpGjeXM(9#12sUwtfNNh5{Y+f!?8%DT=P)rMS`VkiL8W( zV45KZ5t*|K(^ga_EOCJ`!^9&IplVV-U0ubWn_OI*MbJK3lXYe%#=5_)P0NSr-_4Pv zispiv&K*o-MHN+7FFpF|>ZPA_b+A%K-8;w0_pVx)-q{miAp!tR8*HX@oX^^=%v8Euzqe4xl7 z+5mKSVY|={gmRM2(eQ|l0FMIJ_wm|NR@-P1vy=$5(Nr`@FR5#2^APy}wNCuOE`W4G z_vtZ^2o63-_=`FPv3TniIad$|dB~AsY!LVUfr`l9zrgR%Mgj0F@O>0w6e6b_S(0PT zIB)^B2~A9L&^ueXU_hi&Leka(`n98Es-I*OJDt=&AslZJUO>`KYAw9O*m57r*LRvo z0U&yk+f)h73+4$AG02K=Lx%TPjGkWBRUXlXopqqE5TfWuiboX!m4kyH%dUg4xg!+Q z+Ab~kI7Ey^U+5$w18+BG;;3zQ+pf-Jp?Gi1L7V^}8}f{*O%1-)S<`CC;V`Y4!FE<@ zkz$CF7eCrhgxZ2^_<#&2=tjQ};IX!|!ps+Rz;kOQl?e?qT8o^6u_~I+E!h}RQPz0W z6zURUiSx_IY1t7=0v0vhBCZaonyAnJUAQh`ibg6u8=;noc0njpk0pMYF4!$alT|t5 zEnhjv5tM6`-IxPleW4SDb$Y=V^p91=!yO#y8AM7{D89Ze4Gb#IUTP|DSI93$2WchP zXS|%ngcRKv*-Rn_gU{lmCPa=>xvy?I-t{+ClLi!l2CcA@O^}U!oG>(7<3Y;@9&jwN z3?PC5qU-|$#5O2Gwi-5U68IA;u6uVi?Dvshg}rdP6Bh%&qG(IN_>0NcnDg?xP_^9$ zL=+Q=qo#Z^K6o4IFPt-tn&XYdNaUVdH31Fbyn#KG>fJu3U^8$=fKK85EMAJ%W`h67 zEJzEGakV@_TIM7yL8och!Xezog1Kt?I+er=MTmqAwAN`!yxfNDR1z;QyHXOb_)|D! zl1Eun$=_Dfk-xqs(H8){C6S<~{G0@I8jv2q{sf?>Yns0zQcb69oODeq|F)X;{q;3z zEMNX?BPok6vXh5SfTt5=9b@~3_Qv%Rw?xRQu! zA}x{%fT_Vv%T&05!&puyy@N;wrs{HO#;15P{Biw9f24_0PXWM8V>fPqsU1DP9!o1& z>2%oaTq%GBge)$xAN)I69}ZlF6RF6F@;b>mov>z zj1iWD^S|50|6*o-;`MEg5GPcIfDsHHCzKhGHmK` z7{{#pO~ zG*EUeM^D;h4*fQot-^>a8&}bfYEz;^pCCiiWNUm@D{6tq+c-3@cTlD;MK-0>D8rUZ zA&1h>s5m8J-%DJAT?mM5fw52EMjb8+!hOK~TXk-XK?0nCDN~om+8DXQRuTY%mG)$k z72+xkKd|r1Id%%Zmb!#tEC+0kL42a1KUR6AK#&^F2Xr91%^9xI)_7^xPw1im4hDxl zpU_He&Yplf#3-RI@rtaUw#kvGRM^l4}~9 z_#pZL{M#5V;|~{wuv&A7;k-jS0t;3J3>Wf;3MvkymIbT3t0!>mwIn*$ngGGLYU&o& z(qS2nw?r~rU>ZNRd)Mr0xw?2I~f3j-NgX81WS8m()aynScIs)N$B)(Cl~U*$VAcbywA6t3 zDc?YOqofIeMF_Y09Q+L9$CdmR9;yyCd$!F=9}!R^uXy@C>+<) zFcYDhLJyaN3`zHJCNh1uL)6}2L9%c$Ie@WT9zwv3Vum;Hry3%*GO&w3lryomypQ3d zDnf|F%tydDf~Cm6WBx|ySezzfTUNbmgU`m1wRk`l7iz}vFJ{Cs2Ij284^?{XF`UnE znffdp+lz37jv>b_qBY~7C|>^uKWMNfCvGamu@yXD7NaOD5EOvU8V?r~K+pX#j(j&B z_zDNooNJWep(a(SikOLmY9wMbMhw|S;*Uy$L1Hj4GzmJ4c{HD593eW6xxw6ZQdLB? zhyCxU0_zXAncPN}X1H)=v<#HITPl_geAcTum{)X_1VNOg8(MpUmvX2&Va%+h9GmG7 zs^vtIN>dA4@;>NeoKYkX#KRe5CBr5B;pExIKpB7ZS>%VMq;Cyzdo=6sc#MAtD?RQ3~b{M4OhVFoeb~ePc_BSqpHvB-^#-*$yhHB)xQ#k zOZmh8l`(LLKe~U%7=H2xiIDy+K2(YRE#aL>)%^9Le^TEQyeWzOD`H?he{}zjqIjc( z5xRe2>f>r3){g?>@|%NK3M)%2J-ns7sxyZSS??6nK9GNnD14Lbn(D9 z&<3I%!Xgk$bkU->=%Ucuml)3`tY=^=e{>g18Q#ku-Ni8Ub~Lp!Q6W8~8?d494H6bf zgVxlsbnNVjcM&|*>L_GBa03u7r8}`V;&x2S2<^5|PPraC37$@_8v+aisKTxFY%B;v zx)uK$#Om|S?Z7oD64k-ZB5T)d7kmN493Wbua^m;sdsJ>vgQUE!gT+{BKh(t$THjJj zeh~TP<_~pXHfE(bL2F&c?w(<%$;|<&T%4Y+L-C5Df=;5(CSfFegjlojQV}ig@5>Ql zSSEas^dZu17}yO#mD9zt*!z4qUnob2h#hd8Us6I6ZEu zcDQ&PtJ*29{S&J9cTEVzU9?>>@SV!MgnO;Og}h$f*u)1p8B9T27~aVrqVZN-1Y5?J zL;N97fON+Yc7GLQ`ng`3u6knrdTcf0<81c0I7gf_Cbmk|I5;Ds?J?tJoxhoSpegd2 zq#o_mBi?+d<0Xb$_!AGUMvy@q&F%2VG#pcC7KHHsGZhc$-~fpXk$?37yEQZ-+mOUG zIk}Yhr0fljo`xrIDc@r*+~VS-{HCz17JYM;oy4cVyYm+ z7d5sxMV{iCA){-zJM924iYzckS4LEt&K@ykjsD#G;B;LNh$y;b$89+R6M*FyE)C39 zULHn^$wre)X-fks2O2v>T#xaIN#5}+)KcTd5LnFB@+%o6UhuO=G1!!^R{ zf-E3oWXB=|t#wTxJFhpj}Y#RfVuipZgd{kJw$;a3N|m*qZn< z!DyBtLjk10Pzc8CC&u6)LYfme=OSTDvvfUOudxvERMRl+o@X)|fC2+^^jVT}@f#p) z@}9$MjIn@^Lj1s6z$jL6TLa@t`9c<(gvqPY(Psc1SGZtzt+1;Rwi6?f@cQvJN7(H) z{D*(|v4#9A7ZLDXvIM+`2IV`Ae0Efnr!XJ4H}Qrh8)9C=X)R4u5O*_~!9Q%1jr04f z*?&#&ooKLMlnuksVd}Tj&c(FK#-j*;fG)-JALm*$ z98GA0rL&Q_@M0d0LRYdRh%j^}X0@{FGE|jm?pxyY0yoq}BVh}b0ik$=P!B>>mf(BN zLRgZqdJ&FtU&e6}571LlWa(;HGfr)ht4knL`io3a9XF>Pc?*|HEJbiSxL!5m13sMS zYbgVJ`9pCFtZ*M?$Zr`zj~+yb3>nNDBh*1iis|=B3n`CuI@87SdTJl-(vw=rDC zAI*OcARNMfhX?ipQyRq9Bg7x~4S9eJm=PGzUR7ne0JsHjE{FSrsvf(f6ty48FpP3B z$+oqq;I5h^qXFV?C%p*w)Z&5r|SZLIi? z!Z5*nh=Dw~XPaOaS-G5TB6uiAkzzp(Xr&$=2)S~2BoFqoDHlZ>g-VFu77Ifb4=(C< zo@YBtg>2{9TOvQmRU4aw0&sr}h@&4)Mn2OOz7q;j_R=a*)mTX@17$NX%=HX!c8K6kBx6twanxjc+_U0{D3MvaEKV|!qbFHA0>@?T*RTdZ_0xit9XVqREm)a` za?owNc8#P*o@ppo7g_lY<@#MjDoYOT23A282T!8>wg$4&}?0IZikP z7G3;h^hKl9LQ%pLZJPfBi_6Qt(NVia_!YY#RYHUqH*|wOXZU)IDesDagJgpn)G9f?ClLp zN4KhNzas6(aTQTcaujXCxv&%(VNk;r)mtL*s@1Czjutyi(p0`&Fv;>oANnZzqD_E= zDcYPafvsL1rqx5BG%CT;PChI4BM9{5r&t69MOLPFT1K$_lqNPRqfDW{o2GZLc-WOn zV_eac7}Z&~s>F|D#13UNq#GK!JZuFexP}Chi>w<#>X<@*wpx>o)ra4-jc;qm_I`X? zg=^x$yp7fCN@TB$sB6&rk$<(rSiTyPHofs^X0g~HwF+Ynub3h)T0rY^tTFR@JZQ3< z!@y$xu#|T2i)6T*%{y40(dIwD3~x=Z)y!SZcxoRWl=({dUdkUWzVBlA0DrXjE++2a z;wxzW9NL^?jro-S+5E)}6!Awle>KD9OxnTak17WqSc(;RR?|`(AFYX5W~3ODgDWTx zAG7?q-=h3lexr4;!P>4Z*yZfi!Np&u+7EpcrYMXlbVm;D(Z{KXLZ+i4%5ytcsq>`m zhIy47W&>13+2D#1!x9%aHAN_G@e?7Xt&Xa+OQ2}L@*oyCF|Wex1Gy9z&dWM!Vk}SF zrim*-S`I%<5FbuHY&V1*j7|ly6O_g6%D`b#((dHu@O3}iU zY7(>gR4s#ww20XP`J_q}g)@W%hba}EHmUESCxDbe1*;J|BJrx!qX>t#bx<$_%ITQ; z?%CrhmwBcZ2sa%+T?mlnO#qY^G*vqT#gju}xbbBbYnSc<_`U-1Dpo6F^-d{Q7+8`* zpQQXArc{nlC8VcqVPw7trBdY`AW7txy(Tb+j`O%eXj#l|1ttt=+# z3#<~Mm6yBJO1dW|X^2&jlr)UgrB>=Vlv+IDrQAJLmz)Stv0ow#L@AI_dkH6m1yirzm|N17z1M%u1hpoZh~p_&2KuS;&E`7E zg0U+&Lcvi$VLnaX+R1z|!U0fFt|g&R7_1~T)3Ji?4(yz0rn1TdWzWHPE+&cGj|HgN zN>Z0K2dqOuv^TaOPNe&O*7_+BMLTx@wYX$YaT3edkiOMgmpUlUaE&)^@!!ILX-2P! z|E^*N0!o+-m?Pb^mqAZ!tJe9PB(k{xpD#|7UP{;1Z1ztfoHpU+1kuZ8A;>HQEE*kS zW*8mg6hW(kmX#;1iUJ1G)m>re>R_OQvJ6ml1cY!Sl|nFHy9rE#D-KbPw4IxU^zzi+ zyfT|{0p77Ee#vx%_ss-;(Q#prHnk9=P@K~I5Qs~p*2mFt8b_8Q2UIfUi-0(}%9u>0 zdOsco1m6aJ9(?h{9#vyn~60(=7ZL%T?`yhZ&KzFghR><-%NO=sUi>Di6ZJ4 z-%rPb-d=h62>ir1-SYxOL{+3JuWUB>NfqNOd8nQrVE7n+bkAqr4L%bL%mJLy=1G89 z{^WEKH-Z2c2+k}3!E&y$yFUc&biardYq$~V)nV5q0hkB-9>!T51K}wFL^wlc6wy$Pa;B|dlvBOqF&BKMwnk*59r;8$o>HRBgPXk4B7H3IYb zqdi*-5e`ALUXX&pM{tj}(kZb0q>9?-WpkegV>Q2#C)nYS5B2~TeDwx&bT6#i1QI7` zlGvzB#~2DZwC2rxl0pvn5{;Yjh|rhil|QZtNK3P3UrR<1MuPLRCU|gt4`%}A9=9(8 z$#Ar&iEKcAL_b^?hs-bm(bf2yO8NbiwB^*4axA*GT&hM%2~8M{!r#BZ@W6qYBK(Hm zN2?ulrqdF~3+pKBaU?v)o{8NLkOGp}A8(|hY!R7jz?z3pGxvS9K<6P^fHXq*03GAe zWeCCz1}#BAkwT@=>gEsu1&c|9AT#4&QZ^bUJ!nKCf6R_2BIC2i;=V1B!sN0%pb8Sm zaS-s&=m7ny)Xkk_Dh>$ZcTDsViO=UGu%_jWaQRufH47EAKmK25dB5&*M`)HFGui2uqeO; zafyr=MgX2c7foiJ`2SeU6iA2&P{o;Vm+e35407PzKKk8qr3~FDkZ;Hh#&x_wyDK_C z9cR$~_my&Yba0`vVCwjyeX4;Mr2!6kLHAVf{957+#~H>cC9*6z%(E`wc_r@1#~ZCV z(Y30NptYclsZ0Q?MGd015#1iG-U)r>WKaPpKeP%4o^Geu~Wsc1BTJ`NqL65Wd8HCsZ7^C512UXcWao-`9K|aCFKbx8RhPwmgc` z%8vsMX;OgO%k!OTgq-)JJq$!#mSx^xahXbcFwU97P<9ZdQN7!S03KL#myi;?5$8S> zbSFUMk`Cp8=dq+R1XM{9l9IL{E~KP#gK5pGU+J_^-gB7~1OJ*{3A(eGblb5mK7o zmMEo(&q#3Fg7GY1Ja-jBw+}y_`|zp!ct$MgOP(K6H7sU?FR47dOg>P=gGMlxe8^Zb zuuUTMSR#B}c$uXg;`W&;#?O4vt@;=PbDqbKRy7wOeB9DZUAUM!Y7OHRKIpYw!a%8d z6X@?k__(E+Z7ar&WaM~!2*+cfR3cSR%McDJt+yCOmGFs~GC_$f98x8Hw=k`)bfw;p30oiZHQ8Z;GM^A%Sjp1M(NG0&-t`~gt2}BNid5>z#LKTOakUdE1}qRqB_L=q4b_-HtcIjq=Q`|!t#*C1b&dk z1iKs_b&-v^VYtEF(&LQ{;6Hjk+jz#+Xujn)?P)TQ>fjM7aW)JVN0UZ;AOtsCVQA&dC>VC^kl1Uv-2a5=-V2Ze z1BMw#?KOnh?#7UcHOHwo$H45*(|~~nT+ZTQsx+G_^9(IGJv8uxwj`?)%4iW%7^au2 z)V68hrCP4K5LuyCRzXwMF&#mNbco5aB8=z!Rnh}iN!VS%Q*?PI^ba{v#bak=yl^A7 zU*@i;Dqwf+mjD0`y$K@BUz!Ive`U523^0c3b#%UQO2L$g9h{PqC+wfE`al8!Nb4EJ zNb4VB7W%e1B>00d%N z5!EcngrW!E64BwCcprFuc-9jjl%P9m|Oj}|Dy)^6z;71hF)M6Ls3r<=C zqQWp1OE+H30%*GcF81sagF+6>umh1aBcStw#Ry~vR6Mf7HcI{}2xW7f$JS%WYza0r z1I0E=L|-P$40aeE1enGBdL60S?*0;|2uVztE84ton0fb@dB2D{@5$7A%JY)R1z-wLDM>i3(OLY1^n}ye=jV1*@&J zX#|f_`ceWO>S=LrwazgpwuR7(RLS6R1H}y zJhtFV$kOGmWNHwxG<_ZUWFtegc`?LexR1b1-F>^}D%o(Ap8)!MMWm=A9DwZNDq^l7!mwt!L zHH|O$&~Vy^aCDiEGMCGkLD^9oU-Kz61|xQan!jeQD#my6P_yDl)S2@sZn}*7`Oq~l zpe;J8ntx%gD#jo3P&LnlZ8{`#H?2;1K(ZjA@w^KLc)|tF+1x_46v~E2Bxnyb+HGr4 z1P`}}(BDFOMO8JP;zL8ah<;H~HTeUQTeq=?4{a?xfN*q~qodVPVDth|c!kjtGVwBs zoXf485~@Vb)mBaknK>f>`M@gxP%YzkKFp)(UM&YFEvRDnu!8BqZd0nOP9twKQY!P3 zth{o($*UYR#tG+(F(vEJtc4Y4jf3tS2`~1QN|S%#LpM3^<8n=o(BC68-di?!nfqZx z<0uAb!M$&rL(7l}<|uM5w{l9T5;?icTcMMLDv^^{I;)%#GIK@%Qc*GZZw+G&AA06( zKsaRbP*w?KL2?O?aH2THiMSxoOW`3DPsg2x%B?2~0C8KmYOI9J#zv7d54*lqP6<^a zXMvSdLT1ho8N)cRo1O;X<6_-|ZO1`QyYKVe41v>1$Zi}$GGVr%`8WJ4T>cWos{9hN z8yj$8NJY##?-*7aY8dzMp$BL_!XX3XA6+rFa*En+RIqJq>T0{v|K{iHSi2P zxG5%dQ;QXL_hP${ZF5IFZoQz_g`+2IRJgVSLk!VFD19qO%dU=={){VXFk^g$8O1u) z$^j9_?dk-4Lb1qG34;_fDJ0}Y9vlt$4AQ?#+dC8n(vpIyH5RM7P-c)0bT%= z%J>K~)p|28%Z0E^ghK#xLbV+)Q&>87yi8$dc;tQ^Sc`sX+&qf#-_ft{-C@>g zPN-kU%XI1>c)Xgzg8g`z{>z(pLVXIG$u9`&b!hjhDxz~!yn$l9^(C0EnnU&Gw!F6? z!yiC|Y|A?y2*Xx)LYX>3LWH#B4DuAfUJD$O4TGi!uDe*H#(naF~9Vxz+Ax^e+RGfAG-DMCZU>MUULo(}X#7Wk!R;_?0 zfQFO-_g=4_w@0#?n~ar!Nk0S{#trzMqnF6$UQ?Arz|$L7KVC)~3&Md1Gt23XYpN=P zZN+sK6{+Tyue0KOWha<#*K;RU-?50W@vDX+l~a)8x>P=WTQzx{k8lWijF4*!ujJJJ zcH4LxXE6JXkgJTj>S(4Nb*`B-(CK@V=FqGcRb7jjOSf=I)VWqNm*&+aQRiAf^Pg^E zA4Ld#KlxJK2&{FhM|^ihgB3lNSjSK({^78W2JU9Mto zch$o9dW56PwUxQFM{#M?xmMxONE0_o%mXCRO|4?L0RhKd_57)4UPbTW8%VGA$ZH4l z2_ll}&9wFCJ3YQuRGao7^ghj};97m#<w3E2)W**eOU{# z8_WY>j+<*ebD0`>)O8iW$Z7U#F%6zk;oovP0chG(jBs?hHU#9_5_PWSfBIXv65)`# zP6U29+>_!B%)6KSg86AT=NZkz>e7jZ>i2jJBf z30ar$<|$3ikCjB*u!0Zag{(civ=2ww}?dL{?R8rEBd4Z zqE9+1`lLyLN!trTVt#Pq5q`so%kpY4LJv`cF#i#i5mP}QiI+qaUe9fU5{7FFfysO z(>A_xtx#yq%pOuDnUEkX8v;FWaPhIZEx@0=USRUVeV|{8MwqUDT%puclBIVGOkNh4 zyi>T+gBr6S(8cBWjoEuA*hBPgl zVUs<l7_MIJj01)oq|+@S=Kpdd;nu{sBIMVeg`4YQjuD5iZZP_Mn+f){O{~U2lvxe z#Z}n72S7)|lN^KjjMKLvg++dhC=E@T?7jo%7A6a5sou`6wpYPchdW25xltxN1Eq;! z4GoDXpSYq+bvDLBHo$;%LeyD~yNR{a2IGzO*1OGhmW3;tUugLeU^1lyp&QYpJ6hcp zRe5A8(UeEu?^Bs>>wl=;X#4S>YG1VD!E~*FKzh#D#u2@+2NzyNL@&^n`8tSAjZuvp z+1KgF7>Rh`Lr=&RQI{1Bw!Dj8oM{7o$9hBu!ow)QeaWT{1Ys1PV%&GfL_5R7z~mTI zMh%mdI!KtP=_~yOujWk0E(d+7B>g}k@_`Luk`l_Im|m*(8kw&HWUo=h#c<<0i%AlS zqAP=5m6vxTl|^%xgh=MpT`;Dc?Vx}7YEubW0+P0JG=uJ>SD`+PaU~&63T$J8A)JH1 zVUeOO$XKL<>}b?=|JNj(N%&kG7CwG(S8)1dz}Qxlsyqabyn+KL)b!b>gCVG*x3$Ds z8(jQDSH8HCH>}yXS_gxRtEhGUo+>s5oQSH@vh^0am*^lXr62;-;`H_xlPE<4jlkK7 zedW8b6DN>qh?M9cOY;btdTbNG(%gEn$-UE|vGdpJVM>~xUuKq+r-LjhQMU`%UqBf8 zE=J#7>VB&Vq(JvWurN}jK@%-BpZT~oNCyg4kOeizEP3~0C?vlO&R5qK64C0H1T zc;P5rercQvY4)z4zc3rLMF-u#IyfeBEj_aLns>*FqCFcw*`G9|DIjL=_58}x19^`X zJ^I+RAx(o4e*ehkw;y|8*Hizr>6CAmzPe)XtYtfTh9vxWR?(_o3f320qSGzg^u&TW zrG?8sMMg3fyYW5`)!2$3!9t8@qOB?X>mbcFCA>U=0MYY|FmProyH3Oej=w&EJzLL^ z<2JGdft(j}p1nF2LTz2`kZRF~xNKvW&3B%iL&ZTy=Skj-mCuynoCFLG2Gee=;ad!c zs+ocjh`PFW+6IP1x`chA6@7fDu0JP|i#b4-AUUNi%ekho2tU#cjzKM0RMi-q#@5r? zAt^UtX9e8Yo3d))oh$h3E{Cx*@N0!_4$fM+f~75=!ME1fMh9C0FQnBGFh>!!)BeBx z3f;xzSHQ0S-=Pt}_o9SGBjIv^=V_9`xzBS|j8ct(qhz!E!E{nHSms|-pdxu0Pr)xa zHX1v^=VA%BDYSc=3&u&?D{_q{#lyU5GvuyKoT~TzMKfRX*a{zUH9`s=42zABFx|sm zVjc`zUn<-NA+;alOBwLFR4gX2iro+xi;1gZcLm0tTnVIWHEiyO+~Tin7sgbN9R}GF zPIcIkfMaQExf)1w1wP+EjAg;P1Y9^1pV~V#|`yGDapf zRqxI8do%rhzJ5QysaY9{WJB%l$DEZeg6JNgsTj6a&ZFOq|9;WJxbUc1|-ih6X` z?5)M$E_^M6B_*;kFCU$?xa`G4FR#@dm|0e^@TEUr+P4cibaU=szv``mck_Q5p~{%| z(pN=G9$dHT4&=~Pw@}SF6xf_2{yAnfvG{&#-dS-6g5%1=Ogdu8ovICfvD0d$U*J?p zEP0bDB8=WE2Y1~6*pa<+x~MEA>o&Z<>F!;7zLvh1&r`l_HGz^?Lm~ccbqsI?ysi#@ zEyZj30y*mfr%*utXp55)AnuY9hO|%Nu`HY$bDn-%&TtBCLos%e)v@JU$|o!@aRaEe@^>7S~Ck^qQ{@B_Nrv z;lGLw29}At8Xm9I~ejC;5^aSpmM8{Ux2imO)5tgP>J8Nb6iPg=*Sx|3bE3))V z74bG)=*%K;r_NTqy4Yw|mgJa&)&EPS4DOPEv|0ZCky7gnkV z+ANmir!e3(0XwdohJga>Bfv!ewK3wW7dD?*i@)(H9#I3S_nBuB;V2u$zqEGqE7lvN9OSr`Zt08&Qp(Cbj` z{G(T}k!J^*qbJkWM3uu^%}>Y(XXS0!h$vX#ukK)A4Hyysmsz^H13XkeWO&rjVdp>h z2!@onrJ5gHi!{!b9L1hMDMK2v1ls}w&~e-E`0DS_fji6KBx}u~eY48~6Ys=pK;qB% zDtG{#w_^gl19u<=X7`&_aVkEi0_rLQwSc{P7svw>VGT@LvTLbXIP!??As7$W;L;r_ z0C;#GtnX&{9|7@q*YwA)ak{Fh3Re(ojODX8g7m@Ugz%Pt@V+@Z-k&-+q-15rg$toW z?>VHV2wxvnUy%+&6~|Jrimn21oKXST0?o!E5v#&|1rQo^Lv)-fA~-HI9V>8ugS*D6 zGB77ro>>1-@AKlMzBaa^8alADPH+m47#7jSw$q_Mcq9T^pF;;WI9#z9$G$ot;#n8i zmi}IBCM;5cHnuV|NjIHjtC?g=a9QOlMO|!;ReKv-x$1N+IA1|=i&zI@z;qmg_o9fBQ@OhI{#wCwV_j*z?Q@w4+Wlr?A_2pz_ zcztcpO-c5R&1~!Qj!nzT_T{$C@};y*%SiR!cy5X>Ioq3cZdzuWE@RqvP3_QO^yuXF zo!hl*Kc;P#*O%%YIX){hqfPsB+nw9KeP_vs=yQEpwj`U|HqwUCs$#R%!P9&{H_m43 z81SBe_nvqklboLA9g#R<#E8)&#*D}q;Tw_N4%M{l(5_>(Z`kyKe2ew{O?J zeftjWJGSrCzH|F7?Yp+`*1mg(b{*Px=+L2KhfWQscWZhow|2!*SUS?4xKx8?$o(+=PsSQ zcJ9`>dzW@y+IQ*DrDK;)T{?H^(xq#cZe6-}ZP&GZ*A87fcJ0))bJs3iyLRo?wR^XA z-P(8S(5+*)PTe|p>(Z@jw{G3KcSjSuqx$YBx;wIUM^t)dN^*8uX2z7{^c=7JWMw2z z^k#X}y(!t5zN|^U%t>BfcA7UUHO+^pv?<=K0Zg5i3gD;qO3w23&YU-4px20wIZ(cr4K~E)BB=~)IQ#<6mLdqaz=LVacSwPgV9TGsyB65 z+URtYnd3_zlj)n7oZWYF4zQpXurMR*s$H{WI*cREN@O~ruyxxdUkncwgmzs8|@#RlkFv}2}s@htQ2;2B&JQecMOt@9fv$7 zut#R+PV%C|K8($vjP%?AscET$lhI+byGBN;f@O{`EeEi#e(Uu^&<6r2)ekDka(PaA z`oJ_y#^m%~nVIR{``$Q7zg#^r9sggJ?3<7? z2?4@I22g(>?urX3|j1Io}j-sx@Q!PMnmTJ1iTsj5PzkJ}=slnPEjqkFB>} zn8_0cCXWW{q*{>!##q5&Q`3N)A+KzM71bxx3SNbo;Q!Ds(`S7_c!0kNy+F4oSl>7m z(lT=V895Zz*P-6*9G^ey72|xFQ>~9656PI|z!$6k*0(EselP?847H6(!~7KT)yE`G z3URF0E3>>-fmY;zjFj}8RIl}ZIVX5}`0@rPr%Xs53!0MwI%(yw0s}ILz!;U`$-XpV zgrCltU(&P>e(C(IW5Ei}@PE-4rk z;Lk*vkHCIkatbQSQu9;Oq6`q(WRnJES)q|$3+YnQGqW&jgdDRWnm{FIrDmpNqnRTo zq2P&Lmh8O|^`&NwOi549$?~R61lr3q)DfeJroTUxnC=}rb?(-+Lu$t^ zsogqvAj@vwA*F44+Grn0M_W*#%oHVX2xFqmQ5@&CU5YaQtY)*-#Ir9&AUvz$&+G%l z4I4g7AIz~8P!TGSf)qUirA#JJh?g=T=p=~c$Sm|jxZhP^V-T8Bhk8?Td|BYwern$@ z&6}P|sAgnljLZNP6O;k%$p%+QPtEED^qAny&I+RR!At-gXkunY53FR`2q*q~rp2jJ;Wti9&&U$UoID1Ag;SJ5%d^^!&h~k| zZ8MUmq>TkxCsx>OFIHEw=w^h^!XJ4an-v5*_78m^tM||B!8wpnQU?3drl2r%FI&)9 z=m;2HKX5S+QwnUPq-iMzW*aB}AOO;bDb^!KFaRML6MLrUJDHY{(!P5S=VW@5ctnjvUV{P*70Wtn6FOo(E->`jRs;GT9ek zK@i4}_E`l|PLpYn1}VqHXCUpQ%$$r=3-v72@_3Td!NpQ@Jri@XLBVr9qcbrzr+Ohg zWsU_=n+R-3$%6QsJT@aU3xLd;n(U(pfsxIbn9*K6IzU+Tw&za=kgP0BO~{vE#hy`^ zTmVRq9yu9PeaVxOT8;8#W|01j0tFc55!kyh?xbP-BP~evPRtbY0fHj>N)5NI7UH|( zk2J!B5c^HaC{hVf2ILoVI7Ym$1)lPJiGz?ciPAgS2K6orD48OT`C&T|veHOlF3DrF zjGXLonHZu;xxE1|5KOQp^6Wld%t0_mZ>sKi-zh*<@~*x&CX@OP$QTD1GP_S^iiw*8 zAs*}L4DmC0BGDV8o#IOqDGjn%E@dH^?|%GF1sdr{ElYSI-)k8^RT2D=*R`?pR_5MltaCQ zIfPInHFa1H=mjS1uyJW)vIjx|kibxC0shdH8I(=EsROh7BTauahI}%`n>l7c2C5j4 zF(7L|76L|=QeY5N0nYD~ps@8xw-x$>4qcrIp;+2K$fui+k2-{pIy4AcSvusXWax7# zm>?#a_DxSC<@O^b`Hk=dEkJ5&g76LB}lP zujUwg-HKma1A(Vq04)gaCFWzwI4yByLGuPJ%GIx&Yy!;?uAG)NG7G%N6x{q&faE@i z7N@F-KT=BZkE&=Oem2tIn+muWlWKgxl1@ptmL4`Bg>gFLUSZm_(3qGhMRnqrFL zZ6{$ugGaLb^Xs{7gV5$C5cKQe8Tg(M@Ln_IJKyVjJm#j)UEy~a4Be%X8w@U5=W&e zc6Jb@f-po#B`4v)_$5RO>e`d&8ROo0o-<=s}8?wn`70NYT?H zNSV}HUV3<1qY{d!Jv>0Xk>Uiej$@%-2+1#ORWQx_@W?PK9l2O+$ zsE~8WeE%Kqq)X2clSB%zL=X^zv{9&Er!_JeD&h|?Pu$cpn@8?5jO>10xf1BwGAF6${#`d1Cu8j9?nm%Q~xJ_p? zyMOZM9TyZ#+HYTU&f~Kd&1}$n<87_VmK{!5RDbx_k3R3L17k(4cX!;8cFy{{c0Tmt zhs}O1xb~tQySpab^S+Tl;=B^6SDCy+8cmdS9LEXVtjr{0qh`?Ns#P z%Y)vUaoP)y?wFtQQ1csqXx z`b|l_q|tkBJ?n-Q4-FqM@b`IlKH{$N$hfz5zO~}VLp5(Yx@zeIO)hM>w#QA6ufOhE z-??q>pV_DWJAHpYcT1DEpMP%d-Lrc=;;h}b+PoK*{j%%DOZMLQ%p<>dYZ~*ovGLn^ zxBiqdqs^5swB20axpM5-yK+)Xu3miA)U(b^ul?bHr8_^(pE&Wzn`iv!x}dD-r>B40 zuR+yUXTRR9dD4@A3~Vsqy`u@Ya)auW&WFqfyPGZ6B_EYxy%(XY8Dk`P?IQzbtCf{Dxhh ze75w14OhKbJi5i8*%x1WY4OFk4KW@rn!BNC<9|N>(Z?TOGx42I-rX~NX~zcjZl1nt zYVDh^I{%9uU$5A|skZy<_eWiG`wc(7+2zb-MbE^%+<4v6y#C`F{WRf?A>R(a@{#-M zJvh@=<-6RoPygVl#ND6Wn(ZE5wbPS(?)~h8>G2=5fAH9_CVkU?-q$2+?^B&Fc zKWf!~bokL>UnHG2?D~g>UO)b!f4WCsb@6N6J)8smHlNv5PaHa8HgHF?ucNJ``xpP*XjQ+zr-`djSb!`56+}=4$PCKLf zjlZ-zEpNX)eU0a|9WOVW`CIE>4;L?7*Xi`+%NiCPt<(LN{z=0wA2ITZZsY3zSafak zb6bD3CdYN_wBDnJ^|@~L#f`2$eb?q+K5n=0{l-ssx#hfxbGicY8fs$)N3fzdTa-Q=KN~O#ROO%)+#P)?U@@mw){7X}$Gt%(my( zJNRt&yy7=T{QA7Rb+ymOE&J}40axtL%bcI|k0vck_YPZq)!RMXS3dmO6wiqIGp3x@ zdsOauqqClQ?#~wy|^fp8IFhypQKy7nAj4e$kxq7oPT- zx51b`y#{Pc`st(L7hJjEl0Wy?ezMTn>oOyM%~cPqJM8YTqS-fJImYdHw|jE#)MJ}^ zUiW>2D~38exs#K>Zu9F~*pAZaOE~j^Nw>8gTG;6J0S`>N%lCAX)t{Z|J(T^Ax{u`KH>ou<=a)HcFO2*8&O2H( zyrJ-BUzhtvRzGt=l>?7;ZM=JL;|H%h+OzS;GyBCJn%27B!2SJKJpZO`kGpH^2Xhvl z?(YBDMSTY@8T;PXEk9n_|K1N9S9xLUBip|jy0gWq&t8Abx4d4rv#MX(_u!|wja%QA z)_Bt__cc48uKmQ9BU|0uuU)NsyG(9!Q{8n>O>g#(wM!=)-nsLJv+B2f`hf!vf0;CT z$X)k7TXyLIcf*|T%YNxr^O1cu2R{FBQQfAwXJ6Cg{x&;{hxxXj@x}0`>z{jN|BGwA zntRW#ji0ZY-uH^yx2$u0a@&LV)}O!lp*iozt!?^H+wJxKti5dNl;YjneG|`ZkUQt| z-hVzd#*#8)vnAyVKU&>rQ>|#w*@m^V-e*$Sb!F`E2{Nn+`vI(S=37)pZ?g`_{g5U;Xp-)r&j)k^4)F?JW-% zdR}Wkrps>)HvO@AUgH~28_}f6*0WaM@cRn;JLx&~M(w@j=I5#nyT8#}>&HHE=z90U z!uf9$_xiT^k?i>wjsLoBlRaNei8;%0*S|)b{aJ_n7KiJ7{p~rA-0@!Fs^WviNrlrk zxp(f~ot$}z{hF1RT%O%=>$WD(4*crtGd_N|tkn}27Tmi%tNst$hs+u>b@F8gSHAO4 z-;J$m@4M=o?fYKccXRO-Mfc9UC#R{WZo=+i9o8PZ=Cixv$1nM%eqOJy8}&}wlJeXo z8IulvGq3iT@jK7zR-;ChhP5wg(y({)X5S_}d!Y4_3ntXb&bYbG;@cVwzx=9K4mJCC z{--0ZK4yIR@7kwda>nSD^B*)uCf_rvOYA$%z9~IzU#n+UjGgxN1(zM&7T563&l-Bx zB@AEFVNL3eU$Z9GS^B`7G3TV6zG?r)9zSk6aPw)WeZIZVBy0*%j_w_of zQIm6=RUXT@s$Ik9AN}B|MMLWreEz}t@7#JulQSB%Z?pyN9dTd5#_m0ovm*3Z` z-P~(dpS|k-?%y}Adueq~O~*YK?)mlL(O$`~)vI-WT;7F?F7ST6`Rd;mHCgE1+q#A= z_2`z2rSWqMel3{WWdG?)7Jl>VM|ZD!a&ph)PcE##uG!!{Yv(_G{;#(mS=glhpYC&# z|FNiKZO-PoA9!BBeqH;fcQt9%VEh9mAG&IOJ?@3k8|y!Q^V-_^Q@4GZd0~q?&$@kV z?M3shZ`Sj*yw+c(EV%HZZ9AI|$k{ufuXJ7l-2RZZ8hS^~K%Y<;A~e&E7jrIp^MczH{#V z{`m6C%zkF}?9nxA*39f#+wo%eSj~h>6OJ$IQL58P-Fch%W1H@GOm+#m`a=`F=J62s z6)ipuE@$pg;_mbsOGdvqN5k)L!W8hw6U%IrA*}!jq)DO`glRy(Y2w6 z&(!7>)D!(X-K!mZt*k>gr!6av{WiV4xzKI4zl;q{e1U%}Ll%?fcpFNG<<9mBjCY zC%-&Y>fOoXb<0=oS7)8efjO1`JlnKudF`GBS;u|G+MmAP`h?+2SlO}DH%tC<(}~y5 zm*u|bTKU@Q8VMB>zeKw38xY&;&AQfo_H0{mNh~ez&`{BK;QPHNrcJN=>XyOvFL9ji zlp;>C`gP|H>t#D8zH+^uvUq#tVbyAOP`}^$b?F#~@U>f~Tsb?~Q(eus=d@w1Y)tD% zdwp=7_hWUlo!c^GiCUU8fCghM;*?Fp$+SncL z>{F*)zr4MEKerz<2fAnXUK9N~|A+Ks@`+vxrcQS}{Ay2y6xW}R%h{EC9Cg#yw#A0; zp^`WuEum))@CG zRr~zZh}_VCzO|;ud3ImkWAI*|3Kx#_-g|7gZ9C@&J31;)y0xk@f8?(g=PN7iGJVZ$ z^Xm3;o^fr)q#+L~dR4DFwP8WhruKIC>?$|$xa_<&D%dwacS5rpn{Ob^tz1Y z3dw*jy{bwV3|@J{YvJD4JDv|~;1IPrYV+(}T9@dVW2K|cjb9l!aq*{nsVVjq?_P3U zuXQB0{0O^? z-RGTH{3XD??}%06sA4v8@yF6`x9Ik0$CnDLU9-}!8LKRCcL`YU`R%JV$zgw7SnaC= z*RQFuuVX;KdmEcZohq#y-{`SJxl^_q`#+CyJ5(v_RqO6vt1`=1snuZARfoBY$BmIY zx$I6ZThY7L#XOs-E&AHFdiSAjN~Jp|ukQHl7Ch~b>)$^dd~+volkV=(o{lAKY#pa} zZ_>r}#K)S0nm@8B`NaKA_3ud&C*Ja@(0IZk_p>kVkM*c``|8q;gBNyh^VIQLwIP8U zQU=_8zVLMPh6V|?-I_NG*mB^6(tNJpgXp309{2rv?d{(9QvB3q*l#J3?c_e@k$gk# z+!fg`wk{oi=8)~zkjvUFD{EGHYd7X{zl~))Q+wauTiYkDjU-sRT2`yHbM(joGe<^W zmwU~5H!9YK( zHBGK={y3@eTDzp=ig(_(=^tMG<4&I;KK;BxS6_BMPIluzopoEw!J`1h|N z!LJM_QnNMrXM*u=giv)CEiwv@)E}t-%(?62k8L!O{Ja;SbM^yO5>y3o}Q07 z>DcYui(hXS+FzY`zGu}c6#{M7U#r%z>tONz$FVb&9al+XH`OjZtWIy&^c`*OcP{ja zZrd#}qxbHr4)Ie(H>W;{u5cqdqnx_u=dy0 zBW`5;HEEHmLjrdh%Z%Ri8G$25j}Y(9Qi_Lg`^agYve> zfBl;DWchl>kHO8LcsljawgwHa4}V$H_SO9NZ;L6Lv`88He9~fv3LaxzK1pWp=<)52 zYPT`grj^sBydJ~veeECcctl$Fw#GkflP3MRboTS~hgnyfrJfqT$79vCQ^WPd1z1wH_J2_}bc$ zvNodb&Lg@@YyDE+c)GT8X6(tC{p=P`Q&y6%?X}{;xG>keZUJ6HLS6=L`*YLIAzArr zrR(20H<>%Se%%J2{G055^ylN0k9KdQIfLyy_BV(b}){u>G>BzFWkOS`&1$r>2N+PTRWw#g-nyA1gf^ zc=%;4*N9s^iY51W*!a+5kMxpbUfTb)!MWJ#{@V_zJo?9-E&Hd~XKR<)=IJ#SR0*iJ zZPT)2u7i3wgiBX%i@MtR{oeG-=3%XC222Ksq;uTMrm6*^T>>_V{iJu+-MUR zZEN(Hzh~Z^(hK&@NItOa$KuKpogN+U7W!=Ya`*ygr?H1>4OIJQWF>Y&wuI?Y_GAbXkOJ2Ov*3PlIjcbQDPi&p? zy>35!RryB9kZbnp_wns+N4gBGy7x-oxyA1VSMv>44hXbwIH*D1kABMNChicU8`KwX zKOH-9+Of6~dyeer=-cUu%aIDpmgZb+ShoK8quLSIcGzc>d*OK`+c$q)DGxx?Bm?jt8fp4LT~9<7m#|0=$h zICbfkHTPZD?b3x;>{r|ENlx&vL&;D3yh|NdCUE*LhY?>Im+WmGacumS@}*_BQ*E*i z>@F>yu*CFWWX>hE{G6Ml@$rnMOSXM}dSUXaHy%NbUWXR!_Vhf`^Hr59N#i!0vXNgX zE|sM%`sKK3!>F*BzV4lF%#Mn6f7;-7t??I2Up?knxnFpe;lB5Tjow$XOWC)y?dxA< z@UT*|`#(FC^0sAs9gpLGE-5yz>ADlIE_e74a3j%a!Hl7eI)3R~ZtrUK!Lg33gl!*T zjg_{MtbepDYyESvcHoU_ucGdev~^_l>+Nji5Qzp3^(^8(Yg;t@(92Fm?#oYkSi8M@ z<`>EDlkBh};TKMIwGQ9*;hcKb;U{_?+D*&K!mm-yj~VWQ1DU(i)O?VZocUk=m0`(^ ztil&Wr)TbW6Yh#cfs=YY=v)}S?bt239_wi7n)}7RzIW+?Yhn1we?^r(^TtxY13yLF zJzCt)65f0B+^go`Tvy@osS}IWs#|-ECH#&?B^qq|utsQ)wvUSq{rMp4s?Z)I>kYE? z3V19L!msRG_41>yck1)u2VT7XbZma}l-7Ls{9|#|*OwjndK}+=CI8&ys42B&%XYp! zhOOx}=U986`%Ag@Yy0R*Zi&8Ep3OeXwcnEoBkBx}I;xkp3m|IVS@kJKJJ^Ji}IyPsR&{OQt0v|n3e$+i=} zkL%d)Ov;hhXph)QrD8Yt$(q+K_|3KqgkSuzv~0n(N=F(dyjW7&T{Lib%FtVjmlt%+ z-@HjO6o)jQXlpp0KEG36upqzwLkCf5HQZm~_72EJ(!Ax2I z!~wur@J1VY{X?y?tu;5* z>doTn-(H+>v~AFE^r>U^BS+k|f7$#=|2cpB-20;KcbDEzU0fSg?{ucB=daIGmIub( zs~;;4%B&H*^5M^q+ijyBbZITKpIq?jg8lsd4bzi*&3zly&t+@gv$EIP_YehTZZD}> zaKmfk*vX+`FIwb>g}guT;K5V7TLGVwx-1JX=;E;cy+@A+&X>Mzeo@b+TiyoOIl3h# z4==gL+bMsJHosUqQK}fB(%bEoy=<3 zo?Eib?)^8sIv>&DTl31he%Pj7oWAI0_mv|&T=ELe`R;M*bF5#*#E(;-%I42#(cZY) zdd4=ZF#;U%$ zH$QT_)}GpvlEaq;-~2qt-L_zxlR<4Vt#O+)^`dFvBFCLeZcaFQ{``#8Ejz;P#zeYL z9r0|(?t??-cek;x{NmC&8?&$c$*Rq=GFu#G+AKTi=6KoA|K6p$f#E(~fBkiK??N|4 z*$GiK*Br_GIAiayd)q>71|ENRN87pCu?7PIB-d+9cku2PaCMAkc%NTAzP;)6`nzkR zwR_T?N;O*3(`{~(DGs;9`(4%qbuT?=M$^=gl7G)~aA?rWdGd!23;G|iwNhRB#kOXtwoeV|CqAEsnnR|8u;Xy~oi-&4Wke3@q1t?aoZSkIRGY z70cSIrrqgyG{v`El?<=(@5>BZE$yzJ;C^L?{OLkF{hRQmPCJbqHdTwRwRh1N=LzZ? z6XrhY*`f=3mW^}hTPrCo@RH9wK zTfRSbbe@{J=}M~UlSjMo%5_?_Hg22ap*z~W+)mrc*UxP!i0bsPM2*PiTgE7za^l+G zZ?Ry>tq}kDBNnc0=P~+yh0}+IN-8|>dvI!vHQ~0IZ^jqUP^dE)Xv|@aB?IH+%h)0WY0u8jjmXzF%E& zNaTSV_ijI#`?|^xmnzOL9-q^GIrehQh65jcTZ`>HA4`v%$Z7TTRriL5%~AF<9`^dW z?aygr7WHl{npjop^3(In-*W#xn#jZLL?2W;yn1e$z3bQaiicx%`3`J$?}A;^{J|^R zw2IwYt#+gQBi9O?L&B;}i|P1a(dtG)VYxQnJnK|yvd3nf=F#(gwfvqx>t<(~IHc~S zF6Hmke5?O^NsUI%Q;dtZjd@#fhHlM->?#34o;M1P#C>)w+f#AUWuaV_R?em?vd> z75iMgfAzji-5i`+OKB^+M`&+osy^69l>BA4IyX*AT$G`d=h@3FQ~mjl92Ps?v$W1IP6q2b#^ z?^AuQ2kiBXU*WsOljl#cMu0wlf*J{^@n; zdN04kQuZ^p%$Xb)`)ZBLn*Udi?5PcadaM zi`NgG?7Y6E{94evr)l4tp5-!b-*kFxt~Veeblc=NFSeZsP5#THUS$6X(PK7tb^H)F ze@xO6+g7)`H}vtJ|ITfLWQ70fXr~IvjrXnm(*AYo+_$w_B>Q-zCso~EzT4Qpx)-0G zGBmrfZL!t9ib{sp5g!kH*Vedrz_FOq=DlZQR?Xe`{@V%vQ3m&3Yvl+86CbwUk zJ&g-&zHB(;(Djnvn6yjXCe#gX;h1x)@%6VIzhr)|&}h@=3k7cFR~7TkIkW3fzY(Id zc|*I~oN{RQKH=cA#@$zlhR%Gr*`e)h+j_N)@*$fqh#vm(^l>Y@phAyXO0V;=L%m=3 zjQ=Q(7&ZRmzIMw>%a=TP)^vFThq-m$HOR8-6!z!og%3mH2DrBCdU5hwMOy|oUeHSfSH&5yN zxp7_bqg4N>8ePYZ?RwM|m4Mp*CY*%e+V-r224 z`NL~!WY5gvHbLoI8dq#`=kp%BonG6@1}EC=_X(a5e8sfJdHLf9$EU1J%zAETNQl00 z#q*f>OpiIE|Eg(tarA?DXa~D*7YAntza0H$!s9RX9po;~Ek;*Mn7Vw;3xhPbf0sYK zJY`M(*xYT@3&WFE6(;4NQ#gS+l-TJ?CMPsP(4x1Jp7^kZ}FYx#dvZCq!wY z_4e@G&}C%xpN)$3`Lcf3tJ|rz^6ptH*8~pUf3@k{-p{6gbKJYRl7q{sd-cx_3n}%m z-%j_>6Kkyr*yrc9@Ipkjb>lzSG~S}0(X!r`rK3lByy&tq%W-h(g#HnIx5ch`R(;u9 z&&uwT=DJK+yG9?k+BTO3!-D~HxjEAeA-myTWj+VgE#x>!~<;%{G?ISKXy>m@b^ZWKUElyRs z?d>}LkKH%;Khgjb7VT+TYh+TcvaDo#n<2YgX*J zbL`vMS0n6RZLSshX6f+#HN4Je7b~cI(mrcuKvJy_Gji;PUo4hq`zz(tfL$34>JLbC zULHQ!`EvjD`+BY{J>bW!-k#+&owV&^G*|l6mT7yOC~i0ASd9wK_eY&}Z5&vkN&kaR zuUfvYbgOIK!P3DM#~V^XD<`j;&hZ zc<}3>i6^HOgqC@9fATKJ1oxe-I$fLJeeRe;+S4r?kKb(bWX!{}Wws1myQRW`(FZnE zb-e$|^KkgR8m^1R>-`#fu5^n^Z0M$0ll-Q}%=GWK<05Pp)D|r~HX~E59WdzI^v81? z!W$1P|NZC44jpexzxJzI(k;5`#NplNZ>cz;PQTr+rrr}T@NM*@QJMQ^^x1PVYPWE6 zDBmc^r}(k!L#j+2QhH0-RM+AAl!*(vt2T~mWm`Qfw4Zp{n*%G$Z7Jck`h;WVsXyk} zpIdEkh+KH6=JfvE3I^^z=u#q5IZpeqMXu+W=Kanlx{6EmJfJ%Z*=zgr zNb-;_i`Kj!H1fmLQO7h+d$#*kuU~PdZsE%MU!V7h@W`GrXY0IWJ%=wT-?Oh_T(oV% z_F&oYNuM7_pUUofw%$EQ)zX9?k4+yJEF74iFS%!yd$A`8Ki8|8FOi=$9`)IJ$ELW? zvp|nSBPtIl8E0N~zq8}um9lZwxA>l)H*9J0AMUT+COzwMrHM_K;30MepKfNEY?>^| z9zS$iJ$spRo-y(Cd50m<_8TAWY~|8#-i&k426b?=-4Hq9%!k7PmD7G5Xt1H8P0~#- zLka!1UFTZvH4L~J;F^f6Uq`&Fg)8zn4Q;_;AtD z;kWYb`;A>#=c=9Stn176<<@dMmNF+`O!gV)1q08Yd-KP}t}S&#zWF7T@RCieHY90Y zj7yE04ff2jPqpiBd{OPiuth!BuIvBe;LH}zb0*e7Sx4lpBZLz|sVfAbKzq;@3YFtup<))ESJo1xj?Qqv8 z?@*@qh|o3eYa6E4KVF2Ls&>UbbvxP4&8bV7n7fe+XDpa9sG)Iy-97givU3%6@?Rm} z>*X&Gh^%D$=blpHldan%wG1qn+;aXzM}NOE_5&)PsWUnU$%B^ z_H9Fj4Ds>juN|kI>9B2akJ5SbP7kx+^JrDKyn`+eqdtvrZr^U1OB3C5b6wYZ>)w1x zIFm7|tT;GQF=Lze_iO5AwGSRyRo*_~_JIBmYwfZbdE|p(dr~Er+LygVebvX_e;8cd1ZfLh&i0 zl^t(-nEQ>~U*gRp>CC%b+eXB!w7op%*@lv5+*uSLI}npJHF zwL0terpK=bAE)(d)8Iu=!Py$AHmjSo>0#K_>`d$QxUV7Wb~+@NJkvP#S?M8_i#=}U z*wxo~+a zW0!)luD#a#T->dhlhXR(uzKRJ0abIm)hVYQUE z^Z#FzE7bF^_n*I33&j`mTtBJFsKxujQonlsjr^Oi7uroml{!F&rPSz18+zs?xm{-#qK2Fl#nV6i9zY4*oq*Lt{eiaYQ&K28hk zi(Xh+%7%zVvIB0>?8;0I{ro~ljH`NvS)}Z)up^THqXHVMv^Ie(C=MZQ8&o(uhso2Z zE8Ikv!hLcR&FQ#vxhl)yN2@R+5Qg4gN2kV-N}L#^)06zEDw*XtrCc~iDd)~nl2Q@= z{3AODMF-q1$0TuB)#`jCch21)mm5jTf`Na^l1CX<$kkT)34@zxQz*kZxP9UFwsO~pyN;E+J=`^{+!?&PRn@M+ zAwda2U9Iko!o3K%O-6;EbvsnSE=E=O(-{XLU3>UZFBjalyqlhd!XE#6?C5Gd4!p(V zJh8k-t*+e+-HhF9cWdigt7{L2>-g64ukHK);%qPF0p!ch_WD?*-2`=t|Nj~vuJ2zT zLjxNa*oYCpoq1vW)IMA+N<~^u;19HU(t|HouU@@Su3p{yR`<2kNgHGe)nakS@op5q zcCBu;yBXRPh8>1`#7pTOom~>@bq@TUt=t=ab02}5XhjJB_&4{5-@+FItxvcTuVpqtm~0!x$&!JnSCWq!!wBs~eSq>8 zDb0g=75=ojw^C~Gh8loumDXe+6$;Q+L8thje@!kEiB2NE+IZ$a&p*`g$a|*A)oQ49 ztKS^rHEDz6wIm>cXtAg}E?%ft>gzhDA%h=@F+y@0GKx|$Q^`?y&YKbOaKz({=aXQF zzp(?8K*m=XiR*6fUXGAhQq6x6P-m|L_0LT5#0-J!Xz8gnB@%vQH;r< z)^0&IwU5EMISq8W{L308INC&%Ojd=MWJxy`eb71|6X2$CT%$GWp-t_-SDXfIXmqHb zQ=C>9=OoYxjqgI)M!`*VBDjaZO=)tP)C&Ex;orb2oQ@ACJlFd-cQ3eu5I&fxp!s+C zENYS0&hwADSu&-%032`Cn;9KM$BIS0kX{z*h|2SSk)j5tUXj>8o+Osb(&he2IjMW_ z4h-ZD7V}O&@A{&B$Q#K)>rf}FxD(-~u~=|-g`4WIHH`+os9T)8Qeo+Gay$@5TCZ#y6ooXbD*?LYjH=mWIafljd(#*r6DZ~ zJ?SQ^10~W`AYqc@C`h$e*XH;dC0FfCs@6acWV_nzR5Ct5Ko^#2JY^O@kr145>nM3335}2)Z1z zp@@T2@}zP9EnMrh*zj&Sx3Xl9q~$w7;jPS2qh_KDW>xZ8Z-Q~3O@zZr!X}oOb;B_-#En{ z;3+1xR8P7;Kyai=12Y$;UyfEUlk^CbNUFoshUpK}H&7xq`dQdDFk{oWS{S#akY`H_ za%j_ozFz1jgyqLhyBv%R}bPG*vNQ4lz#| zX$*$a5NOvj_!*U04P*<4dWI#fkmJ@cfiP9sm4QHsPHi$kLl(F*sLWu1fUiU=LHCtW zQm2kY;^!xkv}%QCTa#%mfyy>$O2ceJDK+X;I;@#OC$6MsO^KvO57bFt2{hm$DwL2^ zib4a4T8e!M!OfK#Dc6DVg9(7C0n>`*k1~ivVAmu=R*xRA`l7BSwQG|BXw!xa0aTsT z07FzKkubWGNJ!Ba+0bx>3r$#XAsS>Crh!%>;Yo@BscyqnE0I9wC=gF(5(%SOTsZYu z09rjPUIVd2qEf(E)R!_0HJi9<$Ot4ym?uphLfIA&GKIbaON&QH)20Lzz|@QZaBIT^ z_&F&co2yDBTuTWy$R(&r-a2ikVJy+DUqOq!h+^uiG+1P zT%dthB4Hg-(m5)Ul;uFF4KgB^v`5Qt<#lL7E8!7G3FE%{(r<+_jfPK zS9z_!yb2vIEB=WV&8?&;N9gwOCgB9?8@_Y=bOY0%H=Mj^Mc+^=tazmVVj^ZP>W z|JQeaYYFRs;aC<(M}dgSR0buq{s$tyaP zdl%joRDXJd2U@3tMnwNb1IWCYGCyw#G9vL8;wQ~eq-PopiaaxENVvrs%*r24$Mbov zxv4M;Xk^vqST}G2En)t50SYOA8%!)T#1jm%XH|)orn2@+Bki-^nb2KJ3hJ#$M~*Iv z#$cVdt~bxg04$7%JQxFS(?LAxHKYJtrZc5JKWq%Akn zKM#`d&SW~*{RJh~*5XJy)Fv`5_5bv))Bu43Y)XTbK&t?xii;{=$P6iY{O$ICbIbb4 zLM5;U|7fPa(VJC|-0)Ax2>p)Jb7rX%|MpB%n?<`CrHZl8K$^CK;-RF}+bB(M;Vo&) zNG=gyrbyGK)B3jTf4U83o@>UF>_JlQU9>LI_`E(czKzj-R*}=*uOBJ?^+p96rMW^r zp_q){9`z=%#y^(C2%~qQu*~`=cQ06_Ph;YZ@I+y$3p;HQRgV79Ukc{PnuhOkLJ8ua zSqy!U*q(*FgnI%*Mv-}?%1rF#wJM`v85(U4wA>0h#euLq{LjJ)F%kphwLk{uBa1B0FKtodDcmg>sO-U6=0}HQc zn(3DlM16e*o9hUQ>IC-U|F6a+!486ikAm%x{_9V+u{`+C8|Yt;2|E@-9)wBiznuTt z0sro!OrYh9{*TiAznpv0_V;^hSQ9YQ8TgM}8!aY?{X~RPZ^(Sy$ijw7p`Sp79~M{A zR1n^IAqI5cjbjuR;lk2ct;crjk%u4btZ!S@V!=B|L9R#kVdp zXf6Y#jQE}kG*o6_Dj}!&1d**=XUH%MH}DP*ss@^ix$yWN4Ct5zw1Sx`nTFP>*+W{a zTk8p_$qRbxS!j~03`Q;mq=!~B%G2>_3`(4L$j#7d2v1~!PmF)ok_WxkELBs~SZR_o zV0oN;xu-0lNw0Xi)|-N8)lk9AVopOluzW%~JC#-_7FTx8B{%cMAt%M6mgaDEP3#0K!jRnyQ%3q)Em(*inzLDQ zd}DAiat%X~V5>Cz<=I>#|^7^E_2IZwqrfmDxX2=&h%x2jt%0SduIq=U%F zZj%?@Nl~hx8=SZr^E9aB8jX}i$|9l+up3+$de~C!TtE9+IMX#Hn_|=TCI#ll4gd~Om!$#H$2Q0Cr61Fd{VKKBj=`HnGiQI<1o^TKbh%Dj5eG< zO9sooDonAN56waNf(c1-6%H4DuLgCXFr_ICDo`zJd}IYWRpHHE7St-Wn8Ir^KwR$tV6^>_f1;wyTZ7#MyM6PP_ zf23EqQ1>sjOn?E?ceZZV4Dr(XXv>n^w>SiM7~Hg8F1W+t_ONnCz)fqN!u|1Zx3zL_ zhMVFQ?jL}g_K^Q^Zw__k-5Q&EMlb;Hnl(vW@W$yjY}X0T`jz7L=l=0otwMpf*}SU; zde@^zc_;UDVcN5iE}{^%he0-&p*oJ_1h)r3@d2zOJf@S{-}+7A<+p9(jvW7AJq zS6_~_tbhM*xh?&W2D|{wbd*{dm4=D+@}7{~o3()C1di^VN*^*J;^gjmC)TO!jW44y z$vG9A2{UDS*97bBIx+ippAW8f$Yf(&9dO-;JjdetvozPY6CiRcjhT?Uz*vn~Q)il} zy(KkUVtIm>-f2Y%6wW0{!wRo)n)XPHh?m|ap|+>rIJm3hTJ1ky3!`jtxxyYpL;w10 zJ)ZMmO)WZww0a?}OGvyqu7dkI+>|H5eVcbvStV4163pMJk~#Sg@`bk)eO!;}rjb?< zz-uK|t2~x??js)Rb3(i?;ii26!F?8P+Gh%uY9vN)2(+ZJn=uUfo)UepjI|%BE5}@% z`&^NKn3e2n-4JXxEX?_7wgve)lUCoXg=I@q82-z6(pYAMhzcL@*0OaKS}3=UvMwA* z1WivQ;4cc)i$(D$(?ncL;3}*nS!b1}8B5$W-N2%E*gulhzmgd)HiK10kPXopq))uc z*}%QW{Lk|7dj|Z2@M(?ops3g&X&OF_7lhTXY24y>`J{tz> zs_oLu?eM)95LG*9bl0*q$99mw+9~wy5N|umLpwy(&V-$Wtl+RTb8t*-N-)b|uvCY? z3ZJS8fpCC!K%WE-hSUZrI~X6W(rSY7`9+mFm`V|hR>k-fjGd2Q@>ENM@q}C-0=Ghs z&o$D52fn!mCj(Km&B4J~?0Rr0fwny`F-psz53mGdxd)&A2uC!i95qdtRTCw_4>qSwKoL1alF50#cj9 z`O~Ltesi*q+Wh91AjgCBcqA(Q_h)#oe|Qf5zx(}DwyV+0op$V#X|l^KeUuYt#e=3=~{ z@0y{5F@6x*KF!=-p~rVU>06eCDR3UYCEFe;w%6)|)av%=*H~IN>J{ygKnHZ94hbFb z{Vpl9WE~iH?7+B72P$v}1VDj1DD)lDJ0O-0+;%Fcm&3R@E8Ervf&hOI9w=VxI!P!+B7^foSG9>I(EGD z=J0UrZ{nkJV21)nq$?yd?klXA^cwITT<|?qBNnqb7vrem)ZF37XgC(m!jZjjHfV&K zGLR-(HGAd5eOB55D^gF;XxrfVp!;iyB(!EowOrsla6pH^c@klBf>`FW@JJn zD@vp^GgT&~kA_7`G0{wuqlqIy)RByMBiYlD2u^$jU!9WkAAPg%3=2RPv0&D7SQjC$ zU^)9L2SJYMSj9oLZRvwth#U?78Cw=!aPiT%S8MS}EZixYgjH9in~0IWSTa#0kpz5C zlnTQF@t99QxW$^D?sI&rFiVNLB2gvktZ#9ckE-xS5pTvZC}uq^rtmHU_X#m8Vz+b$ zE6OJ*n8IE_KCBBwD)f=+NHwD7V#UmoK8a?<;RT0P?G@qbbieR<-eHwb_*lDiibz`I zqrz|%O)jgriPj9tNY=L^@damHRGK*o!iFi6b;T$wf~oLAup&yKXW|737EvJ5C_ETt ziUyfRGa`*<#2C$pF&duOk)`jxSw$sy;ls&k87y)uA59St;&BKjc+!h?MOh8E@g>xA zv^ru*CAaAH5i3M5x_v-=(MA%~qD?V02Z&)b7(+Z4BS4IdmiS{7`WVLbV~FR+U};?%gIAOw zV#k0SV(=o;?}D$zkIB6;`WPe=V<7QAh9w3YvUCi%JAFhHEQDR~btbt0@aakdWLbs8FscYo1$W*LeXiDMAszz`W)~Mja>LwPe zxby*3Isl0aeGC^{*o8={jzvLY4XRFwF$tX%`c6ox6MW)O0)1R)hd5SwabUM`EybD={DIp@{dej77ZL zDso|D5^`pBi-W=qw23w+4(%3)X_btZTH^GU(J79a)1Ztq(HFSsT&yfUjHaIPWMbMU zz-EmcpBB#=Hl8(XJoOh$wBi-|cpSt9ALK=Q=CZT`bFs{`N@7l4;Ez|OXG)of8jPs$ z&2(fjJ_}+T6O%dHTB5RMFV>h?R^Ze6#ZxicOe5@|0sWg)G7fm`KJfMnj2M$Oc6x>SQ1}9-`STB$udztB~XpF{L7d zX;mUE)g+=i5{<sF|Q!Q&twHiB7=bA<;ai} zpXU@jSUbQ`D25~{^hv0JBqW`bO$j7ZWhc{Vpk#$U8Ml>FuDiS=AYi&Tyn)87c*H zkQ6jY3Tw9%dL{)fg+2v=QYa8g&;^v#g$3xss0a%mT_6{Bk?Xa|Dw$EqgqSWMqAm)3 z7d+Pm&q-N$Y)YctrD@VMnUvz@Jh5{}+gwtGRH4WIGZr|o7pO3pF_)BMF^m?(uw{lg z;E|3uUTL3C_!Bay@y;Bs*%%Y>2ZYE8E7O3x%$D-kRQ`&EKjtso7eXs|e~N~lX0PpH zyE0vG%%*4QLeChGCD?Q)5A+}D^CUR)e`gGBu^U;+F9sq_c?mlgt!D-~jBkDy~P8J2;X=Kk* z-c{+yJ93?Y1;!lq`h!}VhZi1bI}?Rv%$h+V!Xge9I|UT(f|l?Oft3dvh~T5iNL6Rl zZ$MTfSPfxe-7!^z!k{fv>0-pzY^pZLsKN(rb3-D@iX%%+mL66ZnGmuP$&!&}f|W>N z6De#Wg-xWeNo44OB)XYIHbXaC#4+ap~pcNWs(IEjH83jTJudj0`7awIsrzb;2WGo>Kgb4%b8Mc`W z&W-9(9!wMrhBUNTn!%JxMh;6y28%=VxCyTm=+)c>t$~vnu&8ozz=C@ZQLm#$LT?0L zW{|U)ABzE^I=*Pif|H#IhuSR9(xDD`Xn@$lAi6QTvW^Udy#v@_?3S9hxVVZpu_q8b zjc0yo#Qf6C>NKNS7Npn9!lZf`TV2P?3}8uA8fpPD*)on*Ffjt;1|pKBnPvEK53sN( zfkB=nlc&pQAzsE2kxYR%u#GZ>9_J_YYO?e)tfiAd9Q?(ACM0N(sX%`ifHLvTSR7-K zsj~6MyX2gW)jyhV!J*aU%6cOMYHZ?ZU}KUa! zPA;ci2)Tle2eP4EjxWWhQ!(*UC#}`cEFFvlXFb%+mj-&)ILv|w%e9m|)1V_$zag_5 z(Qu%F7md7fR4YkDWDF1)P>nQ(@gpT&vbmm59gp=tVrE&GDr<}wlz61Za)z81PspZs z)-W@~bFe}}6i#pwQqA5|kH$I--G{K_**) z?2*1C2vBMD8!)>evl}tHF|(U6yBXOH*xd%qzab0Lki+b5BZeEZ@Qs;IQ?dF7@B>U4Ezx>}m9?wzg)#b@SqWJt0~*U0hDA_EKU0ZBx`h%KG6 zN*>fmWU159;z*acbvn^~x=|gA&2J-Xau5R_BY+;hG`27bA>v>li%0wgQ7VJ zpF~xKQktn!V;5Tw4n*vP4AP=YjuO3@h762QXe|S0gSjYa)l!G)7kIo)Jm^sQn)urn1X3WnY*S7F~k)f-fZw_@o%JiNh176_SL8Tnz8 zU8%~{DsT)7JP~6e7y~{T&R$E01tCfW%>$4Q0m0kx76-aN_DjJ_(Wy8$xTF#qos2ZZ zskF!(b#N8hlVyPUvZhj@ki>+^gfec7c!9Bo1&g*mu>XNqNNCojqCE^O5vzMssX!z24sv3JfDH*GVq)_2vx5RB7@pd z)5fD-9ZFOhhT()&wOY#YFVHRC_QUBr%pbsaK*!(!3}68SD{2tNX&@#8$rP3XEvVOX zwlag=LohvFG$orz85biQM*JypyjZD5>+97d>8n#|%FJxS83gfa0OU!!nAD7At62eI zy3({uELxA!-XCg6*2Y-;sYIS$6-f|w|Eg&El01+BEy&qx+eZxJXX-LhOPK~ERtz#tnI(Y)ro}8PTLeWQV62ODzT^Hv8!n1r0_fWd_*{k~qLbBn_%n3NI3SINP96 z=t)MykdKuTRi-B0h`(M#!zIbAus}cfuIGg78xTN8N)X8FZaG^W6q|uRY zG7zxP5p{U4Ut`qh;6+m=*zz=up0Y`#ud&Jz(YuB$NTzA{Q)o1)#z3pplqCi%5mUBd z5C&G32FJb;f|535(fo~Fu85z9cNEx9pT1+kQlvbauMVo4we5FN_ASP5fY>Y*mEyZa+ zuxwgFK}yuzWQdkINj=!C;1jio=x}l&;{q3S4P))ETk-!GeMltFb(!$NWwQH2?-( zmO`I}%x59zNRm1g?qWs<;gU9CXkJZ%CzBufDINwMqn@NVB4Rz0;%L`FuP17U1O)?m zS&s=nR#`Ynjt*^*!NDRhH?q{QX#}I^=rL3l1UP0X40K^DG#pfBkcXND(Xqi3Wg#za zB+bFHK7=`Tte06hA8#O`9uZ>Xr&y6GvI%2=V)7j3`An>X42@2UDL6PdY_d$W-Ga#o zNh;j>2IZ7QJk0V9q#{U72K7uAqDs0N&`<#Bn1Nz_M9-uiy@JhVWHiQ`n1zvEi+^?@ z3oJye6f`&?v>+6+yS&?k2EttncQ;s^d;rd)Fhb5Ersr^mr**?>Tnf-D-OATN@5qR&Mi1$7xx@ffY$g&No@D77IQJPbIk z%i5ByC}K!K0CW`^TW}C6jmr-nB!`)#STd<(VKfdx*4SW8HiO{D^rjfC=t7kVxHN_h z#uVwQF+i(?L7~SVY@38A9hNsS-+>Lo4PZsaFN4yIw~sTW%u+Bro3f(Hq?}OcSr6nU z-|6%QArt=yKw9894lYFdY^q~`bcVGTK1+yKsWX605VNGA5eB1urV)QIS}fg~!F=&& z>(K~=mc!tQH%vGi(`p(^u>*k$qiqN_sB$AK2ccz}##uIY5@I2A(DA|zsKOOYB+G<9 zrn1adz~;I#)?4+MEKuEXnWJqE1z9}MONqq!Whh9u%n5c5h)0mLDK!*^ste;g84i-{ z2N#+f7WorF;=-zm>vcVZx zUSJchG-VMmu~2I)&k|e~!0}3Jp^pWkvO`#fVQc_bCIx_vrUFw|!S&>MSUE9*)M3n6 zv?7ZpYQ`K@t`QOgRa%M7%&*8qorjwAi=^mlL=)`Go_i?)`W@4 zfhHQGOl;IKDfA{L_7Sh-7^aCP*jT(k1#`9>tQ5kS4jqPGRfgCH$;(6%qY3qBBId2l zA=2cx?M+ytv#gd|94xy`CIUIB$SBFe?AfH_=$MGBL%`CTh?Yo8 zpG&sl>Euty4|zW%uIyGZVTnWR*oDmbn9{yddQKA99@n+2eO1wnSJRp@hRE(leGuvED;m&he1k&6j$E~bRJG#|)COfcXPxokkrB{?mZ z7-25O$~b#2Yr0&j@LUusmu1Gx2oAQ{Ov##Ym21ojy%~$1W<+Yn<7UvF8I6<2!sapI z37Z{xNH-6wOL|2f`hK25p9iAnH$d|6XdWKT%jun$qv4xzBCE-63n9h$jLp)=FN$;N2TO^vvhdB)QJU+~vi^W6>fhnH}J|fX_9v_5zEg$9( z@J8TrxH=-tF5dq!(%s94FI`O}It+{~ifoX00dN`M#t44~n9iuxttt{-1*W`BM!=hV z_)^H{9p1k=@B?6~&nv}6qNlt+J^K=v@)?ad-}C+wME04-D{$`{AEq?wp_q}&&v}F| z2~2v}LlKWNFy+k;*bA8AtcdV6czhJ@I>3~Nvhc6Rhp&ftngUb)%fr7V@4p@HcED6W z+h95ZQ$0}p(L7!Tk4}7;nTV$ga0P_<16U4B^)n4v%ll6U&I2YL`VD|51JhYa4{woZ z88GSjbOGK9O!;hzFuQ=MEJn1;eqhRv6#mC~{{Y~#!1Sy?@NHl!OL64$J|A8T{};fd z|Fj`+1rry40OAw_Q}}tH8GB$V;{}9q0;Y7MfIWbV15-VF0h4}H8(-*k1!if%s>9<_ zzyUn20^AUo;;HJ5vy;640>l#tOl5q4JhbD(R4yhGg#l9@?D1?z9+yELqWSPsaWh`< z2VErr)9KjFFbd$xxL!qOjlgt{`6lpaK1?sTXYu$3{8s`K%^X7f8-S@#wMX9m1V-|r zmWclVFy&`C%wb?E%MEXl=map;LoA-X08H&jZSe${+K9rx1*UenfH+0j96k$N1(@je zB5*ZeN|)-P9x$Du{aYdu1p^bEdA4zxODd* zygM-YC&Awj*cP}aa2sGM`+kIp=KYi5-wT-Pd@=Hq4orDihA;-;a==tqeSxX|=Yu8( z0#lufi-|1^{mY`Q zmjP2+1u$!XDW7GL&&|LTk1fLQ0H(V7RzoB@22Aa^3iu`;#u;Jm0aN^~5a%Ocif0-! z{*n)4LR-HBE)V~9i2pk<@r{#JMWQmf+_Uw7EAZHW@Ku1R?9*Y{^8P2_b_Aw8mq0x3 zz*L_d@N6wUe05}`4v)(rKmNefUf+@DHo!!;D}fV$DbIlj(;1lJB*oD^fGMB#5vP(5 zLs-q@5_m`lTpVFY-?1LJ6s}W{&m3Ti=LT>;9(xwUxW;22;8A>dci{2BR7N|*ISH8Z z;|>35ynlJ*Z3ZxNA{1t#}0aF<(0oMhlypdvy7Q8=&X$?$i)hq_R*ueBGjg_&$)L&wNQ~2-> zh^#v><);C{r}F;A;I9Ctcuv8n`7oz}vw$hj&In`V!`H*JxxBv(^3VsEo;?XO2pB~b zk^c~2N~<=)j|3(<34{M+V4`{AQ8R%l{<_HL9AM&^b$}NGQ&|oGuLq{Gr+I_-@;DXv zBrwJAkND34Q(d)1TmQx5nTYr*kHtvqCNSl*7Q){Lre{mzp(lKpGjPA){Tm_7TVTqY z3&MQhaV5n6nGYWX{Ef#;Km)&kDgLquUn-A_za(&ZU|d8sU{&UEMPOS#%q%401WeC1 zLAoBml&&knc=Nb2(y9hb@w5Y$@OUZGt;6GTxETOk9AR3))CZMIf*1g5q=i16ol{}lM&1E%=PXoM--hoh@SpqVPbl!wI#;|5G)Ul)X_#rtnWm`1?#>>2n615^bN;cocP0H(C!;J*a8959XPYk{d;7lC&JQ~cME)=56R z0{AL0)lW9?17PY43&3+;0MoPmfWHD$oO*;Q(U)tBDxinbz{TNz1^#7$DL>bcmMt*R zK$~Ld!@!ickErt+z%&+r25t&W@qYpi<-?GS5yyui8AHa0AsIstOmrBGbhCN?nMi9W zFxBS_;3<3$WtCq2DIqD{b5 z_J)XOHy=ifJnZHD?GR4^Fy$=-{wH}%;m-n7T62(*^Spm~1iS=H`3XjTZt%DR@I4-f z0zUz!{Cgn$b6}$93f|CN0!(#CSlo}JAHr3EY1|~-1ejz18W$pfsh+94oq@{$mxt*I zO!3}Z1x$334`T+Vaye859q{2_)E0>b0uxQ9BF?eER6m)((|{@6n!qc7 zDV=h_n}CU~dI9g^!F0B{99>7#C z4RCc}%9{?j9x%m|3*4IbHv&fhQ~M4CP6VcUy93-CnEGQy;6A`q56^+e@L^s8=L1t2 z?*VTHCVBoo@Nr;DYb5X$V2Xbb@O@y4|1R*~z!c{w;Iad_Itc<615+Of0rmi<8s6U)w2{U8pGUYHV2U#mVfylT1tJ&(O!Yq>cqB08tv#L{3ruz8?u~i_ zru;htuLY)jCV-aK^Wj&bESrI;ELUK5^7t>{eLQZ8@JIOYm*9UKn9^Mba}Jp3@K!bO zAYiKh&A<}VF5>4g9uZ4R$@c+Z!c>q{ZU4495Pys2s%c3BQ4j@f|rGtnHiiL<3uz@U(-M8$@ z?!I-4fL&vYiM?wy_O7w_-g`9B*ju8;8nH*k`2GGf=e{@ZZ3mWoi9EPFzkBA~bI&bv z=gysZZ`2mEXzTM$|C7O-8;mc+&Sj>v9%-*J-V6O3jrV|Whvl1(vv_C`2nI$xt-4y)aVVyxQqhrkDz zd>DMN@jmUSA2 z*P+dm;BK(m=%`RW8J%@u_3drop0L_tTX=xUcYue(@^eS* zkAh|Yb)RchlmC%+*%FqYCHOYY_%-6cGMztA_MKt1#dP}r9kJY0?X!p=o|touhAGd8de$K9^iQ=!Rp($!so#nH{OJ= zftB`Q%6kK>GM)(EY4U1p-Uq85W{~egu+AMiMxKOaKbLa-1(wZ6k^dc5KRg5eC#-%_ ziO!F(^12NB-qB&&%h2fz%jOGk4y?2qQ0#@3~;Aybz zSGJ?BP3H#MXeU^0REm72$=@Kpr|DmVKXXm~3CGBM7;~Q9d0k{WSD{l1%gzVrRGQ9% z$oDt-dOmX)SiXr5f>o9Q=o|y9{tqUc3TqtLi*v*!uN-`0WU&!*^fHqOU>R~V7E zE1Y9|3wiZ4UP9X5#_OTj7nc2{$Ojl70uO~{e|>a@nf^h@N5bk$>-x;qO@1bdTburn zejNWM-x!{5d@DZe1S_w12{Vn`V{>mZ-**TH!RqJZ@a;%g_Ql5<-$>@aGj4}(rxh zEPwhV-_Z0orQQaZ{=ownTTH$d^;Q6@9(Jex$G};z&IRLOmA#63me0^ZW(zd~m! zth77A+ZuC-d(%x{c6Nc~oAmdDRd4ST=9>O(^tbu2^1{4VWI9S)3agB|Kb3&x!`}&Y zu=0J6uoRa4G3Xot%YF`qjxn9j;Nwka20Ew08l%1?!}H-z@Hn4704uL8(7Dd!&%(FC z%J*LQ9^wfD;uzV0N zGroZ~{m%5|^K#SIebubv!hCN+zP9mrL{2n$96rss6h7N{7<|6*SomUC{qqmh`PH!c`~~ohCchBA)AZ+{f1mMQ@WaNv z;3tgp;Adg^lLfzE^8Mhy8pq(*jpxDd7*B@ZH{KZj*f<~l99I2kocYG&dPd?0lV8q0 z@Axp^+Zhi#z-uAe1^rGY*SOTxi$ky2mue^u?PQufsWFD_DJgDDtgMK8>_Hz^ec0@UAA`5#Gaidw8z#6nFuwa!vKQ zUNe3?i*d?$Cv^5V{jTJ@*!Ul$ImC22AwSZ12KvXsYWH2?6JfR8y6Bv0I(HC1%XDs{ zel9Sbi;-UpcVeq&KdymQMxSH+dehk+V>iL_xyNAiOkezf=|4`QhmD`6tsjHs!^7nD zl<{Mf@i|y+v1fng1F*))yZSLM!McvP8~zGbeO^!a(fEmtxkvEZ@Y>-#(sqS49-a&L zGCm(304rbF9}LS*Hg!?}E8oxIaj@#@A$*$*t6W8cXb;mDPdE7__U#NS?JR80f|XW0 z$8?4fpKm%-;1XCqv_oeFYZ5SXlNe)Q+(79fACG)0suP zoNe-K~lxg|9PSpZ2=R^zY#Ky3P1c$Igu=*Rw#k!OFLLJLYV#>Uk`g z-w(4pc>d=>SZVwDv@a~1Pm$NNCSOe5z6dMr4TP6X=N1HSn9hyl`*&D*9R`17`u*su zpPIhzfqr4Ewa{;2)x#tB{{t)^#O+Q9+pA;{Yn8D45$C}2;YvatEd4hT^f8?;N$Z== zckCMg%OCMjSo5XF(HU=Y@nl#&?9QJlCf{%X^K3agBFa=gE0JR8AV#@~|mZ>FEqjyWN$vV4JWpPA161Bshl z^UQCJzrlwejkT`sofww!a(EqB`4;kLU08npJeczbEc@zLy-Y`Sl@H7Rj|lyZE72KZ z+y~!AnEoEo4SnaYC`A#wY^+`Jo&O)x|g|>s0c6ao5H2wax>CUEe zF8S^X%byPkdzj9d$oDq+*>Iuhp99BWmGK|cd70_=Ag^-cGtf!EvUwI<2g`>Z_;#T2 zTKIDqEIZ<3O<#Nhtom&4Ggg?q1ALa#fzO9k_8qZ#q3LHKzZ6zpy^&vK@;xZ;b;d7Y z|3+B8{hhYE-Sqdz&wEVg8w@`Hs}J7_KW;kWXJDmOyZqU7)E2Lr&erf-aA$N>habWk zlT{~Q!AiRY;d|pk^nZrsa}4fqQkd@&^w)(|Kkwsb4_G=g(dlKpKk~k?>Z*YH?`Luy zn}bX)e>Q<}-MgJX!;O~_A89(Dz+;WC^*PTOW73-pE8q6mnF^~cBiS(n*7chD*j}*4 z9QCm{th}b-R4J_TP8r0QVBG#k*6(21^x&l??*JbLEA0T<>qygShx}MrWvsx?Z%v+s z{AA-B2U5SLb80)*e~kCU&iSx>@bK*tlfMXG0n3M1spo59)pJ+)7Sq3%_+7>`DdPji z_aJ}FcsBB9jQ58BY&-{k#dsF{mhm3&d&c)+=VRkNkuNiz3x8|87rfkfA2{peuq^w+ z9gXL~-C&hvnomD5?mvKj0;}HcW<1P?v*3l4eM4CF{5#6q4_5tr(~dbLEIT)|bC}6> z-WhHB$DlvXu*$nJ{ox2W3tmKCzc#s^IXniI z{R#c(W3c?6$)A%P+zD2H_|bHhpwsS@P+w`+fu*Ci&W1a~>Tess zvZMO!XZrGaFs!tOYzfwaXESZz9xybd=W1Rn=0 z-=E3r1X%VrC+%sl#>uOYUkGb1bTxcEtg`Qo&6`ZWr_Xwp$?xU(y~pJ8{~_bS?U=_J zZ-f4G#+oy~X#5#=UxTyQ79oEFmT&(gybG%=6UqENSU!y7&xfXS5%JGVNA0rAco2Sm z1*=@2626CJU(bmCX!0(!b-Po;yoUE@&Ie2X4eF8NByf!oWt;n~8W7ozBVhTq8-I?5RsRLpKi=f~P@g9n-${n2 znvT+*1T_pPz%}|L251n|vHPFT<*z&Di;x@nFjGrs+(;@ZVsiorC-XKMVfG_%00pU^>f`$!Vef1oB-QmS__Cos5TIzl-TiL?;(kzT5I=J>$9X29D9+ z(D(uT=?|-2UhBtLWb)_XO=0=jhrTh&bh^RgVbxm+bvO~0Kfk5DHiwn(0(7>5m39*T zYzwQ8-GY24ljmZ8rt#ev*c(<_J(s&LEPqZxe}U;pUJ5I(qseQL>0Cp+3Rc>au~}>K z_u!?l`ol)pIUJThec@w_H5UEO_!{_Bo2+G|HR2bRs7D0@#> z?Osf~uMc;ERp&mev0e2u9M(1Lz3^m{-vdvFHReAK?`eEG95?;P;96MsIG%=&hV{&h z&R=Jn{?p`pIjnNM247_?f3Ah)r~2d#u>9Av$9I^H_-|@$e(XaN5{g?rgH%Dwa*CcSHoRl<$Ex7+rwDT zhxdk6uAv;8`EVAjv>TfI6m0f`<-h87kg@7^Q&=|l!{#WHA2pEU6jq(=&7VoIZ0?86 z$)=;Wm|#1UU}u)er?g|vV0;7m^I_GAct2SFmtwyHR=&T%=lx;X z7cVuPW8s5MM|?P}aw+Z6#vj1P8-L2NbCU5-_ftHsEgP1;czswlb&s!)@etx0!LolE@`12?(6O)yta{Tr&uEkDxR_x273gmP zE3a<8=S?x4`|)R6)7cF9jp#U|JD zw`H(=-T+P*Z{3dhA)JMLGGQ^Sd@sk&L9pyEg%3B@v2!#mJ36j^Yy2d9itz!I@hn(% zco1nXF!`CtFNJ0QVe0luSoUur?RCbwH+mDSI{X#-cfqn#0zYUvlhA(*mYqKmo-*Eg z5a)eke=z5LSZT$t!m9Jjslzv5`7iz(+!?+C{?zzV_*+;$=sBo=oBs9q*5Rx$?NG|q z8J5k-IMNkXS@L|&GwcCZhQs2$aLo6a{|sH zt#tM``9t){I@8}0`9Y?050!BUta`fx`O&ca6dwBygjRd&f=GS`G*e|Es;x5nGS%VGJmJ@(t39j4tH{k35EvjxUF!qVyC(>LHOcs}~w zP5v_Z=E1VRF@1Xjlb?lrBUt{62bs34zO zGr9N^&;MlV`z$jN8M*VAb1CUQJ`I*Qk!?GjZ#&iawGaZ)Cx_7^$$-g4L8>~9lef-(R=fZo#%Ij;wJXmGi z62+Lwb$`DER=IX-$GsI;b|%tqtBlVYVmc3^e>yBXx5DR`d=TaRJ*>1N$oE3ixeNJa#`mFrHLUu%8@|!xTl%a& z!1Cb%g|erTrJ7zsb+W&LES2gM66rS;$AjI=7C;&Lq?SmiU&i%Dcq? z`XQ{m2BN>6>D)&ASFqAbzB{aZzrxO5u+shn?`!&5=)_>z*@{9JoBlxJ`x%dbtBgnb zT${nFpUX&lAgr>FLVg4+JHu(Cql_OzaIEQze+$c>G1SQ^u>9#Zh&G0^;0Mq-8}0<_ ze$7R&Z2px$m%>V`wa}|!<=YLuF(SVmmT#L9?uJzl11Rsqu=2V9n@_+>+aLL#VA;$= z{*v)PLly;p%0f3Uk8@{ zf#ll>RvB+bzY8q=+u>}}*Z19en$91Q_c9%&&4)Xi{vcTACh3oYRW9jIF!`PE*06lL z75-DdLNq3>!kh6 zN>aJ-$As zb1HJ*_%e7PEIZQK)Z}*)9|_CnQ}J!A>C~Y=$#mXFz7?#p`^dL5`51Ud)87!@%~@WFNNj9iSRYXC&M?H{@(5A8^(LW_rdZ_-+6o(R$a;duzVB0WBNB!miLVF;SXV@?E`-ft9>Q^4i4^x=B2Jsgysd^;KIyO!Ner+|K*3(L-f*je9L--XOK{c_UwH~j}G+(206{Q@2e zcZStZ#=x4hsqLo1nzPB~ZYGz_LRfRWN8n002Yv=V%=DjxPcj{~`vu0&(AL+%%J;P_ zj$c^M7|cX|FD(CM^C4r|d>mF=boXfsSoLrtWq%%)&*Ili|DPPcZySF`pLx&t-`M%c zSl?;=r|~h=$yc!aDWVR)gJpjNc7B4@UgO{ne+YF@_d3GTIh{y1SnZgL&U&!?SK0fR z&Lp384OsRcXUrK0t1LI7GsNWT!^2>u?d>z3!?G`)V61xE!uTn88(22)9LRMwthBcx zpJA-$|Rh!t>!QctdOy?kMCSdt|3uUZ^mG2$! z0kG1>NP94>w1=R7gz4Xa&QYdQh|ck*voCxSEIYTMbDGKTg3mVnkFawAEdP5Tzua^V zLw*e`f2LyKdRTTIMShd%Tm;{4TteD=j9=+TKZfPA?&m&k^0SdY1FL?-e}QH53c}0A zo5QceN;{Oa@51tJJ@WbpR@ue>H2v{|nRCPPb0q!h8(3-e%*KzVpBRMT!cab)4A+L0 z?+*Ow49mXOxN>1#TWOBB5iFb65&FZ*_hAHsVcCBO9vPa3`_<^5X*$=!=fbixgG3jaP66>tOy?17UST?0 zVdpxN7t<~`ntVQOaXZ|Jbm9k0M|J)PEFVsTpEN!le$MzL_%E=0I0b$cR#_x}7w&BG zPfY)0iW3Zd zCf9Q~H=6t$5m`4F>d??Y4h@FQ@4+gU^go1^*Cc#f2FuUQ;P2qI;Aio3xyd(2-u}{1|8JCcU08OWWQ^@@yd8ob zu+q+fd%?Nf;-FfPJ}8L;g9K-k^nr=YV3 zti0xtXpZSrv|}7L`H$=?fz@8ypi^e@M@d_0`un3_Yw}9+T59q`;lp619ZfqPY4Y!h zA7}daW9J0p``}ZJ52v2bGW~q&>U>!BEWXU--QjCY|6l0eV7v%_ZiSWam4rJ?UW5Ez zSoKqaKM%rcFV({nu#T5A;J?7?1M=-1Sp7u4{S#JQok;zE16M@L?=0n`P)v zG9C5#Elo$?huy|lKI~vR%Skf>mY-M9Ml((R5;}Vte@I`Q1IwR};Q7W^l5ZSVzP~5! zBDgcG=icjJl}pcJ9b)pe&_CAnwWfChESp-RI~DE(YYpc-SY=fG|H1TiU3nQSo0^wi zXRPto{2cw?lrSaTa{K>FYNP&oS0>EEmAC|14#^*!0&% z|4QQy@b#vz@1);s`VZp6?WXepe6R6O*m~G>cERxDuV}o^aJgP5QhIeV;iNt5~ zzPut{?N^-UY$VIUg9eW%;Prv=g6g_TUcOW?qKMa&Bno)xlHL!qw1D?|7f}58k`cT; zidWu@C`$|$}ZKk%YX!xiRV@Hg%WO|=dp>~d_ zuJK~{Sb|R*5;XQr;|0gDuGpo!1YtL}L8gVg)(?*E z+nqQsMPt|O%9}3Y(<^I(EOgu+M0~CwZ!WP2M`t$mJpT_4kR2z(7Epr!l8u22!|7nARI~H5ahKczTV8lp%lLU z*XNZ}6@I*;io=<%&r$Ar0&iO{tMyCt7CMw|XLvX=JS2Qx7qZX>idrdzZ~F0Td97YV zD|oR~IGi-1wK!2%UhFT3`v>v@K=R|5PgD*MBC-`8Flqhu*OVnZUO4x{8n?7{VOHlH z??A#?gnJ2pC+xzjHSv9|3~zH;dKBq34ylTHy&l75c(ijM zF^F-DRq|>Uh9eEM8Vx3qL3s29UTR2*KY|U7&x}wtwM7LJCdMXA7&mJ4gps3T3nok) zUoyUAvoT}GO`I^gc+B|XiQ`6(9XEFTsL@3Qk#uZfqJ zj3}!q)VZl}fetm=Zb;?O6>W81;+7~1+dVjz)yk|jlJ|~mf6b&p$BK*p*5bz?lmGJj zSi*6H-w=LBaPkx26HOj-Cmmlel8f^aRhn=8RPlbVcyaks z?k^{@jUsHP{YLR4uOX_+p(Fhmy|OIh;n-wdE;QSH0owtcG6<`ouI;nH#&Ws;Li~OX6lV)bbJMWmC6RbnbT=@n#AYN3!Ta?3o7RT-k z{5gY(z{c7V8mc>=kLEtk|942IIiuu!yfb0dx58P36?K!zYdky{%F7u1!U-KmM3)@S z2iSd(Of_e9@h6CDtXlc}YO4#XVw%HNs%8$h{O+f~6J&p-r=BGYABE&lS`+k>aOTO- zPj2((6wIBwZ;@VkTkOx@owxjz*G`&LSINswtA-4n?{k=Pbk67anD2Aasbf-fw(5YO z`tDD71AjH|YLCCFkNSsEg$Au)(lBJ`%9n;|cYMikUJ=N3ZlAGDiZ=vGih zHHQ7`>fD@Q?sggN#9{8a_~pc>5N~Twc$I3oJQ>>~^kWP1&0h`q>LsE@rR40U3A|jh z(hsIerLm>q;hrers)=`em-^ge$jb@FuKsL$;or6RTgLWk+EexB%uw4!rM`?Y$3{0d zqWdFbjC4~2IHNnw6kZkvBhn@t=rA@pijw9bAMfn_g)S8y8cq!Gt76M^%oakL|n(0i?^fBd#(n* zTHBxE>xKQPnyvcNa>~ro>{F-`=dM9?pp@ap0v7${yL?*-(o z-^lRUy14Gc42Z<_Z0bhDSCvnVjbN@Hl&_!O4_w^!0~cS_{h+D3>d-5!tG763k6I;l z(crnMC{a<7(8;i%^`|HAeEf=@pO)bBd}JD*bj`QA+HY9z^!9Uc*M2U(>e{ctx-2P= zFDc{NG3e`$;FJ3L5Q643(fAROILoKOSmX99zC~pJFx$VX>awXmw`7CR=k?d-xd!qb zvelBIoi+2D=MM?C;vsYS3>EP?*dO4}-gz5cvzL@DN$Jd)I((nl@B{aqJ4u=Y{9;~| z%0+ofYiQ?I%!Dq$muNq8btReRZ5I;Uy!0YiGdwO|wYsrif)x<1_Y+*uGxI76E{7JE zaXRL#>~F~#vFyP3q)9tX-HW$r6Au>QUhR_;^x+kqZ>C-C(HlO+-VXS66Jb4qi=PK~ zCR|8x<+~WZgfN43N*rer(fqndX@0mavhsaIixGuIy!e*s>!{6a`qZWD>S)%$ek6BR0+`UHC{+O2!H)DENU)%;OSb?e@@OMZSgN}1O; zpHKJhebtZi`N!_e4?_DiQ7vv)*oTOvS|pvM*tbhpA5!)>lw7b z+G{touLZJnl}5{*uD0T_RBJR@VKgs;CZCqpQf9#N*mmU6BKhj6z zK_efxJ1;NL4F7ZtKEX)NFyAw5jL?U?j`-h*t)#eHl5!jLJbAiUOSO@ko1M~cGs<(W zbhP4h>z17zU~X>8AF}V+Ggn@vKKUJ+bFjfehQcN*f8`1r$u&39cwkz2n$9F?q+7S1 z6uDb|es=rz4JVN*b!Hz?7|YL3)m1=^_czj@9o-)|-f(`ox!uDZ`5ilk<#TyAre9B< za@QrbZO4pwy=d=xwpt{}?wy_6yLWGA4(y%XySM9lDH9x^(OFaEfC+R+ldL55pvHQU zQ_5EdP)eH5<)5FA5khvda}W)Tp{I6;_LBDPnK$w2**-UqUD??#e@o&r3cO4GabmXi zKR=r+DZkR`FEt@jl#fydzABQ+KU)Jpc4P!fy=>Y^#5>tupZm%aUIIJ#)j_H%&G)T3}C}%WP;nNUT4B znQ%|=H`J9PpPKN+YF#JNGGqS4#R2d3w5a#|s@lh*%|rqzn6NIIoCKEk_ zdy=WX)2Q>&vMArsPxm)GeK3g&)SOfWiEyLHgfaY>v&4gfNSHRuixfBmqwY1sI>0zw zLT}h89+^*tRT$a`c7f>X7~yybKcOf&-UP~lop3kGsrp7lv6`G^CwFq`qz`{vJm2Qx zOIKi_zia-kbPWUtKyo;-V>%gc-h6uc#`V+n8q23ehhu}8q}y*$rG>)aSWgZtso^6< zblFT>c0jWUdUOjfHcCUKn6$gKn3bZN@+fl<*^!m1GdzPOJ*{5m!^u0=wE{VoMgQ@oG zfgm-SHbzkk5mtHWJzzu&=gtetS3-Dr%b*n|IPDM#XBEuvdRt$)NJlSsoC#@sbgc%-P&Ej)osjrnfhzE;c0 zYb^?>fh_fLoloxA#G4J$a0F__e7Q^XF3SpVT2`8SH}h#x7O8@+7_Io7fVNEOYNjpo z2yG{GvW^$VgRT{Hv4;1jZXGqIubWx=*I0U&&h77GpBBZr%9Fc&x_99&9x0OXAjZA5 za6dQJlDD6O;t>yKzA63uUa3!TC!|C0$;<1sPEIEUcYLk8Ua(uY!^2Ofb+m2Qjz2uE z9?F8hUGpTfPp=>qtJ?0Kj}%cOeDZc-@t|iF|r?Mba}>o{*Sv zHuve=3dcwY;N();dP-tlP zO39jOr$$?-rJ05XTB_ZoUdB>p6$`8}!n)`%J)6n0xI|iaYHI(yzzbsn9bdHuydvrnDvs*5|IN<(;*8+-l-~sWT$*VVY zpWeMY1Q)11CGM8XjdIr^Q(bqJkQO@iSZ{6{-k-{&DB&VlD_m})@;VRb^qK{wTFLEb zY@5<-oT5D-(@x{5f<3lYk?vDNX_9j{2exfUH!4f1N2N`0DnUR^XtroqW_|p(#amR! zCX^a1?~2{gYS7dgVJm8Y1GR~!YHC;V5N~O2;W}gb{Vko`Gt)=!XCyO;KL{uww>wEip7&BvCeuLS07gd`x;2*CbH_Qhga`knDX#Z~9181fF z@nLD4LNG^))Ofw)DJ>5al^{*le1ut;vJ0AphdHC4{BEi8$P4o~J2jxE_6HfYd^)2n zU8boDSNdeX(NoVU`wib;HBabG+=Faw$%D-Bf;_`a+1P!|NS!;(&1FD~R428j>Z0rG z*1r3M3hqKHwYB}0-qjO#j#~T)zLl2L<^Y$;WPBAtqL;k ze!5R1erb0jyBZfO(FVWp&-%acPvgC#E%vNHCtYDT)VrJi*f11T3`Bt-HMHmEc1?36 zJlKM#Z^70ddTGX57s;He1;c98|JIpXDQzz&b5g!i=19DvJ;W-&W@XXpNav`3?KP*% z_}FZMCmOB8{p4Yvy0UBq$$Zj+ zgFuurEU_|@cdht1Yc1MFropYqVwI{k+2Z8XYhzgLs_-5wWb8@)`7vP$LRY$JwO6dUrl1+rvz4eKU% zC;Meel1|}5Tl!;<$;G#ZAf=jaXa!@T{~SL_Pa7^#x)f#dOP+MocM{8Y-*4_wZ&xS? zZ}Tv=G_v1`U8$0zm=m;g>kLJ_$+T4{JF2~8 z#Tc~mRNg~hQDqS>a7&}IoKRP2x;q5xc1n{vy#yA*H818A$pz*n3&rnOHM2i;?lJqB z8<*a`PVS=V+pv5=4F$d>y-S@p(i1cn!wWOiux6?i8rUBc!L?ic{Z_(A9Yzz_-c`1# zpZ^L7u}s=^$`0gO)xez>`p3;Bc;nc*c(nOsY{i%H9s3l zm8O@9Bvn`FCIog|acyg(q0FW#Ek&uLCcJl%%%0?}y9uIiu_+OM^MW7f(r@^<55Jw1 zDq;qiPRf%|fUOM02BXT;zV-)1?joq*d_k_6{*h)A$CK)G>eiJXOI8J;OF?Qmp(uAa zQsv|J9^wX@!_^ntG|z%a10qujGuFKncNbZ$88Nm3Xr|ro7-YB;@x^9Z84Ars=_o;e zQSAiYrRpbiR$VEXOE|nVY||;R4Uwj!DU<=X{lWlP%ZA?|4=ibyvgbpVZo2|i)h0NTmkV8~%cldSUwS-{k4oYTE5)a;mpGnRQt6!9kfzS9iH&wy%@_f8EwAVABFC zzB-(0K6xMpbszmBGpSiiR^{)fR@=sPi*<{v#)Tf3nmg?uwsD#{t-o_zB zhcjcD`88hBhW9j@n>wy?3Wkqx43ULYe!*$pU3N5V{J%ijMEUFOinM*u@~fkG8FT-7 z(Tur$y=b((8ki=zG6n;8GUA4KCx~oy+%ckugF4-?H;-}9$CFi&$}cHeDR5agbf$Lu z(zbY~bBsE#Jmo-1|G~EmZz2=9G&4;^WFF%|N_TiCX8~p}aH0tt4eScd+TUYv-25gfXb{4IknR<>le(8asai_)|J3Y1NvK8d1vZpJ za;}ut9mvq-%$EPD3|ErOhvclTA)nG@pv|tGia)BELv+*5H~NSg9Ili~gBr zGdc2yZl>*PLB#!zjoaGlVdiXQrRrdHCT>BITcWZ$U0$VmwWM$j>X;V|?n?jg^C z-0U}%u!WRizqzYKn_Wld>n+SDsb(ELnDA&yp+^+*A`fXr=07$gX?Q{vRA16+3ancH zYc};3Br*i`79=tR(P>+R(=V#pur^XPztSWxwIsemA1k7|SK3oAD_eAWXSe9pq84tV zpOr54f2jdi2mht+H{-S|UGv+dq2^WBX#5YR*Zld9*MQn&H98S=fwcUh`3HNW{_yNOx7l@_VY}L7lX2nFOti7p+0+>} zxy-a0VPz_2HM;r#D63SBwa}@^H$GaJBB~ZFm?8*ghRI83>ukv{VMUYFXKB}$wnCCB zbc9-wz7bWq6*0J)F>=k2#Hb5NVFaT48!6Pvij!GHvQ5XN#(x$vF4rQ_j0?3$G@_J& zrsTe&(3&(6U59!fYVcAY`>k`u!;dudI~U={Z54AG^|z+nzy|YDcRzYT4zP!B}EoHY8POJlXrH~A*#di7y@elaPjrPS(EOUcebt=(vR zY;Bs<=_}(rMl@JY%NPj*`*x!}nOBC+N=H+@rop#PhxS9ImCoz`qXDbf%xcyX2B}>k z2JWXVPPIDHYz?F)(#@)_8ilm$k>(;~X_aCnj~;RICw%|os`2cXX{G5VsNX%B)=%H7 zwo8qRLH)Y7!T!%wc6y1^V!=x~Gs^!zQ|`tJVl@z~bMPl~y(2T8R$>1&k;r2(ZqRP5 zJ~HKv&W@5hQfJ7<$c>4zo!-APZZ>CT{!5IfUj?=*rk{olUf#Vb>#fxuL=&t^NB%Rm zbc{DO2n1t>R!?YO(@Zs~nXyv| zlOnSc{fVK}e%tx~aFg`^mj}TQsr|1OJJt6hB}5pBg}<+qCRlBe2Hjh=xrYZ^)Mk)r zC{F&Zw?8Uq1v`VOB%ve~Z<^|-Z%AM5=QLN%wxL{BRu=Uv-BuI*&l08UHy3l=+2xq7 zFKJSeX+JZbRQ!)a%IDU(VkK&NlYV^?z29t;uK%%3)3vcOUHzFd)fSo zcdpmN%VXQqThCkH>*e+KHt_m*`CeadLvJI`_xgGLy#e0F-av1VH`p6Oe5kjHx2ZSG z8}5zp3cQg>-EW1rd^>6d(zM+As?r>7UXEcq)*I)I_a=A~z0KOl_etL78UH4Gt^Jqd zZQ*T+e_MG|ys6&S-ZtJeZ(DCWZ+m1rc+tX zu(Y4ID4BoD+PgfdU*T1*0&f!7tMc}5z*2Psvic>e@oK#~?*MPHx5QiO9q1jzku=yl zIGOek?@;eB?{MNr1hON&UwcOdbhLMjcPwvpT7qPH%;7DwXJrWcz0JDeXNovNt_lW3jWE@#O4?#mpSn#Mjio zni^PB18ZtvO%1H6fi*R-rUus3z?vFZQv+*iU`-9Isev^$u%-sq)WDh=SW^RQYT!Rn z1Lt_>u35YN1=m1p?;ftv|6i(s^ICoP_dn5bSleB_AnBSr=`oM=RK%^k1nhPcNAB_5BKc;3qAkGJt9!((-| ziHcZlj9kZ#7$4+XS6fzIP?boOldU)L4Lx4qd0S+8Jh+Qc(ETC@JlGD zAFr-XR8R6d*CzbZSY>f}JR+_c=GWE4{lQesU_Vjq53Y&Fs*6eo`xWup(nN8M=iNXa zeX;#4+i|O*Y-P3aYLzYT&9H2Tw)1#2XZ6+T?=0VWR;Mn$i1=vyaPfBSJsurud%wa4 zp+?Fo4~UhQ75g<+u}a@Bp|MJ1OKWOlMT`7IiC-SCTv%J`d)^6edhEp3nW0}5l?KK^%Sh*2Cp!Lbt@69o(cWt9tqEDt8n1>|)*<@MRR_#MOtMB?`o--!5-t(FY!>_gxGE{irT}8Rh9h=s@UCSoyXtXN)YQU(&ONj~X%3hRO1>1wmbZ z`c4iHS9v@-7xpbz*XytC@%WwRx&0GijW3@saXZy-O7yYo1va@bx@P(3PKVR2WtR}#O9Fe7&0QopQ{ z1GW<1OJg;DRdxJ;vP4}?`BHyDJYMNnCCX|Nl@!OD@wXfvHCz?tNsw7#QM|mI78$i! zMw57llh3~7v(Z}N7#pjpiB|_TToNmzBTe!vMwHbQ#w)67mkt@a@;#*K+I1tp=XLvg zSihGs=4u>r@ym%%Sta$-v?r|{bKAWaj=9~~YRo+w|I64mHRkSsuEt!a>&D!xk-5Hf z4SYSp^`$?;HxOxQP=+7mpcVJaOFUvE#;$ zA2qtDfaAG3#xyE89D`vsHK4vnnRdkH&oo*$wv0B3>X}RNY{`($ox?m4dpo_K6XZX1 zn?yyGI@+v6V(YSn-Yx8NWxo|}#c<}`Cc}JGuGn|`l)mWz}>ZPJFRo?)o+PY7D)ad^K-&@k@wrKzwJ0!kJ9t z?|@yOxD$@X?;<`kn6SpHt75g-uB^E`qJIxu9a~UVxhPhx`T4yB9iOsyA0a%>3l}j< z_US6(}k*MhpDMe*92hmpBs z_Ys&;zf=aJ=^l0R(N&4XtE%!FxNs;gi4{<#RgCdLr{4d=aEyAKKCN>NCnNe?+z;!- zuV7U0!#QGEiDsLNW7W((gUa@c6Y-ihbhUKpg6gtjU9oYIrm126M>*bp`1l0}x5kx* z=CEg@qw%y2{R*zV!YT;IgDY{h7m>Y0_$%RM!YhPV39k`eC%i#;lkgT{ z3ImJ$jPl#WKg4D<;`=|5xyXNN%)HJHNhRDQT_(`$=HmBZ;^dR_!r@O!ViQW3CjsT5&lj1nb4YZ zj0R)nuX<_+w_#u75+SBb6|FlgRd4e@4X=+>SDO>E$X|YFylM}>_*qU`=zwf3g37-( z+jR&X37rU?3F{KN5V{g}MMt)x+zt7A+y9?8qs>})ap8@2{R5)+*RduH7o>%=XE=mbFEMoui>(q&J>>H7sP$nHpk(g=47t? z+uC)Ziyxj5KbrH9>c{OrnfO-3Tis^UwNhKJy1a>BM8rAFZz&GV1GZneCUM ze+=~*t=|b5^*^7yHX*n^sdLas!bFZok_KTj*zI42EZT>4ERRLz_G`S2?!P5t|E(GO zkE1-%{C`h;RK(t68SyVI-iBj9CDTS$f-9<6nkZPnVk4)dqD7pLuKY5GuW@lMqRyE* zcrHGGI#n4~mrqq?i{b}Vg!8eZ%IMf<)0YTd;3S0!`FtMboDqfwgQ;5zkmGNDnk-gRRIP#t16-A{PWhhC? zM+g0uXwXj=Cgo#DRuQkzy(%gonpY`0;q_L$x(wD>tUBKhW*Id&%@^X~BI2rd?JH-? zF{^{*npDflm22t9z8Y9@=R>WMqdJ+e$e3EYZB zc_Oi>uqIyXwuSUuCM3ydI88`K!@Y&E%B4wBs3B2ZZOKG#E0&iPmDLs&*&Q3z5lh*% zWkrPz?z4rSm>QunSeGm`(Ix-N;fwgJYuffswyK*4*>-39ylvlR+k^O*wq5J{a7^gL zwkPrp*=kIh#8$`tRJPKenXw*pAobOwQxP?5aR9_KNNOr zKGC*)h;+#{pXuTKx#^Wvb+v8|8kNnibX|6KWlddGRic_(7c*;_%~vc;)TZ^B!^kh9 zv-E(kpch4buj7Iq=>~~q7lNOFfb`0TI z!f^!YyYqdNe}jAn(niDa$bL(Rrgi6frFHx}_$bmw!wJYvjHEpY-hr~K&7-V&$^)d0 zhEtH8N;r*hI^hh0o6kh~OytW+8x3b6JDYG0;ar0J)L^Dfl+Qyj@u!@$@OxzE6I9*{ z2!9~BejMcsk=K$o8ZJV1G2s%zrGz$|bEdETwQyqD``_Wbau8dMGdJLW8Cy569Kpp1 zZU>+F=%|nE8m?n=diCw{xioeF%d)z#D=K3Zz-J7OF&47`9X+pHh9PJFX$G`z*xJ9Y z3@hQ9ZLEZ$*iS6r4&MO`B>n=<;l3ZM<>7%6&J_Lw%)#s!i*XL!g=EN;JlGXk`L7-H@oqP~w$Z-zati z=89_TA&D4wi{nLQR35k9gIfgtkfBZH%DD-Db^Y)PTdhfC&WEDsfarWEDv!>GqVni` zNXLfSU*U58g!8BL`A{@%bUt(i`ffgSCG6@-^P#JVH#i^SM6bT*&H<76Q2O*I)d{Cp z>XvXY6H@JQ&fx}i)Te8(=X&JMiM``BmNu$$Ejm-n%V)$(YAX^owcC|d*VOJt-&7wA zyWjTow%JuX*aI!x4xB;%VU7_w-??)tx2?F`O7r15?63T>A1h4^=Mo{9_Ud-I-M7*e za3%NA6P2}P3+uRFA6{!-+b-9uzz<#j^kwVfYTxxE@&3ep;>jnoD(fm1=twMa{ZR*u z-D+_?bow-JMpiCAGL*7AmSbAis4kz`#5W_}X60Ui5pUi0xq*+p*lN7HlrrcXtZPbL zr?r`{42X;3#RajdvY>HxCI1rg>&<|wamvLvBChomH++X{Vp<*GSSL-eR%1TT;Y2H+ z|A_BYbr5cVQ&$G*`)*`kT=%>6gbxpEEp*N6bDVa_QTKIBj&=g%J?MTTR>jBk=M%Cb)(Nn1otL_?5XX0$ghBrE*p$b;gx_oSJayw9c$_ZRoe%^Jnpoj+)&m z98(_e5Z)7V@sC(z)O@VDPi4XnroIf0EK*e0`isk0!>+4kR+?Bed_laFr6y-{TNV^G zHrKyCEGyQ-Z^1cY$WYJe--^D@3*=E&IlQVmv5*H?YuqfGGdb&6Wi_Qq{fE~HpRaW3 zPwX7d7ougLdK0mm4xcCOdHIBNt){&LBi)+po)z`c>s{bSL zff4=wRB}}RZ^ZN1--h)VoF~h5D8}`q75CFA^M2%cB0;{n_=oW7@TI0U!3;BS#jEO) z8(fPr^$C1w!+J=&hg2P_To^Cp8SHrI$EWzAd%w#GIxo4np4U)&*FP@%1t$33M)Jv2 zmu3iUu4A))8cV_z1s8vlxA4a%^BHPsoDJQd?;7z#_eykr)J1It%b^_U``5*Jtd@RU z%;LQ!?}2q+Wn%53TP{Bsnkt9RLF#wT{yW4cMB zox6u)|M&PXiO|+LCr3GVQP9lI!q4ze_4Wf>&6$p3TgKL{>2QBw&qQ^xYR+wE#h291 zV0J!ZJN?~e_icE#E>R(#6|ZIiKgMJtSaWgL<(y)I`&=3m#%AYwTM@P=>`2&+uqT02 zl6NhunhoR1M z`;TQVsQqnN)^G(xm-BJmObgFfm*Qsy`MyBt7xCvA{L%d<*N#hZR_j2{-?<#r8%5%O zBEDTD{(ItMiPw~KrBNF^-o@EU-|5oRwv~ffsO2K8q+B<0oXsuh=-nbVMiL(piN}d+ zjB@&w7H{i1(==PP^-5m2{_`|_Qs+1qzm#*&kVyOn;)5dbdx`7bo6~#7VW z95@X1%nN0*kcT9BR!Mg~YU+w~4PK*usE;G2S;P4GS zJ;lKVD|%E>@OcGWnv;LVR^yVhcM~joF0SvF=-ln%kHUT={urz}zi_>9T-*lMHIIwW zhIKr-_+D@?!ZtiPRkko#i3lD}coxUxo5FMa;kHiNT+R?dC75cNPmu^>`sF+?E-U#ykj7+u^G#_ij<05UYR1|()ELd+H(kEQY ze3L$*bD)dgMqKMTE`Do9d?Zfm+|$zQC1+7sTo;Cw$ilF#|Xb&hlTClS}WuZy2Z zT=(l-{Ai1}W}f#K>RKOdUgVFnRe>#Cqq=xGaXp9Y;-3-M{Y)3%h4Cy}mYEsxeKO+n zGU5v|;uRV3+Kl*;jQGJBaXm*I^+(SUN8_hw#Lu>P{p);tl8KpW*>ZXKuxw2s98O5u$yCtJ zDTKg_cHZk4;V=wBL)U?AI1Xigea^dKqwu<4=RJ+%E?!Ms<3Jnwk~Su~>&MA{c>UMGv3od;O-D z^y4%9(0KL+?X51M@Fv`bb!zv_((jv`+%LS=bN4@VHsz=ZrU$9&Y~*OxtqjUvT^n7g zO!bpdoR>7GXg+ngXt~7}eie5lI9v-^&|r`ut?P4Ru%$IY7vG7v+R?>l5${91xjs?D zFH?kVkxKg^V}_n@aJCfJJkP~HA}-s}xaKr2z9)^RYf=}#mbmWOx%lnGH8*kb7m4dS z+QmO59<~1+@d1(jKV|6mWWb#o+25bI=1|VwFye!VQ<3^E?4(KD=j6-jK~J@nib+2E zKN*l4jFlg=rR#a_(Twn-e3IW~<8UtM_77#zV;C~Jt~Ybm)ZJ$dnL1;}&`JJ8WL=Os zy>Opdo8+Ux{0be-m5bQYR7u@w{wBW9e&w$ZPcC^UTOOyfm3)#v%pV>u;U@L2w0&2x z)p+UBySP7Or#++nryIWaL(iov*tuZp%r-pOG?-S$D}pbU>H6{~{M?WH&mj1OHq1IW z&fWUNl7Zno+^t8rxLc2Kakn1f;%+^{#n-Gy&}gfn-Q0SFt9Q2^@t;~xc*_nfZQkaO z^UJL#xVT$SaB;Vu(30!e`9o6Iv2A@^g#M(~I!`8Vt#uwrVAyQ+b#wO6@Va>*Tg~^J zJ$K#g;*ZL9WdCEZu9HU&PQOlead(~U;_f=xW+1^mf#_UO&ope4Sgd<8HSfc24*3DR zUGTM&@S7k1Ag-}m`#*%kdqeT+Xqu0ZuY5ajSAyq;hL0XGVZ`X**D>^~Yx+%26-kUcy!78gtl{S z|LH1e$LJGNk!MB`yC+Filked7Li|0GJazr`8CyL!EMNY~HX4ue=j>ZX_=4~y;VZ(| zgl`Dn622q+i|{?+2f~kp<%FLI|0euQko~=eaZfcPXri(M`{YAAO_+i#+m4p$LtOWm^>MN~lezdV8S!6PyiLo)@9?5%l8+lt z2f@+!;Eec?jJS@0sQxAyaXpU^-M?wZ{$UyM;TduDw`lqY@jn{Za|O}(T^alJJVkW> z2<%6G_bctY3@)NCEyQbTqf6;&HuQ|RJuq6MZ{8MQ6HyRG!V9>0RZLuKN^Tx98s=_R zyc+qKhp1q+CTe5lg?61;sJrp2;3u0J8S28PHu;^R(Yd@nH~f7dUBkQh zS`<>}YZvcJT=R!$Tw{fcuV?$+Sf}}+p5u4%H(}kIipKj#;vd60#@+sZWW?Xgh`*Z= zf06i5f=mBgM*JJ%eq_I%RaE(${z&4w_wV9*#!UAY-Pl(}`{+KFi=RVW>0SIf;#xyl z`EjS|`BmiS*u2BXhUX^v6^@78i)_K~&rC{9w9MQvpYOB!%ds~FTh8u8Shibw-=)4? zeKCx)Pf@Hk%z<^2ak;_oxwt$gV_)NS^7k61YsIc?;dttE8gh+Q6JV`DYJNKrcE{Of zPF~1e=R{@Nar-Fk7d=)dp&N~FPJA*!*Eq^UzsDTiza?=UpDa}c`?t!7PqDbtDoiE5 zO~ySxUHgW=#HkY-_c{2#xU{UOH2IxuCLD!&o`!E){~vqr1E1CW|Nmbx3?Ui9a8;{T zR!v5eRjXEwR*e=RYPHqUs%fhhVG_bn3?VFrVQN^lSPY9{7{V|thG7U{2*3ODx*o4} z8a|)5_xsoT_x;^|zumfb?$7h@I@h_*pVv9(^?V(woa+9Tr%$koHKR|>piNLc`3&}C z2j-t=+(2YEZ+DtmYl97TIGHq+haTDKRPo`KWbnDQRb*RyLdQV;pL}(1rpqlt-yL-A z-c})9D+8}qw}P(yX0On-W5UODc|_y;oUV=EOxMQ$g|6Kr+q-{oejVsq8R{^)_8WGi zYr|XHHwd)YV6|x`1uK6tY$)s1{ocdy+1&4(lrx9xi$LmtFTpc>I3DP4BiM*cKf*J7 zB+eC+)h(lX-`v#k{62vT&p<29lW6-RXO7j?bib*U&(bYFDA1xHZE|>q+3)Snsowr} z&h*B1PV~lhPV~m3+Qd(@%--R4&hy6qy=-{a@z6S#lu-nJ0G~% zu4}yU(QFtN|EtFmHy?Y3YsWShml1pCo1n5FqqP39N_XXPc&BGMt@{^+!O#K0dLMVQ zOm=SAh3A5umVqEpV9w|BXY;x4d6HY6&g{%~Zu@U74|jt@4)}UGP`@|6@0GU+i>^LUF`0myV%`Bcd@&N?&AOd9y%+Lzg@Ur1-3PJ z58bVIcMsjgu1=qeU7bD`yE=U?{(rho-)K8P^T%%N8-u&$a`)g}?C!z4*xiHQ)$4n~ zjJbhKm&U=t{p1Xm(aJL}&gEQYWs;mh!QsPjEBm{6JZ@!Y7rT4iW0{Y+9Rrf_Q^A!r zl2{q15!*_!^)e3k#wo<(!Ot+8{&bwjpuxg2Cje{FJ1xCm;OR99a9JwpSxy}f?RPFf zeiI)oul+#R%4;ojt-SXKT|4fE4hhBwsCx)q`~J2(wrqy2lL_F;&u8M^;b#%s^4hV@ zmiKJjd;FW&CO${8TOU>zv2A&p;&brnyuGquk~OL6E|$H8Th%}fRw#9KR09o4@GcID z+QC)C|6E>kNuSlGbWI)9^rk$qQq?dckj#C)+=l09~Jl<5s8yjrHEI5$m^3ErX;lakr{yc3u!@T28 zBW61dj<{1pXFK&`l%1!udMz5gb@KT$s0@=%En!^<{rS7lz6sNHVtH*ln$c!itj^?6 zE`!FU=S*R@*l9V>W87W&x`dqyY`W@pDRl!AI{Fr{Y&l@{DqMUi-q{nE;8C7<4Q};+ z-T0s3eW2$)ygJC!-|87#c{Iu&+;`E|Y3zEU7qL}GKm&iV!-I7Y{z1`Z7ao##T63s!DwT3I)gvUV4`|LS#xn{GVQMKIl5es?=Q8Fmlf4NqfuKl-`&A>y8%xP;h_`EK}X zV!JMJ4Q~z@KvNNs`|PN4F{?n-|b-`gg(cKkbghCfU^$P-(e<=)|C#8wV> z^Rv8aZ@iv(2*ZQVq$7PxMh4F#actkVtZ6hrmmV3oR}*L#UhaCLH{;uK+g}pnn!9~t7jE#uCk$7sa zx@)~%y*%DLhu}l*zo-RgZ?^K}__najb`Lz46=&=IpZ@Jg+|PGv&!d6Q&ER9laS*jK#{c&B56TL@3t1m_ zY&I6*?z0YIBOgFNlJu?GGPlEnHCz3`hVTMqaZa6-#e;dNq>RnHi0SQ*Rpz_cGp`Ef zWou43M%jS|`DludJKw6i%(csyj)8KK`}_x(#?Cn|{(_i)t?`#_;?LW}O~fNTG2@7Td>of0|p4FbZ>a{pFr__n1azPY?eLUiRgy z=R4SQJ2$S?Y2{;fjGHq@W3s--b`0D%bK~~XxVvzh3Y^PQGqZU4K`!ioXf!Iar=3j#cjqH#r1f;uo}}e&ZQafqbO=_13N-MO`seloU28IdRtjz7 zVjWY>`%f2=zGl|ZIM4bV!e`mNM)%pL5L;Q=#WxdMJu4SKN_?CrenPRf!$3n~{!DwZ z9G5lOfyE6x@Jr7Qw0PqmAIzWhTRNm)SFbcse3Cz#uP`;kzUh#0!%jZA?Fdo!s4XL% z3jf)(@Jp?E(Tk#|MYK10ZLQu z=+V|}g#Y8qR*U(~+`YBS@Fn2NCw6bmdw#WgS@wI|MqLxbe3uFd!*jK2%d(L3E>(VGl;uoZZnoSjMhJ%a6{xtpy$XfKV{V0kaa8NquOb*Bff z^Q`S>+ooOIkMCjk;#_(^+1Cce;-hQ?9U93pqi~nKzvmF>}+wcRkBs`D&(`Fe+29ba!8)@FVd zdxu;7U2l9;o7n2>dcRM%Ht`%{@3wIRv6Y)VTUnq;)^;Ov-}g?&_x{#Dv*TMi%MJg7 z*!%gv5qp>SB6dC-u5uWa?51Y;tsL#Q(qf=(0&du;=zUhlowiGBAIHjoyKo;2l#{hR z23jlT=MVf%WLd2Iw44ph)}M=SXcOP4SeK1|_|D$>y3tLymhmDz^Lc`}izlumw(C7N z{)=tmT4L{VyiOeJ8Q)?X{!gw4-DhoO+995KeW-bVwDj^_z3SbgaX$T@{Ou?zX{sGP z+M12&$fDAX$kWzHJ+>H zK&>zDJZ|K3#@V&r@Y%e%gKp9YENMi*hn*IPtaAp}TSKy^&Y00EW74NHLko3H=FuI) z0`qB|kXg5SV2Ec@hIyjE(8SctX|3Zke5bf|49`>=M}7XTom}ttw{nSH6Y-M;%AMx6 ze_9#Tx(C3%V8=HrcUt+$%9-YN1TnXJgXUr9Qf`89=n9c=EX2YPNQSc^6E1)&;ASX- zb?_X#3$~A60Ox|8|JgKrr@<5$3eUdP&i4S=_2VE2&AbE_;lhw?}_QOt~6+1@WzF|dv{79X|`+fK*>$pdyn96 z{pV@*!idfT{n0k5!r;_9KKph)ms$8!#I<`3=gpx(UY@PZp&D;yW;%KFG)rJNQ|xp7 zgMzKW4H!UkaI#-~?cn!sG?V8NZ zFNxSs{1?a9%rw<2n#W-<&OfI$P9;0YO@9H?+wbb)r-;4V+$LgM$N!}4>|GbPdDg`; zEvx&i+lcL4>SAl_%6>oh4jP?Tf}5P)V#EeV`+R|`W4~Q%MNjV-*vG9b;pTH8^YMPC zMq=-F_Z6{s9e>+q_y@$^?I@Z`0p9Jh2k`*U=UHsq)xTQb!!2i5rn7U0i-!_>m-BRD z@A1pp{`7ADsl>LNI~_7r$s?G5XxU-GdN(;4!TV5oblEMet+(L24F~vr1@yD>mKzpa z;hZ*UHk84>Qij_$?1pRqXl>@Cmf=<=bHn+mcqv_WPV1{ncFfARm2qvKcH`2dkmb7l zY1Hr;!FG||c)=VA&h50nYs-|taPKnNGp029vAOw1_y_EhC7-KqB-K~!d)wa<`k7x& z*R~tK`wOhJ^lWPj#f{sxO_T~vyOC}P)4K6oyvxpwfva(EYbVqvVHswy47Y-9H#-hd zJKq(&ot0wCYOKV^1)rA(M)D53BRK4TEw|Wl&Xo&F&gBjxL{U(L+>{#W-bI&e@Wr{?keQf^V?0eQ?Kbdt$qX;{E)B zHu3s4@rE|>9oJkONo?2FE?!J*#~Byfy0+tjiz|q&4D8~kh)?pwcAOgFiQm$2`;PWq zj7Rau!27++h}Wv0mCbCtb;NeuaG!Mu10v|};x5E?K6CL{Vmnv5IF;DD>~o2|%f5uz zmbHJ(as7^s?%SvL^zVia`y}d^UOgjwbnh0?wM*w%|ItSs8U9B>(M?MWZ-4mx53abN z>BYAjYU^vBSpV1~#gA5h^z3crt1r%d>W*g~+<5n@o1eb!s)tH9-2Zsin#zim`PW}~ zdESjz-!S*XTYj$ly7{+{-~IHbE6cw9{KsvdUGu~Dzkc~b)z-IGtb2LwB}Z(2~}H|{yhzuQd?y#A2$JnP!FNyCoMqXUgP?cCpv(>rg|RL)_1 z@3c>N#>pmm!^#tOT=8xLwjBj;{p~#MM(?yK3+4pJ$qr0w8-;BbPcn|pv!7d#?39eT z>4A?qj^l6ey)*W~I|An932f|Lb|Bli;g~z-?c8pRi~px~VLr&f7!K?i!E1hKTm9R9lY`R#CA?`<7aC)y;}QOJtv!Hm;OFG-4F?! zo_%2pgXKF{o^!D)&$-x@=UnW{gD!UEI~Uu%zQg%GF1B;Fm6vyHBDx{7OTX}rPqS~k z#|6RdaTEv1&MeE$SF}D~9>cBNkx!RVcDkl5q@P{Wx?$OYtLq&%a4HyX*MM$#+iTi- zhTFX$H~fFPrrplCwtu*B|L&SL^1|RXtsC#Ju4$7Q$I1Y1oVM4lISltMciU^%f;PkL z+O>>+{G7ZaYsbB#O8VJ4dzvoA1|P@B;9p=R?|kpb?nAX`9>1vjPwu1IwVjn|4ZALL zzw0a(z{=n*&Loca#BRTJ!>wLVSI=;Z?H+*}-a>3;RBvqOX&3*@aQmHH{9T**S?ryk zwJ+%XJd3@-N<#ER$7rWz-i@nDo*Uue?Tx|EOV?5u{ z?u*%VtQ&6k&FntBi*IZ*{!PT*?{Iya;me5aI^RuSqv5;su<#eh!SIWBzRq>AJ1)BA zdynO_{mI22C~mE3J+<}LQ1DSm;N8A~`)iL&P2a%uT^ZuyEySHY@khjwp7>*8?{8bDn3AF85e4px+I4o&ZO?)pqp4fML4!8S7-nKKnvDfXs(F^b* zyacxWz6`Ixt56Ge@5=61y#bryO|a{}x1kQ~IJJ^xD`~?!46|pef!`SS#$JDyVYXe? zgDu1RVB6(~&;VQDBls8^;S=~2K7%Is9NK~Z(vH69Hhe*UZ(FL~*y~?1UNd|JwhUjx zH?S4Hh40{d*aknqkMI+;z|Zgt*zv81&o67kF56C2%8p#Ta~a#ku8i$sSH^a+D`R`( z|8^O>j%7cOZPt~sUF^!(-na|nx!9GlUF^!(E^cI8D^t68OPko0vE6W2#&)qQW4qXu zv0d!S*e-TuY!|z8wTs=k&Bdp%y;ynK#qQkZV(+=l^>gR8UA8^_%{|oIB|9H?T1-Jiv-B5!3 z2W@W`TpnCE&+@(Onrat(J`2RZHf?W*U9of9+ip4R{+HeF`_Gr-Z|d^=#q-LQEXxc& zb1qo<)y4UEgeP8(`=K4bllz@_!@cqDZQ_tN@g8mBJ=?@~Z^}Erz1j>9Z4>WJJcjH~ zYp>Q-I6Q-SbT+H#Y{rjaIcS2h1@%>_sk2&Gk zepCBq&X_Wn_6@k3@#mCg-}I$B=QQuy?ZjQtarJ69$z8@>94owcAfc}}t=jaqYq~*g zGVjj1Dp*F0YLj<2js8^Q*eUPsB8_Xmhy7LY9c_EGV|X9<&+7*6sF0Z5cS?@kU8LEg zzN9hEUC37}=JO}>Ip?zgC+wonv$v4(QGc!ul%6&{y-!B^jOiIUeqI6;cng`r-u`2K zovx;yEX%Zp{lbnzWJLbEUZ9j1Q{5LoD9rZZ>{9DaVoj=3sSKB?5lxu=zr88L{_Ppt@>h)GJ zj@_&Lcek6?9j{Hj-UjA7hWWaBy)Jh3dR^@5^}5*A>vgfK*Xv?euh+%@PQ6|??Y~>E z*G+#r-_N#}U3Og2vrgTgvY*r!er>P}c@CdzIi~S>SF&yO zq&qI~v@?CKmNmO0+qgUL9fZ$Kr6rn~sdKX!H;mZsGuZHh@nHET@H$VQJr}dz&Tt zryA(rFKf;MUY>p=vAf1R3J>0E3%)zu+FbQ6hc~u!_@9pto$aviefin0{+Ya+jBo7q z!EI(F>*{Zgi`F(k;MA_eBURYv9eaXmiDn0@qqoi{QS)*0y`I>f8MwF_?*@NYm&?1p z?4DF|u)IO*C)5G+tXn_6%T`pNY?n3H^Oif^I-$(IESMW+*Wz}bb#0y4Gg|k%cg0;> zC*J-M^#7~&kGa5R zE(XG1Z$oacvSf;5TgM-)@!j;JiKD>9V{xlb?&8U~J$rER9Ng~V#e4eMIo_7RjdLB| z75=KON6`)c-RF;$eBN}H#nturzqjq&|LHmHJv#^^qv+K_G1;Oi1+jgvs`~USi4*&VC|M%-ZXTh8WsaDWu zJ?GyPyzYKV>)plA6Wcl8#WlD+cW|-YZ;EIW+p`!q{B68ToA@|S{4H+3vm3t!_kP}Q z#NN*fVFR`8)s1hloqs&3Q@*mBgSk^~oM#y4NY6CS5(l2+={xVkhJFOYUAe~gsyKHe z#y^d>9$U)RAYaHW!SZvYXFuwRTdnmS<6GpPXD?H*T!9#-vHKRShgjS@eJ`dD-Vd^4 zYH*l4?;OLh)^dubbHkz-mdF(Ud09SZE-zmTvP{Q)sar#*byJ2*_ac57wp5YcJ zTiW-@dPBN>b^7&Y+1zs4vlKUvk@SpU_B%dC+qC5|S^3$;i`&GP65Dyn4c|n3yeDqd@YYwWP0gVBEYdoZ1K8=-;PYNL z{b!8t_e^ik6C*wGFPfhl|3_jwPr7(Fwntmu!2<_(9vnAta9rmd!-g}=JFjuX-epfE zw*A4)YgU`#R{zzW3%cP;h^?%+$kXpO`q??xjbrr{ZJ%|qJvXuQws$!y+e~B69Bdlf zm)&&sEW+mduh#u@)1AOJWaR=ETN&NEJjulSGu+AwZk$o{v(K70yY*KKRE_Es| z?g-Wtx161+GkHFATgSjNHaGnOeWqvnz+Ij|!EwNVv370K{`O#f05?sZrg3p5u`TC0 zp5@BWa?PIO=Y`O-{cRU#8Vw}dK9t71?U?1}b%&;N@y*0`4d~)E#I_Dx{0y-jcU=4g zv3H$?urJziH?X^~E>dUHRvZmpO-Z*Ftonsu&EVv?!EqEq?Ow5)-!BaF zZaXy^*A0*6IM$W%?O5&l^`W0FgNx50_U|&(oX91b&HX02y)#Ho-!Y$A zdj{(%U+9@`JpKNM?;HGiXv1yJRNialneN8Fovuf856fxx{v4z$dqaly=-*?|Nt}J$h6Y2J3u$OxLzmw>+;g z4|~?*Vw<5IXE}8R$}|iPl#A@XmBWsa_Fnt;8mAv_@1~D|RDZ&Z?5xbxg??@{Wv0*K z-g;`F0f4#bw82dKseX>Ufg1#r8Qp?sF7zGGwDxDqX6L_ux16`*{;_3E&9;k1U%{%5 zzERBg55Ak7GXfPz{__u*pFVZRyL*4&Gm@D1zI=xL-tJjcf4&Qc-~h3>H$JgVJb?Jm z+XXF~PO=o{xpsQ7U|tpvTXtEQGJ`h~2MR1~Osu@JyMt}I*7C#Hw&sqAmRzpXYMPMb zHD$pfb>PGrtk3A~Sd32@(L2@!_7*Y!j<<+K1si4MBphg<(#_mn+?GB!XJMd`(?AK~ zPeTHS;y(@Voyt28(*2%2z?L&G2Y=+O)R{C6OGDr!jC0lxHkxS;FokH7e& zUHVhHmrGw#)X_JU-_Pm-T3tdHTYUzLZM$^)^GSFd@Gr1G4n(~B=OE(fT=w^SgZE4V z1x2l|(^3QZ!W0H}K1K{?8j1cO1Q-q@U?e2M$#4qT@xeaN_F=mh zGY0IsFd0sT(_kFf=cUjc52wQ!FagelvtT9PvjQ6ME$|V142|#!9K&aPO7}Bpg3rO~ zzb!!z(KRKX^&&wq~Y z^H2>hz>Dw_)WFN|3cL!n@EW`hZ@^}F6W)S4cn98v_n;o$hY!HoZf^&+@mL21J)k>Sy`M-p26{nnh=RV*2aW@)b9p?(Kz}#^2Ed6B2PeTG7zpt&7>2?S zNPuB50)~UtpBo9I;1n1QNiY`1z^RZ7i=Rzt> zhN&Qfx8O~vgSX*b zcn9j?J-7}&gb!c~G{DF35qtuT@ELpxpF$o-%_902>nfzSaCf{t)7 zgu$V32pk5T;0QPzj)ZWqeAuJlPL`o7-7e4#BA^F!2dl>y3CBP$=nYZO7y7`l5Dmvc zKS+-XzU%cQ{5Ix0jrd}?1cuUY2;|ZKD!TbF5=OwukO-sT6c`OjVCUH}Fo)@9K^9!f z^jFwC;A*%Ymcc{!`+PUjEumXL_gcCS!Y%mCuo|Dj^bgZrNjw|BgYI3BhTlhb6T=>$ z`v~3DbQAdON9aBZc28}+Im1ffR?b%&;K`#o4$#elY_L4c1u!41ZOq@{5BMHR;9*z| zb}yy|UWQlT5qK18;V~$KweSP1gY{4jufaAL4({_G$G3vrzgf%XWarY2@FYA1mGBlk z4c~&@_jwkoU=utCZ^H9X4KG0V&g_45UxF)ODO?3t!*aL*Y*}xF0=NlmS#O40Uvfd81tak3V`&M_tT~G+NtgFD5^&YTgwXQ995!?&+fi3g>Pz(=%E%SqP zAA)?i4z7o{!Isz7uPv9YM_Y$B5Bu)+nYNBzg?FG1-h+4HeW-^I;RDzL4e&911fM`7 zdonMgPH-3;4o5&Z*!{tyz?SW3x_;;kwrpMKx@GH% zM?g2|4m}_edO|O-Wjlthy&JbT^nt$MgLbeR><)IHbPw1Q_JUB@8}@;Hp*`#e`@;c{ z3X@?fT*+rlQ8%4#8cc_2Fat7RCY%SeAQR@mY&ajXARFewJjj6sFdr5|E?fu~z(ueK zE`f{TQpkgA;A*%Q^5J^84wl0*xDjrEo1g%0ft%r0SOK@gZEy#yguCEQSOtY}58Ms+ zLJ`~#_rU{D3=hGB@Gz9X8dwdFKq)*1kHT6ggY~cuHb6N%0guB*sDP*7Nq7~Wfv2Gg zo`vUN6I8?V@FKhbHSiL=0xv@)yau)K2D}b$!e)3I-hy|a4&H-z;eDuw58(sY0uAsn zd<36BBYXy*!spNgU&0sg6*R*)@HKo3Tj6{74t{`b@Duz9KSK-r3ctW_upRz@-=W;`*42v~bNk9FBye;ArqeXXpZ5Ap*KV59kfcIMywP8{kGLfScfExCK_gt#BLM4lCgfxD)Pz zLRbZN!#z+0_riT}KNQ0Q@E|+{CGaq;hBZ(MkHDkw7?iTv!Mfz=f~~E`p2U63Bx~VKH0=OW<<20CcxQn7MueUVG^7Rsc<_?R(C4hDUc3nFde4B49I|)a30KpOqc_+ z;e5z~Y?ur4AO{w}d{_v%a3Nd(7r`R91TKb4ArCHt#c(++fh*w(xC)lSHE=at3;A$8 zTnEcx8Qcgrz)es9_Py*oe#mCFif$p?19!u{Pz3kGeeeJj!$a^OJPakU23Er(PzsO1 zqp%jrU_GpZ4NwkGz~itHD&Q%25}t-icov?4O;82T!*lQgRKrW~BD@SW@G86luR$%m z0k6ZGuo>Qlx8NP9gZJQFcpvKFL-+u;Km&XXAHgTk2%o{H@HsTWm+%FA14e>AphQcsNfZ=c^oDJu|Bsdku z!FV_WGGGRr2QwiPX2EQj1Ct>YrodE4gLIe%)8TP=0;=H!coANLci}x~fuG?E_!54B zUtuX+1y{p0kPp|wb#Oi8!KJVmE`ud-Ia~o(!V0(*ZiCxlCENjb!d8h42Y%hg?_)i{K*o9_+r(3owe!ekN>! zPhbr9dip^YoDXv$8**SC%!dV#3k%@_xDXb>MQ|}(0+S&XrodE4gLIe%(;)+9zeVE`!<#zAwBEZ@^}F6W)Tip$^`Gci}y#hxg$F_z)Uk3w#70LnC|wpTcL* z1fRn?SP$i}0Un1ZpaM3+lkgN&!qe~!JPTE@37&)Jp&DL*7vUwSftTSGcom{4cN`1- z;5dkZ|haM0KJ)svI15wZ$`aoYu zg~>3J`_2~~33La*AjqKqbT|)YKqkzDQyF$XB*STtO~1J?ALhYe`o+Vgcph8^i{Wxu z0$0Kna1|_tYv5|Q7V_bGxDJ-XGPn_LfSaHIZh@QOR#*YI!)jgYYnvz#3Q$k3cCr29Ls8D1-H|4mLnJJOPixMyPRXhxXp)ed0U?hxylOYk7a&2bU zVb-;4veA$PV_^)O3dt}IPJ{7~0%ySKa3)NEv*9c_2PVQKI2Tf3GE9XjkPc}u9j3ty z$bgw}9?XJFxD@i>GFS|k!xFd>u7ImxDO>|r!?lnP*TZ$N9G1b2a0A=~1#k=847b7x zxE*eTu3X1;fo>21J)k@Egh)6BdO>f9g1*oPj)Q)1Jj6hMH~~(CSU3p=z(9zD!7vDh zKs*eCp)ed0U?hxylOYjC!6`5rl3*;1fm0zF#=&VY9#Y^8I33P}32-)?1?Rv-m;~oS zDolo{Fa^>f4W`31m;o6u6V8KKkO^~OHe3J;VG&$t&T;S(x);NxkO!B+Vz?ZZz?E zZqOZiKqT~pUT_RVL2u{-eIXi-g??}x#K7@z0`!MiI1vUwWJo)nb+zNZSv#I{wc|Ng zJDzj3<2hG5o^!S1`CvPq54Pi8Tsxi(w&Px0JDv-+!a7(F<*)&sfC|Wh^IN2lenid;lLp18jkh;A3cnPvBGd44U9`_yWF! zX7~!ehHqdid<)+}9$X5G;WAhPm%|lsB`k%j;A*%A^5I&z4z7n~upDlH8=(Mhf}7zM zSOK@fZE!oRggf9)xC;tl72FN?KoQ&v_rd*83=hDA@DP;1!>}6GKq))|k3wZ9eiwKK zo`ovd1kb_qPz^7@i|`WEz{~Ioyb87O8oUl~z-D+8-h#KG4&H%x;XSB__u&Kh5DH-x z+zt0Y5!?&+!TnGS55R-)5R|~fuo~7tDLev?!edYdYhfL%hjQ2ekHZsC0UO~-cnT)Z zZpVA7+WDryR7it#mn0I)2&>I$Ct{j z9(lgp>XR>%+r7R5oT9ET30A8AXuMEvb*M!x#bg7$Stp+QeKZ& z$t};ITK)lEBmWSul{es<{98O+{vGa@e~(AVx8afUAMhyo zk9f4a1&@*cjK|7|JUPW6?xO_fxgWk%zCWHX zKLB4Q?|>J`55!lvikHeMmT=D`xIBm9zG4eP(Rz47qlMlk<<%97Ac|4vdAA%>zhvLcdVR(u>0iPfrj!%@2z$eQ` z;%V|kJVSm8o+%%NXUUWB9QkNGS3U+`Bp-|C$&>LV@>B7p^3(8q`8a%;JOwY1kH=TY zPsdlv&%g`i6YwJWnRv1MEWAX1HeM>9h?mLF!OP|6;uZ2qc%^(YUL{Y(tL0Ph8u?Vb zR-T4$mZ#%&@@aUzd^+AB&%hhyGw>$)d3dvYCcagkiEoq7!dv7Nw|(2?b8z1S!R|=*g2&@_?#sgy)&EjFNxm3QmS2Xa$d}*~+nVL>+wAKGJJ`AIlfeW1D-Fx5nm=RzzgIz;Va}f<16L2;Dz!Pc#-^8 zyjXr4ULs$Km&)(J%j9?BZzaOuc z7vl}`2k=ID3Em`s7;l!Z#<$AX;M?S-c#HfIe7pQn-1lH`n|}-sk(c42^0jz-`8vFV zd_5i}FULE{H{jv&3fwQ>h)2ku!XxEXcoc5i?It`%{u~}Be;!YeSK~?Y7w{DMi}*zO zOL&^R2G5kgjOXBV0(pG7@>l7xNM4KQ$zQ{l$X~~o%HP2A<(u(k@;C7U`CIr3`P=wP zc^zITe+Ms;zl#^k-@{Af^?0fLeY{Nm0bVZu5U-Fo;Fa<%c$NGkyjuP-UL$YBYvrHd zo8_P4b@I>fdU+GxApab1lz)LY$-l&#<<0n3`B(Th`PX=h{2P3`{9D}jP;h(r4iA-o zk9Ux7!#m+N>JR)EF8>kt%YVWnsctb+|MGp z<$e~+Ef=&zZn>bPa?1@ZlUr_Rx!iI^E990dS}C{O(JHwgua+q zF|CtZj%mHza!woMmUG%Dw;a?ax#gfX%Pl8$t2_$dCbt~b7P;l9ZkJoms;?xt-CE9S zh}?2mL*|pp zhR4b+|1?f+`KR%6%b87(TMlia+;V7>Z8F;aL23{h!=kuj3cZ%ezz>VJTaIrE&esm)B~Mg;%TJyx zx7^w^jbpjWnd)yj%UN>E#m&L#1nRry$t`y`AGi76ju&Wr%VA!j{+7#JsQ#AITqL*L z=3;pvUZU|W54cQjInEVw%X6;M_?GWnEw`NI8jWMQ&zsfXa-i$vR%f;PA5>OI7)8$(XqI#=O^%ZjbDK$sQ*ShN&PL)Jz4$~o+7WrCun@jwVo`uJn{^= z<(6m3EgwD?x9_qEUnI92@jQ)VIr2-@zZ%b%TOH+P8s|lPh5B3m{7QKZUMRP`|04M- zc(L4a&`ac&Utfybda%6ka-2>e@4ZU>Emyuq{x-fDx8<+H>*SWxUN3(aZ;-!-H_Ger zCi(k#v)pptx5_`nx5*pu7Wo!@yWDc(eQSctU^((3a?6nqm4AY_ms`$!2f5|YhsiC6 zzLWfOJX~%$^?teK*hk1M$39YSIrmX=%ejx1TMmAV+}a?B#ckbwi^t0?*FI6>e2*u| zt-XL`oKB#fgNYjdCwio59Lv|wkXv4Vrrh%Ov*f?xIr87|T>0<#BKaS9p4=D0xl-N^ zUn<`X&zJ9xFO!Gh1@b-c74kjtmGZstLU|}&B;Ok^mhXd?$oIudm+Y^H-<-2jdOue+b?vKNN40cfydIT~-T{(iiJyfYrAak}8)I6oD2gV^>oP6Qq$?}kUq zyW=tP9(b%g5|5Mj#N*|b%b0-M@*IOFsecrnEbon{$ot?EID~q55uaqyq3+1_Zk$fRuEWZFRkza_H$`|2f@{90t`NepJ{1UuU zo`+Y-FU70nSK~GEYw%imKE7FgEnX+T4zHJAk2lDd;f?a;c$54FyjgxDzExg;Z_q@=bWT{5iZr{ybhOug0t7FW}Yk7x5bT zOL(ok2Hz}y8LyMSg4fGm#T(?cc%%F^yh;8#-YkCu-zwjXZBg4{^V|0gsSx!6W4#;ZgFB@o0G?9wYw* zkClIl$H_m#xgmmN(-m@~`j-@~`oU@^A3T@~wE9{98Oj{vDnv z{~phhZ^LusKj69YAMr){f|tqnz{}-(;uZ3}@JhM0&r>D0_Ij%2)?QDI+}iJ{m0SBg zo8{J?Po3P_^Qo6x`#ueFYu~3)ZteXv$*sMgX1TThvsG^G|7??6dq6F6YY%9<+}a27 zl?AtdYab{?ZtVqy%B{Vi_Ht`KsDs?v4+@i8dqSP$)}Bzf+}aoN%l&wSyfYpt?}A6k zyW-LE2s}pK4Ud&~$K&KZ@OZhkPn00H_KFha)?QJP+}bZnmRtKpDROJiXoB3@Gny#3 z_KhaXtu3K6xwR>jA-A@LGUe9BP?p@<8p@Gdn?t#BYkO#s+}a?@lUrLvOXSuj(Nej! zO_VRUHj0+Xt*xR0xwToeLT+srt(3>(h4LYIk=)ueDwbQ@MkR7<ls+ekHXYa^*vZfzxPmRp-ib#iMvsa|evC^g8fEu}`e zwW-u3x3-m<<<`d1R=Kscv`ubpF15&0@$K>{xNmK6`=5%3$kXspc{<)+J`L|6pN@yg zGw@FG8F;w-JlrpziATsY@kseBJW4(rkCxBDW8~IGR;>JdJWf6rkC$iT3Gy5~Q9ch( zlF!GJ<<_=Virm`Rnjp8fwkFE0&8^9DYkMnAZf$U7$gM4|Ou4nml_j^fxpL%rc&_|X ze35)Ho+rNyUm{8+AmZf~{Ra(rv#mg`$9x18V2a?Aa#lUojO zz1(tv8|0P~+$gu);3m1{2sg_uS9q)3a)!6bEqAy@ZaKu;<(5nATNm8^EvGm{Zn?#w za?3GpFSlId4sy#m4wGB%aVNRuAcxB>7uhejoa6|(6$#QE;Dn)K>N==Yk+fozd*2dIixwSQw zCbu@HGUV3wRHoe8pvsar;5qUwc&_{-e3ATPJWt+;FOh$OFO^%{Rr&JI@MUsq%c?+b zZCb66TiaGE<<`bkq1@WKDw2PN7t5{fs}i}jfmJHEwy?_N)+ScD+}g&fkXsvBm2zt< zt4eNdW>w3r?W`KPwV_ojx3;u4%dJhVI=Qv2RWG+Twi@Kt)>fn3+T3cATdr)g+;V2O z$}M+xo7{3}TjZ8YyIpQMwZ8Si?cZ{1L*$lY8!ES4+xBwHx$Pjg+}kj@<=}RbTP|+6 z+;VdLa?8z)kXw#!q}+0KqvV#e8!flo-59y$@W#q5mp4vsIlb|6%k52&TaIs{+;V-B z6uIR9Pmo(K@I<-g1W%S*Zg861a)dMFmMfeox18ZDx#bS$$SsFBS8ln) zi{zG5oF}*3;w5s+FsYPsb)*T^mBxmIqu&zt3z16?P# zTu|Jfq9c0jkwtvyiR1|56x5V^Gv8Y;JTLfgx&z0eMFYd17Z zZtaJ5l3P2X;c{zF)GxPoMI+?azG$S}+8K?KTYIC?a%*=qMsDqo#>%Z7(m1)bM;b4; zc1aWD);?*X+}bHkl3RPF$#QGAG(~RhmrjsdJEjxm)}HBPxwWT}Cbu?*GUV32M5f$F zdvsayc6g3_H#}FqJHALBg6GNiz?aDP#FxtV!t>>!_%iw4c!7K$e1&{pe5JfSUMSxW zFOu(%7t0U8OXMB!Qu%>+nY<%jE-!6~9eUAsX|897QygME$?}4|M zN8%miJ@GJkFT9id7(84ah5O~b@d$YzJW}2lkCI2@(eh*Q72FCy&A7<;UX* z@)Phxd4D`f9*ZZ-PsCH?1Mms*lkkc1IDE2vAf6^4glEVHp<%#$*`N?>J{1kkJd=$P?o`e_5N8?5EF?g|jEM6i{#!Ka= z;$`yF@N)S$yh5IWSIWoZRr1sEYWW#>jeG)LD?bz8EI$jclb?;(%O~Ou@^kP;`MG$L zd=lO)pNwzC?Yx%vZ^0|1tJR47t=irI*d3ch1KAtRJfTzfF@d@&U z_(b^y_+o*};o&y-(`XUQ+YbL4q=uKZGbk$f?pC%+6|B42_pm0ynM%dfzf z$*;r<uft2_*W+dKWq7%KIbI>Z0k4$bh*!xA z@M`%@c#ZsaycW0Z@J_r={R{DW`6|3YemCAIzXxxU7vatFd-1LE`|xe@`|%ceF}_{? z0Pd>@Zu1Y~A@YatPe zjK|A=!4u@a;)(L@c#`}#JX!ubo+AGPpCI=g&Gs*EhfkL8hNsDQ$1~(1c&2<0JWIYO zo+IB2&y|Pbi{yLbdGdYmCGvgorSkT8zI;D?nS6h|Kz;zeLf!#iDL)V|ly}67Z`@!R@~f9wP6HhsvYz_VQ!#4)T6@ znEW`rlRO3wmmiP&=+CS+nEgxYFr*0!`pBZLq_2qDBm2#suw(5zY8G9ffVBZLs*gw8ql z^R-@l%Ol0{P8@WN3BzBKK4uR_xm`UXlplkl6?YBwi9uRJprfM6LFe738&jh zIK!TdGwo!YZJ&g5?UQkyeG1OEQ*fbuDlW25$Hn$ETw+P)sg*f-!{?uFKZ@(@$8f#=$vQ{SuC{n{l-LGLErd!LjzMIL>at@%9RwV84bF?UgvmZpF#=Dx6}!j#KT` zIL&Uu>Gm3&VXwuR_Bxzxx8q#<4V-7M$NBb~xX|vvMfO{`*nS(A*ze#{yAzk$@8WX% zJzQbGk1OpiTxD;-)%FLt#{Ll3+TFO${s`CGAL9o56WnO`;3j(`Zni(gE%s-))$YY@ z_UE|W{sMQ{U*b-?4|myL;chz+!}H(X4ENfb<34)}+;0cr0eee4Xm5pw?5**z9gG97 zjXeLi!9n)6IN06}hu9%F)ZQM4**oBHdq*5$>uyD)t@{;G_Rcuk-UY|lx@!?@?~3E> z-Eh3Edlw0|?p`F?x_^;m>kdY;t$P?Lw(er2+PaUCX6sHyx~+Q|8FnPjwD-l?_86RN z?}zj3D4cKaj|=UwxX3;L7u(Ue#6A$0+6Un>`(Rvd$KVS45L{`G!&UZpTy4kV8v9UO zYafQ|?89-r9fuq2BXFaAByO^g!p(L(Zn2NXt@bgv%{~^l+X=YCJ`Q)<$Kx*h1l(;W z;vRbf?zJc4K6?`Gx0CRIJsA($Q}B>|A|AGrabV@h^Zz6qWS@+K?Ne}woq|K{Q*oF* z6^GlW;RrhwN7|?3DEkZ?ZBN57b{dYg&%|-|SvcN48zi8JjioNZ6Xx%Ld4XJ_MlI|moqGjWkU3m4nDxWt}~OYMtrnLP)W z+j+Rco{KB(dAQ1+kE`u`Tw@pDT6+Pmvlrre`x4w>Ux^#-t8kNDf}8EDaf^KoZndw) zZFVVcx39w;_Vu{az5#dHWw_hE5%<_P;a>Y@+-H~Le)|?YVBd-d?c4B>U4e(~+i{?E z{tPGE-{2IxAE(;i;xzj^oNoV! zGwh#mrmcI<*|zRF=i0jOoM-FKbH1&6&xN+`J{Q@#|6FYA4s?mFd(fq}?n0N@x({7$ z>rQlqt$Wdxw(dq(*}5NHZR?J7jjemqwYKg`*V(!+U2p5obc3yX(~Y+7PB+=QKizEW z4t0yId(^GA?ozkex=-D1>rQott$Wp-w(eGU*}7ldZR?J8kF9&wy|(UJ_u0B{-EZs8 z^?|f|X9d~1r4?*X#3A-19BL=wFncl%w{>eP!q)Ar zNL#nJqHNvbineuwD+cTDNpzPh&elz?1iy`LbS2ul(UoNDW>>PUn_VgPrW;!w$Rts7sNwr+f7+q(IcYwPA$o~;{T`L=F=723K9R%GiYSh1}eVI{V1gq7O5 z8CGWNW>~qc8)6mqbX;lAz*TlOuC{Yn7T;ts7~9)g#Yy-AD_vbu%s4*3GmKTQ}4~ZQW1{vvpG~+}2IC z2wOMSB5mDRi?VfdE!x)2wHRAB*kbK5kMo?j_rvja6i%@B$BFh>oMaz>lkI4nVjqZ8 zZQXE7vvt!g-PTRF3|lweGHu;>%eHm%E!Wn~w>(=n;PP$VfGf0h6RyZU5*OP?;SxI@ zm)b|;GW!@@ZXb&)>;znC>!w_leLSwVPrx;HBCfS3;5vIEuD2)Q20IBi+LLjUJq0)0 zC*l@68MoRe;Wk@0>)LJIu-fTO}j2zH|@G@-MH(qb>ptr*3G*{H~dm<-SA7Zb<;21)=j?* zTQ~kP?L|1-z6|Hum*YIU80Xtp;6nRKTx4H`i|rCzVqc9*?Q3wEeJw7xOL2vL9j>&m z$5r+XxZ2ij!5Uk)25aqGaGkB2gY~v<5H{GlLD*>PCSjAU`+m*#-MGcR2e;Z)xXr#7 zx7+vO4*P!GX;`dpSy~7t{T{Be-^bN<7p}24;96U^ChP29aJ{Yj zmkoA4ZnQ7PO?Clpwin|)$&UxEAV zD{;Sl6&|ol@SuG)9u|7rJr1#Nz@c^-4zq8>;r2~9!oC?t z+T}RPz6D3yx8fN4HXLhL;5hqs9B`+kOD&+7IG9`yrff*Wg0?VO(TCf{X3NxWul-rS_w^%zg})+mGW4yAD^{ zPv9#1NnC9|g=_43Tx&m#>+EN6z5Oh1up4lry#zPe&*5hKdE8<*;#T_w+-5Ju?e;R< zVK?DUdpYj1U&P(^OSs2w#=Z8-xX*qC_uH@H0ej#7@cg&O;30cIJZwkdz`Bv=|Nc10 z9*cwR18|5PjYI7NahQD&4z~}+5q1oYv=6~i_Bb4EkH;}~ERMBxA2rTC49DAt;{-bn zC)!8gB>PC5Y#)VFY~58&wRK-L%{~UF+Y@kxJrQTxlW?}3gmdl5IM1Gf^X(IHp`DD2 z?2~Y@eKIbwPr;>j3NEux#pU)?Tw$MvEA3QVWuK0#?K5zVJq_2|X}Hcl6W7~k;RgF` z+-RrcCi@)RY@dr;>_8B=812n)o2|RB?Y8d2cG$WT+iB}wY?rOOvE8=r$M)E|Bin21 zo@}43yR!YZ?#m9?x-&ay>)z~;t-G_sw(idc+DD%MxmF^et-G`#w(ir0+PYI4 zX6s&UxUIXj5w`BvM%ub#8)fUBZM3bswlTKu+s4|ua~o&t-fg_CySE9p?%yWbkvPfT z7bn}gi<@HWK5nY5JGp7L?&YT2x|^F}>wa#g9gVZ?197f>5YDp?#`$&(F0>E9MfNyc zY>&q!b}TNn55;BnVYu8r99P(JxY9lXSJ_A6YWpZ$W5?rK`)FKeAA{@dV{wC>fE(@O zaFcyJZnjUrEp{SqwI|>ciSi89y=NL+9%;Y`()g2pMnSM z6g+63iihl}c-TG-2i_QY{_8GrkgfZ~!M5%chuFGT9BS)sahR?9#o@N@7)RK;XB=tk zu5pyD`^M3>?i|P1x_2CF>+W%!t^3FEw(cM&*t&zw{=H3!`40JOj~!Avu)j1&b4)CInUO;<$POrmkVv(UoNtBhq>6+J?0WycbQ9V z-DfVdb*H)9*1hHmy9-y^8*r8V0j{<`#5Hy|uC+hHb@s=&-u?tP*gd$>-iVv*PjR#T z8E&zAajX3~ZnM9@?e>?r!|ubK_E)&e{u+1N-{2m*ANShd;y(L3+;4x62kZenX#aqR z>>u&4{SywXA9?-{;voBH9BluBL+pRzPlkP)~)Lp zTQ{#`ZQZ_(vvmVI-qtPb1Y0+;6K&nbPO^0)JK5H)>=au!vr}!|&Q7y+Lp$BpE$s|j zH?=cu-PX>wbz?i%)~)S4TQ|4!ZQb53v~`2K$kr|HVp})4OKjcdF12-|yUfq9v)~)Y)Ter{~Y~4g}v~?T3$<~eZW?Q$? zTWsA-Z?$zhz0KAQ^>$mg)H`h5RPVGO#$C2;y2Un8i4t=sHFwr;c!+q%^rcyr|Wubb^bwr;lv+q&T%VmIJWdkGG+b=y7MZp0Dx3pmo& z&G#r<*LeH>u6Ft+`ZS-tgH_~%$-Ad21bu&HR*6s8{TQ}5;Y~4~Xwsljz#MW)~ zQd>9H%WU0RFSm7by~5V*^-6ow4R%|%*sE>bWUsMxo4wZ7jrKZQx7zD%-E42Lb-TUM z)(!V2TesYsZQXQlv31+M)z*#oHe0ve+il%^@33|Iz0=kW_%2(w;Ja`8XRM<#j*A}9A~%Vc>4{UV6VrC_M14#?!d|RTR6pj8>iau z;554vr`zx14EsHtX}^!N?Jk^aZ@_u>2RPsU5Et6rxXAtp7uz4>68jTeYWLtWdm}El zKgAXHXSmYt#Z~s_xZ3^#*Vtd;TDuR|*v53%G!C|(!6EjuIMi;yVfGRnZa;@3?B{W$-H4;?7jU$_6vx=haID>gGo?l!(NFq?N*#^ufnp0I|jq~j` zTxhSsMfO@;Y_G#5b~`S$-@s+|dR%V5i7V_5Txq|BtL(RNwfzpRu{&|C{VuMv-^2Cx z`?$gG!j1L@++=@%o9z#Ai`|V|?T>Jq{V{I0KfxV#;yj-J_5|EzPsH8!B-~>s;a+<( z?z5-he)~i`U?<~2`y@PMpNxm?Q*hwzk>`I34zf?h!S+-fVxNXX?Nl6QpN_-rGjN1G z4M*B(ILbZ~N84xN82fA-Yp3Hl`y3o^pNkXh^Khb_fs^d>ak6~@PO&eoNLd-dG;)vZ|CAddp0hzFT%z499&}O;Zl1pF0<$1a(h0mu=8=H zeKD@G3vji)0N2=sxYk~X>+DN#y?rTeu#0e`y$Cnim*Hmna@=AU<5v3$+-6^i+wH4x zhaKQJXs5jy?y@(>-S!r^#}2~1_LjKM-U|2ITjK#c7!TUp;30ckJZx`=1MiGH|3h$) zy*&=LcfcX`jyTi~#bNeNINaVDN7%dINIMKi*}LLsdp8_o?~Y^ba2#jvf#dBxae}=U zPP8L%lD#)hw*P@s?0s;m9f{NIeQ~-y24~p&;Y>RUXWRSZTzf3evk$=eb~G-u55z_G zLAcmH7?;>FxYRxbm)YZRxji0N*s-|MJ``8khv91ba9m@@;ad9$TxTDN>+Pd(gB_0> z?W1v%eGG24kHsx^0&caB!)^BQxZOShci4%z)1H94?1{MBo`ie;c$;aHPC6-aM%IFy z$eHu=vS-hm6*({GlAMCbnOU>*76bxU)$Saa!GF%ue(L>s{Nv^0w+aM~yiQHP zn?4^r`t=ieeaig#b4I^z60bWWCqJifcH!*#^ZxqwNqRq7`GpG$a{lsubVqX1{CP97 z3jg}{Q+WM^yiMOXy|Yc9!kP1C>$|cb=WlO&qTa`!KW2Y@KgoRCw8E@{!pZZpH$A3I zK`B!=flD#*#nUc`U9#D6^Rrs7FFqo?qMo~)-D@0+J@ zfL8~$wzskMxFhk@3hYEXPzbROd6V`0lfy{P$k-*2McFim@@Wy3(2Z0@i>Z-bqxJML z_0zv;hx2y{jG=Je*FH3s_M}KUgD#? R*Xa?O#i)kh8%D;;f`1Z@_0%CMCpzoXh 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

ev)gUcsxF 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

g(pj2WX?*xr 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

  • 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 dYoS~V3ARmBvkQSgyY%{3FU?HNZ;B6H{y%>, - mxml: Option>, - css: Option>, - diagnostics: Vec, -} - -#[derive(Serialize, Deserialize)] -struct ParserDiagnosticResult { - warning: bool, - column1: usize, - column2: usize, - line1: usize, - line2: usize, - message: String, -} - -#[wasm_bindgen] -pub fn parse(input: &str, source_type: &str) -> String { - let compilation_unit = CompilationUnit::new(None, input.to_owned()); - - let mut program: Option> = None; - let mut mxml: Option> = None; - let mut css: Option> = None; - - let source_type = source_type.to_lowercase(); - - if source_type == "mxml" { - mxml = Some(ParserFacade(&compilation_unit, default()).parse_mxml()); - } else if source_type == "css" { - css = Some(CssParserFacade(&compilation_unit, default()).parse_document()); - } else { - program = Some(ParserFacade(&compilation_unit, default()).parse_program()); - } - let mut diagnostics = vec![]; - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - diagnostics.push(ParserDiagnosticResult { - warning: diagnostic.is_warning(), - column1: diagnostic.location().first_column() + 1, - column2: diagnostic.location().last_column() + 1, - line1: diagnostic.location().first_line_number(), - line2: diagnostic.location().last_line_number(), - message: diagnostic.format_message_english(), - }); - } - serde_json::to_string_pretty(&ParserResult { - program, - mxml, - css, - diagnostics, - }).unwrap() -} \ No newline at end of file diff --git a/examples/asdoc/.gitignore b/examples/asdoc/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/examples/asdoc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/examples/asdoc/Cargo.toml b/examples/asdoc/Cargo.toml deleted file mode 100644 index d7c7409..0000000 --- a/examples/asdoc/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "asdoc-example" -version = "0.1.0" -edition = "2021" - -[dependencies] -as3_parser = { path = "../../crates/parser", version = "1" } - -[[example]] -name = "asdoc" -path = "example.rs" \ No newline at end of file diff --git a/examples/asdoc/Example.as b/examples/asdoc/Example.as deleted file mode 100644 index d73fc3d..0000000 --- a/examples/asdoc/Example.as +++ /dev/null @@ -1,10 +0,0 @@ -package q1 { - public namespace q1ns - public class C1 { - /** - * @private - * Comment for q1.q1ns::x - */ - q1.q1ns var x - } -} \ No newline at end of file diff --git a/examples/asdoc/example.rs b/examples/asdoc/example.rs deleted file mode 100644 index 2e10ca1..0000000 --- a/examples/asdoc/example.rs +++ /dev/null @@ -1,61 +0,0 @@ -use std::env; -use as3_parser::ns::*; - -fn main() { - // Define source path - let source_path = env::current_dir().unwrap().join("Example.as").to_string_lossy().into_owned(); - - // Read source content - let source_content = include_str!("Example.as").to_owned(); - - // Create compilation unit - let compilation_unit = CompilationUnit::new(Some(source_path), source_content); - - // Parse program - let program = ParserFacade(&compilation_unit, default()).parse_program(); - visit_program(&program); - - // Report diagnostics - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - println!("{}", diagnostic.format_english()); - } -} - -fn visit_program(program: &Rc) { - for package in program.packages.iter() { - for directive in package.block.directives.iter() { - // directive: Rc - - match directive.as_ref() { - Directive::ClassDefinition(defn) => { - visit_class(&defn); - }, - - _ => {}, - } - } - } -} - -fn visit_class(defn: &ClassDefinition) { - for directive in defn.block.directives.iter() { - if let Directive::VariableDefinition(defn) = directive.as_ref() { - // Print any found main body and @private tags - if let Some(asdoc) = &defn.asdoc { - print_asdoc(asdoc); - } - } - } -} - -fn print_asdoc(asdoc: &Rc) { - if let Some((text, loc)) = &asdoc.main_body { - println!("Found main body at {}:{}\n\n{}\n\n", loc.first_line_number(), loc.first_column() + 1, text); - } - for (tag, loc) in &asdoc.tags { - if matches!(tag, AsDocTag::Private) { - println!("Found @private tag at {}:{}\n\n", loc.first_line_number(), loc.first_column() + 1); - } - } -} \ No newline at end of file diff --git a/tests/parser/ASDoc.as b/tests/parser/ASDoc.as deleted file mode 100644 index c14a1cc..0000000 --- a/tests/parser/ASDoc.as +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Main body. - * @copy C1#x - * @inheritDoc - * @see C1#x X description - */ -var x - -/** - * N1. - */ -[N1] -/** - * N2. Lorem - * ipsum. - */ -[N2] -var y - -/** - * @throws SyntaxError If a syntax error occurs. - */ -function m() { -} \ No newline at end of file diff --git a/tests/parser/ASDoc.diag b/tests/parser/ASDoc.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/ASDoc.tree b/tests/parser/ASDoc.tree deleted file mode 100644 index f8c14d8..0000000 --- a/tests/parser/ASDoc.tree +++ /dev/null @@ -1,235 +0,0 @@ -{ - "location": "7:1-24:2", - "packages": [], - "directives": [ - { - "VariableDefinition": { - "location": "7:1-7:6", - "asdoc": { - "location": "1:1-6:4", - "main_body": [ - "Main body.", - "2:4-2:14" - ], - "tags": [ - [ - { - "Copy": { - "base": { - "QualifiedIdentifier": { - "location": "3:10-3:12", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "C1", - "3:10-3:12" - ] - } - } - }, - "instance_property": { - "location": "3:13-3:14", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "3:13-3:14" - ] - } - } - } - }, - "3:4-3:14" - ], - [ - "InheritDoc", - "4:4-4:15" - ], - [ - { - "See": { - "reference": { - "base": { - "QualifiedIdentifier": { - "location": "5:9-5:11", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "C1", - "5:9-5:11" - ] - } - } - }, - "instance_property": { - "location": "5:12-5:13", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "5:12-5:13" - ] - } - } - }, - "display_text": "X description" - } - }, - "5:4-5:27" - ] - ] - }, - "attributes": [], - "kind": [ - "Var", - "7:1-7:4" - ], - "bindings": [ - { - "destructuring": { - "location": "7:5-7:6", - "destructuring": { - "QualifiedIdentifier": { - "location": "7:5-7:6", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "7:5-7:6" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "VariableDefinition": { - "location": "12:1-18:6", - "asdoc": { - "location": "13:1-16:4", - "main_body": [ - "N2. Lorem\nipsum.", - "14:4-15:10" - ], - "tags": [] - }, - "attributes": [ - { - "Metadata": { - "location": "12:2-12:4", - "asdoc": null, - "name": [ - "N1", - "12:2-12:4" - ], - "entries": null - } - }, - { - "Metadata": { - "location": "17:2-17:4", - "asdoc": null, - "name": [ - "N2", - "17:2-17:4" - ], - "entries": null - } - } - ], - "kind": [ - "Var", - "18:1-18:4" - ], - "bindings": [ - { - "destructuring": { - "location": "18:5-18:6", - "destructuring": { - "QualifiedIdentifier": { - "location": "18:5-18:6", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "18:5-18:6" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "FunctionDefinition": { - "location": "23:1-24:2", - "asdoc": { - "location": "20:1-22:4", - "main_body": null, - "tags": [ - [ - { - "Throws": { - "class_reference": { - "QualifiedIdentifier": { - "location": "21:12-21:23", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "SyntaxError", - "21:12-21:23" - ] - } - } - }, - "description": "If a syntax error occurs." - } - }, - "21:4-21:49" - ] - ] - }, - "attributes": [], - "name": { - "Identifier": [ - "m", - "23:10-23:11" - ] - }, - "common": { - "location": "23:11-24:2", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "23:11-23:13", - "parameters": [], - "result_type": null - }, - "body": { - "Block": { - "location": "23:14-24:2", - "metadata": null, - "directives": [] - } - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Attributes.as b/tests/parser/Attributes.as deleted file mode 100644 index 96fc965..0000000 --- a/tests/parser/Attributes.as +++ /dev/null @@ -1,17 +0,0 @@ -q.x var y - -[N1] internal var z - -[N1(x = "y")] {} - -dynamic final class C1 {} - -/** - * Foo - */ -[N1] -/** - * @eventType FooEvent.FOO - */ -[Event(name = "foo", type = "FooEvent")] -class C1 {} \ No newline at end of file diff --git a/tests/parser/Attributes.diag b/tests/parser/Attributes.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Attributes.tree b/tests/parser/Attributes.tree deleted file mode 100644 index ee105c8..0000000 --- a/tests/parser/Attributes.tree +++ /dev/null @@ -1,293 +0,0 @@ -{ - "location": "5:1-17:12", - "packages": [], - "directives": [ - { - "VariableDefinition": { - "location": "1:1-1:10", - "asdoc": null, - "attributes": [ - { - "Expression": { - "Member": { - "location": "1:1-1:4", - "base": { - "QualifiedIdentifier": { - "location": "1:1-1:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "1:1-1:2" - ] - } - } - }, - "identifier": { - "location": "1:3-1:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "1:3-1:4" - ] - } - } - } - } - } - ], - "kind": [ - "Var", - "1:5-1:8" - ], - "bindings": [ - { - "destructuring": { - "location": "1:9-1:10", - "destructuring": { - "QualifiedIdentifier": { - "location": "1:9-1:10", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "1:9-1:10" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "VariableDefinition": { - "location": "3:1-3:20", - "asdoc": null, - "attributes": [ - { - "Metadata": { - "location": "3:2-3:4", - "asdoc": null, - "name": [ - "N1", - "3:2-3:4" - ], - "entries": null - } - }, - { - "Internal": "3:6-3:14" - } - ], - "kind": [ - "Var", - "3:15-3:18" - ], - "bindings": [ - { - "destructuring": { - "location": "3:19-3:20", - "destructuring": { - "QualifiedIdentifier": { - "location": "3:19-3:20", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "z", - "3:19-3:20" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "Block": { - "location": "5:15-5:17", - "metadata": [ - { - "Metadata": { - "location": "5:2-5:13", - "asdoc": null, - "name": [ - "N1", - "5:2-5:4" - ], - "entries": [ - { - "location": "5:5-5:12", - "key": [ - "x", - "5:5-5:6" - ], - "value": { - "String": [ - "y", - "5:9-5:12" - ] - } - } - ] - } - } - ], - "directives": [] - } - }, - { - "ClassDefinition": { - "location": "7:1-7:26", - "asdoc": null, - "attributes": [ - { - "Dynamic": "7:1-7:8" - }, - { - "Final": "7:9-7:14" - } - ], - "name": [ - "C1", - "7:21-7:23" - ], - "type_parameters": null, - "extends_clause": null, - "implements_clause": null, - "block": { - "location": "7:24-7:26", - "metadata": null, - "directives": [] - } - } - }, - { - "ClassDefinition": { - "location": "12:1-17:12", - "asdoc": { - "location": "9:1-11:4", - "main_body": [ - "Foo", - "10:4-10:7" - ], - "tags": [] - }, - "attributes": [ - { - "Metadata": { - "location": "12:2-12:4", - "asdoc": null, - "name": [ - "N1", - "12:2-12:4" - ], - "entries": null - } - }, - { - "Metadata": { - "location": "16:2-16:40", - "asdoc": { - "location": "13:1-15:4", - "main_body": null, - "tags": [ - [ - { - "EventType": { - "Member": { - "location": "14:15-14:27", - "base": { - "QualifiedIdentifier": { - "location": "14:15-14:23", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "FooEvent", - "14:15-14:23" - ] - } - } - }, - "identifier": { - "location": "14:24-14:27", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "FOO", - "14:24-14:27" - ] - } - } - } - } - }, - "14:4-14:27" - ] - ] - }, - "name": [ - "Event", - "16:2-16:7" - ], - "entries": [ - { - "location": "16:8-16:20", - "key": [ - "name", - "16:8-16:12" - ], - "value": { - "String": [ - "foo", - "16:15-16:20" - ] - } - }, - { - "location": "16:22-16:39", - "key": [ - "type", - "16:22-16:26" - ], - "value": { - "String": [ - "FooEvent", - "16:29-16:39" - ] - } - } - ] - } - } - ], - "name": [ - "C1", - "17:7-17:9" - ], - "type_parameters": null, - "extends_clause": null, - "implements_clause": null, - "block": { - "location": "17:10-17:12", - "metadata": null, - "directives": [] - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Configuration.as b/tests/parser/Configuration.as deleted file mode 100644 index 38d8419..0000000 --- a/tests/parser/Configuration.as +++ /dev/null @@ -1,21 +0,0 @@ -package foo.bar { - /** - * Comment 1 (overriden by the "Communication facility" comment). - */ - CONFIG::DEBUG - /** - * Communication facility. - */ - [Adherence(type = "efficient")] - /** - * Dispatched when a message is received. - */ - [Event(name = "received", type = "foo.bar.MessageEvent")] - public class CommunicationCenter extends EventDispatcher { - CONFIG::DEBUG { - protected var x: T1, y: T2, z: T3; - protected function f1(): void {} - } - CONFIG::RELEASE protected var w: T4; - } -} \ No newline at end of file diff --git a/tests/parser/Configuration.diag b/tests/parser/Configuration.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Configuration.tree b/tests/parser/Configuration.tree deleted file mode 100644 index f9cdbf8..0000000 --- a/tests/parser/Configuration.tree +++ /dev/null @@ -1,386 +0,0 @@ -{ - "location": "5:5-21:2", - "packages": [ - { - "location": "5:5-21:2", - "asdoc": null, - "name": [ - [ - "foo", - "1:9-1:12" - ], - [ - "bar", - "1:13-1:16" - ] - ], - "block": { - "location": "5:5-21:2", - "metadata": null, - "directives": [ - { - "NormalConfigurationDirective": { - "location": "14:62-20:6", - "namespace": [ - "CONFIG", - "5:5-5:11" - ], - "constant_name": [ - "DEBUG", - "5:13-5:18" - ], - "directive": { - "ClassDefinition": { - "location": "15:9-20:6", - "asdoc": { - "location": "6:5-8:8", - "main_body": [ - "Communication facility.", - "7:8-7:31" - ], - "tags": [] - }, - "attributes": [ - { - "Metadata": { - "location": "9:6-9:35", - "asdoc": null, - "name": [ - "Adherence", - "9:6-9:15" - ], - "entries": [ - { - "location": "9:16-9:34", - "key": [ - "type", - "9:16-9:20" - ], - "value": { - "String": [ - "efficient", - "9:23-9:34" - ] - } - } - ] - } - }, - { - "Metadata": { - "location": "13:6-13:61", - "asdoc": { - "location": "10:5-12:8", - "main_body": [ - "Dispatched when a message is received.", - "11:8-11:46" - ], - "tags": [] - }, - "name": [ - "Event", - "13:6-13:11" - ], - "entries": [ - { - "location": "13:12-13:29", - "key": [ - "name", - "13:12-13:16" - ], - "value": { - "String": [ - "received", - "13:19-13:29" - ] - } - }, - { - "location": "13:31-13:60", - "key": [ - "type", - "13:31-13:35" - ], - "value": { - "String": [ - "foo.bar.MessageEvent", - "13:38-13:60" - ] - } - } - ] - } - }, - { - "Public": "14:5-14:11" - } - ], - "name": [ - "CommunicationCenter", - "14:18-14:37" - ], - "type_parameters": null, - "extends_clause": { - "QualifiedIdentifier": { - "location": "14:46-14:61", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "EventDispatcher", - "14:46-14:61" - ] - } - } - }, - "implements_clause": null, - "block": { - "location": "19:9-20:6", - "metadata": null, - "directives": [ - { - "NormalConfigurationDirective": { - "location": "15:9-18:10", - "namespace": [ - "CONFIG", - "15:9-15:15" - ], - "constant_name": [ - "DEBUG", - "15:17-15:22" - ], - "directive": { - "Block": { - "location": "15:23-18:10", - "metadata": null, - "directives": [ - { - "VariableDefinition": { - "location": "16:23-16:47", - "asdoc": null, - "attributes": [ - { - "Protected": "16:13-16:22" - } - ], - "kind": [ - "Var", - "16:23-16:26" - ], - "bindings": [ - { - "destructuring": { - "location": "16:27-16:32", - "destructuring": { - "QualifiedIdentifier": { - "location": "16:27-16:28", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "16:27-16:28" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "16:30-16:32", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T1", - "16:30-16:32" - ] - } - } - } - }, - "initializer": null - }, - { - "destructuring": { - "location": "16:34-16:39", - "destructuring": { - "QualifiedIdentifier": { - "location": "16:34-16:35", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "16:34-16:35" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "16:37-16:39", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T2", - "16:37-16:39" - ] - } - } - } - }, - "initializer": null - }, - { - "destructuring": { - "location": "16:41-16:46", - "destructuring": { - "QualifiedIdentifier": { - "location": "16:41-16:42", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "z", - "16:41-16:42" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "16:44-16:46", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T3", - "16:44-16:46" - ] - } - } - } - }, - "initializer": null - } - ] - } - }, - { - "FunctionDefinition": { - "location": "17:23-17:45", - "asdoc": null, - "attributes": [ - { - "Protected": "17:13-17:22" - } - ], - "name": { - "Identifier": [ - "f1", - "17:32-17:34" - ] - }, - "common": { - "location": "17:34-17:45", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "17:34-17:42", - "parameters": [], - "result_type": { - "VoidType": { - "location": "17:38-17:42" - } - } - }, - "body": { - "Block": { - "location": "17:43-17:45", - "metadata": null, - "directives": [] - } - } - } - } - } - ] - } - } - } - }, - { - "NormalConfigurationDirective": { - "location": "19:9-19:45", - "namespace": [ - "CONFIG", - "19:9-19:15" - ], - "constant_name": [ - "RELEASE", - "19:17-19:24" - ], - "directive": { - "VariableDefinition": { - "location": "19:9-19:45", - "asdoc": null, - "attributes": [ - { - "Protected": "19:25-19:34" - } - ], - "kind": [ - "Var", - "19:35-19:38" - ], - "bindings": [ - { - "destructuring": { - "location": "19:39-19:44", - "destructuring": { - "QualifiedIdentifier": { - "location": "19:39-19:40", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "w", - "19:39-19:40" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "19:42-19:44", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T4", - "19:42-19:44" - ] - } - } - } - }, - "initializer": null - } - ] - } - } - } - } - ] - } - } - } - } - } - ] - } - } - ], - "directives": [] -} \ No newline at end of file diff --git a/tests/parser/E4X.as b/tests/parser/E4X.as deleted file mode 100644 index fb18845..0000000 --- a/tests/parser/E4X.as +++ /dev/null @@ -1,18 +0,0 @@ -default xml namespace = myxmlns; - - ; - ; - ; - - - - - - Lorem ipsum - Lorem ipsum - {c} - - .(filterCondition) - ..d; - -<>; \ No newline at end of file diff --git a/tests/parser/E4X.diag b/tests/parser/E4X.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/E4X.tree b/tests/parser/E4X.tree deleted file mode 100644 index 44f7a88..0000000 --- a/tests/parser/E4X.tree +++ /dev/null @@ -1,324 +0,0 @@ -{ - "location": "1:1-18:7", - "packages": [], - "directives": [ - { - "DefaultXmlNamespaceStatement": { - "location": "1:1-1:33", - "right": { - "QualifiedIdentifier": { - "location": "1:25-1:32", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "myxmlns", - "1:25-1:32" - ] - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "3:1-3:19", - "expression": { - "XmlMarkup": { - "location": "3:1-3:17", - "markup": "" - } - } - } - }, - { - "ExpressionStatement": { - "location": "4:1-4:8", - "expression": { - "XmlMarkup": { - "location": "4:1-4:6", - "markup": "" - } - } - } - }, - { - "ExpressionStatement": { - "location": "5:1-5:27", - "expression": { - "XmlMarkup": { - "location": "5:1-5:25", - "markup": "" - } - } - } - }, - { - "ExpressionStatement": { - "location": "6:1-16:9", - "expression": { - "Descendants": { - "location": "6:1-16:8", - "base": { - "Filter": { - "location": "6:1-15:23", - "base": { - "Xml": { - "location": "6:1-14:5", - "element": { - "location": "6:1-14:5", - "name": { - "Name": [ - "t", - "6:2-6:3" - ] - }, - "attributes": [], - "attribute_expression": null, - "content": [ - { - "Characters": [ - "\r\n ", - "6:4-7:5" - ] - }, - { - "Element": { - "location": "7:6-7:9", - "name": { - "Name": [ - "t", - "7:6-7:7" - ] - }, - "attributes": [], - "attribute_expression": null, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n ", - "7:9-8:5" - ] - }, - { - "Element": { - "location": "8:6-8:13", - "name": { - "Name": [ - "t", - "8:6-8:7" - ] - }, - "attributes": [], - "attribute_expression": { - "QualifiedIdentifier": { - "location": "8:9-8:10", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "c", - "8:9-8:10" - ] - } - } - }, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n ", - "8:13-9:5" - ] - }, - { - "Element": { - "location": "9:6-9:15", - "name": { - "Name": [ - "t", - "9:6-9:7" - ] - }, - "attributes": [ - { - "location": "9:8-9:13", - "name": [ - "k", - "9:8-9:9" - ], - "value": { - "Value": [ - "v", - "9:10-9:13" - ] - } - } - ], - "attribute_expression": null, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n ", - "9:15-10:5" - ] - }, - { - "Element": { - "location": "10:6-10:15", - "name": { - "Name": [ - "t", - "10:6-10:7" - ] - }, - "attributes": [ - { - "location": "10:8-10:13", - "name": [ - "k", - "10:8-10:9" - ], - "value": { - "Expression": { - "QualifiedIdentifier": { - "location": "10:11-10:12", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "10:11-10:12" - ] - } - } - } - } - } - ], - "attribute_expression": null, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n Lorem ipsum\r\n ", - "10:15-12:5" - ] - }, - { - "Element": { - "location": "12:6-12:23", - "name": { - "Name": [ - "t", - "12:6-12:7" - ] - }, - "attributes": [], - "attribute_expression": null, - "content": [ - { - "Characters": [ - "Lorem ipsum", - "12:8-12:19" - ] - } - ], - "closing_name": { - "Name": [ - "t", - "12:21-12:22" - ] - } - } - }, - { - "Characters": [ - "\r\n ", - "12:23-13:5" - ] - }, - { - "Expression": { - "QualifiedIdentifier": { - "location": "13:6-13:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "c", - "13:6-13:7" - ] - } - } - } - }, - { - "Characters": [ - "\r\n", - "13:8-14:1" - ] - } - ], - "closing_name": { - "Name": [ - "t", - "14:3-14:4" - ] - } - } - } - }, - "test": { - "QualifiedIdentifier": { - "location": "15:7-15:22", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "filterCondition", - "15:7-15:22" - ] - } - } - } - } - }, - "identifier": { - "location": "16:7-16:8", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "d", - "16:7-16:8" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "18:1-18:7", - "expression": { - "XmlList": { - "location": "18:1-18:6", - "content": [] - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/MXML1.diag b/tests/parser/MXML1.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/MXML1.mxml b/tests/parser/MXML1.mxml deleted file mode 100644 index 5d922ab..0000000 --- a/tests/parser/MXML1.mxml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/tests/parser/MXML1.tree b/tests/parser/MXML1.tree deleted file mode 100644 index d8eebd2..0000000 --- a/tests/parser/MXML1.tree +++ /dev/null @@ -1,215 +0,0 @@ -{ - "location": "1:1-16:17", - "version": "Version10", - "encoding": "utf-8", - "content": [ - { - "ProcessingInstruction": { - "location": "1:1-1:22", - "name": "xml", - "data": " version=\"1.0\"" - } - }, - { - "Comment": [ - "", - "2:1-2:37" - ] - }, - { - "Element": { - "location": "3:2-16:17", - "name": { - "location": "3:2-3:15", - "prefix": "s", - "name": "Application" - }, - "attributes": [ - { - "location": "3:16-3:56", - "xmlns": true, - "name": { - "location": "3:16-3:24", - "prefix": "xmlns", - "name": "fx" - }, - "value": [ - "http://ns.adobe.com/mxml/2009", - "3:25-3:56" - ] - }, - { - "location": "4:5-4:48", - "xmlns": true, - "name": { - "location": "4:5-4:12", - "prefix": "xmlns", - "name": "s" - }, - "value": [ - "library://ns.adobe.com/flex/spark", - "4:13-4:48" - ] - }, - { - "location": "5:5-5:46", - "xmlns": true, - "name": { - "location": "5:5-5:13", - "prefix": "xmlns", - "name": "mx" - }, - "value": [ - "library://ns.adobe.com/flex/mx", - "5:14-5:46" - ] - } - ], - "content": [ - { - "Element": { - "location": "6:6-8:16", - "name": { - "location": "6:6-6:14", - "prefix": "s", - "name": "layout" - }, - "attributes": [], - "content": [ - { - "Element": { - "location": "7:10-7:28", - "name": { - "location": "7:10-7:26", - "prefix": "s", - "name": "VerticalLayout" - }, - "attributes": [], - "content": null, - "closing_name": null - } - } - ], - "closing_name": { - "location": "8:7-8:15", - "prefix": "s", - "name": "layout" - } - } - }, - { - "Element": { - "location": "9:6-14:65", - "name": { - "location": "9:6-9:14", - "prefix": "s", - "name": "Button" - }, - "attributes": [ - { - "location": "10:9-10:21", - "xmlns": false, - "name": { - "location": "10:9-10:11", - "prefix": null, - "name": "id" - }, - "value": [ - "button1", - "10:12-10:21" - ] - }, - { - "location": "11:9-11:28", - "xmlns": false, - "name": { - "location": "11:9-11:14", - "prefix": null, - "name": "label" - }, - "value": [ - "Click here!", - "11:15-11:28" - ] - }, - { - "location": "12:9-12:20", - "xmlns": false, - "name": { - "location": "12:9-12:14", - "prefix": null, - "name": "width" - }, - "value": [ - "100", - "12:15-12:20" - ] - }, - { - "location": "13:9-13:22", - "xmlns": false, - "name": { - "location": "13:9-13:17", - "prefix": null, - "name": "fontSize" - }, - "value": [ - "12", - "13:18-13:22" - ] - }, - { - "location": "14:9-14:63", - "xmlns": false, - "name": { - "location": "14:9-14:14", - "prefix": null, - "name": "click" - }, - "value": [ - "text1.text='&& Thanks for the click!';", - "14:15-14:63" - ] - } - ], - "content": null, - "closing_name": null - } - }, - { - "Element": { - "location": "15:6-15:29", - "name": { - "location": "15:6-15:16", - "prefix": "s", - "name": "TextArea" - }, - "attributes": [ - { - "location": "15:17-15:27", - "xmlns": false, - "name": { - "location": "15:17-15:19", - "prefix": null, - "name": "id" - }, - "value": [ - "text1", - "15:20-15:27" - ] - } - ], - "content": null, - "closing_name": null - } - } - ], - "closing_name": { - "location": "16:3-16:16", - "prefix": "s", - "name": "Application" - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/MXML2.diag b/tests/parser/MXML2.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/MXML2.mxml b/tests/parser/MXML2.mxml deleted file mode 100644 index 5c28b9b..0000000 --- a/tests/parser/MXML2.mxml +++ /dev/null @@ -1,4 +0,0 @@ - - - & Text & - \ No newline at end of file diff --git a/tests/parser/MXML2.tree b/tests/parser/MXML2.tree deleted file mode 100644 index 5eb2621..0000000 --- a/tests/parser/MXML2.tree +++ /dev/null @@ -1,38 +0,0 @@ -{ - "location": "1:1-4:11", - "version": "Version10", - "encoding": "utf-8", - "content": [ - { - "ProcessingInstruction": { - "location": "1:1-1:22", - "name": "xml", - "data": " version=\"1.0\"" - } - }, - { - "Element": { - "location": "2:2-4:11", - "name": { - "location": "2:2-2:9", - "prefix": null, - "name": "invalid" - }, - "attributes": [], - "content": [ - { - "Characters": [ - "\r\n & Text &\r\n", - "2:10-4:1" - ] - } - ], - "closing_name": { - "location": "4:3-4:10", - "prefix": null, - "name": "invalid" - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Misc.as b/tests/parser/Misc.as deleted file mode 100644 index ba1c996..0000000 --- a/tests/parser/Misc.as +++ /dev/null @@ -1,19 +0,0 @@ -namespace ns1 -namespace ns2 = "http://www.samsung.com" - -new [] - -v is T -v is not T -v instanceof T -k in o -k not in o - -x ? y : z - -10 ; -10f ; - -/(?:)/gi ; - -/=/ \ No newline at end of file diff --git a/tests/parser/Misc.diag b/tests/parser/Misc.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Misc.tree b/tests/parser/Misc.tree deleted file mode 100644 index 893b52e..0000000 --- a/tests/parser/Misc.tree +++ /dev/null @@ -1,341 +0,0 @@ -{ - "location": "10:1-19:4", - "packages": [], - "directives": [ - { - "NamespaceDefinition": { - "location": "1:1-1:14", - "asdoc": null, - "attributes": [], - "left": [ - "ns1", - "1:11-1:14" - ], - "right": null - } - }, - { - "NamespaceDefinition": { - "location": "2:1-2:41", - "asdoc": null, - "attributes": [], - "left": [ - "ns2", - "2:11-2:14" - ], - "right": { - "StringLiteral": { - "location": "2:17-2:41", - "value": "http://www.samsung.com" - } - } - } - }, - { - "ExpressionStatement": { - "location": "4:1-4:11", - "expression": { - "VectorLiteral": { - "location": "4:1-4:11", - "element_type": { - "QualifiedIdentifier": { - "location": "4:6-4:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "4:6-4:7" - ] - } - } - }, - "elements": [] - } - } - } - }, - { - "ExpressionStatement": { - "location": "6:1-6:7", - "expression": { - "Binary": { - "location": "6:1-6:7", - "operator": "Is", - "left": { - "QualifiedIdentifier": { - "location": "6:1-6:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "6:1-6:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "6:6-6:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "6:6-6:7" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "7:1-7:11", - "expression": { - "Binary": { - "location": "7:1-7:11", - "operator": "IsNot", - "left": { - "QualifiedIdentifier": { - "location": "7:1-7:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "7:1-7:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "7:10-7:11", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "7:10-7:11" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "8:1-8:15", - "expression": { - "Binary": { - "location": "8:1-8:15", - "operator": "Instanceof", - "left": { - "QualifiedIdentifier": { - "location": "8:1-8:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "8:1-8:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "8:14-8:15", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "8:14-8:15" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "9:1-9:7", - "expression": { - "Binary": { - "location": "9:1-9:7", - "operator": "In", - "left": { - "QualifiedIdentifier": { - "location": "9:1-9:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "k", - "9:1-9:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "9:6-9:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "9:6-9:7" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "10:1-10:11", - "expression": { - "Binary": { - "location": "10:1-10:11", - "operator": "NotIn", - "left": { - "QualifiedIdentifier": { - "location": "10:1-10:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "k", - "10:1-10:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "10:10-10:11", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "10:10-10:11" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "12:1-12:10", - "expression": { - "Conditional": { - "location": "12:1-12:10", - "test": { - "QualifiedIdentifier": { - "location": "12:1-12:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "12:1-12:2" - ] - } - } - }, - "consequent": { - "QualifiedIdentifier": { - "location": "12:5-12:6", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "12:5-12:6" - ] - } - } - }, - "alternative": { - "QualifiedIdentifier": { - "location": "12:9-12:10", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "z", - "12:9-12:10" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "14:1-14:6", - "expression": { - "NumericLiteral": { - "location": "14:1-14:3", - "value": "10", - "suffix": "None" - } - } - } - }, - { - "ExpressionStatement": { - "location": "15:1-15:7", - "expression": { - "NumericLiteral": { - "location": "15:1-15:4", - "value": "10", - "suffix": "F" - } - } - } - }, - { - "ExpressionStatement": { - "location": "17:1-17:12", - "expression": { - "RegExpLiteral": { - "location": "17:1-17:9", - "body": "(?:)", - "flags": "gi" - } - } - } - }, - { - "ExpressionStatement": { - "location": "19:1-19:4", - "expression": { - "RegExpLiteral": { - "location": "19:1-19:4", - "body": "=", - "flags": "" - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Qualifier.as b/tests/parser/Qualifier.as deleted file mode 100644 index 837c5ba..0000000 --- a/tests/parser/Qualifier.as +++ /dev/null @@ -1,9 +0,0 @@ -* -; (q)::x -o.* -o.public -o.public::x -o.(q)::x -o.q::x -o.q::[k] -o.@x; \ No newline at end of file diff --git a/tests/parser/Qualifier.diag b/tests/parser/Qualifier.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Qualifier.tree b/tests/parser/Qualifier.tree deleted file mode 100644 index d38b679..0000000 --- a/tests/parser/Qualifier.tree +++ /dev/null @@ -1,351 +0,0 @@ -{ - "location": "1:1-9:6", - "packages": [], - "directives": [ - { - "ExpressionStatement": { - "location": "1:1-2:2", - "expression": { - "QualifiedIdentifier": { - "location": "1:1-1:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "*", - "1:1-1:2" - ] - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "2:3-2:9", - "expression": { - "QualifiedIdentifier": { - "location": "2:3-2:9", - "attribute": false, - "qualifier": { - "Paren": { - "location": "2:3-2:6", - "expression": { - "QualifiedIdentifier": { - "location": "2:4-2:5", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "2:4-2:5" - ] - } - } - } - } - }, - "id": { - "Id": [ - "x", - "2:8-2:9" - ] - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "3:1-3:4", - "expression": { - "Member": { - "location": "3:1-3:4", - "base": { - "QualifiedIdentifier": { - "location": "3:1-3:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "3:1-3:2" - ] - } - } - }, - "identifier": { - "location": "3:3-3:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "*", - "3:3-3:4" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "4:1-4:9", - "expression": { - "Member": { - "location": "4:1-4:9", - "base": { - "QualifiedIdentifier": { - "location": "4:1-4:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "4:1-4:2" - ] - } - } - }, - "identifier": { - "location": "4:3-4:9", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "public", - "4:3-4:9" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "5:1-5:12", - "expression": { - "Member": { - "location": "5:1-5:12", - "base": { - "QualifiedIdentifier": { - "location": "5:1-5:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "5:1-5:2" - ] - } - } - }, - "identifier": { - "location": "5:3-5:12", - "attribute": false, - "qualifier": { - "ReservedNamespace": { - "Public": "5:3-5:9" - } - }, - "id": { - "Id": [ - "x", - "5:11-5:12" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "6:1-6:9", - "expression": { - "Member": { - "location": "6:1-6:9", - "base": { - "QualifiedIdentifier": { - "location": "6:1-6:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "6:1-6:2" - ] - } - } - }, - "identifier": { - "location": "6:3-6:9", - "attribute": false, - "qualifier": { - "Paren": { - "location": "6:3-6:4", - "expression": { - "QualifiedIdentifier": { - "location": "6:4-6:5", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "6:4-6:5" - ] - } - } - } - } - }, - "id": { - "Id": [ - "x", - "6:8-6:9" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "7:1-7:7", - "expression": { - "Member": { - "location": "7:1-7:7", - "base": { - "QualifiedIdentifier": { - "location": "7:1-7:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "7:1-7:2" - ] - } - } - }, - "identifier": { - "location": "7:3-7:7", - "attribute": false, - "qualifier": { - "QualifiedIdentifier": { - "location": "7:3-7:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "7:3-7:4" - ] - } - } - }, - "id": { - "Id": [ - "x", - "7:6-7:7" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "8:1-8:9", - "expression": { - "Member": { - "location": "8:1-8:9", - "base": { - "QualifiedIdentifier": { - "location": "8:1-8:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "8:1-8:2" - ] - } - } - }, - "identifier": { - "location": "8:3-8:9", - "attribute": false, - "qualifier": { - "QualifiedIdentifier": { - "location": "8:3-8:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "8:3-8:4" - ] - } - } - }, - "id": { - "Brackets": { - "QualifiedIdentifier": { - "location": "8:7-8:8", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "k", - "8:7-8:8" - ] - } - } - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "9:1-9:6", - "expression": { - "Member": { - "location": "9:1-9:5", - "base": { - "QualifiedIdentifier": { - "location": "9:1-9:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "9:1-9:2" - ] - } - } - }, - "identifier": { - "location": "9:3-9:5", - "attribute": true, - "qualifier": null, - "id": { - "Id": [ - "x", - "9:4-9:5" - ] - } - } - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/README.md b/tests/parser/README.md deleted file mode 100644 index b09ad3d..0000000 --- a/tests/parser/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Parsing tests - -To test parsing a program producing output to the command line, run: - -``` -cargo run --bin as3_parser_test -- --source-path tests/parser/Demo.as -``` - -To test parsing a program producing output to two files `.ast.json` and `.diag`, run: - -``` -cargo run --bin as3_parser_test -- --source-path tests/parser/Demo.as --file-log -``` - -For parsing MXML, pass the `--mxml` flag. - -For parsing CSS, pass the `--css` flag. \ No newline at end of file diff --git a/tests/parser/Super.as b/tests/parser/Super.as deleted file mode 100644 index 817fde3..0000000 --- a/tests/parser/Super.as +++ /dev/null @@ -1,12 +0,0 @@ -super() // ERROR -class C2 extends C1 { - function C2() { - if (true) { - super() - } - } - override protected function m(): void { - super.m() - super(this).m() - } -} \ No newline at end of file diff --git a/tests/parser/Super.diag b/tests/parser/Super.diag deleted file mode 100644 index 1eac2e5..0000000 --- a/tests/parser/Super.diag +++ /dev/null @@ -1 +0,0 @@ -C:\Users\mathe\UnsyncDocuments\as3parser\tests\parser\Super.as:1:1: Syntax error #1036: 'super' not allowed here \ No newline at end of file diff --git a/tests/parser/Super.tree b/tests/parser/Super.tree deleted file mode 100644 index 24fa1b4..0000000 --- a/tests/parser/Super.tree +++ /dev/null @@ -1,215 +0,0 @@ -{ - "location": "1:1-12:2", - "packages": [], - "directives": [ - { - "SuperStatement": { - "location": "1:1-1:8", - "arguments": [] - } - }, - { - "ClassDefinition": { - "location": "2:1-12:2", - "asdoc": null, - "attributes": [], - "name": [ - "C2", - "2:7-2:9" - ], - "type_parameters": null, - "extends_clause": { - "QualifiedIdentifier": { - "location": "2:18-2:20", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "C1", - "2:18-2:20" - ] - } - } - }, - "implements_clause": null, - "block": { - "location": "2:21-12:2", - "metadata": null, - "directives": [ - { - "FunctionDefinition": { - "location": "3:5-7:6", - "asdoc": null, - "attributes": [], - "name": { - "Constructor": [ - "C2", - "3:14-3:16" - ] - }, - "common": { - "location": "3:16-7:6", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "3:16-3:18", - "parameters": [], - "result_type": null - }, - "body": { - "Block": { - "location": "3:19-7:6", - "metadata": null, - "directives": [ - { - "IfStatement": { - "location": "4:9-6:10", - "test": { - "BooleanLiteral": { - "location": "4:13-4:17", - "value": true - } - }, - "consequent": { - "Block": { - "location": "4:19-6:10", - "metadata": null, - "directives": [ - { - "SuperStatement": { - "location": "5:13-5:20", - "arguments": [] - } - } - ] - } - }, - "alternative": null - } - } - ] - } - } - } - } - }, - { - "FunctionDefinition": { - "location": "8:5-11:6", - "asdoc": null, - "attributes": [ - { - "Override": "8:5-8:13" - }, - { - "Protected": "8:14-8:23" - } - ], - "name": { - "Identifier": [ - "m", - "8:33-8:34" - ] - }, - "common": { - "location": "8:34-11:6", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "8:34-8:42", - "parameters": [], - "result_type": { - "VoidType": { - "location": "8:38-8:42" - } - } - }, - "body": { - "Block": { - "location": "8:43-11:6", - "metadata": null, - "directives": [ - { - "ExpressionStatement": { - "location": "9:9-9:18", - "expression": { - "Call": { - "location": "9:9-9:18", - "base": { - "Member": { - "location": "9:9-9:16", - "base": { - "Super": { - "location": "9:9-9:14", - "object": null - } - }, - "identifier": { - "location": "9:15-9:16", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "m", - "9:15-9:16" - ] - } - } - } - }, - "arguments": [] - } - } - } - }, - { - "ExpressionStatement": { - "location": "10:9-10:24", - "expression": { - "Call": { - "location": "10:9-10:24", - "base": { - "Member": { - "location": "10:9-10:22", - "base": { - "Super": { - "location": "10:9-10:20", - "object": [ - { - "ThisLiteral": { - "location": "10:15-10:19" - } - } - ] - } - }, - "identifier": { - "location": "10:21-10:22", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "m", - "10:21-10:22" - ] - } - } - } - }, - "arguments": [] - } - } - } - } - ] - } - } - } - } - } - ] - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/css/mediaQuery.css b/tests/parser/css/mediaQuery.css deleted file mode 100644 index 5e64391..0000000 --- a/tests/parser/css/mediaQuery.css +++ /dev/null @@ -1,5 +0,0 @@ -@media (application-dpi: 240) and (os-platform: "Windows"),,,,,,,,, { - .myStyleName1 { - fontSize: 30 - } -} \ No newline at end of file diff --git a/tests/parser/css/mediaQuery.diag b/tests/parser/css/mediaQuery.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/css/mediaQuery.tree b/tests/parser/css/mediaQuery.tree deleted file mode 100644 index 209ae54..0000000 --- a/tests/parser/css/mediaQuery.tree +++ /dev/null @@ -1,92 +0,0 @@ -{ - "location": "1:1-5:2", - "directives": [ - { - "MediaQuery": { - "location": "1:1-5:2", - "conditions": [ - { - "And": { - "location": "1:8-1:59", - "left": { - "ParenProperty": [ - { - "location": "1:9-1:29", - "name": [ - "applicationDpi", - "1:9-1:24" - ], - "value": { - "Number": { - "location": "1:26-1:29", - "value": 240.0, - "unit": null - } - } - }, - "1:8-1:30" - ] - }, - "right": { - "ParenProperty": [ - { - "location": "1:36-1:58", - "name": [ - "osPlatform", - "1:36-1:47" - ], - "value": { - "String": { - "location": "1:49-1:58", - "value": "Windows" - } - } - }, - "1:35-1:59" - ] - } - } - } - ], - "rules": [ - { - "location": "2:5-4:6", - "selectors": [ - { - "Base": { - "location": "2:5-2:18", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Class": [ - "myStyleName1", - "2:5-2:18" - ] - } - ] - } - } - ], - "properties": [ - { - "location": "3:9-3:21", - "name": [ - "fontSize", - "3:9-3:17" - ], - "value": { - "Number": { - "location": "3:19-3:21", - "value": 30.0, - "unit": null - } - } - } - ] - } - ] - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/css/selectors.css b/tests/parser/css/selectors.css deleted file mode 100644 index fb64f56..0000000 --- a/tests/parser/css/selectors.css +++ /dev/null @@ -1,9 +0,0 @@ -.myStyleName1.anotherOne s|VGroup, #id1 { - fontSize: 24 -} - -.myStyleName1[attr^="."] { - color: red -} - -#myId1 #myId2 #myId3 {} \ No newline at end of file diff --git a/tests/parser/css/selectors.diag b/tests/parser/css/selectors.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/css/selectors.tree b/tests/parser/css/selectors.tree deleted file mode 100644 index 143402b..0000000 --- a/tests/parser/css/selectors.tree +++ /dev/null @@ -1,200 +0,0 @@ -{ - "location": "1:1-9:24", - "directives": [ - { - "Rule": { - "location": "1:1-3:2", - "selectors": [ - { - "Combinator": { - "location": "1:1-1:34", - "left": { - "Base": { - "location": "1:1-1:25", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Class": [ - "myStyleName1", - "1:1-1:14" - ] - }, - { - "Class": [ - "anotherOne", - "1:14-1:25" - ] - } - ] - } - }, - "right": { - "Base": { - "location": "1:26-1:34", - "namespace_prefix": [ - "s", - "1:26-1:27" - ], - "element_name": [ - "VGroup", - "1:28-1:34" - ], - "conditions": [] - } - }, - "combinator_type": "Descendant" - } - }, - { - "Base": { - "location": "1:36-1:40", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "id1", - "1:36-1:40" - ] - } - ] - } - } - ], - "properties": [ - { - "location": "2:5-2:17", - "name": [ - "fontSize", - "2:5-2:13" - ], - "value": { - "Number": { - "location": "2:15-2:17", - "value": 24.0, - "unit": null - } - } - } - ] - } - }, - { - "Rule": { - "location": "5:1-7:2", - "selectors": [ - { - "Base": { - "location": "5:1-5:25", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Class": [ - "myStyleName1", - "5:1-5:14" - ] - }, - { - "Attribute": { - "location": "5:14-5:25", - "name": [ - "attr", - "5:15-5:19" - ], - "operator": "BeginsWith", - "value": [ - ".", - "5:21-5:24" - ] - } - } - ] - } - } - ], - "properties": [ - { - "location": "6:5-6:15", - "name": [ - "color", - "6:5-6:10" - ], - "value": { - "Color": { - "location": "6:12-6:15", - "color_int": 16711680 - } - } - } - ] - } - }, - { - "Rule": { - "location": "9:1-9:24", - "selectors": [ - { - "Combinator": { - "location": "9:1-9:21", - "left": { - "Combinator": { - "location": "9:1-9:14", - "left": { - "Base": { - "location": "9:1-9:7", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "myId1", - "9:1-9:7" - ] - } - ] - } - }, - "right": { - "Base": { - "location": "9:8-9:14", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "myId2", - "9:8-9:14" - ] - } - ] - } - }, - "combinator_type": "Descendant" - } - }, - "right": { - "Base": { - "location": "9:15-9:21", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "myId3", - "9:15-9:21" - ] - } - ] - } - }, - "combinator_type": "Descendant" - } - } - ], - "properties": [] - } - } - ] -} \ No newline at end of file