diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 5370f5dd..00000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,66 +0,0 @@ -# Javascript Node CircleCI 2.0 configuration file -# -# Check https://circleci.com/docs/2.0/language-javascript/ for more details -# -version: 2 -jobs: - build: - docker: - # specify the version you desire here - - image: circleci/node:11.6 - - # Specify service dependencies here if necessary - # CircleCI maintains a library of pre-built images - # documented at https://circleci.com/docs/2.0/circleci-images/ - # - image: circleci/mongo:3.4.4 - - working_directory: ~/repo/satriani - - steps: - - checkout: - path: ~/repo - # Download and cache dependencies - - restore_cache: - keys: - - v1-dependencies-{{ checksum "package.json" }} - # fallback to using the latest cache if no exact match is found - - v1-dependencies- - - run: yarn install - - save_cache: - paths: - - node_modules - key: v1-dependencies-{{ checksum "package.json" }} - - run: yarn pegjs - - run: yarn test - deploy: - docker: - # specify the version you desire here - - image: circleci/node:11.6 - - # Specify service dependencies here if necessary - # CircleCI maintains a library of pre-built images - # documented at https://circleci.com/docs/2.0/circleci-images/ - # - image: circleci/mongo:3.4.4 - - working_directory: ~/repo/satriani - - steps: - - checkout: - path: ~/repo - - run: yarn install - - run: yarn browserify - - run: yarn deploy -workflows: - version: 2 - build_and_test: - jobs: - - build - build-and-deploy: - jobs: - - build - - deploy: - requires: - - build - filters: - branches: - only: master diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..41d1009e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,395 @@ +root = true +# Remove the line below if you want to inherit .editorconfig settings from higher directories + +[*.*] +indent_style = tab +indent_size = tab +tab_width = 4 +charset = utf-8 +line_ending = lf +trim_trailing_whitespace = true +insert_final_newline = false + +[*.yml] +indent_style = space +indent_size = 2 + +[*.cs] +# C# files +[*.cs] +# Organize usings +dotnet_separate_import_directive_groups = false + +# Resharper doesn't understand the special value unset +# https://youtrack.jetbrains.com/issue/RIDER-56029 +# file_header_template = unset + +# this. and Me. preferences + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = false:suggestion +dotnet_style_predefined_type_for_member_access = false:suggestion + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_operators = never_if_unnecessary +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion + +# Expression-level preferences +dotnet_style_coalesce_expression = true +dotnet_style_collection_initializer = true +dotnet_style_explicit_tuple_names = true +dotnet_style_null_propagation = true +dotnet_style_object_initializer = true +dotnet_style_operator_placement_when_wrapping = beginning_of_line +dotnet_style_prefer_auto_properties = true +dotnet_style_prefer_compound_assignment = true +dotnet_style_prefer_conditional_expression_over_assignment = true +dotnet_style_prefer_conditional_expression_over_return = true +dotnet_style_prefer_inferred_anonymous_type_member_names = true +dotnet_style_prefer_inferred_tuple_names = true +dotnet_style_prefer_is_null_check_over_reference_equality_method = true +dotnet_style_prefer_simplified_boolean_expressions = true +dotnet_style_prefer_simplified_interpolation = true + +# Field preferences +dotnet_style_readonly_field = true + +# Parameter preferences +dotnet_code_quality_unused_parameters = all + +# Suppression preferences +dotnet_remove_unnecessary_suppression_exclusions = none + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = true:suggestion +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true:suggestion +csharp_style_expression_bodied_indexers = true +csharp_style_expression_bodied_lambdas = true +csharp_style_expression_bodied_local_functions = false +csharp_style_expression_bodied_operators = false +csharp_style_expression_bodied_properties = true:suggestion + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true +csharp_style_pattern_matching_over_is_with_cast_check = true +csharp_style_prefer_not_pattern = true +csharp_style_prefer_pattern_matching = true:suggestion +csharp_style_prefer_switch_expression = true + +# Null-checking preferences +csharp_style_conditional_delegate_call = true + +# Modifier preferences +csharp_prefer_static_local_function = true +csharp_preferred_modifier_order = public, private, protected, internal, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async:suggestion + +# Code-block preferences +csharp_prefer_braces = true +csharp_prefer_simple_using_statement = true + +# Expression-level preferences +csharp_prefer_simple_default_expression = true +csharp_style_deconstructed_variable_declaration = true +csharp_style_implicit_object_creation_when_type_is_apparent = true +csharp_style_inlined_variable_declaration = true +csharp_style_pattern_local_over_anonymous_function = true +csharp_style_prefer_index_operator = true +csharp_style_prefer_range_operator = true +csharp_style_throw_expression = true +csharp_style_unused_value_assignment_preference = discard_variable +csharp_style_unused_value_expression_statement_preference = discard_variable + +# 'using' directive preferences + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_else = false +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = false +csharp_new_line_before_open_brace = none +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case + +# CS8625: Cannot convert null literal to non-nullable reference type. +# ReSharper properties +resharper_allow_comment_after_lbrace = true +resharper_braces_for_for = not_required +resharper_braces_for_foreach = not_required +resharper_braces_for_ifelse = not_required +resharper_braces_for_while = not_required +resharper_braces_redundant = true +resharper_csharp_empty_block_style = together +resharper_csharp_insert_final_newline = true +resharper_csharp_max_line_length = 140 +resharper_csharp_naming_rule.event = AaBb +resharper_csharp_naming_rule.interfaces = I + AaBb +resharper_csharp_naming_rule.method = AaBb +resharper_csharp_naming_rule.private_constants = AA_BB +resharper_csharp_naming_rule.private_static_fields = aaBb +resharper_csharp_naming_rule.private_static_readonly = aaBb +resharper_csharp_naming_rule.property = AaBb +resharper_csharp_naming_rule.types_and_namespaces = AaBb +resharper_css_insert_final_newline = false +resharper_default_internal_modifier = implicit +resharper_html_insert_final_newline = true +resharper_html_linebreaks_inside_tags_for_multiline_elements = false +resharper_html_space_before_self_closing = true +resharper_js_insert_final_newline = false +resharper_keep_existing_declaration_block_arrangement = false +resharper_keep_existing_enum_arrangement = false +resharper_new_line_before_catch = false +resharper_new_line_before_else = false +resharper_new_line_before_finally = false +resharper_outdent_statement_labels = true +resharper_place_attribute_on_same_line = false +resharper_place_simple_embedded_statement_on_same_line = true +resharper_protobuf_insert_final_newline = false +resharper_resx_insert_final_newline = false +resharper_use_heuristics_for_body_style = true +resharper_vb_insert_final_newline = false +resharper_xmldoc_insert_final_newline = false +resharper_xml_insert_final_newline = false + +# Microsoft .NET properties +dotnet_naming_rule.constants_rule.import_to_resharper = as_predefined +dotnet_naming_rule.constants_rule.severity = warning +dotnet_naming_rule.constants_rule.style = all_upper_style +dotnet_naming_rule.constants_rule.symbols = constants_symbols +dotnet_naming_rule.event_rule.import_to_resharper = as_predefined +dotnet_naming_rule.event_rule.severity = warning +dotnet_naming_rule.event_rule.style = pascal_case +dotnet_naming_rule.event_rule.symbols = event_symbols +dotnet_naming_rule.interfaces_rule.import_to_resharper = as_predefined +dotnet_naming_rule.interfaces_rule.severity = warning +dotnet_naming_rule.interfaces_rule.style = begins_with_i +dotnet_naming_rule.interfaces_rule.symbols = interfaces_symbols +dotnet_naming_rule.interface_should_be_begins_with_i.import_to_resharper = True +dotnet_naming_rule.interface_should_be_begins_with_i.resharper_description = interface_should_be_begins_with_i +dotnet_naming_rule.interface_should_be_begins_with_i.resharper_guid = d55ec7d6-eb77-429d-8670-335916a17a57 +dotnet_naming_rule.local_constants_rule.import_to_resharper = as_predefined +dotnet_naming_rule.local_constants_rule.severity = warning +dotnet_naming_rule.local_constants_rule.style = all_upper_style +dotnet_naming_rule.local_constants_rule.symbols = local_constants_symbols +dotnet_naming_rule.method_rule.import_to_resharper = as_predefined +dotnet_naming_rule.method_rule.severity = warning +dotnet_naming_rule.method_rule.style = pascal_case +dotnet_naming_rule.method_rule.symbols = method_symbols +dotnet_naming_rule.non_field_members_should_be_pascal_case.import_to_resharper = True +dotnet_naming_rule.non_field_members_should_be_pascal_case.resharper_description = non_field_members_should_be_pascal_case +dotnet_naming_rule.non_field_members_should_be_pascal_case.resharper_guid = 21d958be-2191-4ce6-81fb-2470149ed4f0 +dotnet_naming_rule.private_constants_rule.import_to_resharper = as_predefined +dotnet_naming_rule.private_constants_rule.severity = warning +dotnet_naming_rule.private_constants_rule.style = all_upper_style +dotnet_naming_rule.private_constants_rule.symbols = private_constants_symbols +dotnet_naming_rule.private_instance_fields_rule.import_to_resharper = as_predefined +dotnet_naming_rule.private_instance_fields_rule.severity = warning +dotnet_naming_rule.private_instance_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_instance_fields_rule.symbols = private_instance_fields_symbols +dotnet_naming_rule.private_static_fields_rule.import_to_resharper = as_predefined +dotnet_naming_rule.private_static_fields_rule.severity = warning +dotnet_naming_rule.private_static_fields_rule.style = lower_camel_case_style +dotnet_naming_rule.private_static_fields_rule.symbols = private_static_fields_symbols +dotnet_naming_rule.private_static_readonly_rule.import_to_resharper = as_predefined +dotnet_naming_rule.private_static_readonly_rule.severity = warning +dotnet_naming_rule.private_static_readonly_rule.style = lower_camel_case_style +dotnet_naming_rule.private_static_readonly_rule.symbols = private_static_readonly_symbols +dotnet_naming_rule.property_rule.import_to_resharper = as_predefined +dotnet_naming_rule.property_rule.severity = warning +dotnet_naming_rule.property_rule.style = pascal_case +dotnet_naming_rule.property_rule.symbols = property_symbols +dotnet_naming_rule.types_and_namespaces_rule.import_to_resharper = as_predefined +dotnet_naming_rule.types_and_namespaces_rule.severity = warning +dotnet_naming_rule.types_and_namespaces_rule.style = pascal_case +dotnet_naming_rule.types_and_namespaces_rule.symbols = types_and_namespaces_symbols +dotnet_naming_rule.types_should_be_pascal_case.import_to_resharper = True +dotnet_naming_rule.types_should_be_pascal_case.resharper_description = types_should_be_pascal_case +dotnet_naming_rule.types_should_be_pascal_case.resharper_guid = 65fe5778-0a22-4ca7-9eae-964e43db0552 +dotnet_naming_style.all_upper_style.capitalization = all_upper +dotnet_naming_style.all_upper_style.word_separator = _ +dotnet_naming_style.lower_camel_case_style.capitalization = camel_case +dotnet_naming_symbols.constants_symbols.applicable_accessibilities = public,internal,protected,protected_internal,private_protected +dotnet_naming_symbols.constants_symbols.applicable_kinds = field +dotnet_naming_symbols.constants_symbols.required_modifiers = const +dotnet_naming_symbols.event_symbols.applicable_accessibilities = * +dotnet_naming_symbols.event_symbols.applicable_kinds = event +dotnet_naming_symbols.interfaces_symbols.applicable_accessibilities = * +dotnet_naming_symbols.interfaces_symbols.applicable_kinds = interface +dotnet_naming_symbols.local_constants_symbols.applicable_accessibilities = * +dotnet_naming_symbols.local_constants_symbols.applicable_kinds = local +dotnet_naming_symbols.local_constants_symbols.required_modifiers = const +dotnet_naming_symbols.method_symbols.applicable_accessibilities = * +dotnet_naming_symbols.method_symbols.applicable_kinds = method +dotnet_naming_symbols.private_constants_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_constants_symbols.applicable_kinds = field +dotnet_naming_symbols.private_constants_symbols.required_modifiers = const +dotnet_naming_symbols.private_instance_fields_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_instance_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_fields_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_static_fields_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_fields_symbols.required_modifiers = static +dotnet_naming_symbols.private_static_readonly_symbols.applicable_accessibilities = private +dotnet_naming_symbols.private_static_readonly_symbols.applicable_kinds = field +dotnet_naming_symbols.private_static_readonly_symbols.required_modifiers = static,readonly +dotnet_naming_symbols.property_symbols.applicable_accessibilities = * +dotnet_naming_symbols.property_symbols.applicable_kinds = property +dotnet_naming_symbols.types_and_namespaces_symbols.applicable_accessibilities = * +dotnet_naming_symbols.types_and_namespaces_symbols.applicable_kinds = namespace,class,struct,enum,delegate +dotnet_style_qualification_for_event = true:none +dotnet_style_qualification_for_field = true:none +dotnet_style_qualification_for_method = true:none +dotnet_style_qualification_for_property = true:none + +# ReSharper inspection severities +resharper_arrange_redundant_parentheses_highlighting = hint +resharper_arrange_this_qualifier_highlighting = hint +resharper_arrange_type_member_modifiers_highlighting = hint +resharper_arrange_type_modifiers_highlighting = hint +resharper_built_in_type_reference_style_for_member_access_highlighting = hint +resharper_built_in_type_reference_style_highlighting = hint +resharper_redundant_base_qualifier_highlighting = warning +resharper_suggest_var_or_type_built_in_types_highlighting = hint +resharper_suggest_var_or_type_elsewhere_highlighting = hint +resharper_suggest_var_or_type_simple_types_highlighting = hint + +[*.{cs,vb}] +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = false:suggestion +dotnet_style_qualification_for_field = false:silent +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent + +[*.cshtml] +always_use_end_of_line_brace_style = true + +# Standard properties +insert_final_newline = false + +# Microsoft .NET properties +csharp_new_line_before_members_in_object_initializers = false +csharp_preferred_modifier_order = public, private, protected, internal, file, new, static, abstract, virtual, sealed, readonly, override, extern, unsafe, volatile, async, required:suggestion +csharp_style_prefer_utf8_string_literals = true:suggestion +csharp_style_var_elsewhere = true:suggestion +csharp_style_var_for_built_in_types = true:suggestion +csharp_style_var_when_type_is_apparent = true:suggestion +dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary:none +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:none +dotnet_style_parentheses_in_relational_binary_operators = never_if_unnecessary:none +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion +dotnet_style_qualification_for_event = false:suggestion +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion + +# ReSharper properties +resharper_always_use_end_of_line_brace_style = true +resharper_object_creation_when_type_not_evident = target_typed +resharper_razor_remove_blank_lines_near_braces = true +resharper_use_indent_from_vs = false + +# ReSharper inspection severities +resharper_arrange_redundant_parentheses_highlighting = hint +resharper_arrange_this_qualifier_highlighting = hint +resharper_arrange_type_member_modifiers_highlighting = hint +resharper_arrange_type_modifiers_highlighting = hint +resharper_built_in_type_reference_style_for_member_access_highlighting = hint +resharper_built_in_type_reference_style_highlighting = hint +resharper_redundant_base_qualifier_highlighting = warning +resharper_suggest_var_or_type_built_in_types_highlighting = hint +resharper_suggest_var_or_type_elsewhere_highlighting = hint +resharper_suggest_var_or_type_simple_types_highlighting = hint + +[*.{appxmanifest,asax,ascx,aspx,axaml,axml,build,c,c++,cc,cginc,compute,config,cp,cpp,cs,cshtml,csproj,css,cu,cuh,cxx,dbml,discomap,dtd,fx,fxh,h,hh,hlsl,hlsli,hlslinc,hpp,htm,html,hxx,inc,inl,ino,ipp,ixx,jsproj,lsproj,master,mpp,mq4,mq5,mqh,njsproj,nuspec,paml,proj,props,razor,resw,resx,skin,StyleCop,targets,tasks,tpp,usf,ush,vb,vbproj,xaml,xamlx,xml,xoml,xsd}] +indent_style = tab +indent_size = tab +tab_width = 4 diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..ff1a3254 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: + - package-ecosystem: bundler + directory: / + schedule: + interval: daily + allow: + - dependency-type: direct diff --git a/.github/workflows/build-and-deploy-website.yml b/.github/workflows/build-and-deploy-website.yml new file mode 100644 index 00000000..4c891866 --- /dev/null +++ b/.github/workflows/build-and-deploy-website.yml @@ -0,0 +1,77 @@ +name: build-and-deploy-codewithrockstar.com +on: + # Run after the engine is rebuilt + workflow_run: + workflows: ['release-rockstar-engine'] + types: [completed] + branches: ['main'] + # Run after any website source files are changed + push: + branches: ["main"] + paths: + - 'codewithrockstar.com/**' + - 'codemirror-lang-rockstar/**' + - '.github/workflows/publish-codewithrockstar.com.yml' + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: +# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write +# Allow one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: true +jobs: + build-main-site: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.3' # Not needed with a .ruby-version file + bundler-cache: true # runs 'bundle install' and caches installed gems automatically + cache-version: 0 # Increment this number if you need to re-download cached gems + working-directory: ./codewithrockstar.com + - name: Setup Pages + id: pages + uses: actions/configure-pages@v4 + - name: fetch rockstar-wasm-binary from cache + uses: actions/cache/restore@v4 + id: restore-cached-wasm-binary + with: + enableCrossOsArchive: true + path: rockstar-wasm-binary + key: rockstar-wasm-binary + - name: Copy WASM binaries into site source + run: cp -r rockstar-wasm-binary/ codewithrockstar.com/wasm/ + - name: build CodeMirror editor bundle with Rockstar language support + run: | + cd cm-lang-rockstar + npm install + npm run test + npm run prepare + - name: Build codewithrockstar.com site + run: | + cd codewithrockstar.com + ls -l /home/runner/work/rockstar2/rockstar2/codewithrockstar.com/examples/01-getting-started/hello-world.rock + bundle exec jekyll build --baseurl "${{ steps.pages.outputs.base_path }}" + env: + JEKYLL_ENV: production + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./codewithrockstar.com/_site + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build-main-site + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/build-macos-binary.yml b/.github/workflows/build-macos-binary.yml new file mode 100644 index 00000000..e5bb1510 --- /dev/null +++ b/.github/workflows/build-macos-binary.yml @@ -0,0 +1,45 @@ +name: build-macos-binary +on: + workflow_dispatch: + workflow_call: +jobs: + build: + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Set up .NET 8 SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.x' + - name: Get Next Version + id: semver + uses: ietf-tools/semver-action@v1 + with: + token: ${{ github.token }} + branch: main + - name: "Display build version" + run: echo "tag ${{ steps.semver.outputs.next }}" +# - name: Patch VERSION constant inside Starship/Rockstar/Program.cs +# run: sed -i "" 's/__VERSION__/${{ steps.semver.outputs.next }}/g' Starship/Rockstar/Program.cs + - name: dotnet publish macos x64 binary + run: dotnet publish Starship/Rockstar -o rockstar-macos-x64-binary -r osx-x64 -c Release + - name: dotnet publish macos ARM64 binary + run: dotnet publish Starship/Rockstar -o rockstar-macos-arm64-binary -r osx-arm64 -c Release + - name: Test ARM64 binary + run: + rockstar-macos-arm64-binary/rockstar --version + - uses: actions/cache/save@v4 + name: Save rockstar-macos-x64-binary to cache + id: save-rockstar-macos-x64-binary-to-cache + with: + enableCrossOsArchive: true + path: rockstar-macos-x64-binary + key: rockstar-macos-x64-binary-${{ github.run_id }} + - uses: actions/cache/save@v4 + name: Save rockstar-macos-arm64-binary to cache + id: save-rockstar-macos-arm64-binary-to-cache + with: + enableCrossOsArchive: true + path: rockstar-macos-arm64-binary + key: rockstar-macos-arm64-binary-${{ github.run_id }} diff --git a/.github/workflows/build-wasm-and-linux-binaries.yml b/.github/workflows/build-wasm-and-linux-binaries.yml new file mode 100644 index 00000000..cfc6bf7d --- /dev/null +++ b/.github/workflows/build-wasm-and-linux-binaries.yml @@ -0,0 +1,79 @@ +name: build-wasm-and-linux-binaries +on: + push: + branches: ["main"] + paths: + - 'Starship/**' + - '.github/workflows/build-wasm-and-linux-binaries.yml' + - '.github/workflows/build-windows-binary.yml' + - '.github/workflows/build-macos-binary.yml' + workflow_dispatch: + workflow_call: +concurrency: + group: "build-wasm-and-linux-binaries" + cancel-in-progress: true +jobs: + build-engine: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up .NET 8 SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.x' + - name: Install .NET WASM workloads + working-directory: ./Starship + run: dotnet workload install wasm-tools + - name: Get Next Version + id: semver + uses: ietf-tools/semver-action@v1 + with: + token: ${{ github.token }} + branch: main + - name: "Display build version" + run: echo "tag ${{ steps.semver.outputs.next }}" + - name: Patch VERSION constant inside Starship/Rockstar.Engine/RockstarEnvironment.cs + run: sed -i 's/VERSION = "[^"]*";/VERSION = "${{ steps.semver.outputs.next }}";/g' Starship/Rockstar.Engine/RockstarEnvironment.cs + - name: Build Rockstar + run: dotnet build Starship -c Release + - name: Test Rockstar + run: dotnet test Starship -c Release + # - name: Update CHANGELOG + # id: changelog + # uses: requarks/changelog-action@v1 + # with: + # token: ${{ github.token }} + # tag: ${{ github.ref_name }} + - name: Commit changes with new version + run: | + git config --global user.name 'workflows/build-wasm-and-linux-binaries.yml' + git config --global user.email 'dylanbeattie@users.noreply.github.com' + git commit -am "[skip actions] set VERSION = ${{ steps.semver.outputs.next }} in RockstarEnvironment.cs" + git push + - name: dotnet publish WASM engine + run: dotnet publish Starship/Rockstar.Wasm -o rockstar-wasm-binary -c Release + - name: dotnet publish Linux binary + run: dotnet publish Starship/Rockstar -o rockstar-linux-x64-binary -c Release + - uses: actions/cache/save@v4 + name: save rockstar-wasm-binary to cache + id: save-rockstar-wasm-binary-to-cache + with: + enableCrossOsArchive: true + path: rockstar-wasm-binary + key: rockstar-wasm-binary-${{ github.run_id }} + - uses: actions/cache/save@v4 + name: save rockstar-linux-x64-binary to cache + id: save-rockstar-linux-x64-binary-to-cache + with: + enableCrossOsArchive: true + path: rockstar-linux-x64-binary + key: rockstar-linux-x64-binary-${{ github.run_id }} + rockstar-macos-binary: + needs: build-engine + uses: ./.github/workflows/build-macos-binary.yml + rockstar-windows-binary: + needs: build-engine + uses: ./.github/workflows/build-windows-binary.yml + diff --git a/.github/workflows/build-windows-binary.yml b/.github/workflows/build-windows-binary.yml new file mode 100644 index 00000000..fc99d303 --- /dev/null +++ b/.github/workflows/build-windows-binary.yml @@ -0,0 +1,36 @@ +name: build-windows-binary +on: + workflow_dispatch: + workflow_call: +jobs: + build: + runs-on: windows-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Get Next Version + id: semver + uses: ietf-tools/semver-action@v1 + with: + token: ${{ github.token }} + branch: main + - name: "Display build version" + run: echo "tag ${{ steps.semver.outputs.next }}" + - name: Set up .NET 8 SDK + uses: actions/setup-dotnet@v4 + with: + dotnet-version: '8.x' +# - name: Patch VERSION constant inside Starship/Rockstar/Program.cs +# run: (Get-content Starship/Rockstar/Program.cs) | Foreach-Object {$_ -replace "__VERSION__", "${{ steps.semver.outputs.next }}"} | Set-Content Starship/Rockstar/Program.cs + - name: dotnet publish Windows x64 binary + run: dotnet publish Starship/Rockstar -o rockstar-windows-x64-binary -c Release + - name: Test Windows x64 binary + run: + rockstar-windows-x64-binary/rockstar.exe --version + - uses: actions/cache/save@v4 + name: save rockstar-windows-x64-binary to cache + id: save-rockstar-windows-x64-binary-to-cache + with: + enableCrossOsArchive: true + path: rockstar-windows-x64-binary + key: rockstar-windows-x64-binary-${{ github.run_id }} diff --git a/.github/workflows/pegjs-and-test.yml b/.github/workflows/pegjs-and-test.yml deleted file mode 100644 index ee2a34b6..00000000 --- a/.github/workflows/pegjs-and-test.yml +++ /dev/null @@ -1,32 +0,0 @@ -# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions - -name: Build parser and run tests - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -jobs: - build: - runs-on: ubuntu-latest - strategy: - matrix: - # node-version: [12.x, 14.x, 16.x] - node-version: [16.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - # cache: 'npm' - - name: Yarn all the things - working-directory: ./satriani - run: | - yarn install - yarn pegjs - yarn test diff --git a/.github/workflows/release-rockstar-engine.yml b/.github/workflows/release-rockstar-engine.yml new file mode 100644 index 00000000..9b1259d0 --- /dev/null +++ b/.github/workflows/release-rockstar-engine.yml @@ -0,0 +1,125 @@ +name: release-rockstar-engine +on: + workflow_run: + workflows: ['build-wasm-and-linux-binaries'] + types: [completed] + branches: ['main'] + # push: + # branches: ["main"] + # paths: + # - 'Starship/**' + # - '.github/workflows/**' + workflow_dispatch: +permissions: + contents: read + pages: write + id-token: write +concurrency: + group: "engine" + cancel-in-progress: true +jobs: + release-rockstar-engine: + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: restore macOS ARM64 binary from cache + uses: actions/cache/restore@v4 + id: restore-cached-macos-arm64-binary + with: + enableCrossOsArchive: true + path: rockstar-macos-arm64-binary + key: rockstar-macos-arm64-binary + - name: restore macOS x64 binary from cache + uses: actions/cache/restore@v4 + id: restore-cached-macos-x64-binary + with: + enableCrossOsArchive: true + path: rockstar-macos-x64-binary + key: rockstar-macos-x64-binary + - name: restore Linux binary from cache + uses: actions/cache/restore@v4 + id: restore-cached-linux-binary + with: + enableCrossOsArchive: true + path: rockstar-linux-x64-binary + key: rockstar-linux-x64-binary + - name: restore Windows binary from cache + uses: actions/cache/restore@v4 + id: restore-cached-windows-x64-binary + with: + enableCrossOsArchive: true + path: rockstar-windows-x64-binary + key: rockstar-windows-x64-binary + - name: restore WASM binary from cache + uses: actions/cache/restore@v4 + id: restore-cached-rockstar-wasm-binary + with: + enableCrossOsArchive: true + path: rockstar-wasm-binary + key: rockstar-wasm-binary + - name: create download assets + run: | + ls -lR + - name: extract version from binary + id: version + run: | + ./rockstar-linux-x64-binary/rockstar --version + echo "version=$(./rockstar-linux-x64-binary/rockstar --version)" >> $GITHUB_OUTPUT + - name: create download assets + run: | + ls -lR + zip rockstar-${{ steps.version.outputs.version }}-windows-x64.zip rockstar-windows-x64-binary/* + tar -czf rockstar-${{ steps.version.outputs.version }}-macos-arm64.tar.gz rockstar-macos-arm64-binary/* + tar -czf rockstar-${{ steps.version.outputs.version }}-macos-x64.tar.gz rockstar-macos-x64-binary/* + tar -czf rockstar-${{ steps.version.outputs.version }}-linux-x64.tar.gz rockstar-linux-x64-binary/* + + - name: create release + uses: actions/create-release@v1 + id: create_release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + draft: false + prerelease: true + release_name: rockstar-${{ steps.version.outputs.version }} + tag_name: ${{ steps.version.outputs.version }} + body: | + Rockstar ${{ steps.version.outputs.version }} + + - name: upload windows artifact + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ github.token }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./rockstar-${{ steps.version.outputs.version }}-windows-x64.zip + asset_name: rockstar-${{ steps.version.outputs.version }}-windows-x64.zip + asset_content_type: application/zip + - name: upload macos-x64 artifact + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ github.token }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./rockstar-${{ steps.version.outputs.version }}-macos-x64.tar.gz + asset_name: rockstar-${{ steps.version.outputs.version }}-macos-x64.tar.gz + asset_content_type: application/gzip + - name: upload linux-x64 artifact + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ github.token }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./rockstar-${{ steps.version.outputs.version }}-linux-x64.tar.gz + asset_name: rockstar-${{ steps.version.outputs.version }}-linux-x64.tar.gz + asset_content_type: application/gzip + - name: upload macos-arm64 artifact + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ github.token }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: ./rockstar-${{ steps.version.outputs.version }}-macos-arm64.tar.gz + asset_name: rockstar-${{ steps.version.outputs.version }}-macos-arm64.tar.gz + asset_content_type: application/gzip \ No newline at end of file diff --git a/.gitignore b/.gitignore index b631be61..12ef7889 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,13 @@ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore +.DS_Store + +.NCrunch_*/ # User-specific files +*.rsuser *.suo *.user *.userosscache @@ -12,6 +16,9 @@ # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs +# Mono auto generated files +mono_crash.* + # Build results [Dd]ebug/ [Dd]ebugPublic/ @@ -19,10 +26,14 @@ [Rr]eleases/ x64/ x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ bld/ [Bb]in/ [Oo]bj/ [Ll]og/ +[Ll]ogs/ # Visual Studio 2015/2017 cache/options directory .vs/ @@ -36,9 +47,10 @@ Generated\ Files/ [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* -# NUNIT +# NUnit *.VisualState.xml TestResult.xml +nunit-*.xml # Build Results of an ATL Project [Dd]ebugPS/ @@ -52,7 +64,9 @@ BenchmarkDotNet.Artifacts/ project.lock.json project.fragment.lock.json artifacts/ -**/Properties/launchSettings.json + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt # StyleCop StyleCopReport.xml @@ -60,7 +74,7 @@ StyleCopReport.xml # Files built by Visual Studio *_i.c *_p.c -*_i.h +*_h.h *.ilk *.meta *.obj @@ -77,7 +91,9 @@ StyleCopReport.xml *.tlh *.tmp *.tmp_proj +*_wpftmp.csproj *.log +*.tlog *.vspscc *.vssscc .builds @@ -119,9 +135,6 @@ _ReSharper*/ *.[Rr]e[Ss]harper *.DotSettings.user -# JustCode is a .NET coding add-in -.JustCode - # TeamCity is a build add-in _TeamCity* @@ -132,6 +145,11 @@ _TeamCity* .axoCover/* !.axoCover/settings.json +# Coverlet is a free, cross platform Code Coverage Tool +coverage*.json +coverage*.xml +coverage*.info + # Visual Studio code coverage results *.coverage *.coveragexml @@ -179,6 +197,8 @@ PublishScripts/ # NuGet Packages *.nupkg +# NuGet Symbol Packages +*.snupkg # The packages folder can be ignored because of Package Restore **/[Pp]ackages/* # except build/, which is used as an MSBuild target. @@ -203,12 +223,14 @@ BundleArtifacts/ Package.StoreAssociation.xml _pkginfo.txt *.appx +*.appxbundle +*.appxupload # Visual Studio cache files # files ending in .cache can be ignored *.[Cc]ache # but keep track of directories ending in .cache -!*.[Cc]ache/ +!?*.[Cc]ache/ # Others ClientBin/ @@ -221,7 +243,7 @@ ClientBin/ *.publishsettings orleans.codegen.cs -# Including strong name files can present a security risk +# Including strong name files can present a security risk # (https://github.com/github/gitignore/pull/2483#issue-259490424) #*.snk @@ -252,6 +274,9 @@ ServiceFabricBackup/ *.bim.layout *.bim_*.settings *.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl # Microsoft Fakes FakesAssemblies/ @@ -272,6 +297,17 @@ node_modules/ # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) *.vbw +# Visual Studio 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts @@ -287,12 +323,8 @@ paket-files/ # FAKE - F# Make .fake/ -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush -.cr/ +# CodeRush personal settings +.cr/personal # Python Tools for Visual Studio (PTVS) __pycache__/ @@ -317,7 +349,7 @@ __pycache__/ # OpenCover UI analysis results OpenCover/ -# Azure Stream Analytics local run output +# Azure Stream Analytics local run output ASALocalRun/ # MSBuild Binary and Structured Log @@ -326,7 +358,51 @@ ASALocalRun/ # NVidia Nsight GPU debugger configuration file *.nvuser -# MFractors (Xamarin productivity tool) working folder +# MFractors (Xamarin productivity tool) working folder .mfractor/ -._* \ No newline at end of file +# Local History for Visual Studio +.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ + +# Fody - auto-generated XML schema +FodyWeavers.xsd + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml + +.obsidian/ + +docs.codewithrockstar.com/examples/ + +docs.codewithrockstar.com/wasm/ +codewithrockstar.com/wasm/ diff --git a/.obsidian/app.json b/.obsidian/app.json index 9e26dfee..7b0deb76 100644 --- a/.obsidian/app.json +++ b/.obsidian/app.json @@ -1 +1,4 @@ -{} \ No newline at end of file +{ + "alwaysUpdateLinks": true, + "useMarkdownLinks": true +} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index c8c365d8..9e26dfee 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -1,3 +1 @@ -{ - "accentColor": "" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index fcbb245c..b86fdc02 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -1,21 +1,21 @@ { "main": { - "id": "0ccb4f25a00d801e", + "id": "daec523910f75076", "type": "split", "children": [ { - "id": "b446a303a064afa7", + "id": "8defaba5a2a5b669", "type": "tabs", "children": [ { - "id": "2628a240602d50df", + "id": "005da2a05b4fbf96", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "rockstar-2.md", + "file": "codewithrockstar.com/docs/02-types-and-values.md", "mode": "source", - "source": false + "source": true } } } @@ -25,15 +25,15 @@ "direction": "vertical" }, "left": { - "id": "f690222422428971", + "id": "f268972251ee4b9e", "type": "split", "children": [ { - "id": "0d09fb9a066e2e1b", + "id": "c8b707c9a0236288", "type": "tabs", "children": [ { - "id": "d63958cb6777fd12", + "id": "efc3d0b2f9e18fac", "type": "leaf", "state": { "type": "file-explorer", @@ -43,7 +43,7 @@ } }, { - "id": "edfaaca8776d8fca", + "id": "aa578ce3457c6a61", "type": "leaf", "state": { "type": "search", @@ -58,7 +58,7 @@ } }, { - "id": "42df576a0b3c3273", + "id": "420b590388970899", "type": "leaf", "state": { "type": "bookmarks", @@ -72,20 +72,20 @@ "width": 300 }, "right": { - "id": "d9851b42a3243e36", + "id": "9bff8b7aebd31401", "type": "split", "children": [ { - "id": "8bcd16d8bb3a85be", + "id": "15ba46ad93ef4686", "type": "tabs", "children": [ { - "id": "831e26003812585b", + "id": "9084c39fe202a25b", "type": "leaf", "state": { "type": "backlink", "state": { - "file": "rockstar-2.md", + "file": "codewithrockstar.com/docs/02-types-and-values.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -97,19 +97,19 @@ } }, { - "id": "947fceb37d61fad5", + "id": "142902d61e1e985a", "type": "leaf", "state": { "type": "outgoing-link", "state": { - "file": "rockstar-2.md", + "file": "codewithrockstar.com/docs/02-types-and-values.md", "linksCollapsed": false, "unlinkedCollapsed": true } } }, { - "id": "d9df56ca7c325aba", + "id": "1ec3213e536aed8b", "type": "leaf", "state": { "type": "tag", @@ -120,12 +120,12 @@ } }, { - "id": "6aacb9c7afabddf1", + "id": "8c35ebdb306d03ea", "type": "leaf", "state": { "type": "outline", "state": { - "file": "rockstar-2.md" + "file": "codewithrockstar.com/docs/02-types-and-values.md" } } } @@ -146,6 +146,53 @@ "command-palette:Open command palette": false } }, - "active": "2628a240602d50df", - "lastOpenFiles": [] + "active": "efc3d0b2f9e18fac", + "lastOpenFiles": [ + "Starship/Rockstar.Engine/obj/Debug/net8.0/gw1hreob.tjq~", + "Starship/Rockstar.Test/obj/Debug/net8.0/nCrunchTemp_5bc5a958-8d02-4d54-9d5b-e9660cd70e4c.csproj.AssemblyReference.cache", + "Starship/Rockstar/obj/Debug/net8.0/nCrunchTemp_3c9525d6-b14c-40f6-be90-33819e483ee6.csproj.AssemblyReference.cache", + "Starship/Rockstar.Profiler/obj/Debug/net8.0/nCrunchTemp_d678d38e-5041-4245-a2a7-eb0a118524cb.csproj.AssemblyReference.cache", + "Starship/Rockstar.Engine/obj/Debug/net8.0/nCrunchTemp_8ca7425a-775c-4bc8-a44e-7cb90069cdab.csproj.AssemblyReference.cache", + "Starship/Rockstar.Test/obj/Debug/net8.0/nCrunchTemp_5bc5a958-8d02-4d54-9d5b-e9660cd70e4c.GlobalUsings.g.cs", + "Starship/Rockstar/obj/Debug/net8.0/nCrunchTemp_3c9525d6-b14c-40f6-be90-33819e483ee6.GlobalUsings.g.cs", + "Starship/Rockstar.Profiler/obj/Debug/net8.0/nCrunchTemp_d678d38e-5041-4245-a2a7-eb0a118524cb.GlobalUsings.g.cs", + "Starship/Rockstar.Engine/obj/Debug/net8.0/nCrunchTemp_8ca7425a-775c-4bc8-a44e-7cb90069cdab.GlobalUsings.g.cs", + "Starship/Rockstar.Test/obj/Debug/net8.0/nCrunchTemp_5bc5a958-8d02-4d54-9d5b-e9660cd70e4c.assets.cache", + "Starship/Rockstar/obj/Debug/net8.0/nCrunchTemp_3c9525d6-b14c-40f6-be90-33819e483ee6.assets.cache", + "codewithrockstar.com/docs/01-getting-started.md", + "codewithrockstar.com/docs/02-types-and-values.md", + "codewithrockstar.com/docs/09-arrays.md", + "codewithrockstar.com/docs/06-expressions.md", + "codewithrockstar.com/docs/99-rockstar-acid-test.md", + "codewithrockstar.com/docs/07-flow-control.md", + "codewithrockstar.com/links.md", + "codewithrockstar.com/news.md", + "codewithrockstar.com/_site/assets/img/teemill/480p/red-on-press.webp", + "codewithrockstar.com/_site/assets/img/teemill/480p/red-basic-fit.webp", + "codewithrockstar.com/_site/assets/img/teemill/480p/red-logo.webp", + "codewithrockstar.com/_site/assets/img/teemill/480p/blue-tailored.webp", + "codewithrockstar.com/_site/assets/img/teemill/480p/blue-logo.webp", + "codewithrockstar.com/_site/assets/img/teemill/480p/blue-kids-fit.webp", + "codewithrockstar.com/assets/img/teemill/480p/red-on-press.webp", + "codewithrockstar.com/assets/img/teemill/480p/red-logo.webp", + "codewithrockstar.com/assets/img/teemill/480p/red-basic-fit.webp", + "codewithrockstar.com/assets/img/teemill/480p/blue-tailored.webp", + "cm-lang-rockstar/node_modules/style-mod/src/README.md", + "cm-lang-rockstar/node_modules/@bcoe/v8-coverage/dist/lib/README.md", + "cm-lang-rockstar/node_modules/@bcoe/v8-coverage/dist/lib/LICENSE.md", + "cm-lang-rockstar/node_modules/@bcoe/v8-coverage/dist/lib/CHANGELOG.md", + "codewithrockstar.com/merch.md", + "cm-lang-rockstar/node_modules/@sinonjs/commons/lib/prototypes/README.md", + "cm-lang-rockstar/node_modules/@rollup/plugin-node-resolve/README.md", + "cm-lang-rockstar/node_modules/@codemirror/lint/README.md", + "cm-lang-rockstar/node_modules/deepmerge/changelog.md", + "cm-lang-rockstar/node_modules/terser/node_modules/source-map-support/README.md", + "cm-lang-rockstar/node_modules/tslib/README.md", + "cm-lang-rockstar/node_modules/imurmurhash/README.md", + "codewithrockstar.com/tutorial.md", + "codewithrockstar.com/docs/04-arithmetic.md", + "codewithrockstar.com/code-of-conduct.md", + "cm-lang-rockstar/README.md", + "codewithrockstar.com/index.md" + ] } \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 31cf7e59..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,60 +0,0 @@ -# How to contribute to Rockstar - -> "Rockstar was never intended to be more than a joke - a parody spec that I threw together in a couple -of hours in a bar one evening. The amount of interest and enthusiasm that this project has generated -has been astonishing, and wonderful, but – perhaps inevitably – there are a LOT of things in the initial Rockstar spec that -made perfect sense when it was a joke spec but have proved incredibly difficult to actually implement. -> -> "Over the last six months, the entire Rockstar project has been through a sort of massive red/green/refactor cycle - -> creating tests to validate core language features, building implementations that pass those tests, and then looking -> at ways to clean up and harmonise those implementations. -> -> Thanks to the ongoing efforts of Rockstar developers around the world, we've ironed out most of the contradictions, -> resolved dozens of ambiguities and gotchas in the original spec, and come up with something that's probably good -> enough to call a 'release candidate'. But I have a funny feeling like this is still only the beginning. :) -> ->         - @dylanbeattie, January 2019 - -## Ways you can contribute - -First, make sure you've read the [code of conduct](CODE_OF_CONDUCT.md). TL;DR: be excellent to each other. Be calm, be -kind, help make Rockstar a community where new faces feel welcome and old hands feel appreciated. - -* Report a bug. If you've found something that doesn't work, let us know. -* Suggest a new feature. -* Write a great Rockstar program we can add to our examples -* Create your own implementation of Rockstar - -### Reporting bugs - -If you've found a bug in the specification or in the Satriani implementation, let us know about it. -* Search the [Issues](https://github.com/rockstarlang/rockstar/issues) to check we're not already tracking it. -* If you can't find an open issue that describes your problem, [open a new one](https://github.com/RockstarLang/rockstar/issues/new). - * Include a **title and clear description** - * Describe: - * What you did (ideally with a code sample) - * What you expected to happen - * What actually happened, including any error messages or program output. - -### Fixing Bugs - -If you've fixed an open bug - awesome! You're a true Rockstar developer. -* Open a new GitHub pull request with your patch. Pull requests should include: - * The fix itself - * One or more test cases in the form of `.rock` programs demonstrating the bug, that - should FAIL on an unpatched implementation and PASS with your patch in place. - * Updates to any associated documentation or examples - -### Contributing Features - -If you've got a great idea for a Rockstar language feature, start by checking -[issues](https://github.com/rockstarlang/rockstar/issues) to check we're not already tracking it, or that your idea -hasn't already been rejected. - -If not, start by [opening an issue](https://github.com/RockstarLang/rockstar/issues/new) that describes your idea. If -you want to chat to some of the core team about it first, hop onto the -[Rockstar Developers channel on Discord](https://discordapp.com/invite/xsQK7UU) and tell us what you're thinking. - -Remember, a good Rockstar feature is one that extends the capabilities of the language *and* allows developers the -kind of lyrical creativity that makes for great Rockstar programs. - \ No newline at end of file diff --git a/LICENSE b/LICENSE index a2401e43..0ad25db4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,661 @@ -MIT License - -Copyright (c) 2018 Dylan Beattie - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/README.md b/README.md index ffdfe766..ad0a7508 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,67 @@ +# rockstar2 +It's time. Rockstar 2: "The Difficult Second Version" + +The Build Process + +Building codewithrockstar.com works like this: + +build-and-test-rockstar-engine + +- runs on Linux +- Builds the parser and interpreter +- Runs the test suite +- Uploads artifacts for: + - linux native binary + - WASM interpreter for the website + +IF THAT WORKS: + +build-windows-binary +* builds the Rockstar windows binary + +build-macos-binary +* builds the macOS binary + + build-and-deploy-website + * Downloads the linux binary Rockstar WASM artifact from step 1 + * Downloads the windows and macOS binaries from steps 2 and 3 + * Builds the Jekyll site +### Debug/Dev Mode Setup + +In dev mode, I use symbolic directory links between the various parts of the project. Rebuilding the .NET solution will rebuild the WASM interpreter, which Jekyll can see as `/wasm/**`, and trigger a site rebuild, and all the Rockstar code examples are part of both the `Rockstar.Test` .NET test suite project and the `codewithrockstar.com` site: + +``` +> cd codewithrockstar.com +> mklink /d wasm ..\Starship\Rockstar.Wasm\bin\Debug\net8.0-browser +> mklink /d examples ..\Starship\Rockstar.Test\programs\examples ``` - _____ _____ ______ ___ ______________ ____ ______ -| _ \ / _ \ / ___/ /| / / / ______ _// || _ \ -| |_) )/ / \ \/ / / |/ / ( (___ | | / || |_) ) -| /( ( ) ( | \ \____ \ | |/ /| || / -| |\ \ \ \_/ /\ \___ | |\ \ _____) )| // / | || |\ \ -|__| \ \ \_____/ \_____||__| \__\\______/ |//__/ |__||__| \__\ - \ | ------------------------------------------------------ - \ | h t t p s : // c o d e w i t h r o c k s t a r . c o m - \| ------------------------------------------------------ -``` - -Rockstar is a dynamically typed computer programming language, designed for creating programs that are also song lyrics. Rockstar is heavily influenced by the lyrical conventions of 1980s hard rock and power ballads. - -### But why? - -Mainly because if we make Rockstar a real (and completely pointless) programming language, then recruiters and hiring managers won't be able to talk about 'rockstar developers' any more. - -Also 'cos it's kinda fun and any language based on the idea of compiling Meatloaf lyrics has to be worth a look, right? - -Plus we can make stickers. Who doesn't want a sticker on their laptop saying 'CERTIFIED ROCKSTAR DEVELOPER'? - -## What's here? - -* The [Rockstar language specification](spec.md) -* How to [contribute to Rockstar](CONTRIBUTING.md) -* Some [examples of Rockstar programs](examples/README.md) - -## Implementations - -The official reference implementation is [Satriani](https://github.com/RockstarLang/rockstar/tree/master/satriani) - written in JavaScript, it runs in browsers and supports NodeJS for server-side and larger projects. - -[Rocky](https://github.com/gaborsch/rocky) is a fully spec-compliant Rockstar implementation written in Java, and is currently the only Rockstar implementation that includes support for the DEC64 numeric type that was described in the original language specification. - -Other implementations: - -* [rockstar-js](https://github.com/wolfgang42/rockstar-js) - Rockstar-to-JavaScript transpiler -* [rockstar-lexer](https://github.com/aitorres/rockstar-lexer) - Rockstar lexer written in Haskell with Alex -* [rockstar-java](https://github.com/nbrevu/rockstar-java) - Rockstar interpreter in Java -* [rockstar-ml](https://github.com/lkwq007/rockstar-ml) - Rockstar interpreter in OCaml -* [rockstar-py](https://github.com/yanorestes/rockstar-py) - Rockstar-to-Python transpiler -* [kaiser-ruby](https://github.com/marcinruszkiewicz/kaiser-ruby) - Rockstar to Ruby transpiler -* [sublime-rockstar-syntax](https://github.com/paxromana96/sublime-rockstar-syntax) - Syntax highlighter for Sublime Text 3 -* [language-rockstar](https://github.com/thestd/language-rockstar) - Syntax highlighter for Atom -* [maiden](https://github.com/palfrey/maiden) - Rockstar interpreter in Rust ([online version using WebAssembly](https://palfrey.github.io/maiden/)) -* [thrash](https://github.com/young-steveo/thrash) - Rockstar implementation in Go -* [rockstar-webpiler](https://github.com/cwfitzgerald/rockstar-webpiler) - Online Rockstar Parser and Transpiler. [rockstar.connorwfitzgerald.com](https://rockstar.connorwfitzgerald.com) -* [wasm-rocks](https://github.com/boyanio/wasm-rocks) - Online Rockstar-to-WebAssembly compiler -* [vim-rockstar](https://github.com/sirosen/vim-rockstar) - Syntax highlighting for vim -* [vscode-rockstar-language](https://github.com/ra100/vscode-rockstar-language) - Syntax highlighting for VSCode -* [chirp](https://github.com/Suloch/chirp) - Rockstar interpreter in C using flex and yacc -* [rockstar-feat-csharp](https://github.com/theolivenbaum/rockstar-feat-csharp) - Embed Rockstar on your C# code using source-code generators -* [sellout](https://github.com/davidadsit/sellout) - Rockstar to C# (dotnet core) transpiler -* [native-rockstar](https://github.com/gillesdami/native-rockstar) - Rockstar to C++ transpiler in javascript. -* [rokkstar](https://github.com/ascheja/rokkstar) - Rockstar parser and interpreter written in Kotlin. - -## Social Spaces -* [Rockstar on Rosetta Code](http://www.rosettacode.org/wiki/Category:Rockstar) -* [/r/RockstarDevs](https://www.reddit.com/r/RockstarDevs/) - Subreddit -* [Rockstar Developers](https://discordapp.com/invite/xsQK7UU) - Discord Group - -## Media Coverage -* [Meet the boffin behind a computer programming language based on power ballads](https://www.loudersound.com/features/meet-the-boffin-behind-a-computer-programming-language-based-on-power-ballads) in Classic Rock magazine. -* [Rockstar article on BoingBoing](https://boingboing.net/2018/07/25/hello-cleveland-world.html) -* [Rockstar on HackerNews](https://news.ycombinator.com/item?id=17585589) -* [Rockstar on /r/ProgrammerHumor](https://www.reddit.com/r/ProgrammerHumor/comments/934uvw/why_yes_i_am_a_certified_rockstar_developer/) -* [Rockstar on dice.com](https://insights.dice.com/2018/07/27/rockstar-programming-language-developers/) -* [The Rockstar Programming Language | Mitigated Frenzy](https://bparsia.wordpress.com/2018/09/11/the-rockstar-programming-language/) - see also their solution to the [Rainfall problem](https://bparsia.wordpress.com/2018/09/12/rockstar-rainfall-problem/#comment-1624) -* [Rockstar reference on Coding Blocks Podcast](https://www.codingblocks.net/podcast/lightning-talks/) -* [Rockstar on .NET Rocks! Podcast](https://www.dotnetrocks.com/?show=1636) - -## See Also - -* [Enterprise™](https://github.com/joaomilho/Enterprise) - "The world is not made only of Rockstar programmers. For all the non hipsters out there, now there's Enterprise™" + +``` +codewithrockstar.com + /wasm --> [ /Starship/Rockstar.Wasm/bin/Debug/net8.0-browser ] + /examples --> [ /Starship/Rockstar.Test/programs/examples ] + /index.html + /example.md + /js + /rockstar-editor.js (from codemirror) +``` + + +Function currying + +``` +output + function call: product + function call: sum + number: 2 + number: 4 + function call: sum + number: 5 + number: 6 +``` + +So: `product(sum(2,4,sum(5,6))` needs to be translated to `product(sum(2,4),sum(5,6))` based on the arity of the functions + +So `sum(2,4,sum(5,6))` needs to evaluate `sum(2,4)` and leave the expression `sum(5,6)` in the bucket + +Then `product(sum(2,4)` \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Expressions/Binary.cs b/Starship/Rockstar.Engine/Expressions/Binary.cs new file mode 100644 index 00000000..fa246ad4 --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/Binary.cs @@ -0,0 +1,77 @@ +using System.Text; +using Rockstar.Engine.Values; + +namespace Rockstar.Engine.Expressions; + +public class Binary : Expression { + + public bool ShouldUpdatePronounSubject(out Variable subject) { + subject = new SimpleVariable("__NOPE__"); + if (!op.IsComparison() || lhs is not Lookup { Variable: not Pronoun } lookup) return false; + subject = lookup.Variable; + return true; + + } + + private readonly Operator op; + private readonly Expression lhs; + private readonly IEnumerable rhs; + + public Binary(Operator op, Expression lhs, Expression rhs) { + this.op = op; + this.lhs = lhs; + this.rhs = new List { rhs }; + } + + public Binary(Operator op, Expression lhs, IEnumerable rhs) { + this.op = op; + this.lhs = lhs; + this.rhs = rhs; + } + + private Booleän Equäls(Value lhs, Value rhs) => (lhs, rhs) switch { + (Booleän b, _) => b.Equäls(rhs), + (_, Booleän b) => b.Equäls(lhs), + (Strïng s, _) => s.Equäls(rhs), + (_, Strïng s) => s.Equäls(lhs), + _ => lhs.Equäls(rhs) + }; + + public Value Resolve(Func eval) { + var v = eval(lhs); + return op switch { + Operator.Times => v * rhs.Select(eval), + Operator.Divide => v / rhs.Select(eval), + Operator.Plus => v + rhs.Select(eval), + Operator.Minus => v - rhs.Select(eval), + + Operator.Equals => Equäls(v, eval(rhs.Single())), + Operator.NotEquals => Equäls(v, eval(rhs.Single())).Nope, + Operator.IdenticalTo => v.IdenticalTo(eval(rhs.Single())), + Operator.NotIdenticalTo => v.IdenticalTo(eval(rhs.Single())).Nope, + + Operator.LessThanEqual => v.LessThanEqual(eval(rhs.Single())), + Operator.MoreThanEqual => v.MoreThanEqual(eval(rhs.Single())), + Operator.LessThan => v.LessThan(eval(rhs.Single())), + Operator.MoreThan => v.MoreThan(eval(rhs.Single())), + + Operator.Nor => new Booleän(!(v.Truthy || eval(rhs.Single()).Truthy)), + Operator.And => v.Truthy ? eval(rhs.Single()) : v, + Operator.Or => v.Truthy ? v : eval(rhs.Single()), + _ => throw new($"I don't know how to apply {op} to {v.GetType().Name}") + }; + } + + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).AppendLine($"{op}:".ToLowerInvariant()); + lhs.Print(sb, prefix + INDENT); + foreach (var expr in rhs) expr.Print(sb, prefix + INDENT); + return sb; + } + + public override string ToString() { + var sb = new StringBuilder(); + this.Print(sb, String.Empty); + return sb.ToString(); + } +} diff --git a/Starship/Rockstar.Engine/Expressions/CommonVariable.cs b/Starship/Rockstar.Engine/Expressions/CommonVariable.cs new file mode 100644 index 00000000..56ac5ed6 --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/CommonVariable.cs @@ -0,0 +1,16 @@ +using System.Text.RegularExpressions; + +namespace Rockstar.Engine.Expressions; + +public class CommonVariable(string name) : Variable(name) { + public override string Key => NormalizedName.ToLowerInvariant(); +} + +public class ProperVariable : Variable { + private static readonly Regex validator = new("^(\\p{Lu}\\w*\\W+)+(\\p{Lu}\\w*)$"); + public ProperVariable(string name) : base(name) { + if (!validator.IsMatch(name)) throw new ArgumentException($"'{name}' is not a valid proper variable name"); + } + + public override string Key => NormalizedName.ToUpperInvariant(); +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Expressions/Dequeue.cs b/Starship/Rockstar.Engine/Expressions/Dequeue.cs new file mode 100644 index 00000000..054dbd53 --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/Dequeue.cs @@ -0,0 +1,15 @@ +using System.Text; + +namespace Rockstar.Engine.Expressions; + +public abstract class VariableExpression(Variable variable) : Expression { + public Variable Variable => variable; + public override StringBuilder Print(StringBuilder sb, string prefix) { + base.Print(sb, prefix); + return variable.Print(sb, prefix + INDENT); + } +} + +public class Dequeue(Variable variable) : VariableExpression(variable); + +public class Pop(Variable variable) : VariableExpression(variable); \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Expressions/Enlist.cs b/Starship/Rockstar.Engine/Expressions/Enlist.cs new file mode 100644 index 00000000..94ed45a2 --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/Enlist.cs @@ -0,0 +1,23 @@ +using System.Text; +using Rockstar.Engine.Statements; + +namespace Rockstar.Engine.Expressions; + +public class Enlist(Variable variable) : Statement { + + public Variable Variable { get; } = variable; + public List Expressions = []; + + public override StringBuilder Print(StringBuilder sb, string prefix) { + base.Print(sb, prefix); + Variable.Print(sb, prefix + INDENT); + foreach (var expr in Expressions) expr.Print(sb, prefix + INDENT); + return sb; + } + + public Enlist(Variable variable, Expression expr) : this(variable) + => Expressions.Add(expr); + + public Enlist(Variable variable, IEnumerable list) : this(variable) + => Expressions.AddRange(list); +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Expressions/Expression.cs b/Starship/Rockstar.Engine/Expressions/Expression.cs new file mode 100644 index 00000000..e236e556 --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/Expression.cs @@ -0,0 +1,13 @@ +using System.Text; + +namespace Rockstar.Engine.Expressions; + +public abstract class Expression { + public const string INDENT = " "; + + public virtual StringBuilder Print(StringBuilder sb, string prefix) + => sb.Append(prefix).Append(this.GetType().Name.ToLowerInvariant()).AppendLine(":"); + + public IEnumerable Concat(IEnumerable tail) + => new List { this }.Concat(tail); +} diff --git a/Starship/Rockstar.Engine/Expressions/Lookup.cs b/Starship/Rockstar.Engine/Expressions/Lookup.cs new file mode 100644 index 00000000..0401970a --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/Lookup.cs @@ -0,0 +1,11 @@ +using System.Text; + +namespace Rockstar.Engine.Expressions; + +public class Lookup(Variable variable) : Expression { + public Variable Variable => variable; + public override StringBuilder Print(StringBuilder sb, string prefix) + => sb.Append(prefix).Append("lookup: ").Append(variable.Name).AppendLine(variable.PrintIndexes()); + + public override string ToString() => $"lookup: {Variable}"; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Expressions/Operator.cs b/Starship/Rockstar.Engine/Expressions/Operator.cs new file mode 100644 index 00000000..37cafab4 --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/Operator.cs @@ -0,0 +1,23 @@ +namespace Rockstar.Engine.Expressions; + +public enum Operator { + Plus, + Minus, + Times, + Divide, + And, + Or, + Equals, + IdenticalTo, + NotEquals, + NotIdenticalTo, + Not, + Nor, + LessThanEqual, + MoreThanEqual, + LessThan, + MoreThan, + Split, + Join, + Cast +} diff --git a/Starship/Rockstar.Engine/Expressions/OperatorExpressions.cs b/Starship/Rockstar.Engine/Expressions/OperatorExpressions.cs new file mode 100644 index 00000000..785a9673 --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/OperatorExpressions.cs @@ -0,0 +1,15 @@ +namespace Rockstar.Engine.Expressions; + +public static class OperatorExpressions { + public static bool IsComparison(this Operator op) => op switch { + Operator.Equals => true, + Operator.NotEquals => true, + Operator.IdenticalTo => true, + Operator.NotIdenticalTo => true, + Operator.LessThanEqual => true, + Operator.MoreThanEqual => true, + Operator.LessThan => true, + Operator.MoreThan => true, + _ => false + }; +} diff --git a/Starship/Rockstar.Engine/Expressions/Pronoun.cs b/Starship/Rockstar.Engine/Expressions/Pronoun.cs new file mode 100644 index 00000000..28e10d3a --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/Pronoun.cs @@ -0,0 +1,12 @@ +using System.Text; + +namespace Rockstar.Engine.Expressions; + +public class Pronoun(string name) : Variable(name) { + public Pronoun() : this(String.Empty) { } + public override string Key => throw new InvalidOperationException("Pronouns don't have keys."); + public override StringBuilder Print(StringBuilder sb, string prefix) + => sb.Append(prefix).AppendLine(this.ToString()); + + public override string ToString() => $"pronoun: {Name}"; +} diff --git a/Starship/Rockstar.Engine/Expressions/ProperVariable.cs b/Starship/Rockstar.Engine/Expressions/ProperVariable.cs new file mode 100644 index 00000000..9857e8db --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/ProperVariable.cs @@ -0,0 +1,5 @@ +//namespace Rockstar.Engine.Expressions; + +//public class ProperVariable(string name) : Variable(name) { +// public override string Key => NormalizedName.ToUpperInvariant(); +//} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Expressions/SimpleVariable.cs b/Starship/Rockstar.Engine/Expressions/SimpleVariable.cs new file mode 100644 index 00000000..e01659e0 --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/SimpleVariable.cs @@ -0,0 +1,11 @@ +using System.Text.RegularExpressions; + +namespace Rockstar.Engine.Expressions; + +public class SimpleVariable : Variable { + private static readonly Regex illegalCharacters = new("\\W+", RegexOptions.Compiled); + public SimpleVariable(string name) :base(name) { + if (illegalCharacters.IsMatch(name)) throw new ArgumentException($"{name} is not a valid simple variable name"); + } + public override string Key => Name.ToLowerInvariant(); +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Expressions/Unary.cs b/Starship/Rockstar.Engine/Expressions/Unary.cs new file mode 100644 index 00000000..4a14beda --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/Unary.cs @@ -0,0 +1,33 @@ +using System.Text; +using Rockstar.Engine.Values; + +namespace Rockstar.Engine.Expressions; + +public class Unary(Operator op, Expression expr) + : Expression { + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).Append("unary: ").AppendLine(op.ToString().ToLowerInvariant()); + return expr.Print(sb, prefix + INDENT); + } + + public Value Resolve(Func eval) { + var v = eval(expr); + return op switch { + Operator.Not => Booleän.Not(v), + _ => throw new InvalidOperationException($"Can't apply {op} as a unary operator.") + + + //Operator.Equals => v.Equäls(eval(rhs.Single())), + //Operator.NotEquals => v.NotEquäls(eval(rhs.Single())), + //Operator.LessThanEqual => v.LessThanEqual(eval(rhs.Single())), + //Operator.MoreThanEqual => v.MoreThanEqual(eval(rhs.Single())), + //Operator.LessThan => v.LessThan(eval(rhs.Single())), + //Operator.MoreThan => v.MoreThan(eval(rhs.Single())), + + //Operator.Nor => new Booleän(v.Falsey && eval(rhs.Single()).Falsey), + //Operator.And => v.Truthy ? eval(rhs.Single()) : v, + //Operator.Or => v.Truthy ? v : eval(rhs.Single()), + }; + } + +} diff --git a/Starship/Rockstar.Engine/Expressions/Variable.cs b/Starship/Rockstar.Engine/Expressions/Variable.cs new file mode 100644 index 00000000..99eb774e --- /dev/null +++ b/Starship/Rockstar.Engine/Expressions/Variable.cs @@ -0,0 +1,55 @@ +using System.Text; +using System.Text.RegularExpressions; + +namespace Rockstar.Engine.Expressions; + +public abstract class Variable(string name) : Expression { + public string Name => name; + + public override string ToString() + => $"{GetType().Name.ToLowerInvariant()}: {Key}" + + (Indexes.Any() ? "[" + String.Join("][", Indexes.Select(i => i.ToString())) + "]" : ""); + + + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).AppendLine($"variable: {name}"); + switch (Indexes.Count) { + case 0: return sb; + case 1: + sb.Append(INDENT).AppendLine("index:"); + break; + default: + sb.Append(INDENT).AppendLine("indexes:"); + break; + } + foreach (var index in Indexes) index.Print(sb, prefix + INDENT); + return sb; + } + + private static readonly Regex whitespace = new("\\s+", RegexOptions.Compiled); + + protected string NormalizedName + => String.Join("_", whitespace.Split(Name)); + + public abstract string Key { get; } + + public IEnumerable Concat(IEnumerable tail) + => new List { this }.Concat(tail); + + public List Indexes { get; } = []; + + public Variable AtIndex(Expression index) { + Indexes.Add(index); + return this; + } + + public Variable AtIndex(IEnumerable indexes) { + Indexes.AddRange(indexes); + return this; + } + + public string PrintIndexes() { + if (Indexes.Any()) return ("[" + String.Join(",", Indexes.Select(i => i.ToString()).ToArray()) + "]"); + return String.Empty; + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/IRockstarIO.cs b/Starship/Rockstar.Engine/IRockstarIO.cs new file mode 100644 index 00000000..e7564646 --- /dev/null +++ b/Starship/Rockstar.Engine/IRockstarIO.cs @@ -0,0 +1,6 @@ +namespace Rockstar.Engine; + +public interface IRockstarIO { + public string? Read(); + public void Write(string s); +} diff --git a/Starship/Rockstar.Engine/PegasusParserExtensions.cs b/Starship/Rockstar.Engine/PegasusParserExtensions.cs new file mode 100644 index 00000000..346e3cc6 --- /dev/null +++ b/Starship/Rockstar.Engine/PegasusParserExtensions.cs @@ -0,0 +1,12 @@ +using System.Text.RegularExpressions; +using Pegasus.Common; + +namespace Rockstar.Engine; + +public static class PegasusParserExtensions { + public static Source Source(this Cursor cursor, string lexeme = "") + => new(cursor.Line, cursor.Column, lexeme); + + public static string Error(this Cursor cursor, string unexpected) + => "Unexpected '" + Regex.Escape(unexpected) + "' at line " + cursor.Line + ", col " + (cursor.Column - 1); +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Result.cs b/Starship/Rockstar.Engine/Result.cs new file mode 100644 index 00000000..d61ed6f1 --- /dev/null +++ b/Starship/Rockstar.Engine/Result.cs @@ -0,0 +1,22 @@ +using Rockstar.Engine.Values; + +namespace Rockstar.Engine; + +public class Result(Value value, WhatToDo whatToDo = WhatToDo.Next) { + public override string ToString() => WhatToDo switch { + WhatToDo.Return => $"value: {value}", + WhatToDo.Skip => "skip", + WhatToDo.Break => "break", + WhatToDo.Next => "next", + WhatToDo.Exit => "exit", + _ => "unknown" + }; + + public Value Value => value; + public WhatToDo WhatToDo => whatToDo; + public static Result Skip => new(new Nüll(), WhatToDo.Skip); + public static Result Break => new(new Nüll(), WhatToDo.Break); + public static Result Unknown = new(new Nüll(), WhatToDo.Unknown); + public static Result Return(Value value) => new(value, WhatToDo.Return); + public static Result Exit => new(new Nüll(), WhatToDo.Exit); +} diff --git a/Starship/Rockstar.Engine/Rockstar.Engine.csproj b/Starship/Rockstar.Engine/Rockstar.Engine.csproj new file mode 100644 index 00000000..5a8b845b --- /dev/null +++ b/Starship/Rockstar.Engine/Rockstar.Engine.csproj @@ -0,0 +1,18 @@ + + + net8.0 + enable + enable + + + + + + + + + + PreserveNewest + + + diff --git a/Starship/Rockstar.Engine/Rockstar.Engine.v3.ncrunchproject b/Starship/Rockstar.Engine/Rockstar.Engine.v3.ncrunchproject new file mode 100644 index 00000000..8a3f8899 --- /dev/null +++ b/Starship/Rockstar.Engine/Rockstar.Engine.v3.ncrunchproject @@ -0,0 +1,7 @@ + + + + rockstar.peg + + + \ No newline at end of file diff --git a/Starship/Rockstar.Engine/RockstarEnvironment.cs b/Starship/Rockstar.Engine/RockstarEnvironment.cs new file mode 100644 index 00000000..92ec4918 --- /dev/null +++ b/Starship/Rockstar.Engine/RockstarEnvironment.cs @@ -0,0 +1,393 @@ +using System.Text.RegularExpressions; +using Rockstar.Engine.Expressions; +using Rockstar.Engine.Statements; +using Rockstar.Engine.Values; + +namespace Rockstar.Engine; + +public enum Scope { + Global, + Local +} + +public class RockstarEnvironment(IRockstarIO io) { + // This line will be automatically overwritten by GitHub Actions + // when the engine is built. + public const string VERSION = "v0.11.4"; + + private const string ARGUMENTS_ARRAY_NAME = "__arguments__"; + public static CommonVariable Arguments = new CommonVariable(ARGUMENTS_ARRAY_NAME); + + public RockstarEnvironment(IRockstarIO io, IEnumerable args) : this(io) { + var argsArray = new Arräy(args.Select(arg => new Strïng(arg))); + this.SetVariable(new CommonVariable(ARGUMENTS_ARRAY_NAME), argsArray); + } + + public RockstarEnvironment(IRockstarIO io, RockstarEnvironment parent) : this(io) { + Parent = parent; + } + + public RockstarEnvironment? Parent { get; init; } + + public RockstarEnvironment Extend() => new(IO, this); + + protected IRockstarIO IO = io; + + public string? ReadInput() => IO.Read(); + public void Write(string output) => IO.Write(output); + + private Variable? pronounSubject; + internal void UpdatePronounSubject(Variable variable) => pronounSubject = variable; + + private Variable QualifyPronoun(Variable variable) => + variable is Pronoun pronoun + ? pronounSubject ?? throw new($"You must assign a variable before using a pronoun ('{pronoun.Name}')") + : variable; + + private readonly Dictionary variables = new(); + + private bool Owns(Variable variable) + => variables.ContainsKey(variable.Key); + + private RockstarEnvironment FindStore(Variable variable) { + if (Parent == default) return this; + if (this.Owns(variable)) return this; + return Parent.FindStore(variable); + } + + public RockstarEnvironment GetStore(Variable variable, Scope scope) => scope switch { + Scope.Global => FindStore(variable), + _ => this + }; + + + public Result SetVariable(Variable variable, Value value, Scope scope = Scope.Global) { + var target = QualifyPronoun(variable); + var store = GetStore(target, scope); + if (variable is not Pronoun) UpdatePronounSubject(target); + var indexes = variable.Indexes.Select(Eval).ToList(); + var stored = store.SetLocal(target, indexes, value); + return new(stored); + } + + private Value SetLocal(Variable variable, Value value) => SetLocal(variable, [], value); + + private Value SetLocal(Variable variable, IList indexes, Value value) { + if (!indexes.Any()) return variables[variable.Key] = value; + variables.TryAdd(variable.Key, new Arräy()); + return variables[variable.Key] switch { + Arräy array => array.Set(indexes, value), + Strïng s => s.SetCharAt(indexes, value), + Numbër n => n.SetBit(indexes, value), + _ => throw new($"{variable.Name} is not an indexed variable") + }; + } + + public Result Execute(Quine quine) { + Write(quine.Source); + return Result.Exit; + } + + public Result Execute(Program program) + => program.Blocks.Aggregate(Result.Unknown, (_, block) => Execute(block)); + + internal Result Execute(Block block) { + var result = Result.Unknown; + foreach (var statement in block.Statements) { + result = Execute(statement); + switch (result.WhatToDo) { + case WhatToDo.Exit: return result; + case WhatToDo.Skip: return result; + case WhatToDo.Break: return result; + case WhatToDo.Return: return result; + } + } + + return result; + } + + private Result Execute(Statement statement) => statement switch { + Output output => Output(output), + Declare declare => Declare(declare), + Assign assign => Assign(assign), + Loop loop => Loop(loop), + Conditional cond => Conditional(cond), + FunctionCall call => Call(call), + Return r => Return(r), + Exit => Result.Exit, + Continue => Result.Skip, + Break => Result.Break, + Enlist e => Enlist(e), + Mutation m => Mutation(m), + Rounding r => Rounding(r), + Listen listen => Listen(listen), + Crement crement => Crement(crement), + Debug debug => Debug(debug), + ExpressionStatement e => ExpressionStatement(e), + Ninja n => Ninja(n), + ForInLoop loop => ForInLoop(loop), + ForOfLoop loop => ForOfLoop(loop), + _ => throw new($"I don't know how to execute {statement.GetType().Name} statements") + }; + + private Result Ninja(Ninja ninja) { + var value = Strïng.Empty; + value.Append(Eval(ninja.Numbër)); + return Assign(ninja.Variable, value); + } + + private Result Output(Output output) { + var value = Eval(output.Expression); + Write(Regex.Unescape(value.ToStrïng().Value)); + Write(output.Suffix); + return new(value); + } + + private Result Debug(Debug debug) { + var value = Eval(debug.Expression); + Write("DEBUG: "); + if (debug.Expression is Lookup lookup) Write(lookup.Variable.Name + ": "); + Write(value.GetType().Name.ToLowerInvariant() + " " + value switch { + Strïng s => "\"" + s.Value + "\"", + _ => value.ToStrïng().Value + }); + Write(Environment.NewLine); + return new(value); + } + + private Result Crement(Crement crement) { + var variable = QualifyPronoun(crement.Variable); + return Eval(variable) switch { + Nüll n => Assign(variable, new Numbër(crement.Delta)), + Booleän b => crement.Delta % 2 == 0 ? new(b) : Assign(variable, b.Negate), + IHaveANumber n => Assign(variable, new Numbër(n.Value + crement.Delta)), + Strïng s => s.IsEmpty ? Assign(variable, new Numbër(crement.Delta)) : throw new($"Cannot increment '{variable.Name}' - strings can only be incremented if they're empty"), + { } v => throw new($"Cannot increment '{variable.Name}' because it has type {v.GetType().Name}") + }; + } + + private Result Listen(Listen l) { + var input = ReadInput(); + Value value = input == default ? new Nüll() : new Strïng(input); + if (l.Variable != default) SetVariable(l.Variable, value); + return new(value); + } + + private Result Mutation(Mutation m) { + var source = Eval(m.Expression); + var modifier = m.Modifier == null ? null : Eval(m.Modifier); + var result = m.Operator switch { + Operator.Join => Join(source, modifier), + Operator.Split => Split(source, modifier), + Operator.Cast => Cast(source, modifier), + _ => throw new($"Unsupported mutation operator {m.Operator}") + }; + if (m.Target == default) return new(result); + SetLocal(QualifyPronoun(m.Target), [], result); + if (m.Target is not Pronoun) UpdatePronounSubject(m.Target); + return new(result); + } + + private static Value Cast(Value source, Value? modifier) { + return source switch { + Strïng s => modifier switch { + IHaveANumber numberBase => Numbër.Parse(s, numberBase), + _ => s.ToCharCodes() + }, + IHaveANumber n => new Strïng(Char.ConvertFromUtf32((int) n.Value)), + _ => throw new($"Can't cast expression of type {source.GetType().Name}") + }; + } + + private static Arräy Split(Value source, Value? modifier) { + if (source is not Strïng s) throw new("Only strings can be split."); + var splitter = modifier?.ToStrïng() ?? Strïng.Empty; + return s.Split(splitter); + } + + private static Value Join(Value source, Value? joiner) { + if (source is not Arräy array) throw new("Can't join something which is not an array."); + return array.Join(joiner); + } + + private Result Rounding(Rounding r) { + var value = Lookup(r.Variable); + if (value is not Numbër n) throw new($"Can't apply rounding to variable {r.Variable.Name} of type {value.GetType().Name}"); + var rounded = new Numbër(r.Round switch { + Round.Down => Math.Floor(n.Value), + Round.Up => Math.Ceiling(n.Value), + Round.Nearest => Math.Round(n.Value), + _ => throw new ArgumentOutOfRangeException() + }); + SetVariable(r.Variable, rounded); + return new(rounded); + } + + private Result Pop(Pop pop) { + var variable = QualifyPronoun(pop.Variable); + var value = LookupValue(variable.Key); + return value switch { + Arräy array => new(array.Pop()), + Strïng strïng => new(strïng.Pop()), + _ => new(Nüll.Instance) + }; + } + + private Result Dequeue(Dequeue dequeue) { + var variable = QualifyPronoun(dequeue.Variable); + var value = LookupValue(variable.Key); + return value switch { + Arräy array => new(array.Dequeue()), + Strïng strïng => new(strïng.Dequeue()), + _ => new(Nüll.Instance) + }; + } + + private Result Enlist(Enlist e) { + var variable = QualifyPronoun(e.Variable); + var value = LookupValue(variable.Key); + if (value is Strïng s) { + foreach (var expr in e.Expressions) s.Append(Eval(expr)); + return new(s); + } + + if (value is not Arräy array) { + array = value == Mysterious.Instance ? new Arräy() : new(value); + SetLocal(variable, array); + } + foreach (var expr in e.Expressions) array.Push(Eval(expr)); + return new(array); + } + + private Result ExpressionStatement(ExpressionStatement e) => new(Eval(e.Expression)); + + private Result Return(ExpressionStatement r) { + var value = Eval(r.Expression); + return Result.Return(value); + } + + private Result Call(FunctionCall call) + => Call(call, []); + + private Result Call(FunctionCall call, Queue bucket) { + var value = Lookup(call.Function); + if (value is not Closure closure) throw new($"'{call.Function.Name}' is not a function"); + var names = closure.Functiön.Args.ToList(); + + List values = []; + + foreach (var arg in call.Args.Take(names.Count)) { + value = arg is FunctionCall nestedCall ? Call(nestedCall, bucket).Value : Eval(arg); + values.Add(value); + } + if (call.Args.Count + bucket.Count < names.Count) { + throw new($"Not enough arguments supplied to function {call.Function.Name} - expected {names.Count} ({String.Join(", ", names.Select(v => v.Name))}), got {call.Args.Count}"); + } + while (values.Count < names.Count) values.Add(Eval(bucket.Dequeue())); + foreach (var expression in call.Args.Skip(names.Count)) bucket.Enqueue(expression); + Dictionary args = new(); + for (var i = 0; i < names.Count; i++) args[names[i]] = values[i].Clone(); + return new(closure.Apply(args).Value); + } + + private Expression UpdatePronounSubjectBasedOnSubjectOfCondition(Expression condition) { + if (condition is Binary binary && binary.ShouldUpdatePronounSubject(out var subject)) UpdatePronounSubject(subject); + return condition; + } + + private Result Conditional(Conditional cond) { + UpdatePronounSubjectBasedOnSubjectOfCondition(cond.Condition); + if (Eval(cond.Condition).Truthy) return Execute(cond.Consequent); + return cond.Alternate != default ? Execute(cond.Alternate) : Result.Unknown; + } + + + private Result ForInLoop(ForInLoop loop) { + var result = Result.Unknown; + var array = Eval(loop.Expression) as Arräy; + if (array is null) throw new Exception("Can't use for-in loops on something that is not an array"); + var scope = this.Extend(); + for (var i = 0; i < array.List.Count; i++) { + scope.SetVariable(loop.Value, array.List[i], Scope.Local); + if (loop.Index != null) scope.SetVariable(loop.Index, new Numbër(i), Scope.Local); + result = scope.Execute(loop.Body); + switch (result.WhatToDo) { + case WhatToDo.Skip: continue; + case WhatToDo.Break: return new(result.Value); + case WhatToDo.Return: return result; + } + } + return result; + } + + private Result ForOfLoop(ForOfLoop loop) { + var result = Result.Unknown; + var array = Eval(loop.Expression) as Arräy; + if (array is null) throw new Exception("Can't use for-of loops on something that is not an array"); + var scope = this.Extend(); + foreach (var pair in array.Hash) { + scope.SetVariable(loop.Value, pair.Value, Scope.Local); + if (loop.Index != null) scope.SetVariable(loop.Index, pair.Key, Scope.Local); + result = scope.Execute(loop.Body); + switch (result.WhatToDo) { + case WhatToDo.Skip: continue; + case WhatToDo.Break: return new(result.Value); + case WhatToDo.Return: return result; + } + } + return result; + } + + private Result Loop(Loop loop) { + var result = Result.Unknown; + while (Eval(loop.Condition).Truthy == loop.CompareTo) { + UpdatePronounSubjectBasedOnSubjectOfCondition(loop.Condition); + result = Execute(loop.Body); + switch (result.WhatToDo) { + case WhatToDo.Skip: continue; + case WhatToDo.Break: return new(result.Value); + case WhatToDo.Return: return result; + } + } + return result; + } + + public Value Eval(Expression expression) => expression switch { + Value value => value, + Binary binary => binary.Resolve(Eval), + Lookup lookup => Lookup(lookup.Variable), + Variable v => Lookup(v), + Unary unary => unary.Resolve(Eval), + FunctionCall call => Call(call).Value, + Pop pop => Pop(pop).Value, + Dequeue delist => Dequeue(delist).Value, + _ => throw new NotImplementedException($"Eval not implemented for {expression.GetType()}") + }; + + private Result Declare(Declare declare) { + var value = declare.Expression == default ? Mysterious.Instance : Eval(declare.Expression); + return Assign(declare.Variable, value, Scope.Local); + } + + public Result Assign(Assign assign) + => Assign(assign.Variable, Eval(assign.Expression), Scope.Global); + + public Result Assign(Variable variable, Value value, Scope scope = Scope.Global) => value switch { + Functiön function => SetVariable(variable, MakeLambda(function, variable), Scope.Local), + _ => SetVariable(variable, value, scope) + }; + + private Value MakeLambda(Functiön functiön, Variable variable) + => this.Parent == default ? new(functiön, variable, this.Extend()) : new Closure(functiön, variable, this); + + private Value LookupValue(string key) { + if (variables.TryGetValue(key, out var value)) return value; + return Parent != default ? Parent.LookupValue(key) : Mysterious.Instance; + } + + public Value Lookup(Variable variable) { + var key = variable is Pronoun pronoun ? QualifyPronoun(pronoun).Key : variable.Key; + var value = LookupValue(key); + return value.AtIndex(variable.Indexes.Select(Eval)); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Source.cs b/Starship/Rockstar.Engine/Source.cs new file mode 100644 index 00000000..83932a91 --- /dev/null +++ b/Starship/Rockstar.Engine/Source.cs @@ -0,0 +1,9 @@ +namespace Rockstar.Engine; + +public class Source(int line, int column, string lexeme = "") { + + public string Location => + $"(line {line}, column {column - lexeme.Length} [{lexeme}])"; + + public static readonly Source None = new(0, 0, ""); +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Assign.cs b/Starship/Rockstar.Engine/Statements/Assign.cs new file mode 100644 index 00000000..d329499d --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Assign.cs @@ -0,0 +1,13 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Assign(Variable variable, Expression expression) : ExpressionStatement(expression) { + public Variable Variable => variable; + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.AppendLine(prefix + "assign:"); + variable.Print(sb, prefix + INDENT); + return Expression.Print(sb, prefix + INDENT); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Block.cs b/Starship/Rockstar.Engine/Statements/Block.cs new file mode 100644 index 00000000..dd5241d2 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Block.cs @@ -0,0 +1,25 @@ +using System.Text; + +namespace Rockstar.Engine.Statements; + +public class Block { + public List Statements { get; } = []; + public Block() { } + public Block Concat(Block tail) { + this.Statements.AddRange(tail.Statements); + return this; + } + public Block(params Statement[] statements) => this.Statements.AddRange(statements); + + public override string ToString() => Print(new()).ToString(); + + public StringBuilder PrintTopLevel(StringBuilder sb) { + foreach (var stmt in Statements) stmt.Print(sb, ""); + return sb; + } + + public StringBuilder Print(StringBuilder sb, string prefix = "") { + foreach (var stmt in Statements) stmt.Print(sb, prefix + "│ "); + return sb.Append(prefix).AppendLine("└──────────"); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Break.cs b/Starship/Rockstar.Engine/Statements/Break.cs new file mode 100644 index 00000000..d9700428 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Break.cs @@ -0,0 +1,5 @@ +namespace Rockstar.Engine.Statements; + +public class Break(string wildcard = "") : WildcardStatement(wildcard) { + protected override string What => "break"; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Conditional.cs b/Starship/Rockstar.Engine/Statements/Conditional.cs new file mode 100644 index 00000000..bf07abad --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Conditional.cs @@ -0,0 +1,21 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Conditional(Expression condition, Block consequent, Block? alternate = null) : Statement { + + public Expression Condition => condition; + public Block Consequent => consequent; + public Block? Alternate => alternate; + + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).AppendLine("if:"); + condition.Print(sb, prefix); + sb.Append(prefix).AppendLine("then:"); + consequent.Print(sb, prefix); + if (alternate == default) return sb; + sb.Append(prefix).AppendLine("else:"); + return alternate.Print(sb, prefix); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Continue.cs b/Starship/Rockstar.Engine/Statements/Continue.cs new file mode 100644 index 00000000..f1d75d73 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Continue.cs @@ -0,0 +1,5 @@ +namespace Rockstar.Engine.Statements; + +public class Continue(string wildcard = "") : WildcardStatement(wildcard) { + protected override string What => "continue"; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Crement.cs b/Starship/Rockstar.Engine/Statements/Crement.cs new file mode 100644 index 00000000..0ea6273c --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Crement.cs @@ -0,0 +1,14 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Crement(Variable v, int delta) : Statement { + public Variable Variable => v; + private string Direction => (delta > 0 ? "increment" : "decrement"); + public int Delta => delta; + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).AppendLine($"{Direction} x {delta}"); + return v.Print(sb, prefix + INDENT); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Debug.cs b/Starship/Rockstar.Engine/Statements/Debug.cs new file mode 100644 index 00000000..6362342f --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Debug.cs @@ -0,0 +1,17 @@ +using System.Text; +using Rockstar.Engine.Expressions; +using Rockstar.Engine.Values; + +namespace Rockstar.Engine.Statements; + +public class Debug(Expression expr) : ExpressionStatement(expr) { + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).Append("debug: "); + return Expression switch { + Lookup lookup => sb.AppendLine(lookup.ToString()), + Value value => sb.AppendLine(value.ToString()), + _ => Expression.Print(sb.AppendLine(), prefix + INDENT) + }; + } + +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Declare.cs b/Starship/Rockstar.Engine/Statements/Declare.cs new file mode 100644 index 00000000..94ff4692 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Declare.cs @@ -0,0 +1,15 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Declare(Variable variable, Expression? expression = null) : Statement { + public Variable Variable => variable; + public Expression? Expression => expression; + + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.AppendLine(prefix + "declare:"); + variable.Print(sb, prefix + INDENT); + return (expression == default ? sb : expression.Print(sb, prefix + INDENT)); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Decrement.cs b/Starship/Rockstar.Engine/Statements/Decrement.cs new file mode 100644 index 00000000..d5469b05 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Decrement.cs @@ -0,0 +1,13 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Decrement(Variable v, int multiple) : Statement { + public Variable Variable => v; + public int Multiple => multiple; + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).AppendLine($"decrement x {multiple}"); + return v.Print(sb, prefix + INDENT); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Exit.cs b/Starship/Rockstar.Engine/Statements/Exit.cs new file mode 100644 index 00000000..5a5cbc15 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Exit.cs @@ -0,0 +1,5 @@ +namespace Rockstar.Engine.Statements; + +public class Exit : Statement { + +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/ExpressionStatement.cs b/Starship/Rockstar.Engine/Statements/ExpressionStatement.cs new file mode 100644 index 00000000..e22d487c --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/ExpressionStatement.cs @@ -0,0 +1,11 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class ExpressionStatement(Expression expr) : Statement { + public Expression Expression = expr; + + public override StringBuilder Print(StringBuilder sb, string prefix) + => Expression.Print(sb.Append(prefix).AppendLine("expression_statement:"), prefix + INDENT); +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/ForInLoop.cs b/Starship/Rockstar.Engine/Statements/ForInLoop.cs new file mode 100644 index 00000000..8cb3397a --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/ForInLoop.cs @@ -0,0 +1,26 @@ +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public abstract class ForLoop : Statement { + private readonly Variable value; + private readonly Variable index; + public Variable Value => PrependArticle && value is SimpleVariable ? new CommonVariable($"the {value.Name}") : value; + public Variable Index => PrependArticle && index is SimpleVariable ? new CommonVariable($"the {index.Name}") : index; + public Expression Expression { get; } + public Block Body { get; } + public bool PrependArticle { get; } + + protected ForLoop(Variable value, Variable index, Expression expression, Block body, bool prependArticle) { + this.value = value; + this.index = index; + Expression = expression; + Body = body; + PrependArticle = prependArticle; + } +} + +public class ForInLoop : ForLoop { + public ForInLoop(Variable value, Variable index, Expression expression, Block body, bool prependArticle) + : base(value, index, expression, body, prependArticle) { } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/ForOfLoop.cs b/Starship/Rockstar.Engine/Statements/ForOfLoop.cs new file mode 100644 index 00000000..def1894a --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/ForOfLoop.cs @@ -0,0 +1,8 @@ +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class ForOfLoop : ForLoop { + public ForOfLoop(Variable value, Variable index, Expression expression, Block body, bool prependArticle) + : base(value, index, expression, body, prependArticle) { } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Listen.cs b/Starship/Rockstar.Engine/Statements/Listen.cs new file mode 100644 index 00000000..e970816a --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Listen.cs @@ -0,0 +1,15 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Listen : Statement { + public Variable? Variable { get; init; } = default; + public Listen() {} + public Listen(Variable variable) => this.Variable = variable; + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).Append("listen:"); + if (Variable != default) sb.Append(" => ").Append(Variable.Name); + return sb.AppendLine(); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Loop.cs b/Starship/Rockstar.Engine/Statements/Loop.cs new file mode 100644 index 00000000..d4acbc3a --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Loop.cs @@ -0,0 +1,18 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public abstract class Loop(Expression condition, Block body, bool compareTo) + : Statement { + public bool CompareTo => compareTo; + public Expression Condition => condition; + public Block Body => body; + protected abstract string LoopType { get; } + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).AppendLine($"{LoopType}:"); + condition.Print(sb, prefix + INDENT); + sb.Append(prefix).Append(INDENT).AppendLine("loop:"); + return body.Print(sb, prefix + INDENT); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Mutation.cs b/Starship/Rockstar.Engine/Statements/Mutation.cs new file mode 100644 index 00000000..ff2278bb --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Mutation.cs @@ -0,0 +1,24 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Mutation(Operator op, Expression expr, Variable? target = default, Expression? modifier = default) + : Statement { + public Operator Operator => op; + public Expression Expression => expr; + public Variable? Target => target; + public Expression? Modifier => modifier; + + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).Append(op.ToString().ToLowerInvariant()).AppendLine(":"); + Expression.Print(sb, prefix + INDENT); + if (Target != default) { + sb.Append(prefix + INDENT).AppendLine("target:"); + Target.Print(sb, prefix + INDENT + INDENT); + } + if (Modifier == default) return sb; + sb.Append(prefix + INDENT).AppendLine("using:"); + return Modifier.Print(sb, prefix + INDENT + INDENT); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Ninja.cs b/Starship/Rockstar.Engine/Statements/Ninja.cs new file mode 100644 index 00000000..c59e5987 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Ninja.cs @@ -0,0 +1,15 @@ +using System.Text; +using Rockstar.Engine.Expressions; +using Rockstar.Engine.Values; + +namespace Rockstar.Engine.Statements; + +public class Ninja(Variable variable, Numbër numbër) : Statement { + public Variable Variable => variable; + public Numbër Numbër => numbër; + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.AppendLine(prefix + "ninja:"); + variable.Print(sb, prefix + INDENT); + return Numbër.Print(sb, prefix + INDENT); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Output.cs b/Starship/Rockstar.Engine/Statements/Output.cs new file mode 100644 index 00000000..a4fe99aa --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Output.cs @@ -0,0 +1,13 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Output(Expression expr, string suffix = "") : ExpressionStatement(expr) { + public string Suffix { get; } = suffix; + + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).AppendLine("output: "); + return Expression.Print(sb, prefix + INDENT); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Program.cs b/Starship/Rockstar.Engine/Statements/Program.cs new file mode 100644 index 00000000..01e58324 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Program.cs @@ -0,0 +1,21 @@ +using System.Text; + +namespace Rockstar.Engine.Statements; + +public class Program { + public List Blocks { get; } = []; + public Program() { } + public Program(params Block[] blocks) => this.Blocks.AddRange(blocks); + public Program Concat(Program tail) { + this.Blocks.AddRange(tail.Blocks); + return this; + } + + public StringBuilder Print(StringBuilder sb) { + foreach (var block in Blocks) block.PrintTopLevel(sb); + return sb; + } + + public override string ToString() + => Print(new()).ToString(); +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Quine.cs b/Starship/Rockstar.Engine/Statements/Quine.cs new file mode 100644 index 00000000..d6005df5 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Quine.cs @@ -0,0 +1,5 @@ +namespace Rockstar.Engine.Statements; + +public class Quine(string source) : Program { + public string Source => source; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Return.cs b/Starship/Rockstar.Engine/Statements/Return.cs new file mode 100644 index 00000000..feb01a04 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Return.cs @@ -0,0 +1,11 @@ +using System.Text; +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Return(Expression expr) : ExpressionStatement(expr) { + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).AppendLine("return:"); + return Expression.Print(sb, prefix + INDENT); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Round.cs b/Starship/Rockstar.Engine/Statements/Round.cs new file mode 100644 index 00000000..4b3f2327 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Round.cs @@ -0,0 +1,7 @@ +namespace Rockstar.Engine.Statements; + +public enum Round { + Up, + Down, + Nearest +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Rounding.cs b/Starship/Rockstar.Engine/Statements/Rounding.cs new file mode 100644 index 00000000..099a3b84 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Rounding.cs @@ -0,0 +1,8 @@ +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Rounding(Variable variable, Round round) : Statement { + public Variable Variable => variable; + public Round Round => round; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/Statement.cs b/Starship/Rockstar.Engine/Statements/Statement.cs new file mode 100644 index 00000000..d9b4a865 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/Statement.cs @@ -0,0 +1,7 @@ +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class Statement : Expression { + +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/UntilLoop.cs b/Starship/Rockstar.Engine/Statements/UntilLoop.cs new file mode 100644 index 00000000..cbeea7fb --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/UntilLoop.cs @@ -0,0 +1,8 @@ +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class UntilLoop(Expression condition, Block body) + : Loop(condition, body, false) { + protected override string LoopType => "until"; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/WhileLoop.cs b/Starship/Rockstar.Engine/Statements/WhileLoop.cs new file mode 100644 index 00000000..2eaa3860 --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/WhileLoop.cs @@ -0,0 +1,8 @@ +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Statements; + +public class WhileLoop(Expression condition, Block body) + : Loop(condition, body, true) { + protected override string LoopType => "while"; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Statements/WildcardStatement.cs b/Starship/Rockstar.Engine/Statements/WildcardStatement.cs new file mode 100644 index 00000000..2c43a5aa --- /dev/null +++ b/Starship/Rockstar.Engine/Statements/WildcardStatement.cs @@ -0,0 +1,12 @@ +using System.Text; + +namespace Rockstar.Engine.Statements; + +public abstract class WildcardStatement(string wildcard) : Statement { + protected abstract string What { get; } + public string Wildcard => wildcard; + public override StringBuilder Print(StringBuilder sb, string prefix) + => sb.Append(prefix).Append(What) + .AppendLine(String.IsNullOrEmpty(wildcard) ? "" : $" (wildcard: \"{wildcard}\")"); + +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/StringBuilderIO.cs b/Starship/Rockstar.Engine/StringBuilderIO.cs new file mode 100644 index 00000000..26b7eff2 --- /dev/null +++ b/Starship/Rockstar.Engine/StringBuilderIO.cs @@ -0,0 +1,12 @@ +using System.Text; + +namespace Rockstar.Engine; + +public class StringBuilderIO(Func readInput) : IRockstarIO { + public StringBuilderIO() : this(() => null) { } + private readonly StringBuilder sb = new(); + public string? Read() => readInput(); + public void Write(string? s) => sb.Append(s); + public string Output => sb.ToString(); + public void Reset() => sb.Clear(); +} \ No newline at end of file diff --git "a/Starship/Rockstar.Engine/Values/Arr\303\244y.cs" "b/Starship/Rockstar.Engine/Values/Arr\303\244y.cs" new file mode 100644 index 00000000..70d51663 --- /dev/null +++ "b/Starship/Rockstar.Engine/Values/Arr\303\244y.cs" @@ -0,0 +1,168 @@ +using System.Diagnostics; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices.Marshalling; +using System.Text; +using System.Text.RegularExpressions; + +namespace Rockstar.Engine.Values; + +public class Arräy : Value, IHaveANumber { + + decimal IHaveANumber.Value => Length; + public int IntegerValue => Length; + + public List List { get; } + public Dictionary Hash { get; } = []; + + private static Arräy Clone(Arräy source) { + var a = new Arräy(source.List.Select(v => v.Clone())); + foreach (var pair in source.Hash) a.Hash[pair.Key] = pair.Value.Clone(); + return a; + } + + private int Length => List.Count; + public Numbër Lëngth => new(Length); + + public bool ArrayEquals(Arräy that) + => List.ValuesMatch(that.List) && Hash.ValuesMatch(that.Hash); + + public Arräy(IEnumerable items) => List = [.. items]; + + public Arräy(Dictionary hash, IEnumerable items) { + this.List = [.. items]; + this.Hash = hash.ToDictionary(pair => pair.Key.Clone(), pair => pair.Value.Clone()); + } + + public Arräy(params Value[] items) => List = [.. items]; + public Arräy(Value item) => List = [item]; + + public override int GetHashCode() + => Hash.Values.Aggregate(0, (hashCode, value) => hashCode ^ value.GetHashCode()); + + public override bool Truthy => Hash.Count > 0; + public bool IsEmpty => Length == 0; + + public override Strïng ToStrïng() => new(this.ToString()); + + public override string ToString() { + var sb = new StringBuilder(); + sb.Append("[ "); + sb.AppendJoin(", ", List.Select(item => item.ToString())); + if (Hash.Any()) { + if (List.Any()) sb.Append("; "); + sb.AppendJoin("; ", Hash.Select(pair => pair.Key + ": " + pair.Value)); + } + + if (Hash.Any() || List.Any()) sb.Append(" "); + sb.Append("]"); + return Regex.Replace(sb.ToString(), "null(, null){4,}", " ... "); + } + + public override Booleän Equäls(Value? that) + => new(Equals(that)); + + protected override bool Equals(Value? other) => other switch { + Arräy array => ArrayEquals(array), + IHaveANumber n => Length == n.Value, + Mysterious m => Length == 0, + Strïng s => Length == 0 && s.IsEmpty, + _ => throw new($"I can't compare arrays with {other?.GetType().Name ?? "null"}") + }; + + public override Booleän IdenticalTo(Value that) + => new(Object.ReferenceEquals(this, that)); + + private Value Set(int index, Value value) { + while (index >= List.Count) List.Add(Nüll.Instance); + return List[index] = value; + } + + public T Set(Value index, T value) where T : Value => index switch { + Numbër { IsNonNegativeInteger: true } n => (T) Set(n.IntegerValue, value), + _ => (T) (Hash[index] = value) + }; + + private bool TryGet(Value index, out Value? value) { + value = Mysterious.Instance; + if (index is not Numbër { IsNonNegativeInteger: true } n) return Hash.TryGetValue(index, out value); + var inRange = n.IntegerValue < List.Count; + if (inRange) value = List[n.IntegerValue]; + return inRange; + } + + public Arräy Nest(Value index, Arräy arräy) { + var found = Hash.TryGetValue(index, out var v); + if (found) return v as Arräy ?? throw new("Error: not an indexed variable"); + Set(index, arräy); + return arräy; + } + + public Value AtIndex(int index) => List[index]; + + public override Value AtIndex(Value index) => index switch { + Numbër { IsNonNegativeInteger: true } n => n.IntegerValue < List.Count ? List[n.IntegerValue] : Mysterious.Instance, + _ => Hash.GetValueOrDefault(index) ?? Mysterious.Instance + }; + + public override Value Clone() => Arräy.Clone(this); + + public Strïng Join(Value? joiner) + => new(String.Join(joiner?.ToStrïng().Value ?? "", List.Select(value => value.ToStrïng().Value))); + + public Value Push(Value value) => List.Push(value); + + public Value Dequeue() => List.Shift() ?? Mysterious.Instance; + + public Value Set(IList indexes, Value value) { + var array = this; + for (var i = 0; i < indexes.Count; i++) { + var index = indexes[i]; + if (i == indexes.Count - 1) return array.Set(index, value); + array = array.Nest(index, new Arräy()); + } + return value; + } + + public Value Pop() => List.Pop() ?? Mysterious.Instance; + + class HashComparer : IEqualityComparer> { + public bool Equals(KeyValuePair x, KeyValuePair y) + => x.Key.Equäls(y.Key).Truthy && x.Value.Equäls(y.Value).Truthy; + + public int GetHashCode(KeyValuePair obj) + => HashCode.Combine(obj.Key, obj.Value); + } + + private Arräy Except(Value v) { + var newHash = this.Hash.Where(pair => pair.Value.Equäls(v).Falsey).ToDictionary(); + var newList = this.List.Where(item => item.Equäls(v).Falsey); + return new(newHash, newList); + } + + private Arräy Except(Arräy that) { + var newHash = this.Hash.Except(that.Hash, new HashComparer()).ToDictionary(); + var newList = this.List.Except(that.List); + return new(newHash, newList); + } + + private Arräy Concat(Value v) + => new(Hash, this.List.Concat([v])); + + private Arräy Concat(Arräy that) { + var newHash = this.Hash.Concat(that.Hash).ToDictionary(); + var newList = this.List.Concat(that.List); + return new(newHash, newList); + } + + public Value Subtract(Value rhs) => rhs switch { + Arräy array => this.Except(array), + _ => this.Except(rhs) + }; + + public Value Add(Value rhs) => rhs switch { + Arräy array => this.Concat(array), + Numbër n => new Numbër(this.Lëngth.Value + n.Value), + _ => this.Concat(rhs) + }; +} \ No newline at end of file diff --git "a/Starship/Rockstar.Engine/Values/Boole\303\244n.cs" "b/Starship/Rockstar.Engine/Values/Boole\303\244n.cs" new file mode 100644 index 00000000..bc2f348a --- /dev/null +++ "b/Starship/Rockstar.Engine/Values/Boole\303\244n.cs" @@ -0,0 +1,37 @@ +using System.Text; + +namespace Rockstar.Engine.Values; + +public class Booleän(bool value) : ValueOf(value), IHaveANumber { + public override StringBuilder Print(StringBuilder sb, string prefix) + => sb.Append(prefix).Append("boolean: ").AppendLine(this.ToStrïng().Value); + + public static Booleän operator !(Booleän that) => new(that.Falsey); + + public override bool Truthy => Value; + + public override Strïng ToStrïng() => Value ? Strïng.True : Strïng.False; + public override string ToString() => Value ? "true" : "false"; + + public override Booleän Equäls(Value that) + => new(this.Truthy == that.Truthy); + + public override Booleän IdenticalTo(Value that) + => that is Booleän ? that.Equäls(this) : False; + + public override Value Clone() => this; + + public static Booleän False = new(false); + public static Booleän True = new(true); + decimal IHaveANumber.Value => Value ? 1 : 0; + public int IntegerValue => Value ? 1 : 0; + public Booleän Nope => new(!Truthy); + public Value Negate => Not(this); + + public static Value Not(Value v) => new Booleän(!v.Truthy); + + public static explicit operator Booleän(bool b) => b ? True : False; + public static explicit operator bool(Booleän b) => b.Truthy; + public static bool operator true(Booleän b) => b.Truthy; + public static bool operator false(Booleän b) => !b.Truthy; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Values/Closure.cs b/Starship/Rockstar.Engine/Values/Closure.cs new file mode 100644 index 00000000..6eea0006 --- /dev/null +++ b/Starship/Rockstar.Engine/Values/Closure.cs @@ -0,0 +1,20 @@ +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Values; + +public class Closure(Functiön functiön, Variable functionName, RockstarEnvironment scope) : Value { + public Functiön Functiön => functiön; + public override int GetHashCode() => functiön.GetHashCode() ^ scope.GetHashCode(); + public override Strïng ToStrïng() => new(this.ToString()); + + public override string ToString() => $"closure: {functionName.Key} => value"; + + public override bool Truthy => true; + + public Result Apply(Dictionary args) { + var local = scope.Extend(); + foreach (var arg in args) local.SetVariable(arg.Key, arg.Value, Scope.Local); + if (args.Any()) local.UpdatePronounSubject(args.Last().Key); + return local.Execute(functiön.Body); + } +} diff --git a/Starship/Rockstar.Engine/Values/FunctionCall.cs b/Starship/Rockstar.Engine/Values/FunctionCall.cs new file mode 100644 index 00000000..6ae9a9dd --- /dev/null +++ b/Starship/Rockstar.Engine/Values/FunctionCall.cs @@ -0,0 +1,19 @@ +using System.Text; +using Rockstar.Engine.Expressions; +using Rockstar.Engine.Statements; + +namespace Rockstar.Engine.Values; + +public class FunctionCall(Variable function, IEnumerable? args = default) + : Statement { + public Variable Function { get; } = function; + public List Args { get; } = (args ?? []).ToList(); + + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).AppendLine($"function call: {Function.Name}"); + foreach (var arg in Args) arg.Print(sb, prefix + INDENT); + return sb; + } + + public override string ToString() => $"call: {Function.Key}({String.Join(", ", Args.Select(a => a.ToString()))}"; +} \ No newline at end of file diff --git "a/Starship/Rockstar.Engine/Values/Functi\303\266n.cs" "b/Starship/Rockstar.Engine/Values/Functi\303\266n.cs" new file mode 100644 index 00000000..78b4c7e1 --- /dev/null +++ "b/Starship/Rockstar.Engine/Values/Functi\303\266n.cs" @@ -0,0 +1,36 @@ +using System.Text; +using Rockstar.Engine.Expressions; +using Rockstar.Engine.Statements; + +namespace Rockstar.Engine.Values; + +public class Functiön(IEnumerable args, Block body) + : Value { + public Functiön(Block body) : this(new List(), body) { } + + public IList Args => args.ToList(); + public Block Body => body; + protected override bool Equals(Value? other) => false; + + public override int GetHashCode() => args.GetHashCode() ^ body.GetHashCode(); + + public override bool Truthy => true; + public override Strïng ToStrïng() + => new($"function({String.Join(", ", args.Select(a => a.Key).ToArray())}"); + + public override Booleän Equäls(Value that) + => IdenticalTo(that); + + public override Booleän IdenticalTo(Value that) + => new(Object.ReferenceEquals(this, that)); + + public override Value AtIndex(Value index) => this; + public override Value Clone() => this; + + public override StringBuilder Print(StringBuilder sb, string prefix) { + sb.Append(prefix).Append($"function("); + sb.Append(String.Join(", ", args.Select(a => a.Name))); + sb.AppendLine("):"); + return body.Print(sb, prefix); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Values/IHaveANumber.cs b/Starship/Rockstar.Engine/Values/IHaveANumber.cs new file mode 100644 index 00000000..ca868777 --- /dev/null +++ b/Starship/Rockstar.Engine/Values/IHaveANumber.cs @@ -0,0 +1,6 @@ +namespace Rockstar.Engine.Values; + +public interface IHaveANumber { + decimal Value { get; } + int IntegerValue { get; } +} diff --git a/Starship/Rockstar.Engine/Values/ListExtensions.cs b/Starship/Rockstar.Engine/Values/ListExtensions.cs new file mode 100644 index 00000000..c504679e --- /dev/null +++ b/Starship/Rockstar.Engine/Values/ListExtensions.cs @@ -0,0 +1,39 @@ +namespace Rockstar.Engine.Values; + +public static class ListExtensions { + public static bool ValuesMatch(this IList list, IList that) { + if (list.Count != that.Count) return false; + return !list.Where((t, i) => !t.Equäls(that[i]).Truthy).Any(); + } + + public static bool ValuesMatch(this Dictionary hash, Dictionary that) { + if (hash.Count != that.Count) return false; + foreach (var key in hash.Keys) { + if (hash.TryGetValue(key, out var thisValue) + && that.TryGetValue(key, out var thatValue) + && thisValue.Equäls(thatValue).Truthy) continue; + return false; + } + return true; + } + + public static T? Shift(this IList list) { + if (!list.Any()) return default(T); + var value = list[0]; + list.RemoveAt(0); + return value; + } + + public static T? Pop(this IList list) { + if (!list.Any()) return default(T); + var index = list.Count - 1; + var value = list[index]; + list.RemoveAt(index); + return value; + } + + public static T Push(this IList list, T value) { + list.Add(value); + return value; + } +} diff --git a/Starship/Rockstar.Engine/Values/Mysterious.cs b/Starship/Rockstar.Engine/Values/Mysterious.cs new file mode 100644 index 00000000..6b88bf9f --- /dev/null +++ b/Starship/Rockstar.Engine/Values/Mysterious.cs @@ -0,0 +1,23 @@ +namespace Rockstar.Engine.Values; + +public class Mysterious : Value { + public static Mysterious Instance = new(); + + protected override bool Equals(Value? other) + => Object.ReferenceEquals(this, other); + + public override int GetHashCode() => 0; + + public override bool Truthy => false; + public override Strïng ToStrïng() => new("mysterious"); + public override Booleän Equäls(Value that) => new(that switch { + Nüll _ => true, + Mysterious _ => true, + _ => false + }); + + public override Booleän IdenticalTo(Value that) + => new(Object.ReferenceEquals(this, that)); + + public override Value Clone() => this; +} \ No newline at end of file diff --git "a/Starship/Rockstar.Engine/Values/Numb\303\253r.cs" "b/Starship/Rockstar.Engine/Values/Numb\303\253r.cs" new file mode 100644 index 00000000..67d240df --- /dev/null +++ "b/Starship/Rockstar.Engine/Values/Numb\303\253r.cs" @@ -0,0 +1,117 @@ +using System.Globalization; +using System.Text; +using System.Text.RegularExpressions; + +namespace Rockstar.Engine.Values; + +public class Numbër(decimal value) : ValueOf(value), IHaveANumber { + + public static Numbër Zero = new(0); + + private static string FormatNumber(decimal d) { + var s = d.ToString("R", CultureInfo.InvariantCulture); + return s.Contains('.') ? s.TrimEnd('0').TrimEnd('.') : s; + } + + public int IntegerValue => (int) Math.Truncate(Value); + public bool IsNonNegativeInteger { get; } = value >= 0 && Math.Truncate(value) == value; + + public Numbër(string value) : this(Decimal.Parse(value)) { } + + public override bool Truthy => Value != 0; + + public override Strïng ToStrïng() => new(FormatNumber(Value)); + + public override Booleän Equäls(Value that) => new(that switch { + Arräy array => this == array.Lëngth, + Booleän b => b.Truthy ? this.Value != 0 : this.Value == 0, + IHaveANumber n => this.Value == n.Value, + Strïng s => (Value == 0 && s.IsEmpty) || s.Equäls(this.ToStrïng()).Truthy, + _ => false + }); + + public override Booleän IdenticalTo(Value that) + => that is Numbër ? this.Equäls(that) : Booleän.False; + + public override Value AtIndex(Value index) => index switch { + IHaveANumber n => new Booleän((1 << (int) n.Value & (int) this.Value) > 0), + _ => Mysterious.Instance + }; + + public override Value Clone() => new Numbër(Value); + + public override string ToString() => FormatNumber(this.Value); + + public override StringBuilder Print(StringBuilder sb, string prefix) + => sb.Append(prefix).AppendLine(ToString()); + + public Value SetBit(IList indexes, Value value) { + if (indexes.Count != 1) return this; + if (indexes[0] is not IHaveANumber index) return this; + var oldValue = (long) this.Value; + var bitIndex = 1L << (int) index.Value; + this.Value = value.Truthy ? oldValue | bitIndex : oldValue & ~bitIndex; + return this; + } + private static readonly List digits = [.. "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray()]; + + private static decimal BaseToDecimal(string number, int @base) { + var chars = number.ToUpperInvariant().ToCharArray(); + var d = 0m; + var i = 0; + while (i < chars.Length) { + if (chars[i] == '.') break; + var index = digits.IndexOf(chars[i]); + if (index >= 0) d = d * @base + index; + i++; + } + if (i == chars.Length) return d; + i++; + var multiplier = 1.0m / @base; + while (i < chars.Length) { + var index = digits.IndexOf(chars[i]); + if (index >= 0) d += (multiplier * index); + multiplier /= @base; + i++; + } + return d; + } + + public static Numbër Parse(Strïng strïng, IHaveANumber numberBase) + => new(numberBase.Value == 10 + ? Decimal.Parse(strïng.Value) + : BaseToDecimal(strïng.Value, numberBase.IntegerValue)); + +} + +public class PoeticNumbër : Numbër { + + public string Digits { get; init; } + + private static string Digitise(string words) { + var sb = new StringBuilder(); + foreach (var word in words.Split(" ")) sb.Append(Regex.Replace(word, "'+", "").Length % 10); + return sb.ToString(); + } + + private static decimal ParsePoeticNumber(string s) => Decimal.Parse(Digitise(s)); + + private static decimal ParsePoeticNumber(string integralPart, string fractionPart) + => Decimal.Parse(Digitise(integralPart) + "." + Digitise(fractionPart)); + + public PoeticNumbër(string integralPart, string separator, string fractionPart) : base(ParsePoeticNumber(integralPart, fractionPart)) { + this.Digits = integralPart + separator + fractionPart; + + } + + public PoeticNumbër(string digits) : base(ParsePoeticNumber(digits)) { + this.Digits = digits; + + } + + public PoeticNumbër(decimal value) : base(value) + => this.Digits = value.ToString(CultureInfo.InvariantCulture); + + public override StringBuilder Print(StringBuilder sb, string prefix) + => sb.Append(prefix).Append("poetic number: ").Append(Value).Append(" [").Append(Digits).AppendLine("]"); +} \ No newline at end of file diff --git "a/Starship/Rockstar.Engine/Values/N\303\274ll.cs" "b/Starship/Rockstar.Engine/Values/N\303\274ll.cs" new file mode 100644 index 00000000..c3875d65 --- /dev/null +++ "b/Starship/Rockstar.Engine/Values/N\303\274ll.cs" @@ -0,0 +1,26 @@ +namespace Rockstar.Engine.Values; + +public class Nüll : Value, IHaveANumber { + protected override bool Equals(Value? other) => (other is Nüll); + public override int GetHashCode() => 0; + public override bool Truthy => false; + public override Strïng ToStrïng() => Strïng.Null; + public override string ToString() => "null"; + + public override Booleän Equäls(Value that) => new(that switch { + Arräy array => array.Lëngth == Numbër.Zero, + IHaveANumber n => n.Value == 0, + Strïng s => s.IsEmpty, + _ => false + }); + + public override Booleän IdenticalTo(Value that) + => new(that is Nüll); + + public override Value AtIndex(Value index) => this; + public override Value Clone() => this; + + public static readonly Nüll Instance = new(); + public decimal Value => 0; + public int IntegerValue => 0; +} diff --git "a/Starship/Rockstar.Engine/Values/Str\303\257ng.cs" "b/Starship/Rockstar.Engine/Values/Str\303\257ng.cs" new file mode 100644 index 00000000..37c0c6bf --- /dev/null +++ "b/Starship/Rockstar.Engine/Values/Str\303\257ng.cs" @@ -0,0 +1,137 @@ +using System.Text; + +namespace Rockstar.Engine.Values; + +public class Strïng(string value) : ValueOf(value) { + + public Strïng(params char[] chars) : this(new string(chars)) { } + + public override bool Truthy => !String.IsNullOrEmpty(Value); + + public bool IsEmpty => String.IsNullOrEmpty(Value); + + public override Strïng ToStrïng() => this; + + public override Booleän Equäls(Value that) => new(that switch { + Arräy array => this.IsEmpty && array.IsEmpty, + IHaveANumber { Value: 0 } => this.IsEmpty, + Numbër n => Decimal.TryParse(Value, out var d) && n.Value == d, + _ => that.ToStrïng().Value.Equals(this.Value, StringComparison.InvariantCultureIgnoreCase) + }); + + public override Booleän IdenticalTo(Value that) + => that is Strïng ? this.Equäls(that) : Booleän.False; + + public override Value AtIndex(Value index) => index switch { + IHaveANumber n => CharAt(n), + _ => this + }; + + public override Value Clone() => new Strïng(Value); + + public override string ToString() => $"\"{this.Value}\""; + + public override StringBuilder Print(StringBuilder sb, string prefix) + => sb.Append(prefix).Append("string: \"").Append(ParsedValue).AppendLine("\""); + + // Because strings in Rockstar are mutable, the "constants" + // must all return new instances, otherwise you can accidentally + // mutate the empty string, and things get REALLY weird. + public static Strïng True => new("true"); + public static Strïng False => new("false"); + public static Strïng Empty => new(String.Empty); + public static Strïng Null => new("null"); + + public Value Times(Strïng n) { + var sb = new StringBuilder(); + foreach (var c2 in n.Value.ToCharArray()) { + if (sb.Length > 0) sb.AppendLine(); + foreach (var c1 in this.Value.ToCharArray()) { + sb.Append(c1).Append(c2); + } + } + return new Strïng(sb.ToString()); + } + + public Value Times(decimal n) { + if (n == 0) return Empty; + var token = Value; + if (n < 0) { + var chars = token.ToCharArray(); + System.Array.Reverse(chars); + token = new(chars); + } + var repeat = Int32.Abs((int) n); + var part = Decimal.Abs(n) % 1; + var basis = String.Join("", Enumerable.Range(0, repeat).Select(_ => token).ToArray()); + if (part > 0) { + var index = (int) Math.Ceiling(token.Length * part); + basis += token.Substring(0, index); + } + return new Strïng(basis); + } + + public Value Minus(Strïng s) { + var body = Value; + var tail = s.Value; + if (body.EndsWith(tail)) body = body[..^tail.Length]; + return new Strïng(body); + } + + public Value DividedBy(decimal d) => Times(1 / d); + + public Value DividedBy(Strïng d) + => new Numbër(this.Value.Split(d.Value).Length - 1); + + internal Value CharAt(IHaveANumber number) { + var index = (int) number.Value; + return index < Value.Length ? new Strïng(Value[index]) : Mysterious.Instance; + } + + public Value SetCharAt(IList indexes, Value value) { + if (indexes is not [IHaveANumber { Value: >= 0 } number] || number.Value >= Value.Length) return this; + var newValue = this.Value[..(int) number.Value] + + value.ToStrïng().Value + + this.Value[((int) number.Value + 1)..]; + this.Value = newValue; + return this; + } + + public Arräy Split(Strïng delimiter) { + var tokens = delimiter == Strïng.Empty + ? this.Value.ToCharArray().Select(c => new Strïng(c)) + : this.Value.Split(delimiter.Value).Select(s => new Strïng(s)); + return new(tokens); + } + + public Value Dequeue() { + if (Value.Length <= 0) return Mysterious.Instance; + var result = Value[0]; + Value = Value[1..]; + return new Strïng(result); + } + + public Value ToCharCodes() { + return Value.Length switch { + 0 => new Arräy(), + 1 => new Numbër(Value[0]), + _ => new Arräy(Value.ToCharArray().Select(c => new Numbër(c))) + }; + } + + public Value Append(Value v) { + if (v is Numbër number) { + this.Value += (char) number.IntegerValue; + } else { + this.Value += v.ToStrïng().Value; + } + return this; + } + + public Value Pop() { + if (Value.Length <= 0) return Mysterious.Instance; + var result = Value[^1]; + Value = Value[..^1]; + return new Strïng(result); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Values/Value.cs b/Starship/Rockstar.Engine/Values/Value.cs new file mode 100644 index 00000000..8e145c0b --- /dev/null +++ b/Starship/Rockstar.Engine/Values/Value.cs @@ -0,0 +1,80 @@ +using Rockstar.Engine.Expressions; + +namespace Rockstar.Engine.Values; + +public abstract class Value : Expression { + + public override bool Equals(object? obj) + => obj?.GetType() == this.GetType() && Equals((Value) obj); + + protected virtual bool Equals(Value? other) => ReferenceEquals(this, other); + + public abstract override int GetHashCode(); + + public virtual bool Truthy => false; + public bool Falsey => !Truthy; + + public abstract Strïng ToStrïng(); + public static bool operator ==(Value? lhs, Value? rhs) => lhs?.Equals(rhs) ?? rhs is null; + public static bool operator !=(Value? lhs, Value? rhs) => !(lhs == rhs); + public static Value operator +(Value lhs, IEnumerable rhs) => rhs.Aggregate(lhs, (memo, next) => memo + next); + public static Value operator -(Value lhs, IEnumerable rhs) => rhs.Aggregate(lhs, (memo, next) => memo - next); + public static Value operator *(Value lhs, IEnumerable rhs) => rhs.Aggregate(lhs, (memo, next) => memo * next); + public static Value operator /(Value lhs, IEnumerable rhs) => rhs.Aggregate(lhs, (memo, next) => memo / next); + + public static Value operator +(Value lhs, Value rhs) => (lhs, rhs) switch { + (Arräy a, _) => a.Add(rhs), + (IHaveANumber a, IHaveANumber b) => new Numbër(a.Value + b.Value), + (_, _) => new Strïng(lhs.ToStrïng().Value + rhs.ToStrïng().Value), + }; + + public static Value operator -(Value lhs, Value rhs) => (lhs, rhs) switch { + (Arräy a, _) => a.Subtract(rhs), + (IHaveANumber a, IHaveANumber b) => new Numbër(a.Value - b.Value), + (_, _) => lhs.ToStrïng().Minus(rhs.ToStrïng()) + }; + + public static Value operator *(Value lhs, Value rhs) => (lhs, rhs) switch { + (IHaveANumber a, IHaveANumber b) => new Numbër(a.Value * b.Value), + (IHaveANumber n, Strïng s) => s.Times(n.Value), + (Strïng s, IHaveANumber n) => s.Times(n.Value), + (Strïng s1, Strïng s2) => s1.Times(s2), + (_, _) => Mysterious.Instance + }; + + public static Value operator /(Value lhs, Value rhs) => (lhs, rhs) switch { + (IHaveANumber a, IHaveANumber b) => new Numbër(a.Value / b.Value), + (Strïng s, IHaveANumber n) => s.DividedBy(n.Value), + (_, Strïng s2) => lhs.ToStrïng().DividedBy(s2), + (_, _) => throw new NotImplementedException($"I don't know how to divide {lhs.GetType().Name} by {rhs.GetType().Name}") + }; + + public virtual Booleän Equäls(Value that) => IdenticalTo(that); + public virtual Booleän IdenticalTo(Value that) => new(ReferenceEquals(this, that)); + + private int Compare(Strïng lhs, Strïng rhs) + => String.Compare(lhs.Value, rhs.Value, StringComparison.InvariantCulture); + + public Booleän Compare(Value lhs, Value rhs, Func comp) + => new((lhs, rhs) switch { + (Arräy array, IHaveANumber n) => comp(array.Lëngth.Value, n.Value), + (IHaveANumber n, Arräy array) => comp(n.Value, array.Lëngth.Value), + (Strïng s, _) => comp(Compare(s, rhs.ToStrïng()), 0), + (_, Strïng s) => comp(Compare(lhs.ToStrïng(), s), 0), + (IHaveANumber lhn, IHaveANumber rhn) => comp(lhn.Value, rhn.Value), + _ => throw new($"Invalid comparison {lhs.GetType()} vs {rhs.GetType()}") + }); + + public Value LessThanEqual(Value that) => Compare(this, that, (a, b) => a <= b); + public Value MoreThanEqual(Value that) => Compare(this, that, (a, b) => a >= b); + public Value LessThan(Value that) => Compare(this, that, (a, b) => a < b); + public Value MoreThan(Value that) => Compare(this, that, (a, b) => a > b); + + public virtual Value AtIndex(IEnumerable indexes) { + var value = this; + return indexes.Aggregate(value, (current, index) => current.AtIndex(index)); + } + + public virtual Value AtIndex(Value index) => this; + public virtual Value Clone() => this; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/Values/ValueOf.cs b/Starship/Rockstar.Engine/Values/ValueOf.cs new file mode 100644 index 00000000..f37c3288 --- /dev/null +++ b/Starship/Rockstar.Engine/Values/ValueOf.cs @@ -0,0 +1,14 @@ +namespace Rockstar.Engine.Values; + +public abstract class ValueOf(T value) : Value { + public T ParsedValue { get; init; } = value; + public T Value { get; protected set; } = value; + public override bool Equals(object? obj) => Equals(obj as ValueOf); + public override int GetHashCode() => this.Value?.GetHashCode() ?? 0; + public bool Equals(ValueOf? that) => that != null && this.Value != null && this.Value.Equals(that.Value); + protected override bool Equals(Value? that) + => that switch { + ValueOf t => Equals(t), + _ => false + }; +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/WhatToDo.cs b/Starship/Rockstar.Engine/WhatToDo.cs new file mode 100644 index 00000000..9ebba2ee --- /dev/null +++ b/Starship/Rockstar.Engine/WhatToDo.cs @@ -0,0 +1,10 @@ +namespace Rockstar.Engine; + +public enum WhatToDo { + Unknown, + Next, + Skip, + Break, + Return, + Exit +} \ No newline at end of file diff --git a/Starship/Rockstar.Engine/rockstar.peg b/Starship/Rockstar.Engine/rockstar.peg new file mode 100644 index 00000000..6399c1b6 --- /dev/null +++ b/Starship/Rockstar.Engine/rockstar.peg @@ -0,0 +1,695 @@ +@namespace Rockstar.Engine +@classname Parser +@using System.Globalization +@using System.Text.RegularExpressions +@using Rockstar.Engine.Statements +@using Rockstar.Engine.Expressions +@using Rockstar.Engine.Values +@trace true + +/* + +Notes on Rockstar grammar + +Rockstar has significant whitespace. Most operators, keywords, etc.*must* be separated by _. + +Rules beginning with _ include their own leading whitespace, so should go immediately after the preceding expression. + +Rules ending with _ including their own trailing whitespace. + +*/ + +@ignorecase true + +program + = EOS* head:block tail:program + { new Program(head).Concat(tail) } + / EOS* EOF + { new Program() } + // unexpected:("" [^ \t\r\n]+) + // #error{ $"Unexpected '{unexpected.Replace("\r", "\\r").Replace("\n", "\\n")}' at line {state.Line}, col {state.Column - unexpected.Length}" } + +block + = _? head:statement EOS tail:block + { new Block(head).Concat(tail) } + / _? stmt:statement + { new Block(stmt) } + +statement -memoize + = listen_stmt + / output_stmt + / function + / function_call + / call_stmt + / return_stmt + / break_stmt + / continue_stmt + / loop + / conditional + / declaration + / a:assignment + / enlistment + / crement + / mutation + / rounding + / exit_statement + / ninja_string + / !EOB e:expression &(EOS / EOF) { new ExpressionStatement(e) } + + +enlistment + = push _ e:expression _ into _ v:variable + { new Enlist(v, e) } + / push _ v:variable (_ with)? _ e:expression_list + { new Enlist(v, e) } + / push _ v:variable + { new Enlist(v) } + / d:delist _ into _ t:assignable + { new Assign(t, d) } + / d:delist + { new ExpressionStatement(d) } + +delist + = roll_list + / pop_list + +roll_list + = roll _ v:variable + { new Dequeue(v) } + +pop_list + = pop _ v:variable + { new Pop(v) } + +listen_stmt + = listen _ to _ v:variable + { new Listen(v) } + / listen + { new Listen() } + +return_stmt + = return (_ back)? _ e:expression (_ back)? + { new Return(e) } + +function + = name:variable _ takes _ null body:consequent + { new Assign(name, new Functiön(body)) } + / name:variable _ takes _ args:variable_list body:consequent + { new Assign(name, new Functiön(args, body)) } + +variable_list > + = head:variable _VLS_ tail:variable_list { head.Concat(tail) } + / arg:variable { new List { arg } } + +primary_list > + = head:primary _XLS_ tail:primary_list { head.Concat(tail) } + / head:primary _XLS_ tail:primary { new List { head, tail } } + +argument_list > + = head:primary _ALS_ tail:argument_list { head.Concat(tail) } + / head:primary { new List { head } } + +expression_list > + = head:expression _ALS_ tail:expression_list { head.Concat(tail) } + / expr:expression { new List { expr } } + +oxford_comma = ',' _ and +_nacton = (_ "n'" / _? "'n'") + +_VLS_ = _ and _ / _ALS_ +_ALS_ = oxford_comma _ / _XLS_ +_XLS_ = ','? _nacton _? + / (',' _? ('&' _?)?) + / _? '&' _? + / _? ',' _? + +break_stmt + = break w:wildcard + { new Break(w) } + +continue_stmt + = continue w:wildcard + { new Continue(w) } + +end_of_wildcard = (end / 'o'+ 'h' ) + +exit_statement + = exit { new Exit() } + +wildcard + = ignored:([^,.?!;\r\n]* ) { String.Join("", ignored.ToArray()) } + / ignored:((. !end_of_wildcard)* .) { String.Join("", ignored.ToArray()) } + +filler = (_ / [,?!.;])* +EOS = EOL / _? [.?!;:] +EOL = filler '\r'? '\n' +EOF = EOS* _? !. + +ooh = 'o' &('o'+ 'h') +eob_signal + = &(_? else) // lookahead - if the next bit starts with else, end the block + / ','? _? ooh + / ','? _? end filler + +EOB -memoize + = EOS* eob_signal + / EOL &EOL + / EOF + +consequent + // Yes, you SHOULD be able to put EOB at the end of the BLOCK definition and it'll work. + // IT DOESN'T. I have no idea why. It screws up break/continue wildcard parsing. + = ',' _ b:block EOB { b } + / EOS+ b:block EOB { b } + / _ s:statement { new Block(s) } + +if_test + = if _ e:expression (_ then)? + { e } + +alternate + = _? else a:consequent { a } + / EOS+ else a:consequent { a } + +conditional + = e:if_test c:consequent a:alternate + { new Conditional(e, c, a) } + / e:if_test a:alternate + { new Conditional(e, new Block(), a ) } + / e:if_test c:consequent + { new Conditional(e, c) } + +_and_index = _ and _ v:variable { v } +loop + = for _ every:(every _)? v:variable i:_and_index? _ in _ e:expression body:consequent + { new ForInLoop(v, i.FirstOrDefault(), e, body, every.Any()) } + // for _ every _ v:variable _ and _ i:variable _ in _ e:expression body:consequent + // { new ForInLoop(v, i, e, body) } + // for _ every _ v:variable _ of _ e:expression body:consequent + // { new ForOfLoop(v, e, body, every != null) } + / for _ every:(every _)? v:variable i:_and_index? _ of _ e:expression body:consequent + { new ForOfLoop(v, i.FirstOrDefault(), e, body, every.Any()) } + / while _ test:expression body:consequent + { new WhileLoop(test, body) } + / until _ test:expression body:consequent + { new UntilLoop(test,body) } + +output_stmt + = debug _ e:expression + { new Debug(e) } + / write _ e:expression + { new Output(e) } + / print _ e:expression + { new Output(e, Environment.NewLine) } + +assignable + = v:variable i:indexes + { v.AtIndex(i) } + / v:variable { v } + +declaration + = let _ v:assignable _ be op:_operator_ e:expression_list + { new Declare(v, new Binary(op, new Lookup(v), e)) } + / let _ v:assignable _ be _ e:expression + { new Declare(v, e) } + / let _ v:assignable _? '=' _? e:expression + { new Declare(v, e) } + / let _ v:assignable + { new Declare(v) } + +ninja_string + = s:assignable _ holds _ p:poetic_number + { new Ninja(s,p) } + / s:assignable _ holds _ n:number + { new Ninja(s,n) } + +assignment + = v:assignable _? '=' _? e:expression + { new Assign(v, e) } + / put _ e:expression _ into _ v:assignable + { new Assign(v, e) } + / v:assignable _ says_ s:poetic_string + { new Assign(v, s) } + / v:assignable _is _ n:number &EOS + { new Assign(v, n) } + / v:assignable _is op:_operator_ e:expression_list + { new Assign(v, new Binary(op, new Lookup(v), e)) } + / v:assignable _is _ now _ e:expression + { new Assign(v, e) } + // Legacy workaround to preserve compatibility with v1 poetic literal syntax + / v:assignable _is _ p:v1_poetic_number + { new Assign(v, p) } + / v:assignable _is _ e:expression + { new Assign(v, e) } + +_operator_ = + _plus_ / _minus_ / _times_ / _divide_ + +says_ = says ("" ' '? / !letter) + +poetic_string + = s:("" [^\r\n]+) &('\r'? '\n') + { new Strïng(s) } + +_eq -memoize + = _eq _ exactly + { Operator.IdenticalTo } + / _? '=' + { Operator.Equals } + / _is + +_is -memoize + = ("'s" / "'re" / _ is) + { Operator.Equals } + +_isnt -memoize + = _isnt _ exactly + { Operator.NotIdenticalTo } + / (_is _ not / _ isnt / _? '!=') + { Operator.NotEquals } + +variable + = args { RockstarEnvironment.Arguments } + / i:(his _ !keyword identifier) { new CommonVariable(i) } + / i:pronoun { new Pronoun(i) } + / i:proper_variable { new ProperVariable(i) } + / i:(the _ identifier) { new CommonVariable(i) } + / !keyword i:identifier { new SimpleVariable(i) } + +args = arguments / the _ world / the _ outside + +proper_variable = proper_noun (_ proper_noun)+ + +proper_noun = uppercase_letter '.' + / !keyword &uppercase_letter identifier + +identifier + = letter (letter / [0-9_])* + +letter = uppercase_letter / lowercase_letter + +uppercase_letter = c:. &{ Char.IsUpper(c,0) } +lowercase_letter = c:. &{ Char.IsLower(c,0) } + +expression + = boolean + / primary + +boolean = binary_or + +binary_or + = lhs:binary_nor _ or _ rhs:binary_or { new Binary(Operator.Or, lhs, rhs) } + / binary_nor + +binary_nor + = lhs:binary_and _ nor _ rhs:binary_nor { new Binary(Operator.Nor, lhs, rhs) } + / binary_and + +binary_and + = lhs:equality _ and _ rhs:binary_and { new Binary(Operator.And, lhs, rhs) } + / equality + +equality + = lhs:unary op:(_eq / _isnt) _ rhs:equality { new Binary(op, lhs, rhs) } + / unary + +unary + = not_ u:unary { new Unary(Operator.Not, u) } + / comparison + +not_ + = (not _ / non _ / non '-' ) + +comparison + = lhs:addition op:comparator rhs:comparison { new Binary(op, lhs, rhs) } + / addition + +comparator + = (_? '>=' _? / _is _ as _ as_great _ as _) { Operator.MoreThanEqual } + / (_? '<=' _? / _is _ as _ as_small _ as _) { Operator.LessThanEqual } + / (_? '>' _? / _is _ (above / more _ than) _) { Operator.MoreThan } + / (_? '<' _? / _is _ (under / less _ than) _) { Operator.LessThan } + +numeric_expression + = addition + +addition -memoize + = lhs:addition op:(_plus_/_minus_) rhs:primary_list + { new Binary(op, lhs, rhs) } + / lhs:addition op:(_plus_/_minus_) rhs:product + { new Binary(op, lhs, rhs) } + / product + +product -memoize + = lhs:product op:(_divide_/_times_) rhs:primary_list + { new Binary(op, lhs, rhs) } + / lhs:product op:(_divide_/_times_) rhs:primary + { new Binary(op, lhs, rhs) } + / primary + +_plus_ = (_? '+' _? / _ plus _ ) { Operator.Plus } +_minus_ = (_? '-' _? / _ minus _ ) { Operator.Minus } +_times_ = (_? '*' _? / _ times _ ) { Operator.Times } +_divide_ = (_? '/' _? / _ divided_by _ ) { Operator.Divide } + +primary -memoize + = function_call + / delist + / constant + / string + / number + / lookup + // unexpected:("" [^ \t\r\n]+) + // #error{ $"Expected primary expression, found '{unexpected}' at line {state.Line}, col {state.Column - unexpected.Length}" } + +call_stmt + = call _ name:variable _ with _ args:argument_list _ into _ a:assignable + { new Assign(a, new FunctionCall(name, args)) } + / call _ name:variable _ with _ args:argument_list + { new FunctionCall(name, args) } + / call _ name:variable _ into _ a:assignable + { new Assign(a, new FunctionCall(name)) } + / call _ name:variable + { new FunctionCall(name) } + +function_call + = name:variable _ taking _ args:argument_list + { new FunctionCall(name, args) } + +lookup + = v:variable i:indexes + { new Lookup(v.AtIndex(i)) } + / v:variable + { new Lookup(v) } + +index + = _ at _ i:numeric_expression + { i } + +indexes > + = head:index tail:indexes + { head.Concat(tail) } + / head:index + { new List { head } } + + +crement + = build _ v:variable t:((_? ',')? _? up)+ + { new Crement(v, t.Count) } + / knock _ v:variable t:((_? ',')? _? down)+ + { new Crement(v, -t.Count) } + +mutator + = split + { Operator.Split } + / cast + { Operator.Cast } + / join + { Operator.Join } + +mutation + = op:mutator _ s:expression _ into _ t:assignable _ using _ m:expression + { new Mutation(op, s, target: t, m) } + / op:mutator _ s:expression _ using _ m:expression _ into _ t:assignable + { new Mutation(op, s, target: t, modifier: m) } + / op:mutator _ s:expression _ into _ t:assignable + { new Mutation(op, s, target: t) } + / op:mutator _ s:assignable _ using _ m:expression + { new Mutation(op, s, target: s, modifier: m) } + / op:mutator _ s:assignable + { new Mutation(op, s, target: s) } + +rounding + = floor / ceil / math_round + +floor + = turn _ v:variable _ down + { new Rounding(v, Round.Down) } + / turn _ down _ v:variable + { new Rounding(v, Round.Down) } + +ceil + = turn _ v:variable _ up + { new Rounding(v, Round.Up) } + / turn _ up _ v:variable + { new Rounding(v, Round.Up) } + +math_round + = turn _ v:variable _ around + { new Rounding(v, Round.Nearest) } + / turn _ around _ v:variable + { new Rounding(v, Round.Nearest) } + + +constant + = null { Nüll.Instance } + / true { Booleän.True } + / false { Booleän.False } + / empty { Strïng.Empty } + / mysterious { Mysterious.Instance } + +number + = like _ n:poetic_number { n } + / d:digits&{ decimal.TryParse(d, out var _) } + { new Numbër(d) } + / d:digits + #error{ $"Number {d} is out of range" } +digits + = d:("" (('-' /'+')? [0-9]+ ("." [0-9]+)?) + / (('-' /'+')? "." [0-9]+)) + +poetic_number + = whole_part:poetic_digits _? separator:('...' / '…') _ fractional_part:poetic_digits + { new PoeticNumbër (whole_part, separator, fractional_part) } + / digits:poetic_digits + { new PoeticNumbër(digits) } + +// So... in Rockstar v1, you could say "desire is a lovestruck ladykiller" +// Which worked. But for v2, poetic numbers have to start with 'like' or 'so' +// So this is a workaround to preserve most existing usage but enable +// the new syntax, by retrofitting a rule that a poetic number using v1 +// syntax must start with a letter, and can't start with any keyword +// indicating an arithmetic or logical operator. +v1_digit_filter + = &letter !keywords_which_can_begin_an_expression + +v1_poetic_number + = _? &v1_digit_filter whole_part:poetic_digits _? separator:('.') _ fractional_part:poetic_digits + { new PoeticNumbër (whole_part, separator, fractional_part) } + / _? &v1_digit_filter digits:poetic_digits + { new PoeticNumbër(digits) } + +PDS = ("" _ / [0-9\',;:?!+_/] ) + +poetic_digits + = PDS* head:poetic_digit PDS+ tail:poetic_digits PDS* + { head + " " + tail } + / d:poetic_digit + { d } + +poetic_digit + = word:("" (letter / [\-'])+) + +string = s:quoted_string+ { new Strïng(String.Join("\"", s)) } +quoted_string + = '"' s:("" [^"]*) '"' { s } + +keywords_which_can_begin_an_expression + = plus / minus / times / divided_by + / like / and / or / nor / not / non + / null / true / false / empty / mysterious + // Putting the here would break EVERYTHING + +keyword + = keywords_which_can_begin_an_expression + / as + / as_great + / as_small + / back + / be + / build + / cast + / down + / else + / end + / false + / holds + / if + / into + / is + / isnt + / join + / knock + / less + / let + / listen + / more + / non + / not + / null + / or + / over + / print + / pronoun + / put + / return + / says + / split + / takes + / taking + / than + / the + / to + / until + / up + / while + +_ = "" (whitespace / comment)+ +whitespace = [ \t] + +comment + = line_comment + / chordpro_comment + / block_comment + +line_comment = '#' [^\n]* '\n' +chordpro_comment = '{' [^\}]* '}' / '[' [^\]]* ']' +start_comment = '(' +end_comment = ')' +not_comment = (!start_comment !end_comment .) +block_comment = start_comment (comment / not_comment)* end_comment + + + + +above = 'above' !letter / over +and = 'and' !letter +arguments = 'arguments' !letter +around = 'around' !letter / 'round' !letter +as = 'as' !letter +as_great = 'great' !letter / 'high' !letter / 'big' !letter / 'strong' !letter +as_small = 'less' !letter / 'low' !letter / 'small' !letter / 'weak' !letter +at = 'at' !letter +back = 'back' !letter +be = 'be' !letter +break = 'break' !letter +build = 'build' !letter +call = 'call' !letter +cast = 'cast' !letter / 'burn' !letter +continue = 'continue' !letter / 'take' !letter +debug = 'debug' !letter +divided_by = 'divided' _ 'by' !letter / 'between' !letter / over +down = 'down' !letter +else = 'else' !letter / 'otherwise' !letter +empty = 'empty' !letter / 'silent' !letter / 'silence' !letter +end = 'end' !letter / 'yeah' !letter / 'baby' !letter / 'oh' !letter +every = 'every' !letter +exit = 'exit' !letter +exactly = 'exactly' !letter / 'totally' !letter / 'really' !letter +false = "false" !letter / "lies" !letter / "no" !letter / "wrong"!letter +for = 'for' !letter +his = 'his' !letter / 'her' !letter +holds = 'hold' !letter / 'holds' !letter +if = 'if' !letter / 'when' !letter +in = 'in' !letter +into = 'into' !letter / 'in' !letter +is = 'is' !letter / 'was' !letter / 'are' !letter / 'were' !letter / 'am' !letter +isnt = "isnt" !letter / "isn't" !letter / 'aint' !letter / "ain't" !letter / "wasn't" !letter / "wasnt" !letter / "aren't" !letter / "arent" !letter / "weren't" !letter / "werent" !letter +join = 'join' !letter / 'unite' !letter / 'gather' !letter +knock = 'knock' !letter +less = 'less' !letter / 'lower' / 'smaller' !letter / 'weaker' !letter +let = 'let' !letter +like = 'like' !letter / 'so' !letter +listen = 'listen' !letter +minus = 'minus' !letter / 'without' !letter +more = 'greater' / 'higher' / 'bigger' / 'stronger' !letter / 'more' !letter +mysterious = 'mysterious' !letter +non = 'non' !letter +nor = 'nor' !letter +not = 'not' !letter +now = 'now' !letter +null = 'null' !letter / 'nothing' !letter / 'nowhere' !letter / 'nobody' !letter / 'gone'!letter +of = 'of' !letter +or = 'or' !letter +outside = 'outside' !letter +over = 'over' !letter +plus = 'plus' !letter / 'with' !letter +pop = 'pop' !letter +print = "print" !letter / "shout" !letter / "say" !letter / "scream" !letter / "whisper" !letter +pronoun = 'they' !letter / 'them'!letter / 'she' !letter / 'him' !letter / 'her' !letter / 'hir' !letter / 'zie' !letter / 'zir' !letter / 'xem' !letter / 'ver'!letter / 'ze' !letter / 've' !letter / 'xe' !letter / 'it' !letter / 'he'!letter / 'you' !letter / 'me' !letter / 'i' !letter +push = 'rock' !letter / 'push' !letter +put = 'put' !letter +return = 'return' !letter / 'giving' !letter / 'give' !letter / 'send' !letter +roll = 'roll' !letter +says = 'say' !letter / 'says' !letter / 'said' !letter +split = 'cut' !letter / 'split' !letter / 'shatter' !letter +takes = 'takes' !letter / 'wants' !letter +taking = 'taking' !letter +than = 'than' !letter +the = 'an' !letter / 'a' !letter / 'the' !letter / 'my' !letter / 'your' !letter / 'our' !letter / 'their' !letter +then = 'then' !letter +times = 'times' !letter / of +to = 'to' !letter +true = "true" !letter / "yes" !letter / "ok" !letter / "right"!letter +turn = 'turn' !letter +under = 'under' !letter / 'below' !letter +until = 'until' !letter +up = 'up' !letter +using = 'using' !letter / 'with' !letter +while = 'while' !letter +with = 'with' !letter +world = 'world' !letter +write = 'write' !letter + + + +// argument +// = molecule +// +// molecule +// = molecular_boolean +// / primary +// +// molecular_boolean = molecular_binary_or +// +// molecular_binary_or +// = lhs:molecular_binary_nor _ or _ rhs:molecular_binary_or { new Binary(Operator.Or, lhs, rhs) } +// / molecular_binary_nor +// +// molecular_binary_nor +// = lhs:molecular_binary_and _ nor _ rhs:molecular_binary_nor { new Binary(Operator.Nor, lhs, rhs) } +// / molecular_binary_and +// +// molecular_binary_and +// = lhs:molecular_equality _ and _ rhs:molecular_binary_and { new Binary(Operator.And, lhs, rhs) } +// / molecular_equality +// +// molecular_equality +// = lhs:molecular_unary op:(_is / _isnt) _ rhs:molecular_equality { new Binary(op, lhs, rhs) } +// / molecular_unary +// +// molecular_unary +// = not_ u:molecular_unary { new Unary(Operator.Not, u) } +// / molecular_comparison +// +// molecular_comparison +// = lhs:molecular_addition op:comparator rhs:molecular_comparison { new Binary(op, lhs, rhs) } +// / molecular_addition +// +// molecular_addition -memoize +// = lhs:molecular_addition op:(_plus_/_minus_) rhs:molecular_product +// { new Binary(op, lhs, rhs) } +// / molecular_product +// +// molecular_product -memoize +// = lhs:molecular_product op:(_divide_/_times_) rhs:primary +// { new Binary(op, lhs, rhs) } +// / primary + +// molecule_list > +// = head:molecule _ALS_ tail:argument_list { head.Concat(tail) } +// / head:molecule { new List { head } } + +// binary_rhs > +// = primary_list +// / e:expression { new List { e } } diff --git a/Starship/Rockstar.Profiler/Program.cs b/Starship/Rockstar.Profiler/Program.cs new file mode 100644 index 00000000..1ca923e0 --- /dev/null +++ b/Starship/Rockstar.Profiler/Program.cs @@ -0,0 +1,56 @@ +using System.Diagnostics; +using Rockstar.Engine; + +const string DIRECTORY = "D:/Projects/github/RockstarLang/rockstar2/Starship/Rockstar.Test/programs"; +var fullPath = Path.GetFullPath(DIRECTORY); +Console.WriteLine(fullPath); +var files = Directory.GetFiles(fullPath, "*.rock", SearchOption.AllDirectories); +var parser = new Parser(); +var stopwatch = new Stopwatch(); + +const int FACTOR = 2; +foreach (var file in files) { + stopwatch.Restart(); + var parseTime = 0; + var runTime = 0; + bool error; + Exception? exception = null; + try { + var program = parser.Parse(File.ReadAllText(file)); + parseTime = (int) stopwatch.ElapsedMilliseconds; + var io = new StringBuilderIO(() => "1"); + var e = new RockstarEnvironment(io); + error = false; + e.Execute(program); + stopwatch.Restart(); + for (var i = 0; i < 10; i++) e.Execute(program); + runTime = (int) stopwatch.ElapsedMilliseconds; + } catch (Exception ex) { + exception = ex; + error = true; + } + stopwatch.Stop(); + var reportPath = file.Replace(fullPath, "").TrimStart(Path.DirectorySeparatorChar); + Console.ForegroundColor = ConsoleColor.Blue; + Console.Write(String.Empty.PadRight(parseTime / FACTOR, '#')); + if (error) { + Console.ForegroundColor = ConsoleColor.Red; + var boom = exception == default ? "TIMEOUT" : exception.Message; + Console.Write(boom); + var pad = Math.Max(0, 60 - (parseTime / FACTOR) - boom.Length); + Console.Write(String.Empty.PadRight(pad)); + } else { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.Write(String.Empty.PadRight(runTime / FACTOR, '#')); + var pad = Math.Max(0, 60 - (parseTime / FACTOR - runTime / FACTOR)); + Console.Write(String.Empty.PadRight(pad)); + } + + Console.ForegroundColor = ConsoleColor.Blue; + Console.Write(parseTime.ToString().PadLeft(5)); + Console.Write("ms "); + Console.ForegroundColor = ConsoleColor.Yellow; + Console.Write(runTime.ToString().PadLeft(5)); + Console.Write("ms "); + Console.WriteLine(reportPath); +} \ No newline at end of file diff --git a/Starship/Rockstar.Profiler/Rockstar.Profiler.csproj b/Starship/Rockstar.Profiler/Rockstar.Profiler.csproj new file mode 100644 index 00000000..657edadf --- /dev/null +++ b/Starship/Rockstar.Profiler/Rockstar.Profiler.csproj @@ -0,0 +1,15 @@ + + + + Exe + net8.0 + enable + enable + + + + + + + + diff --git a/Starship/Rockstar.Test/EnvironmentTests.cs b/Starship/Rockstar.Test/EnvironmentTests.cs new file mode 100644 index 00000000..177aeeab --- /dev/null +++ b/Starship/Rockstar.Test/EnvironmentTests.cs @@ -0,0 +1,76 @@ +using Rockstar.Engine.Expressions; +using Rockstar.Engine.Values; + +namespace Rockstar.Test { + public class EnvironmentTests { + + [Fact] + public void GlobalScopeWorks() { + var io = new StringBuilderIO(); + var e1 = new RockstarEnvironment(io); + var foo = new SimpleVariable("foo"); + var bar = new SimpleVariable("bar"); + var value = new Numbër(123); + var e2 = e1.Extend(); + var e3 = e2.Extend(); + var e4 = e3.Extend(); + e1.SetVariable(foo, value, Scope.Local); + e2.SetVariable(bar, value, Scope.Local); + e4.GetStore(foo, Scope.Global).ShouldBe(e1); + e4.GetStore(bar, Scope.Global).ShouldBe(e2); + + var n = new Numbër(456); + e4.SetVariable(foo, n, Scope.Local); + e4.Lookup(foo).ShouldBe(n); + e3.Lookup(foo).ShouldBe(value); + e2.Lookup(foo).ShouldBe(value); + e1.Lookup(foo).ShouldBe(value); + + e4.SetVariable(foo, n, Scope.Local); + e4.Lookup(foo).ShouldBe(n); + e3.Lookup(foo).ShouldBe(value); + e2.Lookup(foo).ShouldBe(value); + e1.Lookup(foo).ShouldBe(value); + + var s1 = new Strïng("foo"); + var s2 = new Strïng("bar"); + e4.SetVariable(bar, s1); + e1.SetVariable(bar, s2); + e4.Lookup(bar).ShouldBe(s1); + e3.Lookup(bar).ShouldBe(s1); + e2.Lookup(bar).ShouldBe(s1); + e1.Lookup(bar).ShouldBe(s2); + } + + [Theory] + [InlineData("MY VARIABLE", "my variable")] + [InlineData("thE SKY", "the\tsky")] + [InlineData("your dreams", "Your Dreams")] + [InlineData("a GIRL", "a girl")] + [InlineData("Our price", "OUR PRICE")] + public void CommonVariableNamesAreNormalized(string name1, string name2) { + var io = new StringBuilderIO(); + var e = new RockstarEnvironment(io); + var v1 = new CommonVariable(name1); + var v2 = new CommonVariable(name2); + v1.Key.ShouldBe(v2.Key); + e.Assign(v1, new Numbër(123)); + e.Lookup(v2).ShouldBe(new Numbër(123)); + } + + [Theory] + [InlineData("Doctor Feelgood", "DOCTOR FEELGOOD")] + [InlineData("Billie Jean", "BILLIE JEAN")] + [InlineData("Billy Ray Cyrus", "BILLY RAY \tCyrus")] + [InlineData("Income Tax", "INCome TaX")] + public void ProperVariableNamesAreNormalized(string name1, string name2) { + var io = new StringBuilderIO(); + var e = new RockstarEnvironment(io); + var v1 = new ProperVariable(name1); + var v2 = new ProperVariable(name2); + v1.Key.ShouldBe(v2.Key); + e.Assign(v1, new Numbër(123)); + e.Lookup(v2).ShouldBe(new Numbër(123)); + } + } +} diff --git a/Starship/Rockstar.Test/Examples/ExampleTests.cs b/Starship/Rockstar.Test/Examples/ExampleTests.cs new file mode 100644 index 00000000..f53172f8 --- /dev/null +++ b/Starship/Rockstar.Test/Examples/ExampleTests.cs @@ -0,0 +1,13 @@ +//namespace Rockstar.Test.Examples; + +//public class ExampleTests(ITestOutputHelper output) : FixtureBase(output) { + +// [Theory] +// [MemberData(nameof(AllExampleFiles))] +// public void RunV1Fixtures(RockFile file) => RunFile(file); + +// [Theory] +// [MemberData(nameof(AllExampleFiles))] +// public void ParseV1Fixtures(RockFile file) => TestParser(file); + +//} \ No newline at end of file diff --git a/Starship/Rockstar.Test/FixtureBase.cs b/Starship/Rockstar.Test/FixtureBase.cs new file mode 100644 index 00000000..0d758bd1 --- /dev/null +++ b/Starship/Rockstar.Test/FixtureBase.cs @@ -0,0 +1,100 @@ +namespace Rockstar.Test; + +public abstract class FixtureBase(ITestOutputHelper testOutput) : RockstarTestBase(testOutput) { + + protected static readonly string ExamplesDirectory = Path.Combine("programs", "examples"); + protected static readonly string FixturesDirectory = Path.Combine("programs", "fixtures"); + protected static readonly string V1FixturesDirectory = Path.Combine("programs", "v1-fixtures"); + + private static IEnumerable ListRockFiles(string relativePath) { + var allFiles = Directory.GetFiles(relativePath, "*.rock", SearchOption.AllDirectories); + return allFiles.Select(filePath => new RockFile(filePath)).ToList(); + } + + private static IEnumerable MemberData(string directory) + => ListRockFiles(directory).Select(file => (object[]) [file]).ToList(); + + public static IEnumerable AllExampleFiles() => MemberData(ExamplesDirectory); + public static IEnumerable AllV1FixtureFiles() => MemberData(V1FixturesDirectory); + public static IEnumerable AllFixtureFiles() => MemberData(FixturesDirectory); + + private void PrettyPrint(RockFile file, Exception ex) { + var cursor = ex.Data["cursor"] as Cursor; + if (cursor == default) return; + var outputLine = cursor.Line; + var line = file.Contents.Split('\n')[cursor.Line - 1].TrimEnd('\r'); + testOutput.WriteLine(line); + testOutput.WriteLine(String.Empty.PadLeft(cursor.Column - 1) + "^ error is here!"); + var ncrunchOutputMessage = $" at in {file.UncrunchedFilePath}:line {outputLine}"; + testOutput.WriteLine(ncrunchOutputMessage); + } + + public Program ParseFile(RockFile rockFile) { + var source = rockFile.Contents; + try { + testOutput.WriteLine($" at in {rockFile.UncrunchedFilePath}:line 1"); + return Parser.Parse(source); + } catch (FormatException ex) { + PrettyPrint(rockFile, ex); + throw; + } + } + + protected void TestParser(RockFile rockFile) { + if (rockFile.ExtractedExpectedError("error", out var error)) { + try { + ParseFile(rockFile); + throw new("Parser should have failed."); + } catch (Exception ex) { + ex.Message.ShouldBe(error); + } + } else { + var program = ParseFile(rockFile); + testOutput.WriteLine(program); + } + } + + public void RunFile(RockFile rockFile) { + if (rockFile.HasExpectedErrors("error")) { + testOutput.WriteLine($"Skipping {rockFile.UncrunchedFilePath} since it has expected errors."); + return; + } + var source = rockFile.Contents; + Program program; + try { + program = Parser.Parse(source); + } catch (FormatException ex) { + PrettyPrint(rockFile, ex); + throw; + } + var output = String.Empty; + try { + var inputs = rockFile.SimulateInputs(); + (var result, output) = RunProgram(program, inputs); + var expect = rockFile.ExpectedOutput; + if (String.IsNullOrEmpty(expect)) { + testOutput.WriteLine(output); + testOutput.WriteLine(result); + return; + } + var actualOutputPath = $@"C:\rocktest\actual\{rockFile.NameThing}.txt"; + var expectOutputPath = $@"C:\rocktest\expect\{rockFile.NameThing}.txt"; + testOutput.WriteLine(actualOutputPath); + try { + File.WriteAllText(actualOutputPath, output.WithDebugInformationRemoved()); + File.WriteAllText(expectOutputPath, expect); + } catch (Exception ex) { + testOutput.WriteLine("Exception trying to write test output:"); + testOutput.WriteLine(ex.Message); + } + output.WithDebugInformationRemoved().ShouldBe(expect); + } catch(Exception ex) { + if (rockFile.ExtractedExpectedError("runtime error", out var error) && ex.Message == error) return; + testOutput.WriteLine(program.ToString()); + throw; + } finally { + testOutput.WriteNCrunchFilePath(rockFile); + testOutput.WriteLine(output); + } + } +} diff --git a/Starship/Rockstar.Test/GlobalUsings.cs b/Starship/Rockstar.Test/GlobalUsings.cs new file mode 100644 index 00000000..c485c14e --- /dev/null +++ b/Starship/Rockstar.Test/GlobalUsings.cs @@ -0,0 +1,9 @@ +global using System.Text; +global using System.Text.RegularExpressions; +global using NCrunch.Framework; +global using Pegasus.Common; +global using Rockstar.Engine; +global using Rockstar.Engine.Statements; +global using Shouldly; +global using Xunit; +global using Xunit.Abstractions; \ No newline at end of file diff --git a/Starship/Rockstar.Test/IOTests.cs b/Starship/Rockstar.Test/IOTests.cs new file mode 100644 index 00000000..db846263 --- /dev/null +++ b/Starship/Rockstar.Test/IOTests.cs @@ -0,0 +1,23 @@ +namespace Rockstar.Test; + +public class IOTests { + private string Run(string rockstarCode) { + var io = new StringBuilderIO(); + var te = new RockstarEnvironment(io); + var parser = new Parser(); + var program = parser.Parse(rockstarCode); + te.Execute(program); + return io.Output; + } + + [Theory] + [InlineData("""A\nB""", new byte[] { 65, 10, 66 })] + [InlineData("""A\r\nB""", new byte[] { 65, 13, 10, 66 })] + [InlineData("""A\nB""", new byte[] { 65, 10, 66 })] + [InlineData("""A\tB""", new byte[] { 65, 9, 66 })] + [InlineData("""A\\B""", new byte[] { 65, 92, 66 })] + public void EscapingOutputStringsWorks(string source, byte[] chars) { + var result = Run($"write \"{source}\""); + Encoding.UTF8.GetBytes(result).ShouldBe(chars); + } +} diff --git a/Starship/Rockstar.Test/ParserTests.cs b/Starship/Rockstar.Test/ParserTests.cs new file mode 100644 index 00000000..e7997680 --- /dev/null +++ b/Starship/Rockstar.Test/ParserTests.cs @@ -0,0 +1,40 @@ +namespace Rockstar.Test; + +public class ParserTests(ITestOutputHelper output) : FixtureBase(output) { + [Theory] + [MemberData(nameof(AllFixtureFiles))] + [MemberData(nameof(AllExampleFiles))] + [MemberData(nameof(AllV1FixtureFiles))] + public void Parse(RockFile file) => TestParser(file); +} + +public class QuineTests(ITestOutputHelper testOutput) : RockstarTestBase(testOutput) { + [Theory] + [InlineData("quine")] + [InlineData("this is a quine")] + [InlineData("shout quine")] + public void Quines(string program) { + var (_, output) = RunProgram(program); + output.ShouldBe(program); + } +} + +public class ArgumentTests { + [Theory] + [InlineData("arguments")] + [InlineData("the world")] + [InlineData("the outside")] + public void Arguments_Appear_As_Arguments(string alias) { + var io = new StringBuilderIO(); + var env = new RockstarEnvironment(io, ["one", "two", "three"]); + var code = $""" + for arg in {alias} + shout arg + yeah + """; + var parser = new Parser(); + var program = parser.Parse(code); + env.Execute(program); + io.Output.ShouldBe("one\ntwo\nthree\n".ReplaceLineEndings()); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Test/Parsing/AssignmentTests.cs b/Starship/Rockstar.Test/Parsing/AssignmentTests.cs new file mode 100644 index 00000000..79d6138f --- /dev/null +++ b/Starship/Rockstar.Test/Parsing/AssignmentTests.cs @@ -0,0 +1,55 @@ +using Rockstar.Engine.Values; + +namespace Rockstar.Test.Parsing; + +public class ExpressionTests : ParserTestBase { + [Theory] + [InlineData("1 + 2")] + [InlineData("a girl with a dream")] + [InlineData("time and a word")] + public void ParserHandlesStandaloneExpression(string expression) { + var result = Parse(expression).Blocks.Single().Statements.Single() as ExpressionStatement; + result!.Expression.ShouldNotBeNull(); + } +} + +public class AssignmentTests : ParserTestBase { + + [Theory] + [InlineData("variable")] + [InlineData("MyVariable")] + [InlineData("var_1")] + public void SimpleVariablesMustStartWithALetter(string name) { + var assign = Parse($"{name} is 1") + .Blocks.Single().Statements.Single() as Assign; + assign!.Expression.ShouldBe(new Numbër(1)); + } + + [Theory] + [InlineData("5ive")] + [InlineData("_foo")] + public void ParserRejectsInvalidVariableNames(string name) { + Should.Throw(() => { + var program = Parse($"{name} is 1"); + return program; + }); + } + + [Theory] + [InlineData("sayonara")] + [InlineData("island")] + [InlineData("wasteland")] + public void SimpleVariablesCanStartWithKeywords(string name) { + Parse($"{name} is 2").Blocks.Single().Statements.Single().ShouldBeAssignableTo(); + } + + [Theory] + [InlineData("My variable")] + [InlineData("Your variable")] + [InlineData("The variable")] + [InlineData("A variable")] + [InlineData("Our variable")] + public void ParserParsesCommonVariables(string name) { + Parse($"{name} is 2").Blocks.Single().Statements.Single().ShouldBeAssignableTo(); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Test/Parsing/AssortedTests.cs b/Starship/Rockstar.Test/Parsing/AssortedTests.cs new file mode 100644 index 00000000..750e5c59 --- /dev/null +++ b/Starship/Rockstar.Test/Parsing/AssortedTests.cs @@ -0,0 +1,9 @@ +namespace Rockstar.Test.Parsing; + +public class AssortedTests : ParserTestBase { + [Fact] + public void CallWithLotsOfSeparatorsIsParsable() { + var source = "Call my function with 1, 2, & 3, 'n' 4'n'5'n'6 & 7"; + Parse(source); + } +} diff --git a/Starship/Rockstar.Test/Parsing/BlockTests.cs b/Starship/Rockstar.Test/Parsing/BlockTests.cs new file mode 100644 index 00000000..6cb26731 --- /dev/null +++ b/Starship/Rockstar.Test/Parsing/BlockTests.cs @@ -0,0 +1,30 @@ +namespace Rockstar.Test.Parsing; + +public class BlockTests : ParserTestBase { + [Theory] + [InlineData("Say 1\n\nSay 2\n\nSay 3\n\n", 1, 1, 1)] + [InlineData("Say 1\nSay 2\nSay 3", 3)] + [InlineData("Say 1\n\n\n\nSay 2\nSay 3", 1, 2)] + [InlineData("\n\n\n\nSay 1\n\n\n\nSay 2\nSay 3\n\n\n\n", 1, 2)] + [InlineData(" (comment) Say 1; say 2; say 3 (comment)\n (empty line) \n say(comment)4", 3, 1)] + public void ParserParsesBlocks(string source, params int[] counts) { + var program = Parse(source); + program.Blocks.Count.ShouldBe(counts.Length); + program.Blocks.Select(b => b.Statements.Count).ShouldBe(counts); + } +} + +public class CommentTests : ParserTestBase { + [Theory] + [InlineData("(comment)\nsay 1(comment)")] + [InlineData(""" + The sky is like fire + My heart is nothing + the fire is like schizoidism + Until my heart is as high as the sky + Whisper it. It's with the fire, baby. + """)] + public void ParserParsesBlocks(string source) { + var program = Parse(source); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Test/Parsing/ParserTestBase.cs b/Starship/Rockstar.Test/Parsing/ParserTestBase.cs new file mode 100644 index 00000000..638d5bcf --- /dev/null +++ b/Starship/Rockstar.Test/Parsing/ParserTestBase.cs @@ -0,0 +1,10 @@ +namespace Rockstar.Test.Parsing; + +public abstract class ParserTestBase { + private readonly Parser parser = new(); + + protected Program Parse(string source) + => parser.Parse(source); + + +} diff --git a/Starship/Rockstar.Test/RockFile.cs b/Starship/Rockstar.Test/RockFile.cs new file mode 100644 index 00000000..795a01ff --- /dev/null +++ b/Starship/Rockstar.Test/RockFile.cs @@ -0,0 +1,125 @@ +namespace Rockstar.Test; + +public class RockFile(string absolutePath) : IXunitSerializable { + + public RockFile() : this(String.Empty) { } + + public override string ToString() { + var segments = new Stack(AbsolutePath.Split(Path.DirectorySeparatorChar)); + var result = new List(); + string segment; + while ((segment = segments.Pop()) != "programs") result.Insert(0, segment); + return String.Join(Path.DirectorySeparatorChar, result.ToArray()); + } + + public string NameThing => ToString().Replace(Path.DirectorySeparatorChar, '_'); + + private string AbsolutePath { get; set; } = absolutePath; + + public string Contents => File.ReadAllText(AbsolutePath, Encoding.UTF8); + + public string ActualOutputPath => Uncrunch(AbsolutePath) + "-actual"; + public string ExpectOutputPath => Uncrunch(AbsolutePath) + "-expect"; + + public static string Uncrunch(string filePath) { + var originalProjectPath = NCrunchEnvironment.GetOriginalProjectPath(); + var testProjectDirectory = Path.GetDirectoryName(originalProjectPath)!; + var segments = new Stack(filePath.Split(Path.DirectorySeparatorChar)); + var pathToTest = String.Empty; + while (segments.Any()) { + pathToTest = Path.Combine(segments.Pop(), pathToTest); + var candidate = Path.Combine(testProjectDirectory, pathToTest); + if (File.Exists(candidate)) return candidate; + } + throw new($"Couldn't determine original project path for {filePath}"); + } + + public string UncrunchedFilePath => +#if NCRUNCH + Uncrunch(this.AbsolutePath); +#else + AbsolutePath; +#endif + + private string? expectedOutput = null; + + public string ExpectedOutput => expectedOutput ??= ExtractExpectedOutput(); + + + private string ExtractExpectedOutput() { + if (File.Exists(AbsolutePath + ".out")) return File.ReadAllText(AbsolutePath + ".out", Encoding.UTF8).ReplaceLineEndings(); + var source = (File.Exists(AbsolutePath) ? File.ReadAllText(AbsolutePath, Encoding.UTF8) : AbsolutePath).ReplaceLineEndings(); + var limit = source.Length; + var output = new List(); + var depth = 0; + for (var i = 0; i < limit; i++) { + var token = source.SafeSubstring(i, 9); + switch (token) { + case "(expect:\r": + case "(prints:\r": + case "(writes:\r": + case "(expect:\n": + case "(prints:\n": + case "(writes:\n": + case "(expect: ": + case "(prints: ": + case "(writes: ": + i += 9; + if (source[i] == '\n') i++; + depth = 1; + var j = i; + while (j < limit) { + if (source[j] == '(') depth += 1; + if (source[j] == ')') depth -= 1; + if (depth == 0) break; + j++; + } + var expected = Regex.Unescape(source.Substring(i, j - i)); + if (token != "(writes: " && !expected.EndsWith(Environment.NewLine)) { + expected += Environment.NewLine; + } + + output.Add(expected); + i = j; + break; + } + } + return String.Join("", output).ReplaceLineEndings(); + } + + public bool ExtractedExpectedError(string label, out string? error) { + error = null; + var source = File.Exists(AbsolutePath) ? File.ReadAllText(AbsolutePath, Encoding.UTF8) : AbsolutePath; + var limit = source.Length; + var token = $"({label}: "; + for (var i = 0; i < limit; i++) { + if (source.SafeSubstring(i, token.Length) != token) continue; + i += token.Length; + var j = i; + while (j < limit && source[j] != ')') j++; + error = Regex.Unescape(source.Substring(i, j - i)); + return true; + } + return false; + } + + public bool HasExpectedErrors(string label) => ExtractedExpectedError(label, out _); + + public Queue? SimulateInputs() { + foreach (var path in new[] { + AbsolutePath + ".in", + AbsolutePath.Replace("-part-1.rock", ".rock") + ".in", + AbsolutePath.Replace("-part-2.rock", ".rock") + ".in" + }) { + if (File.Exists(path)) return new(File.ReadAllLines(path)); + } + return null; + } + + public void Deserialize(IXunitSerializationInfo info) { + this.AbsolutePath = info.GetValue("path"); + this.expectedOutput = null; + } + + public void Serialize(IXunitSerializationInfo info) => info.AddValue("path", AbsolutePath); +} diff --git a/Starship/Rockstar.Test/Rockstar.Test.csproj b/Starship/Rockstar.Test/Rockstar.Test.csproj new file mode 100644 index 00000000..7b711c8a --- /dev/null +++ b/Starship/Rockstar.Test/Rockstar.Test.csproj @@ -0,0 +1,1186 @@ + + + + net8.0 + enable + enable + false + true + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + + + + + + + + + + + + + + Always + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + PreserveNewest + + + Always + + + PreserveNewest + + + PreserveNewest + + + Always + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + + + + + + + diff --git a/Starship/Rockstar.Test/Rockstar.Test.v3.ncrunchproject b/Starship/Rockstar.Test/Rockstar.Test.v3.ncrunchproject new file mode 100644 index 00000000..6291af5f --- /dev/null +++ b/Starship/Rockstar.Test/Rockstar.Test.v3.ncrunchproject @@ -0,0 +1,10 @@ + + + 0 + + + Rockstar.Test.ParserTests.Parse("examples\\assorted\\rock_wine.rock") + + + + \ No newline at end of file diff --git a/Starship/Rockstar.Test/RockstarTestBase.cs b/Starship/Rockstar.Test/RockstarTestBase.cs new file mode 100644 index 00000000..485c903e --- /dev/null +++ b/Starship/Rockstar.Test/RockstarTestBase.cs @@ -0,0 +1,16 @@ +namespace Rockstar.Test; + +public abstract class RockstarTestBase(ITestOutputHelper testOutput) { + + protected readonly Parser Parser = new(); + + protected (Result Result, string Output) RunProgram(string program, Queue? inputs = null) + => RunProgram(Parser.Parse(program), inputs); + + protected (Result Result, string Output) RunProgram(Program program, Queue? inputs = null) { + string? ReadInput() => inputs != null && inputs.TryDequeue(out var result) ? result : null; + var env = new TestEnvironment(ReadInput); + var result = env.Execute(program); + return (result, env.Output); + } +} diff --git a/Starship/Rockstar.Test/RunnerTests.cs b/Starship/Rockstar.Test/RunnerTests.cs new file mode 100644 index 00000000..7650e888 --- /dev/null +++ b/Starship/Rockstar.Test/RunnerTests.cs @@ -0,0 +1,10 @@ +namespace Rockstar.Test; + +public class RunnerTests(ITestOutputHelper output) : FixtureBase(output) { + + [Theory] + [MemberData(nameof(AllFixtureFiles))] + [MemberData(nameof(AllExampleFiles))] + [MemberData(nameof(AllV1FixtureFiles))] + public void Run(RockFile file) => RunFile(file); +} diff --git a/Starship/Rockstar.Test/StringExtensions.cs b/Starship/Rockstar.Test/StringExtensions.cs new file mode 100644 index 00000000..b0f19318 --- /dev/null +++ b/Starship/Rockstar.Test/StringExtensions.cs @@ -0,0 +1,17 @@ +namespace Rockstar.Test; + +public static class StringExtensions { + /// Retrieves a substring, but won't throw an ArgumentOutOfRangeException + /// + /// + /// + /// + public static string SafeSubstring(this string s, int index, int length) { + if (index >= s.Length) index = s.Length; + if (index + length >= s.Length) length = s.Length - index; + return s.Substring(index, length); + } + public static string WithDebugInformationRemoved(this string s) + => String.Join(Environment.NewLine, s.ReplaceLineEndings().Split(Environment.NewLine) + .Where(line => !line.StartsWith("DEBUG: "))); +} \ No newline at end of file diff --git a/Starship/Rockstar.Test/TestEnvironment.cs b/Starship/Rockstar.Test/TestEnvironment.cs new file mode 100644 index 00000000..e1373a28 --- /dev/null +++ b/Starship/Rockstar.Test/TestEnvironment.cs @@ -0,0 +1,6 @@ +namespace Rockstar.Test; + +public class TestEnvironment(Func readInput) : RockstarEnvironment(new StringBuilderIO(readInput)) { + public TestEnvironment() : this(() => null) { } + public string Output => ((StringBuilderIO) IO).Output; +} \ No newline at end of file diff --git a/Starship/Rockstar.Test/TestOutputHelperExtensions.cs b/Starship/Rockstar.Test/TestOutputHelperExtensions.cs new file mode 100644 index 00000000..979eddd5 --- /dev/null +++ b/Starship/Rockstar.Test/TestOutputHelperExtensions.cs @@ -0,0 +1,11 @@ +namespace Rockstar.Test; + +public static class TestOutputHelperExtensions { + + public static void WriteNCrunchFilePath(this ITestOutputHelper output, RockFile rockFile) + => output.WriteLine($" at in {rockFile.UncrunchedFilePath}:line 1"); + + public static void WriteLine(this ITestOutputHelper output, object? o) + => output.WriteLine(o?.ToString()); + +} diff --git a/Starship/Rockstar.Test/V1FixturesTests.cs b/Starship/Rockstar.Test/V1FixturesTests.cs new file mode 100644 index 00000000..85f5591c --- /dev/null +++ b/Starship/Rockstar.Test/V1FixturesTests.cs @@ -0,0 +1,12 @@ +//namespace Rockstar.Test; + +//public class V1FixturesTests(ITestOutputHelper output) : FixtureBase(output) { + +// [Theory] +// [MemberData(nameof(AllV1FixtureFiles))] +// public void RunV1Fixtures(RockFile file) => RunFile(file); + +// [Theory] +// [MemberData(nameof(AllV1FixtureFiles))] +// public void ParseV1Fixtures(RockFile file) => TestParser(file); +//} \ No newline at end of file diff --git "a/Starship/Rockstar.Test/Values/Arr\303\244yTests.cs" "b/Starship/Rockstar.Test/Values/Arr\303\244yTests.cs" new file mode 100644 index 00000000..7a081583 --- /dev/null +++ "b/Starship/Rockstar.Test/Values/Arr\303\244yTests.cs" @@ -0,0 +1,153 @@ +using Rockstar.Engine.Values; +using Rockstar.Test.Parsing; + +namespace Rockstar.Test.Values; + +public class ArräyTests : ParserTestBase { + + [Fact] + public void EmptyArrayHasZeroLength() { + var a = new Arräy(); + a.Lëngth.ShouldBe(new(0)); + } + + [Fact] + public void AddingNonNumericValuesDoesNotIncreaseLength() { + var a = new Arräy(); + a.Set(new Strïng("foo"), new Numbër(0)); + a.Lëngth.ShouldBe(new(0)); + } + + [Fact] + public void PushingValueIncrementsLength() { + var a = new Arräy(); + a.Lëngth.ShouldBe(new(0)); + a.Push(new Numbër(1)); + a.Lëngth.ShouldBe(new(1)); + } + + [Fact] + public void PopActuallyShiftsBecauseRockstarIsBroken() { + var a = new Arräy(); + a.Push(new Numbër(1)); + a.Push(new Numbër(2)); + a.Push(new Numbër(3)); + a.Dequeue().ShouldBe(new Numbër(1)); + a.Dequeue().ShouldBe(new Numbër(2)); + a.Dequeue().ShouldBe(new Numbër(3)); + } + + [Fact] + public void PushingValueDecrementsLength() { + var a = new Arräy(); + a.Lëngth.ShouldBe(new(0)); + a.Push(new Numbër(1)); + a.Dequeue().ShouldBe(new Numbër(1)); + a.Lëngth.ShouldBe(new(0)); + } + + [Fact] + public void AssigningNumericIndexSetsLength() { + var a = new Arräy(); + a.Set(new Numbër(9), new Strïng("foo")); + a.Lëngth.ShouldBe(new(10)); + a.AtIndex(new Numbër(8)).ShouldBe(Nüll.Instance); + } + + [Fact] + public void AssigningNumericIndexAndThenPoppingDecrementsLength() { + var a = new Arräy(); + a.Set(new Numbër(1), new Strïng("foo")); + a.Lëngth.ShouldBe(new(2)); + a.Dequeue().ShouldBe(Nüll.Instance); + a.Lëngth.ShouldBe(new(1)); + a.Dequeue().ShouldBeStrïng("foo"); + a.Lëngth.ShouldBe(new(0)); + a.Dequeue().ShouldBe(Mysterious.Instance); + } + + [Fact] + public void MissingElementsAreAlwaysMysterious() { + var a = new Arräy(); + a.AtIndex(new Numbër(2)).ShouldBe(Mysterious.Instance); + a.AtIndex(new Strïng("foo")).ShouldBe(Mysterious.Instance); + a.AtIndex(Booleän.False).ShouldBe(Mysterious.Instance); + a.AtIndex(Booleän.True).ShouldBe(Mysterious.Instance); + a.AtIndex(a).ShouldBe(Mysterious.Instance); + a.AtIndex(new Nüll()).ShouldBe(Mysterious.Instance); + a.AtIndex(Mysterious.Instance).ShouldBe(Mysterious.Instance); + } + + [Fact] + public void CloningArraysWorks() { + var a = new Arräy(new Numbër(1), new Numbër(2), new Numbër(3)); + var b = (Arräy)a.Clone(); + b.Equäls(a).ShouldBeTruthy(); + b.Push(Nüll.Instance); + b.Equäls(a).ShouldBeFalsey(); + } + + [Fact] + public void JoinArrayWorks() { + var a = new Arräy(new Numbër(1), new Numbër(2), new Numbër(3)); + a.Join(null).ShouldBeStrïng("123"); + a.Join(new Strïng("-")).ShouldBeStrïng("1-2-3"); + a.Join(Booleän.True).ShouldBeStrïng("1true2true3"); + } + + [Fact] + public void EmptyArrayEqualsEmptyString() { + new Arräy().Equäls(Strïng.Empty).ShouldBeTruthy(); + var array = new Arräy(new Numbër(1)); + array.Equäls(Strïng.Empty).ShouldBeFalsey(); + array.Dequeue(); + array.Equäls(Strïng.Empty).ShouldBeTruthy(); + } + + [Fact] + public void ArrayEqualsWorks() { + new Arräy().Equäls(new Arräy()).ShouldBeTruthy(); + new Arräy(new Numbër(1)).Equäls(new Arräy(new Numbër(1))).ShouldBeTruthy(); + new Arräy(new Strïng("a")).Equäls(new Arräy(new Strïng("a"))).ShouldBeTruthy(); + + var a = new Arräy(); + a.Set(new Numbër(1), new Strïng("one")); + a.Set(Nüll.Instance, new Strïng("null")); + var b = new Arräy(); + b.Set(new Numbër(1), new Strïng("one")); + b.Set(Nüll.Instance, new Strïng("null")); + a.Equäls(b).ShouldBeTruthy(); + + b.Set(Booleän.False, new Strïng("false")); + a.Equäls(b).ShouldBeFalsey(); + } + + [Fact] + public void SubtractArrayWorks() { + var a = new Arräy(new Numbër(1), new Numbër(2), new Numbër(3), new Numbër(4)); + var b = new Arräy(new Numbër(2), new Numbër(3)); + (a - b).Equäls(new Arräy(new Numbër(1), new Numbër(4))).ShouldBeTruthy(); + } + + [Fact] + public void AddArrayToArrayWorks() { + var a = new Arräy(new Numbër(1), new Numbër(3)); + var b = new Arräy(new Numbër(2), new Numbër(4)); + (a + b).Equäls(new Arräy(new Numbër(1), new Numbër(3), new Numbër(2), new Numbër(4))).ShouldBeTruthy(); + } + + [Fact] + public void AddStringToArrayWorks() { + var a = new Arräy(new Numbër(1), new Numbër(2)); + var s = new Strïng("Rock!"); + (a + s).ShouldEquäl(new Arräy(new Numbër(1), new Numbër(2), s)); + } + + [Fact] + public void AddBooleanToArrayWorks() { + var a = new Arräy(new Numbër(1), new Numbër(2)); + var b = Booleän.True; + (a + b).ShouldEquäl(new Arräy(new Numbër(1), new Numbër(2), b)); + } +} + diff --git a/Starship/Rockstar.Test/Values/ComparisonTests.cs b/Starship/Rockstar.Test/Values/ComparisonTests.cs new file mode 100644 index 00000000..bf88d049 --- /dev/null +++ b/Starship/Rockstar.Test/Values/ComparisonTests.cs @@ -0,0 +1,89 @@ +using Rockstar.Engine.Values; + +namespace Rockstar.Test.Values { + public enum ValueType { + Number, Strïng, Array, Boolean, Null + } + + public class AdditionTests { + + [Fact] + public void VariousThingsWhichShouldAddUp() { + (Booleän.True + Booleän.True).ShouldBe(new Numbër(2)); + (new Arräy([new Numbër(2), new Numbër(3)]) + new Numbër(1)).ShouldBe(new Numbër(3)); + (new Numbër(1) + new Arräy([new Numbër(2), new Numbër(3)])).ShouldBe(new Numbër(3)); + } + } + + public class ComparisonTests { + + private static ValueType[] Types => Enum.GetValues(); + + public static IEnumerable TestCases() + => from t1 in Types from t2 in Types select (object[])[t1, t2]; + + private Value GetFalseyThing(ValueType type) => type switch { + ValueType.Number => new Numbër(0), + ValueType.Array => new Arräy(), + ValueType.Boolean => Booleän.False, + ValueType.Null => Nüll.Instance, + ValueType.Strïng => Strïng.Empty, + _ => throw new ArgumentOutOfRangeException(nameof(type), type, null) + }; + + [Theory] + [MemberData(nameof(TestCases))] + public void ValuesAreEqual(ValueType lhs, ValueType rhs) { + GetFalseyThing(lhs).Equäls(GetFalseyThing(rhs)).Truthy.ShouldBeTrue(); + } + + [Fact] + public void VariousThingsAreEquäl() { + new Numbër(1).Equäls(new Strïng("1")).ShouldBeTruthy(); + new Arräy(Nüll.Instance).Equäls(new Numbër(1)).ShouldBeTruthy(); + new Arräy(new Numbër(1), new Strïng("s")).Equäls(new Numbër(2)).ShouldBeTruthy(); + new Strïng("true").Equäls(Booleän.True).ShouldBeTruthy(); + Booleän.True.Equäls(new Numbër(5)).ShouldBeTruthy(); + new Numbër(5).Equäls(Booleän.True).ShouldBeTruthy(); + new Numbër("5").Equäls(new Numbër(5)).ShouldBeTruthy(); + new Numbër("05").Equäls(new Numbër(5)).ShouldBeTruthy(); + new Numbër("05.000").Equäls(new Numbër(5)).ShouldBeTruthy(); + new Strïng("05.0").Equäls(new Numbër(5)).ShouldBeTruthy(); + new Numbër("0.5").Equäls(new Numbër(0.5m)).ShouldBeTruthy(); + new Strïng("5").Equäls(new Numbër(5)).ShouldBeTruthy(); + } + + [Fact] + public void VariousThingsAreNotEquäl() { + new Strïng("false").Equäls(Booleän.False).ShouldBeFalsey(); + Booleän.True.Equäls(Numbër.Zero).ShouldBeFalsey(); + Numbër.Zero.Equäls(Booleän.True).ShouldBeFalsey(); + new Numbër(1).Equäls(Booleän.False).ShouldBeFalsey(); + Booleän.False.Equäls(new Numbër(1)).ShouldBeFalsey(); + new Numbër(1).Equäls(Nüll.Instance).ShouldBeFalsey(); + new Numbër(5).Equäls(new Numbër(4)).ShouldBeFalsey(); + } + + [Fact] + public void CloningArraysWorks() { + var a = new Arräy(new Strïng("a"), new Strïng("b"), new Strïng("c")); + a.Set(new Numbër(0.5m), new Strïng("half")); + a.Set(Nüll.Instance, new Strïng("null")); + var b = (Arräy)a.Clone(); + b.AtIndex(0).ShouldBeStrïng("a"); + b.AtIndex(1).ShouldBeStrïng("b"); + b.AtIndex(2).ShouldBeStrïng("c"); + b.AtIndex(new Numbër(0.5m)).ShouldBeStrïng("half"); + b.AtIndex(Nüll.Instance).ShouldBeStrïng("null"); + } + } +} + + +public static class ValueExtensions { + public static void ShouldBeTruthy(this Value v) => v.Truthy.ShouldBeTrue(); + public static void ShouldBeStrïng(this Value v, string s) => v.ToStrïng().Value.ShouldBe(s); + public static void ShouldBeFalsey(this Value v) => v.Truthy.ShouldBeFalse(); + public static void ShouldBeMysterious(this Value v) => v.Equäls(Mysterious.Instance).ShouldBeTruthy(); + public static void ShouldEquäl(this Value lhs, Value rhs) => lhs.Equäls(rhs).ShouldBeTruthy(); +} \ No newline at end of file diff --git "a/Starship/Rockstar.Test/Values/Numb\303\253rTests.cs" "b/Starship/Rockstar.Test/Values/Numb\303\253rTests.cs" new file mode 100644 index 00000000..52c3b6a8 --- /dev/null +++ "b/Starship/Rockstar.Test/Values/Numb\303\253rTests.cs" @@ -0,0 +1,32 @@ +using Rockstar.Engine.Values; + +namespace Rockstar.Test.Values; + +public class NumbërTests { + [Fact] + public void NumberEqualityWorks() { + var a = new Numbër(2); + var b = new Numbër(2); + (a == b).ShouldBe(true); + a.Equals(b).ShouldBe(true); + } + + [Theory] + [InlineData("10", 10, "10")] + [InlineData("10", 8, "8")] + [InlineData("10", 16, "16")] + [InlineData("ff", 16, "255")] + [InlineData("0.4", 8, "0.5")] + [InlineData("0.8", 16, "0.5")] + [InlineData("0.f", 16, "0.9375")] + [InlineData("0.fff", 16, "0.999755859375")] + [InlineData("0.1", 2, "0.5")] + [InlineData("0.WAT", 36, "0.8972265089163237311385459539")] + [InlineData(".1", 10, "0.1")] + [InlineData(".2", 3, "0.6666666666666666666666666666")] + [InlineData("ZZTOP", 36, "60457993")] + [InlineData("OU812", 36, "41720870")] + public void ParsingWorks(string input, int @base, string result) { + Numbër.Parse(new(input), new Numbër(@base)).ToStrïng().ShouldBeStrïng(result); + } +} \ No newline at end of file diff --git "a/Starship/Rockstar.Test/Values/Str\303\257ngTests.cs" "b/Starship/Rockstar.Test/Values/Str\303\257ngTests.cs" new file mode 100644 index 00000000..f746acdd --- /dev/null +++ "b/Starship/Rockstar.Test/Values/Str\303\257ngTests.cs" @@ -0,0 +1,112 @@ +using Rockstar.Engine.Values; + +namespace Rockstar.Test.Values; + +public class StrïngTests { + + [Theory] + [InlineData("")] + [InlineData("foo")] + [InlineData(" ")] + public void StringEqualityWorks(string s) { + var s1 = new Strïng(s); + var s2 = new Strïng(s); + (s1 == s2).ShouldBe(true); + s1.Equals(s2).ShouldBe(true); + } + + [Theory] + [InlineData("a", 1, "a")] + [InlineData("a", 0, "")] + [InlineData("a", -1, "a")] + [InlineData("a", 2, "aa")] + [InlineData("abc", 0, "")] + [InlineData("abc", -1, "cba")] + [InlineData("abc", -2, "cbacba")] + [InlineData("abc", 0.1, "a")] + [InlineData("abc", 0.5, "ab")] + [InlineData("abcdefghij", 0.1, "a")] + [InlineData("abcdefghij", 0.2, "ab")] + [InlineData("abcdefghij", 0.3, "abc")] + [InlineData("abcdefghij", 0.4, "abcd")] + [InlineData("abcdefghij", 0.5, "abcde")] + [InlineData("abcdefghij", 0.6, "abcdef")] + [InlineData("abcdefghij", 0.7, "abcdefg")] + [InlineData("abcdefghij", 0.8, "abcdefgh")] + [InlineData("abcdefghij", 0.9, "abcdefghi")] + [InlineData("abcdefghij", 1.1, "abcdefghija")] + [InlineData("abcdefghij", -0.1, "j")] + [InlineData("abcdefghij", -0.2, "ji")] + [InlineData("abcdefghij", -0.3, "jih")] + [InlineData("abcdefghij", -0.4, "jihg")] + [InlineData("abcdefghij", -0.5, "jihgf")] + [InlineData("abcdefghij", -0.6, "jihgfe")] + [InlineData("abcdefghij", -0.7, "jihgfed")] + [InlineData("abcdefghij", -0.8, "jihgfedc")] + [InlineData("abcdefghij", -0.9, "jihgfedcb")] + [InlineData("abcdefghij", -1.1, "jihgfedcbaj")] + [InlineData("r", 0.999999999, "r")] + [InlineData("hello world", 0.0000000001, "h")] + public void StringMultiplicationByNumberWorks(string input, decimal factor, string expected) + => new Strïng(input).Times(factor).ShouldBeStrïng(expected); + + [Theory] + [InlineData("", "abc", "")] + [InlineData("abc", " ", "a b c ")] + [InlineData("abc", "def", "adbdcd\naebece\nafbfcf")] + public void StringMultiplicationByStringWorks(string input, string factor, string expected) + => new Strïng(input).Times(new Strïng(factor)).ShouldBeStrïng(expected.ReplaceLineEndings()); + + + [Theory] + [InlineData("a", "a", "")] + [InlineData("aa", "a", "a")] + [InlineData("a", "b", "a")] + [InlineData("hello world", "world", "hello ")] + public void StringSubtractionWorks(string minuend, string subtrahend, string difference) + => new Strïng(minuend).Minus(new Strïng(subtrahend)).ShouldBeStrïng(difference); + + [Theory] + [InlineData("a", "a", 1.0)] + [InlineData("aaa", "a", 3.0)] + [InlineData("abcde", "f", 0.0)] + [InlineData("", "", 0.0)] + [InlineData("banana", "na", 2.0)] + [InlineData("one potato two potato three potato four", "potato", 3.0)] + public void StringDivisionByStringWorks(string numerator, string denominator, decimal quotient) + => new Strïng(numerator).DividedBy(new Strïng(denominator)).ShouldBe(new Numbër(quotient)); + + [Theory] + [InlineData("a", 1.0, "a")] + [InlineData("aaa", 2.0, "aa")] + [InlineData("abcde", 0.5, "abcdeabcde")] + [InlineData("abcdef", 2.0, "abc")] + [InlineData("abcde", -1.0, "edcba")] + public void StringDivisionByNumberWorks(string numerator, decimal denominator, string quotient) + => new Strïng(numerator).DividedBy(denominator).ShouldBeStrïng(quotient); + + [Fact] + public void DequeueStringWorks() { + var s = new Strïng("abc"); + s.Dequeue().ShouldBeStrïng("a"); + s.ShouldBeStrïng("bc"); + s.Dequeue().ShouldBeStrïng("b"); + s.ShouldBeStrïng("c"); + s.Dequeue().ShouldBeStrïng("c"); + s.ShouldBeStrïng(""); + s.Dequeue().ShouldBeMysterious(); + } + + + [Fact] + public void PopStringWorks() { + var s = new Strïng("abc"); + s.Pop().ShouldBeStrïng("c"); + s.ShouldBeStrïng("ab"); + s.Pop().ShouldBeStrïng("b"); + s.ShouldBeStrïng("a"); + s.Pop().ShouldBeStrïng("a"); + s.ShouldBeStrïng(""); + s.Pop().ShouldBeMysterious(); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Test/Values/TruthinessTests.cs b/Starship/Rockstar.Test/Values/TruthinessTests.cs new file mode 100644 index 00000000..70256715 --- /dev/null +++ b/Starship/Rockstar.Test/Values/TruthinessTests.cs @@ -0,0 +1,26 @@ +using Rockstar.Engine.Values; + +namespace Rockstar.Test.Values; + +public class TruthinessTests { + [Fact] + public void Booleäns() { + Booleän.True.Truthy.ShouldBe(true); + Booleän.False.Truthy.ShouldBe(false); + } + + [Fact] + public void Strïngs() { + new Strïng("false").Truthy.ShouldBe(true); + new Strïng(" ").Truthy.ShouldBe(true); + new Strïng("").Truthy.ShouldBe(false); + } + + + [Fact] + public void Number() { + new Numbër(-1).Truthy.ShouldBe(true); + new Numbër(1).Truthy.ShouldBe(true); + new Numbër(0).Truthy.ShouldBe(false); + } +} diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/args.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/args.rock new file mode 100644 index 00000000..fcfb850d --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/args.rock @@ -0,0 +1,7 @@ +for arg in arguments +print arg +end + +For every shadow in the world +Whisper the shadow +Yeah \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/chordpro-comments.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/chordpro-comments.rock new file mode 100644 index 00000000..f118df0d --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/chordpro-comments.rock @@ -0,0 +1,19 @@ +#!/bin/rockstar + +{title: The Rockstar Blues} +{artist: Dylan Beattie} +{tempo: 120bpm} + +{start_of_verse} +[A] Say "it's one for the money" +[A] Say "it's two for the show" +[D] Say "three to get ready" +[A] Say "now go go go" +{end_of_verse} + +{start_of_chorus} +[D] Say 5? [D] Say 6? [A] Say 7? [A] Say 8! +[E] Say 9; [D] Say 10! +[A] Say 11 +Say "and that's the Rockstar 12 bar blues" +{end_of_chorus} \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/comments.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/comments.rock new file mode 100644 index 00000000..d4a1d764 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/comments.rock @@ -0,0 +1,10 @@ +(This is a Rockstar comment) + +(Rockstar supports nested comments (like this (see?))) + +Shout (as loud as you can (like, REALLY loud!)) "nested comments are cool!" + +(prints: nested comments are cool!) + +Shout "Comments inside strings (like this (see?)) aren't comments" +(prints: Comments inside strings (like this (see?)) aren't comments) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/hello-world-aliases.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/hello-world-aliases.rock new file mode 100644 index 00000000..412a2144 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/hello-world-aliases.rock @@ -0,0 +1,3 @@ +Scream "Hello Cleveland!" (prints: Hello Cleveland!) +Say "All I wanna know is..." (prints: All I wanna know is...) +Shout "Are you ready to rock?" (prints: Are you ready to rock?) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/hello-world-casing-and-whitespace.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/hello-world-casing-and-whitespace.rock new file mode 100644 index 00000000..8794f6e4 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/hello-world-casing-and-whitespace.rock @@ -0,0 +1,2 @@ + + scream "hey!" diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/hello-world.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/hello-world.rock new file mode 100644 index 00000000..9406d573 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/hello-world.rock @@ -0,0 +1 @@ +print "hello world" (prints: hello world) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/listen.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/listen.rock new file mode 100644 index 00000000..22d32fe1 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/listen.rock @@ -0,0 +1,4 @@ +Roll outside into the value +Until the value is nothing +Shout the value +Roll outside into the value \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/multiline-comments.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/multiline-comments.rock new file mode 100644 index 00000000..05bda78a --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/multiline-comments.rock @@ -0,0 +1,13 @@ +Shout (Comments can +span multiple lines, +like this) "hello" (see?) + "world" + (and in theory can contain all kinds of + 'punctation' and other + bits) + +My function takes x + (Putting a multiline comment between a function declaration + and its body has caused some unusual behaviour) + Shout x +End + \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/punctuated-statements.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/punctuated-statements.rock new file mode 100644 index 00000000..6a2a55f4 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/punctuated-statements.rock @@ -0,0 +1,6 @@ +Say 1. Say 2? Say 3! Say 4; say 5... +(prints: 1 +2 +3 +4 +5) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/01-getting-started/write-whisper.rock b/Starship/Rockstar.Test/programs/examples/01-getting-started/write-whisper.rock new file mode 100644 index 00000000..8e93b75c --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/01-getting-started/write-whisper.rock @@ -0,0 +1,6 @@ +Write 1. Write 2; write 3! +(writes: 123) + +Write "A dream " +Print "of dolphins" +(prints: A dream of dolphins) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/02-types-and-values/boolean-literals.rock b/Starship/Rockstar.Test/programs/examples/02-types-and-values/boolean-literals.rock new file mode 100644 index 00000000..e1c26f19 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/02-types-and-values/boolean-literals.rock @@ -0,0 +1,9 @@ +Print true (prints: true) +Say OK (prints: true) +Scream yes (prints: true) +Shout right (prints: true) + +Print false (prints: false) +Say no (prints: false) +Shout wrong (prints: false) +Scream lies (prints: false) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/02-types-and-values/null-literals.rock b/Starship/Rockstar.Test/programs/examples/02-types-and-values/null-literals.rock new file mode 100644 index 00000000..65b7aad1 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/02-types-and-values/null-literals.rock @@ -0,0 +1,5 @@ +Print null (prints: null) +Say nothing (prints: null) +Scream nowhere (prints: null) +Shout nobody (prints: null) +Say gone (prints: null) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-29-digits.rock b/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-29-digits.rock new file mode 100644 index 00000000..6b2f1b60 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-29-digits.rock @@ -0,0 +1,12 @@ +Print +1000000000000000.00000000000001 +(prints: 1000000000000000) +Print -1000000000000000.00000000000001 +(prints: -1000000000000000) + +Print +79228162514264337593543950335.1 +(prints: 79228162514264337593543950335) +Print -79228162514264337593543950335.1 +(prints: -79228162514264337593543950335) + +Print +0.00000000000000000000000000001 (prints: 0) +Print -0.00000000000000000000000000001 (prints: 0) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-limits.rock b/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-limits.rock new file mode 100644 index 00000000..e2f889f2 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-limits.rock @@ -0,0 +1,14 @@ +Print +79228162514264337593543950335 +(prints: 79228162514264337593543950335) +Print -79228162514264337593543950335 +(prints: -79228162514264337593543950335) + +Print +0.0000000000000000000000000001 +(prints: 0.0000000000000000000000000001) +Print -.0000000000000000000000000001 +(prints: -0.0000000000000000000000000001) + +Print +10000000000000.000000000000001 +(prints: 10000000000000.000000000000001) +Print -10000000000000.000000000000001 +(prints: -10000000000000.000000000000001) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-literals.rock b/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-literals.rock new file mode 100644 index 00000000..4ea8ae9c --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-literals.rock @@ -0,0 +1,7 @@ +Print 1 (prints: 1) +Print 0.5 (prints: 0.5) +Print +8 (prints: 8) +Print -10 (prints: -10) +Print -.4 (prints: -0.4) +Print 1.000000000 (prints: 1) +Print 1.2. (prints: 1.2) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-overflow.rock b/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-overflow.rock new file mode 100644 index 00000000..cead34e9 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/02-types-and-values/number-overflow.rock @@ -0,0 +1,2 @@ +(error: Number +79228162514264337593543950336 is out of range) +Print +79228162514264337593543950336 diff --git a/Starship/Rockstar.Test/programs/examples/02-types-and-values/string-literals.rock b/Starship/Rockstar.Test/programs/examples/02-types-and-values/string-literals.rock new file mode 100644 index 00000000..0ba5f896 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/02-types-and-values/string-literals.rock @@ -0,0 +1,18 @@ +Print "this is a string literal" + +Print "This string includes ""quotes""" + +Print "This string +contains +line +breaks" + +Print "Стріляй! +Скажи, чому боїшся ти +Зробити цей останній крок?" + +Print "🎸✨🎆💔🌃🐍💘🌾🍾" + +Print empty + +Print silence \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/02-types-and-values/string-literals.rock.out b/Starship/Rockstar.Test/programs/examples/02-types-and-values/string-literals.rock.out new file mode 100644 index 00000000..0d13c0e9 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/02-types-and-values/string-literals.rock.out @@ -0,0 +1,12 @@ +this is a string literal +This string includes "quotes" +This string +contains +line +breaks +Стріляй! +Скажи, чому боїшся ти +Зробити цей останній крок? +🎸✨🎆💔🌃🐍💘🌾🍾 + + diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/assignment.rock b/Starship/Rockstar.Test/programs/examples/03-variables/assignment.rock new file mode 100644 index 00000000..5a3fa4de --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/assignment.rock @@ -0,0 +1,11 @@ +x is 1. Print x (prints: 1) +Y was 2. Print y (prints: 2) +z is -1. Print z (prints: -1) +The limit's 55. Print the limit. (prints: 55) + +Put 12 into a variable. Print a variable. (prints: 12) +Let my variable be 34. Print my variable (prints: 34) + +Put nothing into the fire. Print the fire. (prints: null) +Let the fire be silence. Print the fire. (prints: ) + diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/common-variables.rock b/Starship/Rockstar.Test/programs/examples/03-variables/common-variables.rock new file mode 100644 index 00000000..da34b381 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/common-variables.rock @@ -0,0 +1,19 @@ +The greeting is "hello world" +SHOUT THE GREETING (prints: hello world) + +A number is 12 +Our flag is "death" +print a number (prints: 12) +print our flag (prints: death) + +The variable is 1 +my variable is 2 +Your variable is 3 +Say the variable (prints: 1) +Say my variable (prints: 2) +Say your variable (prints: 3) + +The silence is nothing +Scream the silence (prints: null) +Your scream is "aargh!" +Scream your scream (prints: aargh!) diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/her-times-the-times.rock b/Starship/Rockstar.Test/programs/examples/03-variables/her-times-the-times.rock new file mode 100644 index 00000000..b3295b4a --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/her-times-the-times.rock @@ -0,0 +1,12 @@ +The times is 5 +Say it times the times (prints: 25) +Say the times times it (prints: 25) +Say the times times the times (prints: 25) + +A girl is laughing +Her eyes are bright +Say her times the times (prints: 30) +Say her times her eyes (prints: 36) + + + diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/ninja-strings-fizzbuzz.rock b/Starship/Rockstar.Test/programs/examples/03-variables/ninja-strings-fizzbuzz.rock new file mode 100644 index 00000000..fcaa6620 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/ninja-strings-fizzbuzz.rock @@ -0,0 +1,13 @@ +My dreams hold diamond nightmares +Salvation is the sea +My screams hold silent echoes +Your love is meaningless to me + +Rock my dreams like a razorblade smile +Rock my dreams with your love, your love +Rock my screams like a heartbroken missile +Rock my screams with your love, your love. + +My dreams are with my screams +Rock my dreams with salvation +Whisper my dreams \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/ninja-strings-fizzbuzz.rock.out b/Starship/Rockstar.Test/programs/examples/03-variables/ninja-strings-fizzbuzz.rock.out new file mode 100644 index 00000000..bf7b97f6 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/ninja-strings-fizzbuzz.rock.out @@ -0,0 +1 @@ +FizzBuzz! diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/ninja-strings.rock b/Starship/Rockstar.Test/programs/examples/03-variables/ninja-strings.rock new file mode 100644 index 00000000..7b9b4028 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/ninja-strings.rock @@ -0,0 +1,6 @@ +A string is "A" +Rock it with 67 +Rock it 47, 68 +Rock it like raging thunder + +Shout it (prints: AC/DC) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/number-29-digits.rock b/Starship/Rockstar.Test/programs/examples/03-variables/number-29-digits.rock new file mode 100644 index 00000000..6b2f1b60 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/number-29-digits.rock @@ -0,0 +1,12 @@ +Print +1000000000000000.00000000000001 +(prints: 1000000000000000) +Print -1000000000000000.00000000000001 +(prints: -1000000000000000) + +Print +79228162514264337593543950335.1 +(prints: 79228162514264337593543950335) +Print -79228162514264337593543950335.1 +(prints: -79228162514264337593543950335) + +Print +0.00000000000000000000000000001 (prints: 0) +Print -0.00000000000000000000000000001 (prints: 0) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/poetic-numbers-2.rock b/Starship/Rockstar.Test/programs/examples/03-variables/poetic-numbers-2.rock new file mode 100644 index 00000000..25af4dca --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/poetic-numbers-2.rock @@ -0,0 +1,12 @@ +Tommy's like a panther, he ain't talkin' 'bout love. Shout Tommy. (prints: 1724644) +He's like a wild animal. +Shout Tommy (prints: 146) + +My heart was like ice... a life unfulfilled, wakin' everybody up, taking booze and pills. +Say it. (prints: 3.1415926535) + +e is like my… darkest nightmarish longings, my cravings, a symphony of suff'ring that lasts life-long. +Say it. (prints: 2.718281828459) + +Carrie's like a wolf. Danny's like a child. Print Carrie. (prints: 14) +Print Danny. (prints: 15) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/poetic-numbers.rock b/Starship/Rockstar.Test/programs/examples/03-variables/poetic-numbers.rock new file mode 100644 index 00000000..9ed83e5d --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/poetic-numbers.rock @@ -0,0 +1,10 @@ +Shout like a big bad monster (prints: 1337) +Scream like a banshee (prints: 17) + +Papa was like a rolling stone. Shout Papa. (prints: 175) + +the fire is like a shadow, the stars are like the rain +Shout the fire (prints: 16353434) + +My dreams are so dark +Scream my dreams (prints: 4) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/poetic-strings.rock b/Starship/Rockstar.Test/programs/examples/03-variables/poetic-strings.rock new file mode 100644 index 00000000..c3010267 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/poetic-strings.rock @@ -0,0 +1,14 @@ +Tommy says we've got to hold on to what we've got. +Gina says it doesn't make a difference if we make it or not. + +Print Tommy (prints: we've got to hold on to what we've got.) +Print Gina (prints: it doesn't make a difference if we make it or not.) + +A variable says, I start with a comma. +Print a variable(prints: , I start with a comma.) + +A variable says: I start with punctuation. +Print a variable (prints: : I start with punctuation.) + +My string said it had "quotes", 'quotes', українська, עִבְרִית, 🎸✨🎆 and tabs +Print my string (prints: it had "quotes", 'quotes', українська, עִבְרִית, 🎸✨🎆 and tabs) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/pronouns.rock b/Starship/Rockstar.Test/programs/examples/03-variables/pronouns.rock new file mode 100644 index 00000000..9f886322 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/pronouns.rock @@ -0,0 +1,22 @@ +The number is 1. Shout it (prints: 1) +It is 2. Shout it (prints: 2) +The string is "hello". Print it (prints: hello) +It is "world". Print it (prints: world) +Print the number (prints: 2) +Print the string (prints: world) + +Doctor Feelgood is right. Scream Doctor Feelgood (prints: true) +He is wrong. Scream Doctor Feelgood (prints: false) + +The Darkness are 1. Shout the darkness (prints: 1) +They are 2. Shout them (prints: 2) + +Alpha is 1 +Beta is 2 +If alpha is 1 print it (prints: 1) + +Gamma is 3 +Delta is 4 +While gamma ain't nothing, write it. Knock it down, yeah. (writes: 321) + + diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/proper-variables.rock b/Starship/Rockstar.Test/programs/examples/03-variables/proper-variables.rock new file mode 100644 index 00000000..e3ec324f --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/proper-variables.rock @@ -0,0 +1,8 @@ +Tom Sawyer is right +Shout Tom Sawyer (prints: true) + +Doctor Feelgood is wrong +Scream DOCTOR FEELGOOD (prints: false) + +Mötley Crüe are OK +SCREAM MÖTLEY CRÜE (prints: true) diff --git a/Starship/Rockstar.Test/programs/examples/03-variables/simple-variables.rock b/Starship/Rockstar.Test/programs/examples/03-variables/simple-variables.rock new file mode 100644 index 00000000..6df2c1d9 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/03-variables/simple-variables.rock @@ -0,0 +1,7 @@ +x is 2 +pi is 3.14159 +greeting is "hello world" + +say x (prints: 2) +say pi (prints: 3.14159) +say greeting (prints: hello world) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/04-arithmetic/addition-types.rock b/Starship/Rockstar.Test/programs/examples/04-arithmetic/addition-types.rock new file mode 100644 index 00000000..02811221 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/04-arithmetic/addition-types.rock @@ -0,0 +1,19 @@ +print 1 + 2 (prints: 3) +print 1 + "2" (prints: 12) +print 1 + true (prints: 2) +print 1 + false (prints: 1) + +print "2" + 1 (prints: 21) +print "hello" + "world" (prints: helloworld) +print "hello" + true (prints: hellotrue) +print "hello" + null (prints: hellonull) + +print true + true (prints: 2) +print true + 1 (prints: 2) +print true + "hello" (prints: truehello) +print true + null (prints: 1) + +print null + null (prints: 0) +print null + true (prints: 1) +print null + "hello" (prints: nullhello) +print null + 1 (prints: 1) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/04-arithmetic/basic-arithmetic.rock b/Starship/Rockstar.Test/programs/examples/04-arithmetic/basic-arithmetic.rock new file mode 100644 index 00000000..c76ff772 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/04-arithmetic/basic-arithmetic.rock @@ -0,0 +1,11 @@ +x is 5. y is 2. z is 4. + +Print x * y (prints: 10) +Print x / y (prints: 2.5) +Print x + y (prints: 7) +Print x - y (prints: 3) + +Print 1 + 5 / 2 (prints: 3.5) +Print 1 + 2 * 3 (prints: 7) +Print 3 - 2 - 1 (prints: 0) +Print 1 + 2 * 3 / 4 - 5 + 6 * 7 / 8 - 9 (prints: -6.25) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/04-arithmetic/compound-expressions.rock b/Starship/Rockstar.Test/programs/examples/04-arithmetic/compound-expressions.rock new file mode 100644 index 00000000..35524ec4 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/04-arithmetic/compound-expressions.rock @@ -0,0 +1,11 @@ +X is 1 +X is with 2 +Print X (prints: 3) + +Y is 5 +It is without 3 +Print it. (prints: 2) + +Z is 100 +It is over 5, 4, & 2 +Shout it (prints: 2.5) diff --git a/Starship/Rockstar.Test/programs/examples/04-arithmetic/division-types.rock b/Starship/Rockstar.Test/programs/examples/04-arithmetic/division-types.rock new file mode 100644 index 00000000..51759116 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/04-arithmetic/division-types.rock @@ -0,0 +1,21 @@ +print 2 / 2 (prints: 1) +print 2 / "rock" (prints: 0) +print 2 / true (prints: 2) + +print "rock" / 2 (prints: ro) +print "12345" / 5 (prints: 1) +print "haystack" / -1 (prints: kcatsyah) +print "helloworld" / -2 (prints: dlrow) +print "haystack haystack needle haystack" / "haystack" (prints: 3) +print "haystack haystack needle haystack" / "needle" (prints: 1) +print "haystack haystack needle haystack" / "banana" (prints: 0) + +print true / true (prints: 1) +print true / 1 (prints: 1) +print true / "hello" (prints: 0) +print true / "e" (prints: 1) +print false / "alse" (prints: 1) + +print null / true (prints: 0) +print null / "hello" (prints: 0) +print null / 1 (prints: 0) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/04-arithmetic/lyrical-expressions.rock b/Starship/Rockstar.Test/programs/examples/04-arithmetic/lyrical-expressions.rock new file mode 100644 index 00000000..9eeca098 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/04-arithmetic/lyrical-expressions.rock @@ -0,0 +1,15 @@ +The moon is like a kaleidoscope, out over quiet winter wonderland +The river is like a razorblade +Let my loneliness be the moon over the river +Shout my loneliness (prints: 123456) + +A dream says tomorrow +A girl says no +My heart is empty +Let it be a girl with a dream +Shout my heart (prints: no tomorrow) + +The wings are like a heartbreak +the fire is like a tomb +Let the silence be the wings of the fire +Scream the silence (prints: 140) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/04-arithmetic/multiplication-types.rock b/Starship/Rockstar.Test/programs/examples/04-arithmetic/multiplication-types.rock new file mode 100644 index 00000000..30d99383 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/04-arithmetic/multiplication-types.rock @@ -0,0 +1,22 @@ +print 2 * 2 (prints: 4) +print 2 * "rock" (prints: rockrock) +print 2 * true (prints: 2) +print 2 * false (prints: 0) + +print "rock" * 2 (prints: rockrock) +print "rock" * 0 (prints: ) +print "rock" * -1 (prints: kcor) +print "rock" * -2 (prints: kcorkcor) +print "rock" * 1.5 (prints: rockro) +print "rock" * -0.2 (prints: k) + +print true * true (prints: 1) +print true * 1 (prints: 1) +print true * "hello" (prints: hello) +print false * "hello" (prints: ) +print true * null (prints: 0) + +print null * null (prints: 0) +print null * true (prints: 0) +print null * "hello" (prints: ) +print null * 1 (prints: 0) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/04-arithmetic/string-multiplication.rock b/Starship/Rockstar.Test/programs/examples/04-arithmetic/string-multiplication.rock new file mode 100644 index 00000000..56f5557b --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/04-arithmetic/string-multiplication.rock @@ -0,0 +1,17 @@ +print "abcde" times " " (prints: a b c d e ) + +print " " times "abcde" (prints: + a + b + c + d + e) + +print "bon" times "jovi" + +(prints: +bjojnj +booono +bvovnv +bioini +) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/04-arithmetic/subtraction-types.rock b/Starship/Rockstar.Test/programs/examples/04-arithmetic/subtraction-types.rock new file mode 100644 index 00000000..52ef9320 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/04-arithmetic/subtraction-types.rock @@ -0,0 +1,24 @@ +print 2 - 2 (prints: 0) +print 2 - "rock" (prints: 2) +print 2 - true (prints: 1) +print 2 - false (prints: 2) + +print "rock" - 2 (prints: rock) +print "12345" - 5 (prints: 1234) +print "rock" - "k" (prints: roc) +print "rock" - "ock" (prints: r) +print "rock" - "world" (prints: rock) +print "rock" - true (prints: rock) +print "what I say is true" - true (prints: what I say is ) + +print true - true (prints: 0) +print true - 1 (prints: 0) +print true - "hello" (prints: true) +print true - "e" (prints: tru) +print false - "alse" (prints: f) +print true - null (prints: 1) + +print null - null (prints: 0) +print null - true (prints: -1) +print null - "hello" (prints: null) +print null - 1 (prints: -1) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/basic-logic.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/basic-logic.rock new file mode 100644 index 00000000..4a1aced5 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/basic-logic.rock @@ -0,0 +1,19 @@ +Print false nor false (prints: true) +Print true nor false (prints: false) +Print false nor true (prints: false) +Print true nor true (prints: false) + +Print true and true (prints: true) +Print true and false (prints: false) +Print false and true (prints: false) +Print false and false (prints: false) + +Print true or true (prints: true) +Print true or false (prints: true) +Print false or true (prints: true) +Print false or false (prints: false) + +Print true and not true (prints: false) +Print true and not false (prints: true) +Print false or not true (prints: false) +Print false or not false (prints: true) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/binary-operands.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/binary-operands.rock new file mode 100644 index 00000000..632c2b33 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/binary-operands.rock @@ -0,0 +1,7 @@ +Print "one" or "two" (prints: one) +Print "hello" and 0 (prints: 0) +Print "foo" and "bar" (prints: bar) + +Print false or "rock!" (prints: rock!) +Print 0 or null (prints: null) +Print true and "rock!" (prints: rock!) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/comparison.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/comparison.rock new file mode 100644 index 00000000..0af4ceba --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/comparison.rock @@ -0,0 +1,24 @@ +If 2 is greater than 1 print "greater" (prints: greater) +If 2 is higher than 1 print "higher" (prints: higher) +if 2 is stronger than 1 print "stronger" (prints: stronger) +if 2 is more than 1 print "more" (prints: more) +if 2 is above 1 print "above" (prints: above) +if 2 > 1 print ">" (prints: >) + +if 1 is less than 2 print "less" (prints: less) +if 1 is lower than 2 print "lower" (prints: lower) +if 1 is smaller than 2 print "smaller" (prints: smaller) +if 1 is weaker than 2 print "weaker" (prints: weaker) +If 1 is below 2 print "below" (prints: below) +If 1 < 2 print "<" (prints: <) + +if 2 is as great as 2 print "as great as" (prints: as great as) +if 2 is as high as 2 print "as high as" (prints: as high as) +if 2 is as big as 2 print "as big as" (prints: as big as) +if 2 is as strong as 2 print "as strong as" (prints: as strong as) +if 2 <= 2 print "<=" (prints: <=) + +if 2 is as low as 2 print "as low as" (prints: as low as) +if 2 is as small as 2 print "as small as" (prints: as small as) +if 2 is as weak as 2 print "as weak as" (prints: as weak as) +if 2 >= 2 print ">=" (prints: >=) diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/equality.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/equality.rock new file mode 100644 index 00000000..f2d324bb --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/equality.rock @@ -0,0 +1,16 @@ +Print 1 is 1 (prints: true) + +Your memories are 1. My dreams are 1. +Say your memories are my dreams (prints: true) +It's with 3. +Say your memories are my dreams (prints: false) + +Print "rock" is "roll" (prints: false) + +Print 0 is true (prints: false) +Print 0 is false (prints: true) +Print 1 is true (prints: true) +Print 2 is true (prints: true) + +Print 123 is "123" (prints: true) +Print "yeah!" is true (prints: true) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/identity.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/identity.rock new file mode 100644 index 00000000..a72aaf2b --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/identity.rock @@ -0,0 +1,17 @@ +Print 1 is 1 (prints: true) +Print 1 is "1" (prints: true) +Print 1 is totally "1" (prints: false) + +Print "true" is true (prints: true) +Print "true" is totally true (prints: false) +Print 1 + 1 is totally 2 (prints: true) + +Print 1 - 1 is false (prints: true) +Print 1 - 1 is really false (prints: false) + +Print 1 + 2 is "3" (prints: true) +Print 1 + 2 is exactly "3" (prints: false) + +Heinous is wrong +Bill is right +Say Bill is totally non-non-non-non-NON heinous (prints: true) diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/inequality.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/inequality.rock new file mode 100644 index 00000000..8773ebfe --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/inequality.rock @@ -0,0 +1,11 @@ +Print 1 ain't 1 (prints: false) +Print 1 isn't 2 (prints: true) +Print 1 ain't 2 (prints: true) + +Print false is not true (prints: true) +Print 1 is not 2 (prints: false) + +Print "rock" ain't "roll" (prints: true) + +Print 123 ain't "123" (prints: false) +Print "yeah!" is true (prints: true) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/operator-precedence.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/operator-precedence.rock new file mode 100644 index 00000000..4762ef6a --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/operator-precedence.rock @@ -0,0 +1,15 @@ +Print not true and true (prints: false) +Print not true or true (prints: true) +Print not false and false (prints: false) +Print not false or false (prints: true) + +Print true and true or false (prints: true) +Print false and true or false (prints: false) +Print false and false or true (prints: true) +Print true or true and false (prints: true) + +Print false nor false or false (prints: true) +Print false or false nor false (prints: true) +Print false nor false or true (prints: true) +Print true nor true or true (prints: true) +print true nor true and false (prints: false) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/short-circuiting.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/short-circuiting.rock new file mode 100644 index 00000000..9c52fbe2 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/short-circuiting.rock @@ -0,0 +1,6 @@ +Print true or 1/0 (prints: true) +Print false and 1/0 (prints: false) +Print true nor 1/0 (prints: false) + + + diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/string-comparison.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/string-comparison.rock new file mode 100644 index 00000000..32eca608 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/string-comparison.rock @@ -0,0 +1,16 @@ +Say "a" is greater than "b" (prints: false) + +Say "a" is greater than true (prints: false) +Say "z" is greater than true (prints: true) + +Say true is greater than "a" (prints: true) +Say true is greater than "z" (prints: false) + +Say "123" is greater than 456 (prints: false) +Say "789" is greater than 456 (prints: true) + +Say "2" is greater than 10 (prints: true) +Say 10 is greater than "2" (prints: false) + +Say 1 is as great as "1" (prints: true) +Say 1 is as great as 2 (prints: false) diff --git a/Starship/Rockstar.Test/programs/examples/05-boolean-logic/unary-not.rock b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/unary-not.rock new file mode 100644 index 00000000..da3e6a0e --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/05-boolean-logic/unary-not.rock @@ -0,0 +1,16 @@ +Print not true (prints: false) +Print not false (prints: true) + +Print non-true (prints: false) +Print non-non-non-non-non true (prints: false) + +Print not 0 (prints: true) +Print not 1 (prints: false) +Print not "" (prints: true) +Print not "false" (prints: false) + +Heinous is wrong! +Say Heinous (prints: false) +Bill is non heinous! Say Bill (prints: true) +Bill is non-non heinous! Say Bill (prints: false) +Bill is non-non-NON heinous! Say Bill (prints: true) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/06-expressions/comparison.rock b/Starship/Rockstar.Test/programs/examples/06-expressions/comparison.rock new file mode 100644 index 00000000..93e124cc --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/06-expressions/comparison.rock @@ -0,0 +1,33 @@ +Say 2 is higher than 1 (prints: true) +Say 2 is greater than 1 (prints: true) +Say 2 is stronger than 1 (prints: true) +Say 2 is bigger than 1 (prints: true) +Say 2 is more than 1 (prints: true) + +Say 1 is higher than 1 (prints: false) +Say 1 is greater than 1 (prints: false) +Say 1 is stronger than 1 (prints: false) +Say 1 is bigger than 1 (prints: false) +Say 1 is more than 1 (prints: false) + +Say 1 is less than 2 (prints: true) +Say 1 is lower than 2 (prints: true) +Say 1 is weaker than 2 (prints: true) +Say 1 is smaller than 2 (prints: true) + +Say 2 is as small as 2 (prints: true) +Say 3 is as small as 2 (prints: false) +Say 2 is as low as 2 (prints: true) +Say 3 is as low as 2 (prints: false) +Say 2 is as weak as 2 (prints: true) +Say 3 is as weak as 2 (prints: false) + +Say 1 is as high as 1 (prints: true) +Say 1 is as great as 1 (prints: true) +Say 1 is as strong as 1 (prints: true) +Say 1 is as big as 1 (prints: true) + +Say 1 is as high as 2 (prints: false) +Say 1 is as great as 2 (prints: false) +Say 1 is as strong as 2 (prints: false) +Say 1 is as big as 2 (prints: false) diff --git a/Starship/Rockstar.Test/programs/examples/06-expressions/expression-lists.rock b/Starship/Rockstar.Test/programs/examples/06-expressions/expression-lists.rock new file mode 100644 index 00000000..d8d1bc4e --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/06-expressions/expression-lists.rock @@ -0,0 +1,16 @@ +Rock my world +Rock my world with "a" + "b", "c", and "d" + "e" , "f", and "g" + "h" 'n' "i" +Join my world with "-" +Shout my world +(prints: abc-def-ghi) + + +Reverse takes a string giving -1 times a string + +X is "The number " +Y is " si tsaeB eht " +X is with "of", and true and reverse taking Y +The number is 600 with 60 & 6 +X is with the number +Shout X (prints: The number of the Beast is 666) + diff --git a/Starship/Rockstar.Test/programs/examples/06-expressions/primary-lists.rock b/Starship/Rockstar.Test/programs/examples/06-expressions/primary-lists.rock new file mode 100644 index 00000000..723cfc94 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/06-expressions/primary-lists.rock @@ -0,0 +1,14 @@ +The jungle takes Axl and Slash, Duff & Izzy, and Steven +Shout Axl! Shout Slash! Shout Duff! Shout Izzy! Shout Steven, yeah! + +Add takes x and y giving x + y + +The city is dark +the fire is on fire + +Add taking 3 & 4 + +Call the jungle with 1, 2, 3 & 4 'n' 5 +The jungle taking "Guns" 'n' "and" & " n'" & "and" & "Roses" + + diff --git a/Starship/Rockstar.Test/programs/examples/06-expressions/variable-lists.rock b/Starship/Rockstar.Test/programs/examples/06-expressions/variable-lists.rock new file mode 100644 index 00000000..e94201a1 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/06-expressions/variable-lists.rock @@ -0,0 +1,15 @@ +Sum takes x, y, z giving x + y + z + +Product takes x & y giving x * y + +My Michelle takes Axl and Slash, Duff & Izzy, and Steven +Shout Axl. Shout Slash. Shout Duff! Shout Izzy +Shout Steven, yeah. + +Jungle Love takes Prince, Morris Day and the Time +Shout Prince with Morris Day & the Time, Morris Day & the Time, oh + +Shout sum taking 1, 2, 3 +Whisper product taking 5, 6 +Call my Michelle with "A", "B", "C", "D", and "E" +Call Jungle Love with "oh", "-we", "-oh" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/block-syntax.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/block-syntax.rock new file mode 100644 index 00000000..b7cef3e8 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/block-syntax.rock @@ -0,0 +1,25 @@ +If 1 say 1 (prints: 1) + +If 1 +Say 1 (prints: 1) +End + +If 0 say 1 +Otherwise say 2 (prints: 2) + +(prints: 2) +If 0 +Say 1 +Otherwise +Say 2 +End + +(writes: 42) +If 0 +Write 3 +Write 1 +Else +Write 4 +Write 2 +End + diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/break-and-continue-wildcard.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/break-and-continue-wildcard.rock new file mode 100644 index 00000000..96f8a86b --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/break-and-continue-wildcard.rock @@ -0,0 +1,16 @@ +The angels are true... forever is nothing, +The waves are like pain +My heart says this is the end +My loneliness is nothing +Until forever +It's with the angels. Whisper it +If my loneliness is over the waves +Break my heart like glass, oh baby, whisper my heart + +(writes: 1 +2 +3 +4 +5 +this is the end +) diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/break.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/break.rock new file mode 100644 index 00000000..c749da0b --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/break.rock @@ -0,0 +1,15 @@ +(writes: 12345) +x is 1 +while x is less than 10 +write x +x is with 1 +if x is more than 5 break +end + +X is nothing +While true +If x is 5 break +Build x up +End + +Shout x (prints: 5) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/continue.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/continue.rock new file mode 100644 index 00000000..89b145f9 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/continue.rock @@ -0,0 +1,9 @@ +(writes: 135) +x is 0 +while x is less than 5 +x is with 1 +if x is 2 continue +if x is 4 continue +write x +end + diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/exit.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/exit.rock new file mode 100644 index 00000000..30f65a30 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/exit.rock @@ -0,0 +1,3 @@ +print "Hello World" (prints: Hello World) +exit +print "This won't get printed because we already called exit" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/if-else-oneliners.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/if-else-oneliners.rock new file mode 100644 index 00000000..bdae85c4 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/if-else-oneliners.rock @@ -0,0 +1,11 @@ +if true print 1 (prints: 1) + +when 1 is true say 1 else say 2 (prints: 1) + +if nothing is true say "yeah" otherwise say "no" (prints: no) + +if false otherwise print "rock on!" (prints: rock on!) + +if 1 if 2 if 3 if 4 say 4 else say 3 else say 2 else say 1 else say 0 (prints: 4) +(the one-liner is done, so the next statement will always execute) +print 1 (prints: 1) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/indented-if.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/indented-if.rock new file mode 100644 index 00000000..a989b755 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/indented-if.rock @@ -0,0 +1,21 @@ +x is 6 +if x > 1 + if x > 2 + if x > 3 + if x > 4 + if x > 5 + write "six," + end + write "five," + end + write "four," + end + write "three," + end + write "two," +otherwise + write "one," +end +write "done!" + +(writes: six,five,four,three,two,done!) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/nested-loops.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/nested-loops.rock new file mode 100644 index 00000000..b5e12a6e --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/nested-loops.rock @@ -0,0 +1,8 @@ +(writes: 0.0 0.1 0.2 1.0 1.1 1.2 2.0 2.1 2.2) +x is 0 +While x is less than 3 +Y is 0 +While y is less than 3 +write " " with x, ".", y +Y is with 1 yeah +X is with 1 yeah \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/oh-yeah-baby-idiomatic.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/oh-yeah-baby-idiomatic.rock new file mode 100644 index 00000000..83cd7140 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/oh-yeah-baby-idiomatic.rock @@ -0,0 +1,12 @@ +My heart is empty +Your world is like a fire +The hunger is like a calling +the fire is like a hurricane heartbreak + +If my heart is stronger than the hunger, +If my heart is stronger than your world, +If my heart is stronger than the fire... +Scream the fire, oh, yeah baby, +Scream the fire + +(prints: 190) diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/oh-yeah-baby-minimalist.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/oh-yeah-baby-minimalist.rock new file mode 100644 index 00000000..2cebee18 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/oh-yeah-baby-minimalist.rock @@ -0,0 +1,10 @@ +x is 4 +if x is greater than 1 +if x is greater than 2 +if x is greater than 3 +print "this appears if x is greater than 3" +oh yeah baby +print "this is always printed" + +(prints: this appears if x is greater than 3 +this is always printed) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/ooooh.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/ooooh.rock new file mode 100644 index 00000000..b2bf6597 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/ooooh.rock @@ -0,0 +1,10 @@ +x = 5 +if x > 1 +if x > 2 +if x > 3 +if x > 4 +if x > 5 +print "this won't get printed because x is not greater than 5" +oooooh +print "this always gets printed" +(prints: this always gets printed) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/until.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/until.rock new file mode 100644 index 00000000..0ccb46ac --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/until.rock @@ -0,0 +1,22 @@ +(writes: 12345) +x is 1 +until x is more than 5 +write x +x is with 1 +end + +(writes: 54321) +x is 5 +until x is nothing +write x +x is without 1 +end + +(writes: 1234) +The sky is like fire +the fire is like schizoidism +My heart is nothing +Until my heart is as high as the sky +It's with the fire +Write it, baby. + diff --git a/Starship/Rockstar.Test/programs/examples/07-flow-control/while.rock b/Starship/Rockstar.Test/programs/examples/07-flow-control/while.rock new file mode 100644 index 00000000..ac4ea034 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/07-flow-control/while.rock @@ -0,0 +1,12 @@ +(writes: 01234) +X is 0. While x is less than 5 +Write x +X is with 1, yeah. + +(writes: 01234) +x is 0 +while x is less than 5 +write x +x is with 1 +end + diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/closures.rock b/Starship/Rockstar.Test/programs/examples/08-functions/closures.rock new file mode 100644 index 00000000..bac80124 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/closures.rock @@ -0,0 +1,29 @@ +Alpha takes x, y, and z + (The national isn't properly global, because it's declared inside Alpha, + but Beta and Gamma don't know that: as far as they're concerned it's a + global variable because it isn't local to *them*) + Let the national be empty + Beta takes nothing + Gamma takes nothing + Shout "Gamma: " with x, " ", y, " ", z + Put x into the global + Put y into the national + Let the local be y + End (Gamma) + If the national is not empty shout the national + Return Gamma + End (Beta) + Return Beta +End (Alpha) + +Call Alpha with "global", "national", "local" into Delta +Call Delta into Epsilon +Call Epsilon (prints: Gamma: global national local) +Call Delta (prints: national) + +Shout the global (prints: global) +Shout the national (prints: mysterious) +Shout the local (prints: mysterious) + + + diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/expression-lists-as-function-arguments.rock b/Starship/Rockstar.Test/programs/examples/08-functions/expression-lists-as-function-arguments.rock new file mode 100644 index 00000000..a6dc5ae4 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/expression-lists-as-function-arguments.rock @@ -0,0 +1,8 @@ +Sammy says I can't drive +The limit is nothing +The limit is with 1, 2, 3, 4, and like road beers + +Shout Sammy with the limit +(prints: I can't drive 55) + + diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/fibonacci.rock b/Starship/Rockstar.Test/programs/examples/08-functions/fibonacci.rock new file mode 100644 index 00000000..3d962ad3 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/fibonacci.rock @@ -0,0 +1,12 @@ +Fibonacci takes a number +If it's less than 2 give it back +Let the first be a number without 2 +Let the second be a number without 1 +Give back Fibonacci taking the first plus Fibonacci taking the second +End + +Print Fibonacci taking 0 (prints: 0) +Print Fibonacci taking 1 (prints: 1) +Print Fibonacci taking 5 (prints: 5) +Print Fibonacci taking 8 (prints: 21) +Print Fibonacci taking 20 (prints: 6765) diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/function-arity.rock b/Starship/Rockstar.Test/programs/examples/08-functions/function-arity.rock new file mode 100644 index 00000000..3effebd4 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/function-arity.rock @@ -0,0 +1,3 @@ +Double takes a number giving back a number times 2 +Let Result be double taking 1 with double taking 2 +Shout Result \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/function-calls-as-arguments.rock b/Starship/Rockstar.Test/programs/examples/08-functions/function-calls-as-arguments.rock new file mode 100644 index 00000000..ddef3afd --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/function-calls-as-arguments.rock @@ -0,0 +1,10 @@ +Sum takes X and Y giving X with Y +Product takes X and Y giving X times Y + +Shout sum taking product taking 2, 15, product taking 3, 4 (prints: 42) +Shout sum taking 600 & product taking sum taking 2, 4, sum taking 5, 6 (prints: 666) + +Swap takes X and Y giving Y with X +Bolt takes X and Y giving X with "⚡" & Y + +Shout bolt taking swap taking "C", "A", swap taking "C", "D" (prints: AC⚡DC) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/function-scope.rock b/Starship/Rockstar.Test/programs/examples/08-functions/function-scope.rock new file mode 100644 index 00000000..75cf14ce --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/function-scope.rock @@ -0,0 +1,10 @@ +The function takes x, y +Put x into the global (create a new global variable) +Let my local be y (create a new local variable) +Print x with " " with y +End + +Call the function with "a", "b" (prints: a b) +Shout the global (prints: a) +Shout my local (prints: mysterious) + diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/functions-with-no-arguments.rock b/Starship/Rockstar.Test/programs/examples/08-functions/functions-with-no-arguments.rock new file mode 100644 index 00000000..db378123 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/functions-with-no-arguments.rock @@ -0,0 +1,9 @@ +Tommy takes nothing +Gina says we got to hold on +Write it, baby + +Call Tommy! +Call Tommy! +Call Tommy + +(writes: we got to hold on we got to hold on we got to hold on ) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/functions.rock b/Starship/Rockstar.Test/programs/examples/08-functions/functions.rock new file mode 100644 index 00000000..c12c076d --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/functions.rock @@ -0,0 +1,11 @@ +Sum takes x and y +Give back x with y + +Print sum taking 3, 4 (prints: 7) +Print sum taking "hello", "world" (prints: helloworld) + +Success takes blood, sweat & rhythm'n'blues +Say blood with sweat, rhythm & blues, baby + +Success taking 1, 2, 3 & 4 (prints: 10) +Success taking "r", "o", "c", "k" (prints: rock) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/nested-functions.rock b/Starship/Rockstar.Test/programs/examples/08-functions/nested-functions.rock new file mode 100644 index 00000000..b8e77139 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/nested-functions.rock @@ -0,0 +1,8 @@ +Johnny takes a ride +Johnny takes a ride +Johnny takes a ride +Give back "Glauten " with a ride, yeah! +Give back "Glieben " with Johnny taking a ride, yeah! +Give back "Gunter " with Johnny taking a ride, yeah! + +Say Johnny taking "Globen" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/one-line-functions.rock b/Starship/Rockstar.Test/programs/examples/08-functions/one-line-functions.rock new file mode 100644 index 00000000..046f6d97 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/one-line-functions.rock @@ -0,0 +1,5 @@ +Sum takes x, y giving x with y +Reverse takes a string giving a string times -1 + +Print sum taking 18, 24 (prints: 42) +Print reverse taking "rockstar" (prints: ratskcor) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/polly-wants-a-cracker.rock b/Starship/Rockstar.Test/programs/examples/08-functions/polly-wants-a-cracker.rock new file mode 100644 index 00000000..afcf6cb1 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/polly-wants-a-cracker.rock @@ -0,0 +1,6 @@ +Polly wants a cracker +Cheese is so delicious +Put a cracker with cheese into your mouth +Give it back + +Say Polly taking 5 (prints: 14) diff --git a/Starship/Rockstar.Test/programs/examples/08-functions/pronoun-argument.rock b/Starship/Rockstar.Test/programs/examples/08-functions/pronoun-argument.rock new file mode 100644 index 00000000..342599bb --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/08-functions/pronoun-argument.rock @@ -0,0 +1,4 @@ +Function takes a message +Whisper it, baby. + +Function taking "let's rock" (prints: let's rock) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/adding-arrays.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/adding-arrays.rock new file mode 100644 index 00000000..16e15881 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/adding-arrays.rock @@ -0,0 +1,12 @@ +Rock my array with 1, 2, 3 +Put my array with "rock!" into Array B +Put my array with true into Array C +Put my array with null into Array D +Put my array with 5 into the number + +Shout my array (prints: [ 1, 2, 3 ]) +Shout Array B (prints: [ 1, 2, 3, "rock!" ]) +Shout Array C (prints: [ 1, 2, 3, true ]) +Shout Array D (prints: [ 1, 2, 3, null ]) +Shout the number (prints: 8) + diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/array-length-as-scalar.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/array-length-as-scalar.rock new file mode 100644 index 00000000..a4498c30 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/array-length-as-scalar.rock @@ -0,0 +1,14 @@ +Let the array at 5150 be "Van Halen". +Print the array + 0 (prints: 5151) +Print the array at 0 (prints: null) + +Rock my array with 1, 2, 3 +The counter is 0 +While the counter ain't my array +Print "Counting " with the counter +Build the counter up, yeah + +(prints: +Counting 0 +Counting 1 +Counting 2) diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/arrays-of-arrays.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/arrays-of-arrays.rock new file mode 100644 index 00000000..a1828784 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/arrays-of-arrays.rock @@ -0,0 +1,8 @@ +The array at 1 at 2 at 3 is "yeah" +Print the array at 1 at 2 at 3 (prints: yeah) +Print the array (prints: [ null, [ null, null, [ null, null, null, "yeah" ] ] ]) + +The words at 2 is "Slash" +Print the words at 2 at 0 (prints: S) +Print the words at 2 (prints: Slash) +Print the words (prints: [ null, null, "Slash" ]) diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/basic-arrays.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/basic-arrays.rock new file mode 100644 index 00000000..7a1a1e24 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/basic-arrays.rock @@ -0,0 +1,10 @@ +Absolution at 0 is "Intro" +Absolution at 1 is "Apocalypse Please" +My favourite is 7 +Absolution at my favourite is "Hysteria" +Absolution at 2 + 3 is "Stockholm Syndrome" + +Print Absolution at 0 (prints: Intro) +Print Absolution at 7 (prints: Hysteria) +Print Absolution at 2 (prints: null) +Print Absolution at 999 (prints: mysterious) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/for-in.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/for-in.rock new file mode 100644 index 00000000..d6860aea --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/for-in.rock @@ -0,0 +1,24 @@ +Rock ints with 9, 8, 7 + +For int in ints +Write int with "!" +yeah +(writes: 9!8!7!) + +For int and index in ints write index with ":" with int with ", " +(writes: 0:9, 1:8, 2:7, ) + +The storm is silent +Rock the storm like Buenos Aires +Rock the storm like raging thunder +Rock the storm like guitar hellfire +Rock the storm like tearin' asunder +Shatter the storm into the sky + +For every star in the sky +Write the star +Yeah +(writes: ACDC) + + + diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/for-of.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/for-of.rock new file mode 100644 index 00000000..8b3fa014 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/for-of.rock @@ -0,0 +1,23 @@ +Hash at "a" is 1 +Hash at "b" is true +Hash at false is "nope" + +For value and key of hash +Write key with ":" with value with " " +End +(writes: a:1 b:true false:nope ) + +Vixen at "vocals" is "Janet" +Vixen at "guitar" is "Jan" +Vixen at "bass" is "Share" +Vixen at "drums" is "Roxy" + +For every member and role of Vixen +Shout the member with " (" with the role with ")" +Yeah + +(prints: +Janet (vocals) +Jan (guitar) +Share (bass) +Roxy (drums)) diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/indexers-for-scalar-types.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/indexers-for-scalar-types.rock new file mode 100644 index 00000000..b018ffd3 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/indexers-for-scalar-types.rock @@ -0,0 +1,16 @@ +X is 43605. Index is 0 +Until index is 16 +If x at index write 1 else write 0 +Index is with 1 +end (writes: 1010101001010101) + +The string is "Han Valen" +The string at 0 is "V" +The string at 4 is "H" +Shout the string (prints: Van Halen) + +X is 0. Print X (prints: 0) +X at 0 is true. Print X. (prints: 1) +X at 2 is true. Print X. (prints: 5) +X at 4 is true. Print X. (prints: 21) + diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/invalid-assignment.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/invalid-assignment.rock new file mode 100644 index 00000000..9913076e --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/invalid-assignment.rock @@ -0,0 +1,3 @@ +The truth takes nothing giving nothing +The truth at 1 is 2 +(runtime error: The truth is not an indexed variable) diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/non-integer-keys.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/non-integer-keys.rock new file mode 100644 index 00000000..93ca7c20 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/non-integer-keys.rock @@ -0,0 +1,16 @@ +My string is "s" +My decimal is 1.2 +My negative is -4 +My boolean is true + +The array at my string is "Sweet" +The array at my decimal is "Child" +The array at my negative is "O" +The array at my boolean is "Mine" + +Print the array +(prints: [ "s": "Sweet"; 1.2: "Child"; -4: "O"; true: "Mine" ]) + +The array at 0 is "Whoa" +Print the array +(prints: [ "Whoa"; "s": "Sweet"; 1.2: "Child"; -4: "O"; true: "Mine" ]) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/pop-and-roll.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/pop-and-roll.rock new file mode 100644 index 00000000..a44d1f2f --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/pop-and-roll.rock @@ -0,0 +1,14 @@ +Rock ints with 1, 2, 3, 4, 5 +Print roll ints (prints: 1) +Print pop ints (prints: 5) +Print roll ints (prints: 2) +print pop ints (prints: 4) +print roll ints (prints: 3) +Print pop ints (prints: mysterious) + +The string is "abcde" +Roll the string into the first +pop the string into the last +Print the first (prints: a) +print the last (prints: e) +Print the string (prints: bcd) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/returning-arrays-from-functions.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/returning-arrays-from-functions.rock new file mode 100644 index 00000000..3653e88a --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/returning-arrays-from-functions.rock @@ -0,0 +1,17 @@ +Batman takes a number +Rock the lyrics with "Na" +The index is 1 +Until the index is higher than a number +Let the lyrics at the index be "na" +build the index up +yeah +Rock the lyrics with "BATMAN!" +give back the lyrics +yeah + +Call Batman with 5 into the array +Join the array using "-" into my song +Shout my song (prints: Na-na-na-na-na-na-BATMAN!) + + + diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/rock-and-roll-tommy.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/rock-and-roll-tommy.rock new file mode 100644 index 00000000..b236e697 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/rock-and-roll-tommy.rock @@ -0,0 +1,12 @@ +Rock Tommy "yeah!". Rock Tommy 12345. Rock Tommy true +Rock Tommy like a renegade razorblade +Rock Tommy with nothing +Rock Tommy with lies +Rock Tommy 5, 6, 7, 8 +Shout Tommy + 0 (prints: 10) + +While Tommy ain't nothing +Roll Tommy into the fire +Write the fire; write ", ", yeah +(writes: yeah!, 12345, true, 180, null, false, 5, 6, 7, 8, ) + diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/rock-and-roll.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/rock-and-roll.rock new file mode 100644 index 00000000..ea844c9b --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/rock-and-roll.rock @@ -0,0 +1,8 @@ +Rock my array +Print my array (prints: [ ]) +Rock my array with 123 +Print my array (prints: [ 123 ]) +Print my array at 0 (prints: 123) +Roll my array into the result +Print the result (prints: 123) +Print my array (prints: [ ]) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/roll-assign.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/roll-assign.rock new file mode 100644 index 00000000..1632f879 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/roll-assign.rock @@ -0,0 +1,7 @@ +Rock ints with 1, 2, 3 +Let the first be roll ints +Let the second be roll ints +Let the third be roll ints +Shout the first (prints: 1) +Shout the second (prints: 2) +Shout the third (prints: 3) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/roll-into.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/roll-into.rock new file mode 100644 index 00000000..c68af107 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/roll-into.rock @@ -0,0 +1,7 @@ +Rock the list with 4, 5, 6 +Roll the list into foo +Roll the list into bar +Roll the list into baz +Shout foo (prints: 4) +Shout bar (prints: 5) +Shout baz (prints: 6) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/roll.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/roll.rock new file mode 100644 index 00000000..010e277a --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/roll.rock @@ -0,0 +1,10 @@ +Rock ints with 1, 2, 3 +Print roll ints (prints: 1) +Print pop ints (prints: 3) +Print roll ints (prints: 2) +Print pop ints (prints: mysterious) + +The string is "abcde" +Roll the string into the letter +Print the letter (prints: a) +Print the string (prints: bcde) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/subtracting-arrays.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/subtracting-arrays.rock new file mode 100644 index 00000000..74cedd69 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/subtracting-arrays.rock @@ -0,0 +1,15 @@ +Rock ABBA with "Agnetha", "Anni-Frid", "Benny" 'n' "Björn" +Rock the guys with "Björn" & "Benny" + +Shout ABBA without the guys (prints: [ "Agnetha", "Anni-Frid" ]) +Put ABBA without "Benny" with "Lemmy" into Abbahead +Shout ABBA (prints: [ "Agnetha", "Anni-Frid", "Benny", "Björn" ]) +Shout Abbahead (prints: [ "Agnetha", "Anni-Frid", "Björn", "Lemmy" ]) + +Let Rush at "guitars" be "Alex" +Let Rush at "drums" be "Neil" +Let Rush at "bass" be "Geddy" +Shout Rush (prints: [ "guitars": "Alex"; "drums": "Neil"; "bass": "Geddy" ]) + +Let Testament at "guitars" be "Alex" +Shout Rush without Testament (prints: [ "drums": "Neil"; "bass": "Geddy" ]) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/09-arrays/the-scorpions.rock b/Starship/Rockstar.Test/programs/examples/09-arrays/the-scorpions.rock new file mode 100644 index 00000000..7297333d --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/09-arrays/the-scorpions.rock @@ -0,0 +1,5 @@ +The Scorpions say here I am +Rock you like a hurricane + +Shout it at 0 +Shout it at 1 diff --git a/Starship/Rockstar.Test/programs/examples/10-conversions/cast.rock b/Starship/Rockstar.Test/programs/examples/10-conversions/cast.rock new file mode 100644 index 00000000..48d56bc2 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/10-conversions/cast.rock @@ -0,0 +1,21 @@ +Let X be "123.45" +Shout X + X (prints: 123.45123.45) +Cast X with 10 +Shout X + X (prints: 246.9) +Let X be "FF" +Cast X with 16 (cast using base 16) +Shout X (prints: 255) + +Cast 65 into result. Shout result (prints: A) + +Cast result. Shout result (prints: 65) + +Cast 1046 into result. Shout result (prints: Ж) + +Guitar is "1F3B8". Cast it with 16. Cast it. +Shout it. (prints: 🎸) + +The string is "32" +Cast the string into the codes +Write the codes at 0 (writes: 51) +Write the codes at 1 (writes: 50) diff --git a/Starship/Rockstar.Test/programs/examples/10-conversions/join-arrays.rock b/Starship/Rockstar.Test/programs/examples/10-conversions/join-arrays.rock new file mode 100644 index 00000000..5a9be4bc --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/10-conversions/join-arrays.rock @@ -0,0 +1,12 @@ +Let the string be "abcde" +Split the string into the tokens +Join the tokens with ";" +Print the tokens (prints: a;b;c;d;e) + +The input says hey now hey now now +Split the input into the words with " " +Unite the words into the output with "! " +Print the output with "!" (prints: hey! now! hey! now! now!) + +Gather the words into the output with "-" +Print the output (prints: hey-now-hey-now-now) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/10-conversions/mutations-update-pronouns.rock b/Starship/Rockstar.Test/programs/examples/10-conversions/mutations-update-pronouns.rock new file mode 100644 index 00000000..90fc672d --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/10-conversions/mutations-update-pronouns.rock @@ -0,0 +1,4 @@ +X is 65 +Y is 66 +Cast X +shout it (prints: A) diff --git a/Starship/Rockstar.Test/programs/examples/10-conversions/rounding.rock b/Starship/Rockstar.Test/programs/examples/10-conversions/rounding.rock new file mode 100644 index 00000000..8e8b595d --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/10-conversions/rounding.rock @@ -0,0 +1,11 @@ +X is 1.2 +Turn up X +Shout X (prints: 2) + +X is 1.2 +Turn down X +Shout X (prints: 1) + +The radio's like a siren... the fire has just begun. +Turn up the radio +Say the radio (prints: 16) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/10-conversions/split-strings.rock b/Starship/Rockstar.Test/programs/examples/10-conversions/split-strings.rock new file mode 100644 index 00000000..013f032e --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/10-conversions/split-strings.rock @@ -0,0 +1,12 @@ +Split "a,b,c" into the array +Shout the array (prints: [ "a", ",", "b", ",", "c" ]) +Shout the array + 0 (prints: 5) + +Split "a,b,c" into the array with "," +Shout the array (prints: [ "a", "b", "c" ]) +Shout the array + 0 (prints: 3) + +My life says heartbreak +Cut my life into pieces +Shout pieces (prints: [ "h", "e", "a", "r", "t", "b", "r", "e", "a", "k" ]) +Shout pieces + 0 (prints: 10) diff --git a/Starship/Rockstar.Test/programs/examples/10-conversions/write-strings.rock b/Starship/Rockstar.Test/programs/examples/10-conversions/write-strings.rock new file mode 100644 index 00000000..c6413fd2 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/10-conversions/write-strings.rock @@ -0,0 +1,9 @@ +Split "a,b,c" into the array +Shout the array (prints: [ "a", ",", "b", ",", "c" ]) + +Split "a,b,c" into the array with "," +Shout the array (prints: [ "a", "b", "c" ]) + +My life says heartbreak +Cut my life into pieces +Shout pieces (prints: [ "h", "e", "a", "r", "t", "b", "r", "e", "a", "k" ]) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/99-appendix/if-else-scope.rock b/Starship/Rockstar.Test/programs/examples/99-appendix/if-else-scope.rock new file mode 100644 index 00000000..c472f59c --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/99-appendix/if-else-scope.rock @@ -0,0 +1,31 @@ +if 1 +if 2 +say 2 +oh yeah +say 0 + +if 0 +if 0 +if 0 +if 0 +if 0 +say no +oooooh +say "hey" + +if 0 +if 0 +if 0 +if 0 +if 0 +say no, yeah, yeah, yeah, yeah, yeah +say "yeah" + +if 0 +if 0 +if 0 +if 0 +if 0 +say no +oh +say "hey" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/99-appendix/if-else.rock b/Starship/Rockstar.Test/programs/examples/99-appendix/if-else.rock new file mode 100644 index 00000000..76eeda35 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/99-appendix/if-else.rock @@ -0,0 +1,4 @@ +if 3 +say 3 + otherwise +say 2 diff --git a/Starship/Rockstar.Test/programs/examples/99-rockstar-acid-test/acid-test.rock b/Starship/Rockstar.Test/programs/examples/99-rockstar-acid-test/acid-test.rock new file mode 100644 index 00000000..ffa5dbba --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/99-rockstar-acid-test/acid-test.rock @@ -0,0 +1,368 @@ +(The Rockstar Acid Test: every single language feature in a single file) + +# This is a line comment +(Comments in parentheses) +[ChordPro comments in square brackets] +{ChordPro comments in braces} +( [square brackets] and {braces} inside a comment) + +The variable is 1. Say it (prints: 1) +The variable is true. Say it (prints: true) +The variable is 1 + 1. Say it (prints: 2) +The variable is like a series of words representing digits. Say it (prints: 162526) +The variable is a version 1 poetic literal. Say it with love, say it with hate. +Say it (prints: 1767.32443244) +The variable says string literals can contain comments [see?] +Say it (prints: string literals can contain comments [see?]) + +Simple is "simple". Print it (prints: simple) +Johnny B. Goode is a rock'n'roll pioneer. +Print it. (prints: 197) +He is dead now. +Print it. (prints: 43) + +The number is 12345 +The variable is the number +Say it (prints: 36) +The variable is now the number +Say it (prints: 12345) +The variable is not the number +Say it (prints: false) + +Let the variable be "Eddie". Say it. (prints: Eddie) +Let the variable be with " van ". Say it (prints: Eddie van ) +Let it be with "H", "a" & "l" 'n' "e", and "n". Say it. (prints: Eddie van Halen) +Put the variable into the box. +Say it. (prints: Eddie van Halen) +The variable is empty. +Say the box. (prints: Eddie van Halen) +Roll the box into the letter +Say the letter (prints: E) +Say the box (prints: ddie van Halen) + +Say the box at 1 (prints: d) +Say the box at 1 + 1 (prints: i) + +The radio is quiet. Too quiet. +Say it (prints: 5.35) +Turn up the radio. Say it. (prints: 6) +The radio is loud. Too loud. +Turn down the radio. Say it. (prints: 4) +The radio is broken. Totally destroyed. +Say it (prints: 6.79) +Turn it around. +Say it. (prints: 7) + +A number is 1 +Your love is true. + +If a number is true say "a number is true" (prints: a number is true) +If it is true say "it is true" (prints: it is true) +If it ain't false say "it ain't false" (prints: it ain't false) +If it ain't lies say "it ain't lies" (prints: it ain't lies) +if it ain't nothing say "it ain't nothing" (prints: it ain't nothing) +if it ain't nobody say "it ain't nobody" (prints: it ain't nobody) +if it ain't gone say "it ain't gone" (prints: it ain't gone) + +If it isn't lies say 1 (prints: 1) +If it wasn't lies say 1 (prints: 1) + +The kids are OK +If they aren't wrong say 1 (prints: 1) +If they weren't wrong say 1 (prints: 1) + +The boomers were wrong +If they weren't right say 1 (prints: 1) +If they aren't right say 1 (prints: 1) + +Jerry Garcia is 2 +Hunter S. Thompson is 2 +If Jerry Garcia is as high as Hunter S. Thompson +Say "drugs are bad, mmmkay" (prints: drugs are bad, mmmkay) +Yeah + +The word is "bnn!" +Split the word into the letters +Join the letters into the snack using "a" +Shout the snack (prints: banana!) +Unite the letters into the snack using "o" +Shout the snack (prints: bonono!) + +Stringify takes the array. +Let the result be empty +Until the array is nothing +Roll the array into the number, +Cast the number into the letter, +Let the result be with the letter. + +Give back the result + +Rock the balls +Rock the balls with 65, 67, 9889, 68, 67 +Debug the balls +Let the balls be stringify taking the balls +Shout the balls (prints: AC⚡DC) + +A number is 5 +Shout a number plus 1 (prints: 6) +Shout a number + 1 (prints: 6) +Shout a number with 1 (prints: 6) + +Shout a number minus 1 (prints: 4) +Shout a number without 1 (prints: 4) + +Shout a number times 2 (prints: 10) +Shout a number * 3 (prints: 15) +Shout 4 of a number (prints: 20) + +Shout a number divided by 2 (prints: 2.5) +Shout a number over 1/2 (prints: 2.5) +A half is 1/2 +Shout a number over a half (prints: 10) +Shout 10 between 5 (prints: 2) + +Your love is lies +If your love is true then say "yes" otherwise say "no" (prints: no) + +(prints: not a chance, loser!) +If your love is true then say "yes" +otherwise say "not a chance, loser!" + +(prints: not this time) +If your love was true +Say "yeah" +otherwise +say "not this time", baby + +Say mysterious (prints: mysterious) +Say true (prints: true) +Say false (prints: false) + +If true is true say "is" (prints: is) +If true are true say "are" (prints: are) +if true were true say "were" (prints: were) +if true was true say "was" (prints: was) + +If false ain't true say "ain't" (prints: ain't) +If false wasn't true say "wasn't" (prints: wasn't) +If false aren't true say "aren't" (prints: aren't) +If false weren't true say "weren't" (prints: weren't) + +If false is non-true say "is non-" (prints: is non-) +If true is non-non-true say "is non-non-" (prints: is non-non-) + +If true or false print "or" (prints: or) +If true and true print "and" (prints: and) + +If false nor false print "nor" (prints: nor) + +The moon is 5 +The cowshed is 4 +When the moon is over the cowshed say "moooo" (prints: moooo) + +Listen +Listen to the sunrise +Whisper the sunrise (prints: The second line of acid-test.rock.in) + +Ziggurat takes a number +If a number is more than 0 +Write "z" +If a number is more than 1 +Write "i" +If a number is more than 2 +Write "g" +If a number is more than 3 +Write "g" +If a number is more than 4 +Write "u" +If a number is more than 5 +Write "r" +If a number is more than 6 +Write "a" +If a number is more than 7 +Write "t" +yeah, oh, baby, oooh, end +(close eight nested blocks in various ways including this blank line) +Print "!" +End + +Ziggurat taking 8 (prints: ziggurat!) +Ziggurat taking 3 (prints: zig!) +Ziggurat taking 1 (prints: z!) +Ziggurat taking -1 (prints: !) + +My heart is nothing +While true +If my heart is more than 5 break +Build my heart up +Yeah + +Shout my heart (prints: 6) + +The odds takes the limit +A number is nothing +While a number is less than the limit +Build a number up +Let half be a number over 2 +Turn down half +If half is a number over 2 continue +Write a number +Write "," +Yeah, yeah + +Call the odds with 10 (writes: 1,3,5,7,9,) + +My head is "123" +My heart is 123 +If my head is my heart say "my head is my heart" (prints: my head is my heart) + +(prints: it's alright, it's just a metaphor) +If my head is exactly my heart +Say "this is a serious medical condition" +Otherwise +Say "it's alright, it's just a metaphor" +End + +Your love is true +My cat is 1 +If your love is my cat print "your love is my cat" (prints: your love is my cat) + +(prints: types are hard, yo) +If your love is exactly my cat say "I'm calling the cops" otherwise say "types are hard, yo" + +Alpha takes beta +Gamma takes delta +Epsilon takes zeta +Give back zeta with " ", delta, " ", beta +Yeah, yeah, yeah + +Put Alpha taking "Halen" into AddHalen +Put AddHalen taking "van" into AddVanHalen +Shout AddVanHalen taking "Alex" (prints: Alex van Halen) + +A number is silence +They are with "F" +Them is with "a" +She is with "b" +Him is with "u" +Her is with "l" +Hir is with "o" +Zie is with "u" +Zir is with "s" +Xem is with " " +Ver is with "T" +Ze is with "h" +Ve is with "u" +Xe is with "n" +It is with "d" +He is with "e" +You are with "r" +Me is with "birds" +I am with "!" +Say it (prints: Fabulous Thunderbirds!) + + +The times is 5 +Say it times the times (prints: 25) +Say the times times it (prints: 25) +Say the times times the times (prints: 25) + +A girl is laughing +Her eyes are bright +Say her times the times (prints: 30) +Say her times her eyes (prints: 36) + +A boy is crying +His eyes are dark +He is with a girl +Say him (prints: 12) + +ReturnFunction takes x +Return "Return " with x, oh + +GivingFunction takes x giving "Giving " with x + +GiveFunction takes x +Give "Give " with x, yeah + +SendFunction takes x +Send "Send " with x, baby + +Shout GivingFunction taking "La Vida Loca" (prints: Giving La Vida Loca) +Shout GiveFunction taking "In To Me" (prints: Give In To Me) +Shout SendFunction taking "Me An Angel" (prints: Send Me An Angel) +Shout ReturnFunction taking "To Sender" (prints: Return To Sender) + +Tommy says we've got each other +Gina said we've got to hold on +The Scorpions say here I am + +Shout Gina (prints: we've got to hold on) +Shout Tommy (prints: we've got each other) +Shout the Scorpions (prints: here I am) + +A child is crying +An angel is dying +The day is long +My heart is breaking +Your lies are endless +Our flag is death + +Print "" with a child, an angel, the day, my heart, your lies & our flag +(prints: 654875) + +If 2 is greater than 1 print "greater" (prints: greater) +If 2 is higher than 1 print "higher" (prints: higher) +if 2 is stronger than 1 print "stronger" (prints: stronger) +if 2 is more than 1 print "more" (prints: more) +if 2 is above 1 print "above" (prints: above) +if 2 > 1 print ">" (prints: >) + +if 1 is less than 2 print "less" (prints: less) +if 1 is lower than 2 print "lower" (prints: lower) +if 1 is smaller than 2 print "smaller" (prints: smaller) +if 1 is weaker than 2 print "weaker" (prints: weaker) +If 1 is below 2 print "below" (prints: below) +If 1 < 2 print "<" (prints: <) + +if 2 is as great as 2 print "as great as" (prints: as great as) +if 2 is as high as 2 print "as high as" (prints: as high as) +if 2 is as big as 2 print "as big as" (prints: as big as) +if 2 is as strong as 2 print "as strong as" (prints: as strong as) +if 2 <= 2 print "<=" (prints: <=) + +if 2 is as low as 2 print "as low as" (prints: as low as) +if 2 is as small as 2 print "as small as" (prints: as small as) +if 2 is as weak as 2 print "as weak as" (prints: as weak as) +if 2 >= 2 print ">=" (prints: >=) + +Shout null (prints: null) +Shout nothing (prints: null) +Shout nowhere (prints: null) +Shout nobody (prints: null) +Shout gone (prints: null) +Shout empty (prints: ) +Shout silence (prints: ) +Shout silent (prints: ) + +Blondie takes nothing +Shout "Hanging on the telephone" +End + +Call me (prints: Hanging on the telephone) + +Cast "A" into the ascii +Print the ascii (prints: 65) +Cast 65 into the letter +Print the letter (prints: A) +Cast "123.45" into the number using 10 +Print the number (prints: 123.45) +Cast "100" into the octal using 8 +Print the octal (prints: 64) +Cast "1.4" into the octal using 8 +Print the octal (prints: 1.5) +Cast "abc.def" into the octal using 16 +Print the octal (prints: 2748.870849609375) + +Write "this is the end" (writes: this is the end) + \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/99-rockstar-acid-test/acid-test.rock.in b/Starship/Rockstar.Test/programs/examples/99-rockstar-acid-test/acid-test.rock.in new file mode 100644 index 00000000..7fddd2fc --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/99-rockstar-acid-test/acid-test.rock.in @@ -0,0 +1,4 @@ +The first line of acid-test.rock.in +The second line of acid-test.rock.in +The third line of acid-test.rock.in +The fourth line of acid-test.rock.in diff --git a/Starship/Rockstar.Test/programs/examples/fizzbuzz/fb1.rock b/Starship/Rockstar.Test/programs/examples/fizzbuzz/fb1.rock new file mode 100644 index 00000000..6407f648 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/fizzbuzz/fb1.rock @@ -0,0 +1,28 @@ +modulus takes number, divisor +while number >= divisor +number = number - divisor +end (while) +return number +end (function) + +let limit = 100 +let counter = 0 +let fizz = 3 +let buzz = 5 + +until counter = limit +counter = counter + 1 +if modulus taking counter, fizz * buzz is 0 +print "FizzBuzz" +continue +end (if) +if modulus taking counter, buzz is 0 +print "Buzz" +continue +end (if) +if modulus taking counter, fizz is 0 +print "Fizz" +continue +end (if) +print counter +end (while) diff --git a/Starship/Rockstar.Test/programs/examples/fizzbuzz/fb2.rock b/Starship/Rockstar.Test/programs/examples/fizzbuzz/fb2.rock new file mode 100644 index 00000000..b304a8c8 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/fizzbuzz/fb2.rock @@ -0,0 +1,26 @@ +Midnight takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart, baby +Give back your heart, yeah + +let limit = 100 +let counter = 0 +let fizz = 3 +let buzz = 5 + +until counter = limit +counter = counter + 1 +if midnight taking counter, fizz * buzz is 0 +print "FizzBuzz" +continue +end (if) +if midnight taking counter, buzz is 0 +print "Buzz" +continue +end (if) +if midnight taking counter, fizz is 0 +print "Fizz" +continue +end (if) +print counter +end (while) diff --git a/Starship/Rockstar.Test/programs/examples/fizzbuzz/fb3.rock b/Starship/Rockstar.Test/programs/examples/fizzbuzz/fb3.rock new file mode 100644 index 00000000..87f5ecad --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/fizzbuzz/fb3.rock @@ -0,0 +1,26 @@ +Midnight takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart, baby +Give back your heart, yeah + +Desire is a lovestruck ladykiller +My world is nothing +Fire is ice +Fate is water + +Until my world is desire +Build my world up +if midnight taking my world, fire is 0 and midnight taking my world, fate is 0 +print "FizzBuzz" +continue +end (if) +if midnight taking my world, fate is 0 +print "Buzz" +continue +end (if) +if midnight taking my world, fire is 0 +print "Fizz" +continue +end (if) +print my world +end (while) diff --git a/examples/99_beers.rock b/Starship/Rockstar.Test/programs/examples/gallery/99_beers.rock similarity index 100% rename from examples/99_beers.rock rename to Starship/Rockstar.Test/programs/examples/gallery/99_beers.rock diff --git a/examples/README.md b/Starship/Rockstar.Test/programs/examples/gallery/README.md similarity index 100% rename from examples/README.md rename to Starship/Rockstar.Test/programs/examples/gallery/README.md diff --git a/examples/The-Final-Stand.rock b/Starship/Rockstar.Test/programs/examples/gallery/The-Final-Stand.rock similarity index 100% rename from examples/The-Final-Stand.rock rename to Starship/Rockstar.Test/programs/examples/gallery/The-Final-Stand.rock diff --git a/examples/decimal_to_binary_converter.rock b/Starship/Rockstar.Test/programs/examples/gallery/decimal_to_binary_converter.rock similarity index 100% rename from examples/decimal_to_binary_converter.rock rename to Starship/Rockstar.Test/programs/examples/gallery/decimal_to_binary_converter.rock diff --git a/examples/factorization.rock b/Starship/Rockstar.Test/programs/examples/gallery/factorization.rock similarity index 100% rename from examples/factorization.rock rename to Starship/Rockstar.Test/programs/examples/gallery/factorization.rock diff --git a/examples/fizzbuzz-using-stacks-and-cast.rock b/Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz-using-stacks-and-cast.rock similarity index 87% rename from examples/fizzbuzz-using-stacks-and-cast.rock rename to Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz-using-stacks-and-cast.rock index c3d1e655..2cdf7b1d 100644 --- a/examples/fizzbuzz-using-stacks-and-cast.rock +++ b/Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz-using-stacks-and-cast.rock @@ -1,11 +1,11 @@ -Eternity takes the pain. -The prize is silence -Until the pain is nothing, -Roll the pain into violence, +Eternity takes forever. +my price is silence +Until forever is nothing, +Roll forever into violence, Cast violence into your lies, -Let the prize be with your lies. +Let my price be with your lies. -Give back the prize +Give back my price Midnight takes your heart and your soul While your heart is as high as your soul diff --git a/examples/fizzbuzz.rock b/Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz.rock similarity index 100% rename from examples/fizzbuzz.rock rename to Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz.rock diff --git a/Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz2.rock b/Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz2.rock new file mode 100644 index 00000000..f366bbc5 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz2.rock @@ -0,0 +1,31 @@ +Midnight takes your heart and your soul +While your heart is as high as your soul +Put your heart without your soul into your heart, baby +Give back your heart, yeah + +My dreams hold diamond nightmares +Salvation holds the sea +The night holds silent echoes +Your love is meaningless to me + +Rock my dreams like a lovestruck smile +Rock my dreams with your love, your love +Rock the night like a switchblade missile +Rock the night with your love, your love. + +Desire is a lovestruck ladykiller +My world is nothing +Fire is ice +The sky is cryin' +Until my world is desire, +Build my world up +If midnight taking my world, fire is nothing and midnight taking my world, and the sky is nothing +Shout my dreams with the night with salvation +Take my heart, baby +If midnight taking my world, fire is nothing +Shout my dreams with salvation +Take my dreams, baby +If midnight taking my world, the sky is nothing +Shout the night with salvation +Take the night, yeah +Whisper my world diff --git a/tests/fixtures/examples/fizzbuzz-idiomatic.rock.out b/Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz2.rock.out similarity index 100% rename from tests/fixtures/examples/fizzbuzz-idiomatic.rock.out rename to Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz2.rock.out diff --git a/examples/fizzbuzz_minimalist.rock b/Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz_minimalist.rock similarity index 88% rename from examples/fizzbuzz_minimalist.rock rename to Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz_minimalist.rock index d318a7a9..1bdd179b 100644 --- a/examples/fizzbuzz_minimalist.rock +++ b/Starship/Rockstar.Test/programs/examples/gallery/fizzbuzz_minimalist.rock @@ -14,11 +14,11 @@ If Modulus taking Counter, Fizz is 0 and Modulus taking Counter, Buzz is 0 Say "FizzBuzz!" Continue (blank line ending 'If' Block) -If Modulus taking Counter and Fizz is 0 +If Modulus taking Counter, Fizz is 0 Say "Fizz!" Continue (blank line ending 'If' Block) -If Modulus taking Counter and Buzz is 0 +If Modulus taking Counter, Buzz is 0 Say "Buzz!" Continue (blank line ending 'If' Block) diff --git a/Starship/Rockstar.Test/programs/examples/gallery/hello-world.rock b/Starship/Rockstar.Test/programs/examples/gallery/hello-world.rock new file mode 100644 index 00000000..ad7e4211 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/gallery/hello-world.rock @@ -0,0 +1,28 @@ +Eternity takes forever; my price is silence +Until forever is nothing; roll it into violence +Cast violence into my soul +Let my price be with my soul, baby +Give back my price + +The night is calling me +Rock it like a shadowclad tranquility +The dream is a spellbound moonbeam +Your love is a neverending bewitchment +Rock the night with the dream, the dream, +Rock the night with your love + +Control is illusion tangled +Rock it with your love +Rock it like a thunderbolt fire +Rock it with the dream +Rock it like a stormcloud dreamspire + +Let desire be eternity taking my soul +Let the light be eternity taking control + +Time is like the storm-shadow +Cast it into the night +Let desire be with the night +Let desire be with the light +Whisper desire + diff --git a/examples/isPalindrome.rock b/Starship/Rockstar.Test/programs/examples/gallery/isPalindrome.rock similarity index 75% rename from examples/isPalindrome.rock rename to Starship/Rockstar.Test/programs/examples/gallery/isPalindrome.rock index f8882495..9adab4e6 100644 --- a/examples/isPalindrome.rock +++ b/Starship/Rockstar.Test/programs/examples/gallery/isPalindrome.rock @@ -1,11 +1,11 @@ -My soul is on fire -The mystery's of my heart desire -My soul is on fire +the fire is on fire +The mystery's in my heart desire +the fire is on fire Listen to my heart Cut her into pieces Put her into the fire Let my ire be her -My soul is ice cold +the fire is ice cold Love is a liar Hate is a fool @@ -19,7 +19,7 @@ My blood is ice cold Let lust be love with hate Knock your desire down -Let my soul be my soul at your desire +Let the fire be the fire at your desire My blood is ice cold Lust is for fools @@ -29,7 +29,7 @@ The fools are blood that flows ice cold While my ire is stronger than the fire Let the flames be my heart at pieces -Let my soul be with the flames +Let the fire be with the flames Knock my ire down Let pieces be pieces with your desire @@ -39,8 +39,8 @@ Blood is burning with flames Thin is the ice My heart was melted -If my soul is my blood +If the fire is my blood Shout "Love is true" -If my soul ain't my blood -Shout "Hate runs through" \ No newline at end of file +If the fire ain't my blood +Shout "Hate runs through" diff --git a/Starship/Rockstar.Test/programs/examples/gallery/isPalindrome.rock.in b/Starship/Rockstar.Test/programs/examples/gallery/isPalindrome.rock.in new file mode 100644 index 00000000..58c34b22 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/gallery/isPalindrome.rock.in @@ -0,0 +1 @@ +kayak diff --git a/examples/mandelbrot.rock b/Starship/Rockstar.Test/programs/examples/gallery/mandelbrot.rock similarity index 98% rename from examples/mandelbrot.rock rename to Starship/Rockstar.Test/programs/examples/gallery/mandelbrot.rock index 82a561ad..fd296673 100644 --- a/examples/mandelbrot.rock +++ b/Starship/Rockstar.Test/programs/examples/gallery/mandelbrot.rock @@ -1,5 +1,5 @@ Eddy wants your dedication, and a hug -The goal is not so incredible +The goal is yet so incredible The expectations are incredible The hope is incredible The fear is real diff --git a/Starship/Rockstar.Test/programs/examples/gallery/mandelbrot.rock.out b/Starship/Rockstar.Test/programs/examples/gallery/mandelbrot.rock.out new file mode 100644 index 00000000..e88877b5 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/gallery/mandelbrot.rock.out @@ -0,0 +1,30 @@ + + . + ...... + ...... + . .... + .. ................. + ......................... ... + ............................. + ............................... + ..................................... + . . .................................... + .......... ..................................... + .............. .................................... + .................................................... + . ......................................................... + .................................................... + .............. .................................... + .......... ..................................... + . . .................................... + ..................................... + ............................... + ............................. + ......................... ... + .. ................. + . .... + ...... + ...... + . + + diff --git a/Starship/Rockstar.Test/programs/examples/gallery/nth-fibonacci.rock b/Starship/Rockstar.Test/programs/examples/gallery/nth-fibonacci.rock new file mode 100644 index 00000000..d0df345b --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/gallery/nth-fibonacci.rock @@ -0,0 +1,21 @@ +The spiral takes the fire +The moon is all over me +Let my life be the moon over the moon +the fire was gone +If the fire is my life +Give back the fire + +The circle is me +If the fire is the circle +Give back my life + +Until the circle is the fire +Let the moon be the fire +Let the fire be my life +Put the moon with my life into my life +Build the circle up + +Give back the fire with my life + +Listen to the nature +Shout the spiral taking the nature diff --git a/Starship/Rockstar.Test/programs/examples/gallery/nth-fibonacci.rock.in b/Starship/Rockstar.Test/programs/examples/gallery/nth-fibonacci.rock.in new file mode 100644 index 00000000..9a037142 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/gallery/nth-fibonacci.rock.in @@ -0,0 +1 @@ +10 \ No newline at end of file diff --git a/examples/primes_with_input.rock b/Starship/Rockstar.Test/programs/examples/gallery/primes_with_input.rock similarity index 100% rename from examples/primes_with_input.rock rename to Starship/Rockstar.Test/programs/examples/gallery/primes_with_input.rock diff --git a/examples/primes_with_input_v2.rock b/Starship/Rockstar.Test/programs/examples/gallery/primes_with_input_v2.rock similarity index 100% rename from examples/primes_with_input_v2.rock rename to Starship/Rockstar.Test/programs/examples/gallery/primes_with_input_v2.rock diff --git a/examples/rot13.rock b/Starship/Rockstar.Test/programs/examples/gallery/rot13.rock similarity index 100% rename from examples/rot13.rock rename to Starship/Rockstar.Test/programs/examples/gallery/rot13.rock diff --git a/Starship/Rockstar.Test/programs/examples/gallery/rot13.rock.in b/Starship/Rockstar.Test/programs/examples/gallery/rot13.rock.in new file mode 100644 index 00000000..2c43abf2 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/gallery/rot13.rock.in @@ -0,0 +1 @@ +Gnxr zr qbja gb gur Cnenqvfr Pvgl \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/basic-arithmetic.rock b/Starship/Rockstar.Test/programs/examples/tutorial/basic-arithmetic.rock new file mode 100644 index 00000000..bdedd55d --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/basic-arithmetic.rock @@ -0,0 +1,5 @@ +Print 1 + 2 +Print 3 * 4 +Print 5 - 6 +Print 7 / 8 +Print 1 + 2 * 3 - 4 / 5 diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/basic-arrays.rock b/Starship/Rockstar.Test/programs/examples/tutorial/basic-arrays.rock new file mode 100644 index 00000000..c22e239c --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/basic-arrays.rock @@ -0,0 +1,6 @@ +Rock my array +Print my array (prints: [ ]) + +Rock the night with 1, 2, 3 +Print the night (prints: [ 1, 2, 3 ]) + diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/boolean-logic.rock b/Starship/Rockstar.Test/programs/examples/tutorial/boolean-logic.rock new file mode 100644 index 00000000..a910247a --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/boolean-logic.rock @@ -0,0 +1,10 @@ +My heart is true +Your love is true +His dreams are lies +Her heart is wrong + +If my heart and your love shout "Joan" +If my heart or her dreams shout "Cherie" +If my heart and not her dreams shout "Lita" +If his dreams and her heart shout "Micki" +If his dreams nor her heart shout "Sandy" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/break-and-take.rock b/Starship/Rockstar.Test/programs/examples/tutorial/break-and-take.rock new file mode 100644 index 00000000..377538b5 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/break-and-take.rock @@ -0,0 +1,14 @@ +My love is nothing +While my love ain't like a rose, +Whisper my love +If my love is like fire +Break my heart, yeah +Build my love up, baby + +My love is nothing +While my love ain't like a rose, +Build my love up +If my love is like fire +Take me to the river, baby +Whisper my love, yeah + diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/cast.rock b/Starship/Rockstar.Test/programs/examples/tutorial/cast.rock new file mode 100644 index 00000000..48d56bc2 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/cast.rock @@ -0,0 +1,21 @@ +Let X be "123.45" +Shout X + X (prints: 123.45123.45) +Cast X with 10 +Shout X + X (prints: 246.9) +Let X be "FF" +Cast X with 16 (cast using base 16) +Shout X (prints: 255) + +Cast 65 into result. Shout result (prints: A) + +Cast result. Shout result (prints: 65) + +Cast 1046 into result. Shout result (prints: Ж) + +Guitar is "1F3B8". Cast it with 16. Cast it. +Shout it. (prints: 🎸) + +The string is "32" +Cast the string into the codes +Write the codes at 0 (writes: 51) +Write the codes at 1 (writes: 50) diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/common-variables.rock b/Starship/Rockstar.Test/programs/examples/tutorial/common-variables.rock new file mode 100644 index 00000000..a8483155 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/common-variables.rock @@ -0,0 +1,5 @@ +My heart is 123 +Let your love be 456 +Put 789 into the night + +Shout my heart. Scream your love. Whisper the night. \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/comparisons.rock b/Starship/Rockstar.Test/programs/examples/tutorial/comparisons.rock new file mode 100644 index 00000000..2a4e3cf2 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/comparisons.rock @@ -0,0 +1,12 @@ +X is 5 +If x >= 5 print "Ozzy" +If x <= 5 print "Tony" +If x < 6 print "Geezer" +if x > 4 print "Bill" + +My heart is crying +The sky is on fire +If the sky is greater than my heart print "Vince" +If the sky is as high as my heart print "Mick" +If my heart is weaker than the sky print "Nikki" +If my heart is as low as the sky print "Tommy" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/equality.rock b/Starship/Rockstar.Test/programs/examples/tutorial/equality.rock new file mode 100644 index 00000000..4a8a68a7 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/equality.rock @@ -0,0 +1,7 @@ +X is 1 +If x = 1 print "Axl" +If X is 1 print "Slash" +If X != 2 print "Izzy" +If X is not 2 print "Dizzy" +If X isn't 2 print "Duff" +If X ain't nothing print "Matt" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/function-list.rock b/Starship/Rockstar.Test/programs/examples/tutorial/function-list.rock new file mode 100644 index 00000000..99bf508f --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/function-list.rock @@ -0,0 +1,11 @@ +The jungle takes Axl, Slash & Duff n' Izzy, and Steven +Write Axl. Write Slash. Write Duff. Write Izzy. Print Steven. +Yeah. + +Call the jungle with "Oh, " & "oh " n' "oh, ", and "sweet child", " o' mine" + +Led Zeppelin takes Robert and Jimmy and John Paul and Bonzo +Give back Robert with Jimmy with John Paul with Bonzo +Baby + +Print Led Zeppelin taking "Stair", "way", " to ", and "Heaven" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/functions.rock b/Starship/Rockstar.Test/programs/examples/tutorial/functions.rock new file mode 100644 index 00000000..3cb63980 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/functions.rock @@ -0,0 +1,11 @@ +Sum takes x, y +Give back x + y +End + +Print sum taking 5, 6 + +Product takes x, y giving x * y + +Foo is 5 +Bar is 6 +Print product taking foo, bar diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/hello-world-aliases.rock b/Starship/Rockstar.Test/programs/examples/tutorial/hello-world-aliases.rock new file mode 100644 index 00000000..e8b05272 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/hello-world-aliases.rock @@ -0,0 +1,4 @@ +Say "Hello London..." +Shout "Hello, London!" +SCREAM "I SAID HELLO, LONDON!" +whisper "...do you wanna get rocked?" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/if-else-baby.rock b/Starship/Rockstar.Test/programs/examples/tutorial/if-else-baby.rock new file mode 100644 index 00000000..b46fbf7e --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/if-else-baby.rock @@ -0,0 +1,6 @@ +Your love is nothing +Until your love is like a heartbreak +If your love ain't nothing whisper your love +If your love is like stone +Whisper "whoa, we're halfway there...", yeah +Build your love up, baby \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/if-else.rock b/Starship/Rockstar.Test/programs/examples/tutorial/if-else.rock new file mode 100644 index 00000000..11449ac2 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/if-else.rock @@ -0,0 +1,9 @@ +X is 0 +Until X is 10 +Write X with ": " +If X is 5 Print "X is 5!" Else Print "X is not 5" (one-line If statement) +If X is 2 +Print X with " is 2" +End (end of multi-line If block) +Put X plus 1 into X +End (end of Until loop) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/join-arrays.rock b/Starship/Rockstar.Test/programs/examples/tutorial/join-arrays.rock new file mode 100644 index 00000000..5a9be4bc --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/join-arrays.rock @@ -0,0 +1,12 @@ +Let the string be "abcde" +Split the string into the tokens +Join the tokens with ";" +Print the tokens (prints: a;b;c;d;e) + +The input says hey now hey now now +Split the input into the words with " " +Unite the words into the output with "! " +Print the output with "!" (prints: hey! now! hey! now! now!) + +Gather the words into the output with "-" +Print the output (prints: hey-now-hey-now-now) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/listen.rock b/Starship/Rockstar.Test/programs/examples/tutorial/listen.rock new file mode 100644 index 00000000..800a8621 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/listen.rock @@ -0,0 +1,6 @@ +Listen to the night +If the night ain't nothing +Shout the night +Otherwise +Shout "no input provided" +Baby diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/lyrical-arithmetic-1.rock b/Starship/Rockstar.Test/programs/examples/tutorial/lyrical-arithmetic-1.rock new file mode 100644 index 00000000..46395f71 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/lyrical-arithmetic-1.rock @@ -0,0 +1,7 @@ +The price is 5. The tax is 4. The discount is 3. The quantity is 2. +The distance is 20. The time is 10. + +Let the total be the price plus the tax. Print the total. +Let the total be the price minus the discount. Print the total. +Let the cost be the quantity times the price. Print the cost. +Let the speed be the distance divided by the time. Print the speed. diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/lyrical-arithmetic-2.rock b/Starship/Rockstar.Test/programs/examples/tutorial/lyrical-arithmetic-2.rock new file mode 100644 index 00000000..b311b4cd --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/lyrical-arithmetic-2.rock @@ -0,0 +1,9 @@ +My heart is 1. The night is 2. +The wings are 3. Your love is 4. +A hope is 5. A girl is 6. +A boy is 7. A dream is 8. + +Let Tommy be a boy with a dream. Say Tommy. (prints: 15) +Let Gina be a girl without a hope. Say Gina (prints: 1) +Whisper the wings of the night (prints: 6) +Scream a dream over the night (prints: 4) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/ninja-strings.rock b/Starship/Rockstar.Test/programs/examples/tutorial/ninja-strings.rock new file mode 100644 index 00000000..658c817f --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/ninja-strings.rock @@ -0,0 +1,11 @@ +My soul is empty +Rock my soul with 70 (ASCII code for F) +Rock my soul 105 (ASCII i) +Rock my soul with 122, 122 (ASCII z, z) + +The night holds Eddie's guitar ( = 66 = B) +Rock the night like a heartbroken heroine ( = 117 = u) +Fury is a rage-twisted thundercloud ( = 122 = z) +Rock the night with fury, fury (z, z) + +Whisper my soul with the night (prints: FizzBuzz) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/oooh-baby.rock b/Starship/Rockstar.Test/programs/examples/tutorial/oooh-baby.rock new file mode 100644 index 00000000..8e68abf4 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/oooh-baby.rock @@ -0,0 +1,7 @@ +If true +if true +if true +if true +if true +Shout "Yep, it's DEFINITELY true" +Oooh yeah baby \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/parse-trees.rock b/Starship/Rockstar.Test/programs/examples/tutorial/parse-trees.rock new file mode 100644 index 00000000..c777d9b2 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/parse-trees.rock @@ -0,0 +1,5 @@ +Tommy was 123 +Gina's working the diner all day. +Print Tommy. Shout Gina. +Tommy's with Gina. +Print Tommy. \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/print-hello-world.rock b/Starship/Rockstar.Test/programs/examples/tutorial/print-hello-world.rock new file mode 100644 index 00000000..e2c08566 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/print-hello-world.rock @@ -0,0 +1 @@ +print "hello world" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/pronouns.rock b/Starship/Rockstar.Test/programs/examples/tutorial/pronouns.rock new file mode 100644 index 00000000..e1c52497 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/pronouns.rock @@ -0,0 +1,12 @@ +My variable is true +If it's true print "it's true!" + +The counter is 0 +While it's less than 10 +Shout it +Build it up, baby. + +Gina's empty +Until she's like a star +Build her up +Whisper her, baby diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/proper-variables.rock b/Starship/Rockstar.Test/programs/examples/tutorial/proper-variables.rock new file mode 100644 index 00000000..052498c9 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/proper-variables.rock @@ -0,0 +1,5 @@ +Doctor Feelgood is 123 +Johnny B. Goode is 456 +Billie Jean is 789 + +Shout Doctor Feelgood! Whisper Johnny B. Goode? Say Billie Jean. \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/push-and-pop.rock b/Starship/Rockstar.Test/programs/examples/tutorial/push-and-pop.rock new file mode 100644 index 00000000..1a16afdb --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/push-and-pop.rock @@ -0,0 +1,8 @@ +Rock your stack with 1, 2, 3, 4, 5 +Shout pop your stack (prints: 5) +Shout roll your stack (prints: 1) +Shout pop your stack (prints: 4) +Shout roll your stack (prints: 2) +Shout your stack (prints: [ 3 ]) +Pop your stack +Shout your stack (prints: [ ]) diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/ricky-was-a-young-boy.rock b/Starship/Rockstar.Test/programs/examples/tutorial/ricky-was-a-young-boy.rock new file mode 100644 index 00000000..fbfcb9e5 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/ricky-was-a-young-boy.rock @@ -0,0 +1,2 @@ +Ricky was a young boy, he had a heart of stone. +Scream Ricky. \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/rock-and-roll.rock b/Starship/Rockstar.Test/programs/examples/tutorial/rock-and-roll.rock new file mode 100644 index 00000000..91a1514c --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/rock-and-roll.rock @@ -0,0 +1,10 @@ +Rock my array with 1, 2, 3 +While my array ain't empty +Roll my array into the result +Print the result +Yeah +(prints: +1 +2 +3 +) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/rockstar-arithmetic.rock b/Starship/Rockstar.Test/programs/examples/tutorial/rockstar-arithmetic.rock new file mode 100644 index 00000000..ea6e3147 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/rockstar-arithmetic.rock @@ -0,0 +1,7 @@ +Print "banana" times -1 +Print "banana" divided by "a" +Print "yeah" plus true plus null plus 2 plus " yeah!" +Print "Bon Joviality" - "ality" +Print "Heartbreak" * 0.5 +Print "AD" times "C" +Print "Motley" times "Crue" \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/short-circuits.rock b/Starship/Rockstar.Test/programs/examples/tutorial/short-circuits.rock new file mode 100644 index 00000000..fa9ecbf4 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/short-circuits.rock @@ -0,0 +1,4 @@ +Print 3 or 5 (prints: 3) +Print 0 or "rock!" (prints: rock!) +Print false and 1/0 (prints: false) (and never divides by zero) +Print "yeah!" or 1/0 (prints: yeah!) (and never divides by zero) \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/simple-variables.rock b/Starship/Rockstar.Test/programs/examples/tutorial/simple-variables.rock new file mode 100644 index 00000000..e30b9404 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/simple-variables.rock @@ -0,0 +1,5 @@ +x is 123 +let myVariable be 456 +put 789 into customerId +print x. print myVariable. print customerId. + diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/split-strings.rock b/Starship/Rockstar.Test/programs/examples/tutorial/split-strings.rock new file mode 100644 index 00000000..013f032e --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/split-strings.rock @@ -0,0 +1,12 @@ +Split "a,b,c" into the array +Shout the array (prints: [ "a", ",", "b", ",", "c" ]) +Shout the array + 0 (prints: 5) + +Split "a,b,c" into the array with "," +Shout the array (prints: [ "a", "b", "c" ]) +Shout the array + 0 (prints: 3) + +My life says heartbreak +Cut my life into pieces +Shout pieces (prints: [ "h", "e", "a", "r", "t", "b", "r", "e", "a", "k" ]) +Shout pieces + 0 (prints: 10) diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/strings.rock b/Starship/Rockstar.Test/programs/examples/tutorial/strings.rock new file mode 100644 index 00000000..15fa8f09 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/strings.rock @@ -0,0 +1,7 @@ +My string is "hey, this is mine!" +Your string is "look, ""nested quotes"" - see?" +Gina says we gotta hold on to what we've got. + +Print my string. +Shout your string. +Whisper Gina. diff --git a/Starship/Rockstar.Test/programs/examples/tutorial/with-empty.rock b/Starship/Rockstar.Test/programs/examples/tutorial/with-empty.rock new file mode 100644 index 00000000..05493383 --- /dev/null +++ b/Starship/Rockstar.Test/programs/examples/tutorial/with-empty.rock @@ -0,0 +1,11 @@ +My boolean is true +My number is 12.34 +The night is empty + +My boolean is with the night +Shatter my boolean +Whisper my boolean (prints: [ "t", "r", "u", "e" ]) + +My number is with the night +Shatter my number +Whisper my number (prints: [ "1", "2", ".", "3", "4" ]) diff --git a/Starship/Rockstar.Test/programs/fixtures/conditionals/if-block-else-block.rock b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-block-else-block.rock new file mode 100644 index 00000000..b3540a40 --- /dev/null +++ b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-block-else-block.rock @@ -0,0 +1,16 @@ +if 1 +say 1 +otherwise +say 2 +end + +if 1 +say 1 +else +say 2 +end + +if 1 +say 1 +else +say 2 \ No newline at end of file diff --git a/Starship/Rockstar.Test/programs/fixtures/conditionals/if-block-else-statement.rock b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-block-else-statement.rock new file mode 100644 index 00000000..56a5c80f --- /dev/null +++ b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-block-else-statement.rock @@ -0,0 +1,5 @@ +if 0 say 1 else +say 2 (prints: 2) +say 3 (prints: 3) +say 4 (prints: 4) +end diff --git a/Starship/Rockstar.Test/programs/fixtures/conditionals/if-if-block-else-block.rock b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-if-block-else-block.rock new file mode 100644 index 00000000..804d0b9b --- /dev/null +++ b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-if-block-else-block.rock @@ -0,0 +1,26 @@ +if 1 +if 2 +print 2 (prints: 2) +else +print 1 +end +end + +if 1 + if 2 + print 2 (prints: 2) + else + print 1 + end +end + + +if 1 + if 2 + if 3 + print 3 (prints: 3) + end + end +end +print 0 (prints: 0) + diff --git a/Starship/Rockstar.Test/programs/fixtures/conditionals/if-if-if-block-end-statement.rock b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-if-if-block-end-statement.rock new file mode 100644 index 00000000..b0438a20 --- /dev/null +++ b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-if-if-block-end-statement.rock @@ -0,0 +1,10 @@ +(prints: 3\n4) +if 1 + if 2 + if 3 + say 3 + end + end +end + +say 4 diff --git a/Starship/Rockstar.Test/programs/fixtures/conditionals/if-if-if-if-oooh.rock b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-if-if-if-oooh.rock new file mode 100644 index 00000000..d9ff82c1 --- /dev/null +++ b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-if-if-if-oooh.rock @@ -0,0 +1,8 @@ +if 1 +if 2 +if 3 +if 4 +say 4 oh yeah baby +say 1 +yeah +say 0 diff --git a/Starship/Rockstar.Test/programs/fixtures/conditionals/if-statement-else-statement.rock b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-statement-else-statement.rock new file mode 100644 index 00000000..244283ef --- /dev/null +++ b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-statement-else-statement.rock @@ -0,0 +1,4 @@ +if false say 1 else say 2 (prints: 2) +if true say true else say false (prints: true) +if 1 then say "yeah" else say "nope" (prints: yeah) +if 0 then say "yeah" else say "nope" (prints: nope) diff --git a/Starship/Rockstar.Test/programs/fixtures/conditionals/if-statement.rock b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-statement.rock new file mode 100644 index 00000000..0cb53d5a --- /dev/null +++ b/Starship/Rockstar.Test/programs/fixtures/conditionals/if-statement.rock @@ -0,0 +1 @@ +if 1 say 1 (prints: 1) \ No newline at end of file diff --git a/tests/fixtures/arrays/array_functions.rock b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/array_functions.rock similarity index 100% rename from tests/fixtures/arrays/array_functions.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/array_functions.rock diff --git a/tests/fixtures/arrays/array_functions.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/array_functions.rock.out similarity index 71% rename from tests/fixtures/arrays/array_functions.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/array_functions.rock.out index 5088d84b..31c5d196 100644 --- a/tests/fixtures/arrays/array_functions.rock.out +++ b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/array_functions.rock.out @@ -1,7 +1,7 @@ function that does nothing -1 +[ null ] null -1 +[ null ] null function that multiplies elements in an array @@ -14,12 +14,12 @@ function that multiplies elements in an array 9 10 1814400 -8 +[ 3, 4, 5, 6, 7, 8, 9, 10 ] function that returns an array -0 +[ ] mysterious -0 +[ ] mysterious -1 +[ "hello" ] hello diff --git a/tests/fixtures/arrays/arrayalike.rock b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrayalike.rock similarity index 82% rename from tests/fixtures/arrays/arrayalike.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrayalike.rock index 8374bce1..ea9034f9 100644 --- a/tests/fixtures/arrays/arrayalike.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrayalike.rock @@ -1,6 +1,7 @@ Let my array at 10000000 be "large" -Shout my array +Shout my array + 0 Shout my array at 9999999 +Shout my array at 10000001 Shout my array at 10000000 Let my string be "abc" diff --git a/tests/fixtures/arrays/arrayalike.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrayalike.rock.out similarity index 90% rename from tests/fixtures/arrays/arrayalike.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrayalike.rock.out index a91531f3..da738e69 100644 --- a/tests/fixtures/arrays/arrayalike.rock.out +++ b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrayalike.rock.out @@ -1,4 +1,5 @@ 10000001 +null mysterious large a diff --git a/tests/fixtures/arrays/arrays.rock b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrays.rock similarity index 91% rename from tests/fixtures/arrays/arrays.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrays.rock index f5da2d43..0b16bc85 100644 --- a/tests/fixtures/arrays/arrays.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrays.rock @@ -6,4 +6,4 @@ Shout my array at 0 Shout my array at 1 Shout my array at 2 Shout my array at "key" -Shout my array +Shout my array + 0 diff --git a/tests/fixtures/arrays/arrays.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrays.rock.out similarity index 100% rename from tests/fixtures/arrays/arrays.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/arrays.rock.out diff --git a/tests/fixtures/arrays/hash.rock b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/hash.rock similarity index 80% rename from tests/fixtures/arrays/hash.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/hash.rock index 4846bfac..6669d485 100644 --- a/tests/fixtures/arrays/hash.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/hash.rock @@ -2,17 +2,17 @@ Let my hash at "key" be "value" Shout my hash at "key" Let my hash at "key" be "hello" Shout my hash at "key" -Shout my hash +Shout my hash + 0 Let my hash at 0 be "zero" -Shout my hash +Shout my hash + 0 Midnight says abc Daylight says def Let your hash at midnight be daylight Shout your hash at midnight Shout daylight -Shout your hash +Shout your hash + 0 Moonlight is sweet sorrow Let your hash at moonlight be nothing -Shout your hash +Shout your hash + 0 diff --git a/tests/fixtures/arrays/hash.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/hash.rock.out similarity index 100% rename from tests/fixtures/arrays/hash.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/hash.rock.out diff --git a/tests/fixtures/arrays/join.rock b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/join.rock similarity index 100% rename from tests/fixtures/arrays/join.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/join.rock diff --git a/tests/fixtures/arrays/join.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/join.rock.out similarity index 100% rename from tests/fixtures/arrays/join.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/join.rock.out diff --git a/tests/fixtures/arrays/split.rock b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/split.rock similarity index 100% rename from tests/fixtures/arrays/split.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/split.rock diff --git a/tests/fixtures/arrays/split.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/split.rock.out similarity index 100% rename from tests/fixtures/arrays/split.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/split.rock.out diff --git a/tests/fixtures/arrays/split_delimiters.rock b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/split_delimiters.rock similarity index 94% rename from tests/fixtures/arrays/split_delimiters.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/split_delimiters.rock index fa754555..14e72b70 100644 --- a/tests/fixtures/arrays/split_delimiters.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/split_delimiters.rock @@ -1,7 +1,7 @@ Say "IN-PLACE WITH DELIMITER" Let the string be "a,b,c" Split the string with "," -Say the string +Say the string + 0 Say the string at 0 Say the string at 1 Say the string at 2 diff --git a/tests/fixtures/arrays/split_delimiters.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/arrays/split_delimiters.rock.out similarity index 100% rename from tests/fixtures/arrays/split_delimiters.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/arrays/split_delimiters.rock.out diff --git a/tests/fixtures/assignment/compound_assignments.rock b/Starship/Rockstar.Test/programs/v1-fixtures/assignment/compound_assignments.rock similarity index 100% rename from tests/fixtures/assignment/compound_assignments.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/assignment/compound_assignments.rock diff --git a/tests/fixtures/assignment/compound_assignments.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/assignment/compound_assignments.rock.out similarity index 100% rename from tests/fixtures/assignment/compound_assignments.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/assignment/compound_assignments.rock.out diff --git a/tests/fixtures/assignment/lets.rock b/Starship/Rockstar.Test/programs/v1-fixtures/assignment/lets.rock similarity index 95% rename from tests/fixtures/assignment/lets.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/assignment/lets.rock index 3a8358ac..b2822e9c 100644 --- a/tests/fixtures/assignment/lets.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/assignment/lets.rock @@ -31,8 +31,7 @@ Variable is 0 Let it be 1 Shout it - -The brave are without number +The brave are forever fallen The fallen are always remembered Let the heroes be the brave without the fallen Shout the heroes (76 - 60 = 16) diff --git a/tests/fixtures/assignment/lets.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/assignment/lets.rock.out similarity index 100% rename from tests/fixtures/assignment/lets.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/assignment/lets.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/comments/chordpro_comments.rock b/Starship/Rockstar.Test/programs/v1-fixtures/comments/chordpro_comments.rock new file mode 100644 index 00000000..83351e62 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/comments/chordpro_comments.rock @@ -0,0 +1,11 @@ +{Title: Chordpro Comments} +{Artist: theGleep} + +{Verse} +[C]Shout 1 (prints: 1) +[G]Shout 2 (prints: 2) +[D: quiet]Shout 3 (prints: 3) +[G: loud]Shout 4 (prints: 4) +[C]shout 5 (prints: 5) +[C]shout 6 (prints: 6) +[C]shout 7 (prints: 7) diff --git a/tests/fixtures/comments/complex_comments.rock b/Starship/Rockstar.Test/programs/v1-fixtures/comments/complex_comments.rock similarity index 50% rename from tests/fixtures/comments/complex_comments.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/comments/complex_comments.rock index 3b6523a9..09b4b534 100644 --- a/tests/fixtures/comments/complex_comments.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/comments/complex_comments.rock @@ -1,9 +1,13 @@ +(prints: pass 1) say "pass 1" (trailing comment) +(prints: pass 2) (leading comment) say "pass 2" +(prints: pass 3) say (inline comment) "pass 3" +(prints: pass 4) ( multiline comments @@ -12,4 +16,5 @@ also supported ) say "pass 4" -(((((((( multiple opening brackets are just part of the comment) say "pass 5" +(prints: pass 5) +(((((((( nested comments are supported now 1 )))))))) say "pass 5" diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/comments/simpleComments.rock b/Starship/Rockstar.Test/programs/v1-fixtures/comments/simpleComments.rock new file mode 100644 index 00000000..49d47562 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/comments/simpleComments.rock @@ -0,0 +1,7 @@ +(comment on it's own) + +say "the words" (comment at the end of a line) (prints: the words) + +say (comment between items) "you want to say" (prints: you want to say) + +(comment before items) say "whatever you want" (prints: whatever you want) diff --git a/tests/fixtures/conditionals/empty_if.rock b/Starship/Rockstar.Test/programs/v1-fixtures/conditionals/empty_if.rock similarity index 100% rename from tests/fixtures/conditionals/empty_if.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/conditionals/empty_if.rock diff --git a/tests/fixtures/conditionals/empty_if.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/conditionals/empty_if.rock.out similarity index 100% rename from tests/fixtures/conditionals/empty_if.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/conditionals/empty_if.rock.out diff --git a/tests/fixtures/conditionals/simpleConditionals.rock b/Starship/Rockstar.Test/programs/v1-fixtures/conditionals/simpleConditionals.rock similarity index 100% rename from tests/fixtures/conditionals/simpleConditionals.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/conditionals/simpleConditionals.rock diff --git a/tests/fixtures/conditionals/simpleConditionals.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/conditionals/simpleConditionals.rock.out similarity index 100% rename from tests/fixtures/conditionals/simpleConditionals.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/conditionals/simpleConditionals.rock.out diff --git a/tests/fixtures/conditionals/truthinessTest.rock b/Starship/Rockstar.Test/programs/v1-fixtures/conditionals/truthinessTest.rock similarity index 100% rename from tests/fixtures/conditionals/truthinessTest.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/conditionals/truthinessTest.rock diff --git a/tests/fixtures/conditionals/truthinessTest.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/conditionals/truthinessTest.rock.out similarity index 100% rename from tests/fixtures/conditionals/truthinessTest.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/conditionals/truthinessTest.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/constants/constants.rock b/Starship/Rockstar.Test/programs/v1-fixtures/constants/constants.rock new file mode 100644 index 00000000..8825540a --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/constants/constants.rock @@ -0,0 +1,5 @@ +my heart is true +say my heart (prints: true) + +my love is false +say my love (prints: false) diff --git a/tests/fixtures/control-flow/indented_else.rock b/Starship/Rockstar.Test/programs/v1-fixtures/control-flow/indented_else.rock similarity index 97% rename from tests/fixtures/control-flow/indented_else.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/control-flow/indented_else.rock index c42cbacd..ce290ccc 100644 --- a/tests/fixtures/control-flow/indented_else.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/control-flow/indented_else.rock @@ -5,7 +5,6 @@ While my hope is less than my dream Shout my dream If my dream is my hope Shout "No" - Else Shout "Yes" diff --git a/tests/fixtures/control-flow/indented_else.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/control-flow/indented_else.rock.out similarity index 100% rename from tests/fixtures/control-flow/indented_else.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/control-flow/indented_else.rock.out diff --git a/tests/fixtures/control-flow/nested_loops.rock b/Starship/Rockstar.Test/programs/v1-fixtures/control-flow/nested_loops.rock similarity index 100% rename from tests/fixtures/control-flow/nested_loops.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/control-flow/nested_loops.rock diff --git a/tests/fixtures/control-flow/nested_loops.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/control-flow/nested_loops.rock.out similarity index 100% rename from tests/fixtures/control-flow/nested_loops.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/control-flow/nested_loops.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/control-flow/simpleLoops.rock b/Starship/Rockstar.Test/programs/v1-fixtures/control-flow/simpleLoops.rock new file mode 100644 index 00000000..3acc9f60 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/control-flow/simpleLoops.rock @@ -0,0 +1,9 @@ +put 10 into variable +while variable +say variable +knock variable down +(end loop) +until variable +say variable +build variable up +(end loop) diff --git a/tests/fixtures/control-flow/simpleLoops.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/control-flow/simpleLoops.rock.out similarity index 100% rename from tests/fixtures/control-flow/simpleLoops.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/control-flow/simpleLoops.rock.out diff --git a/tests/fixtures/equality/arrays.rock b/Starship/Rockstar.Test/programs/v1-fixtures/equality/arrays.rock similarity index 88% rename from tests/fixtures/equality/arrays.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/arrays.rock index 8ade6bb0..4661c1b8 100644 --- a/tests/fixtures/equality/arrays.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/equality/arrays.rock @@ -6,11 +6,11 @@ say "arrays of the same length but different contents are not equal" ArrayCopy takes source rock dest -let i be 0 +let index be 0 let len be source + 0 -while i is less than len -let dest at i be source at i -build i up +while index is less than len +let dest at index be source at i +build index up return dest diff --git a/tests/fixtures/equality/arrays.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/equality/arrays.rock.out similarity index 100% rename from tests/fixtures/equality/arrays.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/arrays.rock.out diff --git a/tests/fixtures/equality/booleans.rock b/Starship/Rockstar.Test/programs/v1-fixtures/equality/booleans.rock similarity index 100% rename from tests/fixtures/equality/booleans.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/booleans.rock diff --git a/tests/fixtures/equality/booleans.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/equality/booleans.rock.out similarity index 100% rename from tests/fixtures/equality/booleans.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/booleans.rock.out diff --git a/tests/fixtures/equality/equalityComparison.rock b/Starship/Rockstar.Test/programs/v1-fixtures/equality/equalityComparison.rock similarity index 100% rename from tests/fixtures/equality/equalityComparison.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/equalityComparison.rock diff --git a/tests/fixtures/equality/equalityComparison.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/equality/equalityComparison.rock.out similarity index 100% rename from tests/fixtures/equality/equalityComparison.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/equalityComparison.rock.out diff --git a/tests/fixtures/equality/mysterious.rock b/Starship/Rockstar.Test/programs/v1-fixtures/equality/mysterious.rock similarity index 100% rename from tests/fixtures/equality/mysterious.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/mysterious.rock diff --git a/tests/fixtures/equality/mysterious.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/equality/mysterious.rock.out similarity index 100% rename from tests/fixtures/equality/mysterious.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/mysterious.rock.out diff --git a/tests/fixtures/equality/negation.rock b/Starship/Rockstar.Test/programs/v1-fixtures/equality/negation.rock similarity index 100% rename from tests/fixtures/equality/negation.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/negation.rock diff --git a/tests/fixtures/equality/negation.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/equality/negation.rock.out similarity index 100% rename from tests/fixtures/equality/negation.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/equality/negation.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/equality/nothing.rock b/Starship/Rockstar.Test/programs/v1-fixtures/equality/nothing.rock new file mode 100644 index 00000000..ee3c4666 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/equality/nothing.rock @@ -0,0 +1,9 @@ +Say 0 is nothing (prints: true) +Say false is nothing (prints: true) +Say nobody is nothing (prints: true) +Say null is nothing (prints: true) +Say "" is nothing (prints: true) + +Say 1 is nothing (prints: false) +Say true is nothing (prints: false) +Say "hello" is nothing (prints: false) diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/equality/null.rock b/Starship/Rockstar.Test/programs/v1-fixtures/equality/null.rock new file mode 100644 index 00000000..907e9d63 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/equality/null.rock @@ -0,0 +1,5 @@ +say true is null (prints: false) +say false is null (prints: true) +say null is null (prints: true) +say 0 is null (prints: true) +say 1 is null (prints: false) diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/equality/numbers.rock b/Starship/Rockstar.Test/programs/v1-fixtures/equality/numbers.rock new file mode 100644 index 00000000..0b581884 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/equality/numbers.rock @@ -0,0 +1,17 @@ +say true is 5 (prints: true) +say 5 is true (prints: true) +say 0 is false (prints: true) +say false is 0 (prints: true) +say 0 is null (prints: true) +say 5 is 5 (prints: true) +say 5 is 5.0 (prints: true) +say 0.26 is 0.26 (prints: true) +say "5" is 5 (prints: true) +say 5 is "05.0" (prints: true) + +say true is 0 (prints: false) +say 0 is true (prints: false) +say 1 is false (prints: false) +say false is 1 (prints: false) +say 1 is null (prints: false) +say 5 is 4 (prints: false) diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/equality/strings.rock b/Starship/Rockstar.Test/programs/v1-fixtures/equality/strings.rock new file mode 100644 index 00000000..944d425b --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/equality/strings.rock @@ -0,0 +1,28 @@ +(non-empty strings are true) +say "true" is true (prints: true) +say "yes" is true (prints: true) +say "OK" is true (prints: true) +say true is "true" (prints: true) +say true is "RIGht" (prints: true) +say "yes" is true (prints: true) +say "OK" is true (prints: true) + +say false is "false" (prints: false) +say false is "WROng" (prints: false) +say "lies" is false (prints: false) + +say true is "hello" (prints: true) +say "true" is true (prints: true) + +say 5 is "3" (prints: false) +say 5 is "hello" (prints: false) + +say true is "lies" (prints: true) +say "lies" is true (prints: true) +say false is "true" (prints: false) +say false is "hello" (prints: false) +say "false" is false (prints: false) +say "true" is false (prints: false) + +say "hello" is "hello" (prints: true) +say "hello" is "world" (prints: false) diff --git a/tests/fixtures/examples/99_beers.rock b/Starship/Rockstar.Test/programs/v1-fixtures/examples/99_beers.rock similarity index 100% rename from tests/fixtures/examples/99_beers.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/99_beers.rock diff --git a/tests/fixtures/examples/99_beers.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/examples/99_beers.rock.out similarity index 100% rename from tests/fixtures/examples/99_beers.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/99_beers.rock.out diff --git a/tests/fixtures/examples/factorial.rock b/Starship/Rockstar.Test/programs/v1-fixtures/examples/factorial.rock similarity index 100% rename from tests/fixtures/examples/factorial.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/factorial.rock diff --git a/tests/fixtures/examples/factorial.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/examples/factorial.rock.out similarity index 100% rename from tests/fixtures/examples/factorial.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/factorial.rock.out diff --git a/tests/fixtures/examples/fibonacci.rock b/Starship/Rockstar.Test/programs/v1-fixtures/examples/fibonacci.rock similarity index 69% rename from tests/fixtures/examples/fibonacci.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/fibonacci.rock index 3194f678..78fb9823 100644 --- a/tests/fixtures/examples/fibonacci.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/examples/fibonacci.rock @@ -2,8 +2,8 @@ Fib takes N if N is smaller than 2 give back N (end if) -put N without 1 into OneBefore -put N without 2 into TwoBefore +Let OneBefore be N without 1 +Let TwoBefore be N without 2 give back Fib taking OneBefore plus Fib taking TwoBefore (end fib) say Fib taking 10 diff --git a/tests/fixtures/examples/fibonacci.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/examples/fibonacci.rock.out similarity index 100% rename from tests/fixtures/examples/fibonacci.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/fibonacci.rock.out diff --git a/tests/fixtures/examples/fizzbuzz-idiomatic.rock b/Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-idiomatic.rock similarity index 99% rename from tests/fixtures/examples/fizzbuzz-idiomatic.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-idiomatic.rock index fa48848e..022bff78 100644 --- a/tests/fixtures/examples/fizzbuzz-idiomatic.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-idiomatic.rock @@ -25,3 +25,4 @@ Take it to the top Whisper my world + diff --git a/tests/fixtures/examples/fizzbuzz-minimalist.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-idiomatic.rock.out similarity index 100% rename from tests/fixtures/examples/fizzbuzz-minimalist.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-idiomatic.rock.out diff --git a/tests/fixtures/examples/fizzbuzz-minimalist.rock b/Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-minimalist.rock similarity index 100% rename from tests/fixtures/examples/fizzbuzz-minimalist.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-minimalist.rock diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-minimalist.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-minimalist.rock.out new file mode 100644 index 00000000..0b645ed8 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/examples/fizzbuzz-minimalist.rock.out @@ -0,0 +1,100 @@ +1 +2 +Fizz! +4 +Buzz! +Fizz! +7 +8 +Fizz! +Buzz! +11 +Fizz! +13 +14 +FizzBuzz! +16 +17 +Fizz! +19 +Buzz! +Fizz! +22 +23 +Fizz! +Buzz! +26 +Fizz! +28 +29 +FizzBuzz! +31 +32 +Fizz! +34 +Buzz! +Fizz! +37 +38 +Fizz! +Buzz! +41 +Fizz! +43 +44 +FizzBuzz! +46 +47 +Fizz! +49 +Buzz! +Fizz! +52 +53 +Fizz! +Buzz! +56 +Fizz! +58 +59 +FizzBuzz! +61 +62 +Fizz! +64 +Buzz! +Fizz! +67 +68 +Fizz! +Buzz! +71 +Fizz! +73 +74 +FizzBuzz! +76 +77 +Fizz! +79 +Buzz! +Fizz! +82 +83 +Fizz! +Buzz! +86 +Fizz! +88 +89 +FizzBuzz! +91 +92 +Fizz! +94 +Buzz! +Fizz! +97 +98 +Fizz! +Buzz! diff --git a/examples/hello-world.rock b/Starship/Rockstar.Test/programs/v1-fixtures/examples/hello-world.rock similarity index 55% rename from examples/hello-world.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/hello-world.rock index 0da43f3c..3d37a9b3 100644 --- a/examples/hello-world.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/examples/hello-world.rock @@ -1,18 +1,18 @@ -Eternity takes the pain. -The prize is silence -Until the pain is nothing, -Roll the pain into violence, +Eternity takes forever. +my price is silence +Until forever is nothing, +Roll forever into violence, Cast violence into your lies, -Let the prize be with your lies. +Let my price be with your lies. -Give back the prize +Give back my price -The night is calling me -Rock the night like a colourcast tranquility +the fire is calling me +Rock the fire like a colourcast tranquility The dawn is a spellbound moonbeam -Rock the night with the dawn, the dawn, +Rock the fire with the dawn, the dawn, Your fire is a neverending aftereffect -Rock the night with your fire +Rock the fire with your fire The spirit is electric thunder Rock the spirit with your fire @@ -20,7 +20,7 @@ Rock the spirit like a thunderbolt fist Rock the spirit with the dawn Rock the spirit like a chamaeleon stormcloud -Let fear be eternity taking the night +Let fear be eternity taking the fire Let hope be eternity taking the spirit Time is all up diff --git a/tests/fixtures/examples/hello-world.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/examples/hello-world.rock.out similarity index 100% rename from tests/fixtures/examples/hello-world.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/examples/hello-world.rock.out diff --git a/tests/fixtures/functions/aliases_for_takes.rock b/Starship/Rockstar.Test/programs/v1-fixtures/functions/aliases_for_takes.rock similarity index 100% rename from tests/fixtures/functions/aliases_for_takes.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/aliases_for_takes.rock diff --git a/tests/fixtures/functions/aliases_for_takes.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/functions/aliases_for_takes.rock.out similarity index 100% rename from tests/fixtures/functions/aliases_for_takes.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/aliases_for_takes.rock.out diff --git a/tests/fixtures/functions/array_arguments.rock b/Starship/Rockstar.Test/programs/v1-fixtures/functions/array_arguments.rock similarity index 88% rename from tests/fixtures/functions/array_arguments.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/array_arguments.rock index f8c1f2f6..da8236ea 100644 --- a/tests/fixtures/functions/array_arguments.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/functions/array_arguments.rock @@ -2,12 +2,12 @@ the function takes array shout "The parameters that were passed:" shout array at 0 shout array at 1 -shout array +shout array + 0 let param at 0 be 3 let param at 1 be 4 shout "The parameters to be passed:" shout param at 0 shout param at 1 -shout param +shout param + 0 the function taking param diff --git a/tests/fixtures/functions/array_arguments.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/functions/array_arguments.rock.out similarity index 100% rename from tests/fixtures/functions/array_arguments.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/array_arguments.rock.out diff --git a/tests/fixtures/functions/functionCalls.rock b/Starship/Rockstar.Test/programs/v1-fixtures/functions/functionCalls.rock similarity index 100% rename from tests/fixtures/functions/functionCalls.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/functionCalls.rock diff --git a/tests/fixtures/functions/functionCalls.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/functions/functionCalls.rock.out similarity index 100% rename from tests/fixtures/functions/functionCalls.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/functionCalls.rock.out diff --git a/tests/fixtures/functions/nested_function_scopes.rock b/Starship/Rockstar.Test/programs/v1-fixtures/functions/nested_function_scopes.rock similarity index 100% rename from tests/fixtures/functions/nested_function_scopes.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/nested_function_scopes.rock diff --git a/tests/fixtures/functions/nested_function_scopes.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/functions/nested_function_scopes.rock.out similarity index 100% rename from tests/fixtures/functions/nested_function_scopes.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/nested_function_scopes.rock.out diff --git a/tests/fixtures/functions/nested_functions.rock b/Starship/Rockstar.Test/programs/v1-fixtures/functions/nested_functions.rock similarity index 100% rename from tests/fixtures/functions/nested_functions.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/nested_functions.rock diff --git a/tests/fixtures/functions/nested_functions.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/functions/nested_functions.rock.out similarity index 100% rename from tests/fixtures/functions/nested_functions.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/nested_functions.rock.out diff --git a/tests/fixtures/functions/recursion.rock b/Starship/Rockstar.Test/programs/v1-fixtures/functions/recursion.rock similarity index 84% rename from tests/fixtures/functions/recursion.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/recursion.rock index 4a80092d..3a19ce84 100644 --- a/tests/fixtures/functions/recursion.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/functions/recursion.rock @@ -4,5 +4,6 @@ Give back X Else Put X minus 1 into NewX Give back Decrement taking NewX - +(end if) +(end function) Say Decrement taking 5 diff --git a/tests/fixtures/functions/recursion.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/functions/recursion.rock.out similarity index 100% rename from tests/fixtures/functions/recursion.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/recursion.rock.out diff --git a/tests/fixtures/functions/simpleFunctions.rock b/Starship/Rockstar.Test/programs/v1-fixtures/functions/simpleFunctions.rock similarity index 100% rename from tests/fixtures/functions/simpleFunctions.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/simpleFunctions.rock diff --git a/tests/fixtures/functions/simpleFunctions.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/functions/simpleFunctions.rock.out similarity index 100% rename from tests/fixtures/functions/simpleFunctions.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/functions/simpleFunctions.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/io/hello_number.rock b/Starship/Rockstar.Test/programs/v1-fixtures/io/hello_number.rock new file mode 100644 index 00000000..723060fd --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/io/hello_number.rock @@ -0,0 +1,5 @@ +say -123.45 (prints: -123.45) +say -1 (prints: -1) +say 0 (prints: 0) +say 1 (prints: 1) +say 123.45 (prints: 123.45) diff --git a/tests/fixtures/io/hello_number.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/io/hello_number.rock.out similarity index 100% rename from tests/fixtures/io/hello_number.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/io/hello_number.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/io/hello_world.rock b/Starship/Rockstar.Test/programs/v1-fixtures/io/hello_world.rock new file mode 100644 index 00000000..abf76ab4 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/io/hello_world.rock @@ -0,0 +1,3 @@ +Say "hello world" (prints: hello world) +Say "Hello World" (prints: Hello World) +SAY "HELLO WORLD" (prints: HELLO WORLD) diff --git a/tests/fixtures/io/inputTest.rock b/Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest.rock similarity index 100% rename from tests/fixtures/io/inputTest.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest.rock diff --git a/tests/fixtures/io/inputTest.rock.in b/Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest.rock.in similarity index 100% rename from tests/fixtures/io/inputTest.rock.in rename to Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest.rock.in diff --git a/tests/fixtures/io/inputTest.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest.rock.out similarity index 100% rename from tests/fixtures/io/inputTest.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest.rock.out diff --git a/tests/fixtures/io/inputTest2.rock b/Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest2.rock similarity index 100% rename from tests/fixtures/io/inputTest2.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest2.rock diff --git a/tests/fixtures/io/inputTest2.rock.in b/Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest2.rock.in similarity index 100% rename from tests/fixtures/io/inputTest2.rock.in rename to Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest2.rock.in diff --git a/tests/fixtures/io/inputTest2.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest2.rock.out similarity index 100% rename from tests/fixtures/io/inputTest2.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/io/inputTest2.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/literals/literalAliases.rock b/Starship/Rockstar.Test/programs/v1-fixtures/literals/literalAliases.rock new file mode 100644 index 00000000..4b1d198a --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/literals/literalAliases.rock @@ -0,0 +1,19 @@ +say mysterious (prints: mysterious) + +say null (prints: null) +say nothing (prints: null) +say nowhere (prints: null) +say nobody (prints: null) +say gone (prints: null) + +say empty (prints: ) + +say true (prints: true) +say right (prints: true) +say yes (prints: true) +say ok (prints: true) + +say false (prints: false) +say wrong (prints: false) +say no (prints: false) +say lies (prints: false) diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/literals/literalstrings.rock b/Starship/Rockstar.Test/programs/v1-fixtures/literals/literalstrings.rock new file mode 100644 index 00000000..2c3815e1 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/literals/literalstrings.rock @@ -0,0 +1,5 @@ +(prints: What is not denied is permitted!) +Shout "What is not denied is permitted!" + +(prints: This ain't not allowed!) +Shout "This ain't not allowed!" diff --git a/tests/fixtures/literals/poeticLiterals.rock b/Starship/Rockstar.Test/programs/v1-fixtures/literals/poeticLiterals.rock similarity index 84% rename from tests/fixtures/literals/poeticLiterals.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/literals/poeticLiterals.rock index 2a9ddcc7..e99a6244 100644 --- a/tests/fixtures/literals/poeticLiterals.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/literals/poeticLiterals.rock @@ -1,4 +1,4 @@ -(poetic assignments to booleans, null, mysterious, number literals, and string literals all work) +(poetic assignments to Booleäns, null, mysterious, number literals, and string literals all work) my heart is true say my heart diff --git a/tests/fixtures/literals/poeticLiterals.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/literals/poeticLiterals.rock.out similarity index 100% rename from tests/fixtures/literals/poeticLiterals.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/literals/poeticLiterals.rock.out diff --git a/tests/fixtures/literals/poeticNumbers.rock b/Starship/Rockstar.Test/programs/v1-fixtures/literals/poeticNumbers.rock similarity index 55% rename from tests/fixtures/literals/poeticNumbers.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/literals/poeticNumbers.rock index f3392c1e..032e521f 100644 --- a/tests/fixtures/literals/poeticNumbers.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/literals/poeticNumbers.rock @@ -1,20 +1,20 @@ Tommy was a lovestruck ladykiller -say Tommy +say Tommy (prints: 100) Sweet Lucy was a dancer -say Sweet Lucy +say Sweet Lucy (prints: 16) A killer is on the loose -whisper a killer +whisper a killer (prints: 235) My dreams were ice. A life unfulfilled; wakin' everybody up, taking booze and pills -shout My dreams +shout My dreams (prints: 3.1415926535) Sweet Lucy's a danger to society -say Sweet Lucy +say Sweet Lucy (prints: 1627) my number is a 57 + true 43 -say my number +say my number (prints: 14) The streets are lonely -say the streets +say the streets (prints: 6) diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/math/operator_aliases.rock b/Starship/Rockstar.Test/programs/v1-fixtures/math/operator_aliases.rock new file mode 100644 index 00000000..057e5f53 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/math/operator_aliases.rock @@ -0,0 +1,9 @@ +say 2 plus 2 (prints: 4) +say 2 with 2 (prints: 4) +say 5 minus 3 (prints: 2) +say 5 without 3 (prints: 2) +say 5 times 5 (prints: 25) +say 5 of 5 (prints: 25) +say 4 over 2 (prints: 2) + + diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/math/operator_precedence.rock b/Starship/Rockstar.Test/programs/v1-fixtures/math/operator_precedence.rock new file mode 100644 index 00000000..c347c2d7 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/math/operator_precedence.rock @@ -0,0 +1,6 @@ +say 1 + 1 * 2 (prints: 3) +say 1 * 2 + 1 (prints: 3) +say 1 / 2 * 3 + 4 (prints: 5.5) +say 5-2*3 (prints: -1) +say 2*3 - 5 (prints: 1) + diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/math/operators.rock b/Starship/Rockstar.Test/programs/v1-fixtures/math/operators.rock new file mode 100644 index 00000000..dbdfbe64 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/math/operators.rock @@ -0,0 +1,15 @@ +say 1 + 1 (prints: 2) +say 5 + 10 (prints: 15) +say 2.5 + 2.5 (prints: 5) +say 1 + 0.2 + 0.03 (prints: 1.23) + +say 2 - 1 (prints: 1) +say 0 - 1 (prints: -1) +say 1 - 0.5 (prints: 0.5) + +say 1 * 0 (prints: 0) +say 1 * 1 (prints: 1) +say 1 * 2 (prints: 2) +say 2 * 2 (prints: 4) + +say 1.000000000000 (prints: 1) diff --git a/tests/fixtures/math/rounding.rock b/Starship/Rockstar.Test/programs/v1-fixtures/math/rounding.rock similarity index 100% rename from tests/fixtures/math/rounding.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/math/rounding.rock diff --git a/tests/fixtures/math/rounding.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/math/rounding.rock.out similarity index 100% rename from tests/fixtures/math/rounding.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/math/rounding.rock.out diff --git a/tests/fixtures/math/rounding_pronouns.rock b/Starship/Rockstar.Test/programs/v1-fixtures/math/rounding_pronouns.rock similarity index 100% rename from tests/fixtures/math/rounding_pronouns.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/math/rounding_pronouns.rock diff --git a/tests/fixtures/math/rounding_pronouns.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/math/rounding_pronouns.rock.out similarity index 100% rename from tests/fixtures/math/rounding_pronouns.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/math/rounding_pronouns.rock.out diff --git a/tests/fixtures/operators/addOperator.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/addOperator.rock similarity index 96% rename from tests/fixtures/operators/addOperator.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/addOperator.rock index 4fe143a3..cb8f0c0f 100644 --- a/tests/fixtures/operators/addOperator.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/operators/addOperator.rock @@ -14,7 +14,7 @@ say "hello" plus " " plus 5 say "hello" plus " " plus .11 say 5.5 plus " " plus "hello" -(string + boolean) +(string + Boolen) say "your words are " plus lies say "your words are " plus True say true plus ", you are." diff --git a/tests/fixtures/operators/addOperator.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/addOperator.rock.out similarity index 100% rename from tests/fixtures/operators/addOperator.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/addOperator.rock.out diff --git a/tests/fixtures/operators/andTest.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/andTest.rock similarity index 100% rename from tests/fixtures/operators/andTest.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/andTest.rock diff --git a/tests/fixtures/operators/andTest.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/andTest.rock.out similarity index 100% rename from tests/fixtures/operators/andTest.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/andTest.rock.out diff --git a/tests/fixtures/operators/booleans.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/booleans.rock similarity index 77% rename from tests/fixtures/operators/booleans.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/booleans.rock index 5cde7d38..5f2adf1e 100644 --- a/tests/fixtures/operators/booleans.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/operators/booleans.rock @@ -6,7 +6,4 @@ say X or Y (true) say not X (false) say not X and not Y (false) say not X or not Y (true) -say not X and not Y and not X or not Y (true) - - - +say not X and not Y and not X or not Y (true) \ No newline at end of file diff --git a/tests/fixtures/operators/booleans.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/booleans.rock.out similarity index 100% rename from tests/fixtures/operators/booleans.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/booleans.rock.out diff --git a/tests/fixtures/operators/divisionOperator.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/divisionOperator.rock similarity index 100% rename from tests/fixtures/operators/divisionOperator.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/divisionOperator.rock diff --git a/tests/fixtures/operators/divisionOperator.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/divisionOperator.rock.out similarity index 100% rename from tests/fixtures/operators/divisionOperator.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/divisionOperator.rock.out diff --git a/tests/fixtures/operators/incrementAndDecrement.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/incrementAndDecrement.rock similarity index 91% rename from tests/fixtures/operators/incrementAndDecrement.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/incrementAndDecrement.rock index 4e83ffc6..c618804f 100644 --- a/tests/fixtures/operators/incrementAndDecrement.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/operators/incrementAndDecrement.rock @@ -20,8 +20,8 @@ put 2.25 into Other Variable knock Other Variable down say Other Variable -say "booleans" -(increment and decrement flip the value of booleans) +say "Booleäns" +(increment and decrement flip the value of Booleäns) my test is true knock my test down say my test diff --git a/tests/fixtures/operators/incrementAndDecrement.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/incrementAndDecrement.rock.out similarity index 89% rename from tests/fixtures/operators/incrementAndDecrement.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/incrementAndDecrement.rock.out index 56484dbd..4024d7d7 100644 --- a/tests/fixtures/operators/incrementAndDecrement.rock.out +++ b/Starship/Rockstar.Test/programs/v1-fixtures/operators/incrementAndDecrement.rock.out @@ -6,7 +6,7 @@ multiples 5 decimals 1.25 -booleans +Booleäns false true false diff --git a/tests/fixtures/operators/list_expressions_arithmetic.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/list_expressions_arithmetic.rock similarity index 100% rename from tests/fixtures/operators/list_expressions_arithmetic.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/list_expressions_arithmetic.rock diff --git a/tests/fixtures/operators/list_expressions_arithmetic.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/list_expressions_arithmetic.rock.out similarity index 100% rename from tests/fixtures/operators/list_expressions_arithmetic.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/list_expressions_arithmetic.rock.out diff --git a/tests/fixtures/operators/multiplicationOperator.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/multiplicationOperator.rock similarity index 100% rename from tests/fixtures/operators/multiplicationOperator.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/multiplicationOperator.rock diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/operators/multiplicationOperator.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/multiplicationOperator.rock.out new file mode 100644 index 00000000..65758fa0 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/operators/multiplicationOperator.rock.out @@ -0,0 +1,11 @@ +25 +8 +24 +-6 +0 +hellohello +hwewlwlwow +hoeololooo +hrerlrlror +hlelllllol +hdedldldod diff --git a/tests/fixtures/operators/notTest.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/notTest.rock similarity index 100% rename from tests/fixtures/operators/notTest.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/notTest.rock diff --git a/tests/fixtures/operators/notTest.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/notTest.rock.out similarity index 100% rename from tests/fixtures/operators/notTest.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/notTest.rock.out diff --git a/tests/fixtures/operators/orNorTest.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/orNorTest.rock similarity index 100% rename from tests/fixtures/operators/orNorTest.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/orNorTest.rock diff --git a/tests/fixtures/operators/orNorTest.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/orNorTest.rock.out similarity index 100% rename from tests/fixtures/operators/orNorTest.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/orNorTest.rock.out diff --git a/tests/fixtures/operators/orderingComparison.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/orderingComparison.rock similarity index 100% rename from tests/fixtures/operators/orderingComparison.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/orderingComparison.rock diff --git a/tests/fixtures/operators/orderingComparison.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/orderingComparison.rock.out similarity index 100% rename from tests/fixtures/operators/orderingComparison.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/orderingComparison.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/operators/short-circuit.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/short-circuit.rock new file mode 100644 index 00000000..dc32ec0b --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/operators/short-circuit.rock @@ -0,0 +1,4 @@ +say true or 1/0 (prints: true) +say false and 1/0 (prints: false) + + diff --git a/tests/fixtures/operators/subtractOperator.rock b/Starship/Rockstar.Test/programs/v1-fixtures/operators/subtractOperator.rock similarity index 100% rename from tests/fixtures/operators/subtractOperator.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/subtractOperator.rock diff --git a/tests/fixtures/operators/subtractOperator.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/operators/subtractOperator.rock.out similarity index 100% rename from tests/fixtures/operators/subtractOperator.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/operators/subtractOperator.rock.out diff --git a/tests/fixtures/queues/pop.rock b/Starship/Rockstar.Test/programs/v1-fixtures/queues/pop.rock similarity index 86% rename from tests/fixtures/queues/pop.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/queues/pop.rock index 55cdc9c0..d97ffb6d 100644 --- a/tests/fixtures/queues/pop.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/queues/pop.rock @@ -12,7 +12,7 @@ Roll the list into foo Roll the list into bar Shout foo (outputs 4) Shout bar (outputs 5) -Shout the list (outputs 1) +Shout the list + 0 (outputs 1) Roll the list -Shout the list (outputs 0) +Shout the list + 0 (outputs 0) Shout roll the list (outputs mysterious) diff --git a/tests/fixtures/queues/pop.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/queues/pop.rock.out similarity index 100% rename from tests/fixtures/queues/pop.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/queues/pop.rock.out diff --git a/tests/fixtures/queues/push.rock b/Starship/Rockstar.Test/programs/v1-fixtures/queues/push.rock similarity index 76% rename from tests/fixtures/queues/push.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/queues/push.rock index 68b9f530..3acdda7e 100644 --- a/tests/fixtures/queues/push.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/queues/push.rock @@ -1,17 +1,17 @@ Say "empty arrays:" Rock steady -Shout steady +Shout steady + 0 say "in-place array coercion:" Jazz is 123 Rock jazz -Shout jazz (jazz is now a one-element array, so should output 1) +Shout jazz + 0 (jazz is now a one-element array, so should output 1) Shout jazz at 0 (should output 12345) Shout jazz at 1 (should output mysterious) say "push list expressions:" Rock ints 7, 8, 9 -Shout ints +Shout ints + 0 Shout ints at 0 Shout ints at 1 Shout ints at 2 @@ -20,6 +20,6 @@ Shout ints at 3 say "hurricane:" You are my destiny Rock you like a hurricane -Shout you +Shout you + 0 Shout you at 0 Shout you at 1 \ No newline at end of file diff --git a/tests/fixtures/queues/push.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/queues/push.rock.out similarity index 100% rename from tests/fixtures/queues/push.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/queues/push.rock.out diff --git a/tests/fixtures/queues/queues.rock b/Starship/Rockstar.Test/programs/v1-fixtures/queues/queues.rock similarity index 94% rename from tests/fixtures/queues/queues.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/queues/queues.rock index db5c5b3f..e6b6af8a 100644 --- a/tests/fixtures/queues/queues.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/queues/queues.rock @@ -5,7 +5,7 @@ shout roll queue shout roll queue shout roll queue shout roll queue -shout queue +shout queue + 0 rock the list with "first" rock the list with "second", "third" diff --git a/tests/fixtures/queues/queues.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/queues/queues.rock.out similarity index 100% rename from tests/fixtures/queues/queues.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/queues/queues.rock.out diff --git a/tests/fixtures/queues/string_queues.rock b/Starship/Rockstar.Test/programs/v1-fixtures/queues/string_queues.rock similarity index 99% rename from tests/fixtures/queues/string_queues.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/queues/string_queues.rock index 36da6103..567c7786 100644 --- a/tests/fixtures/queues/string_queues.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/queues/string_queues.rock @@ -15,4 +15,3 @@ Cast the dark into the fire Let the night be the night with the fire Shout the night - diff --git a/tests/fixtures/queues/string_queues.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/queues/string_queues.rock.out similarity index 100% rename from tests/fixtures/queues/string_queues.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/queues/string_queues.rock.out diff --git a/tests/fixtures/types/parsing.rock b/Starship/Rockstar.Test/programs/v1-fixtures/types/parsing.rock similarity index 86% rename from tests/fixtures/types/parsing.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/types/parsing.rock index 4f9041ca..c5a4cabc 100644 --- a/tests/fixtures/types/parsing.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/types/parsing.rock @@ -3,8 +3,8 @@ Let X be "123" Let Y be "456" Let Z be X with Y Shout Z (123456) -Cast X -Cast Y +Cast X with 10 +Cast Y with 10 Let Z be X with Y Shout Z (579) diff --git a/tests/fixtures/types/parsing.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/types/parsing.rock.out similarity index 100% rename from tests/fixtures/types/parsing.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/types/parsing.rock.out diff --git a/tests/fixtures/variables/common_variables.rock b/Starship/Rockstar.Test/programs/v1-fixtures/variables/common_variables.rock similarity index 100% rename from tests/fixtures/variables/common_variables.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/common_variables.rock diff --git a/tests/fixtures/variables/common_variables.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/variables/common_variables.rock.out similarity index 100% rename from tests/fixtures/variables/common_variables.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/common_variables.rock.out diff --git a/tests/fixtures/variables/globalVariables.rock b/Starship/Rockstar.Test/programs/v1-fixtures/variables/globalVariables.rock similarity index 100% rename from tests/fixtures/variables/globalVariables.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/globalVariables.rock diff --git a/tests/fixtures/variables/globalVariables.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/variables/globalVariables.rock.out similarity index 100% rename from tests/fixtures/variables/globalVariables.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/globalVariables.rock.out diff --git a/tests/fixtures/variables/poeticStrings.rock b/Starship/Rockstar.Test/programs/v1-fixtures/variables/poeticStrings.rock similarity index 77% rename from tests/fixtures/variables/poeticStrings.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/poeticStrings.rock index dee96320..b69f490a 100644 --- a/tests/fixtures/variables/poeticStrings.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/variables/poeticStrings.rock @@ -2,16 +2,16 @@ my girlfriend says hello to Rockstar! shout my girlfriend Albert Einstein says he's got a new theory to share -whisper Albert Einstein +scream Albert Einstein the darkness says Mysterious -whisper the darkness +say the darkness my world says this. Contains a period. Or three. shout my world -Somebody say something! +Somebody says something! shout somebody They said I'd never amount to anything. Well I showed them! -shout they +print they diff --git a/tests/fixtures/variables/poeticStrings.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/variables/poeticStrings.rock.out similarity index 100% rename from tests/fixtures/variables/poeticStrings.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/poeticStrings.rock.out diff --git a/tests/fixtures/variables/pronouns.rock b/Starship/Rockstar.Test/programs/v1-fixtures/variables/pronouns.rock similarity index 100% rename from tests/fixtures/variables/pronouns.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/pronouns.rock diff --git a/tests/fixtures/variables/pronouns.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/variables/pronouns.rock.out similarity index 100% rename from tests/fixtures/variables/pronouns.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/pronouns.rock.out diff --git a/tests/fixtures/variables/proper_variables.rock b/Starship/Rockstar.Test/programs/v1-fixtures/variables/proper_variables.rock similarity index 100% rename from tests/fixtures/variables/proper_variables.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/proper_variables.rock diff --git a/tests/fixtures/variables/proper_variables.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/variables/proper_variables.rock.out similarity index 100% rename from tests/fixtures/variables/proper_variables.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/proper_variables.rock.out diff --git a/tests/fixtures/variables/simple_pronouns.rock b/Starship/Rockstar.Test/programs/v1-fixtures/variables/simple_pronouns.rock similarity index 100% rename from tests/fixtures/variables/simple_pronouns.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/simple_pronouns.rock diff --git a/tests/fixtures/variables/simple_pronouns.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/variables/simple_pronouns.rock.out similarity index 100% rename from tests/fixtures/variables/simple_pronouns.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/simple_pronouns.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/variables/simple_variables.rock b/Starship/Rockstar.Test/programs/v1-fixtures/variables/simple_variables.rock new file mode 100644 index 00000000..80abd2f1 --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/variables/simple_variables.rock @@ -0,0 +1,43 @@ +Variable is 1 +Say variable (prints: 1) + +Value is 1 +say value with value (prints: 2) + +X is 1 +Y is 2 +Say x plus y (prints: 3) +Alpha says r +Beta says o +Gamma says c +Delta says k +Say alpha with beta with gamma with delta (prints: rock) + +Let themes be 10 (variable name beginning with pronoun 'the') +Let italics be true (variable name beginning with pronoun 'it') +Shout themes (prints: 10) +Shout italics (prints: true) + +TIME is 1 +say TIME (prints: 1) +say time (prints: 1) +say tIMe (prints: 1) +say TIMe (prints: 1) + +time is 2 +say TIME (prints: 2) +say time (prints: 2) +say tIMe (prints: 2) +say TIMe (prints: 2) + +tIMe is 3 +say TIME (prints: 3) +say time (prints: 3) +say tIMe (prints: 3) +say TIMe (prints: 3) + +TIMe is 4 +say TIME (prints: 4) +say time (prints: 4) +say tIMe (prints: 4) +say TIMe (prints: 4) diff --git a/tests/fixtures/variables/umlauts.rock b/Starship/Rockstar.Test/programs/v1-fixtures/variables/umlauts.rock similarity index 82% rename from tests/fixtures/variables/umlauts.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/umlauts.rock index e16022c2..311cdaed 100644 --- a/tests/fixtures/variables/umlauts.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/variables/umlauts.rock @@ -7,5 +7,5 @@ Shout the mētäl Say it (umlauts should be allowed in a literal string) -Anna says she lïkes her ümlaüts -Whisper Anna +Anni says she lïkes her ümlaüts +Shout Anni diff --git a/tests/fixtures/variables/umlauts.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/variables/umlauts.rock.out similarity index 100% rename from tests/fixtures/variables/umlauts.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/umlauts.rock.out diff --git a/tests/fixtures/variables/writeGlobal.rock b/Starship/Rockstar.Test/programs/v1-fixtures/variables/writeGlobal.rock similarity index 94% rename from tests/fixtures/variables/writeGlobal.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/writeGlobal.rock index 69727787..e2c58c13 100644 --- a/tests/fixtures/variables/writeGlobal.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/variables/writeGlobal.rock @@ -5,7 +5,7 @@ say global (end of function) SetGlobal takes x -let global be x +Put x into global put CheckGlobal taking 0 into dummy (end of function) diff --git a/tests/fixtures/variables/writeGlobal.rock.out b/Starship/Rockstar.Test/programs/v1-fixtures/variables/writeGlobal.rock.out similarity index 100% rename from tests/fixtures/variables/writeGlobal.rock.out rename to Starship/Rockstar.Test/programs/v1-fixtures/variables/writeGlobal.rock.out diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/apostrophesIgnored.rock b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/apostrophesIgnored.rock new file mode 100644 index 00000000..9b01f9ff --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/apostrophesIgnored.rock @@ -0,0 +1,10 @@ +('s is valid in poetic assignments with the apostrophe ignored) + +the fire is the Devil's to take +shout the fire (prints: 3624) + +the fire is the Devil'sto take +shout the fire (prints: 384) + +the fire is the Devil 's to take +shout the fire (prints: 35124) diff --git a/tests/fixtures/whitespace/leading_blank_lines.rock b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/leading_blank_lines.rock similarity index 71% rename from tests/fixtures/whitespace/leading_blank_lines.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/whitespace/leading_blank_lines.rock index b9260262..7e33adf9 100644 --- a/tests/fixtures/whitespace/leading_blank_lines.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/leading_blank_lines.rock @@ -1,4 +1,4 @@ (this file tests that parsers can handle BLANK leading lines) -say "pass" +say "pass" (prints: pass) diff --git a/tests/fixtures/whitespace/leading_empty_lines.rock b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/leading_empty_lines.rock similarity index 71% rename from tests/fixtures/whitespace/leading_empty_lines.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/whitespace/leading_empty_lines.rock index 3639ca39..506c23f3 100644 --- a/tests/fixtures/whitespace/leading_empty_lines.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/leading_empty_lines.rock @@ -1,4 +1,4 @@ (this file tests that parsers can handle EMPTY leading lines) -say "pass" +say "pass" (prints: pass) diff --git a/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/leading_whitespace.rock b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/leading_whitespace.rock new file mode 100644 index 00000000..a4cec4ce --- /dev/null +++ b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/leading_whitespace.rock @@ -0,0 +1,4 @@ + Rockstar is 1337 + Shout Rockstar (prints: 1337) + + diff --git a/tests/fixtures/whitespace/no_newline_at_eof.rock b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/no_newline_at_eof.rock similarity index 75% rename from tests/fixtures/whitespace/no_newline_at_eof.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/whitespace/no_newline_at_eof.rock index 27014cd5..9f9fb89e 100644 --- a/tests/fixtures/whitespace/no_newline_at_eof.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/no_newline_at_eof.rock @@ -1,2 +1,2 @@ (test whether parser can cope with a file that does not end with a new line) -say "pass" \ No newline at end of file +say "pass" (prints: pass) \ No newline at end of file diff --git a/tests/fixtures/whitespace/trailing_blank_lines.rock b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/trailing_blank_lines.rock similarity index 69% rename from tests/fixtures/whitespace/trailing_blank_lines.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/whitespace/trailing_blank_lines.rock index 7efc283a..166deb22 100644 --- a/tests/fixtures/whitespace/trailing_blank_lines.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/trailing_blank_lines.rock @@ -1,3 +1,3 @@ -say "pass" +say "pass" (prints: pass) (test we can cope with blank lines at the end of a file) diff --git a/tests/fixtures/whitespace/trailing_empty_lines.rock b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/trailing_empty_lines.rock similarity index 76% rename from tests/fixtures/whitespace/trailing_empty_lines.rock rename to Starship/Rockstar.Test/programs/v1-fixtures/whitespace/trailing_empty_lines.rock index 6ea7e04c..a81f2d0e 100644 --- a/tests/fixtures/whitespace/trailing_empty_lines.rock +++ b/Starship/Rockstar.Test/programs/v1-fixtures/whitespace/trailing_empty_lines.rock @@ -1,3 +1,2 @@ -say "pass" +say "pass" (prints: pass) (test we can cope with EMPTY lines - i.e. multiple newlines - at the end of a file) - diff --git a/Starship/Rockstar.Wasm/Program.cs b/Starship/Rockstar.Wasm/Program.cs new file mode 100644 index 00000000..4f84d76e --- /dev/null +++ b/Starship/Rockstar.Wasm/Program.cs @@ -0,0 +1,3 @@ +using System; + +Console.WriteLine("If you ever see this, it means you've accidentally run the WASM engine. This is bad, because if you run it, it'll run, and then stop, and then nothing will work."); \ No newline at end of file diff --git a/Starship/Rockstar.Wasm/Properties/AssemblyInfo.cs b/Starship/Rockstar.Wasm/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..9ad9b578 --- /dev/null +++ b/Starship/Rockstar.Wasm/Properties/AssemblyInfo.cs @@ -0,0 +1,4 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +[assembly:System.Runtime.Versioning.SupportedOSPlatform("browser")] diff --git a/Starship/Rockstar.Wasm/Properties/launchSettings.json b/Starship/Rockstar.Wasm/Properties/launchSettings.json new file mode 100644 index 00000000..d4bf7dd6 --- /dev/null +++ b/Starship/Rockstar.Wasm/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "Rockstar.Wasm": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:7075;http://localhost:5024", + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + } + } +} diff --git a/Starship/Rockstar.Wasm/Rockstar.Wasm.csproj b/Starship/Rockstar.Wasm/Rockstar.Wasm.csproj new file mode 100644 index 00000000..5ba2e602 --- /dev/null +++ b/Starship/Rockstar.Wasm/Rockstar.Wasm.csproj @@ -0,0 +1,25 @@ + + + net8.0-browser + true + + + False + None + true + true + true + true + true + + + exe + enable + + + + + + + + diff --git a/Starship/Rockstar.Wasm/Rockstar.Wasm.v3.ncrunchproject b/Starship/Rockstar.Wasm/Rockstar.Wasm.v3.ncrunchproject new file mode 100644 index 00000000..319cd523 --- /dev/null +++ b/Starship/Rockstar.Wasm/Rockstar.Wasm.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file diff --git a/Starship/Rockstar.Wasm/RockstarRunner.cs b/Starship/Rockstar.Wasm/RockstarRunner.cs new file mode 100644 index 00000000..baa1720c --- /dev/null +++ b/Starship/Rockstar.Wasm/RockstarRunner.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices.JavaScript; +using System.Threading.Tasks; +using Rockstar.Engine; + +namespace Rockstar.Wasm; + +public class WasmIO(Action output, Queue input) : IRockstarIO { + public string? Read() => input.TryDequeue(out var s) ? s : null; + public void Write(string s) => output(s); +} + +public partial class RockstarRunner { + + + [JSExport] + public static Task Status() { + var status = $"Rockstar (Starship {RockstarEnvironment.VERSION} on {System.Runtime.InteropServices.RuntimeInformation.RuntimeIdentifier})"; + Console.WriteLine(status); + return Task.Run(() => status); + } + + private static readonly Parser parser = new(); + + [JSExport] + public static Task Run(string source, + [JSMarshalAs>] Action output, string? input = null) { + Console.WriteLine("Running Rockstar program"); + var inputQueue = new Queue((input ?? "").Split(Environment.NewLine)); + return Task.Run(() => { + var program = parser.Parse(source); + var e = new WasmIO(output, inputQueue); + var env = new RockstarEnvironment(e); + var result = env.Execute(program); + return result?.Value?.ToString() ?? ""; + }); + } + + [JSExport] + public static Task Parse(string source) { + Console.WriteLine("Parsing Rockstar program"); + return Task.Run(() => parser.Parse(source).ToString()); + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Wasm/runtimeconfig.template.json b/Starship/Rockstar.Wasm/runtimeconfig.template.json new file mode 100644 index 00000000..b96a9432 --- /dev/null +++ b/Starship/Rockstar.Wasm/runtimeconfig.template.json @@ -0,0 +1,10 @@ +{ + "wasmHostProperties": { + "perHostConfig": [ + { + "name": "browser", + "host": "browser" + } + ] + } +} \ No newline at end of file diff --git a/Starship/Rockstar.Wasm/wwwroot/index.html b/Starship/Rockstar.Wasm/wwwroot/index.html new file mode 100644 index 00000000..0db1e62b --- /dev/null +++ b/Starship/Rockstar.Wasm/wwwroot/index.html @@ -0,0 +1,29 @@ + + + + Rockstar.Wasm + + + + + +
+ +

+
+
+
diff --git a/Starship/Rockstar.Wasm/wwwroot/main.js b/Starship/Rockstar.Wasm/wwwroot/main.js
new file mode 100644
index 00000000..051096de
--- /dev/null
+++ b/Starship/Rockstar.Wasm/wwwroot/main.js
@@ -0,0 +1,15 @@
+import { dotnet } from './_framework/dotnet.js'
+
+const { setModuleImports, getAssemblyExports, getConfig } = await dotnet
+    .withDiagnosticTracing(false)
+    .withApplicationArgumentsFromQuery()
+    .create();
+
+const config = getConfig();
+const exports = await getAssemblyExports(config.mainAssemblyName);
+console.log(exports);
+await dotnet.run();
+
+export function RunRockstarProgram(source) {
+	return exports.Rockstar.Wasm.RockstarRunner.Run(source);
+}
\ No newline at end of file
diff --git a/Starship/Rockstar/ConsoleEnvironment.cs b/Starship/Rockstar/ConsoleEnvironment.cs
new file mode 100644
index 00000000..e69de29b
diff --git a/Starship/Rockstar/ConsoleIO.cs b/Starship/Rockstar/ConsoleIO.cs
new file mode 100644
index 00000000..1c0e5a86
--- /dev/null
+++ b/Starship/Rockstar/ConsoleIO.cs
@@ -0,0 +1,8 @@
+using Rockstar.Engine;
+
+namespace Rockstar;
+
+public class ConsoleIO : IRockstarIO {
+	public string? Read() => Console.ReadLine();
+	public void Write(string? s) => Console.Write(s);
+}
diff --git a/Starship/Rockstar/Program.cs b/Starship/Rockstar/Program.cs
new file mode 100644
index 00000000..994f80bf
--- /dev/null
+++ b/Starship/Rockstar/Program.cs
@@ -0,0 +1,60 @@
+using Rockstar.Engine;
+namespace Rockstar;
+
+public static class Program {
+	private static readonly Parser parser = new();
+	public static void Main(string[] args) {
+		string? rockstarProgramFile = null;
+		List programArguments = [];
+		foreach (var arg in args) {
+			if (rockstarProgramFile == null) {
+				if (arg == "--version") DisplayVersionAndExit();
+				if (arg.EndsWith(".rock", StringComparison.InvariantCultureIgnoreCase)) rockstarProgramFile = arg;
+			} else {
+				programArguments.Add(arg);
+			}
+		}
+
+		if (rockstarProgramFile != null) {
+			RunFile(rockstarProgramFile, programArguments.ToArray());
+		} else {
+			Console.WriteLine($"Rockstar {RockstarEnvironment.VERSION} on {System.Runtime.InteropServices.RuntimeInformation.RuntimeIdentifier}.");
+			Console.WriteLine("Type 'exit' to exit.");
+			RunPrompt();
+		}
+	}
+
+	private static void DisplayVersionAndExit() {
+		Console.WriteLine(RockstarEnvironment.VERSION);
+		Environment.Exit(0);
+	}
+
+	private static void RunFile(string path, string[] args) {
+		var env = new RockstarEnvironment(new ConsoleIO(), args);
+		Run(File.ReadAllText(path), env);
+	}
+
+	private static void RunPrompt() {
+		var env = new RockstarEnvironment(new ConsoleIO());
+		while (true) {
+			env.Write("» ");
+			var line = env.ReadInput();
+			if (line == null) break;
+			var result = Run(line, env);
+			Console.WriteLine("« " + result.Value);
+		}
+	}
+
+	private static Result Run(string source, RockstarEnvironment env) {
+		try {
+			var program = parser.Parse(source);
+			var result = env.Execute(program);
+			if (result.WhatToDo == WhatToDo.Exit) Environment.Exit(0);
+			return result;
+		} catch (FormatException ex) {
+			Console.Error.WriteLine(ex);
+		}
+
+		return Result.Unknown;
+	}
+}
\ No newline at end of file
diff --git a/Starship/Rockstar/Rockstar.csproj b/Starship/Rockstar/Rockstar.csproj
new file mode 100644
index 00000000..2c5ba914
--- /dev/null
+++ b/Starship/Rockstar/Rockstar.csproj
@@ -0,0 +1,24 @@
+
+	
+		Exe
+		net8.0
+		enable
+		enable
+	
+	
+	  
+	
+	
+	  
+	
+	
+		False
+		None
+		true
+		true
+	
+	
+		rockstar
+		rockstar-icon.ico
+	
+
diff --git a/Starship/Rockstar/Rockstar.v3.ncrunchproject b/Starship/Rockstar/Rockstar.v3.ncrunchproject
new file mode 100644
index 00000000..5bf17150
--- /dev/null
+++ b/Starship/Rockstar/Rockstar.v3.ncrunchproject
@@ -0,0 +1,8 @@
+
+  
+    
+    
+      
+    
+  
+
\ No newline at end of file
diff --git a/Starship/Rockstar/outside.rock b/Starship/Rockstar/outside.rock
new file mode 100644
index 00000000..50da92ce
--- /dev/null
+++ b/Starship/Rockstar/outside.rock
@@ -0,0 +1,5 @@
+index is 0
+while index is less than the outside
+shout the outside at index
+build index up
+yeah
\ No newline at end of file
diff --git a/Starship/Rockstar/rockstar-icon.ico b/Starship/Rockstar/rockstar-icon.ico
new file mode 100644
index 00000000..73417a4d
Binary files /dev/null and b/Starship/Rockstar/rockstar-icon.ico differ
diff --git a/Starship/Starship.sln b/Starship/Starship.sln
new file mode 100644
index 00000000..48154a0f
--- /dev/null
+++ b/Starship/Starship.sln
@@ -0,0 +1,49 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31903.59
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Rockstar", "Rockstar\Rockstar.csproj", "{8642E9E9-C3D1-4373-BA19-36DB8A0A2F44}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Rockstar.Wasm", "Rockstar.Wasm\Rockstar.Wasm.csproj", "{95CD6782-97C3-4BA7-8E00-51B5BA65EB16}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Rockstar.Test", "Rockstar.Test\Rockstar.Test.csproj", "{470E1D9B-6620-4BD5-9451-2069BF3D53BE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Rockstar.Engine", "Rockstar.Engine\Rockstar.Engine.csproj", "{1B294891-B457-46AD-8AB5-131C9E0487C9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Rockstar.Profiler", "Rockstar.Profiler\Rockstar.Profiler.csproj", "{DD04952A-ACE2-4D4E-973B-D8FEA85668DA}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{8642E9E9-C3D1-4373-BA19-36DB8A0A2F44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{8642E9E9-C3D1-4373-BA19-36DB8A0A2F44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{8642E9E9-C3D1-4373-BA19-36DB8A0A2F44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{8642E9E9-C3D1-4373-BA19-36DB8A0A2F44}.Release|Any CPU.Build.0 = Release|Any CPU
+		{95CD6782-97C3-4BA7-8E00-51B5BA65EB16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{95CD6782-97C3-4BA7-8E00-51B5BA65EB16}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{95CD6782-97C3-4BA7-8E00-51B5BA65EB16}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{95CD6782-97C3-4BA7-8E00-51B5BA65EB16}.Release|Any CPU.Build.0 = Release|Any CPU
+		{470E1D9B-6620-4BD5-9451-2069BF3D53BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{470E1D9B-6620-4BD5-9451-2069BF3D53BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{470E1D9B-6620-4BD5-9451-2069BF3D53BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{470E1D9B-6620-4BD5-9451-2069BF3D53BE}.Release|Any CPU.Build.0 = Release|Any CPU
+		{1B294891-B457-46AD-8AB5-131C9E0487C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{1B294891-B457-46AD-8AB5-131C9E0487C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{1B294891-B457-46AD-8AB5-131C9E0487C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{1B294891-B457-46AD-8AB5-131C9E0487C9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DD04952A-ACE2-4D4E-973B-D8FEA85668DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DD04952A-ACE2-4D4E-973B-D8FEA85668DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DD04952A-ACE2-4D4E-973B-D8FEA85668DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DD04952A-ACE2-4D4E-973B-D8FEA85668DA}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {679EB718-42A5-4854-99F1-EB8C5A1D8857}
+	EndGlobalSection
+EndGlobal
diff --git a/Starship/Starship.sln.DotSettings b/Starship/Starship.sln.DotSettings
new file mode 100644
index 00000000..b54cdc2d
--- /dev/null
+++ b/Starship/Starship.sln.DotSettings
@@ -0,0 +1,7 @@
+
+	True
+	True
+	True
+	
+	True
+	True
\ No newline at end of file
diff --git a/Starship/Starship.v3.ncrunchsolution b/Starship/Starship.v3.ncrunchsolution
new file mode 100644
index 00000000..fe9b0700
--- /dev/null
+++ b/Starship/Starship.v3.ncrunchsolution
@@ -0,0 +1,8 @@
+
+  
+    True
+    False
+    True
+    True
+  
+
\ No newline at end of file
diff --git a/cm-lang-rockstar/.gitignore b/cm-lang-rockstar/.gitignore
new file mode 100644
index 00000000..a97c4661
--- /dev/null
+++ b/cm-lang-rockstar/.gitignore
@@ -0,0 +1,5 @@
+/node_modules
+package-lock.json
+/dist
+/src/*.js
+/src/*.d.ts
diff --git a/cm-lang-rockstar/.npmignore b/cm-lang-rockstar/.npmignore
new file mode 100644
index 00000000..9bd97602
--- /dev/null
+++ b/cm-lang-rockstar/.npmignore
@@ -0,0 +1,5 @@
+/src
+/test
+/node_modules
+rollup.config.js
+tsconfig.json
diff --git a/cm-lang-rockstar/LICENSE b/cm-lang-rockstar/LICENSE
new file mode 100644
index 00000000..57650a9d
--- /dev/null
+++ b/cm-lang-rockstar/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (C) 2021 by Marijn Haverbeke  and others
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/cm-lang-rockstar/README.md b/cm-lang-rockstar/README.md
new file mode 100644
index 00000000..6fdec050
--- /dev/null
+++ b/cm-lang-rockstar/README.md
@@ -0,0 +1,2 @@
+How to build a Lezer grammar for Rockstar.
+
diff --git a/cm-lang-rockstar/jest.config.mjs b/cm-lang-rockstar/jest.config.mjs
new file mode 100644
index 00000000..c51038bc
--- /dev/null
+++ b/cm-lang-rockstar/jest.config.mjs
@@ -0,0 +1,198 @@
+/**
+ * For a detailed explanation regarding each configuration property, visit:
+ * https://jestjs.io/docs/configuration
+ */
+
+/** @type {import('jest').Config} */
+const config = {
+  // All imported modules in your tests should be mocked automatically
+  // automock: false,
+
+  // Stop running tests after `n` failures
+  // bail: 0,
+
+  // The directory where Jest should store its cached dependency information
+  // cacheDirectory: "C:\\Users\\dylan\\AppData\\Local\\Temp\\jest",
+
+  // Automatically clear mock calls, instances, contexts and results before every test
+  // clearMocks: false,
+
+  // Indicates whether the coverage information should be collected while executing the test
+  // collectCoverage: false,
+
+  // An array of glob patterns indicating a set of files for which coverage information should be collected
+  // collectCoverageFrom: undefined,
+
+  // The directory where Jest should output its coverage files
+  // coverageDirectory: undefined,
+
+  // An array of regexp pattern strings used to skip coverage collection
+  // coveragePathIgnorePatterns: [
+  //   "\\\\node_modules\\\\"
+  // ],
+
+  // Indicates which provider should be used to instrument code for coverage
+  coverageProvider: "v8",
+
+  // A list of reporter names that Jest uses when writing coverage reports
+  // coverageReporters: [
+  //   "json",
+  //   "text",
+  //   "lcov",
+  //   "clover"
+  // ],
+
+  // An object that configures minimum threshold enforcement for coverage results
+  // coverageThreshold: undefined,
+
+  // A path to a custom dependency extractor
+  // dependencyExtractor: undefined,
+
+  // Make calling deprecated APIs throw helpful error messages
+  // errorOnDeprecated: false,
+
+  // The default configuration for fake timers
+  // fakeTimers: {
+  //   "enableGlobally": false
+  // },
+
+  // Force coverage collection from ignored files using an array of glob patterns
+  // forceCoverageMatch: [],
+
+  // A path to a module which exports an async function that is triggered once before all test suites
+  // globalSetup: undefined,
+
+  // A path to a module which exports an async function that is triggered once after all test suites
+  // globalTeardown: undefined,
+
+  // A set of global variables that need to be available in all test environments
+  // globals: {},
+
+  // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
+  // maxWorkers: "50%",
+
+  // An array of directory names to be searched recursively up from the requiring module's location
+  // moduleDirectories: [
+  //   "node_modules"
+  // ],
+
+  // An array of file extensions your modules use
+  // moduleFileExtensions: [
+  //   "js",
+  //   "mjs",
+  //   "cjs",
+  //   "jsx",
+  //   "ts",
+  //   "tsx",
+  //   "json",
+  //   "node"
+  // ],
+
+  // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
+  // moduleNameMapper: {},
+
+  // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
+  // modulePathIgnorePatterns: [],
+
+  // Activates notifications for test results
+  // notify: false,
+
+  // An enum that specifies notification mode. Requires { notify: true }
+  // notifyMode: "failure-change",
+
+  // A preset that is used as a base for Jest's configuration
+  // preset: undefined,
+
+  // Run tests from one or more projects
+  // projects: undefined,
+
+  // Use this configuration option to add custom reporters to Jest
+  // reporters: undefined,
+
+  // Automatically reset mock state before every test
+  // resetMocks: false,
+
+  // Reset the module registry before running each individual test
+  // resetModules: false,
+
+  // A path to a custom resolver
+  // resolver: undefined,
+
+  // Automatically restore mock state and implementation before every test
+  // restoreMocks: false,
+
+  // The root directory that Jest should scan for tests and modules within
+  // rootDir: undefined,
+
+  // A list of paths to directories that Jest should use to search for files in
+  // roots: [
+  //   ""
+  // ],
+
+  // Allows you to use a custom runner instead of Jest's default test runner
+  // runner: "jest-runner",
+
+  // The paths to modules that run some code to configure or set up the testing environment before each test
+  // setupFiles: [],
+
+  // A list of paths to modules that run some code to configure or set up the testing framework before each test
+  // setupFilesAfterEnv: [],
+
+  // The number of seconds after which a test is considered as slow and reported as such in the results.
+  // slowTestThreshold: 5,
+
+  // A list of paths to snapshot serializer modules Jest should use for snapshot testing
+  // snapshotSerializers: [],
+
+  // The test environment that will be used for testing
+  testEnvironment: "jsdom",
+
+  // Options that will be passed to the testEnvironment
+  // testEnvironmentOptions: {},
+
+  // Adds a location field to test results
+  // testLocationInResults: false,
+
+  // The glob patterns Jest uses to detect test files
+  // testMatch: [
+  //   "**/__tests__/**/*.[jt]s?(x)",
+  //   "**/?(*.)+(spec|test).[tj]s?(x)"
+  // ],
+
+  // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
+  // testPathIgnorePatterns: [
+  //   "\\\\node_modules\\\\"
+  // ],
+
+  // The regexp pattern or array of patterns that Jest uses to detect test files
+  // testRegex: [],
+
+  // This option allows the use of a custom results processor
+  // testResultsProcessor: undefined,
+
+  // This option allows use of a custom test runner
+  // testRunner: "jest-circus/runner",
+
+  // A map from regular expressions to paths to transformers
+  // transform: undefined,
+
+  // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
+  // transformIgnorePatterns: [
+  //   "\\\\node_modules\\\\",
+  //   "\\.pnp\\.[^\\\\]+$"
+  // ],
+
+  // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
+  // unmockedModulePathPatterns: undefined,
+
+  // Indicates whether each individual test should be reported during the run
+  // verbose: undefined,
+
+  // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
+  // watchPathIgnorePatterns: [],
+
+  // Whether to use watchman for file crawling
+  // watchman: true,
+};
+
+export default config;
diff --git a/cm-lang-rockstar/package.json b/cm-lang-rockstar/package.json
new file mode 100644
index 00000000..348602f1
--- /dev/null
+++ b/cm-lang-rockstar/package.json
@@ -0,0 +1,61 @@
+{
+  "name": "codemirror-lang-rockstar",
+  "version": "0.1.0",
+  "description": "Rockstar language support for CodeMirror",
+  "watch": {
+    "prepare": {
+      "patterns": [
+        "src"
+      ],
+      "ignore": [
+        "src/grammars/kitchen-sink.js",
+        "src/grammars/kitchen-sink.terms.js",
+        "src/grammars/rockstar.js",
+        "src/grammars/rockstar.terms.js"
+      ],
+      "extensions": "js,grammar,ts,mjs"
+    }
+  },
+  "scripts": {
+    "build": "lezer-generator src/grammars/rockstar.grammar -o src/grammars/rockstar && lezer-generator src/grammars/kitchen-sink.grammar -o src/grammars/kitchen-sink && rollup -c",
+    "build-debug": "lezer-generator src/javascript.grammar --names -o src/parser && rollup -c",
+    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
+    "prepare": "npm run build",
+    "watch": "npm-watch"
+  },
+  "type": "module",
+  "main": "dist/editor.cjs",
+  "module": "dist/editor.js",
+  "exports": {
+    "import": "./dist/editor.js",
+    "require": "./dist/editor.cjs"
+  },
+  "types": "dist/editor.d.ts",
+  "sideEffects": false,
+  "wallaby": {
+    "env": {
+      "params": {
+        "runner": "--experimental-vm-modules"
+      }
+    }
+  },
+  "dependencies": {
+    "@codemirror/language": "^6.10.2",
+    "@lezer/highlight": "^1.2.0",
+    "@lezer/lr": "^1.4.2",
+    "codemirror": "^6.0.1",
+    "npm-watch": "^0.13.0"
+  },
+  "devDependencies": {
+    "@lezer/generator": "^1.7.1",
+    "@rollup/plugin-node-resolve": "^15.2.3",
+    "@rollup/plugin-terser": "^0.4.4",
+    "jest": "^29.7.0",
+    "jest-environment-jsdom": "^29.7.0",
+    "rollup": "^4.19.1",
+    "rollup-plugin-dts": "^6.1.1",
+    "rollup-plugin-ts": "^3.4.5",
+    "typescript": "^5.5.4"
+  },
+  "license": "MIT"
+}
diff --git a/cm-lang-rockstar/rollup.config.js b/cm-lang-rockstar/rollup.config.js
new file mode 100644
index 00000000..e909cdc9
--- /dev/null
+++ b/cm-lang-rockstar/rollup.config.js
@@ -0,0 +1,15 @@
+import typescript from "rollup-plugin-ts"
+import { nodeResolve } from "@rollup/plugin-node-resolve"
+import { lezer } from "@lezer/generator/rollup"
+import terser from '@rollup/plugin-terser';
+
+export default [
+	{
+		input: "src/editor.mjs",
+		output: [
+			{ dir: "../codewithrockstar.com/js/codemirror", format: "es" },
+			{ dir: "./test/parser", format: "es" }
+		],
+		plugins: [lezer(), nodeResolve(), typescript(), terser()]
+	}
+]
diff --git a/cm-lang-rockstar/src/create-theme.ts b/cm-lang-rockstar/src/create-theme.ts
new file mode 100644
index 00000000..89662399
--- /dev/null
+++ b/cm-lang-rockstar/src/create-theme.ts
@@ -0,0 +1,105 @@
+import {EditorView} from '@codemirror/view';
+import {Extension} from '@codemirror/state';
+import {
+	HighlightStyle,
+	TagStyle,
+	syntaxHighlighting,
+} from '@codemirror/language';
+
+interface Options {
+	/**
+	 * Theme variant. Determines which styles CodeMirror will apply by default.
+	 */
+	variant: Variant;
+
+	/**
+	 * Settings to customize the look of the editor, like background, gutter, selection and others.
+	 */
+	settings: Settings;
+
+	/**
+	 * Syntax highlighting styles.
+	 */
+	styles: TagStyle[];
+}
+
+type Variant = 'light' | 'dark';
+
+interface Settings {
+	/**
+	 * Editor background.
+	 */
+	background: string;
+
+	/**
+	 * Default text color.
+	 */
+	foreground: string;
+
+	/**
+	 * Caret color.
+	 */
+	caret: string;
+
+	/**
+	 * Selection background.
+	 */
+	selection: string;
+
+	/**
+	 * Background of highlighted lines.
+	 */
+	lineHighlight: string;
+
+	/**
+	 * Gutter background.
+	 */
+	gutterBackground: string;
+
+	/**
+	 * Text color inside gutter.
+	 */
+	gutterForeground: string;
+}
+
+const createTheme = ({variant, settings, styles}: Options): Extension => {
+	const theme = EditorView.theme(
+		{
+			// eslint-disable-next-line @typescript-eslint/naming-convention
+			'&': {
+				backgroundColor: settings.background,
+				color: settings.foreground,
+			},
+			'.cm-content': {
+				caretColor: settings.caret,
+			},
+			'.cm-cursor, .cm-dropCursor': {
+				borderLeftColor: settings.caret,
+			},
+			'&.cm-focused .cm-selectionBackgroundm .cm-selectionBackground, .cm-content ::selection':
+				{
+					backgroundColor: settings.selection,
+				},
+			'.cm-activeLine': {
+				backgroundColor: settings.lineHighlight,
+			},
+			'.cm-gutters': {
+				backgroundColor: settings.gutterBackground,
+				color: settings.gutterForeground,
+			},
+			'.cm-activeLineGutter': {
+				backgroundColor: settings.lineHighlight,
+			},
+		},
+		{
+			dark: variant === 'dark',
+		},
+	);
+
+	const highlightStyle = HighlightStyle.define(styles);
+	const extension = [theme, syntaxHighlighting(highlightStyle)];
+
+	return extension;
+};
+
+export default createTheme;
\ No newline at end of file
diff --git a/cm-lang-rockstar/src/editor.mjs b/cm-lang-rockstar/src/editor.mjs
new file mode 100644
index 00000000..7ba918cb
--- /dev/null
+++ b/cm-lang-rockstar/src/editor.mjs
@@ -0,0 +1,25 @@
+import { EditorView, basicSetup } from "codemirror"
+import { keymap } from "@codemirror/view"
+import { Rockstar } from "./rockstar"
+import { KitchenSink } from "./kitchen-sink"
+import { Prec } from "@codemirror/state";
+
+import { deepPurple, kitchenSink, blackSabbath, cobalt, dracula, espresso, solarizedLight, coolGlow, amy } from "./themes";
+
+export {
+	EditorView, basicSetup,
+	keymap, Prec,
+	// Languages
+	KitchenSink,
+	Rockstar,
+	// themes
+	kitchenSink,
+	blackSabbath,
+	espresso,
+	cobalt,
+	dracula,
+	solarizedLight,
+	coolGlow,
+	amy,
+	deepPurple
+};
diff --git a/cm-lang-rockstar/src/grammars/kitchen-sink-highlight.js b/cm-lang-rockstar/src/grammars/kitchen-sink-highlight.js
new file mode 100644
index 00000000..f287c0ef
--- /dev/null
+++ b/cm-lang-rockstar/src/grammars/kitchen-sink-highlight.js
@@ -0,0 +1,91 @@
+import { styleTags, tags } from "@lezer/highlight"
+
+export const highlighting = styleTags({
+	Comment: tags.comment,
+	LineComment: tags.lineComment,
+	BlockComment: tags.blockComment,
+	DocComment: tags.docComment,
+	Name: tags.name,
+	VariableName: tags.variableName,
+	TypeName: tags.typeName,
+	TagName: tags.tagName,
+	PropertyName: tags.propertyName,
+	AttributeName: tags.attributeName,
+	ClassName: tags.className,
+	LabelName: tags.labelName,
+	Namespace: tags.namespace,
+	MacroName: tags.macroName,
+	Literal: tags.literal,
+	String: tags.string,
+	DocString: tags.docString,
+	Character: tags.character,
+	AttributeValue: tags.attributeValue,
+	Number: tags.number,
+	Integer: tags.integer,
+	Float: tags.float,
+	Bool: tags.bool,
+	Regexp: tags.regexp,
+	Escape: tags.escape,
+	Color: tags.color,
+	Url: tags.url,
+	Keyword: tags.keyword,
+	Self: tags.self,
+	Null: tags.null,
+	Atom: tags.atom,
+	Unit: tags.unit,
+	Modifier: tags.modifier,
+	OperatorKeyword: tags.operatorKeyword,
+	ControlKeyword: tags.controlKeyword,
+	DefinitionKeyword: tags.definitionKeyword,
+	ModuleKeyword: tags.moduleKeyword,
+	Operator: tags.operator,
+	DerefOperator: tags.derefOperator,
+	ArithmeticOperator: tags.arithmeticOperator,
+	LogicOperator: tags.logicOperator,
+	BitwiseOperator: tags.bitwiseOperator,
+	CompareOperator: tags.compareOperator,
+	UpdateOperator: tags.updateOperator,
+	DefinitionOperator: tags.definitionOperator,
+	TypeOperator: tags.typeOperator,
+	ControlOperator: tags.controlOperator,
+	Punctuation: tags.punctuation,
+	Separator: tags.separator,
+	Bracket: tags.bracket,
+	AngleBracket: tags.angleBracket,
+	SquareBracket: tags.squareBracket,
+	Paren: tags.paren,
+	Brace: tags.brace,
+	Content: tags.content,
+	Heading: tags.heading,
+	Heading1: tags.heading1,
+	Heading2: tags.heading2,
+	Heading3: tags.heading3,
+	Heading4: tags.heading4,
+	Heading5: tags.heading5,
+	Heading6: tags.heading6,
+	ContentSeparator: tags.contentSeparator,
+	List: tags.list,
+	Quote: tags.quote,
+	Emphasis: tags.emphasis,
+	Strong: tags.strong,
+	Link: tags.link,
+	Monospace: tags.monospace,
+	Strikethrough: tags.strikethrough,
+	Inserted: tags.inserted,
+	Deleted: tags.deleted,
+	Changed: tags.changed,
+	Invalid: tags.invalid,
+	Meta: tags.meta,
+	DocumentMeta: tags.documentMeta,
+	Annotation: tags.annotation,
+	ProcessingInstruction: tags.processingInstruction,
+
+	// Tags from here on down are modifiers and must wrap another tag
+	// https://lezer.codemirror.net/docs/ref/#highlight.tags.definition
+	Definition: tags.definition(tags.name),
+	Constant: tags.constant(tags.name),
+	Function: tags.function(tags.name),
+	Standard: tags.standard(tags.name),
+	Local: tags.local(tags.name),
+	Special: tags.special(tags.name)
+});
\ No newline at end of file
diff --git a/cm-lang-rockstar/src/grammars/kitchen-sink.grammar b/cm-lang-rockstar/src/grammars/kitchen-sink.grammar
new file mode 100644
index 00000000..b57214e7
--- /dev/null
+++ b/cm-lang-rockstar/src/grammars/kitchen-sink.grammar
@@ -0,0 +1,191 @@
+@external propSource highlighting from "./kitchen-sink-highlight.js"
+
+//!top
+
+@top Program { expression* }
+
+expression {
+ Comment |
+ LineComment |
+ BlockComment |
+ DocComment |
+ Name |
+ VariableName |
+ TypeName |
+ TagName |
+ PropertyName |
+ AttributeName |
+ ClassName |
+ LabelName |
+ Namespace |
+ MacroName |
+ Literal |
+ String |
+ DocString |
+ Character |
+ AttributeValue |
+ Number |
+ Integer |
+ Float |
+ Bool |
+ Regexp |
+ Escape |
+ Color |
+ Url |
+ Keyword |
+ Self |
+ Null |
+ Atom |
+ Unit |
+ Modifier |
+ OperatorKeyword |
+ ControlKeyword |
+ DefinitionKeyword |
+ ModuleKeyword |
+ Operator |
+ DerefOperator |
+ ArithmeticOperator |
+ LogicOperator |
+ BitwiseOperator |
+ CompareOperator |
+ UpdateOperator |
+ DefinitionOperator |
+ TypeOperator |
+ ControlOperator |
+ Punctuation |
+ Separator |
+ Bracket |
+ AngleBracket |
+ SquareBracket |
+ Paren |
+ Brace |
+ Content |
+ Heading |
+ Heading1 |
+ Heading2 |
+ Heading3 |
+ Heading4 |
+ Heading5 |
+ Heading6 |
+ ContentSeparator |
+ List |
+ Quote |
+ Emphasis |
+ Strong |
+ Link |
+ Monospace |
+ Strikethrough |
+ Inserted |
+ Deleted |
+ Changed |
+ Invalid |
+ Meta |
+ DocumentMeta |
+ Annotation |
+ ProcessingInstruction |
+ Definition |
+ Constant |
+ Function |
+ Standard |
+ Local |
+ Special
+}
+
+
+//!tokens
+
+@tokens {
+ Comment  { "Comment" }
+ LineComment  { "LineComment" }
+ BlockComment  { "BlockComment" }
+ DocComment  { "DocComment" }
+ Name  { "Name" }
+ VariableName  { "VariableName" }
+ TypeName  { "TypeName" }
+ TagName  { "TagName" }
+ PropertyName  { "PropertyName" }
+ AttributeName  { "AttributeName" }
+ ClassName  { "ClassName" }
+ LabelName  { "LabelName" }
+ Namespace  { "Namespace" }
+ MacroName  { "MacroName" }
+ Literal  { "Literal" }
+ String  { "String" }
+ DocString  { "DocString" }
+ Character  { "Character" }
+ AttributeValue  { "AttributeValue" }
+ Number  { "Number" }
+ Integer  { "Integer" }
+ Float  { "Float" }
+ Bool  { "Bool" }
+ Regexp  { "Regexp" }
+ Escape  { "Escape" }
+ Color  { "Color" }
+ Url  { "Url" }
+ Keyword  { "Keyword" }
+ Self  { "Self" }
+ Null  { "Null" }
+ Atom  { "Atom" }
+ Unit  { "Unit" }
+ Modifier  { "Modifier" }
+ OperatorKeyword  { "OperatorKeyword" }
+ ControlKeyword  { "ControlKeyword" }
+ DefinitionKeyword  { "DefinitionKeyword" }
+ ModuleKeyword  { "ModuleKeyword" }
+ Operator  { "Operator" }
+ DerefOperator  { "DerefOperator" }
+ ArithmeticOperator  { "ArithmeticOperator" }
+ LogicOperator  { "LogicOperator" }
+ BitwiseOperator  { "BitwiseOperator" }
+ CompareOperator  { "CompareOperator" }
+ UpdateOperator  { "UpdateOperator" }
+ DefinitionOperator  { "DefinitionOperator" }
+ TypeOperator  { "TypeOperator" }
+ ControlOperator  { "ControlOperator" }
+ Punctuation  { "Punctuation" }
+ Separator  { "Separator" }
+ Bracket  { "Bracket" }
+ AngleBracket  { "AngleBracket" }
+ SquareBracket  { "SquareBracket" }
+ Paren  { "Paren" }
+ Brace  { "Brace" }
+ Content  { "Content" }
+ Heading  { "Heading" }
+ Heading1  { "Heading1" }
+ Heading2  { "Heading2" }
+ Heading3  { "Heading3" }
+ Heading4  { "Heading4" }
+ Heading5  { "Heading5" }
+ Heading6  { "Heading6" }
+ ContentSeparator  { "ContentSeparator" }
+ List  { "List" }
+ Quote  { "Quote" }
+ Emphasis  { "Emphasis" }
+ Strong  { "Strong" }
+ Link  { "Link" }
+ Monospace  { "Monospace" }
+ Strikethrough  { "Strikethrough" }
+ Inserted  { "Inserted" }
+ Deleted  { "Deleted" }
+ Changed  { "Changed" }
+ Invalid  { "Invalid" }
+ Meta  { "Meta" }
+ DocumentMeta  { "DocumentMeta" }
+ Annotation  { "Annotation" }
+ ProcessingInstruction  { "ProcessingInstruction" }
+ Definition  { "Definition(tag)" }
+ Constant  { "Constant(tag)" }
+ Function  { "Function(tag)" }
+ Standard  { "Standard(tag)" }
+ Local  { "Local(tag)" }
+ Special  { "Special(tag)" }
+ space { $[ \t\n\r]+ }
+}
+
+//!skip
+
+@skip { space }
+
+//!delim
+
+@detectDelim
diff --git a/cm-lang-rockstar/src/grammars/kitchen-sink.grammar.d.ts b/cm-lang-rockstar/src/grammars/kitchen-sink.grammar.d.ts
new file mode 100644
index 00000000..38f49b47
--- /dev/null
+++ b/cm-lang-rockstar/src/grammars/kitchen-sink.grammar.d.ts
@@ -0,0 +1,3 @@
+import {LRParser} from "@lezer/lr"
+
+export declare const parser: LRParser
diff --git a/cm-lang-rockstar/src/grammars/kitchen-sink.js b/cm-lang-rockstar/src/grammars/kitchen-sink.js
new file mode 100644
index 00000000..38ba32ca
--- /dev/null
+++ b/cm-lang-rockstar/src/grammars/kitchen-sink.js
@@ -0,0 +1,18 @@
+// This file was generated by lezer-generator. You probably shouldn't edit it.
+import {LRParser} from "@lezer/lr"
+import {highlighting} from "./kitchen-sink-highlight.js"
+export const parser = LRParser.deserialize({
+  version: 14,
+  states: "nQVQPOOOOQO'#EY'#EYOOQO'#EU'#EUQVQPOOOOQO-E8S-E8S",
+  stateData: "&o~O!{OS~OQPORPOSPOTPOUPOVPOWPOXPOYPOZPO[PO]PO^PO_PO`POaPObPOcPOdPOePOfPOgPOhPOiPOjPOkPOlPOmPOnPOoPOpPOqPOrPOsPOtPOuPOvPOwPOxPOyPOzPO{PO|PO}PO!OPO!PPO!QPO!RPO!SPO!TPO!UPO!VPO!WPO!XPO!YPO!ZPO![PO!]PO!^PO!_PO!`PO!aPO!bPO!cPO!dPO!ePO!fPO!gPO!hPO!iPO!jPO!kPO!lPO!mPO!nPO!oPO!pPO!qPO!rPO!sPO!tPO!uPO!vPO!wPO~O",
+  goto: "#Y!}PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP#OPPP#UQRORSRTQOR",
+  nodeNames: "⚠ Program Comment LineComment BlockComment DocComment Name VariableName TypeName TagName PropertyName AttributeName ClassName LabelName Namespace MacroName Literal String DocString Character AttributeValue Number Integer Float Bool Regexp Escape Color Url Keyword Self Null Atom Unit Modifier OperatorKeyword ControlKeyword DefinitionKeyword ModuleKeyword Operator DerefOperator ArithmeticOperator LogicOperator BitwiseOperator CompareOperator UpdateOperator DefinitionOperator TypeOperator ControlOperator Punctuation Separator Bracket AngleBracket SquareBracket Paren Brace Content Heading Heading1 Heading2 Heading3 Heading4 Heading5 Heading6 ContentSeparator List Quote Emphasis Strong Link Monospace Strikethrough Inserted Deleted Changed Invalid Meta DocumentMeta Annotation ProcessingInstruction Definition Constant Function Standard Local Special",
+  maxTerm: 90,
+  propSources: [highlighting],
+  skippedNodes: [0],
+  repeatNodeCount: 1,
+  tokenData: "!E`~RhXY!mYZ!m]^!mpq!m!c!d#O!d!e*g!e!f/`!f!g:q!g!hDU!h!iEw!j!kHS!k!lJP!m!nLd!n!oM_!o!p!%p!p!q!*i!q!r!,r!r!s!.q!s!t!4j!t!u!5X!u!v!5|!v!w!>_!w!x!A[!x!y!Cu~!rS!{~XY!mYZ!m]^!mpq!m~#RR#b#c#[#f#g%s#h#i'|~#_Q#Z#[#e#b#c$r~#hP#`#a#k~#nP#X#Y#q~#tP!d!e#w~#zP#f#g#}~$QP#T#U$T~$WP#V#W$Z~$^P#_#`$a~$dP#X#Y$g~$jP#h#i$m~$rO!U~~$uP#c#d$x~${P#h#i%O~%RP#T#U%U~%XP#h#i%[~%_P#]#^%b~%eP#c#d%h~%kP#b#c%n~%sO!p~~%vP#]#^%y~%|P#h#i&P~&SP#[#]&V~&YP#a#b&]~&`P#X#Y&c~&fP#h#i&i~&lP#]#^&o~&rP#V#W&u~&xP!q!r&{~'OP#d#e'R~'UP#X#Y'X~'[P#f#g'_~'bP#T#U'e~'hP#h#i'k~'nP#c#d'q~'tP#f#g'w~'|Oy~~(PQ#c#d(V#h#i(b~(YP#a#b(]~(bOp~~(eP#f#g(h~(kP#]#^(n~(qP#U#V(t~(wP#i#j(z~(}P#h#i)Q~)TP#X#Y)W~)ZQ!p!q)a!x!y)x~)dP#T#U)g~)jP#a#b)m~)pP#X#Y)s~)xOZ~~){P#T#U*O~*RP#`#a*U~*XP#i#j*[~*_P#X#Y*b~*gOd~~*jS#]#^*v#`#a,m#c#d.Q#f#g.c~*yP#h#i*|~+PP#k#l+S~+VP#]#^+Y~+]P#g#h+`~+cP#X#Y+f~+iP!q!r+l~+oP#d#e+r~+uP#X#Y+x~+{P#f#g,O~,RP#T#U,U~,XP#h#i,[~,_P#c#d,b~,eP#f#g,h~,mO{~~,pP#c#d,s~,vP#V#W,y~,|P#_#`-P~-SP!e!f-V~-YP#c#d-]~-`P#a#b-c~-fP#a#b-i~-lP#X#Y-o~-rP#b#c-u~-xP#h#i-{~.QOS~~.TP#c#d.W~.ZP#`#a.^~.cOh~~.fP#T#U.i~.lP#V#W.o~.rQ#X#Y.x#_#`.}~.}O!X~~/QP#X#Y/T~/WP#h#i/Z~/`O!T~~/cR#[#]/l#`#a1X#c#d2Y~/oP#T#U/r~/uQ#b#c/{#f#g0d~0OP#Z#[0R~0UP#X#Y0X~0[P#W#X0_~0dO!l~~0gP#T#U0j~0mP#V#W0p~0sP#h#i0v~0yP#X#Y0|~1PP#f#g1S~1XOc~~1[P#T#U1_~1bP#g#h1e~1hP#g#h1k~1nP!p!q1q~1tP#T#U1w~1zP#a#b1}~2QP#X#Y2T~2YO[~~2]R#`#a2f#a#b2w#b#c5S~2iP#c#d2l~2oP#f#g2r~2wOk~~2zQ#a#b3Q#d#e3i~3TP#X#Y3W~3ZP#b#c3^~3aP#h#i3d~3iOQ~~3lP#T#U3o~3rP#f#g3u~3xP#X#Y3{~4OP!q!r4R~4UP#d#e4X~4[P#X#Y4_~4bP#f#g4e~4hP#T#U4k~4nP#h#i4q~4tP#c#d4w~4zP#f#g4}~5SO|~~5VQ#g#h5]#h#i6j~5`P#h#i5c~5fP#T#U5i~5lP#b#c5o~5rP#h#i5u~5xPxy5{~6OP#h#i6R~6UP#T#U6X~6[P#Z#[6_~6bPyz6e~6jO!s~~6mQ#X#Y6s#f#g8`~6vP#b#c6y~6|P#h#i7P~7UP!Y~!u!v7X~7[P#X#Y7_~7bP#d#e7e~7hP#T#U7k~7nP#f#g7q~7tP#T#U7w~7zP#h#i7}~8QP#c#d8T~8WP#f#g8Z~8`O!b~~8cP#c#d8f~8iP#`#a8l~8oQ!m!n8u!q!r9p~8xP#X#Y8{~9OP#m#n9R~9UP#k#l9X~9[P#c#d9_~9bP#f#g9e~9hP#W#X9k~9pOt~~9sP#d#e9v~9yP#X#Y9|~:PP#f#g:S~:VP#T#U:Y~:]P#h#i:`~:cP#c#d:f~:iP#f#g:l~:qO!Q~~:tQ#X#Y:z#c#d@{~:}R#Y#Z;W#`#a>y#f#g?h~;ZP#]#^;^~;aP#b#c;d~;gP#]#^;j~;mP#h#i;p~;sP#]#^;v~;yP#c#d;|~O~>RP#X#Y>U~>XP#f#g>[~>_P#T#U>b~>eP#h#i>h~>kP#c#d>n~>qP#f#g>t~>yO!O~~>|P#X#Y?P~?SP#h#i?V~?YP#X#Y?]~?`P#W#X?c~?hO!k~~?kP#X#Y?n~?qP#Y#Z?t~?wP!q!r?z~?}P#d#e@Q~@TP#X#Y@W~@ZP#f#g@^~@aP#T#U@d~@gP#h#i@j~@mP#c#d@p~@sP#f#g@v~@{Ox~~AOP#V#WAR~AUR!e!fA_!u!vBY#i#jB}~AbP#c#dAe~AhP#a#bAk~AnP#a#bAq~AtP#X#YAw~AzP#b#cA}~BQP#h#iBT~BYOT~~B]P#h#iB`~BcP#f#gBf~BiP#]#^Bl~BoP#b#cBr~BuP#Z#[Bx~B}Ob~~CQP#a#bCT~CWP#X#YCZ~C^P#b#cCa~CdP#h#iCg~CjP!o!pCm~CpP#X#YCs~CvP#h#iCy~C|P#T#UDP~DUO!o~~DXQ#a#bD_#g#hEY~DbP#d#eDe~DhP#[#]Dk~DnP#T#UDq~DtP#g#hDw~DzP#]#^D}~EQP#g#hET~EYO!e~~E]P#V#WE`~EcP#T#UEf~EiP#d#eEl~EoP#X#YEr~EwOj~~EzQ#`#aFQ#i#jFi~FTP#c#dFW~FZP#T#UF^~FaP#h#iFd~FiOg~~FlP#b#cFo~FrP#V#WFu~FxP#h#iF{~GOP#]#^GR~GUP#c#dGX~G[P#b#cG_~GbPxyGe~GhP#h#iGk~GnP#T#UGq~GtP#Z#[Gw~GzPyzG}~HSO!t~~HVP#X#YHY~H]P#T#UH`~HcP#W#XHf~HiP#]#^Hl~HoP#b#cHr~HuP#Z#[Hx~H}U!Z~!R!SIa!S!TIf!T!UIk!U!VIp!V!WIu!W!XIz~IfO![~~IkO!]~~IpO!^~~IuO!_~~IzO!`~~JPO!a~~JSP#b#cJV~JYR#g#hJc#h#iKW#j#kKu~JfP#X#YJi~JlP#f#gJo~JrP#h#iJu~JxP#X#YJ{~KOP#W#XKR~KWO!j~~KZP#X#YK^~KaP#Z#[Kd~KgP#X#YKj~KmP#f#gKp~KuOf~~KxP#T#UK{~LOP#`#aLR~LUP#]#^LX~L[P#W#XL_~LdO!m~~LgP#X#YLj~LmP#m#nLp~LsP#k#lLv~LyP#c#dL|~MPP#f#gMS~MVP#W#XMY~M_Om~~MbR#T#UMk#]#^Nl#c#d!#R~MnP#U#VMq~MtP#X#YMw~MzP#`#aM}~NQP!p!qNT~NWP#T#UNZ~N^P#a#bNa~NdP#X#YNg~NlO]~~NoR#b#cNx#g#h!!X#h#i!!d~N{Q#X#Y! R#_#`!!S~! UP!e!f! X~! [P#c#d! _~! bP#a#b! e~! hP#a#b! k~! nP#X#Y! q~! tP#b#c! w~! zP#h#i! }~!!SOR~~!!XO!g~~!![P#h#i!!_~!!dO!c~~!!gP#X#Y!!j~!!mP#f#g!!p~!!sP#T#U!!v~!!yP#`#a!!|~!#RO`~~!#UQ#V#W!#[#Z#[!$]~!#_P#T#U!#b~!#eP#`#a!#h~!#kPxy!#n~!#qP#h#i!#t~!#wP#T#U!#z~!#}P#Z#[!$Q~!$TPyz!$W~!$]O!v~~!$`P#]#^!$c~!$fP#V#W!$i~!$lP!q!r!$o~!$rP#d#e!$u~!$xP#X#Y!${~!%OP#f#g!%R~!%UP#T#U!%X~!%[P#h#i!%_~!%bP#c#d!%e~!%hP#f#g!%k~!%pOz~~!%sR#T#U!%|#X#Y!&}#c#d!'`~!&PP#V#W!&S~!&VP#f#g!&Y~!&]P#c#d!&`~!&cP!p!q!&f~!&iP#T#U!&l~!&oP#a#b!&r~!&uP#X#Y!&x~!&}O_~~!'QP#h#i!'T~!'WP#T#U!'Z~!'`O!n~~!'cQ#W#X!'i#b#c!)n~!'lQ#]#^!'r#i#j!(a~!'uP#Y#Z!'x~!'{P#]#^!(O~!(RP#X#Y!(U~!(XP#f#g!([~!(aOr~~!(dP#`#a!(g~!(jP#X#Y!(m~!(pP!m!n!(s~!(vP#X#Y!(y~!(|P#m#n!)P~!)SP#k#l!)V~!)YP#c#d!)]~!)`P#f#g!)c~!)fP#W#X!)i~!)nOv~~!)qP#c#d!)t~!)wP#g#h!)z~!)}P#d#e!*Q~!*TP#T#U!*W~!*ZP#V#W!*^~!*aP#X#Y!*d~!*iO!h~~!*lQ#T#U!*r#i#j!+u~!*uP#a#b!*x~!*{P#X#Y!+O~!+TPU~#g#h!+W~!+ZP#d#e!+^~!+aP#T#U!+d~!+gP#V#W!+j~!+mP#X#Y!+p~!+uO^~~!+xQ#`#a!,O#a#b!,Z~!,RP#`#a!,U~!,ZOo~~!,^P#U#V!,a~!,dP#X#Y!,g~!,jP#f#g!,m~!,rOe~~!,uP#d#e!,x~!,{P#X#Y!-O~!-RP#f#g!-U~!-XP#T#U!-[~!-_P#h#i!-b~!-eP#c#d!-h~!-kP#f#g!-n~!-sPw~!m!n!-v~!-yP#X#Y!-|~!.PP#m#n!.S~!.VP#k#l!.Y~!.]P#c#d!.`~!.cP#f#g!.f~!.iP#W#X!.l~!.qOs~~!.tR#T#U!.}#f#g!/f#i#j!3]~!/QP#f#g!/T~!/WP#X#Y!/Z~!/^P#b#c!/a~!/fO!W~~!/iP#c#d!/l~!/oQ#V#W!/u#d#e!2U~!/xP#X#Y!/{~!0OP#g#h!0R~!0UP#g#h!0X~!0[P#]#^!0_~!0bP#b#c!0e~!0hP#Z#[!0k~!0nP!k!l!0q~!0tP#b#c!0w~!0zP#g#h!0}~!1QP#h#i!1T~!1WP#f#g!1Z~!1^P#i#j!1a~!1dP#V#W!1g~!1jP#h#i!1m~!1pP#]#^!1s~!1vP#c#d!1y~!1|P#b#c!2P~!2UO!q~~!2XP#X#Y!2[~!2_P#f#g!2b~!2eP#h#i!2h~!2kP#m#n!2n~!2qP!p!q!2t~!2wP#T#U!2z~!2}P#a#b!3Q~!3TP#X#Y!3W~!3]OY~~!3`P#b#c!3c~!3fP#V#W!3i~!3lP#h#i!3o~!3rP#i#j!3u~!3xP#T#U!3{~!4OP#h#i!4R~!4UP#]#^!4X~!4[P#c#d!4_~!4bP#b#c!4e~!4jO!R~~!4mP#i#j!4p~!4sP#c#d!4v~!4yP#h#i!4|~!5PP#X#Y!5S~!5XO!d~~!5[P#X#Y!5_~!5bP#Z#[!5e~!5hP#X#Y!5k~!5nP#l#m!5q~!5tP#d#e!5w~!5|Oi~~!6PS#X#Y!6]#d#e!7l#e#f!9P#h#i!:j~!6`Q#`#a!6f#d#e!6q~!6iP#Y#Z!6l~!6qOn~~!6tP#T#U!6w~!6zP#f#g!6}~!7QP#T#U!7T~!7WP#h#i!7Z~!7^P#c#d!7a~!7dP#f#g!7g~!7lO!S~~!7oP#X#Y!7r~!7uP#V#W!7x~!7{P#]#^!8O~!8RP#T#U!8U~!8XP#`#a!8[~!8_Pxy!8b~!8eP#h#i!8h~!8kP#T#U!8n~!8qP#Z#[!8t~!8wPyz!8z~!9PO!w~~!9SP#i#j!9V~!9YP#T#U!9]~!9`P#f#g!9c~!9fP#X#Y!9i~!9lP!d!e!9o~!9rP#f#g!9u~!9xP#T#U!9{~!:OP#V#W!:R~!:UP#_#`!:X~!:[P#X#Y!:_~!:bP#h#i!:e~!:jO!V~~!:mQ#T#U!:s#f#g!PP#b#c!>S~!>VP#Z#[!>Y~!>_O!f~~!>bQ#T#U!>h#m#n!?]~!>kP#Z#[!>n~!>qP!p!q!>t~!>wP#T#U!>z~!>}P#a#b!?Q~!?TP#X#Y!?W~!?]OX~~!?`P#d#e!?c~!?fP#X#Y!?i~!?lQ!p!q!?r!q!r!@Z~!?uP#T#U!?x~!?{P#a#b!@O~!@RP#X#Y!@U~!@ZOW~~!@^P#d#e!@a~!@dP#X#Y!@g~!@jP#f#g!@m~!@pP#T#U!@s~!@vP#h#i!@y~!@|P#c#d!AP~!ASP#f#g!AV~!A[O!P~~!A_R#b#c!Ah#d#e!Ay#f#g!Cj~!AkP#]#^!An~!AqP#h#i!At~!AyOq~~!A|P#W#X!BP~!BSP#T#U!BV~!BYP#h#i!B]~!B`P#X#Y!Bc~!BfP!q!r!Bi~!BlP#d#e!Bo~!BrP#X#Y!Bu~!BxP#f#g!B{~!COP#T#U!CR~!CUP#h#i!CX~!C[P#c#d!C_~!CbP#f#g!Ce~!CjO}~~!CmP#`#a!Cp~!CuOl~~!CxP#T#U!C{~!DOP#f#g!DR~!DUP#]#^!DX~!D[P#T#U!D_~!DbP#U#V!De~!DhP#`#a!Dk~!DnP#X#Y!Dq~!DtP!p!q!Dw~!DzP#T#U!D}~!EQP#a#b!ET~!EWP#X#Y!EZ~!E`OV~",
+  tokenizers: [0],
+  topRules: {"Program":[0,1]},
+  tokenPrec: 0
+})
diff --git a/cm-lang-rockstar/src/grammars/kitchen-sink.terms.js b/cm-lang-rockstar/src/grammars/kitchen-sink.terms.js
new file mode 100644
index 00000000..39fd1a72
--- /dev/null
+++ b/cm-lang-rockstar/src/grammars/kitchen-sink.terms.js
@@ -0,0 +1,87 @@
+// This file was generated by lezer-generator. You probably shouldn't edit it.
+export const
+  Program = 1,
+  Comment = 2,
+  LineComment = 3,
+  BlockComment = 4,
+  DocComment = 5,
+  Name = 6,
+  VariableName = 7,
+  TypeName = 8,
+  TagName = 9,
+  PropertyName = 10,
+  AttributeName = 11,
+  ClassName = 12,
+  LabelName = 13,
+  Namespace = 14,
+  MacroName = 15,
+  Literal = 16,
+  String = 17,
+  DocString = 18,
+  Character = 19,
+  AttributeValue = 20,
+  Number = 21,
+  Integer = 22,
+  Float = 23,
+  Bool = 24,
+  Regexp = 25,
+  Escape = 26,
+  Color = 27,
+  Url = 28,
+  Keyword = 29,
+  Self = 30,
+  Null = 31,
+  Atom = 32,
+  Unit = 33,
+  Modifier = 34,
+  OperatorKeyword = 35,
+  ControlKeyword = 36,
+  DefinitionKeyword = 37,
+  ModuleKeyword = 38,
+  Operator = 39,
+  DerefOperator = 40,
+  ArithmeticOperator = 41,
+  LogicOperator = 42,
+  BitwiseOperator = 43,
+  CompareOperator = 44,
+  UpdateOperator = 45,
+  DefinitionOperator = 46,
+  TypeOperator = 47,
+  ControlOperator = 48,
+  Punctuation = 49,
+  Separator = 50,
+  Bracket = 51,
+  AngleBracket = 52,
+  SquareBracket = 53,
+  Paren = 54,
+  Brace = 55,
+  Content = 56,
+  Heading = 57,
+  Heading1 = 58,
+  Heading2 = 59,
+  Heading3 = 60,
+  Heading4 = 61,
+  Heading5 = 62,
+  Heading6 = 63,
+  ContentSeparator = 64,
+  List = 65,
+  Quote = 66,
+  Emphasis = 67,
+  Strong = 68,
+  Link = 69,
+  Monospace = 70,
+  Strikethrough = 71,
+  Inserted = 72,
+  Deleted = 73,
+  Changed = 74,
+  Invalid = 75,
+  Meta = 76,
+  DocumentMeta = 77,
+  Annotation = 78,
+  ProcessingInstruction = 79,
+  Definition = 80,
+  Constant = 81,
+  Function = 82,
+  Standard = 83,
+  Local = 84,
+  Special = 85
diff --git a/cm-lang-rockstar/src/grammars/rockstar-highlight.js b/cm-lang-rockstar/src/grammars/rockstar-highlight.js
new file mode 100644
index 00000000..f8615ad0
--- /dev/null
+++ b/cm-lang-rockstar/src/grammars/rockstar-highlight.js
@@ -0,0 +1,183 @@
+import { styleTags, tags } from "@lezer/highlight"
+
+export const highlighting = styleTags({
+	ProperVariable: tags.variableName,
+	CommonVariable: tags.variableName,
+	SimpleVariable: tags.variableName,
+	Pronoun: tags.variableName,
+	Number: tags.number,
+	PoeticString: tags.string,
+	PoeticNumber: tags.number,
+	String: tags.string,
+	Comment: tags.comment,
+	LineComment: tags.lineComment,
+	BlockComment: tags.blockComment,
+	ArithmeticOperator: tags.arithmeticOperator,
+	LogicOperator: tags.logicOperator,
+	CompareOperator: tags.compareOperator,
+	VLS: tags.separator,
+	XLS: tags.separator,
+	ALS: tags.separator,
+	Comma: tags.separator,
+	Nacton: tags.separator,
+	Ampersand: tags.separator,
+	OxfordComma: tags.separator,
+	Wildcard: tags.lineComment,
+	End: tags.controlKeyword,
+	EOB: tags.controlKeyword,
+	EOS: tags.controlKeyword,
+
+	Above: tags.compareOperator,
+	And: tags.logicOperator,
+	Around: tags.keyword,
+	As: tags.keyword,
+	AsGreat: tags.compareOperator,
+	AsSmall: tags.compareOperator,
+	At: tags.keyword,
+	Back: tags.controlKeyword,
+	Be: tags.keyword,
+	Break: tags.controlKeyword,
+	Build: tags.keyword,
+	Call: tags.keyword,
+	Cast: tags.keyword,
+	Continue: tags.controlKeyword,
+	Debug: tags.keyword,
+	Divided: tags.arithmeticOperator,
+	Down: tags.keyword,
+	Else: tags.controlKeyword,
+	Empty: tags.literal,
+	End: tags.keyword,
+	Exactly: tags.compareOperator,
+	False: tags.bool,
+	//His: tags.keyword,
+	If: tags.controlKeyword,
+	Into: tags.keyword,
+	Is: tags.compareOperator,
+	Isnt: tags.compareOperator,
+	Join: tags.keyword,
+	Knock: tags.keyword,
+	Less: tags.compareOperator,
+	Let: tags.keyword,
+	Like: tags.keyword,
+	Listen: tags.keyword,
+	Minus: tags.arithmeticOperator,
+	More: tags.compareOperator,
+	Mysterious: tags.null,
+	Non: tags.logicOperator,
+	Nor: tags.logicOperator,
+	Not: tags.logicOperator,
+	Now: tags.keyword,
+	Null: tags.null,
+	Or: tags.logicOperator,
+	Over: tags.arithmeticOperator,
+	Plus: tags.arithmeticOperator,
+	Pop: tags.keyword,
+	Print: tags.keyword,
+	// Pronoun: tags.keyword,
+	Push: tags.keyword,
+	Put: tags.keyword,
+	Return: tags.controlKeyword,
+	Says: tags.keyword,
+	Split: tags.keyword,
+	Takes: tags.keyword,
+	Taking: tags.keyword,
+	Than: tags.compareOperator,
+	// The: tags.keyword,
+	Then: tags.controlKeyword,
+	Times: tags.arithmeticOperator,
+	To: tags.keyword,
+	True: tags.bool,
+	Turn: tags.keyword,
+	Under: tags.keyword,
+	Until: tags.controlKeyword,
+	Up: tags.keyword,
+	Using: tags.keyword,
+	While: tags.controlKeyword,
+	With: tags.keyword,
+	Write: tags.keyword
+
+	// DocComment: tags.docComment,
+	// Name: tags.name,
+	// VariableName: tags.variableName,
+	// TypeName: tags.typeName,
+	// TagName: tags.tagName,
+	// PropertyName: tags.propertyName,
+	// AttributeName: tags.attributeName,
+	// ClassName: tags.className,
+	// LabelName: tags.labelName,
+	// Namespace: tags.namespace,
+	// MacroName: tags.macroName,
+	// Literal: tags.literal,
+	// String: tags.string,
+	// DocString: tags.docString,
+	// Character: tags.character,
+	// AttributeValue: tags.attributeValue,
+	// Number: tags.number,
+	// Integer: tags.integer,
+	// Float: tags.float,
+	// Bool: tags.bool,
+	// Regexp: tags.regexp,
+	// Escape: tags.escape,
+	// Color: tags.color,
+	// Url: tags.url,
+	// Keyword: tags.keyword,
+	// Self: tags.self,
+	// Null: tags.null,
+	// Atom: tags.atom,
+	// Unit: tags.unit,
+	// Modifier: tags.modifier,
+	// OperatorKeyword: tags.operatorKeyword,
+	// ControlKeyword: tags.controlKeyword,
+	// DefinitionKeyword: tags.definitionKeyword,
+	// ModuleKeyword: tags.moduleKeyword,
+	// Operator: tags.operator,
+	// DerefOperator: tags.derefOperator,
+	// ArithmeticOperator: tags.arithmeticOperator,
+	// LogicOperator: tags.logicOperator,
+	// BitwiseOperator: tags.bitwiseOperator,
+	// CompareOperator: tags.compareOperator,
+	// UpdateOperator: tags.updateOperator,
+	// DefinitionOperator: tags.definitionOperator,
+	// TypeOperator: tags.typeOperator,
+	// ControlOperator: tags.controlOperator,
+	// Punctuation: tags.punctuation,
+	// Separator: tags.separator,
+	// Bracket: tags.bracket,
+	// AngleBracket: tags.angleBracket,
+	// SquareBracket: tags.squareBracket,
+	// Paren: tags.paren,
+	// Brace: tags.brace,
+	// Content: tags.content,
+	// Heading: tags.heading,
+	// Heading1: tags.heading1,
+	// Heading2: tags.heading2,
+	// Heading3: tags.heading3,
+	// Heading4: tags.heading4,
+	// Heading5: tags.heading5,
+	// Heading6: tags.heading6,
+	// ContentSeparator: tags.contentSeparator,
+	// List: tags.list,
+	// Quote: tags.quote,
+	// Emphasis: tags.emphasis,
+	// Strong: tags.strong,
+	// Link: tags.link,
+	// Monospace: tags.monospace,
+	// Strikethrough: tags.strikethrough,
+	// Inserted: tags.inserted,
+	// Deleted: tags.deleted,
+	// Changed: tags.changed,
+	// Invalid: tags.invalid,
+	// Meta: tags.meta,
+	// DocumentMeta: tags.documentMeta,
+	// Annotation: tags.annotation,
+	// ProcessingInstruction: tags.processingInstruction,
+
+	// // Tags from here on down are modifiers and must wrap another tag
+	// // https://lezer.codemirror.net/docs/ref/#highlight.tags.definition
+	// Definition: tags.definition(tags.name),
+	// Constant: tags.constant(tags.name),
+	// Function: tags.function(tags.name),
+	// Standard: tags.standard(tags.name),
+	// Local: tags.local(tags.name),
+	// Special: tags.special(tags.name)
+});
\ No newline at end of file
diff --git a/cm-lang-rockstar/src/grammars/rockstar.grammar b/cm-lang-rockstar/src/grammars/rockstar.grammar
new file mode 100644
index 00000000..e780efcf
--- /dev/null
+++ b/cm-lang-rockstar/src/grammars/rockstar.grammar
@@ -0,0 +1,153 @@
+@external propSource highlighting from "./rockstar-highlight.js"
+
+@top Program {
+	Block (EOB+ Block)* EOF
+	| EOF
+}
+
+Block {
+	Statement (EOS* Statement)* EOB
+	| Statement EOF
+}
+
+@skip { Whitespace | Comment }
+
+Comment { LineComment | BlockComment }
+
+Statement {
+ 	ListenStatement
+ 	| OutputStatement
+// 	| Function
+// 	| FunctionCall
+// 	| CallStatement
+ 	| ReturnStatement
+ 	| BreakStatement
+ 	| ContinueStatement
+ 	| LoopStatement
+// 	//| ConditionalStatement
+// 	// | DeclarationStatement
+ 	| Assignment
+// 	// | Enlistment
+// 	// | Increment
+// 	// | Decrement
+// 	// | Mutation
+// 	// | Rounding
+	 Expression
+}
+
+// @precedence { VLS, XLS, ALS, Wildcard, Whitespace, EOS, EOB, And }
+
+Body { EOS+ Block | Statement }
+
+// Alternate { EOS+ Else Body | Else Body }
+
+// // ConditionalStatement {
+// // 	"if" Expression "then" Body "else" Body "end"
+// // 	//If Expression Then? Body Alternate
+// // 	//| If Expression Else Alternate
+// // 	//| If Expression Then? Body
+// // }
+
+ LoopStatement {
+ 	While Expression Body
+	| Until Expression Body
+ }
+
+ContinueStatement { Continue Wildcard }
+
+BreakStatement { Break Wildcard }
+
+ReturnStatement { Return Back? Expression  }
+
+// Function {
+// 	variable Takes variableList Body
+// }
+
+ CallStatement {
+ 	Call variable With argumentList Into assignable
+ 	| Call variable With argumentList
+ 	| Call variable Into assignable
+ 	| Call variable
+}
+
+FunctionCall {
+ 	variable Taking argumentList
+}
+
+argumentList { Primary ALS argumentList | Primary }
+
+variableList { variable VLS variableList | variable | Null }
+
+Assignment {
+	Put Expression Into assignable |
+	variable Says PoeticString |
+	variable Is Operator Expression |
+	variable Is Now Expression |
+	variable Is PoeticNumber
+	variable Is Expression
+}
+
+ListenStatement { Listen To assignable }
+OutputStatement { Print Expression }
+// Boolean { True | False }
+
+Expression {  Binary }
+
+Binary { Primary Operator Binary }
+
+Operator { LogicOperator | ArithmeticOperator | CompareOperator }
+
+Primary {
+ 	String | Number | Lookup | Constant
+// 	//| constant | function_call | delist
+}
+
+Constant { True | False | Empty | Null | Mysterious }
+
+Indexer { At Expression }
+
+assignable { variable Indexer* }
+
+Lookup { variable Indexer* } // (At index)* }
+
+variable { ProperVariable | CommonVariable | SimpleVariable | Pronoun }
+
+@external tokens Variables from "../tokenizers/rockstar-tokenizer" { ProperVariable, CommonVariable, SimpleVariable, Pronoun }
+@external tokens Operators from "../tokenizers/rockstar-tokenizer" { LogicOperator, CompareOperator, ArithmeticOperator }
+@external tokens PoeticNumber from "../tokenizers/rockstar-tokenizer" { PoeticNumber }
+@external tokens PoeticString from "../tokenizers/rockstar-tokenizer" { PoeticString }
+@external tokens EOB from "../tokenizers/rockstar-tokenizer" { EOB }
+@external tokens EOS from "../tokenizers/rockstar-tokenizer" { EOS }
+@external tokens Wildcard from "../tokenizers/rockstar-tokenizer" { Wildcard }
+
+@external tokens Keywords from "../tokenizers/rockstar-tokenizer" {
+	Above, And, Around, As, At, Back, Be, Break, Build, Call, Cast,
+	Continue, Debug, Divided, Down, Else, Empty, End, Exactly, False,
+	Great, His, If, Into, Is, Isnt, Join, Knock, Less, Let, Like,
+	Listen, Minus, More, Mysterious, Non, Nor, Not, Now, Null, Or, Over,
+	Plus,  Pop, Print, Push, Put, Return, Says, Small, Split, Takes,
+	Taking, Than, The, Then, Times, To, True, Turn, Under, Until, Up,
+	Using, While, With, Write
+}
+
+ALS { OxfordComma | XLS }
+VLS { and | XLS }
+XLS { Comma Ampersand? | Nacton | Ampersand | Comma }
+
+@tokens {
+	OxfordComma { ", " and }
+	Ampersand { "&" }
+	Comma { "," }
+ 	trailing_punctuation { (Comma | $[.?!;: \t])* }
+	and { "AND" | "ANd" | "AnD" | "And" | "aND" | "aNd" | "anD" | "and" }
+ 	Nacton { "n'" | "'n'" }
+ 	EOL { $[\r]? "\n" }
+ 	LineComment { "#" ![\n]* "\n" }
+ 	String { '"' (!["\\] | "\\" _)* '"' }
+ 	Number { (@digit+ "." | ".")? @digit+ }
+ 	BlockComment { "(" ![\)]* ")" | "{" ![\}]* "}" | "[" ![\]]* "]" }
+ 	Whitespace { $[ \r\n\t]+ }
+ 	EOF { @eof }
+}
+
+@detectDelim
diff --git a/cm-lang-rockstar/src/grammars/rockstar.grammar.d.ts b/cm-lang-rockstar/src/grammars/rockstar.grammar.d.ts
new file mode 100644
index 00000000..38f49b47
--- /dev/null
+++ b/cm-lang-rockstar/src/grammars/rockstar.grammar.d.ts
@@ -0,0 +1,3 @@
+import {LRParser} from "@lezer/lr"
+
+export declare const parser: LRParser
diff --git a/cm-lang-rockstar/src/grammars/rockstar.js b/cm-lang-rockstar/src/grammars/rockstar.js
new file mode 100644
index 00000000..a1d055ae
--- /dev/null
+++ b/cm-lang-rockstar/src/grammars/rockstar.js
@@ -0,0 +1,19 @@
+// This file was generated by lezer-generator. You probably shouldn't edit it.
+import {LRParser} from "@lezer/lr"
+import {Variables, Operators, PoeticNumber, PoeticString, EOB, EOS, Wildcard, Keywords} from "../tokenizers/rockstar-tokenizer"
+import {highlighting} from "./rockstar-highlight.js"
+export const parser = LRParser.deserialize({
+  version: 14,
+  states: "*hO!TQ)aOOP![O&jOOOOQ$y'#Eq'#EqO!dQ)`O'#EVO!iQ)aO'#EaO#^Q)aO'#EbO#eQ'|O'#EcO#jQ'|O'#EdO!iQ)aO'#EeO!iQ)aO'#EgO#oQ)`O'#EgOOQ$w'#EU'#EUO!iQ)aO'#EUO#wQ*cO'#ETO$UQ&zOOQOQ&jOOPOOO'#EP'#EPPOOO)C@e)C@eO$^Q&kO,5:qO$lQ)bO'#E^OOQQ'#E_'#E_OOQQ'#EZ'#EZO$zQ&lO'#EYOOQ$y'#EX'#EXOOQ$w,5:{,5:{OOQ$w,5:|,5:|O!iQ)aO,5:|OOQ$w,5:},5:}OOQ$w,5;O,5;OO%VQ*RO,5;PO%^Q)`O,5;RO%cQ&rO,5;RO%hQ)fO,5;ROOQ$w,5:p,5:pOOQ$g'#Ej'#EjO%VQ*RO'#EkOOQ$w'#Ek'#EkO%yQ*cO,5:oOOQ$w,5:o,5:oOOQ$V'#Em'#EmO&TQ)qO'#ElO$UQ&zOOO&[Q*cO'#EpOOQ$w1G0]1G0]O'uQ)bO,5:xO!iQ)aO'#EWOOQ$y'#Ei'#EiOOQ#u'#E`'#E`O!iQ)aO,5:tOOQ$w1G0h1G0hO%VQ*RO'#EfOOQ$w'#Ef'#EfOOQ$w1G0k1G0kO$^Q&kO1G0mOOQ#u1G0m1G0mO!iQ)aO1G0mO$^Q&kO1G0mOOQ$g-E8h-E8hOOQ$w,5;V,5;VOOQ$w-E8i-E8iOOQ$w1G0Z1G0ZOOQ$V-E8k-E8kOOQ`,5;W,5;WOOQ`-E8j-E8jO(TQ*cO,5;[OOQ$y-E8g-E8gOOQ$y,5:r,5:rOOQ$y1G0`1G0`OOQ$w,5;Q,5;QOOQ#u7+&X7+&XO)nQ)`O7+&XO!iQ)aO< 255) {
+			red = ZERO;
+			green += BUMP;
+			if (green > 255) {
+				green = ZERO;
+				blue += BUMP;
+				if (blue > 255) blue = ZERO;
+			}
+		}
+	}
+	return result;
+}
diff --git a/cm-lang-rockstar/src/themes/clouds.ts b/cm-lang-rockstar/src/themes/clouds.ts
new file mode 100644
index 00000000..4255683c
--- /dev/null
+++ b/cm-lang-rockstar/src/themes/clouds.ts
@@ -0,0 +1,46 @@
+import {tags as t} from '@lezer/highlight';
+import createTheme from '../create-theme.js';
+
+// Author: Fred LeBlanc
+export const clouds = createTheme({
+	variant: 'light',
+	settings: {
+		background: '#fff',
+		foreground: '#000',
+		caret: '#000',
+		selection: '#BDD5FC',
+		gutterBackground: '#fff',
+		gutterForeground: '#00000070',
+		lineHighlight: '#FFFBD1',
+	},
+	styles: [
+		{
+			tag: t.comment,
+			color: '#BCC8BA',
+		},
+		{
+			tag: [t.string, t.special(t.brace), t.regexp],
+			color: '#5D90CD',
+		},
+		{
+			tag: [t.number, t.bool, t.null],
+			color: '#46A609',
+		},
+		{
+			tag: t.keyword,
+			color: '#AF956F',
+		},
+		{
+			tag: [t.definitionKeyword, t.modifier],
+			color: '#C52727',
+		},
+		{
+			tag: [t.angleBracket, t.tagName, t.attributeName],
+			color: '#606060',
+		},
+		{
+			tag: t.self,
+			color: '#000',
+		},
+	],
+});
diff --git a/cm-lang-rockstar/src/themes/cobalt.ts b/cm-lang-rockstar/src/themes/cobalt.ts
new file mode 100644
index 00000000..657f6723
--- /dev/null
+++ b/cm-lang-rockstar/src/themes/cobalt.ts
@@ -0,0 +1,76 @@
+import {tags as t} from '@lezer/highlight';
+import createTheme from '../create-theme';
+
+// Author: Jacob Rus
+export const cobalt = createTheme({
+	variant: 'dark',
+	settings: {
+		background: '#00254b',
+		foreground: '#FFFFFF',
+		caret: '#FFFFFF',
+		selection: '#B36539BF',
+		gutterBackground: '#00254b',
+		gutterForeground: '#FFFFFF70',
+		lineHighlight: '#00000059',
+	},
+	styles: [
+		{
+			tag: t.comment,
+			color: '#0088FF',
+		},
+		{
+			tag: t.string,
+			color: '#3AD900',
+		},
+		{
+			tag: t.regexp,
+			color: '#80FFC2',
+		},
+		{
+			tag: [t.number, t.bool, t.null],
+			color: '#FF628C',
+		},
+		{
+			tag: [t.definitionKeyword, t.modifier],
+			color: '#FFEE80',
+		},
+		{
+			tag: t.variableName,
+			color: '#CCCCCC',
+		},
+		{
+			tag: t.self,
+			color: '#FF80E1',
+		},
+		{
+			tag: [
+				t.className,
+				t.definition(t.propertyName),
+				t.function(t.variableName),
+				t.definition(t.typeName),
+				t.labelName,
+			],
+			color: '#FFDD00',
+		},
+		{
+			tag: [t.keyword, t.operator],
+			color: '#FF9D00',
+		},
+		{
+			tag: [t.propertyName, t.typeName],
+			color: '#80FFBB',
+		},
+		{
+			tag: t.special(t.brace),
+			color: '#EDEF7D',
+		},
+		{
+			tag: t.attributeName,
+			color: '#9EFFFF',
+		},
+		{
+			tag: t.derefOperator,
+			color: '#fff',
+		},
+	],
+});
diff --git a/cm-lang-rockstar/src/themes/cool-glow.ts b/cm-lang-rockstar/src/themes/cool-glow.ts
new file mode 100644
index 00000000..da0f5734
--- /dev/null
+++ b/cm-lang-rockstar/src/themes/cool-glow.ts
@@ -0,0 +1,64 @@
+import {tags as t} from '@lezer/highlight';
+import createTheme from '../create-theme.js';
+
+// Author: unknown
+export const coolGlow = createTheme({
+	variant: 'dark',
+	settings: {
+		background: '#060521',
+		foreground: '#E0E0E0',
+		caret: '#FFFFFFA6',
+		selection: '#122BBB',
+		gutterBackground: '#060521',
+		gutterForeground: '#E0E0E090',
+		lineHighlight: '#FFFFFF0F',
+	},
+	styles: [
+		{
+			tag: t.comment,
+			color: '#AEAEAE',
+		},
+		{
+			tag: [t.string, t.special(t.brace), t.regexp],
+			color: '#8DFF8E',
+		},
+		{
+			tag: [
+				t.className,
+				t.definition(t.propertyName),
+				t.function(t.variableName),
+				t.function(t.definition(t.variableName)),
+				t.definition(t.typeName),
+			],
+			color: '#A3EBFF',
+		},
+		{
+			tag: [t.number, t.bool, t.null],
+			color: '#62E9BD',
+		},
+		{
+			tag: [t.keyword, t.operator],
+			color: '#2BF1DC',
+		},
+		{
+			tag: [t.definitionKeyword, t.modifier],
+			color: '#F8FBB1',
+		},
+		{
+			tag: [t.variableName, t.self],
+			color: '#B683CA',
+		},
+		{
+			tag: [t.angleBracket, t.tagName, t.typeName, t.propertyName],
+			color: '#60A4F1',
+		},
+		{
+			tag: t.derefOperator,
+			color: '#E0E0E0',
+		},
+		{
+			tag: t.attributeName,
+			color: '#7BACCA',
+		},
+	],
+});
diff --git a/cm-lang-rockstar/src/themes/deep-purple.ts b/cm-lang-rockstar/src/themes/deep-purple.ts
new file mode 100644
index 00000000..f461d6bb
--- /dev/null
+++ b/cm-lang-rockstar/src/themes/deep-purple.ts
@@ -0,0 +1,64 @@
+import { tags as t } from '@lezer/highlight';
+import createTheme from '../create-theme.js';
+
+// Author: unknown
+export const deepPurple = createTheme({
+	variant: 'dark',
+	settings: {
+		background: '#070010',
+		foreground: '#ffffff',
+		caret: '#6633a9',
+		selection: '#6633a9',
+		gutterBackground: '#070010',
+		gutterForeground: '#6633a9',
+		lineHighlight: '#FFFFFF0F',
+	},
+	styles: [
+		{
+			tag: t.comment,
+			color: '#944af5',
+		},
+		{
+			tag: [t.string, t.special(t.brace), t.regexp],
+			color: '#eb1d00',
+		},
+		{
+			tag: [
+				t.className,
+				t.definition(t.propertyName),
+				t.function(t.variableName),
+				t.function(t.definition(t.variableName)),
+				t.definition(t.typeName),
+			],
+			color: '#ff9c04',
+		},
+		{
+			tag: [t.number, t.bool, t.null],
+			color: '#ff00a8',
+		},
+		{
+			tag: [t.keyword, t.operator],
+			color: '#ffcd02',
+		},
+		{
+			tag: [t.definitionKeyword, t.modifier],
+			color: '#F8FBB1',
+		},
+		{
+			tag: [t.variableName, t.self],
+			color: '#00bcff',
+		},
+		{
+			tag: [t.angleBracket, t.tagName, t.typeName, t.propertyName],
+			color: '#ff0ddf',
+		},
+		{
+			tag: t.derefOperator,
+			color: '#E0E0E0',
+		},
+		{
+			tag: t.attributeName,
+			color: '#1e82c0',
+		},
+	],
+});
diff --git a/cm-lang-rockstar/src/themes/dracula.ts b/cm-lang-rockstar/src/themes/dracula.ts
new file mode 100644
index 00000000..460ab5b8
--- /dev/null
+++ b/cm-lang-rockstar/src/themes/dracula.ts
@@ -0,0 +1,51 @@
+import {tags as t} from '@lezer/highlight';
+import createTheme from '../create-theme';
+
+// Author: Zeno Rocha
+export const dracula = createTheme({
+	variant: 'dark',
+	settings: {
+		background: '#2d2f3f',
+		foreground: '#f8f8f2',
+		caret: '#f8f8f0',
+		selection: '#44475a',
+		gutterBackground: '#282a36',
+		gutterForeground: 'rgb(144, 145, 148)',
+		lineHighlight: '#44475a',
+	},
+	styles: [
+		{
+			tag: t.comment,
+			color: '#6272a4',
+		},
+		{
+			tag: [t.string, t.special(t.brace)],
+			color: '#f1fa8c',
+		},
+		{
+			tag: [t.number, t.self, t.bool, t.null],
+			color: '#bd93f9',
+		},
+		{
+			tag: [t.keyword, t.operator],
+			color: '#ff79c6',
+		},
+		{
+			tag: [t.definitionKeyword, t.typeName],
+			color: '#8be9fd',
+		},
+		{
+			tag: t.definition(t.typeName),
+			color: '#f8f8f2',
+		},
+		{
+			tag: [
+				t.className,
+				t.definition(t.propertyName),
+				t.function(t.variableName),
+				t.attributeName,
+			],
+			color: '#50fa7b',
+		},
+	],
+});
\ No newline at end of file
diff --git a/cm-lang-rockstar/src/themes/espresso.ts b/cm-lang-rockstar/src/themes/espresso.ts
new file mode 100644
index 00000000..3aef88b2
--- /dev/null
+++ b/cm-lang-rockstar/src/themes/espresso.ts
@@ -0,0 +1,44 @@
+import {tags as t} from '@lezer/highlight';
+import createTheme from '../create-theme';
+
+// Author: TextMate
+export const espresso = createTheme({
+	variant: 'light',
+	settings: {
+		background: '#FFFFFF',
+		foreground: '#000000',
+		caret: '#000000',
+		selection: '#80C7FF',
+		gutterBackground: '#FFFFFF',
+		gutterForeground: '#00000070',
+		lineHighlight: '#C1E2F8',
+	},
+	styles: [
+		{
+			tag: t.comment,
+			color: '#AAAAAA',
+		},
+		{
+			tag: [t.keyword, t.operator, t.typeName, t.tagName, t.propertyName],
+			color: '#2F6F9F',
+			fontWeight: 'bold',
+		},
+		{
+			tag: [t.attributeName, t.definition(t.propertyName)],
+			color: '#4F9FD0',
+		},
+		{
+			tag: [t.className, t.string, t.special(t.brace)],
+			color: '#CF4F5F',
+		},
+		{
+			tag: t.number,
+			color: '#CF4F5F',
+			fontWeight: 'bold',
+		},
+		{
+			tag: t.variableName,
+			fontWeight: 'bold',
+		},
+	],
+});
diff --git a/cm-lang-rockstar/src/themes/kitchen-sink.ts b/cm-lang-rockstar/src/themes/kitchen-sink.ts
new file mode 100644
index 00000000..3d23eb3a
--- /dev/null
+++ b/cm-lang-rockstar/src/themes/kitchen-sink.ts
@@ -0,0 +1,34 @@
+import { tags as t } from '@lezer/highlight';
+import createTheme from '../create-theme';
+export const kitchenSink = createTheme({
+	variant: 'dark',
+	settings: {
+		background: '#000000',
+		foreground: '#ffffff',
+		caret: '#ff00ff',
+		selection: '#0000ff',
+		gutterBackground: '#006666',
+		gutterForeground: 'rgb(50, 90, 150)',
+		lineHighlight: '#111111',
+	},
+	styles: makeStyles()
+});
+
+function makeStyles() {
+	// Every tag listed at https://lezer.codemirror.net/docs/ref/#highlight.tags
+	var tags = [t.comment, t.lineComment, t.blockComment, t.docComment, t.name, t.variableName, t.typeName, t.tagName, t.propertyName,
+	t.attributeName, t.className, t.labelName, t.namespace, t.macroName, t.literal, t.string, t.docString, t.character, t.attributeValue,
+	t.number, t.integer, t.float, t.bool, t.regexp, t.escape, t.color, t.url, t.keyword, t.self, t.null, t.atom, t.unit, t.modifier,
+	t.operatorKeyword, t.controlKeyword, t.definitionKeyword, t.moduleKeyword, t.operator, t.derefOperator, t.arithmeticOperator,
+	t.logicOperator, t.bitwiseOperator, t.compareOperator, t.updateOperator, t.definitionOperator, t.typeOperator, t.controlOperator,
+	t.punctuation, t.separator, t.bracket, t.angleBracket, t.squareBracket, t.paren, t.brace, t.content, t.heading,
+	t.heading1, t.heading2, t.heading3, t.heading4, t.heading5, t.heading6, t.contentSeparator, t.list, t.quote, t.emphasis, t.strong,
+	t.link, t.monospace, t.strikethrough, t.inserted, t.deleted, t.changed, t.invalid, t.meta, t.documentMeta, t.annotation, t.processingInstruction,
+	t.definition(t.name), t.constant(t.name), t.function(t.name), t.standard(t.name), t.local(t.name), t.special(t.name)
+	];
+	var result = [];
+	for (var i = 0; i < tags.length; i++) {
+		result.push({ tag: tags[i], color: `hsl(${i * 19} 100 50)`});
+	}
+	return result;
+}
diff --git a/cm-lang-rockstar/src/themes/solarized-light.ts b/cm-lang-rockstar/src/themes/solarized-light.ts
new file mode 100644
index 00000000..574b58a4
--- /dev/null
+++ b/cm-lang-rockstar/src/themes/solarized-light.ts
@@ -0,0 +1,76 @@
+import {tags as t} from '@lezer/highlight';
+import createTheme from '../create-theme';
+
+// Author: Ethan Schoonover
+export const solarizedLight = createTheme({
+	variant: 'light',
+	settings: {
+		background: '#fef7e5',
+		foreground: '#586E75',
+		caret: '#000000',
+		selection: '#073642',
+		gutterBackground: '#fef7e5',
+		gutterForeground: '#586E7580',
+		lineHighlight: '#EEE8D5',
+	},
+	styles: [
+		{
+			tag: t.comment,
+			color: '#93A1A1',
+		},
+		{
+			tag: t.string,
+			color: '#2AA198',
+		},
+		{
+			tag: t.regexp,
+			color: '#D30102',
+		},
+		{
+			tag: t.number,
+			color: '#D33682',
+		},
+		{
+			tag: t.variableName,
+			color: '#268BD2',
+		},
+		{
+			tag: [t.keyword, t.operator, t.punctuation],
+			color: '#859900',
+		},
+		{
+			tag: [t.definitionKeyword, t.modifier],
+			color: '#073642',
+			fontWeight: 'bold',
+		},
+		{
+			tag: [t.className, t.self, t.definition(t.propertyName)],
+			color: '#268BD2',
+		},
+		{
+			tag: t.function(t.variableName),
+			color: '#268BD2',
+		},
+		{
+			tag: [t.bool, t.null],
+			color: '#B58900',
+		},
+		{
+			tag: t.tagName,
+			color: '#268BD2',
+			fontWeight: 'bold',
+		},
+		{
+			tag: t.angleBracket,
+			color: '#93A1A1',
+		},
+		{
+			tag: t.attributeName,
+			color: '#93A1A1',
+		},
+		{
+			tag: t.typeName,
+			color: '#859900',
+		},
+	],
+});
diff --git a/cm-lang-rockstar/src/tokenizers/ascii.js b/cm-lang-rockstar/src/tokenizers/ascii.js
new file mode 100644
index 00000000..e52aa0ed
--- /dev/null
+++ b/cm-lang-rockstar/src/tokenizers/ascii.js
@@ -0,0 +1,121 @@
+export const ASCII = {
+	NUL: 0,
+	SOH: 1,
+	STX: 2,
+	ETX: 3,
+	EOT: 4,
+	ENQ: 5,
+	ACK: 6,
+	BEL: 7,
+	BS: 8,
+	HT: 9,
+	LF: 10,
+	VT: 11,
+	FF: 12,
+	CR: 13,
+	SO: 14,
+	SI: 15,
+	DLE: 16,
+	DC1: 17,
+	DC2: 18,
+	DC3: 19,
+	DC4: 20,
+	NAK: 21,
+	SYN: 22,
+	ETB: 23,
+	Space: 32, // U+0020
+	ExclamationMark: 33, // U+0021 !
+	QuotationMark: 34, // U+0022 "
+	Hash: 35, // U+0023 #
+	DollarSign: 36, // U+0024 $
+	PercentSign: 37, // U+0025 %
+	Ampersand: 38, // U+0026 &
+	Apostrophe: 39, // U+0027 '
+	LeftParenthesis: 40, // U+0028 (
+	RightParenthesis: 41, // U+0029 )
+	Asterisk: 42, // U+002A *
+	PlusSign: 43, // U+002B +
+	Comma: 44, // U+002C ,
+	Hyphen: 45, // U+002D -
+	FullStop: 46, // U+002E .
+	Slash: 47, // U+002F /
+	Digit0: 48, // U+0030 0
+	Digit1: 49, // U+0031 1
+	Digit2: 50, // U+0032 2
+	Digit3: 51, // U+0033 3
+	Digit4: 52, // U+0034 4
+	Digit5: 53, // U+0035 5
+	Digit6: 54, // U+0036 6
+	Digit7: 55, // U+0037 7
+	Digit8: 56, // U+0038 8
+	Digit9: 57, // U+0039 9
+	Colon: 58, // U+003A :
+	Semicolon: 59, // U+003B ;
+	LessThanSign: 60, // U+003C <
+	EqualSign: 61, // U+003D =
+	GreaterThanSign: 62, // U+003E >
+	QuestionMark: 63, // U+003F ?
+	AtSign: 64, // U+0040 @
+	A: 65, // U+0041 A
+	B: 66, // U+0042 B
+	C: 67, // U+0043 C
+	D: 68, // U+0044 D
+	E: 69, // U+0045 E
+	F: 70, // U+0046 F
+	G: 71, // U+0047 G
+	H: 72, // U+0048 H
+	I: 73, // U+0049 I
+	J: 74, // U+004A J
+	K: 75, // U+004B K
+	L: 76, // U+004C L
+	M: 77, // U+004D M
+	N: 78, // U+004E N
+	O: 79, // U+004F O
+	P: 80, // U+0050 P
+	Q: 81, // U+0051 Q
+	R: 82, // U+0052 R
+	S: 83, // U+0053 S
+	T: 84, // U+0054 T
+	U: 85, // U+0055 U
+	V: 86, // U+0056 V
+	W: 87, // U+0057 W
+	X: 88, // U+0058 X
+	Y: 89, // U+0059 Y
+	Z: 90, // U+005A Z
+	LeftSquareBracket: 91, // U+005B [
+	Backslash: 92, // U+005C \
+	RightSquareBracket: 93, // U+005D ]
+	Circumflex: 94, // U+005E ^
+	Underscore: 95, // U+005F _
+	Grave: 96, // U+0060 `
+	a: 97, // U+0061 a
+	b: 98, // U+0062 b
+	c: 99, // U+0063 c
+	d: 100, // U+0064 d
+	e: 101, // U+0065 e
+	f: 102, // U+0066 f
+	g: 103, // U+0067 g
+	h: 104, // U+0068 h
+	i: 105, // U+0069 i
+	j: 106, // U+006A j
+	k: 107, // U+006B k
+	l: 108, // U+006C l
+	m: 109, // U+006D m
+	n: 110, // U+006E n
+	o: 111, // U+006F o
+	p: 112, // U+0070 p
+	q: 113, // U+0071 q
+	r: 114, // U+0072 r
+	s: 115, // U+0073 s
+	t: 116, // U+0074 t
+	u: 117, // U+0075 u
+	v: 118, // U+0076 v
+	w: 119, // U+0077 w
+	x: 120, // U+0078 x
+	y: 121, // U+0079 y
+	z: 122, // U+007A z
+	LeftCurlyBracket: 123, // U+007B {
+	Pipe: 124, // U+007C |
+	RightCurlyBracket: 125, // U+007D }
+	Tilde: 126 // U+007E ~
+}
\ No newline at end of file
diff --git a/cm-lang-rockstar/src/tokenizers/keywords.js b/cm-lang-rockstar/src/tokenizers/keywords.js
new file mode 100644
index 00000000..60ea7215
--- /dev/null
+++ b/cm-lang-rockstar/src/tokenizers/keywords.js
@@ -0,0 +1,75 @@
+import * as tokens from "../grammars/rockstar.terms.js"
+
+const aliases = new Map();
+aliases.set(tokens.Above, ['above', 'over']);
+aliases.set(tokens.And, ['and']);
+aliases.set(tokens.Around, ['around', 'round']);
+aliases.set(tokens.As, ['as']);
+aliases.set(tokens.Great, ['great', 'high', 'big', 'strong']);
+aliases.set(tokens.Small, ['less', 'low', 'small', 'weak']);
+aliases.set(tokens.At, ['at']);
+aliases.set(tokens.Back, ['back']);
+aliases.set(tokens.Be, ['be']);
+aliases.set(tokens.Break, ['break']);
+aliases.set(tokens.Build, ['build']);
+aliases.set(tokens.Call, ['call']);
+aliases.set(tokens.Cast, ['cast', 'burn']);
+aliases.set(tokens.Continue, ['continue', 'take']);
+aliases.set(tokens.Debug, ['debug']);
+aliases.set(tokens.Divided, ['divided', 'between', 'over']);
+aliases.set(tokens.Down, ['down']);
+aliases.set(tokens.Else, ['else', 'otherwise']);
+aliases.set(tokens.Empty, ['empty', 'silent', 'silence']);
+aliases.set(tokens.End, ['end', 'yeah', 'baby', 'oh']);
+aliases.set(tokens.Exactly, ['exactly', 'totally', 'really']);
+aliases.set(tokens.False, ["false", "lies", "no", "wrong"]);
+aliases.set(tokens.His, ['his', 'her']);
+aliases.set(tokens.If, ['if', 'when']);
+aliases.set(tokens.Into, ['into', 'in']);
+aliases.set(tokens.Is, ['is', 'was', 'are', 'were', 'am']);
+aliases.set(tokens.Isnt, ["isnt", "isn't", 'aint', "ain't", "wasn't", "wasnt", "aren't", "arent", "weren't", "werent"]);
+aliases.set(tokens.Join, ['join', 'unite']);
+aliases.set(tokens.Knock, ['knock']);
+aliases.set(tokens.Less, ['less', 'lower', 'smaller', 'weaker']);
+aliases.set(tokens.Let, ['let']);
+aliases.set(tokens.Like, ['like', 'so']);
+aliases.set(tokens.Listen, ['listen']);
+aliases.set(tokens.Minus, ['minus', 'without']);
+aliases.set(tokens.More, ['greater', 'higher', 'bigger', 'stronger', 'more']);
+aliases.set(tokens.Mysterious, ['mysterious']);
+aliases.set(tokens.Non, ['non']);
+aliases.set(tokens.Nor, ['nor']);
+aliases.set(tokens.Not, ['not']);
+aliases.set(tokens.Now, ['now']);
+aliases.set(tokens.Null, ['null', 'nothing', 'nowhere', 'nobody', 'gone']);
+aliases.set(tokens.Or, ['or']);
+aliases.set(tokens.Over, ['over']);
+aliases.set(tokens.Plus, ['plus', 'with']);
+aliases.set(tokens.Pop, ['roll', 'pop']);
+aliases.set(tokens.Print, ["print", "shout", "say", "scream", "whisper"]);
+aliases.set(tokens.Pronoun, ['they', 'them', 'she', 'him', 'her', 'hir', 'zie', 'zir', 'xem', 'ver', 'ze', 've', 'xe', 'it', 'he', 'you', 'me', 'i']);
+aliases.set(tokens.Push, ['rock', 'push']);
+aliases.set(tokens.Put, ['put']);
+aliases.set(tokens.Return, ['return', 'giving', 'give', 'send']);
+aliases.set(tokens.Says, ['say', 'says', 'said']);
+aliases.set(tokens.Split, ['cut', 'split', 'shatter']);
+aliases.set(tokens.Takes, ['takes', 'wants']);
+aliases.set(tokens.Taking, ['taking']);
+aliases.set(tokens.Than, ['than']);
+aliases.set(tokens.The, ['an', 'a', 'the', 'my', 'your', 'our', 'their']);
+aliases.set(tokens.Then, ['then']);
+aliases.set(tokens.Times, ['times', 'of']);
+aliases.set(tokens.To, ['to']);
+aliases.set(tokens.True, ["true", "yes", "ok", "right"]);
+aliases.set(tokens.Turn, ['turn']);
+aliases.set(tokens.Under, ['under', 'below']);
+aliases.set(tokens.Until, ['until']);
+aliases.set(tokens.Up, ['up']);
+aliases.set(tokens.Using, ['using', 'with']);
+aliases.set(tokens.While, ['while']);
+aliases.set(tokens.With, ['with']);
+aliases.set(tokens.Write, ['write']);
+
+const keywords = Array.from(aliases.values()).flat();
+
+export { aliases, keywords }
\ No newline at end of file
diff --git a/cm-lang-rockstar/src/tokenizers/rockstar-lexer.js b/cm-lang-rockstar/src/tokenizers/rockstar-lexer.js
new file mode 100644
index 00000000..aeff0d12
--- /dev/null
+++ b/cm-lang-rockstar/src/tokenizers/rockstar-lexer.js
@@ -0,0 +1,312 @@
+import * as tokens from "../grammars/rockstar.terms.js"
+import { ASCII } from './ascii.js';
+import { aliases, keywords } from "./keywords.js";
+
+const compareOperators = [">=", "<=", ">", "<", "="];
+const arithmeticOperators = ["+", "/", "*", "-"];
+
+const noise = " \t,?!./;";
+const noiseCodes = stringToCharCodeArray(noise);
+
+const endOfStatementMarkers = "?!.;";
+const endOfStatementCodes = stringToCharCodeArray(endOfStatementMarkers);
+
+export function tokenizeEOB(input) {
+	var skipCodes = spaceCodes.concat(noiseCodes);
+	while (input.next >= 0 && skipCodes.includes(input.next)) input.advance();
+	var i = 0;
+	if (input.peek(i) == ASCII.CR) i++;
+	if (input.peek(i) == ASCII.LF) {
+		input.advance(i + 1); // eat the newline.
+		i = 0;
+		if (input.next < 0) return;
+		while (input.peek(i) >= 0) {
+			while (noiseCodes.includes(input.peek(i))) i++;
+			if (input.peek(i) == ASCII.CR) i++;
+			if (input.peek(i) == ASCII.LF) return input.acceptToken(tokens.EOB);
+			while (noiseCodes.includes(input.peek(i))) i++;
+			let [codes, _] = peekNextWord(input, i);
+			var lexeme = String.fromCodePoint(...codes).toLowerCase();
+			if (aliases.get(tokens.Else).includes(lexeme)) return input.acceptToken(tokens.EOB);
+			if (aliases.get(tokens.End).includes(lexeme)) return input.acceptToken(tokens.EOB);
+			i++;
+		}
+	}
+	var [codes, _] = peekNextWord(input);
+	var lexeme = String.fromCodePoint(...codes);
+	if (/oo*h/i.test(lexeme)) {
+		input.advance(1);
+		return input.acceptToken(tokens.EOB);
+	}
+	if (aliases.get(tokens.Else).includes(lexeme) || aliases.get(tokens.End).includes(lexeme)) {
+		readNextWord(input);
+		return input.acceptToken(tokens.EOB);
+	}
+}
+
+let endOfWildcardCodes = endOfStatementCodes.concat([ASCII.CR, ASCII.LF]);
+
+export function tokenizeWildcard(input) {
+	while (input.next >= 0) {
+		if (endOfWildcardCodes.includes(input.peek())) {
+			if (input.peek() == ASCII.CR) input.advance();
+			return input.acceptToken(tokens.Wildcard);
+		}
+		input.advance();
+	}
+}
+
+export function tokenizeEOS(input) {
+	var foundEOS = false;
+	var skipCodes = spaceCodes.concat(noiseCodes);
+	while (input.next >= 0 && skipCodes.includes(input.next)) {
+		if (endOfStatementCodes.includes(input.next)) foundEOS = true;
+		input.advance();
+	}
+	var i = 0;
+	if (input.peek(i) == ASCII.CR) i++;
+	if (input.peek(i) == ASCII.LF) {
+		input.advance(i + 1); // eat the newline.
+		foundEOS = true;
+	}
+	var [codes, _] = peekUntilNextWhitespace(input);
+	if (codes.length) {
+		var lexeme = String.fromCodePoint(...codes).toLowerCase();
+		if (aliases.get(tokens.And).includes(lexeme)) return;
+		if (["&", "n'", "'n'"].includes(lexeme)) return;
+	}
+	if (foundEOS) return input.acceptToken(tokens.EOS);
+}
+
+// export function tokenizeEndMarkers(input) {
+// 	var foundEOS = false;
+// 	var skipCodes = spaceCodes.concat(noiseCodes);
+// 	while (input.next >= 0 && skipCodes.includes(input.next)) {
+// 		if (endOfStatementCodes.includes(input.next)) foundEOS = true;
+// 		input.advance();
+// 	}
+// 	var i = 0;
+// 	if (input.peek(i) == ASCII.CR) i++;
+// 	if (input.peek(i) == ASCII.LF) {
+// 		input.advance(i + 1); // eat the newline.
+// 		i = 0;
+// 		if (input.next < 0) return input.acceptToken(tokens.EOS);
+// 		while (input.peek(i) >= 0) {
+// 			while (noiseCodes.includes(input.peek(i))) i++;
+// 			if (input.peek(i) == ASCII.CR) i++;
+// 			if (input.peek(i) == ASCII.LF) return input.acceptToken(tokens.EOB);
+// 			while (noiseCodes.includes(input.peek(i))) i++;
+// 			let [codes, _] = peekNextWord(input, i);
+// 			var lexeme = String.fromCodePoint(...codes).toLowerCase();
+// 			if (aliases.get(tokens.Else).includes(lexeme)) return input.acceptToken(tokens.EOB);
+// 			if (aliases.get(tokens.End).includes(lexeme)) return input.acceptToken(tokens.EOB);
+// 			i++;
+// 		}
+// 	}
+// 	var offset = input.pos;
+// 	var [codes, index] = peekNextWord(input);
+// 	var lexeme = String.fromCodePoint(...codes);
+// 	if (/oo*h/i.test(lexeme)) {
+// 		input.advance(1);
+// 		return input.acceptToken(tokens.EOB);
+// 	}
+// 	if (aliases.get(tokens.Else).includes(lexeme || aliases.get(tokens.End).includes(lexeme))) {
+// 		readNextWord(input);
+// 		return input.acceptToken(tokens.EOB);
+// 	}
+// 	if (aliases.get(tokens.And).includes(codes)) return; // Do not treat the ", and" Oxford comma as an EOS
+// 	if (foundEOS) return input.acceptToken(tokens.EOS);
+// }
+
+export function tokenizePoeticNumber(input) {
+	let codes = [];
+	while (spaceCodes.includes(input.next)) input.advance();
+	// poetic numbers always start with a letter
+	if (!(alphaCodes.concat([ASCII.Apostrophe, ASCII.Hyphen]).includes(input.next))) return;
+	while (input.next >= 0 && !spaceCodes.includes(input.next)) {
+		codes.push(input.next);
+		input.advance();
+	}
+	let lexeme = String.fromCodePoint(...codes).toLowerCase();
+	if (isArithmeticOperator(lexeme)) return;
+	while (input.next >= 0 && input.next != ASCII.LF) input.advance();
+	return input.acceptToken(tokens.PoeticNumber);
+}
+
+export function tokenizePoeticString(input) {
+	while (input.next >= 0 && input.next != ASCII.LF) input.advance();
+	input.acceptToken(tokens.PoeticString);
+}
+
+function isArithmeticOperator(lexeme) {
+	if (compareOperators.includes(lexeme)) return true;
+	if (arithmeticOperators.includes(lexeme)) return true;
+	for (var op of operatorMaps.keys()) {
+		for (var token of operatorMaps.get(op)) {
+			if (aliases.get(token).includes(lexeme)) return true;
+		}
+	}
+	return false;
+}
+
+export function tokenizeOperator(input) {
+	var codes = readNextWordIncludingOperators(input);
+	var lexeme = String.fromCodePoint(...codes).toLowerCase();
+	if (compareOperators.includes(lexeme)) return input.acceptToken(tokens.CompareOperator);
+	if (arithmeticOperators.includes(lexeme)) return input.acceptToken(tokens.ArithmeticOperator);
+	if (aliases.get(tokens.Is).includes(lexeme)) {
+		codes = readNextWordIncludingOperators(input);
+		lexeme = String.fromCodePoint(...codes).toLowerCase();
+		for (var token of [tokens.Above, tokens.Less, tokens.More, tokens.Under]) {
+			if (aliases.get(token).includes(lexeme)) {
+				var tokenTo = input.pos;
+				codes = readNextWordIncludingOperators(input);
+				lexeme = String.fromCodePoint(...codes).toLowerCase();
+				if (aliases.get(tokens.Than).includes(lexeme)) {
+					return input.acceptToken(tokens.CompareOperator);
+				} else {
+					return input.acceptTokenTo(tokens.CompareOperator, tokenTo);
+				}
+			}
+		}
+		if (lexeme == "as") {
+			codes = readNextWordIncludingOperators(input);
+			lexeme = String.fromCodePoint(...codes).toLowerCase();
+			for (var token of [tokens.Great, tokens.Small]) {
+				if (aliases.get(token).includes(lexeme)) {
+					codes = readNextWordIncludingOperators(input);
+					lexeme = String.fromCodePoint(...codes).toLowerCase();
+					if (aliases.get(tokens.As).includes(lexeme)) return input.acceptToken(tokens.CompareOperator);
+				}
+			}
+		}
+	} else {
+		for (var op of operatorMaps.keys()) {
+			for (var token of operatorMaps.get(op)) {
+				if (aliases.get(token).includes(lexeme)) {
+					if (lexeme == "divided") {
+						var [codes, index] = peekNextWord(input);
+						if (String.fromCodePoint(...codes).toLowerCase() == "by") readNextWord(input);
+					}
+					return input.acceptToken(op);
+				}
+			}
+		}
+	}
+}
+
+const operatorMaps = new Map();
+operatorMaps.set(tokens.CompareOperator, [tokens.Not, tokens.Is, tokens.Isnt]);
+operatorMaps.set(tokens.ArithmeticOperator, [tokens.Plus, tokens.Minus, tokens.Divided, tokens.Times]);
+operatorMaps.set(tokens.LogicOperator, [tokens.And, tokens.Nor, tokens.Or]);
+
+export function tokenizeKeyword(input) {
+	var codes = readNextWord(input);
+	var lexeme = String.fromCodePoint(...codes).toLowerCase();
+	for (const [key, value] of aliases) {
+		if (value.includes(lexeme)) return input.acceptToken(key);
+	}
+}
+
+const MAXIMUM_PARTS_IN_A_PROPER_VARIABLE = 99;
+
+export function tokenizeVariable(input) {
+	var codes = readNextWord(input);
+	if (!codes.length) return;
+	var lexeme = String.fromCodePoint(...codes);
+
+	if (aliases.get(tokens.The).includes(lexeme.toLowerCase())) {
+		readNextWord(input);
+		return input.acceptToken(tokens.CommonVariable);
+	}
+
+	if (aliases.get(tokens.His).includes(lexeme.toLowerCase())) {
+		codes = readNextWord(input);
+		lexeme += " " + String.fromCodePoint(...codes);
+		if (codes.length == 0 || isKeyword(codes)) return input.acceptToken(tokens.Pronoun);
+		return input.acceptToken(tokens.CommonVariable);
+	}
+
+	if (aliases.get(tokens.Pronoun).includes(lexeme.toLowerCase())) return input.acceptToken(tokens.Pronoun);
+	if (isKeyword(codes)) return;
+
+	while (input.next == ASCII.FullStop) {
+		codes.push(input.next);
+		input.advance();
+	}
+	var properNouns = [];
+	var index = 0;
+	var tokenTo = input.pos;
+
+	for (var i = 0; i < MAXIMUM_PARTS_IN_A_PROPER_VARIABLE; i++) {
+		if (isKeyword(codes)) break;
+		if (upperCodes.includes(codes[0])) {
+			properNouns.push(String.fromCodePoint(...codes));
+			input.advance(index);
+			tokenTo += index;
+		}
+		[codes, index] = peekNextWord(input);
+	}
+	if (properNouns.length > 1) return input.acceptTokenTo(tokens.ProperVariable, tokenTo);
+	return input.acceptToken(tokens.SimpleVariable);
+}
+
+function isKeyword(codes) {
+	var lexeme = (typeof (codes) == "string" ? codes.toLowerCase() : (String.fromCodePoint(...codes).toLowerCase()));
+	return keywords.includes(lexeme);
+}
+
+const space = " \t";
+const spaceCodes = stringToCharCodeArray(space);
+
+const readNextWordIncludingOperators = (input) => readWhileContains(input, alphaCodes.concat(opCodes));
+const readNextWordIncludingApostrophes = (input) => readWhileContains(input, [ASCII.Apostrophe].concat(alphaCodes));
+
+const readNextWord = (input) => readWhileContains(input, alphaCodes);
+
+const peekUntilNextWhitespace = (input, index = 0) => {
+	let codes = [];
+	while (spaceCodes.includes(input.peek(index))) index++;
+	while (true) {
+		var code = input.peek(index);
+		if (code <= 0) break;
+		if (spaceCodes.includes(code)) break;
+		codes.push(code);
+		index++;
+	}
+	return [codes, index];
+}
+
+const peekNextWord = (input, index = 0) => {
+	let codes = [];
+	while (spaceCodes.includes(input.peek(index))) index++;
+	if (input.peek(index) <= 0) return [codes, index];
+	while (alphaCodes.includes(input.peek(index))) codes.push(input.peek(index++));
+	while (input.peek(index) == ASCII.FullStop) codes.push(input.peek(index++));
+	return [codes, index];
+}
+
+function readWhileContains(input, accept) {
+	let codes = [];
+	while (spaceCodes.includes(input.next)) input.advance();
+	while (accept.includes(input.next)) {
+		codes.push(input.next);
+		input.advance();
+	}
+	return codes;
+}
+
+function stringToCharCodeArray(s) {
+	var result = [];
+	for (var i = 0; i < s.length; i++) result.push(s.charCodeAt(i));
+	return result;
+}
+
+const operators = "'<>=!+/-*";
+const uppers = "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĸĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ";
+const lowers = "abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįi̇ijĵķĸĺļľŀłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷÿźżžʼnß";
+const opCodes = stringToCharCodeArray(operators);
+const upperCodes = stringToCharCodeArray(uppers);
+const lowerCodes = stringToCharCodeArray(lowers);
+const alphaCodes = upperCodes.concat(lowerCodes);
+
diff --git a/cm-lang-rockstar/src/tokenizers/rockstar-tokenizer.js b/cm-lang-rockstar/src/tokenizers/rockstar-tokenizer.js
new file mode 100644
index 00000000..16e6d544
--- /dev/null
+++ b/cm-lang-rockstar/src/tokenizers/rockstar-tokenizer.js
@@ -0,0 +1,11 @@
+import { ExternalTokenizer } from "@lezer/lr"
+import * as lexer from "./rockstar-lexer.js"
+
+export const Keywords = new ExternalTokenizer(lexer.tokenizeKeyword);
+export const Variables = new ExternalTokenizer(lexer.tokenizeVariable);
+export const Operators = new ExternalTokenizer(lexer.tokenizeOperator);
+export const PoeticString = new ExternalTokenizer(lexer.tokenizePoeticString);
+export const PoeticNumber = new ExternalTokenizer(lexer.tokenizePoeticNumber);
+export const EOB = new ExternalTokenizer(lexer.tokenizeEOB);
+export const EOS = new ExternalTokenizer(lexer.tokenizeEOS);
+export const Wildcard = new ExternalTokenizer(lexer.tokenizeWildcard);
\ No newline at end of file
diff --git a/cm-lang-rockstar/test/examples.test.js b/cm-lang-rockstar/test/examples.test.js
new file mode 100644
index 00000000..629369a7
--- /dev/null
+++ b/cm-lang-rockstar/test/examples.test.js
@@ -0,0 +1,21 @@
+import * as fs from "fs"
+import * as path from "path"
+import { fileURLToPath } from 'url';
+import { parser } from "../src/grammars/rockstar.js";
+
+let caseDir = path.dirname(fileURLToPath(import.meta.url))
+let examples = path.join(caseDir, "../../codewithrockstar.com/examples/");
+var allFiles = fs.readdirSync(examples, { recursive: true });
+var rockFiles = [];
+for (var file of allFiles) {
+	if (! /\.rock$/.test(file)) continue;
+	rockFiles.push(file);
+}
+
+test.each(rockFiles)("parser parses %p", (file) => {
+ 	let source = fs.readFileSync(path.join(examples, file), "utf8");
+	expect(source.length).not.toBe(0);
+ 	// let result = parser.parse(source);
+ 	//console.log(result.toString());
+});
+
diff --git a/cm-lang-rockstar/test/parser.test.js b/cm-lang-rockstar/test/parser.test.js
new file mode 100644
index 00000000..87d691b1
--- /dev/null
+++ b/cm-lang-rockstar/test/parser.test.js
@@ -0,0 +1,17 @@
+import * as rockstar from "../src/tokenizers/rockstar-lexer.js"
+import * as tokens from "../src/grammars/rockstar.terms.js";
+
+import { parser } from "../src/grammars/rockstar.js";
+
+test("parse", () => {
+	let result = parser.parse("say 1 say 2");
+	console.log(result.toString());
+});
+
+test("argument separators aren't EOS", () => {
+	let result = parser.parse("Call my function with 1, 2, & 3, 'n' 4, n' 5 & 6 'n' 7 n' 8, and 9");
+	console.log(result.toString());
+	expect(result.toString()).not.toContain("EOS");
+});
+
+
diff --git a/cm-lang-rockstar/test/parser/editor.d.ts b/cm-lang-rockstar/test/parser/editor.d.ts
new file mode 100644
index 00000000..20143205
--- /dev/null
+++ b/cm-lang-rockstar/test/parser/editor.d.ts
@@ -0,0 +1,2 @@
+declare const deepPurple: import("@codemirror/state").Extension;
+export { deepPurple };
diff --git a/cm-lang-rockstar/test/parser/editor.js b/cm-lang-rockstar/test/parser/editor.js
new file mode 100644
index 00000000..6fc8ab88
--- /dev/null
+++ b/cm-lang-rockstar/test/parser/editor.js
@@ -0,0 +1 @@
+class t{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,n){[t,e]=h(this,t,e);let s=[];return this.decompose(0,t,s,2),n.length&&n.decompose(0,n.length,s,3),this.decompose(e,this.length,s,1),i.from(s,this.length-(e-t)+n.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=h(this,t,e);let n=[];return this.decompose(t,e,n,0),i.from(n,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new r(this),s=new r(t);for(let t=e,r=e;;){if(n.next(t),s.next(t),t=0,n.lineBreak!=s.lineBreak||n.done!=s.done||n.value!=s.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(t=1){return new r(this,t)}iterRange(t,e=this.length){return new o(this,t,e)}iterLines(t,e){let i;if(null==t)i=this.iter();else{null==e&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new l(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(n){if(0==n.length)throw new RangeError("A document must have at least one line");return 1!=n.length||n[0]?n.length<=32?new e(n):i.from(e.split(n,[])):t.empty}}class e extends t{constructor(t,e=function(t){let e=-1;for(let i of t)e+=i.length+1;return e}(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let s=0;;s++){let r=this.text[s],o=n+r.length;if((e?i:o)>=t)return new a(n,o,i,r);n=o+1,i++}}decompose(t,i,r,o){let l=t<=0&&i>=this.length?this:new e(s(this.text,t,i),Math.min(i,this.length)-Math.max(0,t));if(1&o){let t=r.pop(),i=n(l.text,t.text.slice(),0,l.length);if(i.length<=32)r.push(new e(i,t.length+l.length));else{let t=i.length>>1;r.push(new e(i.slice(0,t)),new e(i.slice(t)))}}else r.push(l)}replace(t,r,o){if(!(o instanceof e))return super.replace(t,r,o);[t,r]=h(this,t,r);let l=n(this.text,n(o.text,s(this.text,0,t)),r),a=this.length+o.length-(r-t);return l.length<=32?new e(l,a):i.from(e.split(l,[]),a)}sliceString(t,e=this.length,i="\n"){[t,e]=h(this,t,e);let n="";for(let s=0,r=0;s<=e&&rt&&r&&(n+=i),ts&&(n+=o.slice(Math.max(0,t-s),e-s)),s=l+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,i){let n=[],s=-1;for(let r of t)n.push(r),s+=r.length+1,32==n.length&&(i.push(new e(n,s)),n=[],s=-1);return s>-1&&i.push(new e(n,s)),i}}class i extends t{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let e of t)this.lines+=e.lines}lineInner(t,e,i,n){for(let s=0;;s++){let r=this.children[s],o=n+r.length,l=i+r.lines-1;if((e?l:o)>=t)return r.lineInner(t,e,i,n);n=o+1,i=l+1}}decompose(t,e,i,n){for(let s=0,r=0;r<=e&&s=r){let s=n&((r<=t?1:0)|(l>=e?2:0));r>=t&&l<=e&&!s?i.push(o):o.decompose(t-r,e-r,i,s)}r=l+1}}replace(t,e,n){if([t,e]=h(this,t,e),n.lines=r&&e<=l){let a=o.replace(t-r,e-r,n),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let r=this.children.slice();return r[s]=a,new i(r,this.length-(e-t)+n.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,n)}sliceString(t,e=this.length,i="\n"){[t,e]=h(this,t,e);let n="";for(let s=0,r=0;st&&s&&(n+=i),tr&&(n+=o.sliceString(t-r,e-r,i)),r=l+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof i))return 0;let n=0,[s,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;s+=e,r+=e){if(s==o||r==l)return n;let i=this.children[s],a=t.children[r];if(i!=a)return n+i.scanIdentical(a,e);n+=i.length+1}}static from(t,n=t.reduce(((t,e)=>t+e.length+1),-1)){let s=0;for(let e of t)s+=e.lines;if(s<32){let i=[];for(let e of t)e.flatten(i);return new e(i,n)}let r=Math.max(32,s>>5),o=r<<1,l=r>>1,a=[],h=0,c=-1,u=[];function d(t){let n;if(t.lines>o&&t instanceof i)for(let e of t.children)d(e);else t.lines>l&&(h>l||!h)?(f(),a.push(t)):t instanceof e&&h&&(n=u[u.length-1])instanceof e&&t.lines+n.lines<=32?(h+=t.lines,c+=t.length+1,u[u.length-1]=new e(n.text.concat(t.text),n.length+1+t.length)):(h+t.lines>r&&f(),h+=t.lines,c+=t.length+1,u.push(t))}function f(){0!=h&&(a.push(1==u.length?u[0]:i.from(u,c)),c=-1,h=u.length=0)}for(let e of t)d(e);return f(),1==a.length?a[0]:new i(a,n)}}function n(t,e,i=0,n=1e9){for(let s=0,r=0,o=!0;r=i&&(a>n&&(l=l.slice(0,n-s)),s0?1:(t instanceof e?t.text.length:t.children.length)<<1]}nextInner(t,i){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,s=this.nodes[n],r=this.offsets[n],o=r>>1,l=s instanceof e?s.text.length:s.children.length;if(o==(i>0?l:0)){if(0==n)return this.done=!0,this.value="",this;i>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((1&r)==(i>0?0:1)){if(this.offsets[n]+=i,0==t)return this.lineBreak=!0,this.value="\n",this;t--}else if(s instanceof e){let e=s.text[o+(i<0?-1:0)];if(this.offsets[n]+=i,e.length>Math.max(0,t))return this.value=0==t?e:i>0?e.slice(t):e.slice(0,e.length-t),this;t-=e.length}else{let r=s.children[o+(i<0?-1:0)];t>r.length?(t-=r.length,this.offsets[n]+=i):(i<0&&this.offsets[n]--,this.nodes.push(r),this.offsets.push(i>0?1:(r instanceof e?r.text.length:r.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}}class o{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new r(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&""!=this.value}}class l{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}}"undefined"!=typeof Symbol&&(t.prototype[Symbol.iterator]=function(){return this.iter()},r.prototype[Symbol.iterator]=o.prototype[Symbol.iterator]=l.prototype[Symbol.iterator]=function(){return this});class a{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}}function h(t,e,i){return[e=Math.max(0,Math.min(t.length,e)),Math.max(e,Math.min(t.length,i))]}let c="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map((t=>t?parseInt(t,36):1));for(let t=1;tt)return c[e-1]<=t;return!1}function d(t){return t>=127462&&t<=127487}const f=8205;function p(t,e,i=!0,n=!0){return(i?g:m)(t,e,n)}function g(t,e,i){if(e==t.length)return e;e&&v(t.charCodeAt(e))&&w(t.charCodeAt(e-1))&&e--;let n=b(t,e);for(e+=x(n);e=0&&d(b(t,n));)i++,n-=2;if(i%2==0)break;e+=2}}}return e}function m(t,e,i){for(;e>0;){let n=g(t,e-2,i);if(n=56320&&t<57344}function w(t){return t>=55296&&t<56320}function b(t,e){let i=t.charCodeAt(e);if(!w(i)||e+1==t.length)return i;let n=t.charCodeAt(e+1);return v(n)?n-56320+(i-55296<<10)+65536:i}function y(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t)))}function x(t){return t<65536?1:2}const k=/\r\n?|\n/;var P=function(t){return t[t.Simple=0]="Simple",t[t.TrackDel=1]="TrackDel",t[t.TrackBefore=2]="TrackBefore",t[t.TrackAfter=3]="TrackAfter",t}(P||(P={}));class S{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return s+(t-n);s+=o}else{if(i!=P.Simple&&a>=t&&(i==P.TrackDel&&nt||i==P.TrackBefore&&nt))return null;if(a>t||a==t&&e<0&&!o)return t==n||e<0?s:s+l;s+=l}n=a}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return s}touchesRange(t,e=t){for(let i=0,n=0;i=0&&n<=e&&s>=t)return!(ne)||"cover";n=s}return!1}toString(){let t="";for(let e=0;e=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some((t=>"number"!=typeof t)))throw new RangeError("Invalid JSON representation of ChangeDesc");return new S(t)}static create(t){return new S(t)}}class O extends S{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return M(this,((e,i,n,s,r)=>t=t.replace(n,n+(i-e),r)),!1),t}mapDesc(t,e=!1){return T(this,t,e,!0)}invert(e){let i=this.sections.slice(),n=[];for(let s=0,r=0;s=0){i[s]=l,i[s+1]=o;let a=s>>1;for(;n.length0&&A(i,e,s.text),s.forward(t),o+=t}let a=t[r++];for(;o>1].toJSON()))}return t}static of(e,i,n){let s=[],r=[],o=0,l=null;function a(t=!1){if(!t&&!s.length)return;ol||e<0||l>i)throw new RangeError(`Invalid change range ${e} to ${l} (in doc of length ${i})`);let u=c?"string"==typeof c?t.of(c.split(n||k)):c:t.empty,d=u.length;if(e==l&&0==d)return;eo&&C(s,e-o,-1),C(s,l-e,d),A(r,s,u),o=l}}(e),a(!l),l}static empty(t){return new O(t?[t,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let i=[],n=[];for(let s=0;se&&"string"!=typeof t)))throw new RangeError("Invalid JSON representation of ChangeSet");if(1==r.length)i.push(r[0],0);else{for(;n.length=0&&i<=0&&i==t[s+1]?t[s]+=e:0==e&&0==t[s]?t[s+1]+=i:n?(t[s]+=e,t[s+1]+=i):t.push(e,i)}function A(e,i,n){if(0==n.length)return;let s=i.length-2>>1;if(s>1])),!(n||l==e.sections.length||e.sections[l+1]<0);)a=e.sections[l++],h=e.sections[l++];i(r,c,o,u,d),r=c,o=u}}}function T(t,e,i,n=!1){let s=[],r=n?[]:null,o=new E(t),l=new E(e);for(let t=-1;;)if(-1==o.ins&&-1==l.ins){let t=Math.min(o.len,l.len);C(s,t,-1),o.forward(t),l.forward(t)}else if(l.ins>=0&&(o.ins<0||t==o.i||0==o.off&&(l.len=0&&t=0)){if(o.done&&l.done)return r?O.createSet(s,r):S.create(s);throw new Error("Mismatched change set lengths")}{let e=0,i=o.len;for(;i;)if(-1==l.ins){let t=Math.min(i,l.len);e+=t,i-=t,l.forward(t)}else{if(!(0==l.ins&&l.lene||o.ins>=0&&o.len>e)&&(t||n.length>i),r.forward2(e),o.forward(e)}}else C(n,0,o.ins,t),s&&A(s,n,o.text),o.next()}}class E{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return i>=e.length?t.empty:e[i]}textBit(e){let{inserted:i}=this.set,n=this.i-2>>1;return n>=i.length&&!e?t.empty:i[n].slice(this.off,null==e?void 0:this.off+e)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){-1==this.ins?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}}class R{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return 32&this.flags?this.to:this.from}get head(){return 32&this.flags?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return 8&this.flags?-1:16&this.flags?1:0}get bidiLevel(){let t=7&this.flags;return 7==t?null:t}get goalColumn(){let t=this.flags>>6;return 16777215==t?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new R(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return B.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return B.range(this.anchor,i)}eq(t,e=!1){return!(this.anchor!=t.anchor||this.head!=t.head||e&&this.empty&&this.assoc!=t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||"number"!=typeof t.anchor||"number"!=typeof t.head)throw new RangeError("Invalid JSON representation for SelectionRange");return B.range(t.anchor,t.head)}static create(t,e,i){return new R(t,e,i)}}class B{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:B.create(this.ranges.map((i=>i.map(t,e))),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON())),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||"number"!=typeof t.main||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new B(t.ranges.map((t=>R.fromJSON(t))),t.main)}static single(t,e=t){return new B([B.range(t,e)],0)}static create(t,e=0){if(0==t.length)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nt?8:0)|s)}static normalized(t,e=0){let i=t[e];t.sort(((t,e)=>t.from-e.from)),e=t.indexOf(i);for(let i=1;in.head?B.range(o,r):B.range(r,o))}}return new B(t,e)}}function N(t,e){for(let i of t.ranges)if(i.to>e)throw new RangeError("Selection points outside of document")}let L=0;class I{constructor(t,e,i,n,s){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=L++,this.default=t([]),this.extensions="function"==typeof s?s(this):s}get reader(){return this}static define(t={}){return new I(t.combine||(t=>t),t.compareInput||((t,e)=>t===e),t.compare||(t.combine?(t,e)=>t===e:F),!!t.static,t.enables)}of(t){return new V([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new V(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new V(t,this,2,e)}from(t,e){return e||(e=t=>t),this.compute([t],(i=>e(i.field(t))))}}function F(t,e){return t==e||t.length==e.length&&t.every(((t,i)=>t===e[i]))}class V{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=L++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,s=this.id,r=t[s]>>1,o=2==this.type,l=!1,a=!1,h=[];for(let i of this.dependencies)"doc"==i?l=!0:"selection"==i?a=!0:1&(null!==(e=t[i.id])&&void 0!==e?e:1)||h.push(t[i.id]);return{create:t=>(t.values[r]=i(t),1),update(t,e){if(l&&e.docChanged||a&&(e.docChanged||e.selection)||H(t,h)){let e=i(t);if(o?!W(e,t.values[r],n):!n(e,t.values[r]))return t.values[r]=e,1}return 0},reconfigure:(t,e)=>{let l,a=e.config.address[s];if(null!=a){let s=et(e,a);if(this.dependencies.every((i=>i instanceof I?e.facet(i)===t.facet(i):!(i instanceof X)||e.field(i,!1)==t.field(i,!1)))||(o?W(l=i(t),s,n):n(l=i(t),s)))return t.values[r]=s,0}else l=i(t);return t.values[r]=l,1}}}}function W(t,e,i){if(t.length!=e.length)return!1;for(let n=0;nt[e.id])),s=i.map((t=>t.type)),r=n.filter((t=>!(1&t))),o=t[e.id]>>1;function l(t){let i=[];for(let e=0;et===e),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(q).find((t=>t.field==this));return((null==e?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:t=>(t.values[e]=this.create(t),1),update:(t,i)=>{let n=t.values[e],s=this.updateF(n,i);return this.compareF(n,s)?0:(t.values[e]=s,1)},reconfigure:(t,i)=>null!=i.config.address[this.id]?(t.values[e]=i.field(this),0):(t.values[e]=this.create(t),1)}}init(t){return[this,q.of({field:this,create:t})]}get extension(){return this}}const U=4,Q=3,Y=2,$=1;function _(t){return e=>new K(e,t)}const j={highest:_(0),high:_($),default:_(Y),low:_(Q),lowest:_(U)};class K{constructor(t,e){this.inner=t,this.prec=e}}class G{of(t){return new Z(this,t)}reconfigure(t){return G.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}}class Z{constructor(t,e){this.compartment=t,this.inner=e}}class J{constructor(t,e,i,n,s,r){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let n=[],s=Object.create(null),r=new Map;for(let i of function(t,e,i){let n=[[],[],[],[],[]],s=new Map;function r(t,o){let l=s.get(t);if(null!=l){if(l<=o)return;let e=n[l].indexOf(t);e>-1&&n[l].splice(e,1),t instanceof Z&&i.delete(t.compartment)}if(s.set(t,o),Array.isArray(t))for(let e of t)r(e,o);else if(t instanceof Z){if(i.has(t.compartment))throw new RangeError("Duplicate use of compartment in extensions");let n=e.get(t.compartment)||t.inner;i.set(t.compartment,n),r(n,o)}else if(t instanceof K)r(t.inner,t.prec);else if(t instanceof X)n[o].push(t),t.provides&&r(t.provides,o);else if(t instanceof V)n[o].push(t),t.facet.extensions&&r(t.facet.extensions,Y);else{let e=t.extension;if(!e)throw new Error(`Unrecognized extension value in extension set (${t}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(e,o)}}return r(t,Y),n.reduce(((t,e)=>t.concat(e)))}(t,e,r))i instanceof X?n.push(i):(s[i.facet.id]||(s[i.facet.id]=[])).push(i);let o=Object.create(null),l=[],a=[];for(let t of n)o[t.id]=a.length<<1,a.push((e=>t.slot(e)));let h=null==i?void 0:i.config.facets;for(let t in s){let e=s[t],n=e[0].facet,r=h&&h[t]||[];if(e.every((t=>0==t.type)))if(o[n.id]=l.length<<1|1,F(r,e))l.push(i.facet(n));else{let t=n.combine(e.map((t=>t.value)));l.push(i&&n.compare(t,i.facet(n))?i.facet(n):t)}else{for(let t of e)0==t.type?(o[t.id]=l.length<<1|1,l.push(t.value)):(o[t.id]=a.length<<1,a.push((e=>t.dynamicSlot(e))));o[n.id]=a.length<<1,a.push((t=>z(t,n,e)))}}let c=a.map((t=>t(o)));return new J(t,r,c,o,l,s)}}function tt(t,e){if(1&e)return 2;let i=e>>1,n=t.status[i];if(4==n)throw new Error("Cyclic dependency between fields and/or facets");if(2&n)return n;t.status[i]=4;let s=t.computeSlot(t,t.config.dynamicSlots[i]);return t.status[i]=2|s}function et(t,e){return 1&e?t.config.staticValues[e>>1]:t.values[e>>1]}const it=I.define(),nt=I.define({combine:t=>t.some((t=>t)),static:!0}),st=I.define({combine:t=>t.length?t[0]:void 0,static:!0}),rt=I.define(),ot=I.define(),lt=I.define(),at=I.define({combine:t=>!!t.length&&t[0]});class ht{constructor(t,e){this.type=t,this.value=e}static define(){return new ct}}class ct{of(t){return new ht(this,t)}}class ut{constructor(t){this.map=t}of(t){return new dt(this,t)}}class dt{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return void 0===e?void 0:e==this.value?this:new dt(this.type,e)}is(t){return this.type==t}static define(t={}){return new ut(t.map||(t=>t))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let t=n.map(e);t&&i.push(t)}return i}}dt.reconfigure=dt.define(),dt.appendConfig=dt.define();class ft{constructor(t,e,i,n,s,r){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,i&&N(i,e.newLength),s.some((t=>t.type==ft.time))||(this.annotations=s.concat(ft.time.of(Date.now())))}static create(t,e,i,n,s,r){return new ft(t,e,i,n,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(ft.userEvent);return!(!e||!(e==t||e.length>t.length&&e.slice(0,t.length)==t&&"."==e[t.length]))}}function pt(t,e){let i=[];for(let n=0,s=0;;){let r,o;if(n=t[n]))r=t[n++],o=t[n++];else{if(!(s=0;s--){let r=i[s](t);r&&Object.keys(r).length&&(n=gt(n,mt(e,r,t.changes.newLength),!0))}return n==t?t:ft.create(e,t.changes,t.selection,n.effects,n.annotations,n.scrollIntoView)}(i?function(t){let e=t.startState,i=!0;for(let n of e.facet(rt)){let e=n(t);if(!1===e){i=!1;break}Array.isArray(e)&&(i=!0===i?e:pt(i,e))}if(!0!==i){let n,s;if(!1===i)s=t.changes.invertedDesc,n=O.empty(e.doc.length);else{let e=t.changes.filter(i);n=e.changes,s=e.filtered.mapDesc(e.changes).invertedDesc}t=ft.create(e,n,t.selection&&t.selection.map(s),dt.mapEffects(t.effects,s),t.annotations,t.scrollIntoView)}let n=e.facet(ot);for(let i=n.length-1;i>=0;i--){let s=n[i](t);t=s instanceof ft?s:Array.isArray(s)&&1==s.length&&s[0]instanceof ft?s[0]:vt(e,bt(s),!1)}return t}(s):s)}ft.time=ht.define(),ft.userEvent=ht.define(),ft.addToHistory=ht.define(),ft.remote=ht.define();const wt=[];function bt(t){return null==t?wt:Array.isArray(t)?t:[t]}var yt=function(t){return t[t.Word=0]="Word",t[t.Space=1]="Space",t[t.Other=2]="Other",t}(yt||(yt={}));const xt=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let kt;try{kt=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(t){}function Pt(t){return e=>{if(!/\S/.test(e))return yt.Space;if(function(t){if(kt)return kt.test(t);for(let e=0;e"€"&&(i.toUpperCase()!=i.toLowerCase()||xt.test(i)))return!0}return!1}(e))return yt.Word;for(let i=0;i-1)return yt.Word;return yt.Other}}class St{constructor(t,e,i,n,s,r){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let t=0;ts.set(e,t))),i=null),s.set(e.value.compartment,e.value.extension)):e.is(dt.reconfigure)?(i=null,n=e.value):e.is(dt.appendConfig)&&(i=null,n=bt(n).concat(e.value));if(i)e=t.startState.values.slice();else{i=J.resolve(n,s,this),e=new St(i,this.doc,this.selection,i.dynamicSlots.map((()=>null)),((t,e)=>e.reconfigure(t,this)),null).values}let r=t.startState.facet(nt)?t.newSelection:t.newSelection.asSingle();new St(i,t.newDoc,r,e,((e,i)=>i.update(e,t)),t)}replaceSelection(t){return"string"==typeof t&&(t=this.toText(t)),this.changeByRange((e=>({changes:{from:e.from,to:e.to,insert:t},range:B.cursor(e.from+t.length)})))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),s=[i.range],r=bt(i.effects);for(let i=1;is.spec.fromJSON(r,t))))}return St.create({doc:t.doc,selection:B.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(e={}){let i=J.resolve(e.extensions||[],new Map),n=e.doc instanceof t?e.doc:t.of((e.doc||"").split(i.staticFacet(St.lineSeparator)||k)),s=e.selection?e.selection instanceof B?e.selection:B.single(e.selection.anchor,e.selection.head):B.single(0);return N(s,n.length),i.staticFacet(nt)||(s=s.asSingle()),new St(i,n,s,i.dynamicSlots.map((()=>null)),((t,e)=>e.create(t)),null)}get tabSize(){return this.facet(St.tabSize)}get lineBreak(){return this.facet(St.lineSeparator)||"\n"}get readOnly(){return this.facet(at)}phrase(t,...e){for(let e of this.facet(St.phrases))if(Object.prototype.hasOwnProperty.call(e,t)){t=e[t];break}return e.length&&(t=t.replace(/\$(\$|\d*)/g,((t,i)=>{if("$"==i)return"$";let n=+(i||1);return!n||n>e.length?t:e[n-1]}))),t}languageDataAt(t,e,i=-1){let n=[];for(let s of this.facet(it))for(let r of s(this,e,i))Object.prototype.hasOwnProperty.call(r,t)&&n.push(r[t]);return n}charCategorizer(t){return Pt(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),s=this.charCategorizer(t),r=t-i,o=t-i;for(;r>0;){let t=p(e,r,!1);if(s(e.slice(t,r))!=yt.Word)break;r=t}for(;ot.length?t[0]:4}),St.lineSeparator=st,St.readOnly=at,St.phrases=I.define({compare(t,e){let i=Object.keys(t),n=Object.keys(e);return i.length==n.length&&i.every((i=>t[i]==e[i]))}}),St.languageData=it,St.changeFilter=rt,St.transactionFilter=ot,St.transactionExtender=lt,G.reconfigure=dt.define();class Ct{eq(t){return this==t}range(t,e=t){return At.create(t,e,this)}}Ct.prototype.startSide=Ct.prototype.endSide=0,Ct.prototype.point=!1,Ct.prototype.mapMode=P.TrackDel;let At=class t{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(e,i,n){return new t(e,i,n)}};function Mt(t,e){return t.from-e.from||t.value.startSide-e.value.startSide}class Tt{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let s=i?this.to:this.from;for(let r=n,o=s.length;;){if(r==o)return r;let n=r+o>>1,l=s[n]-t||(i?this.value[n].endSide:this.value[n].startSide)-e;if(n==r)return l>=0?r:o;l>=0?o=n:r=n+1}}between(t,e,i,n){for(let s=this.findIndex(e,-1e9,!0),r=this.findIndex(i,1e9,!1,s);sh||a==h&&c.startSide>0&&c.endSide<=0)continue;(h-a||c.endSide-c.startSide)<0||(r<0&&(r=a),c.point&&(o=Math.max(o,h-a)),i.push(c),n.push(a-r),s.push(h-r))}return{mapped:i.length?new Tt(n,s,i,o):null,pos:r}}}class Dt{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new Dt(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:s=this.length}=t,r=t.filter;if(0==e.length&&!r)return this;if(i&&(e=e.slice().sort(Mt)),this.isEmpty)return e.length?Dt.of(e):this;let o=new Bt(this,null,-1).goto(0),l=0,a=[],h=new Et;for(;o.value||l=0){let t=e[l++];h.addInner(t.from,t.to,t.value)||a.push(t)}else 1==o.rangeIndex&&o.chunkIndexthis.chunkEnd(o.chunkIndex)||so.to||s=s&&t<=s+r.length&&!1===r.between(s,t-s,e-s,i))return}this.nextLayer.between(t,e,i)}}iter(t=0){return Nt.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Nt.from(t).goto(e)}static compare(t,e,i,n,s=-1){let r=t.filter((t=>t.maxPoint>0||!t.isEmpty&&t.maxPoint>=s)),o=e.filter((t=>t.maxPoint>0||!t.isEmpty&&t.maxPoint>=s)),l=Rt(r,o,i),a=new It(r,l,s),h=new It(o,l,s);i.iterGaps(((t,e,i)=>Ft(a,t,h,e,i,n))),i.empty&&0==i.length&&Ft(a,0,h,0,0,n)}static eq(t,e,i=0,n){null==n&&(n=999999999);let s=t.filter((t=>!t.isEmpty&&e.indexOf(t)<0)),r=e.filter((e=>!e.isEmpty&&t.indexOf(e)<0));if(s.length!=r.length)return!1;if(!s.length)return!0;let o=Rt(s,r),l=new It(s,o,0).goto(i),a=new It(r,o,0).goto(i);for(;;){if(l.to!=a.to||!Vt(l.active,a.active)||l.point&&(!a.point||!l.point.eq(a.point)))return!1;if(l.to>n)return!0;l.next(),a.next()}}static spans(t,e,i,n,s=-1){let r=new It(t,null,s).goto(e),o=e,l=r.openStart;for(;;){let t=Math.min(r.to,i);if(r.point){let i=r.activeForPoint(r.to),s=r.pointFromo&&(n.span(o,t,r.active,l),l=r.openEnd(t));if(r.to>i)return l+(r.point&&r.to>i?1:0);o=r.to,r.next()}}static of(t,e=!1){let i=new Et;for(let n of t instanceof At?[t]:e?function(t){if(t.length>1)for(let e=t[0],i=1;i0)return t.slice().sort(Mt);e=n}return t}(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return Dt.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=Dt.empty;n=n.nextLayer)e=new Dt(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}}Dt.empty=new Dt([],[],null,-1),Dt.empty.nextLayer=Dt.empty;class Et{finishChunk(t){this.chunks.push(new Tt(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new Et)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return!(n<0)&&(250==this.from.length&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(Dt.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),0==this.chunks.length)return t;let e=Dt.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}}function Rt(t,e,i){let n=new Map;for(let e of t)for(let t=0;t=this.minPoint)break}}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new Bt(r,e,i,s));return 1==n.length?n[0]:new Nt(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let t=this.heap.length>>1;t>=0;t--)Lt(this.heap,t);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let t=this.heap.length>>1;t>=0;t--)Lt(this.heap,t);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(0==this.heap.length)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),Lt(this.heap,0)}}}function Lt(t,e){for(let i=t[e];;){let n=1+(e<<1);if(n>=t.length)break;let s=t[n];if(n+1=0&&(s=t[n+1],n++),i.compare(s)<0)break;t[n]=i,t[e]=s,e=n}}class It{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Nt.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){Wt(this.active,t),Wt(this.activeTo,t),Wt(this.activeRank,t),this.minActive=zt(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:s}=this.cursor;for(;e0;)e++;Ht(this.active,e,i),Ht(this.activeTo,e,n),Ht(this.activeRank,e,s),t&&Ht(t,e,this.cursor.from),this.minActive=zt(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&Wt(i,n)}else{if(!this.cursor.value){this.to=this.endSide=1e9;break}if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}{let t=this.cursor.value;if(t.point){if(!(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[e]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}}function Ft(t,e,i,n,s,r){t.goto(e),i.goto(n);let o=n+s,l=n,a=n-e;for(;;){let e=t.to+a-i.to||t.endSide-i.endSide,n=e<0?t.to+a:i.to,s=Math.min(n,o);if(t.point||i.point?t.point&&i.point&&(t.point==i.point||t.point.eq(i.point))&&Vt(t.activeForPoint(t.to),i.activeForPoint(i.to))||r.comparePoint(l,s,t.point,i.point):s>l&&!Vt(t.active,i.active)&&r.compareRange(l,s,t.active,i.active),n>o)break;l=n,e<=0&&t.next(),e>=0&&i.next()}}function Vt(t,e){if(t.length!=e.length)return!1;for(let i=0;i=e;i--)t[i+1]=t[i];t[e]=i}function zt(t,e){let i=-1,n=1e9;for(let s=0;s=e)return n;if(n==t.length)break;s+=9==t.charCodeAt(n)?i-s%i:1,n=p(t,n)}return!0===n?-1:t.length}const Ut="undefined"==typeof Symbol?"__ͼ":Symbol.for("ͼ"),Qt="undefined"==typeof Symbol?"__styleSet"+Math.floor(1e8*Math.random()):Symbol("styleSet"),Yt="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};class $t{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(t){return/^@/.test(t)?[t]:t.split(/,\s*/)}function s(t,e,r,o){let l=[],a=/^@(\w+)\b/.exec(t[0]),h=a&&"keyframes"==a[1];if(a&&null==e)return r.push(t[0]+";");for(let i in e){let o=e[i];if(/&/.test(i))s(i.split(/,\s*/).map((e=>t.map((t=>e.replace(/&/,t))))).reduce(((t,e)=>t.concat(e))),o,r);else if(o&&"object"==typeof o){if(!a)throw new RangeError("The value of a property ("+i+") should be a primitive value.");s(n(i),o,l,h)}else null!=o&&l.push(i.replace(/_.*/,"").replace(/[A-Z]/g,(t=>"-"+t.toLowerCase()))+": "+o+";")}(l.length||h)&&r.push((!i||a||o?t:t.map(i)).join(", ")+" {"+l.join(" ")+"}")}for(let e in t)s(n(e),t[e],this.rules)}getRules(){return this.rules.join("\n")}static newName(){let t=Yt[Ut]||1;return Yt[Ut]=t+1,"ͼ"+t.toString(36)}static mount(t,e,i){let n=t[Qt],s=i&&i.nonce;n?s&&n.setNonce(s):n=new jt(t,s),n.mount(Array.isArray(e)?e:[e],t)}}let _t=new Map;class jt{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let e=_t.get(i);if(e)return t[Qt]=e;this.sheet=new n.CSSStyleSheet,_t.set(i,this)}else this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);this.modules=[],t[Qt]=this}mount(t,e){let i=this.sheet,n=0,s=0;for(let e=0;e-1&&(this.modules.splice(o,1),s--,o=-1),-1==o){if(this.modules.splice(s++,0,r),i)for(let t=0;t",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Zt="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),Jt="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),te=0;te<10;te++)Kt[48+te]=Kt[96+te]=String(te);for(te=1;te<=24;te++)Kt[te+111]="F"+te;for(te=65;te<=90;te++)Kt[te]=String.fromCharCode(te+32),Gt[te]=String.fromCharCode(te);for(var ee in Kt)Gt.hasOwnProperty(ee)||(Gt[ee]=Kt[ee]);function ie(t){let e;return e=11==t.nodeType?t.getSelection?t:t.ownerDocument:t,e.getSelection()}function ne(t,e){return!!e&&(t==e||t.contains(1!=e.nodeType?e.parentNode:e))}function se(t,e){if(!e.anchorNode)return!1;try{return ne(t,e.anchorNode)}catch(t){return!1}}function re(t){return 3==t.nodeType?we(t,0,t.nodeValue.length).getClientRects():1==t.nodeType?t.getClientRects():[]}function oe(t,e,i,n){return!!i&&(he(t,e,i,n,-1)||he(t,e,i,n,1))}function le(t){for(var e=0;;e++)if(!(t=t.previousSibling))return e}function ae(t){return 1==t.nodeType&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(t.nodeName)}function he(t,e,i,n,s){for(;;){if(t==i&&e==n)return!0;if(e==(s<0?0:ce(t))){if("DIV"==t.nodeName)return!1;let i=t.parentNode;if(!i||1!=i.nodeType)return!1;e=le(t)+(s<0?0:1),t=i}else{if(1!=t.nodeType)return!1;if(1==(t=t.childNodes[e+(s<0?-1:0)]).nodeType&&"false"==t.contentEditable)return!1;e=s<0?ce(t):0}}}function ce(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function ue(t,e){let i=e?t.left:t.right;return{left:i,right:i,top:t.top,bottom:t.bottom}}function de(t){let e=t.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:t.innerWidth,top:0,bottom:t.innerHeight}}function fe(t,e){let i=e.width/t.offsetWidth,n=e.height/t.offsetHeight;return(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.width-t.offsetWidth)<1)&&(i=1),(n>.995&&n<1.005||!isFinite(n)||Math.abs(e.height-t.offsetHeight)<1)&&(n=1),{scaleX:i,scaleY:n}}class pe{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?ce(e):0),i,Math.min(t.focusOffset,i?ce(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}}let ge,me=null;function ve(t){if(t.setActive)return t.setActive();if(me)return t.focus(me);let e=[];for(let i=t;i&&(e.push(i,i.scrollTop,i.scrollLeft),i!=i.ownerDocument);i=i.parentNode);if(t.focus(null==me?{get preventScroll(){return me={preventScroll:!0},!0}}:void 0),!me){me=!1;for(let t=0;tMath.max(1,t.scrollHeight-t.clientHeight-4)}function ke(t,e){for(let i=t,n=e;;){if(3==i.nodeType&&n>0)return{node:i,offset:n};if(1==i.nodeType&&n>0){if("false"==i.contentEditable)return null;i=i.childNodes[n-1],n=ce(i)}else{if(!i.parentNode||ae(i))return null;n=le(i),i=i.parentNode}}}function Pe(t,e){for(let i=t,n=e;;){if(3==i.nodeType&&ne)return i.domBoundsAround(t,e,a);if(c>=t&&-1==n&&(n=l,s=a),a>e&&i.dom.parentNode==this.dom){r=l,o=h;break}h=c,a=c+i.breakAfter}return{from:s,to:o<0?i+this.length:o,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:r=0?this.children[r].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),1&e.flags)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,7&this.flags&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=Oe){this.markDirty();for(let n=t;nthis.pos||t==this.pos&&(e>0||0==this.i||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}}function Te(t,e,i,n,s,r,o,l,a){let{children:h}=t,c=h.length?h[e]:null,u=r.length?r[r.length-1]:null,d=u?u.breakAfter:o;if(!(e==n&&c&&!o&&!d&&r.length<2&&c.merge(i,s,r.length?u:null,0==i,l,a))){if(n0&&(!o&&r.length&&c.merge(i,c.length,r[0],!1,l,0)?c.breakAfter=r.shift().breakAfter:(i2);var qe={mac:ze||/Mac/.test(Ee.platform),windows:/Win/.test(Ee.platform),linux:/Linux|X11/.test(Ee.platform),ie:Ie,ie_version:Ne?Re.documentMode||6:Le?+Le[1]:Be?+Be[1]:0,gecko:Fe,gecko_version:Fe?+(/Firefox\/(\d+)/.exec(Ee.userAgent)||[0,0])[1]:0,chrome:!!Ve,chrome_version:Ve?+Ve[1]:0,ios:ze,android:/Android\b/.test(Ee.userAgent),webkit:We,safari:He,webkit_version:We?+(/\bAppleWebKit\/(\d+)/.exec(Ee.userAgent)||[0,0])[1]:0,tabSize:null!=Re.documentElement.style.tabSize?"tab-size":"-moz-tab-size"};class Xe extends Ce{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){3==t.nodeType&&this.createDOM(t)}merge(t,e,i){return!(8&this.flags||i&&(!(i instanceof Xe)||this.length-(e-t)+i.length>256||8&i.flags))&&(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new Xe(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=8&this.flags,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Se(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return function(t,e,i){let n=t.nodeValue.length;e>n&&(e=n);let s=e,r=e,o=0;0==e&&i<0||e==n&&i>=0?qe.chrome||qe.gecko||(e?(s--,o=1):r=0)?0:l.length-1];qe.safari&&!o&&0==a.width&&(a=Array.prototype.find.call(l,(t=>t.width))||a);return o?ue(a,o<0):a||null}(this.dom,t,e)}}class Ue extends Ce{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let t of e)t.setParent(this)}setAttrs(t){if(ye(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!(8&(this.flags|t.flags))}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?4&this.flags&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,s,r){return(!i||!(!(i instanceof Ue&&i.mark.eq(this.mark))||t&&s<=0||et&&e.push(i=t&&(n=s),i=o,s++}let r=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new Ue(this.mark,e,r)}domAtPos(t){return $e(this,t)}coordsAt(t,e){return je(this,t,e)}}class Qe extends Ce{static create(t,e,i){return new Qe(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=Qe.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){this.dom&&this.widget.updateDOM(this.dom,t)||(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,s,r){return!(i&&(!(i instanceof Qe&&this.widget.compare(i.widget))||t>0&&s<=0||e0)?Se.before(this.dom):Se.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),s=null;if(!n.length)return null;let r=this.side?this.side<0:t>0;for(let e=r?n.length-1:0;s=n[e],!(t>0?0==e:e==n.length-1||s.top0?Se.before(this.dom):Se.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return t.empty}get isHidden(){return!0}}function $e(t,e){let i=t.dom,{children:n}=t,s=0;for(let t=0;st&&e0;t--){let e=n[t-1];if(e.dom.parentNode==i)return e.domAtPos(e.length)}for(let t=s;t0&&e instanceof Ue&&s.length&&(n=s[s.length-1])instanceof Ue&&n.mark.eq(e.mark)?_e(n,e.children[0],i-1):(s.push(e),e.setParent(t)),t.length+=e.length}function je(t,e,i){let n=null,s=-1,r=null,o=-1;!function t(e,l){for(let a=0,h=0;a=l&&(c.children.length?t(c,l-h):(!r||r.isHidden&&i>0)&&(u>l||h==u&&c.getSide()>0)?(r=c,o=l-h):(h-1?1:0)!=s.length-(i&&s.indexOf(i)>-1?1:0))return!1;for(let r of n)if(r!=i&&(-1==s.indexOf(r)||t[r]!==e[r]))return!1;return!0}function Je(t,e,i){let n=!1;if(e)for(let s in e)i&&s in i||(n=!0,"style"==s?t.style.cssText="":t.removeAttribute(s));if(i)for(let s in i)e&&e[s]==i[s]||(n=!0,"style"==s?t.style.cssText=i[s]:t.setAttribute(s,i[s]));return n}function ti(t){let e=Object.create(null);for(let i=0;i0?3e8:-4e8:e>0?1e8:-1e8,new oi(t,e,e,i,t.widget||null,!1)}static replace(t){let e,i,n=!!t.block;if(t.isBlockGap)e=-5e8,i=4e8;else{let{start:s,end:r}=li(t,n);e=(s?n?-3e8:-1:5e8)-1,i=1+(r?n?2e8:1:-6e8)}return new oi(t,e,i,n,t.widget||null,!0)}static line(t){return new ri(t)}static set(t,e=!1){return Dt.of(t,e)}hasHeight(){return!!this.widget&&this.widget.estimatedHeight>-1}}ni.none=Dt.empty;class si extends ni{constructor(t){let{start:e,end:i}=li(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof si&&this.tagName==t.tagName&&(this.class||(null===(e=this.attrs)||void 0===e?void 0:e.class))==(t.class||(null===(i=t.attrs)||void 0===i?void 0:i.class))&&Ze(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}}si.prototype.point=!1;class ri extends ni{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof ri&&this.spec.class==t.spec.class&&Ze(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}}ri.prototype.mapMode=P.TrackBefore,ri.prototype.point=!0;class oi extends ni{constructor(t,e,i,n,s,r){super(e,i,s,t),this.block=n,this.isReplace=r,this.mapMode=n?e<=0?P.TrackBefore:P.TrackAfter:P.TrackDel}get type(){return this.startSide!=this.endSide?ii.WidgetRange:this.startSide<=0?ii.WidgetBefore:ii.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof oi&&(e=this.widget,i=t.widget,e==i||!!(e&&i&&e.compare(i)))&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide;var e,i}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}}function li(t,e=!1){let{inclusiveStart:i,inclusiveEnd:n}=t;return null==i&&(i=t.inclusive),null==n&&(n=t.inclusive),{start:null!=i?i:e,end:null!=n?n:e}}function ai(t,e,i,n=0){let s=i.length-1;s>=0&&i[s]+n>=t?i[s]=Math.max(i[s],e):i.push(t,e)}oi.prototype.point=!0;class hi extends Ce{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,n,s,r){if(i){if(!(i instanceof hi))return!1;this.dom||i.transferDOM(this)}return n&&this.setDeco(i?i.attrs:null),De(this,t,e,i?i.children.slice():[],s,r),!0}split(t){let e=new hi;if(e.breakAfter=this.breakAfter,0==this.length)return e;let{i:i,off:n}=this.childPos(t);n&&(e.append(this.children[i].split(n),0),this.children[i].merge(n,this.children[i].length,null,!1,0,0),i++);for(let t=i;t0&&0==this.children[i-1].length;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=void 0===this.prevAttrs?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Ze(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){_e(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Ke(e,this.attrs||{})),i&&(this.attrs=Ke({class:i},this.attrs||{}))}domAtPos(t){return $e(this,t)}reuseDOM(t){"DIV"==t.nodeName&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?4&this.flags&&(ye(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),void 0!==this.prevAttrs&&(Je(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&Ce.get(n)instanceof Ue;)n=n.lastChild;if(!(n&&this.length&&("BR"==n.nodeName||0!=(null===(i=Ce.get(n))||void 0===i?void 0:i.isEditable)||qe.ios&&this.children.some((t=>t instanceof Xe))))){let t=document.createElement("BR");t.cmIgnore=!0,this.dom.appendChild(t)}}measureTextSize(){if(0==this.children.length||this.length>20)return null;let t,e=0;for(let i of this.children){if(!(i instanceof Xe)||/[^ -~]/.test(i.text))return null;let n=re(i.dom);if(1!=n.length)return null;e+=n[0].width,t=n[0].height}return e?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:e/this.length,textHeight:t}:null}coordsAt(t,e){let i=je(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:t}=this.parent.view.viewState,e=i.bottom-i.top;if(Math.abs(e-t.lineHeight)<2&&t.textHeight=e){if(s instanceof hi)return s;if(r>e)break}n=r+s.breakAfter}return null}}class ci extends Ce{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,s,r){return!(i&&(!(i instanceof ci&&this.widget.compare(i.widget))||t>0&&s<=0||e0)}}class ui extends ei{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}}class di{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(0==this.content.length)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof ci&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new hi),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(fi(new Ye(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,this.posCovered()||t&&this.content.length&&this.content[this.content.length-1]instanceof ci||this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:e,lineBreak:i,done:n}=this.cursor.next(this.skip);if(this.skip=0,n)throw new Error("Ran out of text content when drawing inline views");if(i){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}this.text=e,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(fi(new Xe(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,s,r){if(this.disallowBlockEffectsFor[r]&&i instanceof oi){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let o=e-t;if(i instanceof oi)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new ci(i.widget||pi.block,o,i));else{let r=Qe.create(i.widget||pi.inline,o,o?0:i.startSide),l=this.atCursorPos&&!r.isEditable&&s<=n.length&&(t0),a=!r.isEditable&&(tn.length||i.startSide<=0),h=this.getLine();2!=this.pendingBuffer||l||r.isEditable||(this.pendingBuffer=0),this.flushBuffer(n),l&&(h.append(fi(new Ye(1),n),s),s=n.length+Math.max(0,s-n.length)),h.append(fi(r,n),s),this.atCursorPos=a,this.pendingBuffer=a?tn.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);o&&(this.textOff+o<=this.text.length?this.textOff+=o:(this.skip+=o-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=s)}static build(t,e,i,n,s){let r=new di(t,e,i,s);return r.openEnd=Dt.spans(n,e,i,r),r.openStart<0&&(r.openStart=r.openEnd),r.finish(r.openEnd),r}}function fi(t,e){for(let i of e)t=new Ue(i,[t],t.length);return t}class pi extends ei{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}pi.inline=new pi("span"),pi.block=new pi("div");var gi=function(t){return t[t.LTR=0]="LTR",t[t.RTL=1]="RTL",t}(gi||(gi={}));const mi=gi.LTR,vi=gi.RTL;function wi(t){let e=[];for(let i=0;i=e){if(o.level==i)return r;(s<0||(0!=n?n<0?o.frome:t[s].level>o.level))&&(s=r)}}if(s<0)throw new RangeError("Index out of range");return s}}function Ci(t,e){if(t.length!=e.length)return!1;for(let i=0;ia&&o.push(new Oi(a,p.from,d)),Ti(t,p.direction==mi!=!(d%2)?n+1:n,s,p.inner,p.from,p.to,o),a=p.to}f=p.to}else{if(f==i||(e?Ai[f]!=l:Ai[f]==l))break;f++}u?Mi(t,a,f,n+1,s,u,o):ae;){let i=!0,c=!1;if(!h||a>r[h-1].to){let t=Ai[a-1];t!=l&&(i=!1,c=16==t)}let u=i||1!=l?null:[],d=i?n:n+1,f=a;t:for(;;)if(h&&f==r[h-1].to){if(c)break t;let p=r[--h];if(!i)for(let t=p.from,i=h;;){if(t==e)break t;if(!i||r[i-1].to!=t){if(Ai[t-1]==l)break t;break}t=r[--i].from}if(u)u.push(p);else{p.to=0;t-=3)if(ki[t+1]==-i){let e=ki[t+2],i=2&e?s:4&e?1&e?r:s:0;i&&(Ai[o]=Ai[ki[t]]=i),l=t;break}}else{if(189==ki.length)break;ki[l++]=o,ki[l++]=e,ki[l++]=a}else if(2==(n=Ai[o])||1==n){let t=n==s;a=t?0:1;for(let e=l-3;e>=0;e-=3){let i=ki[e+2];if(2&i)break;if(t)ki[e+2]|=2;else{if(4&i)break;ki[e+2]|=4}}}}}(t,s,r,n,l),function(t,e,i,n){for(let s=0,r=n;s<=i.length;s++){let o=s?i[s-1].to:t,l=sa;)e==r&&(e=i[--n].from,r=n?i[n-1].to:t),Ai[--e]=c;a=o}else r=o,a++}}}(s,r,n,l),Mi(t,s,r,e,i,n,o)}function Di(t){return[new Oi(0,t,0)]}let Ei="";function Ri(t,e,i,n,s){var r;let o=n.head-t.from,l=Oi.find(e,o,null!==(r=n.bidiLevel)&&void 0!==r?r:-1,n.assoc),a=e[l],h=a.side(s,i);if(o==h){let t=l+=s?1:-1;if(t<0||t>=e.length)return null;a=e[l=t],o=a.side(!s,i),h=a.side(s,i)}let c=p(t.text,o,a.forward(s,i));(ca.to)&&(c=h),Ei=t.text.slice(Math.min(o,c),Math.max(o,c));let u=l==(s?e.length-1:0)?null:e[l+(s?1:-1)];return u&&c==h&&u.level+(s?0:1)t.some((t=>t))}),qi=I.define({combine:t=>t.some((t=>t))}),Xi=I.define();class Ui{constructor(t,e="nearest",i="nearest",n=5,s=5,r=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=s,this.isSnapshot=r}map(t){return t.empty?this:new Ui(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new Ui(B.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const Qi=dt.define({map:(t,e)=>t.map(e)}),Yi=dt.define();function $i(t,e,i){let n=t.facet(Fi);n.length?n[0](e):window.onerror?window.onerror(String(e),i,void 0,void 0,e):i?console.error(i+":",e):console.error(e)}const _i=I.define({combine:t=>!t.length||t[0]});let ji=0;const Ki=I.define();class Gi{constructor(t,e,i,n,s){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=s(this)}static define(t,e){const{eventHandlers:i,eventObservers:n,provide:s,decorations:r}=e||{};return new Gi(ji++,t,i,n,(t=>{let e=[Ki.of(t)];return r&&e.push(en.of((e=>{let i=e.plugin(t);return i?r(i):ni.none}))),s&&e.push(s(t)),e}))}static fromClass(t,e){return Gi.define((e=>new t(e)),e)}}class Zi{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(e){if($i(t.state,e,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(t){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){$i(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(null===(e=this.value)||void 0===e?void 0:e.destroy)try{this.value.destroy()}catch(e){$i(t.state,e,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const Ji=I.define(),tn=I.define(),en=I.define(),nn=I.define(),sn=I.define(),rn=I.define();function on(t,e){let i=t.state.facet(rn);if(!i.length)return i;let n=i.map((e=>e instanceof Function?e(t):e)),s=[];return Dt.spans(n,e.from,e.to,{point(){},span(t,i,n,r){let o=t-e.from,l=i-e.from,a=s;for(let t=n.length-1;t>=0;t--,r--){let i,s=n[t].spec.bidiIsolate;if(null==s&&(s=Bi(e.text,o,l)),r>0&&a.length&&(i=a[a.length-1]).to==o&&i.direction==s)i.to=l,a=i.inner;else{let t={from:o,to:l,direction:s,inner:[]};a.push(t),a=t.inner}}}}),s}const ln=I.define();function an(t){let e=0,i=0,n=0,s=0;for(let r of t.state.facet(ln)){let o=r(t);o&&(null!=o.left&&(e=Math.max(e,o.left)),null!=o.right&&(i=Math.max(i,o.right)),null!=o.top&&(n=Math.max(n,o.top)),null!=o.bottom&&(s=Math.max(s,o.bottom)))}return{left:e,right:i,top:n,bottom:s}}const hn=I.define();class cn{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new cn(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toAh)break;s+=2}if(!l)return i;new cn(l.fromA,l.toA,l.fromB,l.toB).addToSet(i),r=l.toA,o=l.toB}}}class un{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=O.empty(this.startState.doc.length);for(let t of i)this.changes=this.changes.compose(t.changes);let n=[];this.changes.iterChangedRanges(((t,e,i,s)=>n.push(new cn(t,e,i,s)))),this.changedRanges=n}static create(t,e,i){return new un(t,e,i)}get viewportChanged(){return(4&this.flags)>0}get heightChanged(){return(2&this.flags)>0}get geometryChanged(){return this.docChanged||(10&this.flags)>0}get focusChanged(){return(1&this.flags)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some((t=>t.selection))}get empty(){return 0==this.flags&&0==this.transactions.length}}class dn extends Ce{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=ni.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new hi],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new cn(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every((({fromA:t,toA:e})=>ethis.minWidthTo))?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(t);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&((null===(e=this.domChanged)||void 0===e?void 0:e.newSel)?n=this.domChanged.newSel.head:function(t,e){let i=!1;e&&t.iterChangedRanges(((t,n)=>{te.from&&(i=!0)}));return i}(t.changes,this.hasComposition)||t.selectionSet||(n=t.state.selection.main.head));let s=n>-1?function(t,e,i){let n=fn(t,i);if(!n)return null;let{node:s,from:r,to:o}=n,l=s.nodeValue;if(/[\n\r]/.test(l))return null;if(t.state.doc.sliceString(n.from,n.to)!=l)return null;let a=e.invertedDesc,h=new cn(a.mapPos(r),a.mapPos(o),r,o),c=[];for(let e=s.parentNode;;e=e.parentNode){let i=Ce.get(e);if(i instanceof Ue)c.push({node:e,deco:i.mark});else{if(i instanceof hi||"DIV"==e.nodeName&&e.parentNode==t.contentDOM)return{range:h,text:s,marks:c,line:e};if(e==t.contentDOM)return null;c.push({node:e,deco:new si({inclusive:!0,attributes:ti(e),tagName:e.tagName.toLowerCase()})})}}}(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:e,to:n}=this.hasComposition;i=new cn(e,n,t.changes.mapPos(e,-1),t.changes.mapPos(n,1)).addToSet(i.slice())}this.hasComposition=s?{from:s.range.fromB,to:s.range.toB}:null,(qe.ie||qe.chrome)&&!s&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let r=function(t,e,i){let n=new pn;return Dt.compare(t,e,i,n),n.changes}(this.decorations,this.updateDeco(),t.changes);return i=cn.extendWithRanges(i,r),!!(7&this.flags||0!=i.length)&&(this.updateInner(i,t.startState.doc.length,s),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore((()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let t=qe.chrome||qe.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,t),this.flags&=-8,t&&(t.written||n.selectionRange.focusNode!=t.node)&&(this.forceSelection=!0),this.dom.style.height=""})),this.markedForComposition.forEach((t=>t.flags&=-9));let s=[];if(this.view.viewport.from||this.view.viewport.to=0?n[t]:null;if(!e)break;let r,o,l,a,{fromA:h,toA:c,fromB:u,toB:d}=e;if(i&&i.range.fromBu){let t=di.build(this.view.state.doc,u,i.range.fromB,this.decorations,this.dynamicDecorationMap),e=di.build(this.view.state.doc,i.range.toB,d,this.decorations,this.dynamicDecorationMap);o=t.breakAtStart,l=t.openStart,a=e.openEnd;let n=this.compositionView(i);e.breakAtStart?n.breakAfter=1:e.content.length&&n.merge(n.length,n.length,e.content[0],!1,e.openStart,0)&&(n.breakAfter=e.content[0].breakAfter,e.content.shift()),t.content.length&&n.merge(0,0,t.content[t.content.length-1],!0,0,t.openEnd)&&t.content.pop(),r=t.content.concat(n).concat(e.content)}else({content:r,breakAtStart:o,openStart:l,openEnd:a}=di.build(this.view.state.doc,u,d,this.decorations,this.dynamicDecorationMap));let{i:f,off:p}=s.findPos(c,1),{i:g,off:m}=s.findPos(h,-1);Te(this,g,m,f,p,r,o,l,a)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(t){this.editContextFormatting=this.editContextFormatting.map(t.changes);for(let e of t.transactions)for(let t of e.effects)t.is(Yi)&&(this.editContextFormatting=t.value)}compositionView(t){let e=new Xe(t.text.nodeValue);e.flags|=8;for(let{deco:i}of t.marks)e=new Ue(i,[e],e.length);let i=new hi;return i.append(e,0),i}fixCompositionDOM(t){let e=(t,e)=>{e.flags|=8|(e.children.some((t=>7&t.flags))?1:0),this.markedForComposition.add(e);let i=Ce.get(t);i&&i!=e&&(i.dom=null),e.setDOM(t)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let s=t.marks.length-1;s>=-1;s--)i=n.childPos(i.off,1),n=n.children[i.i],e(s>=0?t.marks[s].node:t.text,n)}updateSelection(t=!1,e=!1){!t&&this.view.observer.selectionRange.focusNode||this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,s=!n&&se(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||s))return;let r=this.forceSelection;this.forceSelection=!1;let o=this.view.state.selection.main,l=this.moveToLine(this.domAtPos(o.anchor)),a=o.empty?l:this.moveToLine(this.domAtPos(o.head));if(qe.gecko&&o.empty&&!this.hasComposition&&(1==(h=l).node.nodeType&&h.node.firstChild&&(0==h.offset||"false"==h.node.childNodes[h.offset-1].contentEditable)&&(h.offset==h.node.childNodes.length||"false"==h.node.childNodes[h.offset].contentEditable))){let t=document.createTextNode("");this.view.observer.ignore((()=>l.node.insertBefore(t,l.node.childNodes[l.offset]||null))),l=a=new Se(t,0),r=!0}var h;let c=this.view.observer.selectionRange;!r&&c.focusNode&&(oe(l.node,l.offset,c.anchorNode,c.anchorOffset)&&oe(a.node,a.offset,c.focusNode,c.focusOffset)||this.suppressWidgetCursorChange(c,o))||(this.view.observer.ignore((()=>{qe.android&&qe.chrome&&this.dom.contains(c.focusNode)&&function(t,e){for(let i=t;i&&i!=e;i=i.assignedSlot||i.parentNode)if(1==i.nodeType&&"false"==i.contentEditable)return!0;return!1}(c.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let t=ie(this.view.root);if(t)if(o.empty){if(qe.gecko){let t=(e=l.node,n=l.offset,1!=e.nodeType?0:(n&&"false"==e.childNodes[n-1].contentEditable?1:0)|(no.head&&([l,a]=[a,l]),e.setEnd(a.node,a.offset),e.setStart(l.node,l.offset),t.removeAllRanges(),t.addRange(e)}else;var e,n;s&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())})),this.view.observer.setSelectionRange(l,a)),this.impreciseAnchor=l.precise?null:new Se(c.anchorNode,c.anchorOffset),this.impreciseHead=a.precise?null:new Se(c.focusNode,c.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&oe(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=ie(t.root),{anchorNode:n,anchorOffset:s}=t.observer.selectionRange;if(!(i&&e.empty&&e.assoc&&i.modify))return;let r=hi.find(this,e.head);if(!r)return;let o=r.posAtStart;if(e.head==o||e.head==o+r.length)return;let l=this.coordsAt(e.head,-1),a=this.coordsAt(e.head,1);if(!l||!a||l.bottom>a.top)return;let h=this.domAtPos(e.head+e.assoc);i.collapse(h.node,h.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(n,s)}moveToLine(t){let e,i=this.dom;if(t.node!=i)return t;for(let n=t.offset;!e&&n=0;n--){let t=Ce.get(i.childNodes[n]);t instanceof hi&&(e=t.domAtPos(t.length))}return e?new Se(e.node,e.offset,!0):t}nearest(t){for(let e=t;e;){let t=Ce.get(e);if(t&&t.rootView==this)return t;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;r--){let o=this.children[r],l=s-o.breakAfter,a=l-o.length;if(lt||o.covers(1))&&(!i||o instanceof hi&&!(i instanceof hi&&e>=0)))i=o,n=a;else if(i&&a==t&&l==t&&o instanceof ci&&Math.abs(e)<2){if(o.deco.startSide<0)break;r&&(i=null)}s=a}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof hi))return null;for(;n.children.length;){let{i:t,off:e}=n.childPos(i,1);for(;;t++){if(t==n.children.length)return null;if((n=n.children[t]).length)break}i=e}if(!(n instanceof Xe))return null;let s=p(n.text,i);if(s==i)return null;let r=we(n.dom,i,s).getClientRects();for(let t=0;tMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,o=-1,l=this.view.textDirection==gi.LTR;for(let t=0,a=0;an)break;if(t>=i){let i=h.dom.getBoundingClientRect();if(e.push(i.height),r){let e=h.dom.lastChild,n=e?re(e):[];if(n.length){let e=n[n.length-1],r=l?e.right-i.left:i.right-e.left;r>o&&(o=r,this.minWidth=s,this.minWidthFrom=t,this.minWidthTo=c)}}}t=c+h.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return"rtl"==getComputedStyle(this.children[e].dom).direction?gi.RTL:gi.LTR}measureTextSize(){for(let t of this.children)if(t instanceof hi){let e=t.measureTextSize();if(e)return e}let t,e,i,n=document.createElement("div");return n.className="cm-line",n.style.width="99999px",n.style.position="absolute",n.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore((()=>{this.dom.appendChild(n);let s=re(n.firstChild)[0];t=n.getBoundingClientRect().height,e=s?s.width/27:7,i=s?s.height:t,n.remove()})),{lineHeight:t,charWidth:e,textHeight:i}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new Me(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let s=n==e.viewports.length?null:e.viewports[n],r=s?s.from-1:this.length;if(r>i){let n=(e.lineBlockAt(r).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(ni.replace({widget:new ui(n),block:!0,inclusive:!0,isBlockGap:!0}).range(i,r))}if(!s)break;i=s.to+1}return ni.set(t)}updateDeco(){let t=1,e=this.view.state.facet(en).map((e=>(this.dynamicDecorationMap[t++]="function"==typeof e)?e(this.view):e)),i=!1,n=this.view.state.facet(nn).map(((t,e)=>{let n="function"==typeof t;return n&&(i=!0),n?t(this.view):t}));for(n.length&&(this.dynamicDecorationMap[t++]=i,e.push(Dt.join(n))),this.decorations=[this.editContextFormatting,...e,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];ti.anchor?-1:1);if(!n)return;!i.empty&&(e=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,e.left),top:Math.min(n.top,e.top),right:Math.max(n.right,e.right),bottom:Math.max(n.bottom,e.bottom)});let s=an(this.view),r={left:n.left-s.left,top:n.top-s.top,right:n.right+s.right,bottom:n.bottom+s.bottom},{offsetWidth:o,offsetHeight:l}=this.view.scrollDOM;!function(t,e,i,n,s,r,o,l){let a=t.ownerDocument,h=a.defaultView||window;for(let c=t,u=!1;c&&!u;)if(1==c.nodeType){let t,d=c==a.body,f=1,p=1;if(d)t=de(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(u=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let e=c.getBoundingClientRect();({scaleX:f,scaleY:p}=fe(c,e)),t={left:e.left,right:e.left+c.clientWidth*f,top:e.top,bottom:e.top+c.clientHeight*p}}let g=0,m=0;if("nearest"==s)e.top0&&e.bottom>t.bottom+m&&(m=e.bottom-t.bottom+m+o)):e.bottom>t.bottom&&(m=e.bottom-t.bottom+o,i<0&&e.top-m0&&e.right>t.right+g&&(g=e.right-t.right+g+r)):e.right>t.right&&(g=e.right-t.right+r,i<0&&e.leftt?e.left-t:Math.max(0,t-e.right)}function mn(t,e){return e.top>t?e.top-t:Math.max(0,t-e.bottom)}function vn(t,e){return t.tope.top+1}function wn(t,e){return et.bottom?{top:t.top,left:t.left,right:t.right,bottom:e}:t}function yn(t,e,i){let n,s,r,o,l,a,h,c,u=!1;for(let d=t.firstChild;d;d=d.nextSibling){let t=re(d);for(let f=0;fm||o==m&&r>g){n=d,s=p,r=g,o=m;let l=m?i0?f0)}0==g?i>p.bottom&&(!h||h.bottomp.top)&&(a=d,c=p):h&&vn(h,p)?h=bn(h,p.bottom):c&&vn(c,p)&&(c=wn(c,p.top))}}if(h&&h.bottom>=i?(n=l,s=h):c&&c.top<=i&&(n=a,s=c),!n)return{node:t,offset:0};let d=Math.max(s.left,Math.min(s.right,e));return 3==n.nodeType?xn(n,d,i):u&&"false"!=n.contentEditable?yn(n,d,i):{node:t,offset:Array.prototype.indexOf.call(t.childNodes,n)+(e>=(s.left+s.right)/2?1:0)}}function xn(t,e,i){let n=t.nodeValue.length,s=-1,r=1e9,o=0;for(let l=0;li?h.top-i:i-h.bottom)-1;if(h.left-1<=e&&h.right+1>=e&&c=(h.left+h.right)/2,n=i;if(qe.chrome||qe.gecko){we(t,l).getBoundingClientRect().left==h.right&&(n=!i)}if(c<=0)return{node:t,offset:l+(n?1:0)};s=l+(n?1:0),r=c}}}return{node:t,offset:s>-1?s:o>0?t.nodeValue.length:0}}function kn(t,e,i,n=-1){var s,r;let o,l=t.contentDOM.getBoundingClientRect(),a=l.top+t.viewState.paddingTop,{docHeight:h}=t.viewState,{x:c,y:u}=e,d=u-a;if(d<0)return 0;if(d>h)return t.state.doc.length;for(let e=t.viewState.heightOracle.textHeight/2,s=!1;o=t.elementAtHeight(d),o.type!=ii.Text;)for(;d=n>0?o.bottom+e:o.top-e,!(d>=0&&d<=h);){if(s)return i?null:0;s=!0,n=-n}u=a+d;let f=o.from;if(ft.viewport.to)return t.viewport.to==t.state.doc.length?t.state.doc.length:i?null:Pn(t,l,o,c,u);let p=t.dom.ownerDocument,g=t.root.elementFromPoint?t.root:p,m=g.elementFromPoint(c,u);m&&!t.contentDOM.contains(m)&&(m=null),m||(c=Math.max(l.left+1,Math.min(l.right-1,c)),m=g.elementFromPoint(c,u),m&&!t.contentDOM.contains(m)&&(m=null));let v,w=-1;if(m&&0!=(null===(s=t.docView.nearest(m))||void 0===s?void 0:s.isEditable))if(p.caretPositionFromPoint){let t=p.caretPositionFromPoint(c,u);t&&({offsetNode:v,offset:w}=t)}else if(p.caretRangeFromPoint){let e=p.caretRangeFromPoint(c,u);e&&(({startContainer:v,startOffset:w}=e),(!t.contentDOM.contains(v)||qe.safari&&function(t,e,i){let n;if(3!=t.nodeType||e!=(n=t.nodeValue.length))return!1;for(let e=t.nextSibling;e;e=e.nextSibling)if(1!=e.nodeType||"BR"!=e.nodeName)return!1;return we(t,n-1,n).getBoundingClientRect().left>i}(v,w,c)||qe.chrome&&function(t,e,i){if(0!=e)return!1;for(let e=t;;){let t=e.parentNode;if(!t||1!=t.nodeType||t.firstChild!=e)return!1;if(t.classList.contains("cm-line"))break;e=t}let n=1==t.nodeType?t.getBoundingClientRect():we(t,0,Math.max(t.nodeValue.length,1)).getBoundingClientRect();return i-n.left>5}(v,w,c))&&(v=void 0))}if(!v||!t.docView.dom.contains(v)){let e=hi.find(t.docView,f);if(!e)return d>o.top+o.height/2?o.to:o.from;({node:v,offset:w}=yn(e.dom,c,u))}let b=t.docView.nearest(v);if(!b)return null;if(b.isWidget&&1==(null===(r=b.dom)||void 0===r?void 0:r.nodeType)){let t=b.dom.getBoundingClientRect();return e.y1.5*t.defaultLineHeight){let e=t.viewState.heightOracle.textHeight;r+=Math.floor((s-i.top-.5*(t.defaultLineHeight-e))/e)*t.viewState.heightOracle.lineLength}let o=t.state.sliceDoc(i.from,i.to);return i.from+Xt(o,r,t.state.tabSize)}function Sn(t,e){let i=t.lineBlockAt(e);if(Array.isArray(i.type))for(let t of i.type)if(t.to>e||t.to==e&&(t.to==i.to||t.type==ii.Text))return t;return i}function On(t,e,i,n){let s=t.state.doc.lineAt(e.head),r=t.bidiSpans(s),o=t.textDirectionAt(s.from);for(let l=e,a=null;;){let e=Ri(s,r,o,l,i),h=Ei;if(!e){if(s.number==(i?t.state.doc.lines:1))return l;h="\n",s=t.state.doc.line(s.number+(i?1:-1)),r=t.bidiSpans(s),e=t.visualLineSide(s,!i)}if(a){if(!a(h))return l}else{if(!n)return e;a=n(h)}l=e}}function Cn(t,e,i){for(;;){let n=0;for(let s of t)s.between(e-1,e+1,((t,s,r)=>{if(e>t&&ee(t))),i.from,e.head>i.from?-1:1);return n==i.from?i:B.cursor(n,nt)&&this.lineBreak(),n=s}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let s,r=-1,o=1;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(s=n.exec(e))&&(r=s.index,o=s[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let e of this.points)e.node==t&&e.pos>this.text.length&&(e.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=Ce.get(t),i=e&&e.overrideDOMText;if(null!=i){this.findPointInside(t,i.length);for(let t=i.iter();!t.next().done;)t.lineBreak?this.lineBreak():this.append(t.value)}else 3==t.nodeType?this.readTextNode(t):"BR"==t.nodeName?t.nextSibling&&this.lineBreak():1==t.nodeType&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(3==t.nodeType?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(Dn(t,i.node,i.offset)?e:0))}}function Dn(t,e,i){for(;;){if(!e||i-1;let{impreciseHead:s,impreciseAnchor:r}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let e=s||r?[]:function(t){let e=[];if(t.root.activeElement!=t.contentDOM)return e;let{anchorNode:i,anchorOffset:n,focusNode:s,focusOffset:r}=t.observer.selectionRange;i&&(e.push(new En(i,n)),s==i&&r==n||e.push(new En(s,r)));return e}(t),i=new Tn(e,t.state);i.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=i.text,this.newSel=function(t,e){if(0==t.length)return null;let i=t[0].pos,n=2==t.length?t[1].pos:i;return i>-1&&n>-1?B.single(i+e,n+e):null}(e,this.bounds.from)}else{let e=t.observer.selectionRange,i=s&&s.node==e.focusNode&&s.offset==e.focusOffset||!ne(t.contentDOM,e.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(e.focusNode,e.focusOffset),n=r&&r.node==e.anchorNode&&r.offset==e.anchorOffset||!ne(t.contentDOM,e.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(e.anchorNode,e.anchorOffset),o=t.viewport;if((qe.ios||qe.chrome)&&t.state.selection.main.empty&&i!=n&&(o.from>0||o.toDate.now()-100?e.inputState.lastKeyCode:-1;if(i.bounds){let{from:s,to:l}=i.bounds,a=r.from,h=null;(8===o||qe.android&&i.text.length0&&l>0&&t.charCodeAt(o-1)==e.charCodeAt(l-1);)o--,l--;if("end"==n){i-=o+Math.max(0,r-Math.min(o,l))-r}if(o=o?r-i:0,l=r+(l-o),o=r}else if(l=l?r-i:0,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}(e.state.doc.sliceString(s,l,Mn),i.text,a-s,h);c&&(qe.chrome&&13==o&&c.toB==c.from+2&&i.text.slice(c.from,c.toB)==Mn+Mn&&c.toB--,n={from:s+c.from,to:s+c.toA,insert:t.of(i.text.slice(c.from,c.toB).split(Mn))})}else s&&(!e.hasFocus&&e.state.facet(_i)||s.main.eq(r))&&(s=null);if(!n&&!s)return!1;if(!n&&i.typeOver&&!r.empty&&s&&s.main.empty?n={from:r.from,to:r.to,insert:e.state.doc.slice(r.from,r.to)}:n&&n.from>=r.from&&n.to<=r.to&&(n.from!=r.from||n.to!=r.to)&&r.to-r.from-(n.to-n.from)<=4?n={from:r.from,to:r.to,insert:e.state.doc.slice(r.from,n.from).append(n.insert).append(e.state.doc.slice(n.to,r.to))}:(qe.mac||qe.android)&&n&&n.from==n.to&&n.from==r.head-1&&/^\. ?$/.test(n.insert.toString())&&"off"==e.contentDOM.getAttribute("autocorrect")?(s&&2==n.insert.length&&(s=B.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:t.of([" "])}):qe.chrome&&n&&n.from==n.to&&n.from==r.head&&"\n "==n.insert.toString()&&e.lineWrapping&&(s&&(s=B.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:t.of([" "])}),n)return Nn(e,n,s,o);if(s&&!s.main.eq(r)){let t=!1,i="select";return e.inputState.lastSelectionTime>Date.now()-50&&("select"==e.inputState.lastSelectionOrigin&&(t=!0),i=e.inputState.lastSelectionOrigin),e.dispatch({selection:s,scrollIntoView:t,userEvent:i}),!0}return!1}function Nn(t,e,i,n=-1){if(qe.ios&&t.inputState.flushIOSKey(e))return!0;let s=t.state.selection.main;if(qe.android&&(e.to==s.to&&(e.from==s.from||e.from==s.from-1&&" "==t.state.sliceDoc(e.from,s.from))&&1==e.insert.length&&2==e.insert.lines&&be(t.contentDOM,"Enter",13)||(e.from==s.from-1&&e.to==s.to&&0==e.insert.length||8==n&&e.insert.lengths.head)&&be(t.contentDOM,"Backspace",8)||e.from==s.from&&e.to==s.to+1&&0==e.insert.length&&be(t.contentDOM,"Delete",46)))return!0;let r,o=e.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let l=()=>r||(r=function(t,e,i){let n,s=t.state,r=s.selection.main;if(e.from>=r.from&&e.to<=r.to&&e.to-e.from>=(r.to-r.from)/3&&(!i||i.main.empty&&i.main.from==e.from+e.insert.length)&&t.inputState.composing<0){let i=r.frome.to?s.sliceDoc(e.to,r.to):"";n=s.replaceSelection(t.state.toText(i+e.insert.sliceString(0,void 0,t.state.lineBreak)+o))}else{let o=s.changes(e),l=i&&i.main.to<=o.newLength?i.main:void 0;if(s.selection.ranges.length>1&&t.inputState.composing>=0&&e.to<=r.to&&e.to>=r.to-10){let a,h=t.state.sliceDoc(e.from,e.to),c=i&&fn(t,i.main.head);if(c){let t=e.insert.length-(e.to-e.from);a={from:c.from,to:c.to-t}}else a=t.state.doc.lineAt(r.head);let u=r.to-e.to,d=r.to-r.from;n=s.changeByRange((i=>{if(i.from==r.from&&i.to==r.to)return{changes:o,range:l||i.map(o)};let n=i.to-u,c=n-h.length;if(i.to-i.from!=d||t.state.sliceDoc(c,n)!=h||i.to>=a.from&&i.from<=a.to)return{range:i};let f=s.changes({from:c,to:n,insert:e.insert}),p=i.to-r.to;return{changes:f,range:l?B.range(Math.max(0,l.anchor+p),Math.max(0,l.head+p)):i.map(f)}}))}else n={changes:o,selection:l&&s.selection.replaceRange(l)}}let o="input.type";(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,o+=".compose",t.inputState.compositionFirstChange&&(o+=".start",t.inputState.compositionFirstChange=!1));return s.update(n,{userEvent:o,scrollIntoView:!0})}(t,e,i));return t.state.facet(Wi).some((i=>i(t,e.from,e.to,o,l)))||t.dispatch(l()),!0}class Ln{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,qe.safari&&t.contentDOM.addEventListener("input",(()=>null)),qe.gecko&&function(t){ls.has(t)||(ls.add(t),t.addEventListener("copy",(()=>{})),t.addEventListener("cut",(()=>{})))}(t.contentDOM.ownerDocument)}handleEvent(t){(function(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let i,n=e.target;n!=t.contentDOM;n=n.parentNode)if(!n||11==n.nodeType||(i=Ce.get(n))&&i.ignoreEvent(e))return!1;return!0})(this.view,t)&&!this.ignoreDuringComposition(t)&&("keydown"==t.type&&this.keydown(t)||this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let t of i.observers)t(this.view,e);for(let t of i.handlers){if(e.defaultPrevented)break;if(t(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=Fn(t),i=this.handlers,n=this.view.contentDOM;for(let t in e)if("scroll"!=t){let s=!e[t].handlers.length,r=i[t];r&&s!=!r.handlers.length&&(n.removeEventListener(t,this.handleEvent),r=null),r||n.addEventListener(t,this.handleEvent,{passive:s})}for(let t in i)"scroll"==t||e[t]||n.removeEventListener(t,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),9==t.keyCode&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&27!=t.keyCode&&Hn.indexOf(t.keyCode)<0&&(this.tabFocusMode=-1),qe.android&&qe.chrome&&!t.synthetic&&(13==t.keyCode||8==t.keyCode))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return!qe.ios||t.synthetic||t.altKey||t.metaKey||!((e=Vn.find((e=>e.keyCode==t.keyCode)))&&!t.ctrlKey||Wn.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(229!=t.keyCode&&this.view.observer.forceFlush(),!1):(this.pendingIOSKey=e||t,setTimeout((()=>this.flushIOSKey()),250),!0)}flushIOSKey(t){let e=this.pendingIOSKey;return!!e&&(!("Enter"==e.key&&t&&t.from0||!!(qe.safari&&!qe.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100)&&(this.compositionPendingKey=!1,!0))}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.view.observer.update(t),this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function In(t,e){return(i,n)=>{try{return e.call(t,n,i)}catch(t){$i(i.state,t)}}}function Fn(t){let e=Object.create(null);function i(t){return e[t]||(e[t]={observers:[],handlers:[]})}for(let e of t){let t=e.spec;if(t&&t.domEventHandlers)for(let n in t.domEventHandlers){let s=t.domEventHandlers[n];s&&i(n).handlers.push(In(e.value,s))}if(t&&t.domEventObservers)for(let n in t.domEventObservers){let s=t.domEventObservers[n];s&&i(n).observers.push(In(e.value,s))}}for(let t in Xn)i(t).handlers.push(Xn[t]);for(let t in Un)i(t).observers.push(Un[t]);return e}const Vn=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Wn="dthko",Hn=[16,17,18,20,91,92,224,225];function zn(t){return.7*Math.max(0,t)+8}class qn{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParents=function(t){let e,i,n=t.ownerDocument;for(let s=t.parentNode;s&&!(s==n.body||e&&i);)if(1==s.nodeType)!i&&s.scrollHeight>s.clientHeight&&(i=s),!e&&s.scrollWidth>s.clientWidth&&(e=s),s=s.assignedSlot||s.parentNode;else{if(11!=s.nodeType)break;s=s.host}return{x:e,y:i}}(t.contentDOM),this.atoms=t.state.facet(sn).map((e=>e(t)));let s=t.contentDOM.ownerDocument;s.addEventListener("mousemove",this.move=this.move.bind(this)),s.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(St.allowMultipleSelections)&&function(t,e){let i=t.state.facet(Ni);return i.length?i[0](e):qe.mac?e.metaKey:e.ctrlKey}(t,e),this.dragging=!(!function(t,e){let{main:i}=t.state.selection;if(i.empty)return!1;let n=ie(t.root);if(!n||0==n.rangeCount)return!0;let s=n.getRangeAt(0).getClientRects();for(let t=0;t=e.clientX&&i.top<=e.clientY&&i.bottom>=e.clientY)return!0}return!1}(t,e)||1!=es(e))&&null}start(t){!1===this.dragging&&this.select(t)}move(t){if(0==t.buttons)return this.destroy();if(this.dragging||null==this.dragging&&(e=this.startEvent,i=t,Math.max(Math.abs(e.clientX-i.clientX),Math.abs(e.clientY-i.clientY))<10))return;var e,i;this.select(this.lastEvent=t);let n=0,s=0,r=0,o=0,l=this.view.win.innerWidth,a=this.view.win.innerHeight;this.scrollParents.x&&({left:r,right:l}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:a}=this.scrollParents.y.getBoundingClientRect());let h=an(this.view);t.clientX-h.left<=r+6?n=-zn(r-t.clientX):t.clientX+h.right>=l-6&&(n=zn(t.clientX-l)),t.clientY-h.top<=o+6?s=-zn(o-t.clientY):t.clientY+h.bottom>=a-6&&(s=zn(t.clientY-a)),this.setScrollSpeed(n,s)}up(t){null==this.dragging&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval((()=>this.scroll()),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:t,y:e}=this.scrollSpeed;t&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=t,t=0),e&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=e,e=0),(t||e)&&this.view.win.scrollBy(t,e),!1===this.dragging&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;it.isUserEvent("input.type")))?this.destroy():this.style.update(t)&&setTimeout((()=>this.select(this.lastEvent)),20)}}const Xn=Object.create(null),Un=Object.create(null),Qn=qe.ie&&qe.ie_version<15||qe.ios&&qe.webkit_version<604;function Yn(t,e){let i,{state:n}=t,s=1,r=n.toText(e),o=r.lines==n.selection.ranges.length;if(null!=ns&&n.selection.ranges.every((t=>t.empty))&&ns==r.toString()){let t=-1;i=n.changeByRange((i=>{let l=n.doc.lineAt(i.from);if(l.from==t)return{range:i};t=l.from;let a=n.toText((o?r.line(s++).text:e)+n.lineBreak);return{changes:{from:l.from,insert:a},range:B.cursor(i.from+a.length)}}))}else i=o?n.changeByRange((t=>{let e=r.line(s++);return{changes:{from:t.from,to:t.to,insert:e.text},range:B.cursor(t.from+e.length)}})):n.replaceSelection(r);t.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}function $n(t,e,i,n){if(1==n)return B.cursor(e,i);if(2==n)return function(t,e,i=1){let n=t.charCategorizer(e),s=t.doc.lineAt(e),r=e-s.from;if(0==s.length)return B.cursor(e);0==r?i=1:r==s.length&&(i=-1);let o=r,l=r;i<0?o=p(s.text,r,!1):l=p(s.text,r);let a=n(s.text.slice(o,l));for(;o>0;){let t=p(s.text,o,!1);if(n(s.text.slice(t,o))!=a)break;o=t}for(;l{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft},Xn.keydown=(t,e)=>(t.inputState.setSelectionOrigin("select"),27==e.keyCode&&0!=t.inputState.tabFocusMode&&(t.inputState.tabFocusMode=Date.now()+2e3),!1),Un.touchstart=(t,e)=>{t.inputState.lastTouchTime=Date.now(),t.inputState.setSelectionOrigin("select.pointer")},Un.touchmove=t=>{t.inputState.setSelectionOrigin("select.pointer")},Xn.mousedown=(t,e)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let i=null;for(let n of t.state.facet(Ii))if(i=n(t,e),i)break;if(i||0!=e.button||(i=function(t,e){let i=Kn(t,e),n=es(e),s=t.state.selection;return{update(t){t.docChanged&&(i.pos=t.changes.mapPos(i.pos),s=s.map(t.changes))},get(e,r,o){let l,a=Kn(t,e),h=$n(t,a.pos,a.bias,n);if(i.pos!=a.pos&&!r){let e=$n(t,i.pos,i.bias,n),s=Math.min(e.from,h.from),r=Math.max(e.to,h.to);h=s1&&(l=function(t,e){for(let i=0;i=e)return B.create(t.ranges.slice(0,i).concat(t.ranges.slice(i+1)),t.mainIndex==i?0:t.mainIndex-(t.mainIndex>i?1:0))}return null}(s,a.pos))?l:o?s.addRange(h):B.create([h])}}}(t,e)),i){let n=!t.hasFocus;t.inputState.startMouseSelection(new qn(t,e,i,n)),n&&t.observer.ignore((()=>{ve(t.contentDOM);let e=t.root.activeElement;e&&!e.contains(t.contentDOM)&&e.blur()}));let s=t.inputState.mouseSelection;if(s)return s.start(e),!1===s.dragging}return!1};let _n=(t,e,i)=>e>=i.top&&e<=i.bottom&&t>=i.left&&t<=i.right;function jn(t,e,i,n){let s=hi.find(t.docView,e);if(!s)return 1;let r=e-s.posAtStart;if(0==r)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&_n(i,n,o))return-1;let l=s.coordsAt(r,1);return l&&_n(i,n,l)?1:o&&o.bottom>=n?-1:1}function Kn(t,e){let i=t.posAtCoords({x:e.clientX,y:e.clientY},!1);return{pos:i,bias:jn(t,i,e.clientX,e.clientY)}}const Gn=qe.ie&&qe.ie_version<=11;let Zn=null,Jn=0,ts=0;function es(t){if(!Gn)return t.detail;let e=Zn,i=ts;return Zn=t,ts=Date.now(),Jn=!e||i>Date.now()-400&&Math.abs(e.clientX-t.clientX)<2&&Math.abs(e.clientY-t.clientY)<2?(Jn+1)%3:1}function is(t,e,i,n){if(!i)return;let s=t.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:r}=t.inputState,o=n&&r&&function(t,e){let i=t.state.facet(Li);return i.length?i[0](e):qe.mac?!e.altKey:!e.ctrlKey}(t,e)?{from:r.from,to:r.to}:null,l={from:s,insert:i},a=t.state.changes(o?[o,l]:l);t.focus(),t.dispatch({changes:a,selection:{anchor:a.mapPos(s,-1),head:a.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),t.inputState.draggedContent=null}Xn.dragstart=(t,e)=>{let{selection:{main:i}}=t.state;if(e.target.draggable){let n=t.docView.nearest(e.target);if(n&&n.isWidget){let t=n.posAtStart,e=t+n.length;(t>=i.to||e<=i.from)&&(i=B.range(t,e))}}let{inputState:n}=t;return n.mouseSelection&&(n.mouseSelection.dragging=!0),n.draggedContent=i,e.dataTransfer&&(e.dataTransfer.setData("Text",t.state.sliceDoc(i.from,i.to)),e.dataTransfer.effectAllowed="copyMove"),!1},Xn.dragend=t=>(t.inputState.draggedContent=null,!1),Xn.drop=(t,e)=>{if(!e.dataTransfer)return!1;if(t.state.readOnly)return!0;let i=e.dataTransfer.files;if(i&&i.length){let n=Array(i.length),s=0,r=()=>{++s==i.length&&is(t,e,n.filter((t=>null!=t)).join(t.state.lineBreak),!1)};for(let t=0;t{/[\x00-\x08\x0e-\x1f]{2}/.test(e.result)||(n[t]=e.result),r()},e.readAsText(i[t])}return!0}{let i=e.dataTransfer.getData("Text");if(i)return is(t,e,i,!0),!0}return!1},Xn.paste=(t,e)=>{if(t.state.readOnly)return!0;t.observer.flush();let i=Qn?null:e.clipboardData;return i?(Yn(t,i.getData("text/plain")||i.getData("text/uri-list")),!0):(function(t){let e=t.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.focus(),setTimeout((()=>{t.focus(),i.remove(),Yn(t,i.value)}),50)}(t),!1)};let ns=null;Xn.copy=Xn.cut=(t,e)=>{let{text:i,ranges:n,linewise:s}=function(t){let e=[],i=[],n=!1;for(let n of t.selection.ranges)n.empty||(e.push(t.sliceDoc(n.from,n.to)),i.push(n));if(!e.length){let s=-1;for(let{from:n}of t.selection.ranges){let r=t.doc.lineAt(n);r.number>s&&(e.push(r.text),i.push({from:r.from,to:Math.min(t.doc.length,r.to+1)})),s=r.number}n=!0}return{text:e.join(t.lineBreak),ranges:i,linewise:n}}(t.state);if(!i&&!s)return!1;ns=s?i:null,"cut"!=e.type||t.state.readOnly||t.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let r=Qn?null:e.clipboardData;return r?(r.clearData(),r.setData("text/plain",i),!0):(function(t,e){let i=t.dom.parentNode;if(!i)return;let n=i.appendChild(document.createElement("textarea"));n.style.cssText="position: fixed; left: -10000px; top: 10px",n.value=e,n.focus(),n.selectionEnd=e.length,n.selectionStart=0,setTimeout((()=>{n.remove(),t.focus()}),50)}(t,i),!1)};const ss=ht.define();function rs(t,e){let i=[];for(let n of t.facet(Hi)){let s=n(t,e);s&&i.push(s)}return i?t.update({effects:i,annotations:ss.of(!0)}):null}function os(t){setTimeout((()=>{let e=t.hasFocus;if(e!=t.inputState.notifiedFocused){let i=rs(t.state,e);i?t.dispatch(i):t.update([])}}),10)}Un.focus=t=>{t.inputState.lastFocusTime=Date.now(),t.scrollDOM.scrollTop||!t.inputState.lastScrollTop&&!t.inputState.lastScrollLeft||(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),os(t)},Un.blur=t=>{t.observer.clearSelectionRange(),os(t)},Un.compositionstart=Un.compositionupdate=t=>{t.observer.editContext||(null==t.inputState.compositionFirstChange&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0))},Un.compositionend=t=>{t.observer.editContext||(t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,qe.chrome&&qe.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then((()=>t.observer.flush())):setTimeout((()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])}),50))},Un.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()},Xn.beforeinput=(t,e)=>{var i,n;if("insertReplacementText"==e.inputType&&t.observer.editContext){let n=null===(i=e.dataTransfer)||void 0===i?void 0:i.getData("text/plain"),s=e.getTargetRanges();if(n&&s.length){let e=s[0],i=t.posAtDOM(e.startContainer,e.startOffset),r=t.posAtDOM(e.endContainer,e.endOffset);return Nn(t,{from:i,to:r,insert:t.state.toText(n)},null),!0}}let s;if(qe.chrome&&qe.android&&(s=Vn.find((t=>t.inputType==e.inputType)))&&(t.observer.delayAndroidKey(s.key,s.keyCode),"Backspace"==s.key||"Delete"==s.key)){let e=(null===(n=window.visualViewport)||void 0===n?void 0:n.height)||0;setTimeout((()=>{var i;((null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0)>e+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())}),100)}return qe.ios&&"deleteContentForward"==e.inputType&&t.observer.flushSoon(),qe.safari&&"insertText"==e.inputType&&t.inputState.composing>=0&&setTimeout((()=>Un.compositionend(t,e)),20),!1};const ls=new Set;const as=["pre-wrap","normal","pre-line","break-spaces"];let hs=!1;function cs(){hs=!1}class us{constructor(e){this.lineWrapping=e,this.doc=t.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){if(!this.lineWrapping)return this.lineHeight;return(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return as.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,l=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=o;if(this.lineWrapping=o,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=s,l){this.heightSamples={};for(let t=0;t0}set outdated(t){this.flags=(t?2:0)|-3&this.flags}setHeight(t){this.height!=t&&(Math.abs(this.height-t)>gs&&(hs=!0),this.height=t)}replace(t,e,i){return ms.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let s=this,r=i.doc;for(let o=n.length-1;o>=0;o--){let{fromA:l,toA:a,fromB:h,toB:c}=n[o],u=s.lineAt(l,ps.ByPosNoHeight,i.setDoc(e),0,0),d=u.to>=a?u:s.lineAt(a,ps.ByPosNoHeight,i,0,0);for(c+=d.to-a,a=d.to;o>0&&u.from<=n[o-1].toA;)l=n[o-1].fromA,h=n[o-1].fromB,o--,l2*s){let s=t[e-1];s.break?t.splice(--e,1,s.left,null,s.right):t.splice(--e,1,s.left,s.right),i+=1+s.break,n-=s.size}else{if(!(s>2*n))break;{let e=t[i];e.break?t.splice(i,1,e.left,null,e.right):t.splice(i,1,e.left,e.right),i+=2+e.break,s-=e.size}}else if(n=s&&r(this.blockAt(0,i,n,s))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}}class bs extends ws{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new fs(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return 1==i.length&&(n instanceof bs||n instanceof ys&&4&n.flags)&&Math.abs(this.length-n.length)<10?(n instanceof ys?n=new bs(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):ms.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(n.heights[n.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class ys extends ms{constructor(t){super(t,0)}heightMetrics(t,e){let i,n=t.doc.lineAt(e).number,s=t.doc.lineAt(e+this.length).number,r=s-n+1,o=0;if(t.lineWrapping){let e=Math.min(this.height,t.lineHeight*r);i=e/r,this.length>r+1&&(o=(this.height-e)/(this.length-r-1))}else i=this.height/r;return{firstLine:n,lastLine:s,perLine:i,perChar:o}}blockAt(t,e,i,n){let{firstLine:s,lastLine:r,perLine:o,perChar:l}=this.heightMetrics(e,n);if(e.lineWrapping){let s=n+(t0){let t=i[i.length-1];t instanceof ys?i[i.length-1]=new ys(t.length+n):i.push(null,new ys(n-1))}if(t>0){let e=i[0];e instanceof ys?i[0]=new ys(t+e.length):i.unshift(new ys(t-1),null)}return ms.of(i)}decomposeLeft(t,e){e.push(new ys(t-1),null)}decomposeRight(t,e){e.push(null,new ys(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let s=e+this.length;if(n&&n.from<=e+this.length&&n.more){let i=[],r=Math.max(e,n.from),o=-1;for(n.from>e&&i.push(new ys(n.from-e-1).updateHeight(t,e));r<=s&&n.more;){let e=t.doc.lineAt(r).length;i.length&&i.push(null);let s=n.heights[n.index++];-1==o?o=s:Math.abs(s-o)>=gs&&(o=-2);let l=new bs(e,s);l.outdated=!1,i.push(l),r+=e+1}r<=s&&i.push(null,new ys(s-r).updateHeight(t,r));let l=ms.of(i);return(o<0||Math.abs(l.height-this.height)>=gs||Math.abs(o-this.heightMetrics(t,e).perLine)>=gs)&&(hs=!0),vs(this,l)}return(i||this.outdated)&&(this.setHeight(t.heightForGap(e,e+this.length)),this.outdated=!1),this}toString(){return`gap(${this.length})`}}class xs extends ms{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return 1&this.flags}blockAt(t,e,i,n){let s=i+this.left.height;return to))return a;let h=e==ps.ByPosNoHeight?ps.ByPosNoHeight:ps.ByPos;return l?a.join(this.right.lineAt(o,h,i,r,o)):this.left.lineAt(o,h,i,n,s).join(a)}forEachLine(t,e,i,n,s,r){let o=n+this.left.height,l=s+this.left.length+this.break;if(this.break)t=l&&this.right.forEachLine(t,e,i,o,l,r);else{let a=this.lineAt(l,ps.ByPos,i,n,s);t=t&&a.from<=e&&r(a),e>a.to&&this.right.forEachLine(a.to+1,e,i,o,l,r)}}replace(t,e,i){let n=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let s=[];t>0&&this.decomposeLeft(t,s);let r=s.length;for(let t of i)s.push(t);if(t>0&&ks(s,r-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t2*e.size||e.size>2*t.size?ms.of(this.break?[t,null,e]:[t,e]):(this.left=vs(this.left,t),this.right=vs(this.right,e),this.setHeight(t.height+e.height),this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:s,right:r}=this,o=e+s.length+this.break,l=null;return n&&n.from<=e+s.length&&n.more?l=s=s.updateHeight(t,e,i,n):s.updateHeight(t,e,i),n&&n.from<=o+r.length&&n.more?l=r=r.updateHeight(t,o,i,n):r.updateHeight(t,o,i),l?this.balanced(s,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function ks(t,e){let i,n;null==t[e]&&(i=t[e-1])instanceof ys&&(n=t[e+1])instanceof ys&&t.splice(e-1,3,new ys(i.length+1+n.length))}class Ps{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let t=Math.min(e,this.lineEnd),i=this.nodes[this.nodes.length-1];i instanceof bs?i.length+=t-this.pos:(t>this.pos||!this.isCovered)&&this.nodes.push(new bs(t-this.pos,-1)),this.writtenTo=t,e>t&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=5)&&this.addLineDeco(n,s,r)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new bs(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new ys(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof bs)return t;let e=new bs(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=0==this.nodes.length?null:this.nodes[this.nodes.length-1];!(this.lineStart>-1)||e instanceof bs||this.isCovered?(this.writtenToi.clientHeight||i.scrollWidth>i.clientWidth)&&"visible"!=n.overflow){let n=i.getBoundingClientRect();r=Math.max(r,n.left),o=Math.min(o,n.right),l=Math.max(l,n.top),a=Math.min(e==t.parentNode?s.innerHeight:a,n.bottom)}e="absolute"==n.position||"fixed"==n.position?i.offsetParent:i.parentNode}else{if(11!=e.nodeType)break;e=e.host}return{left:r-i.left,right:Math.max(r,o)-i.left,top:l-(i.top+e),bottom:Math.max(l,a)-(i.top+e)}}function Cs(t,e){let i=t.getBoundingClientRect();return{left:0,right:i.right-i.left,top:e,bottom:i.bottom-(i.top+e)}}class As{constructor(t,e,i){this.from=t,this.to=e,this.size=i}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;i"function"!=typeof t&&"cm-lineWrapping"==t.class));this.heightOracle=new us(i),this.stateDeco=e.facet(en).filter((t=>"function"!=typeof t)),this.heightMap=ms.empty().applyChanges(this.stateDeco,t.empty,this.heightOracle.setDoc(e.doc),[new cn(0,0,0,e.doc.length)]);for(let t=0;t<2&&(this.viewport=this.getViewport(0,null),this.updateForViewport());t++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=ni.set(this.lineGaps.map((t=>t.draw(this,!1)))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some((({from:t,to:e})=>n>=t&&n<=e))){let{from:e,to:i}=this.lineBlockAt(n);t.push(new Ds(e,i))}}return this.viewports=t.sort(((t,e)=>t.from-e.from)),this.updateScaler()}updateScaler(){let t=this.scaler;return this.scaler=this.heightMap.height<=7e6?Bs:new Ns(this.heightOracle,this.heightMap,this.viewports),t.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,(t=>{this.viewportLines.push(Ls(t,this.scaler))}))}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(en).filter((t=>"function"!=typeof t));let n=t.changedRanges,s=cn.extendWithRanges(n,function(t,e,i){let n=new Ss;return Dt.compare(t,e,i,n,0),n.changes}(i,this.stateDeco,t?t.changes:O.empty(this.state.doc.length))),r=this.heightMap.height,o=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);cs(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),s),(this.heightMap.height!=r||hs)&&(t.flags|=2),o?(this.scrollAnchorPos=t.changes.mapPos(o.from,-1),this.scrollAnchorHeight=o.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let l=s.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.headl.to)||!this.viewportIsAppropriate(l))&&(l=this.getViewport(0,e));let a=l.from!=this.viewport.from||l.to!=this.viewport.to;this.viewport=l,t.flags|=this.updateForViewport(),(a||!t.changes.empty||2&t.flags)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(qi)&&(this.mustEnforceCursorAssoc=!0)}measure(e){let i=e.contentDOM,n=window.getComputedStyle(i),s=this.heightOracle,r=n.whiteSpace;this.defaultTextDirection="rtl"==n.direction?gi.RTL:gi.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=i.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,c=0;if(l.width&&l.height){let{scaleX:t,scaleY:e}=fe(i,l);(t>.005&&Math.abs(this.scaleX-t)>.005||e>.005&&Math.abs(this.scaleY-e)>.005)&&(this.scaleX=t,this.scaleY=e,h|=8,o=a=!0)}let u=(parseInt(n.paddingTop)||0)*this.scaleY,d=(parseInt(n.paddingBottom)||0)*this.scaleY;this.paddingTop==u&&this.paddingBottom==d||(this.paddingTop=u,this.paddingBottom=d,h|=10),this.editorWidth!=e.scrollDOM.clientWidth&&(s.lineWrapping&&(a=!0),this.editorWidth=e.scrollDOM.clientWidth,h|=8);let f=e.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=f&&(this.scrollAnchorHeight=-1,this.scrollTop=f),this.scrolledToBottom=xe(e.scrollDOM);let p=(this.printing?Cs:Os)(i,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let v=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(v!=this.inView&&(this.inView=v,v&&(a=!0)),!this.inView&&!this.scrollTarget)return 0;let w=l.width;if(this.contentDOMWidth==w&&this.editorHeight==e.scrollDOM.clientHeight||(this.contentDOMWidth=l.width,this.editorHeight=e.scrollDOM.clientHeight,h|=8),a){let i=e.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(i)&&(o=!0),o||s.lineWrapping&&Math.abs(w-this.contentDOMWidth)>s.charWidth){let{lineHeight:t,charWidth:n,textHeight:l}=e.docView.measureTextSize();o=t>0&&s.refresh(r,t,n,l,w/n,i),o&&(e.docView.minWidth=0,h|=8)}g>0&&m>0?c=Math.max(g,m):g<0&&m<0&&(c=Math.min(g,m)),cs();for(let n of this.viewports){let r=n.from==this.viewport.from?i:e.docView.measureVisibleLineHeights(n);this.heightMap=(o?ms.empty().applyChanges(this.stateDeco,t.empty,this.heightOracle,[new cn(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new ds(n.from,r))}hs&&(h|=2)}let b=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return b&&(2&h&&(h|=this.updateScaler()),this.viewport=this.getViewport(c,this.scrollTarget),h|=this.updateForViewport()),(2&h||b)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,e)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,s=this.heightOracle,{visibleTop:r,visibleBottom:o}=this,l=new Ds(n.lineAt(r-1e3*i,ps.ByHeight,s,0,0).from,n.lineAt(o+1e3*(1-i),ps.ByHeight,s,0,0).to);if(e){let{head:t}=e.range;if(tl.to){let i,r=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),o=n.lineAt(t,ps.ByPos,s,0,0);i="center"==e.y?(o.top+o.bottom)/2-r/2:"start"==e.y||"nearest"==e.y&&t=o+Math.max(10,Math.min(i,250)))&&n>r-2e3&&s>1,r=n<<1;if(this.defaultTextDirection!=gi.LTR&&!i)return[];let o=[],l=(n,r,a,h)=>{if(r-nn&&tt.from>=a.from&&t.to<=a.to&&Math.abs(t.from-n)t.frome))));if(!d){if(rt.from<=r&&t.to>=r))){let t=e.moveToLineBoundary(B.cursor(r),!1,!0).head;t>n&&(r=t)}d=new As(n,r,this.gapSize(a,n,r,h))}o.push(d)},a=t=>{if(t.lengths&&(n.push({from:s,to:t}),r+=t-s),s=e}},20),st.from&&l(t.from,s,t,e),ot.draw(this,this.heightOracle.lineWrapping)))))}computeVisibleRanges(){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let e=[];Dt.spans(t,this.viewport.from,this.viewport.to,{span(t,i){e.push({from:t,to:i})},point(){}},20);let i=e.length!=this.visibleRanges.length||this.visibleRanges.some(((t,i)=>t.from!=e[i].from||t.to!=e[i].to));return this.visibleRanges=e,i?4:0}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find((e=>e.from<=t&&e.to>=t))||Ls(this.heightMap.lineAt(t,ps.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return t>=this.viewportLines[0].top&&t<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find((e=>e.top<=t&&e.bottom>=t))||Ls(this.heightMap.lineAt(this.scaler.fromDOM(t),ps.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Ls(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class Ds{constructor(t,e){this.from=t,this.to=e}}function Es({total:t,ranges:e},i){if(i<=0)return e[0].from;if(i>=1)return e[e.length-1].to;let n=Math.floor(t*i);for(let t=0;;t++){let{from:i,to:s}=e[t],r=s-i;if(n<=r)return i+n;n-=r}}function Rs(t,e){let i=0;for(let{from:n,to:s}of t.ranges){if(e<=s){i+=e-n;break}i+=s-n}return i/t.total}const Bs={toDOM:t=>t,fromDOM:t=>t,scale:1,eq(t){return t==this}};class Ns{constructor(t,e,i){let n=0,s=0,r=0;this.viewports=i.map((({from:i,to:s})=>{let r=e.lineAt(i,ps.ByPos,t,0,0).top,o=e.lineAt(s,ps.ByPos,t,0,0).bottom;return n+=o-r,{from:i,to:s,top:r,bottom:o,domTop:0,domBottom:0}})),this.scale=(7e6-n)/(e.height-n);for(let t of this.viewports)t.domTop=r+(t.top-s)*this.scale,r=t.domBottom=t.domTop+(t.bottom-t.top),s=t.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let s=ee.from==t.viewports[i].from&&e.to==t.viewports[i].to)))}}function Ls(t,e){if(1==e.scale)return t;let i=e.toDOM(t.top),n=e.toDOM(t.bottom);return new fs(t.from,t.length,i,n-i,Array.isArray(t._content)?t._content.map((t=>Ls(t,e))):t._content)}const Is=I.define({combine:t=>t.join(" ")}),Fs=I.define({combine:t=>t.indexOf(!0)>-1}),Vs=$t.newName(),Ws=$t.newName(),Hs=$t.newName(),zs={"&light":"."+Ws,"&dark":"."+Hs};function qs(t,e,i){return new $t(e,{finish:e=>/&/.test(e)?e.replace(/&\w*/,(e=>{if("&"==e)return t;if(!i||!i[e])throw new RangeError(`Unsupported selector: ${e}`);return i[e]})):t+" "+e})}const Xs=qs("."+Vs,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:'url(\'data:image/svg+xml,\')',backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},zs),Us={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Qs=qe.ie&&qe.ie_version<=11;class Ys{constructor(t){this.view=t,this.active=!1,this.editContext=null,this.selectionRange=new pe,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver((e=>{for(let t of e)this.queue.push(t);(qe.ie&&qe.ie_version<=11||qe.ios&&t.composing)&&e.some((t=>"childList"==t.type&&t.removedNodes.length||"characterData"==t.type&&t.oldValue.length>t.target.nodeValue.length))?this.flushSoon():this.flush()})),!window.EditContext||!1===t.constructor.EDIT_CONTEXT||qe.chrome&&qe.chrome_version<126||(this.editContext=new js(t),t.state.facet(_i)&&(t.contentDOM.editContext=this.editContext.editContext)),Qs&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),"function"==typeof ResizeObserver&&(this.resizeScroll=new ResizeObserver((()=>{var t;(null===(t=this.view.docView)||void 0===t?void 0:t.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))}),{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver((t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))}),{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout((()=>{this.resizeTimeout=-1,this.view.requestMeasure()}),50))}onPrint(t){("change"!=t.type&&t.type||t.matches)&&(this.view.viewState.printing=!0,this.view.measure(),setTimeout((()=>{this.view.viewState.printing=!1,this.view.requestMeasure()}),500))}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some(((e,i)=>e!=t[i])))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(_i)?i.root.activeElement!=this.dom:!se(i.dom,n))return;let s=n.anchorNode&&i.docView.nearest(n.anchorNode);s&&s.ignoreEvent(t)?e||(this.selectionChanged=!1):(qe.ie&&qe.ie_version<=11||qe.android&&qe.chrome)&&!i.state.selection.main.empty&&n.focusNode&&oe(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=ie(t.root);if(!e)return!1;let i=qe.safari&&11==t.root.nodeType&&function(t){let e=t.activeElement;for(;e&&e.shadowRoot;)e=e.shadowRoot.activeElement;return e}(this.dom.ownerDocument)==this.dom&&function(t,e){if(e.getComposedRanges){let i=e.getComposedRanges(t.root)[0];if(i)return _s(t,i)}let i=null;function n(t){t.preventDefault(),t.stopImmediatePropagation(),i=t.getTargetRanges()[0]}return t.contentDOM.addEventListener("beforeinput",n,!0),t.dom.ownerDocument.execCommand("indent"),t.contentDOM.removeEventListener("beforeinput",n,!0),i?_s(t,i):null}(this.view,e)||e;if(!i||this.selectionRange.eq(i))return!1;let n=se(this.dom,i);return n&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let t=this.delayedAndroidKey;if(t){this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=t.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&t.force&&be(this.dom,t.key,t.keyCode)}};this.flushingAndroidKey=this.view.win.requestAnimationFrame(t)}this.delayedAndroidKey&&"Enter"!=t||(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()})))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let s of t){let t=this.readMutation(s);t&&(t.typeOver&&(n=!0),-1==e?({from:e,to:i}=t):(e=Math.min(t.from,e),i=Math.max(t.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&se(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let s=new Rn(this.view,t,e,i);return this.view.docView.domChanged={newSel:s.newSel?s.newSel.main:null},s}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=Bn(this.view,e);return this.view.state==i&&(e.domChanged||e.newSel&&!e.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty("attributes"==t.type),"attributes"==t.type&&(e.flags|=4),"childList"==t.type){let i=$s(e,t.previousSibling||t.target.previousSibling,-1),n=$s(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}return"characterData"==t.type?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}update(t){this.editContext&&(this.editContext.update(t),t.startState.facet(_i)!=t.state.facet(_i)&&(t.view.contentDOM.editContext=t.state.facet(_i)?this.editContext.editContext:null))}destroy(){var t,e,i;this.stop(),null===(t=this.intersection)||void 0===t||t.disconnect(),null===(e=this.gapIntersection)||void 0===e||e.disconnect(),null===(i=this.resizeScroll)||void 0===i||i.disconnect();for(let t of this.scrollTargets)t.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}}function $s(t,e,i){for(;e;){let n=Ce.get(e);if(n&&n.parent==t)return n;let s=e.parentNode;e=s!=t.dom?s:i>0?e.nextSibling:e.previousSibling}return null}function _s(t,e){let i=e.startContainer,n=e.startOffset,s=e.endContainer,r=e.endOffset,o=t.docView.domAtPos(t.state.selection.main.anchor);return oe(o.node,o.offset,s,r)&&([i,n,s,r]=[s,r,i,n]),{anchorNode:i,anchorOffset:n,focusNode:s,focusOffset:r}}class js{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.resetRange(e.state);let i=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let{anchor:n}=e.state.selection.main,s={from:this.toEditorPos(i.updateRangeStart),to:this.toEditorPos(i.updateRangeEnd),insert:t.of(i.text.split("\n"))};s.from==this.from&&nthis.to&&(s.to=n),(s.from!=s.to||s.insert.length)&&(this.pendingContextChange=s,e.state.readOnly||Nn(e,s,B.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd))),this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)))},this.handlers.characterboundsupdate=t=>{let n=[],s=null;for(let i=this.toEditorPos(t.rangeStart),r=this.toEditorPos(t.rangeEnd);i{let i=[];for(let e of t.getTextFormats()){let t=e.underlineStyle,n=e.underlineThickness;if("None"!=t&&"None"!=n){let s=`text-decoration: underline ${"Dashed"==t?"dashed ":"Squiggle"==t?"wavy ":""}${"Thin"==n?1:2}px`;i.push(ni.mark({attributes:{style:s}}).range(this.toEditorPos(e.rangeStart),this.toEditorPos(e.rangeEnd)))}}e.dispatch({effects:Yi.of(ni.set(i))})},this.handlers.compositionstart=()=>{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{e.inputState.composing=-1,e.inputState.compositionFirstChange=null};for(let t in this.handlers)i.addEventListener(t,this.handlers[t]);this.measureReq={read:t=>{this.editContext.updateControlBounds(t.contentDOM.getBoundingClientRect());let e=ie(t.root);e&&e.rangeCount&&this.editContext.updateSelectionBounds(e.getRangeAt(0).getBoundingClientRect())}}}applyEdits(t){let e=0,i=!1,n=this.pendingContextChange;return t.changes.iterChanges(((s,r,o,l,a)=>{if(i)return;let h=a.length-(r-s);if(n&&r>=n.to){if(n.from==s&&n.to==r&&n.insert.eq(a))return n=this.pendingContextChange=null,e+=h,void(this.to+=h);n=null,this.revertPending(t.state)}if(s+=e,(r+=e)<=this.from)this.from+=h,this.to+=h;else if(sthis.to||this.to-this.from+a.length>3e4)return void(i=!0);this.editContext.updateText(this.toContextPos(s),this.toContextPos(r),a.toString()),this.to+=h}e+=h})),n&&!i&&this.revertPending(t.state),!i}update(t){let e=this.pendingContextChange;this.applyEdits(t)&&this.rangeIsValid(t.state)?(t.docChanged||t.selectionSet||e)&&this.setSelection(t.state):(this.pendingContextChange=null,this.resetRange(t.state),this.editContext.updateText(0,this.editContext.text.length,t.state.doc.sliceString(this.from,this.to)),this.setSelection(t.state)),(t.geometryChanged||t.docChanged||t.selectionSet)&&t.view.requestMeasure(this.measureReq)}resetRange(t){let{head:e}=t.selection.main;this.from=Math.max(0,e-1e4),this.to=Math.min(t.doc.length,e+1e4)}revertPending(t){let e=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(e.from),this.toContextPos(e.from+e.insert.length),t.doc.sliceString(e.from,e.to))}setSelection(t){let{main:e}=t.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,e.anchor))),n=this.toContextPos(e.head);this.editContext.selectionStart==i&&this.editContext.selectionEnd==n||this.editContext.updateSelection(i,n)}rangeIsValid(t){let{head:e}=t.selection.main;return!(this.from>0&&e-this.from<500||this.to3e4)}toEditorPos(t){return t+this.from}toContextPos(t){return t-this.from}destroy(){for(let t in this.handlers)this.editContext.removeEventListener(t,this.handlers[t])}}class Ks{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){var e;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:i}=t;this.dispatchTransactions=t.dispatchTransactions||i&&(t=>t.forEach((t=>i(t,this))))||(t=>this.update(t)),this.dispatch=this.dispatch.bind(this),this._root=t.root||function(t){for(;t;){if(t&&(9==t.nodeType||11==t.nodeType&&t.host))return t;t=t.assignedSlot||t.parentNode}return null}(t.parent)||document,this.viewState=new Ts(t.state||St.create(t)),t.scrollTo&&t.scrollTo.is(Qi)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(Ki).map((t=>new Zi(t)));for(let t of this.plugins)t.update(this);this.observer=new Ys(this),this.inputState=new Ln(this),this.inputState.ensureHandlers(this.plugins),this.docView=new dn(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),(null===(e=document.fonts)||void 0===e?void 0:e.ready)&&document.fonts.ready.then((()=>this.requestMeasure()))}dispatch(...t){let e=1==t.length&&t[0]instanceof ft?t:1==t.length&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(0!=this.updateState)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e,i=!1,n=!1,s=this.state;for(let e of t){if(e.startState!=s)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");s=e.state}if(this.destroyed)return void(this.viewState.state=s);let r=this.hasFocus,o=0,l=null;t.some((t=>t.annotation(ss)))?(this.inputState.notifiedFocused=r,o=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,l=rs(s,r),l||(o=1));let a=this.observer.delayedAndroidKey,h=null;if(a?(this.observer.clearDelayedAndroidKey(),h=this.observer.readChange(),(h&&!this.state.doc.eq(s.doc)||!this.state.selection.eq(s.selection))&&(h=null)):this.observer.clear(),s.facet(St.phrases)!=this.state.facet(St.phrases))return this.setState(s);e=un.create(this,s,t),e.flags|=o;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let e of t){if(c&&(c=c.map(e.changes)),e.scrollIntoView){let{main:t}=e.state.selection;c=new Ui(t.empty?t:B.cursor(t.head,t.head>t.anchor?-1:1))}for(let t of e.effects)t.is(Qi)&&(c=t.value.clip(this.state))}this.viewState.update(e,c),this.bidiCache=Js.update(this.bidiCache,e.changes),e.empty||(this.updatePlugins(e),this.inputState.update(e)),i=this.docView.update(e),this.state.facet(hn)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(i,t.some((t=>t.isUserEvent("select.pointer"))))}finally{this.updateState=0}if(e.startState.facet(Is)!=e.state.facet(Is)&&(this.viewState.mustMeasureContent=!0),(i||n||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),i&&this.docViewUpdate(),!e.empty)for(let t of this.state.facet(Vi))try{t(e)}catch(t){$i(this.state,t,"update listener")}(l||h)&&Promise.resolve().then((()=>{l&&this.state==l.startState&&this.dispatch(l),h&&!Bn(this,h)&&a.force&&be(this.contentDOM,a.key,a.keyCode)}))}setState(t){if(0!=this.updateState)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed)return void(this.viewState.state=t);this.updateState=2;let e=this.hasFocus;try{for(let t of this.plugins)t.destroy(this);this.viewState=new Ts(t),this.plugins=t.facet(Ki).map((t=>new Zi(t))),this.pluginMap.clear();for(let t of this.plugins)t.update(this);this.docView.destroy(),this.docView=new dn(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(Ki),i=t.state.facet(Ki);if(e!=i){let n=[];for(let s of i){let i=e.indexOf(s);if(i<0)n.push(new Zi(s));else{let e=this.plugins[i];e.mustUpdate=t,n.push(e)}}for(let e of this.plugins)e.mustUpdate!=t&&e.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let e of this.plugins)e.mustUpdate=t;for(let t=0;t-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey)return this.measureScheduled=-1,void this.requestMeasure();this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:s,scrollAnchorHeight:r}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let t=0;;t++){if(r<0)if(xe(i))s=-1,r=this.viewState.heightMap.height;else{let t=this.viewState.scrollAnchorAt(n);s=t.from,r=t.top}this.updateState=1;let o=this.viewState.measure(this);if(!o&&!this.measureRequests.length&&null==this.viewState.scrollTarget)break;if(t>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let l=[];4&o||([this.measureRequests,l]=[l,this.measureRequests]);let a=l.map((t=>{try{return t.read(this)}catch(t){return $i(this.state,t),Zs}})),h=un.create(this,this.state,[]),c=!1;h.flags|=o,e?e.flags|=o:e=h,this.updateState=2,h.empty||(this.updatePlugins(h),this.inputState.update(h),this.updateAttrs(),c=this.docView.update(h),c&&this.docViewUpdate());for(let t=0;t1||t<-1){n+=t,i.scrollTop=n/this.scaleY,r=-1;continue}}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let t of this.state.facet(Vi))t(e)}get themeClasses(){return Vs+" "+(this.state.facet(Fs)?Hs:Ws)+" "+this.state.facet(Is)}updateAttrs(){let t=tr(this,Ji,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(_i)?"true":"false",class:"cm-content",style:`${qe.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),tr(this,tn,e);let i=this.observer.ignore((()=>{let i=Je(this.contentDOM,this.contentAttrs,e),n=Je(this.dom,this.editorAttrs,t);return i||n}));return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let t of i.effects)if(t.is(Ks.announce)){e&&(this.announceDOM.textContent=""),e=!1,this.announceDOM.appendChild(document.createElement("div")).textContent=t.value}}mountStyles(){this.styleModules=this.state.facet(hn);let t=this.state.facet(Ks.cspNonce);$t.mount(this.root,this.styleModules.concat(Xs).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(2==this.updateState)throw new Error("Reading the editor layout isn't allowed during an update");0==this.updateState&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame((()=>this.measure()))),t){if(this.measureRequests.indexOf(t)>-1)return;if(null!=t.key)for(let e=0;ee.spec==t))||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return An(this,t,On(this,t,e,i))}moveByGroup(t,e){return An(this,t,On(this,t,e,(e=>function(t,e,i){let n=t.state.charCategorizer(e),s=n(i);return t=>{let e=n(t);return s==yt.Space&&(s=e),s==e}}(this,t.head,e))))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),s=i[e?i.length-1:0];return B.cursor(s.side(e,n)+t.from,s.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return function(t,e,i,n){let s=Sn(t,e.head),r=n&&s.type==ii.Text&&(t.lineWrapping||s.widgetLineBreaks)?t.coordsAtPos(e.assoc<0&&e.head>s.from?e.head-1:e.head):null;if(r){let e=t.dom.getBoundingClientRect(),n=t.textDirectionAt(s.from),o=t.posAtCoords({x:i==(n==gi.LTR)?e.right-1:e.left+1,y:(r.top+r.bottom)/2});if(null!=o)return B.cursor(o,i?-1:1)}return B.cursor(i?s.to:s.from,i?-1:1)}(this,t,e,i)}moveVertically(t,e,i){return An(this,t,function(t,e,i,n){let s=e.head,r=i?1:-1;if(s==(i?t.state.doc.length:0))return B.cursor(s,e.assoc);let o,l=e.goalColumn,a=t.contentDOM.getBoundingClientRect(),h=t.coordsAtPos(s,e.assoc||-1),c=t.documentTop;if(h)null==l&&(l=h.left-a.left),o=r<0?h.top:h.bottom;else{let e=t.viewState.lineBlockAt(s);null==l&&(l=Math.min(a.right-a.left,t.defaultCharacterWidth*(s-e.from))),o=(r<0?e.top:e.bottom)+c}let u=a.left+l,d=null!=n?n:t.viewState.heightOracle.textHeight>>1;for(let e=0;;e+=10){let i=o+(d+e)*r,n=kn(t,{x:u,y:i},!1,r);if(ia.bottom||(r<0?ns)){let e=t.docView.coordsForChar(n),s=!e||i0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(zi)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>Gs)return Di(t.length);let e,i=this.textDirectionAt(t.from);for(let n of this.bidiCache)if(n.from==t.from&&n.dir==i&&(n.fresh||Ci(n.isolates,e=on(this,t))))return n.order;e||(e=on(this,t));let n=function(t,e,i){if(!t)return[new Oi(0,0,e==vi?1:0)];if(e==mi&&!i.length&&!Si.test(t))return Di(t.length);if(i.length)for(;t.length>Ai.length;)Ai[Ai.length]=256;let n=[],s=e==mi?0:1;return Ti(t,s,s,i,0,t.length,n),n}(t.text,i,e);return this.bidiCache.push(new Js(t.from,t.to,i,e,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||qe.safari&&(null===(t=this.inputState)||void 0===t?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore((()=>{ve(this.contentDOM),this.docView.updateSelection()}))}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((9==t.nodeType?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return Qi.of(new Ui("number"==typeof t?B.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return Qi.of(new Ui(B.cursor(i.from),"start","start",i.top-t,e,!0))}setTabFocusMode(t){null==t?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:"boolean"==typeof t?this.inputState.tabFocusMode=t?0:-1:0!=this.inputState.tabFocusMode&&(this.inputState.tabFocusMode=Date.now()+t)}static domEventHandlers(t){return Gi.define((()=>({})),{eventHandlers:t})}static domEventObservers(t){return Gi.define((()=>({})),{eventObservers:t})}static theme(t,e){let i=$t.newName(),n=[Is.of(i),hn.of(qs(`.${i}`,t))];return e&&e.dark&&n.push(Fs.of(!0)),n}static baseTheme(t){return j.lowest(hn.of(qs("."+Vs,t,zs)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&Ce.get(i)||Ce.get(t);return(null===(e=null==n?void 0:n.rootView)||void 0===e?void 0:e.view)||null}}Ks.styleModule=hn,Ks.inputHandler=Wi,Ks.scrollHandler=Xi,Ks.focusChangeEffect=Hi,Ks.perLineTextDirection=zi,Ks.exceptionSink=Fi,Ks.updateListener=Vi,Ks.editable=_i,Ks.mouseSelectionStyle=Ii,Ks.dragMovesSelection=Li,Ks.clickAddsSelectionRange=Ni,Ks.decorations=en,Ks.outerDecorations=nn,Ks.atomicRanges=sn,Ks.bidiIsolatedRanges=rn,Ks.scrollMargins=ln,Ks.darkTheme=Fs,Ks.cspNonce=I.define({combine:t=>t.length?t[0]:""}),Ks.contentAttributes=tn,Ks.editorAttributes=Ji,Ks.lineWrapping=Ks.contentAttributes.of({class:"cm-lineWrapping"}),Ks.announce=dt.define();const Gs=4096,Zs={};class Js{constructor(t,e,i,n,s,r){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=s,this.order=r}static update(t,e){if(e.empty&&!t.some((t=>t.fresh)))return t;let i=[],n=t.length?t[t.length-1].dir:gi.LTR;for(let s=Math.max(0,t.length-10);s=0;s--){let e=n[s],r="function"==typeof e?e(t):e;r&&Ke(r,i)}return i}const er=qe.mac?"mac":qe.windows?"win":qe.linux?"linux":"key";function ir(t,e,i){return e.altKey&&(t="Alt-"+t),e.ctrlKey&&(t="Ctrl-"+t),e.metaKey&&(t="Meta-"+t),!1!==i&&e.shiftKey&&(t="Shift-"+t),t}const nr=j.default(Ks.domEventHandlers({keydown:(t,e)=>cr(or(e.state),t,e,"editor")})),sr=I.define({enables:nr}),rr=new WeakMap;function or(t){let e=t.facet(sr),i=rr.get(e);return i||rr.set(e,i=function(t,e=er){let i=Object.create(null),n=Object.create(null),s=(t,e)=>{let i=n[t];if(null==i)n[t]=e;else if(i!=e)throw new Error("Key binding "+t+" is used both as a regular binding and as a multi-stroke prefix")},r=(t,n,r,o,l)=>{var a,h;let c=i[t]||(i[t]=Object.create(null)),u=n.split(/ (?!$)/).map((t=>function(t,e){const i=t.split(/-(?!$)/);let n,s,r,o,l=i[i.length-1];"Space"==l&&(l=" ");for(let t=0;t{let n=lr={view:e,prefix:i,scope:t};return setTimeout((()=>{lr==n&&(lr=null)}),ar),!0}]})}let d=u.join(" ");s(d,!1);let f=c[d]||(c[d]={preventDefault:!1,stopPropagation:!1,run:(null===(h=null===(a=c._any)||void 0===a?void 0:a.run)||void 0===h?void 0:h.slice())||[]});r&&f.run.push(r),o&&(f.preventDefault=!0),l&&(f.stopPropagation=!0)};for(let n of t){let t=n.scope?n.scope.split(" "):["editor"];if(n.any)for(let e of t){let t=i[e]||(i[e]=Object.create(null));t._any||(t._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:s}=n;for(let e in t)t[e].run.push((t=>s(t,hr)))}let s=n[e]||n.key;if(s)for(let e of t)r(e,s,n.run,n.preventDefault,n.stopPropagation),n.shift&&r(e,"Shift-"+s,n.shift,n.preventDefault,n.stopPropagation)}return i}(e.reduce(((t,e)=>t.concat(e)),[]))),i}let lr=null;const ar=4e3;let hr=null;function cr(t,e,i,n){hr=e;let s=function(t){var e=!(Zt&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||Jt&&t.shiftKey&&t.key&&1==t.key.length||"Unidentified"==t.key)&&t.key||(t.shiftKey?Gt:Kt)[t.keyCode]||t.key||"Unidentified";return"Esc"==e&&(e="Escape"),"Del"==e&&(e="Delete"),"Left"==e&&(e="ArrowLeft"),"Up"==e&&(e="ArrowUp"),"Right"==e&&(e="ArrowRight"),"Down"==e&&(e="ArrowDown"),e}(e),r=x(b(s,0))==s.length&&" "!=s,o="",l=!1,a=!1,h=!1;lr&&lr.view==i&&lr.scope==n&&(o=lr.prefix+" ",Hn.indexOf(e.keyCode)<0&&(a=!0,lr=null));let c,u,d=new Set,f=t=>{if(t){for(let e of t.run)if(!d.has(e)&&(d.add(e),e(i)))return t.stopPropagation&&(h=!0),!0;t.preventDefault&&(t.stopPropagation&&(h=!0),a=!0)}return!1},p=t[n];return p&&(f(p[o+ir(s,e,!r)])?l=!0:r&&(e.altKey||e.metaKey||e.ctrlKey)&&!(qe.windows&&e.ctrlKey&&e.altKey)&&(c=Kt[e.keyCode])&&c!=s?(f(p[o+ir(c,e,!0)])||e.shiftKey&&(u=Gt[e.keyCode])!=s&&u!=c&&f(p[o+ir(u,e,!1)]))&&(l=!0):r&&e.shiftKey&&f(p[o+ir(s,e,!0)])&&(l=!0),!l&&f(p._any)&&(l=!0)),a&&(l=!0),l&&h&&e.stopPropagation(),hr=null,l}class ur{constructor(t,e,i,n,s){this.className=t,this.left=e,this.top=i,this.width=n,this.height=s}draw(){let t=document.createElement("div");return t.className=this.className,this.adjust(t),t}update(t,e){return e.className==this.className&&(this.adjust(t),!0)}adjust(t){t.style.left=this.left+"px",t.style.top=this.top+"px",null!=this.width&&(t.style.width=this.width+"px"),t.style.height=this.height+"px"}eq(t){return this.left==t.left&&this.top==t.top&&this.width==t.width&&this.height==t.height&&this.className==t.className}static forRange(t,e,i){if(i.empty){let n=t.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let s=dr(t);return[new ur(e,n.left-s.left,n.top-s.top,null,n.bottom-n.top)]}return function(t,e,i){if(i.to<=t.viewport.from||i.from>=t.viewport.to)return[];let n=Math.max(i.from,t.viewport.from),s=Math.min(i.to,t.viewport.to),r=t.textDirection==gi.LTR,o=t.contentDOM,l=o.getBoundingClientRect(),a=dr(t),h=o.querySelector(".cm-line"),c=h&&window.getComputedStyle(h),u=l.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),d=l.right-(c?parseInt(c.paddingRight):0),f=Sn(t,n),p=Sn(t,s),g=f.type==ii.Text?f:null,m=p.type==ii.Text?p:null;g&&(t.lineWrapping||f.widgetLineBreaks)&&(g=fr(t,n,1,g));m&&(t.lineWrapping||p.widgetLineBreaks)&&(m=fr(t,s,-1,m));if(g&&m&&g.from==m.from&&g.to==m.to)return w(b(i.from,i.to,g));{let e=g?b(i.from,null,g):y(f,!1),n=m?b(null,i.to,m):y(p,!0),s=[];return(g||f).to<(m||p).from-(g&&m?1:0)||f.widgetLineBreaks>1&&e.bottom+t.defaultLineHeight/2h&&n.from=r)break;l>s&&a(Math.max(t,s),null==e&&t<=h,Math.min(l,r),null==i&&l>=c,o.dir)}if(s=n.to+1,s>=r)break}return 0==l.length&&a(h,null==e,c,null==i,t.textDirection),{top:s,bottom:o,horizontal:l}}function y(t,e){let i=l.top+(e?t.top:t.bottom);return{top:i,bottom:i,horizontal:[]}}}(t,e,i)}}function dr(t){let e=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==gi.LTR?e.left:e.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:e.top-t.scrollDOM.scrollTop*t.scaleY}}function fr(t,e,i,n){let s=t.coordsAtPos(e,2*i);if(!s)return n;let r=t.dom.getBoundingClientRect(),o=(s.top+s.bottom)/2,l=t.posAtCoords({x:r.left+1,y:o}),a=t.posAtCoords({x:r.right-1,y:o});return null==l||null==a?n:{from:Math.max(n.from,Math.min(l,a)),to:Math.min(n.to,Math.max(l,a))}}class pr{constructor(t,e){this.view=t,this.layer=e,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=t.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),e.above&&this.dom.classList.add("cm-layer-above"),e.class&&this.dom.classList.add(e.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(t.state),t.requestMeasure(this.measureReq),e.mount&&e.mount(this.dom,t)}update(t){t.startState.facet(gr)!=t.state.facet(gr)&&this.setOrder(t.state),(this.layer.update(t,this.dom)||t.geometryChanged)&&(this.scale(),t.view.requestMeasure(this.measureReq))}docViewUpdate(t){!1!==this.layer.updateOnDocViewUpdate&&t.requestMeasure(this.measureReq)}setOrder(t){let e=0,i=t.facet(gr);for(;e{return i=t,n=this.drawn[e],!(i.constructor==n.constructor&&i.eq(n));var i,n}))){let e=this.dom.firstChild,i=0;for(let n of t)n.update&&e&&n.constructor&&this.drawn[i].constructor&&n.update(e,this.drawn[i])?(e=e.nextSibling,i++):this.dom.insertBefore(n.draw(),e);for(;e;){let t=e.nextSibling;e.remove(),e=t}this.drawn=t}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const gr=I.define();function mr(t){return[Gi.define((e=>new pr(e,t))),gr.of(t)]}const vr=!qe.ios,wr=I.define({combine:t=>Ot(t,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(t,e)=>Math.min(t,e),drawRangeCursor:(t,e)=>t||e})});function br(t={}){return[wr.of(t),xr,Pr,Or,qi.of(!0)]}function yr(t){return t.startState.facet(wr)!=t.state.facet(wr)}const xr=mr({above:!0,markers(t){let{state:e}=t,i=e.facet(wr),n=[];for(let s of e.selection.ranges){let r=s==e.selection.main;if(s.empty?!r||vr:i.drawRangeCursor){let e=r?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",i=s.empty?s:B.cursor(s.head,s.head>s.anchor?-1:1);for(let s of ur.forRange(t,e,i))n.push(s)}}return n},update(t,e){t.transactions.some((t=>t.selection))&&(e.style.animationName="cm-blink"==e.style.animationName?"cm-blink2":"cm-blink");let i=yr(t);return i&&kr(t.state,e),t.docChanged||t.selectionSet||i},mount(t,e){kr(e.state,t)},class:"cm-cursorLayer"});function kr(t,e){e.style.animationDuration=t.facet(wr).cursorBlinkRate+"ms"}const Pr=mr({above:!1,markers:t=>t.state.selection.ranges.map((e=>e.empty?[]:ur.forRange(t,"cm-selectionBackground",e))).reduce(((t,e)=>t.concat(e))),update:(t,e)=>t.docChanged||t.selectionSet||t.viewportChanged||yr(t),class:"cm-selectionLayer"}),Sr={".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"}},".cm-content":{"& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}};vr&&(Sr[".cm-line"].caretColor=Sr[".cm-content"].caretColor="transparent !important");const Or=j.highest(Ks.theme(Sr)),Cr=dt.define({map:(t,e)=>null==t?null:e.mapPos(t)}),Ar=X.define({create:()=>null,update:(t,e)=>(null!=t&&(t=e.changes.mapPos(t)),e.effects.reduce(((t,e)=>e.is(Cr)?e.value:t),t))}),Mr=Gi.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var e;let i=t.state.field(Ar);null==i?null!=this.cursor&&(null===(e=this.cursor)||void 0===e||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(t.startState.field(Ar)!=i||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,e=t.state.field(Ar),i=null!=e&&t.coordsAtPos(e);if(!i)return null;let n=t.scrollDOM.getBoundingClientRect();return{left:i.left-n.left+t.scrollDOM.scrollLeft*t.scaleX,top:i.top-n.top+t.scrollDOM.scrollTop*t.scaleY,height:i.bottom-i.top}}drawCursor(t){if(this.cursor){let{scaleX:e,scaleY:i}=this.view;t?(this.cursor.style.left=t.left/e+"px",this.cursor.style.top=t.top/i+"px",this.cursor.style.height=t.height/i+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(Ar)!=t&&this.view.dispatch({effects:Cr.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){t.target!=this.view.contentDOM&&this.view.contentDOM.contains(t.relatedTarget)||this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function Tr(t,e,i,n,s){e.lastIndex=0;for(let r,o=t.iterRange(i,n),l=i;!o.next().done;l+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)s(l+r.index,r)}class Dr{constructor(t){const{regexp:e,decoration:i,decorate:n,boundary:s,maxLength:r=1e3}=t;if(!e.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=e,n)this.addMatch=(t,e,i,s)=>n(s,i,i+t[0].length,t,e);else if("function"==typeof i)this.addMatch=(t,e,n,s)=>{let r=i(t,e,n);r&&s(n,n+t[0].length,r)};else{if(!i)throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.addMatch=(t,e,n,s)=>s(n,n+t[0].length,i)}this.boundary=s,this.maxLength=r}createDeco(t){let e=new Et,i=e.add.bind(e);for(let{from:e,to:n}of function(t,e){let i=t.visibleRanges;if(1==i.length&&i[0].from==t.viewport.from&&i[0].to==t.viewport.to)return i;let n=[];for(let{from:s,to:r}of i)s=Math.max(t.state.doc.lineAt(s).from,s-e),r=Math.min(t.state.doc.lineAt(r).to,r+e),n.length&&n[n.length-1].to>=s?n[n.length-1].to=r:n.push({from:s,to:r});return n}(t,this.maxLength))Tr(t.state.doc,this.regexp,e,n,((e,n)=>this.addMatch(n,t,e,i)));return e.finish()}updateDeco(t,e){let i=1e9,n=-1;return t.docChanged&&t.changes.iterChanges(((e,s,r,o)=>{o>t.view.viewport.from&&r1e3?this.createDeco(t.view):n>-1?this.updateRange(t.view,e.map(t.changes),i,n):e}updateRange(t,e,i,n){for(let s of t.visibleRanges){let r=Math.max(s.from,i),o=Math.min(s.to,n);if(o>r){let i=t.state.doc.lineAt(r),n=i.toi.from;r--)if(this.boundary.test(i.text[r-1-i.from])){l=r;break}for(;oc.push(i.range(t,e));if(i==n)for(this.regexp.lastIndex=l-i.from;(h=this.regexp.exec(i.text))&&h.indexthis.addMatch(i,t,e,u)));e=e.update({filterFrom:l,filterTo:a,filter:(t,e)=>ta,add:c})}}return e}}const Er=null!=/x/.unicode?"gu":"g",Rr=new RegExp("[\0-\b\n--Ÿ­؜​‎‏\u2028\u2029‭‮⁦⁧⁩\ufeff-]",Er),Br={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"};let Nr=null;const Lr=I.define({combine(t){let e=Ot(t,{render:null,specialChars:Rr,addSpecialChars:null});return(e.replaceTabs=!function(){var t;if(null==Nr&&"undefined"!=typeof document&&document.body){let e=document.body.style;Nr=null!=(null!==(t=e.tabSize)&&void 0!==t?t:e.MozTabSize)}return Nr||!1}())&&(e.specialChars=new RegExp("\t|"+e.specialChars.source,Er)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,Er)),e}});function Ir(t={}){return[Lr.of(t),Fr||(Fr=Gi.fromClass(class{constructor(t){this.view=t,this.decorations=ni.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(Lr)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new Dr({regexp:t.specialChars,decoration:(e,i,n)=>{let{doc:s}=i.state,r=b(e[0],0);if(9==r){let t=s.lineAt(n),e=i.state.tabSize,r=qt(t.text,e,n-t.from);return ni.replace({widget:new Wr((e-r%e)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[r]||(this.decorationCache[r]=ni.replace({widget:new Vr(t,r)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let e=t.state.facet(Lr);t.startState.facet(Lr)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))]}let Fr=null;class Vr extends ei{constructor(t,e){super(),this.options=t,this.code=e}eq(t){return t.code==this.code}toDOM(t){let e=function(t){return t>=32?"•":10==t?"␤":String.fromCharCode(9216+t)}(this.code),i=t.state.phrase("Control character")+" "+(Br[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,e);if(n)return n;let s=document.createElement("span");return s.textContent=e,s.title=i,s.setAttribute("aria-label",i),s.className="cm-specialChar",s}ignoreEvent(){return!1}}class Wr extends ei{constructor(t){super(),this.width=t}eq(t){return t.width==this.width}toDOM(){let t=document.createElement("span");return t.textContent="\t",t.className="cm-tab",t.style.width=this.width+"px",t}ignoreEvent(){return!1}}const Hr=ni.line({class:"cm-activeLine"}),zr=Gi.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=-1,i=[];for(let n of t.state.selection.ranges){let s=t.lineBlockAt(n.head);s.from>e&&(i.push(Hr.range(s.from)),e=s.from)}return ni.set(i)}},{decorations:t=>t.decorations}),qr=2e3;function Xr(t,e){let i=t.posAtCoords({x:e.clientX,y:e.clientY},!1),n=t.state.doc.lineAt(i),s=i-n.from,r=s>qr?-1:s==n.length?function(t,e){let i=t.coordsAtPos(t.viewport.from);return i?Math.round(Math.abs((i.left-e)/t.defaultCharacterWidth)):-1}(t,e.clientX):qt(n.text,t.state.tabSize,i-n.from);return{line:n.number,col:r,off:s}}function Ur(t,e){let i=Xr(t,e),n=t.state.selection;return i?{update(t){if(t.docChanged){let e=t.changes.mapPos(t.startState.doc.line(i.line).from),s=t.state.doc.lineAt(e);i={line:s.number,col:i.col,off:Math.min(i.off,s.length)},n=n.map(t.changes)}},get(e,s,r){let o=Xr(t,e);if(!o)return n;let l=function(t,e,i){let n=Math.min(e.line,i.line),s=Math.max(e.line,i.line),r=[];if(e.off>qr||i.off>qr||e.col<0||i.col<0){let o=Math.min(e.off,i.off),l=Math.max(e.off,i.off);for(let e=n;e<=s;e++){let i=t.doc.line(e);i.length<=l&&r.push(B.range(i.from+o,i.to+l))}}else{let o=Math.min(e.col,i.col),l=Math.max(e.col,i.col);for(let e=n;e<=s;e++){let i=t.doc.line(e),n=Xt(i.text,o,t.tabSize,!0);if(n<0)r.push(B.cursor(i.to));else{let e=Xt(i.text,l,t.tabSize);r.push(B.range(i.from+n,i.from+e))}}}return r}(t.state,i,o);return l.length?r?B.create(l.concat(n.ranges)):B.create(l):n}}:null}const Qr={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},Yr={style:"cursor: crosshair"};function $r(t={}){let[e,i]=Qr[t.key||"Alt"],n=Gi.fromClass(class{constructor(t){this.view=t,this.isDown=!1}set(t){this.isDown!=t&&(this.isDown=t,this.view.update([]))}},{eventObservers:{keydown(t){this.set(t.keyCode==e||i(t))},keyup(t){t.keyCode!=e&&i(t)||this.set(!1)},mousemove(t){this.set(i(t))}}});return[n,Ks.contentAttributes.of((t=>{var e;return(null===(e=t.plugin(n))||void 0===e?void 0:e.isDown)?Yr:null}))]}const _r="-10000px";class jr{constructor(t,e,i,n){this.facet=e,this.createTooltipView=i,this.removeTooltipView=n,this.input=t.state.facet(e),this.tooltips=this.input.filter((t=>t));let s=null;this.tooltipViews=this.tooltips.map((t=>s=i(t,s)))}update(t,e){var i;let n=t.state.facet(this.facet),s=n.filter((t=>t));if(n===this.input){for(let e of this.tooltipViews)e.update&&e.update(t);return!1}let r=[],o=e?[]:null;for(let i=0;ie[i]=t)),e.length=o.length),this.input=n,this.tooltips=s,this.tooltipViews=r,!0}}function Kr(t){let{win:e}=t;return{top:0,left:0,bottom:e.innerHeight,right:e.innerWidth}}const Gr=I.define({combine:t=>{var e,i,n;return{position:qe.ios?"absolute":(null===(e=t.find((t=>t.position)))||void 0===e?void 0:e.position)||"fixed",parent:(null===(i=t.find((t=>t.parent)))||void 0===i?void 0:i.parent)||null,tooltipSpace:(null===(n=t.find((t=>t.tooltipSpace)))||void 0===n?void 0:n.tooltipSpace)||Kr}}}),Zr=new WeakMap,Jr=Gi.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=t.state.facet(Gr);this.position=e.position,this.parent=e.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver="function"==typeof ResizeObserver?new ResizeObserver((()=>this.measureSoon())):null,this.manager=new jr(t,io,((t,e)=>this.createTooltip(t,e)),(t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()})),this.above=this.manager.tooltips.map((t=>!!t.above)),this.intersectionObserver="function"==typeof IntersectionObserver?new IntersectionObserver((t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()}),{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout((()=>{this.measureTimeout=-1,this.maybeMeasure()}),50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(t,this.above);e&&this.observeIntersection();let i=e||t.geometryChanged,n=t.state.facet(Gr);if(n.position!=this.position&&!this.madeAbsolute){this.position=n.position;for(let t of this.manager.tooltipViews)t.dom.style.position=this.position;i=!0}if(n.parent!=this.parent){this.parent&&this.container.remove(),this.parent=n.parent,this.createContainer();for(let t of this.manager.tooltipViews)this.container.appendChild(t.dom);i=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);i&&this.maybeMeasure()}createTooltip(t,e){let i=t.create(this.view),n=e?e.dom:null;if(i.dom.classList.add("cm-tooltip"),t.arrow&&!i.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let t=document.createElement("div");t.className="cm-tooltip-arrow",i.dom.appendChild(t)}return i.dom.style.position=this.position,i.dom.style.top=_r,i.dom.style.left="0px",this.container.insertBefore(i.dom,n),i.mount&&i.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(i.dom),i}destroy(){var t,e,i;this.view.win.removeEventListener("resize",this.measureSoon);for(let e of this.manager.tooltipViews)e.dom.remove(),null===(t=e.destroy)||void 0===t||t.call(e);this.parent&&this.container.remove(),null===(e=this.resizeObserver)||void 0===e||e.disconnect(),null===(i=this.intersectionObserver)||void 0===i||i.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=this.view.dom.getBoundingClientRect(),e=1,i=1,n=!1;if("fixed"==this.position&&this.manager.tooltipViews.length){let{dom:t}=this.manager.tooltipViews[0];if(qe.gecko)n=t.offsetParent!=this.container.ownerDocument.body;else if(t.style.top==_r&&"0px"==t.style.left){let e=t.getBoundingClientRect();n=Math.abs(e.top+1e4)>1||Math.abs(e.left)>1}}if(n||"absolute"==this.position)if(this.parent){let t=this.parent.getBoundingClientRect();t.width&&t.height&&(e=t.width/this.parent.offsetWidth,i=t.height/this.parent.offsetHeight)}else({scaleX:e,scaleY:i}=this.view.viewState);return{editor:t,parent:this.parent?this.container.getBoundingClientRect():t,pos:this.manager.tooltips.map(((t,e)=>{let i=this.manager.tooltipViews[e];return i.getCoords?i.getCoords(t.pos):this.view.coordsAtPos(t.pos)})),size:this.manager.tooltipViews.map((({dom:t})=>t.getBoundingClientRect())),space:this.view.state.facet(Gr).tooltipSpace(this.view),scaleX:e,scaleY:i,makeAbsolute:n}}writeMeasure(t){var e;if(t.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let t of this.manager.tooltipViews)t.dom.style.position="absolute"}let{editor:i,space:n,scaleX:s,scaleY:r}=t,o=[];for(let l=0;l=Math.min(i.bottom,n.bottom)||u.rightMath.min(i.right,n.right)+.1){c.style.top=_r;continue}let f=a.arrow?h.dom.querySelector(".cm-tooltip-arrow"):null,p=f?7:0,g=d.right-d.left,m=null!==(e=Zr.get(h))&&void 0!==e?e:d.bottom-d.top,v=h.offset||eo,w=this.view.textDirection==gi.LTR,b=d.width>n.right-n.left?w?n.left:n.right-d.width:w?Math.max(n.left,Math.min(u.left-(f?14:0)+v.x,n.right-g)):Math.min(Math.max(n.left,u.left-g+(f?14:0)-v.x),n.right-g),y=this.above[l];!a.strictSide&&(y?u.top-(d.bottom-d.top)-v.yn.bottom)&&y==n.bottom-u.bottom>u.top-n.top&&(y=this.above[l]=!y);let x=(y?u.top-n.top:n.bottom-u.bottom)-p;if(xb&&t.topk&&(k=y?t.top-m-2-p:t.bottom+p+2);if("absolute"==this.position?(c.style.top=(k-t.parent.top)/r+"px",c.style.left=(b-t.parent.left)/s+"px"):(c.style.top=k/r+"px",c.style.left=b/s+"px"),f){let t=u.left+(w?v.x:-v.x)-(b+14-7);f.style.left=t/s+"px"}!0!==h.overlap&&o.push({left:b,top:k,right:P,bottom:k+m}),c.classList.toggle("cm-tooltip-above",y),c.classList.toggle("cm-tooltip-below",!y),h.positioned&&h.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=_r}},{eventObservers:{scroll(){this.maybeMeasure()}}}),to=Ks.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),eo={x:0,y:0},io=I.define({enables:[Jr,to]}),no=I.define({combine:t=>t.reduce(((t,e)=>t.concat(e)),[])});class so{static create(t){return new so(t)}constructor(t){this.view=t,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new jr(t,no,((t,e)=>this.createHostedView(t,e)),(t=>t.dom.remove()))}createHostedView(t,e){let i=t.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,e?e.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(t){for(let e of this.manager.tooltipViews)e.mount&&e.mount(t);this.mounted=!0}positioned(t){for(let e of this.manager.tooltipViews)e.positioned&&e.positioned(t)}update(t){this.manager.update(t)}destroy(){var t;for(let e of this.manager.tooltipViews)null===(t=e.destroy)||void 0===t||t.call(e)}passProp(t){let e;for(let i of this.manager.tooltipViews){let n=i[t];if(void 0!==n)if(void 0===e)e=n;else if(e!==n)return}return e}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}}const ro=io.compute([no],(t=>{let e=t.facet(no);return 0===e.length?null:{pos:Math.min(...e.map((t=>t.pos))),end:Math.max(...e.map((t=>{var e;return null!==(e=t.end)&&void 0!==e?e:t.pos}))),create:so.create,above:e[0].above,arrow:e.some((t=>t.arrow))}}));class oo{constructor(t,e,i,n,s){this.view=t,this.source=e,this.field=i,this.setHover=n,this.hoverTime=s,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:t.dom,time:0},this.checkHover=this.checkHover.bind(this),t.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),t.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout((()=>this.startHover()),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let t=Date.now()-this.lastMove.time;ti.bottom||e.xi.right+t.defaultCharacterWidth)return;let r=t.bidiSpans(t.state.doc.lineAt(n)).find((t=>t.from<=n&&t.to>=n)),o=r&&r.dir==gi.RTL?-1:1;s=e.x{this.pending==e&&(this.pending=null,!i||Array.isArray(i)&&!i.length||t.dispatch({effects:this.setHover.of(Array.isArray(i)?i:[i])}))}),(e=>$i(t.state,e,"hover tooltip")))}else!r||Array.isArray(r)&&!r.length||t.dispatch({effects:this.setHover.of(Array.isArray(r)?r:[r])})}get tooltip(){let t=this.view.plugin(Jr),e=t?t.manager.tooltips.findIndex((t=>t.create==so.create)):-1;return e>-1?t.manager.tooltipViews[e]:null}mousemove(t){var e,i;this.lastMove={x:t.clientX,y:t.clientY,target:t.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:s}=this;if(n.length&&s&&!function(t,e){let i=t.getBoundingClientRect();return e.clientX>=i.left-lo&&e.clientX<=i.right+lo&&e.clientY>=i.top-lo&&e.clientY<=i.bottom+lo}(s.dom,t)||this.pending){let{pos:s}=n[0]||this.pending,r=null!==(i=null===(e=n[0])||void 0===e?void 0:e.end)&&void 0!==i?i:s;(s==r?this.view.posAtCoords(this.lastMove)==s:function(t,e,i,n,s){let r=t.scrollDOM.getBoundingClientRect(),o=t.documentTop+t.documentPadding.top+t.contentHeight;if(r.left>n||r.rights||Math.min(r.bottom,o)=e&&l<=i}(this.view,s,r,t.clientX,t.clientY))||(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(t){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:e}=this;if(e.length){let{tooltip:e}=this;e&&e.dom.contains(t.relatedTarget)?this.watchTooltipLeave(e.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(t){let e=i=>{t.removeEventListener("mouseleave",e),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};t.addEventListener("mouseleave",e)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}}const lo=4;function ao(t,e={}){let i=dt.define(),n=X.define({create:()=>[],update(t,n){if(t.length&&(e.hideOnChange&&(n.docChanged||n.selection)?t=[]:e.hideOn&&(t=t.filter((t=>!e.hideOn(n,t)))),n.docChanged)){let e=[];for(let i of t){let t=n.changes.mapPos(i.pos,-1,P.TrackDel);if(null!=t){let s=Object.assign(Object.create(null),i);s.pos=t,null!=s.end&&(s.end=n.changes.mapPos(s.end)),e.push(s)}}t=e}for(let e of n.effects)e.is(i)&&(t=e.value),e.is(co)&&(t=[]);return t},provide:t=>no.from(t)});return{active:n,extension:[n,Gi.define((s=>new oo(s,t,n,i,e.hoverTime||300))),ro]}}function ho(t,e){let i=t.plugin(Jr);if(!i)return null;let n=i.manager.tooltips.indexOf(e);return n<0?null:i.manager.tooltipViews[n]}const co=dt.define(),uo=I.define({combine(t){let e,i;for(let n of t)e=e||n.topContainer,i=i||n.bottomContainer;return{topContainer:e,bottomContainer:i}}});function fo(t,e){let i=t.plugin(po),n=i?i.specs.indexOf(e):-1;return n>-1?i.panels[n]:null}const po=Gi.fromClass(class{constructor(t){this.input=t.state.facet(vo),this.specs=this.input.filter((t=>t)),this.panels=this.specs.map((e=>e(t)));let e=t.state.facet(uo);this.top=new go(t,!0,e.topContainer),this.bottom=new go(t,!1,e.bottomContainer),this.top.sync(this.panels.filter((t=>t.top))),this.bottom.sync(this.panels.filter((t=>!t.top)));for(let t of this.panels)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}update(t){let e=t.state.facet(uo);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new go(t.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new go(t.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let i=t.state.facet(vo);if(i!=this.input){let e=i.filter((t=>t)),n=[],s=[],r=[],o=[];for(let i of e){let e,l=this.specs.indexOf(i);l<0?(e=i(t.view),o.push(e)):(e=this.panels[l],e.update&&e.update(t)),n.push(e),(e.top?s:r).push(e)}this.specs=e,this.panels=n,this.top.sync(s),this.bottom.sync(r);for(let t of o)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}else for(let e of this.panels)e.update&&e.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>Ks.scrollMargins.of((e=>{let i=e.plugin(t);return i&&{top:i.top.scrollMargin(),bottom:i.bottom.scrollMargin()}}))});class go{constructor(t,e,i){this.view=t,this.top=e,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(t){for(let e of this.panels)e.destroy&&t.indexOf(e)<0&&e.destroy();this.panels=t,this.syncDOM()}syncDOM(){if(0==this.panels.length)return void(this.dom&&(this.dom.remove(),this.dom=void 0));if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let t=this.container||this.view.dom;t.insertBefore(this.dom,this.top?t.firstChild:null)}let t=this.dom.firstChild;for(let e of this.panels)if(e.dom.parentNode==this.dom){for(;t!=e.dom;)t=mo(t);t=t.nextSibling}else this.dom.insertBefore(e.dom,t);for(;t;)t=mo(t)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(this.container&&this.classes!=this.view.themeClasses){for(let t of this.classes.split(" "))t&&this.container.classList.remove(t);for(let t of(this.classes=this.view.themeClasses).split(" "))t&&this.container.classList.add(t)}}}function mo(t){let e=t.nextSibling;return t.remove(),e}const vo=I.define({enables:po});class wo extends Ct{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}}wo.prototype.elementClass="",wo.prototype.toDOM=void 0,wo.prototype.mapMode=P.TrackBefore,wo.prototype.startSide=wo.prototype.endSide=-1,wo.prototype.point=!0;const bo=I.define(),yo=I.define(),xo={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>Dt.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}},ko=I.define();function Po(t){return[Oo(),ko.of(Object.assign(Object.assign({},xo),t))]}const So=I.define({combine:t=>t.some((t=>t))});function Oo(t){return[Co]}const Co=Gi.fromClass(class{constructor(t){this.view=t,this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=t.state.facet(ko).map((e=>new Do(t,e)));for(let t of this.gutters)this.dom.appendChild(t.dom);this.fixed=!t.state.facet(So),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}update(t){if(this.updateGutters(t)){let e=this.prevViewport,i=t.view.viewport,n=Math.min(e.to,i.to)-Math.max(e.from,i.from);this.syncGutters(n<.8*(i.to-i.from))}t.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px"),this.view.state.facet(So)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&this.dom.remove();let i=Dt.iter(this.view.state.facet(bo),this.view.viewport.from),n=[],s=this.gutters.map((t=>new To(t,this.view.viewport,-this.view.documentPadding.top)));for(let t of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(t.type)){let e=!0;for(let r of t.type)if(r.type==ii.Text&&e){Mo(i,n,r.from);for(let t of s)t.line(this.view,r,n);e=!1}else if(r.widget)for(let t of s)t.widget(this.view,r)}else if(t.type==ii.Text){Mo(i,n,t.from);for(let e of s)e.line(this.view,t,n)}else if(t.widget)for(let e of s)e.widget(this.view,t);for(let t of s)t.finish();t&&this.view.scrollDOM.insertBefore(this.dom,e)}updateGutters(t){let e=t.startState.facet(ko),i=t.state.facet(ko),n=t.docChanged||t.heightChanged||t.viewportChanged||!Dt.eq(t.startState.facet(bo),t.state.facet(bo),t.view.viewport.from,t.view.viewport.to);if(e==i)for(let e of this.gutters)e.update(t)&&(n=!0);else{n=!0;let s=[];for(let n of i){let i=e.indexOf(n);i<0?s.push(new Do(this.view,n)):(this.gutters[i].update(t),s.push(this.gutters[i]))}for(let t of this.gutters)t.dom.remove(),s.indexOf(t)<0&&t.destroy();for(let t of s)this.dom.appendChild(t.dom);this.gutters=s}return n}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove()}},{provide:t=>Ks.scrollMargins.of((e=>{let i=e.plugin(t);return i&&0!=i.gutters.length&&i.fixed?e.textDirection==gi.LTR?{left:i.dom.offsetWidth*e.scaleX}:{right:i.dom.offsetWidth*e.scaleX}:null}))});function Ao(t){return Array.isArray(t)?t:[t]}function Mo(t,e,i){for(;t.value&&t.from<=i;)t.from==i&&e.push(t.value),t.next()}class To{constructor(t,e,i){this.gutter=t,this.height=i,this.i=0,this.cursor=Dt.iter(t.markers,e.from)}addElement(t,e,i){let{gutter:n}=this,s=(e.top-this.height)/t.scaleY,r=e.height/t.scaleY;if(this.i==n.elements.length){let e=new Eo(t,r,s,i);n.elements.push(e),n.dom.appendChild(e.dom)}else n.elements[this.i].update(t,r,s,i);this.height=e.bottom,this.i++}line(t,e,i){let n=[];Mo(this.cursor,n,e.from),i.length&&(n=n.concat(i));let s=this.gutter.config.lineMarker(t,e,n);s&&n.unshift(s);let r=this.gutter;(0!=n.length||r.config.renderEmptyElements)&&this.addElement(t,e,n)}widget(t,e){let i=this.gutter.config.widgetMarker(t,e.widget,e),n=i?[i]:null;for(let i of t.state.facet(yo)){let s=i(t,e.widget,e);s&&(n||(n=[])).push(s)}n&&this.addElement(t,e,n)}finish(){let t=this.gutter;for(;t.elements.length>this.i;){let e=t.elements.pop();t.dom.removeChild(e.dom),e.destroy()}}}class Do{constructor(t,e){this.view=t,this.config=e,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in e.domEventHandlers)this.dom.addEventListener(i,(n=>{let s,r=n.target;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let t=r.getBoundingClientRect();s=(t.top+t.bottom)/2}else s=n.clientY;let o=t.lineBlockAtHeight(s-t.documentTop);e.domEventHandlers[i](t,o,n)&&n.preventDefault()}));this.markers=Ao(e.markers(t)),e.initialSpacer&&(this.spacer=new Eo(t,0,0,[e.initialSpacer(t)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(t){let e=this.markers;if(this.markers=Ao(this.config.markers(t.view)),this.spacer&&this.config.updateSpacer){let e=this.config.updateSpacer(this.spacer.markers[0],t);e!=this.spacer.markers[0]&&this.spacer.update(t.view,0,0,[e])}let i=t.view.viewport;return!Dt.eq(this.markers,e,i.from,i.to)||!!this.config.lineMarkerChange&&this.config.lineMarkerChange(t)}destroy(){for(let t of this.elements)t.destroy()}}class Eo{constructor(t,e,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(t,e,i,n)}update(t,e,i,n){this.height!=e&&(this.height=e,this.dom.style.height=e+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),function(t,e){if(t.length!=e.length)return!1;for(let i=0;iOt(t,{formatNumber:String,domEventHandlers:{}},{domEventHandlers(t,e){let i=Object.assign({},t);for(let t in e){let n=i[t],s=e[t];i[t]=n?(t,e,i)=>n(t,e,i)||s(t,e,i):s}return i}})});class Lo extends wo{constructor(t){super(),this.number=t}eq(t){return this.number==t.number}toDOM(){return document.createTextNode(this.number)}}function Io(t,e){return t.state.facet(No).formatNumber(e,t.state)}const Fo=ko.compute([No],(t=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers:t=>t.state.facet(Ro),lineMarker:(t,e,i)=>i.some((t=>t.toDOM))?null:new Lo(Io(t,t.state.doc.lineAt(e.from).number)),widgetMarker:(t,e,i)=>{for(let n of t.state.facet(Bo)){let s=n(t,e,i);if(s)return s}return null},lineMarkerChange:t=>t.startState.facet(No)!=t.state.facet(No),initialSpacer:t=>new Lo(Io(t,Wo(t.state.doc.lines))),updateSpacer(t,e){let i=Io(e.view,Wo(e.view.state.doc.lines));return i==t.number?t:new Lo(i)},domEventHandlers:t.facet(No).domEventHandlers})));function Vo(t={}){return[No.of(t),Oo(),Fo]}function Wo(t){let e=9;for(;e{let e=[],i=-1;for(let n of t.selection.ranges){let s=t.doc.lineAt(n.head).from;s>i&&(i=s,e.push(Ho.range(s)))}return Dt.of(e)}));const qo=1024;let Xo=0;class Uo{constructor(t,e){this.from=t,this.to=e}}class Qo{constructor(t={}){this.id=Xo++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return"function"!=typeof t&&(t=_o.match(t)),e=>{let i=t(e);return void 0===i?null:[this,i]}}}Qo.closedBy=new Qo({deserialize:t=>t.split(" ")}),Qo.openedBy=new Qo({deserialize:t=>t.split(" ")}),Qo.group=new Qo({deserialize:t=>t.split(" ")}),Qo.isolate=new Qo({deserialize:t=>{if(t&&"rtl"!=t&&"ltr"!=t&&"auto"!=t)throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}}),Qo.contextHash=new Qo({perNode:!0}),Qo.lookAhead=new Qo({perNode:!0}),Qo.mounted=new Qo({perNode:!0});class Yo{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[Qo.mounted.id]}}const $o=Object.create(null);class _o{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):$o,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(null==t.name?8:0),n=new _o(t.name||"",e,t.id,i);if(t.props)for(let i of t.props)if(Array.isArray(i)||(i=i(n)),i){if(i[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");e[i[0].id]=i[1]}return n}prop(t){return this.props[t.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(t){if("string"==typeof t){if(this.name==t)return!0;let e=this.prop(Qo.group);return!!e&&e.indexOf(t)>-1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return t=>{for(let i=t.prop(Qo.group),n=-1;n<(i?i.length:0);n++){let s=e[n<0?t.name:i[n]];if(s)return s}}}}_o.none=new _o("",Object.create(null),0,8);class jo{constructor(t){this.types=t;for(let e=0;e=e){let o=new rl(r.tree,r.overlay[0].from+t.from,-1,t);(s||(s=[n])).push(nl(o,e,i,!1))}}return s?cl(s):n}(this,t,e)}iterate(t){let{enter:e,leave:i,from:n=0,to:s=this.length}=t,r=t.mode||0,o=(r&Zo.IncludeAnonymous)>0;for(let t=this.cursor(r|Zo.IncludeAnonymous);;){let r=!1;if(t.from<=s&&t.to>=n&&(!o&&t.type.isAnonymous||!1!==e(t))){if(t.firstChild())continue;r=!0}for(;r&&i&&(o||!t.type.isAnonymous)&&i(t),!t.nextSibling();){if(!t.parent())return;r=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:ml(_o.none,this.children,this.positions,0,this.children.length,0,this.length,((t,e,i)=>new Jo(this.type,t,e,i,this.propValues)),t.makeTree||((t,e,i)=>new Jo(_o.none,t,e,i)))}static build(t){return function(t){var e;let{buffer:i,nodeSet:n,maxBufferLength:s=qo,reused:r=[],minRepeatType:o=n.types.length}=t,l=Array.isArray(i)?new tl(i,i.length):i,a=n.types,h=0,c=0;function u(t,e,i,w,b,y){let{id:x,start:k,end:P,size:S}=l,O=c;for(;S<0;){if(l.next(),-1==S){let e=r[x];return i.push(e),void w.push(k-t)}if(-3==S)return void(h=x);if(-4==S)return void(c=x);throw new RangeError(`Unrecognized record size: ${S}`)}let C,A,M=a[x],T=k-t;if(P-k<=s&&(A=m(l.pos-e,b))){let e=new Uint16Array(A.size-A.skip),i=l.pos-A.size,s=e.length;for(;l.pos>i;)s=v(A.start,e,s);C=new el(e,P-A.start,n),T=A.start-t}else{let t=l.pos-S;l.next();let e=[],i=[],n=x>=o?x:-1,r=0,a=P;for(;l.pos>t;)n>=0&&l.id==n&&l.size>=0?(l.end<=a-s&&(p(e,i,k,r,l.end,a,n,O),r=e.length,a=l.end),l.next()):y>2500?d(k,t,e,i):u(k,t,e,i,n,y+1);if(n>=0&&r>0&&r-1&&r>0){let t=f(M);C=ml(M,e,i,0,e.length,0,P-k,t,t)}else C=g(M,e,i,P-k,O-P)}i.push(C),w.push(T)}function d(t,e,i,r){let o=[],a=0,h=-1;for(;l.pos>e;){let{id:t,start:e,end:i,size:n}=l;if(n>4)l.next();else{if(h>-1&&e=0;t-=3)e[i++]=o[t],e[i++]=o[t+1]-s,e[i++]=o[t+2]-s,e[i++]=i;i.push(new el(e,o[2]-s,n)),r.push(s-t)}}function f(t){return(e,i,n)=>{let s,r,o=0,l=e.length-1;if(l>=0&&(s=e[l])instanceof Jo){if(!l&&s.type==t&&s.length==n)return s;(r=s.prop(Qo.lookAhead))&&(o=i[l]+s.length+r)}return g(t,e,i,n,o)}}function p(t,e,i,s,r,o,l,a){let h=[],c=[];for(;t.length>s;)h.push(t.pop()),c.push(e.pop()+i-r);t.push(g(n.types[l],h,c,o-r,a-o)),e.push(r-i)}function g(t,e,i,n,s=0,r){if(h){let t=[Qo.contextHash,h];r=r?[t].concat(r):[t]}if(s>25){let t=[Qo.lookAhead,s];r=r?[t].concat(r):[t]}return new Jo(t,e,i,n,r)}function m(t,e){let i=l.fork(),n=0,r=0,a=0,h=i.end-s,c={size:0,start:0,skip:0};t:for(let s=i.pos-t;i.pos>s;){let t=i.size;if(i.id==e&&t>=0){c.size=n,c.start=r,c.skip=a,a+=4,n+=4,i.next();continue}let l=i.pos-t;if(t<0||l=o?4:0,d=i.start;for(i.next();i.pos>l;){if(i.size<0){if(-3!=i.size)break t;u+=4}else i.id>=o&&(u+=4);i.next()}r=d,n+=t,a+=u}return(e<0||n==t)&&(c.size=n,c.start=r,c.skip=a),c.size>4?c:void 0}function v(t,e,i){let{id:n,start:s,end:r,size:a}=l;if(l.next(),a>=0&&n4){let n=l.pos-(a-4);for(;l.pos>n;)i=v(t,e,i)}e[--i]=o,e[--i]=r-t,e[--i]=s-t,e[--i]=n}else-3==a?h=n:-4==a&&(c=n);return i}let w=[],b=[];for(;l.pos>0;)u(t.start||0,t.bufferStart||0,w,b,-1,0);let y=null!==(e=t.length)&&void 0!==e?e:w.length?b[0]+w[0].length:0;return new Jo(a[t.topID],w.reverse(),b.reverse(),y)}(t)}}Jo.empty=new Jo(_o.none,[],[],0);class tl{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new tl(this.buffer,this.index)}}class el{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return _o.none}toString(){let t=[];for(let e=0;e0));l=r[l+3]);return o}slice(t,e,i){let n=this.buffer,s=new Uint16Array(e-t),r=0;for(let o=t,l=0;o=e&&ie;case 1:return i<=e&&n>e;case 2:return n>e;case 4:return!0}}function nl(t,e,i,n){for(var s;t.from==t.to||(i<1?t.from>=e:t.from>e)||(i>-1?t.to<=e:t.to0?o.length:-1;t!=a;t+=e){let a=o[t],h=l[t]+r.from;if(il(n,i,h,h+a.length))if(a instanceof el){if(s&Zo.ExcludeBuffers)continue;let o=a.findChild(0,a.buffer.length,e,i-h,n);if(o>-1)return new hl(new al(r,a,t,h),null,o)}else if(s&Zo.IncludeAnonymous||!a.type.isAnonymous||fl(a)){let o;if(!(s&Zo.IgnoreMounts)&&(o=Yo.get(a))&&!o.overlay)return new rl(o.tree,h,t,r);let l=new rl(a,h,t,r);return s&Zo.IncludeAnonymous||!l.type.isAnonymous?l:l.nextChild(e<0?a.children.length-1:0,e,i,n)}}if(s&Zo.IncludeAnonymous||!r.type.isAnonymous)return null;if(t=r.index>=0?r.index+e:e<0?-1:r._parent._tree.children.length,r=r._parent,!r)return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&Zo.IgnoreOverlays)&&(n=Yo.get(this._tree))&&n.overlay){let i=t-this.from;for(let{from:t,to:s}of n.overlay)if((e>0?t<=i:t=i:s>i))return new rl(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function ol(t,e,i,n){let s=t.cursor(),r=[];if(!s.firstChild())return r;if(null!=i)for(let t=!1;!t;)if(t=s.type.is(i),!s.nextSibling())return r;for(;;){if(null!=n&&s.type.is(n))return r;if(s.type.is(e)&&r.push(s.node),!s.nextSibling())return null==n?r:[]}}function ll(t,e,i=e.length-1){for(let n=t.parent;i>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(e[i]&&e[i]!=n.name)return!1;i--}}return!0}class al{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}}class hl extends sl{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return s<0?null:new hl(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&Zo.ExcludeBuffers)return null;let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return s<0?null:new hl(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new hl(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new hl(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,s=i.buffer[this.index+3];if(s>n){let r=i.buffer[this.index+1];t.push(i.slice(n,s,r)),e.push(0)}return new Jo(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function cl(t){if(!t.length)return null;let e=0,i=t[0];for(let n=1;ni.from||s.to0){if(this.index-1)for(let n=e+t,s=t<0?-1:i._tree.children.length;n!=s;n+=t){let t=i._tree.children[n];if(this.mode&Zo.IncludeAnonymous||t instanceof el||!t.type.isAnonymous||fl(t))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let r=t;r;r=r._parent)if(r.index==n){if(n==this.index)return r;e=r,i=s+1;break t}n=this.stack[--s]}for(let t=i;t=0;s--){if(s<0)return ll(this.node,t,n);let r=i[e.buffer[this.stack[s]]];if(!r.isAnonymous){if(t[n]&&t[n]!=r.name)return!1;n--}}return!0}}function fl(t){return t.children.some((t=>t instanceof el||!t.type.isAnonymous||fl(t)))}const pl=new WeakMap;function gl(t,e){if(!t.isAnonymous||e instanceof el||e.type!=t)return 1;let i=pl.get(e);if(null==i){i=1;for(let n of e.children){if(n.type!=t||!(n instanceof Jo)){i=1;break}i+=gl(t,n)}pl.set(e,i)}return i}function ml(t,e,i,n,s,r,o,l,a){let h=0;for(let i=n;i=c)break;p+=e}if(h==s+1){if(p>c){let t=i[s];e(t.children,t.positions,0,t.children.length,n[s]+l);continue}u.push(i[s])}else{let e=n[h-1]+i[h-1].length-f;u.push(ml(t,i,n,s,h,f,e,null,a))}d.push(f+l-r)}}(e,i,n,s,0),(l||a)(u,d,o)}class vl{constructor(t,e,i,n,s=!1,r=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(s?1:0)|(r?2:0)}get openStart(){return(1&this.open)>0}get openEnd(){return(2&this.open)>0}static addTree(t,e=[],i=!1){let n=[new vl(0,t.length,t,0,!1,i)];for(let i of e)i.to>t.length&&n.push(i);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],s=1,r=t.length?t[0]:null;for(let o=0,l=0,a=0;;o++){let h=o=i)for(;r&&r.from=e.from||c<=e.to||a){let t=Math.max(e.from,l)-a,i=Math.min(e.to,c)-a;e=t>=i?null:new vl(t,i,e.tree,e.offset+a,o>0,!!h)}if(e&&n.push(e),r.to>c)break;r=snew Uo(t.from,t.to))):[new Uo(0,0)]:[new Uo(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let t=n.advance();if(t)return t}}}class bl{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}}new Qo({perNode:!0});let yl=0;class xl{constructor(t,e,i){this.set=t,this.base=e,this.modified=i,this.id=yl++}static define(t){if(null==t?void 0:t.base)throw new Error("Can not derive from a modified tag");let e=new xl([],null,[]);if(e.set.push(e),t)for(let i of t.set)e.set.push(i);return e}static defineModifier(){let t=new Pl;return e=>e.modified.indexOf(t)>-1?e:Pl.get(e.base||e,e.modified.concat(t).sort(((t,e)=>t.id-e.id)))}}let kl=0;class Pl{constructor(){this.instances=[],this.id=kl++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find((i=>{return i.base==t&&(n=e,s=i.modified,n.length==s.length&&n.every(((t,e)=>t==s[e])));var n,s}));if(i)return i;let n=[],s=new xl(n,t,e);for(let t of e)t.instances.push(s);let r=function(t){let e=[[]];for(let i=0;ie.length-t.length))}(e);for(let e of t.set)if(!e.modified.length)for(let t of r)n.push(Pl.get(e,t));return s}}function Sl(t){let e=Object.create(null);for(let i in t){let n=t[i];Array.isArray(n)||(n=[n]);for(let t of i.split(" "))if(t){let i=[],s=2,r=t;for(let e=0;;){if("..."==r&&e>0&&e+3==t.length){s=1;break}let n=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!n)throw new RangeError("Invalid path: "+t);if(i.push("*"==n[0]?"":'"'==n[0][0]?JSON.parse(n[0]):n[0]),e+=n[0].length,e==t.length)break;let o=t[e++];if(e==t.length&&"!"==o){s=0;break}if("/"!=o)throw new RangeError("Invalid path: "+t);r=t.slice(e)}let o=i.length-1,l=i[o];if(!l)throw new RangeError("Invalid path: "+t);let a=new Cl(n,s,o>0?i.slice(0,o):null);e[l]=a.sort(e[l])}}return Ol.add(e)}const Ol=new Qo;class Cl{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return 0==this.mode}get inherit(){return 1==this.mode}sort(t){return!t||t.depth{let e=s;for(let n of t)for(let t of n.set){let n=i[t.id];if(n){e=e?e+" "+n:n;break}}return e},scope:n}}function Ml(t,e,i,n=0,s=t.length){let r=new Tl(n,Array.isArray(e)?e:[e],i);r.highlightRange(t.cursor(),n,s,"",r.highlighters),r.flush(s)}Cl.empty=new Cl([],2,null);class Tl{constructor(t,e,i){this.at=t,this.highlighters=e,this.span=i,this.class=""}startSpan(t,e){e!=this.class&&(this.flush(t),t>this.at&&(this.at=t),this.class=e)}flush(t){t>this.at&&this.class&&this.span(this.at,t,this.class)}highlightRange(t,e,i,n,s){let{type:r,from:o,to:l}=t;if(o>=i||l<=e)return;r.isTop&&(s=this.highlighters.filter((t=>!t.scope||t.scope(r))));let a=n,h=function(t){let e=t.type.prop(Ol);for(;e&&e.context&&!t.matchContext(e.context);)e=e.next;return e||null}(t)||Cl.empty,c=function(t,e){let i=null;for(let n of t){let t=n.style(e);t&&(i=i?i+" "+t:t)}return i}(s,h.tags);if(c&&(a&&(a+=" "),a+=c,1==h.mode&&(n+=(n?" ":"")+c)),this.startSpan(Math.max(e,o),a),h.opaque)return;let u=t.tree&&t.tree.prop(Qo.mounted);if(u&&u.overlay){let r=t.node.enter(u.overlay[0].from+o,1),h=this.highlighters.filter((t=>!t.scope||t.scope(u.tree.type))),c=t.firstChild();for(let d=0,f=o;;d++){let p=d=g)&&t.nextSibling()););if(!p||g>i)break;f=p.to+o,f>e&&(this.highlightRange(r.cursor(),Math.max(e,p.from+o),Math.min(i,f),"",h),this.startSpan(Math.min(i,f),a))}c&&t.parent()}else if(t.firstChild()){u&&(n="");do{if(!(t.to<=e)){if(t.from>=i)break;this.highlightRange(t,e,i,n,s),this.startSpan(Math.min(i,t.to),a)}}while(t.nextSibling());t.parent()}}}const Dl=xl.define,El=Dl(),Rl=Dl(),Bl=Dl(Rl),Nl=Dl(Rl),Ll=Dl(),Il=Dl(Ll),Fl=Dl(Ll),Vl=Dl(),Wl=Dl(Vl),Hl=Dl(),zl=Dl(),ql=Dl(),Xl=Dl(ql),Ul=Dl(),Ql={comment:El,lineComment:Dl(El),blockComment:Dl(El),docComment:Dl(El),name:Rl,variableName:Dl(Rl),typeName:Bl,tagName:Dl(Bl),propertyName:Nl,attributeName:Dl(Nl),className:Dl(Rl),labelName:Dl(Rl),namespace:Dl(Rl),macroName:Dl(Rl),literal:Ll,string:Il,docString:Dl(Il),character:Dl(Il),attributeValue:Dl(Il),number:Fl,integer:Dl(Fl),float:Dl(Fl),bool:Dl(Ll),regexp:Dl(Ll),escape:Dl(Ll),color:Dl(Ll),url:Dl(Ll),keyword:Hl,self:Dl(Hl),null:Dl(Hl),atom:Dl(Hl),unit:Dl(Hl),modifier:Dl(Hl),operatorKeyword:Dl(Hl),controlKeyword:Dl(Hl),definitionKeyword:Dl(Hl),moduleKeyword:Dl(Hl),operator:zl,derefOperator:Dl(zl),arithmeticOperator:Dl(zl),logicOperator:Dl(zl),bitwiseOperator:Dl(zl),compareOperator:Dl(zl),updateOperator:Dl(zl),definitionOperator:Dl(zl),typeOperator:Dl(zl),controlOperator:Dl(zl),punctuation:ql,separator:Dl(ql),bracket:Xl,angleBracket:Dl(Xl),squareBracket:Dl(Xl),paren:Dl(Xl),brace:Dl(Xl),content:Vl,heading:Wl,heading1:Dl(Wl),heading2:Dl(Wl),heading3:Dl(Wl),heading4:Dl(Wl),heading5:Dl(Wl),heading6:Dl(Wl),contentSeparator:Dl(Vl),list:Dl(Vl),quote:Dl(Vl),emphasis:Dl(Vl),strong:Dl(Vl),link:Dl(Vl),monospace:Dl(Vl),strikethrough:Dl(Vl),inserted:Dl(),deleted:Dl(),changed:Dl(),invalid:Dl(),meta:Ul,documentMeta:Dl(Ul),annotation:Dl(Ul),processingInstruction:Dl(Ul),definition:xl.defineModifier(),constant:xl.defineModifier(),function:xl.defineModifier(),standard:xl.defineModifier(),local:xl.defineModifier(),special:xl.defineModifier()};var Yl;Al([{tag:Ql.link,class:"tok-link"},{tag:Ql.heading,class:"tok-heading"},{tag:Ql.emphasis,class:"tok-emphasis"},{tag:Ql.strong,class:"tok-strong"},{tag:Ql.keyword,class:"tok-keyword"},{tag:Ql.atom,class:"tok-atom"},{tag:Ql.bool,class:"tok-bool"},{tag:Ql.url,class:"tok-url"},{tag:Ql.labelName,class:"tok-labelName"},{tag:Ql.inserted,class:"tok-inserted"},{tag:Ql.deleted,class:"tok-deleted"},{tag:Ql.literal,class:"tok-literal"},{tag:Ql.string,class:"tok-string"},{tag:Ql.number,class:"tok-number"},{tag:[Ql.regexp,Ql.escape,Ql.special(Ql.string)],class:"tok-string2"},{tag:Ql.variableName,class:"tok-variableName"},{tag:Ql.local(Ql.variableName),class:"tok-variableName tok-local"},{tag:Ql.definition(Ql.variableName),class:"tok-variableName tok-definition"},{tag:Ql.special(Ql.variableName),class:"tok-variableName2"},{tag:Ql.definition(Ql.propertyName),class:"tok-propertyName tok-definition"},{tag:Ql.typeName,class:"tok-typeName"},{tag:Ql.namespace,class:"tok-namespace"},{tag:Ql.className,class:"tok-className"},{tag:Ql.macroName,class:"tok-macroName"},{tag:Ql.propertyName,class:"tok-propertyName"},{tag:Ql.operator,class:"tok-operator"},{tag:Ql.comment,class:"tok-comment"},{tag:Ql.meta,class:"tok-meta"},{tag:Ql.invalid,class:"tok-invalid"},{tag:Ql.punctuation,class:"tok-punctuation"}]);const $l=new Qo;const _l=new Qo;class jl{constructor(t,e,i=[],n=""){this.data=t,this.name=n,St.prototype.hasOwnProperty("tree")||Object.defineProperty(St.prototype,"tree",{get(){return Zl(this)}}),this.parser=e,this.extension=[la.of(this),St.languageData.of(((t,e,i)=>{let n=Kl(t,e,i),s=n.type.prop($l);if(!s)return[];let r=t.facet(s),o=n.type.prop(_l);if(o){let s=n.resolve(e-n.from,i);for(let e of o)if(e.test(s,t)){let i=t.facet(e.facet);return"replace"==e.type?i:i.concat(r)}}return r}))].concat(i)}isActiveAt(t,e,i=-1){return Kl(t,e,i).type.prop($l)==this.data}findRegions(t){let e=t.facet(la);if((null==e?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(t,e)=>{if(t.prop($l)==this.data)return void i.push({from:e,to:e+t.length});let s=t.prop(Qo.mounted);if(s){if(s.tree.prop($l)==this.data){if(s.overlay)for(let t of s.overlay)i.push({from:t.from+e,to:t.to+e});else i.push({from:e,to:e+t.length});return}if(s.overlay){let t=i.length;if(n(s.tree,s.overlay[0].from+e),i.length>t)return}}for(let i=0;it.concat(i):void 0}));var i;return new Gl(e,t.parser.configure({props:[$l.add((t=>t.isTop?e:void 0))]}),t.name)}configure(t,e){return new Gl(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function Zl(t){let e=t.field(jl.state,!1);return e?e.tree:Jo.empty}class Jl{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}}let ta=null;class ea{constructor(t,e,i=[],n,s,r,o,l){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=s,this.viewport=r,this.skipped=o,this.scheduleOn=l,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new ea(t,e,[],Jo.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Jl(this.state.doc),this.fragments)}work(t,e){return null!=e&&e>=this.state.doc.length&&(e=void 0),this.tree!=Jo.empty&&this.isDone(null!=e?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext((()=>{var i;if("number"==typeof t){let e=Date.now()+t;t=()=>Date.now()>e}for(this.parse||(this.parse=this.startParse()),null!=e&&(null==this.parse.stoppedAt||this.parse.stoppedAt>e)&&e=this.treeLen&&((null==this.parse.stoppedAt||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext((()=>{for(;!(e=this.parse.advance()););})),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(vl.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=ta;ta=this;try{return t()}finally{ta=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=ia(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:s,viewport:r,skipped:o}=this;if(this.takeTree(),!t.empty){let e=[];if(t.iterChangedRanges(((t,i,n,s)=>e.push({fromA:t,toA:i,fromB:n,toB:s}))),i=vl.applyChanges(i,e),n=Jo.empty,s=0,r={from:t.mapPos(r.from,-1),to:t.mapPos(r.to,1)},this.skipped.length){o=[];for(let e of this.skipped){let i=t.mapPos(e.from,1),n=t.mapPos(e.to,-1);it.from&&(this.fragments=ia(this.fragments,i,n),this.skipped.splice(e--,1))}return!(this.skipped.length>=e)&&(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends wl{createParse(e,i,n){let s=n[0].from,r=n[n.length-1].to;return{parsedPos:s,advance(){let e=ta;if(e){for(let t of n)e.tempSkipped.push(t);t&&(e.scheduleOn=e.scheduleOn?Promise.all([e.scheduleOn,t]):t)}return this.parsedPos=r,new Jo(_o.none,[],[],r-s)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&0==e[0].from&&e[0].to>=t}static get(){return ta}}function ia(t,e,i){return vl.applyChanges(t,[{fromA:e,toA:i,fromB:e,toB:i}])}class na{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new na(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=ea.create(t.facet(la).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new na(i)}}jl.state=X.define({create:na.init,update(t,e){for(let t of e.effects)if(t.is(jl.setState))return t.value;return e.startState.facet(la)!=e.state.facet(la)?na.init(e.state):t.apply(e)}});let sa=t=>{let e=setTimeout((()=>t()),500);return()=>clearTimeout(e)};"undefined"!=typeof requestIdleCallback&&(sa=t=>{let e=-1,i=setTimeout((()=>{e=requestIdleCallback(t,{timeout:400})}),100);return()=>e<0?clearTimeout(i):cancelIdleCallback(e)});const ra="undefined"!=typeof navigator&&(null===(Yl=navigator.scheduling)||void 0===Yl?void 0:Yl.isInputPending)?()=>navigator.scheduling.isInputPending():null,oa=Gi.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(jl.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(jl.state);e.tree==e.context.tree&&e.context.isDone(t.doc.length)||(this.working=sa(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEndn+1e3,l=s.context.work((()=>ra&&ra()||Date.now()>r),n+(o?0:1e5));this.chunkBudget-=Date.now()-e,(l||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:jl.setState.of(new na(s.context))})),this.chunkBudget>0&&(!l||o)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then((()=>this.scheduleWork())).catch((t=>$i(this.view.state,t))).then((()=>this.workScheduled--)),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),la=I.define({combine:t=>t.length?t[0]:null,enables:t=>[jl.state,oa,Ks.contentAttributes.compute([t],(e=>{let i=e.facet(t);return i&&i.name?{"data-language":i.name}:{}}))]});class aa{constructor(t,e=[]){this.language=t,this.support=e,this.extension=[t,e]}}const ha=I.define(),ca=I.define({combine:t=>{if(!t.length)return"  ";let e=t[0];if(!e||/\S/.test(e)||Array.from(e).some((t=>t!=e[0])))throw new Error("Invalid indent unit: "+JSON.stringify(t[0]));return e}});function ua(t){let e=t.facet(ca);return 9==e.charCodeAt(0)?t.tabSize*e.length:e.length}function da(t,e){let i="",n=t.tabSize,s=t.facet(ca)[0];if("\t"==s){for(;e>=n;)i+="\t",e-=n;s=" "}for(let t=0;t=e?function(t,e,i){let n=e.resolveStack(i),s=n.node.enterUnfinishedNodesBefore(i);if(s!=n.node){let t=[];for(let e=s;e!=n.node;e=e.parent)t.push(e);for(let e=t.length-1;e>=0;e--)n={node:t[e],next:n}}return ma(n,t,i)}(t,i,e):null}class pa{constructor(t,e={}){this.state=t,this.options=e,this.unit=ua(t)}lineAt(t,e=1){let i=this.state.doc.lineAt(t),{simulateBreak:n,simulateDoubleBreak:s}=this.options;return null!=n&&n>=i.from&&n<=i.to?s&&n==t?{text:"",from:t}:(e<0?n-1&&(s+=r-this.countColumn(i,i.search(/\S|$/))),s}countColumn(t,e=t.length){return qt(t,this.state.tabSize,e)}lineIndent(t,e=1){let{text:i,from:n}=this.lineAt(t,e),s=this.options.overrideIndentation;if(s){let t=s(n);if(t>-1)return t}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const ga=new Qo;function ma(t,e,i){for(let n=t;n;n=n.next){let t=va(n.node);if(t)return t(ba.create(e,i,n))}return 0}function va(t){let e=t.type.prop(ga);if(e)return e;let i,n=t.firstChild;if(n&&(i=n.type.prop(Qo.closedBy))){let e=t.lastChild,n=e&&i.indexOf(e.name)>-1;return t=>xa(t,!0,1,void 0,n&&!function(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}(t)?e.from:void 0)}return null==t.parent?wa:null}function wa(){return 0}class ba extends pa{constructor(t,e,i){super(t.state,t.options),this.base=t,this.pos=e,this.context=i}get node(){return this.context.node}static create(t,e,i){return new ba(t,e,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(t){let e=this.state.doc.lineAt(t.from);for(;;){let i=t.resolve(e.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(ya(i,t))break;e=this.state.doc.lineAt(i.from)}return this.lineIndent(e.from)}continue(){return ma(this.context.next,this.base,this.pos)}}function ya(t,e){for(let i=e;i;i=i.parent)if(t==i)return!0;return!1}function xa(t,e,i,n,s){let r=t.textAfter,o=r.match(/^\s*/)[0].length,l=n&&r.slice(o,o+n.length)==n||s==t.pos+o,a=e?function(t){let e=t.node,i=e.childAfter(e.from),n=e.lastChild;if(!i)return null;let s=t.options.simulateBreak,r=t.state.doc.lineAt(i.from),o=null==s||s<=r.from?r.to:Math.min(r.to,s);for(let t=i.to;;){let s=e.childAfter(t);if(!s||s==n)return null;if(!s.type.isSkipped)return s.fromi)continue;if(s&&o.from=e&&n.to>i&&(s=n)}}return s}(t,e,i)}function Ca(t,e){let i=e.mapPos(t.from,1),n=e.mapPos(t.to,-1);return i>=n?void 0:{from:i,to:n}}const Aa=dt.define({map:Ca}),Ma=dt.define({map:Ca});function Ta(t){let e=[];for(let{head:i}of t.state.selection.ranges)e.some((t=>t.from<=i&&t.to>=i))||e.push(t.lineBlockAt(i));return e}const Da=X.define({create:()=>ni.none,update(t,e){t=t.map(e.changes);for(let i of e.effects)if(i.is(Aa)&&!Ra(t,i.value.from,i.value.to)){let{preparePlaceholder:n}=e.state.facet(Fa),s=n?ni.replace({widget:new za(n(e.state,i.value))}):Ha;t=t.update({add:[s.range(i.value.from,i.value.to)]})}else i.is(Ma)&&(t=t.update({filter:(t,e)=>i.value.from!=t||i.value.to!=e,filterFrom:i.value.from,filterTo:i.value.to}));if(e.selection){let i=!1,{head:n}=e.selection.main;t.between(n,n,((t,e)=>{tn&&(i=!0)})),i&&(t=t.update({filterFrom:n,filterTo:n,filter:(t,e)=>e<=n||t>=n}))}return t},provide:t=>Ks.decorations.from(t),toJSON(t,e){let i=[];return t.between(0,e.doc.length,((t,e)=>{i.push(t,e)})),i},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let i=0;i{(!s||s.from>t)&&(s={from:t,to:e})})),s}function Ra(t,e,i){let n=!1;return t.between(e,e,((t,s)=>{t==e&&s==i&&(n=!0)})),n}function Ba(t,e){return t.field(Da,!1)?e:e.concat(dt.appendConfig.of(Va()))}function Na(t,e,i=!0){let n=t.state.doc.lineAt(e.from).number,s=t.state.doc.lineAt(e.to).number;return Ks.announce.of(`${t.state.phrase(i?"Folded lines":"Unfolded lines")} ${n} ${t.state.phrase("to")} ${s}.`)}const La=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:t=>{for(let e of Ta(t)){let i=Oa(t.state,e.from,e.to);if(i)return t.dispatch({effects:Ba(t.state,[Aa.of(i),Na(t,i)])}),!0}return!1}},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:t=>{if(!t.state.field(Da,!1))return!1;let e=[];for(let i of Ta(t)){let n=Ea(t.state,i.from,i.to);n&&e.push(Ma.of(n),Na(t,n,!1))}return e.length&&t.dispatch({effects:e}),e.length>0}},{key:"Ctrl-Alt-[",run:t=>{let{state:e}=t,i=[];for(let n=0;n{let e=t.state.field(Da,!1);if(!e||!e.size)return!1;let i=[];return e.between(0,t.state.doc.length,((t,e)=>{i.push(Ma.of({from:t,to:e}))})),t.dispatch({effects:i}),!0}}],Ia={placeholderDOM:null,preparePlaceholder:null,placeholderText:"…"},Fa=I.define({combine:t=>Ot(t,Ia)});function Va(t){return[Da,Qa]}function Wa(t,e){let{state:i}=t,n=i.facet(Fa),s=e=>{let i=t.lineBlockAt(t.posAtDOM(e.target)),n=Ea(t.state,i.from,i.to);n&&t.dispatch({effects:Ma.of(n)}),e.preventDefault()};if(n.placeholderDOM)return n.placeholderDOM(t,s,e);let r=document.createElement("span");return r.textContent=n.placeholderText,r.setAttribute("aria-label",i.phrase("folded code")),r.title=i.phrase("unfold"),r.className="cm-foldPlaceholder",r.onclick=s,r}const Ha=ni.replace({widget:new class extends ei{toDOM(t){return Wa(t,null)}}});class za extends ei{constructor(t){super(),this.value=t}eq(t){return this.value==t.value}toDOM(t){return Wa(t,this.value)}}const qa={openText:"⌄",closedText:"›",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1};class Xa extends wo{constructor(t,e){super(),this.config=t,this.open=e}eq(t){return this.config==t.config&&this.open==t.open}toDOM(t){if(this.config.markerDOM)return this.config.markerDOM(this.open);let e=document.createElement("span");return e.textContent=this.open?this.config.openText:this.config.closedText,e.title=t.state.phrase(this.open?"Fold line":"Unfold line"),e}}function Ua(t={}){let e=Object.assign(Object.assign({},qa),t),i=new Xa(e,!0),n=new Xa(e,!1),s=Gi.fromClass(class{constructor(t){this.from=t.viewport.from,this.markers=this.buildMarkers(t)}update(t){(t.docChanged||t.viewportChanged||t.startState.facet(la)!=t.state.facet(la)||t.startState.field(Da,!1)!=t.state.field(Da,!1)||Zl(t.startState)!=Zl(t.state)||e.foldingChanged(t))&&(this.markers=this.buildMarkers(t.view))}buildMarkers(t){let e=new Et;for(let s of t.viewportLineBlocks){let r=Ea(t.state,s.from,s.to)?n:Oa(t.state,s.from,s.to)?i:null;r&&e.add(s.from,s.from,r)}return e.finish()}}),{domEventHandlers:r}=e;return[s,Po({class:"cm-foldGutter",markers(t){var e;return(null===(e=t.plugin(s))||void 0===e?void 0:e.markers)||Dt.empty},initialSpacer:()=>new Xa(e,!1),domEventHandlers:Object.assign(Object.assign({},r),{click:(t,e,i)=>{if(r.click&&r.click(t,e,i))return!0;let n=Ea(t.state,e.from,e.to);if(n)return t.dispatch({effects:Ma.of(n)}),!0;let s=Oa(t.state,e.from,e.to);return!!s&&(t.dispatch({effects:Aa.of(s)}),!0)}})}),Va()]}const Qa=Ks.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}});class Ya{constructor(t,e){let i;function n(t){let e=$t.newName();return(i||(i=Object.create(null)))["."+e]=t,e}this.specs=t;const s="string"==typeof e.all?e.all:e.all?n(e.all):void 0,r=e.scope;this.scope=r instanceof jl?t=>t.prop($l)==r.data:r?t=>t==r:void 0,this.style=Al(t.map((t=>({tag:t.tag,class:t.class||n(Object.assign({},t,{tag:null}))}))),{all:s}).style,this.module=i?new $t(i):null,this.themeType=e.themeType}static define(t,e){return new Ya(t,e||{})}}const $a=I.define(),_a=I.define({combine:t=>t.length?[t[0]]:null});function ja(t){let e=t.facet($a);return e.length?e:t.facet(_a)}function Ka(t,e){let i,n=[Za];return t instanceof Ya&&(t.module&&n.push(Ks.styleModule.of(t.module)),i=t.themeType),(null==e?void 0:e.fallback)?n.push(_a.of(t)):i?n.push($a.computeN([Ks.darkTheme],(e=>e.facet(Ks.darkTheme)==("dark"==i)?[t]:[]))):n.push($a.of(t)),n}class Ga{constructor(t){this.markCache=Object.create(null),this.tree=Zl(t.state),this.decorations=this.buildDeco(t,ja(t.state)),this.decoratedTo=t.viewport.to}update(t){let e=Zl(t.state),i=ja(t.state),n=i!=ja(t.startState),{viewport:s}=t.view,r=t.changes.mapPos(this.decoratedTo,1);e.length=s.to?(this.decorations=this.decorations.map(t.changes),this.decoratedTo=r):(e!=this.tree||t.viewportChanged||n)&&(this.tree=e,this.decorations=this.buildDeco(t.view,i),this.decoratedTo=s.to)}buildDeco(t,e){if(!e||!this.tree.length)return ni.none;let i=new Et;for(let{from:n,to:s}of t.visibleRanges)Ml(this.tree,e,((t,e,n)=>{i.add(t,e,this.markCache[n]||(this.markCache[n]=ni.mark({class:n})))}),n,s);return i.finish()}}const Za=j.high(Gi.fromClass(Ga,{decorations:t=>t.decorations})),Ja=Ya.define([{tag:Ql.meta,color:"#404740"},{tag:Ql.link,textDecoration:"underline"},{tag:Ql.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Ql.emphasis,fontStyle:"italic"},{tag:Ql.strong,fontWeight:"bold"},{tag:Ql.strikethrough,textDecoration:"line-through"},{tag:Ql.keyword,color:"#708"},{tag:[Ql.atom,Ql.bool,Ql.url,Ql.contentSeparator,Ql.labelName],color:"#219"},{tag:[Ql.literal,Ql.inserted],color:"#164"},{tag:[Ql.string,Ql.deleted],color:"#a11"},{tag:[Ql.regexp,Ql.escape,Ql.special(Ql.string)],color:"#e40"},{tag:Ql.definition(Ql.variableName),color:"#00f"},{tag:Ql.local(Ql.variableName),color:"#30a"},{tag:[Ql.typeName,Ql.namespace],color:"#085"},{tag:Ql.className,color:"#167"},{tag:[Ql.special(Ql.variableName),Ql.macroName],color:"#256"},{tag:Ql.definition(Ql.propertyName),color:"#00c"},{tag:Ql.comment,color:"#940"},{tag:Ql.invalid,color:"#f00"}]),th=Ks.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),eh=1e4,ih="()[]{}",nh=I.define({combine:t=>Ot(t,{afterCursor:!0,brackets:ih,maxScanDistance:eh,renderMatch:oh})}),sh=ni.mark({class:"cm-matchingBracket"}),rh=ni.mark({class:"cm-nonmatchingBracket"});function oh(t){let e=[],i=t.matched?sh:rh;return e.push(i.range(t.start.from,t.start.to)),t.end&&e.push(i.range(t.end.from,t.end.to)),e}const lh=X.define({create:()=>ni.none,update(t,e){if(!e.docChanged&&!e.selection)return t;let i=[],n=e.state.facet(nh);for(let t of e.state.selection.ranges){if(!t.empty)continue;let s=fh(e.state,t.head,-1,n)||t.head>0&&fh(e.state,t.head-1,1,n)||n.afterCursor&&(fh(e.state,t.head,1,n)||t.headKs.decorations.from(t)}),ah=[lh,th];function hh(t={}){return[nh.of(t),ah]}const ch=new Qo;function uh(t,e,i){let n=t.prop(e<0?Qo.openedBy:Qo.closedBy);if(n)return n;if(1==t.name.length){let n=i.indexOf(t.name);if(n>-1&&n%2==(e<0?1:0))return[i[n+e]]}return null}function dh(t){let e=t.type.prop(ch);return e?e(t.node):t}function fh(t,e,i,n={}){let s=n.maxScanDistance||eh,r=n.brackets||ih,o=Zl(t),l=o.resolveInner(e,i);for(let n=l;n;n=n.parent){let s=uh(n.type,i,r);if(s&&n.from0?e>=o.from&&eo.from&&e<=o.to))return ph(t,e,i,n,o,s,r)}}return function(t,e,i,n,s,r,o){let l=i<0?t.sliceDoc(e-1,e):t.sliceDoc(e,e+1),a=o.indexOf(l);if(a<0||a%2==0!=i>0)return null;let h={from:i<0?e-1:e,to:i>0?e+1:e},c=t.doc.iterRange(e,i>0?t.doc.length:0),u=0;for(let t=0;!c.next().done&&t<=r;){let r=c.value;i<0&&(t+=r.length);let l=e+t*i;for(let t=i>0?0:r.length-1,e=i>0?r.length:-1;t!=e;t+=i){let e=o.indexOf(r[t]);if(!(e<0||n.resolveInner(l+t,1).type!=s))if(e%2==0==i>0)u++;else{if(1==u)return{start:h,end:{from:l+t,to:l+t+1},matched:e>>1==a>>1};u--}}i>0&&(t+=r.length)}return c.done?{start:h,matched:!1}:null}(t,e,i,o,l.type,s,r)}function ph(t,e,i,n,s,r,o){let l=n.parent,a={from:s.from,to:s.to},h=0,c=null==l?void 0:l.cursor();if(c&&(i<0?c.childBefore(n.from):c.childAfter(n.to)))do{if(i<0?c.to<=n.from:c.from>=n.to){if(0==h&&r.indexOf(c.type.name)>-1&&c.from-1||(vh.push(t),console.warn(e))}function xh(t,e){let i=[];for(let n of e.split(" ")){let e=[];for(let i of n.split(".")){let n=t[i]||Ql[i];n?"function"==typeof n?e.length?e=e.map(n):yh(i,`Modifier ${i} used at start of tag`):e.length?yh(i,`Tag ${i} used as modifier`):e=Array.isArray(n)?n:[n]:yh(i,`Unknown highlighting tag ${i}`)}for(let t of e)i.push(t)}if(!i.length)return 0;let n=e.replace(/ /g,"_"),s=n+" "+i.map((t=>t.id)),r=wh[s];if(r)return r.id;let o=wh[s]=_o.define({id:mh.length,name:n,props:[Sl({[n]:i})]});return mh.push(o),o.id}gi.RTL,gi.LTR;function kh(t,e){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=t(e,i);return!!s&&(n(i.update(s)),!0)}}const Ph=kh(Th,0),Sh=kh(Mh,0),Oh=kh(((t,e)=>Mh(t,e,function(t){let e=[];for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),s=i.to<=n.to?n:t.doc.lineAt(i.to),r=e.length-1;r>=0&&e[r].to>n.from?e[r].to=s.to:e.push({from:n.from+/^\s*/.exec(n.text)[0].length,to:s.to})}return e}(e))),0);function Ch(t,e){let i=t.languageDataAt("commentTokens",e);return i.length?i[0]:{}}const Ah=50;function Mh(t,e,i=e.selection.ranges){let n=i.map((t=>Ch(e,t.from).block));if(!n.every((t=>t)))return null;let s=i.map(((t,i)=>function(t,{open:e,close:i},n,s){let r,o,l=t.sliceDoc(n-Ah,n),a=t.sliceDoc(s,s+Ah),h=/\s*$/.exec(l)[0].length,c=/^\s*/.exec(a)[0].length,u=l.length-h;if(l.slice(u-e.length,u)==e&&a.slice(c,c+i.length)==i)return{open:{pos:n-h,margin:h&&1},close:{pos:s+c,margin:c&&1}};s-n<=2*Ah?r=o=t.sliceDoc(n,s):(r=t.sliceDoc(n,n+Ah),o=t.sliceDoc(s-Ah,s));let d=/^\s*/.exec(r)[0].length,f=/\s*$/.exec(o)[0].length,p=o.length-f-i.length;return r.slice(d,d+e.length)==e&&o.slice(p,p+i.length)==i?{open:{pos:n+d+e.length,margin:/\s/.test(r.charAt(d+e.length))?1:0},close:{pos:s-f-i.length,margin:/\s/.test(o.charAt(p-1))?1:0}}:null}(e,n[i],t.from,t.to)));if(2!=t&&!s.every((t=>t)))return{changes:e.changes(i.map(((t,e)=>s[e]?[]:[{from:t.from,insert:n[e].open+" "},{from:t.to,insert:" "+n[e].close}])))};if(1!=t&&s.some((t=>t))){let t=[];for(let e,i=0;is&&(t==r||r>a.from)){s=a.from;let t=/^\s*/.exec(a.text)[0].length,e=t==a.length,i=a.text.slice(t,t+l.length)==l?t:-1;tt.comment<0&&(!t.empty||t.single)))){let t=[];for(let{line:e,token:i,indent:s,empty:r,single:o}of n)!o&&r||t.push({from:e.from+s,insert:i+" "});let i=e.changes(t);return{changes:i,selection:e.selection.map(i,1)}}if(1!=t&&n.some((t=>t.comment>=0))){let t=[];for(let{line:e,comment:i,token:s}of n)if(i>=0){let n=e.from+i,r=n+s.length;" "==e.text[r-e.from]&&r++,t.push({from:n,to:r})}return{changes:t}}return null}const Dh=ht.define(),Eh=ht.define(),Rh=I.define(),Bh=I.define({combine:t=>Ot(t,{minDepth:100,newGroupDelay:500,joinToEvent:(t,e)=>e},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(t,e)=>(i,n)=>t(i,n)||e(i,n)})}),Nh=X.define({create:()=>Gh.empty,update(t,e){let i=e.state.facet(Bh),n=e.annotation(Dh);if(n){let s=zh.fromTransaction(e,n.selection),r=n.side,o=0==r?t.undone:t.done;return o=s?qh(o,o.length,i.minDepth,s):Yh(o,e.startState.selection),new Gh(0==r?n.rest:o,0==r?o:n.rest)}let s=e.annotation(Eh);if("full"!=s&&"before"!=s||(t=t.isolate()),!1===e.annotation(ft.addToHistory))return e.changes.empty?t:t.addMapping(e.changes.desc);let r=zh.fromTransaction(e),o=e.annotation(ft.time),l=e.annotation(ft.userEvent);return r?t=t.addChanges(r,o,l,i,e):e.selection&&(t=t.addSelection(e.startState.selection,o,l,i.newGroupDelay)),"full"!=s&&"after"!=s||(t=t.isolate()),t},toJSON:t=>({done:t.done.map((t=>t.toJSON())),undone:t.undone.map((t=>t.toJSON()))}),fromJSON:t=>new Gh(t.done.map(zh.fromJSON),t.undone.map(zh.fromJSON))});function Lh(t={}){return[Nh,Bh.of(t),Ks.domEventHandlers({beforeinput(t,e){let i="historyUndo"==t.inputType?Fh:"historyRedo"==t.inputType?Vh:null;return!!i&&(t.preventDefault(),i(e))}})]}function Ih(t,e){return function({state:i,dispatch:n}){if(!e&&i.readOnly)return!1;let s=i.field(Nh,!1);if(!s)return!1;let r=s.pop(t,i,e);return!!r&&(n(r),!0)}}const Fh=Ih(0,!1),Vh=Ih(1,!1),Wh=Ih(0,!0),Hh=Ih(1,!0);class zh{constructor(t,e,i,n,s){this.changes=t,this.effects=e,this.mapped=i,this.startSelection=n,this.selectionsAfter=s}setSelAfter(t){return new zh(this.changes,this.effects,this.mapped,this.startSelection,t)}toJSON(){var t,e,i;return{changes:null===(t=this.changes)||void 0===t?void 0:t.toJSON(),mapped:null===(e=this.mapped)||void 0===e?void 0:e.toJSON(),startSelection:null===(i=this.startSelection)||void 0===i?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map((t=>t.toJSON()))}}static fromJSON(t){return new zh(t.changes&&O.fromJSON(t.changes),[],t.mapped&&S.fromJSON(t.mapped),t.startSelection&&B.fromJSON(t.startSelection),t.selectionsAfter.map(B.fromJSON))}static fromTransaction(t,e){let i=Uh;for(let e of t.startState.facet(Rh)){let n=e(t);n.length&&(i=i.concat(n))}return!i.length&&t.changes.empty?null:new zh(t.changes.invert(t.startState.doc),i,void 0,e||t.startState.selection,Uh)}static selection(t){return new zh(void 0,Uh,void 0,void 0,t)}}function qh(t,e,i,n){let s=e+1>i+20?e-i-1:0,r=t.slice(s,e);return r.push(n),r}function Xh(t,e){return t.length?e.length?t.concat(e):t:e}const Uh=[],Qh=200;function Yh(t,e){if(t.length){let i=t[t.length-1],n=i.selectionsAfter.slice(Math.max(0,i.selectionsAfter.length-Qh));return n.length&&n[n.length-1].eq(e)?t:(n.push(e),qh(t,t.length-1,1e9,i.setSelAfter(n)))}return[zh.selection([e])]}function $h(t){let e=t[t.length-1],i=t.slice();return i[t.length-1]=e.setSelAfter(e.selectionsAfter.slice(0,e.selectionsAfter.length-1)),i}function _h(t,e){if(!t.length)return t;let i=t.length,n=Uh;for(;i;){let s=jh(t[i-1],e,n);if(s.changes&&!s.changes.empty||s.effects.length){let e=t.slice(0,i);return e[i-1]=s,e}e=s.mapped,i--,n=s.selectionsAfter}return n.length?[zh.selection(n)]:Uh}function jh(t,e,i){let n=Xh(t.selectionsAfter.length?t.selectionsAfter.map((t=>t.map(e))):Uh,i);if(!t.changes)return zh.selection(n);let s=t.changes.map(e),r=e.mapDesc(t.changes,!0),o=t.mapped?t.mapped.composeDesc(r):r;return new zh(s,dt.mapEffects(t.effects,e),o,t.startSelection.map(r),n)}const Kh=/^(input\.type|delete)($|\.)/;class Gh{constructor(t,e,i=0,n=void 0){this.done=t,this.undone=e,this.prevTime=i,this.prevUserEvent=n}isolate(){return this.prevTime?new Gh(this.done,this.undone):this}addChanges(t,e,i,n,s){let r=this.done,o=r[r.length-1];return r=o&&o.changes&&!o.changes.empty&&t.changes&&(!i||Kh.test(i))&&(!o.selectionsAfter.length&&e-this.prevTimei.push(t,e))),e.iterChangedRanges(((t,e,s,r)=>{for(let t=0;t=e&&s<=o&&(n=!0)}})),n}(o.changes,t.changes))||"input.type.compose"==i)?qh(r,r.length-1,n.minDepth,new zh(t.changes.compose(o.changes),Xh(t.effects,o.effects),o.mapped,o.startSelection,Uh)):qh(r,r.length,n.minDepth,t),new Gh(r,Uh,e,i)}addSelection(t,e,i,n){let s=this.done.length?this.done[this.done.length-1].selectionsAfter:Uh;return s.length>0&&e-this.prevTimet.empty!=o.ranges[e].empty)).length)?this:new Gh(Yh(this.done,t),this.undone,e,i);var r,o}addMapping(t){return new Gh(_h(this.done,t),_h(this.undone,t),this.prevTime,this.prevUserEvent)}pop(t,e,i){let n=0==t?this.done:this.undone;if(0==n.length)return null;let s=n[n.length-1],r=s.selectionsAfter[0]||e.selection;if(i&&s.selectionsAfter.length)return e.update({selection:s.selectionsAfter[s.selectionsAfter.length-1],annotations:Dh.of({side:t,rest:$h(n),selection:r}),userEvent:0==t?"select.undo":"select.redo",scrollIntoView:!0});if(s.changes){let i=1==n.length?Uh:n.slice(0,n.length-1);return s.mapped&&(i=_h(i,s.mapped)),e.update({changes:s.changes,selection:s.startSelection,effects:s.effects,annotations:Dh.of({side:t,rest:i,selection:r}),filter:!1,userEvent:0==t?"undo":"redo",scrollIntoView:!0})}return null}}Gh.empty=new Gh(Uh,Uh);const Zh=[{key:"Mod-z",run:Fh,preventDefault:!0},{key:"Mod-y",mac:"Mod-Shift-z",run:Vh,preventDefault:!0},{linux:"Ctrl-Shift-z",run:Vh,preventDefault:!0},{key:"Mod-u",run:Wh,preventDefault:!0},{key:"Alt-u",mac:"Mod-Shift-u",run:Hh,preventDefault:!0}];function Jh(t,e){return B.create(t.ranges.map(e),t.mainIndex)}function tc(t,e){return t.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function ec({state:t,dispatch:e},i){let n=Jh(t.selection,i);return!n.eq(t.selection,!0)&&(e(tc(t,n)),!0)}function ic(t,e){return B.cursor(e?t.to:t.from)}function nc(t,e){return ec(t,(i=>i.empty?t.moveByChar(i,e):ic(i,e)))}function sc(t){return t.textDirectionAt(t.state.selection.main.head)==gi.LTR}const rc=t=>nc(t,!sc(t)),oc=t=>nc(t,sc(t));function lc(t,e){return ec(t,(i=>i.empty?t.moveByGroup(i,e):ic(i,e)))}function ac(t,e,i){if(e.type.prop(i))return!0;let n=e.to-e.from;return n&&(n>2||/[^\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function hc(t,e,i){let n,s,r=Zl(t).resolveInner(e.head),o=i?Qo.closedBy:Qo.openedBy;for(let n=e.head;;){let e=i?r.childAfter(n):r.childBefore(n);if(!e)break;ac(t,e,o)?r=e:n=i?e.to:e.from}return s=r.type.prop(o)&&(n=i?fh(t,r.from,1):fh(t,r.to,-1))&&n.matched?i?n.end.to:n.end.from:i?r.to:r.from,B.cursor(s,i?-1:1)}function cc(t,e){return ec(t,(i=>{if(!i.empty)return ic(i,e);let n=t.moveVertically(i,e);return n.head!=i.head?n:t.moveToLineBoundary(i,e)}))}const uc=t=>cc(t,!1),dc=t=>cc(t,!0);function fc(t){let e,i=t.scrollDOM.clientHeighti.empty?t.moveVertically(i,e,n.height):ic(i,e)));if(r.eq(s.selection))return!1;if(n.selfScroll){let e=t.coordsAtPos(s.selection.main.head),o=t.scrollDOM.getBoundingClientRect(),l=o.top+n.marginTop,a=o.bottom-n.marginBottom;e&&e.top>l&&e.bottompc(t,!1),mc=t=>pc(t,!0);function vc(t,e,i){let n=t.lineBlockAt(e.head),s=t.moveToLineBoundary(e,i);if(s.head==e.head&&s.head!=(i?n.to:n.from)&&(s=t.moveToLineBoundary(e,i,!1)),!i&&s.head==n.from&&n.length){let i=/^\s*/.exec(t.state.sliceDoc(n.from,Math.min(n.from+100,n.to)))[0].length;i&&e.head!=n.from+i&&(s=B.cursor(n.from+i))}return s}function wc(t,e){let i=Jh(t.state.selection,(t=>{let i=e(t);return B.range(t.anchor,i.head,i.goalColumn,i.bidiLevel||void 0)}));return!i.eq(t.state.selection)&&(t.dispatch(tc(t.state,i)),!0)}function bc(t,e){return wc(t,(i=>t.moveByChar(i,e)))}const yc=t=>bc(t,!sc(t)),xc=t=>bc(t,sc(t));function kc(t,e){return wc(t,(i=>t.moveByGroup(i,e)))}function Pc(t,e){return wc(t,(i=>t.moveVertically(i,e)))}const Sc=t=>Pc(t,!1),Oc=t=>Pc(t,!0);function Cc(t,e){return wc(t,(i=>t.moveVertically(i,e,fc(t).height)))}const Ac=t=>Cc(t,!1),Mc=t=>Cc(t,!0),Tc=({state:t,dispatch:e})=>(e(tc(t,{anchor:0})),!0),Dc=({state:t,dispatch:e})=>(e(tc(t,{anchor:t.doc.length})),!0),Ec=({state:t,dispatch:e})=>(e(tc(t,{anchor:t.selection.main.anchor,head:0})),!0),Rc=({state:t,dispatch:e})=>(e(tc(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0);function Bc(t,e){if(t.state.readOnly)return!1;let i="delete.selection",{state:n}=t,s=n.changeByRange((n=>{let{from:s,to:r}=n;if(s==r){let o=e(n);os&&(i="delete.forward",o=Nc(t,o,!0)),s=Math.min(s,o),r=Math.max(r,o)}else s=Nc(t,s,!1),r=Nc(t,r,!0);return s==r?{range:n}:{changes:{from:s,to:r},range:B.cursor(s,se(t))))n.between(e,e,((t,n)=>{te&&(e=i?n:t)}));return e}const Lc=(t,e,i)=>Bc(t,(n=>{let s,r,o=n.from,{state:l}=t,a=l.doc.lineAt(o);if(i&&!e&&o>a.from&&oLc(t,!1,!0),Fc=t=>Lc(t,!0,!1),Vc=(t,e)=>Bc(t,(i=>{let n=i.head,{state:s}=t,r=s.doc.lineAt(n),o=s.charCategorizer(n);for(let t=null;;){if(n==(e?r.to:r.from)){n==i.head&&r.number!=(e?s.doc.lines:1)&&(n+=e?1:-1);break}let l=p(r.text,n-r.from,e)+r.from,a=r.text.slice(Math.min(n,l)-r.from,Math.max(n,l)-r.from),h=o(a);if(null!=t&&h!=t)break;" "==a&&n==i.head||(t=h),n=l}return n})),Wc=t=>Vc(t,!1);function Hc(t){let e=[],i=-1;for(let n of t.selection.ranges){let s=t.doc.lineAt(n.from),r=t.doc.lineAt(n.to);if(n.empty||n.to!=r.from||(r=t.doc.lineAt(n.to-1)),i>=s.number){let t=e[e.length-1];t.to=r.to,t.ranges.push(n)}else e.push({from:s.from,to:r.to,ranges:[n]});i=r.number+1}return e}function zc(t,e,i){if(t.readOnly)return!1;let n=[],s=[];for(let e of Hc(t)){if(i?e.to==t.doc.length:0==e.from)continue;let r=t.doc.lineAt(i?e.to+1:e.from-1),o=r.length+1;if(i){n.push({from:e.to,to:r.to},{from:e.from,insert:r.text+t.lineBreak});for(let i of e.ranges)s.push(B.range(Math.min(t.doc.length,i.anchor+o),Math.min(t.doc.length,i.head+o)))}else{n.push({from:r.from,to:e.from},{from:e.to,insert:t.lineBreak+r.text});for(let t of e.ranges)s.push(B.range(t.anchor-o,t.head-o))}}return!!n.length&&(e(t.update({changes:n,scrollIntoView:!0,selection:B.create(s,t.selection.mainIndex),userEvent:"move.line"})),!0)}function qc(t,e,i){if(t.readOnly)return!1;let n=[];for(let e of Hc(t))i?n.push({from:e.from,insert:t.doc.slice(e.from,e.to)+t.lineBreak}):n.push({from:e.to,insert:t.lineBreak+t.doc.slice(e.from,e.to)});return e(t.update({changes:n,scrollIntoView:!0,userEvent:"input.copyline"})),!0}const Xc=Uc(!1);function Uc(e){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=i.changeByRange((n=>{let{from:s,to:r}=n,o=i.doc.lineAt(s),l=!e&&s==r&&function(t,e){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let i,n=Zl(t).resolveInner(e),s=n.childBefore(e),r=n.childAfter(e);return s&&r&&s.to<=e&&r.from>=e&&(i=s.type.prop(Qo.closedBy))&&i.indexOf(r.name)>-1&&t.doc.lineAt(s.to).from==t.doc.lineAt(r.from).from&&!/\S/.test(t.sliceDoc(s.to,r.from))?{from:s.to,to:r.from}:null}(i,s);e&&(s=r=(r<=o.to?o:i.doc.lineAt(r)).to);let a=new pa(i,{simulateBreak:s,simulateDoubleBreak:!!l}),h=fa(a,s);for(null==h&&(h=qt(/^\s*/.exec(i.doc.lineAt(s).text)[0],i.tabSize));ro.from&&s{let s=[];for(let r=n.from;r<=n.to;){let o=t.doc.lineAt(r);o.number>i&&(n.empty||n.to>o.from)&&(e(o,s,n),i=o.number),r=o.to+1}let r=t.changes(s);return{changes:s,range:B.range(r.mapPos(n.anchor,1),r.mapPos(n.head,1))}}))}const Yc=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:t=>ec(t,(e=>hc(t.state,e,!sc(t)))),shift:t=>wc(t,(e=>hc(t.state,e,!sc(t))))},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:t=>ec(t,(e=>hc(t.state,e,sc(t)))),shift:t=>wc(t,(e=>hc(t.state,e,sc(t))))},{key:"Alt-ArrowUp",run:({state:t,dispatch:e})=>zc(t,e,!1)},{key:"Shift-Alt-ArrowUp",run:({state:t,dispatch:e})=>qc(t,e,!1)},{key:"Alt-ArrowDown",run:({state:t,dispatch:e})=>zc(t,e,!0)},{key:"Shift-Alt-ArrowDown",run:({state:t,dispatch:e})=>qc(t,e,!0)},{key:"Escape",run:({state:t,dispatch:e})=>{let i=t.selection,n=null;return i.ranges.length>1?n=B.create([i.main]):i.main.empty||(n=B.create([B.cursor(i.main.head)])),!!n&&(e(tc(t,n)),!0)}},{key:"Mod-Enter",run:Uc(!0)},{key:"Alt-l",mac:"Ctrl-l",run:({state:t,dispatch:e})=>{let i=Hc(t).map((({from:e,to:i})=>B.range(e,Math.min(i+1,t.doc.length))));return e(t.update({selection:B.create(i),userEvent:"select"})),!0}},{key:"Mod-i",run:({state:t,dispatch:e})=>{let i=Jh(t.selection,(e=>{var i;for(let n=Zl(t).resolveStack(e.from,1);n;n=n.next){let{node:t}=n;if((t.from=e.to||t.to>e.to&&t.from<=e.from)&&(null===(i=t.parent)||void 0===i?void 0:i.parent))return B.range(t.to,t.from)}return e}));return e(tc(t,i)),!0},preventDefault:!0},{key:"Mod-[",run:({state:t,dispatch:e})=>!t.readOnly&&(e(t.update(Qc(t,((e,i)=>{let n=/^\s*/.exec(e.text)[0];if(!n)return;let s=qt(n,t.tabSize),r=0,o=da(t,Math.max(0,s-ua(t)));for(;r!t.readOnly&&(e(t.update(Qc(t,((e,i)=>{i.push({from:e.from,insert:t.facet(ca)})})),{userEvent:"input.indent"})),!0)},{key:"Mod-Alt-\\",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=Object.create(null),n=new pa(t,{overrideIndentation:t=>{let e=i[t];return null==e?-1:e}}),s=Qc(t,((e,s,r)=>{let o=fa(n,e.from);if(null==o)return;/\S/.test(e.text)||(o=0);let l=/^\s*/.exec(e.text)[0],a=da(t,o);(l!=a||r.from{if(t.state.readOnly)return!1;let{state:e}=t,i=e.changes(Hc(e).map((({from:t,to:i})=>(t>0?t--:i{let i;if(t.lineWrapping){let n=t.lineBlockAt(e.head),s=t.coordsAtPos(e.head,e.assoc||1);s&&(i=n.bottom+t.documentTop-s.bottom+t.defaultLineHeight/2)}return t.moveVertically(e,!0,i)})).map(i);return t.dispatch({changes:i,selection:n,scrollIntoView:!0,userEvent:"delete.line"}),!0}},{key:"Shift-Mod-\\",run:({state:t,dispatch:e})=>function(t,e){let i=!1,n=Jh(t.selection,(e=>{let n=fh(t,e.head,-1)||fh(t,e.head,1)||e.head>0&&fh(t,e.head-1,1)||e.head{let{state:e}=t,i=e.doc.lineAt(e.selection.main.from),n=Ch(t.state,i.from);return n.line?Ph(t):!!n.block&&Oh(t)}},{key:"Alt-A",run:Sh},{key:"Ctrl-m",mac:"Shift-Alt-m",run:t=>(t.setTabFocusMode(),!0)}].concat([{key:"ArrowLeft",run:rc,shift:yc,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:t=>lc(t,!sc(t)),shift:t=>kc(t,!sc(t)),preventDefault:!0},{mac:"Cmd-ArrowLeft",run:t=>ec(t,(e=>vc(t,e,!sc(t)))),shift:t=>wc(t,(e=>vc(t,e,!sc(t)))),preventDefault:!0},{key:"ArrowRight",run:oc,shift:xc,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:t=>lc(t,sc(t)),shift:t=>kc(t,sc(t)),preventDefault:!0},{mac:"Cmd-ArrowRight",run:t=>ec(t,(e=>vc(t,e,sc(t)))),shift:t=>wc(t,(e=>vc(t,e,sc(t)))),preventDefault:!0},{key:"ArrowUp",run:uc,shift:Sc,preventDefault:!0},{mac:"Cmd-ArrowUp",run:Tc,shift:Ec},{mac:"Ctrl-ArrowUp",run:gc,shift:Ac},{key:"ArrowDown",run:dc,shift:Oc,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Dc,shift:Rc},{mac:"Ctrl-ArrowDown",run:mc,shift:Mc},{key:"PageUp",run:gc,shift:Ac},{key:"PageDown",run:mc,shift:Mc},{key:"Home",run:t=>ec(t,(e=>vc(t,e,!1))),shift:t=>wc(t,(e=>vc(t,e,!1))),preventDefault:!0},{key:"Mod-Home",run:Tc,shift:Ec},{key:"End",run:t=>ec(t,(e=>vc(t,e,!0))),shift:t=>wc(t,(e=>vc(t,e,!0))),preventDefault:!0},{key:"Mod-End",run:Dc,shift:Rc},{key:"Enter",run:Xc},{key:"Mod-a",run:({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0)},{key:"Backspace",run:Ic,shift:Ic},{key:"Delete",run:Fc},{key:"Mod-Backspace",mac:"Alt-Backspace",run:Wc},{key:"Mod-Delete",mac:"Alt-Delete",run:t=>Vc(t,!0)},{mac:"Mod-Backspace",run:t=>Bc(t,(e=>{let i=t.moveToLineBoundary(e,!1).head;return e.head>i?i:Math.max(0,e.head-1)}))},{mac:"Mod-Delete",run:t=>Bc(t,(e=>{let i=t.moveToLineBoundary(e,!0).head;return e.headec(t,(e=>B.cursor(t.lineBlockAt(e.head).from,1))),shift:t=>wc(t,(e=>B.cursor(t.lineBlockAt(e.head).from)))},{key:"Ctrl-e",run:t=>ec(t,(e=>B.cursor(t.lineBlockAt(e.head).to,-1))),shift:t=>wc(t,(e=>B.cursor(t.lineBlockAt(e.head).to)))},{key:"Ctrl-d",run:Fc},{key:"Ctrl-h",run:Ic},{key:"Ctrl-k",run:t=>Bc(t,(e=>{let i=t.lineBlockAt(e.head).to;return e.head{if(e.readOnly)return!1;let n=e.changeByRange((e=>({changes:{from:e.from,to:e.to,insert:t.of(["",""])},range:B.cursor(e.from)})));return i(e.update(n,{scrollIntoView:!0,userEvent:"input"})),!0}},{key:"Ctrl-t",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=t.changeByRange((e=>{if(!e.empty||0==e.from||e.from==t.doc.length)return{range:e};let i=e.from,n=t.doc.lineAt(i),s=i==n.from?i-1:p(n.text,i-n.from,!1)+n.from,r=i==n.to?i+1:p(n.text,i-n.from,!0)+n.from;return{changes:{from:s,to:r,insert:t.doc.slice(i,r).append(t.doc.slice(s,i))},range:B.cursor(r)}}));return!i.changes.empty&&(e(t.update(i,{scrollIntoView:!0,userEvent:"move.character"})),!0)}},{key:"Ctrl-v",run:mc}].map((t=>({mac:t.key,run:t.run,shift:t.shift})))));function $c(){var t=arguments[0];"string"==typeof t&&(t=document.createElement(t));var e=1,i=arguments[1];if(i&&"object"==typeof i&&null==i.nodeType&&!Array.isArray(i)){for(var n in i)if(Object.prototype.hasOwnProperty.call(i,n)){var s=i[n];"string"==typeof s?t.setAttribute(n,s):null!=s&&(t[n]=s)}e++}for(;et.normalize("NFKD"):t=>t;class Kc{constructor(t,e,i=0,n=t.length,s,r){this.test=r,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=t.iterRange(i,n),this.bufferStart=i,this.normalize=s?t=>s(jc(t)):jc,this.query=this.normalize(e)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return b(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let t=this.peek();if(t<0)return this.done=!0,this;let e=y(t),i=this.bufferStart+this.bufferPos;this.bufferPos+=x(t);let n=this.normalize(e);for(let t=0,s=i;;t++){let r=n.charCodeAt(t),o=this.match(r,s,this.bufferPos+this.bufferStart);if(t==n.length-1){if(o)return this.value=o,this;break}s==i&&tthis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let t=this.matchPos-this.curLineStart;;){this.re.lastIndex=t;let e=this.matchPos<=this.to&&this.re.exec(this.curLine);if(e){let i=this.curLineStart+e.index,n=i+e[0].length;if(this.matchPos=nu(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,n,e)))return this.value={from:i,to:n,match:e},this;t=this.matchPos-this.curLineStart}else{if(!(this.curLineStart+this.curLine.length=i||n.to<=e){let n=new eu(e,t.sliceString(e,i));return tu.set(t,n),n}if(n.from==e&&n.to==i)return n;let{text:s,from:r}=n;return r>e&&(s=t.sliceString(e,r)+s,r=e),n.to=this.to?this.to:this.text.lineAt(t).to}next(){for(;;){let t=this.re.lastIndex=this.matchPos-this.flat.from,e=this.re.exec(this.flat.text);if(e&&!e[0]&&e.index==t&&(this.re.lastIndex=t+1,e=this.re.exec(this.flat.text)),e){let t=this.flat.from+e.index,i=t+e[0].length;if((this.flat.to>=this.to||e.index+e[0].length<=this.flat.text.length-10)&&(!this.test||this.test(t,i,e)))return this.value={from:t,to:i,match:e},this.matchPos=nu(this.text,i+(t==i?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=eu.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+2*this.flat.text.length))}}}function nu(t,e){if(e>=t.length)return e;let i,n=t.lineAt(e);for(;e=56320&&i<57344;)e++;return e}function su(t){let e=$c("input",{class:"cm-textfield",name:"line",value:String(t.state.doc.lineAt(t.state.selection.main.head).number)});function i(){let i=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(e.value);if(!i)return;let{state:n}=t,s=n.doc.lineAt(n.selection.main.head),[,r,o,l,a]=i,h=l?+l.slice(1):0,c=o?+o:s.number;if(o&&a){let t=c/100;r&&(t=t*("-"==r?-1:1)+s.number/n.doc.lines),c=Math.round(n.doc.lines*t)}else o&&r&&(c=c*("-"==r?-1:1)+s.number);let u=n.doc.line(Math.max(1,Math.min(n.doc.lines,c))),d=B.cursor(u.from+Math.max(0,Math.min(h,u.length)));t.dispatch({effects:[ru.of(!1),Ks.scrollIntoView(d.from,{y:"center"})],selection:d}),t.focus()}return{dom:$c("form",{class:"cm-gotoLine",onkeydown:e=>{27==e.keyCode?(e.preventDefault(),t.dispatch({effects:ru.of(!1)}),t.focus()):13==e.keyCode&&(e.preventDefault(),i())},onsubmit:t=>{t.preventDefault(),i()}},$c("label",t.state.phrase("Go to line"),": ",e)," ",$c("button",{class:"cm-button",type:"submit"},t.state.phrase("go")))}}"undefined"!=typeof Symbol&&(Jc.prototype[Symbol.iterator]=iu.prototype[Symbol.iterator]=function(){return this});const ru=dt.define(),ou=X.define({create:()=>!0,update(t,e){for(let i of e.effects)i.is(ru)&&(t=i.value);return t},provide:t=>vo.from(t,(t=>t?su:null))}),lu=Ks.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px","& label":{fontSize:"80%"}}}),au={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},hu=I.define({combine:t=>Ot(t,au,{highlightWordAroundCursor:(t,e)=>t||e,minSelectionLength:Math.min,maxMatches:Math.min})});const cu=ni.mark({class:"cm-selectionMatch"}),uu=ni.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function du(t,e,i,n){return!(0!=i&&t(e.sliceDoc(i-1,i))==yt.Word||n!=e.doc.length&&t(e.sliceDoc(n,n+1))==yt.Word)}const fu=Gi.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(hu),{state:i}=t,n=i.selection;if(n.ranges.length>1)return ni.none;let s,r=n.main,o=null;if(r.empty){if(!e.highlightWordAroundCursor)return ni.none;let t=i.wordAt(r.head);if(!t)return ni.none;o=i.charCategorizer(r.head),s=i.sliceDoc(t.from,t.to)}else{let t=r.to-r.from;if(t200)return ni.none;if(e.wholeWords){if(s=i.sliceDoc(r.from,r.to),o=i.charCategorizer(r.head),!du(o,i,r.from,r.to)||!function(t,e,i,n){return t(e.sliceDoc(i,i+1))==yt.Word&&t(e.sliceDoc(n-1,n))==yt.Word}(o,i,r.from,r.to))return ni.none}else if(s=i.sliceDoc(r.from,r.to),!s)return ni.none}let l=[];for(let n of t.visibleRanges){let t=new Kc(i.doc,s,n.from,n.to);for(;!t.next().done;){let{from:n,to:s}=t.value;if((!o||du(o,i,n,s))&&(r.empty&&n<=r.from&&s>=r.to?l.push(uu.range(n,s)):(n>=r.to||s<=r.from)&&l.push(cu.range(n,s)),l.length>e.maxMatches))return ni.none}}return ni.set(l)}},{decorations:t=>t.decorations}),pu=Ks.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}});const gu=I.define({combine:t=>Ot(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:t=>new Uu(t),scrollToMatch:t=>Ks.scrollIntoView(t)})});class mu{constructor(t){this.search=t.search,this.caseSensitive=!!t.caseSensitive,this.literal=!!t.literal,this.regexp=!!t.regexp,this.replace=t.replace||"",this.valid=!!this.search&&(!this.regexp||function(t){try{return new RegExp(t,Zc),!0}catch(t){return!1}}(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!t.wholeWord}unquote(t){return this.literal?t:t.replace(/\\([nrt\\])/g,((t,e)=>"n"==e?"\n":"r"==e?"\r":"t"==e?"\t":"\\"))}eq(t){return this.search==t.search&&this.replace==t.replace&&this.caseSensitive==t.caseSensitive&&this.regexp==t.regexp&&this.wholeWord==t.wholeWord}create(){return this.regexp?new Pu(this):new bu(this)}getCursor(t,e=0,i){let n=t.doc?t:St.create({doc:t});return null==i&&(i=n.doc.length),this.regexp?yu(this,n,e,i):wu(this,n,e,i)}}class vu{constructor(t){this.spec=t}}function wu(t,e,i,n){return new Kc(e.doc,t.unquoted,i,n,t.caseSensitive?void 0:t=>t.toLowerCase(),t.wholeWord?function(t,e){return(i,n,s,r)=>((r>i||r+s.length=e)return null;n.push(i.value)}return n}highlight(t,e,i,n){let s=wu(this.spec,t,Math.max(0,e-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,t.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}function yu(t,e,i,n){return new Jc(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:t.wholeWord?(s=e.charCategorizer(e.selection.main.head),(t,e,i)=>!i[0].length||(s(xu(i.input,i.index))!=yt.Word||s(ku(i.input,i.index))!=yt.Word)&&(s(ku(i.input,i.index+i[0].length))!=yt.Word||s(xu(i.input,i.index+i[0].length))!=yt.Word)):void 0},i,n);var s}function xu(t,e){return t.slice(p(t,e,!1),e)}function ku(t,e){return t.slice(e,p(t,e))}class Pu extends vu{nextMatch(t,e,i){let n=yu(this.spec,t,i,t.doc.length).next();return n.done&&(n=yu(this.spec,t,0,e).next()),n.done?null:n.value}prevMatchInRange(t,e,i){for(let n=1;;n++){let s=Math.max(e,i-1e4*n),r=yu(this.spec,t,s,i),o=null;for(;!r.next().done;)o=r.value;if(o&&(s==e||o.from>s+10))return o;if(s==e)return null}}prevMatch(t,e,i){return this.prevMatchInRange(t,0,e)||this.prevMatchInRange(t,i,t.doc.length)}getReplacement(t){return this.spec.unquote(this.spec.replace).replace(/\$([$&\d+])/g,((e,i)=>"$"==i?"$":"&"==i?t.match[0]:"0"!=i&&+i=e)return null;n.push(i.value)}return n}highlight(t,e,i,n){let s=yu(this.spec,t,Math.max(0,e-250),Math.min(i+250,t.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}const Su=dt.define(),Ou=dt.define(),Cu=X.define({create:t=>new Au(Vu(t).create(),null),update(t,e){for(let i of e.effects)i.is(Su)?t=new Au(i.value.create(),t.panel):i.is(Ou)&&(t=new Au(t.query,i.value?Fu:null));return t},provide:t=>vo.from(t,(t=>t.panel))});class Au{constructor(t,e){this.query=t,this.panel=e}}const Mu=ni.mark({class:"cm-searchMatch"}),Tu=ni.mark({class:"cm-searchMatch cm-searchMatch-selected"}),Du=Gi.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(Cu))}update(t){let e=t.state.field(Cu);(e!=t.startState.field(Cu)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return ni.none;let{view:i}=this,n=new Et;for(let e=0,s=i.visibleRanges,r=s.length;es[e+1].from-500;)l=s[++e].to;t.highlight(i.state,o,l,((t,e)=>{let s=i.state.selection.ranges.some((i=>i.from==t&&i.to==e));n.add(t,e,s?Tu:Mu)}))}return n.finish()}},{decorations:t=>t.decorations});function Eu(t){return e=>{let i=e.state.field(Cu,!1);return i&&i.query.spec.valid?t(e,i):zu(e)}}const Ru=Eu(((t,{query:e})=>{let{to:i}=t.state.selection.main,n=e.nextMatch(t.state,i,i);if(!n)return!1;let s=B.single(n.from,n.to),r=t.state.facet(gu);return t.dispatch({selection:s,effects:[_u(t,n),r.scrollToMatch(s.main,t)],userEvent:"select.search"}),Hu(t),!0})),Bu=Eu(((t,{query:e})=>{let{state:i}=t,{from:n}=i.selection.main,s=e.prevMatch(i,n,n);if(!s)return!1;let r=B.single(s.from,s.to),o=t.state.facet(gu);return t.dispatch({selection:r,effects:[_u(t,s),o.scrollToMatch(r.main,t)],userEvent:"select.search"}),Hu(t),!0})),Nu=Eu(((t,{query:e})=>{let i=e.matchAll(t.state,1e3);return!(!i||!i.length)&&(t.dispatch({selection:B.create(i.map((t=>B.range(t.from,t.to)))),userEvent:"select.search.matches"}),!0)})),Lu=Eu(((t,{query:e})=>{let{state:i}=t,{from:n,to:s}=i.selection.main;if(i.readOnly)return!1;let r=e.nextMatch(i,n,n);if(!r)return!1;let o,l,a=[],h=[];if(r.from==n&&r.to==s&&(l=i.toText(e.getReplacement(r)),a.push({from:r.from,to:r.to,insert:l}),r=e.nextMatch(i,r.from,r.to),h.push(Ks.announce.of(i.phrase("replaced match on line $",i.doc.lineAt(n).number)+"."))),r){let e=0==a.length||a[0].from>=r.to?0:r.to-r.from-l.length;o=B.single(r.from-e,r.to-e),h.push(_u(t,r)),h.push(i.facet(gu).scrollToMatch(o.main,t))}return t.dispatch({changes:a,selection:o,effects:h,userEvent:"input.replace"}),!0})),Iu=Eu(((t,{query:e})=>{if(t.state.readOnly)return!1;let i=e.matchAll(t.state,1e9).map((t=>{let{from:i,to:n}=t;return{from:i,to:n,insert:e.getReplacement(t)}}));if(!i.length)return!1;let n=t.state.phrase("replaced $ matches",i.length)+".";return t.dispatch({changes:i,effects:Ks.announce.of(n),userEvent:"input.replace.all"}),!0}));function Fu(t){return t.state.facet(gu).createPanel(t)}function Vu(t,e){var i,n,s,r,o;let l=t.selection.main,a=l.empty||l.to>l.from+100?"":t.sliceDoc(l.from,l.to);if(e&&!a)return e;let h=t.facet(gu);return new mu({search:(null!==(i=null==e?void 0:e.literal)&&void 0!==i?i:h.literal)?a:a.replace(/\n/g,"\\n"),caseSensitive:null!==(n=null==e?void 0:e.caseSensitive)&&void 0!==n?n:h.caseSensitive,literal:null!==(s=null==e?void 0:e.literal)&&void 0!==s?s:h.literal,regexp:null!==(r=null==e?void 0:e.regexp)&&void 0!==r?r:h.regexp,wholeWord:null!==(o=null==e?void 0:e.wholeWord)&&void 0!==o?o:h.wholeWord})}function Wu(t){let e=fo(t,Fu);return e&&e.dom.querySelector("[main-field]")}function Hu(t){let e=Wu(t);e&&e==t.root.activeElement&&e.select()}const zu=t=>{let e=t.state.field(Cu,!1);if(e&&e.panel){let i=Wu(t);if(i&&i!=t.root.activeElement){let n=Vu(t.state,e.query.spec);n.valid&&t.dispatch({effects:Su.of(n)}),i.focus(),i.select()}}else t.dispatch({effects:[Ou.of(!0),e?Su.of(Vu(t.state,e.query.spec)):dt.appendConfig.of(Ku)]});return!0},qu=t=>{let e=t.state.field(Cu,!1);if(!e||!e.panel)return!1;let i=fo(t,Fu);return i&&i.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:Ou.of(!1)}),!0},Xu=[{key:"Mod-f",run:zu,scope:"editor search-panel"},{key:"F3",run:Ru,shift:Bu,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:Ru,shift:Bu,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:qu,scope:"editor search-panel"},{key:"Mod-Shift-l",run:({state:t,dispatch:e})=>{let i=t.selection;if(i.ranges.length>1||i.main.empty)return!1;let{from:n,to:s}=i.main,r=[],o=0;for(let e=new Kc(t.doc,t.sliceDoc(n,s));!e.next().done;){if(r.length>1e3)return!1;e.value.from==n&&(o=r.length),r.push(B.range(e.value.from,e.value.to))}return e(t.update({selection:B.create(r,o),userEvent:"select.search.matches"})),!0}},{key:"Mod-Alt-g",run:t=>{let e=fo(t,su);if(!e){let i=[ru.of(!0)];null==t.state.field(ou,!1)&&i.push(dt.appendConfig.of([ou,lu])),t.dispatch({effects:i}),e=fo(t,su)}return e&&e.dom.querySelector("input").select(),!0}},{key:"Mod-d",run:({state:t,dispatch:e})=>{let{ranges:i}=t.selection;if(i.some((t=>t.from===t.to)))return(({state:t,dispatch:e})=>{let{selection:i}=t,n=B.create(i.ranges.map((e=>t.wordAt(e.head)||B.cursor(e.head))),i.mainIndex);return!n.eq(i)&&(e(t.update({selection:n})),!0)})({state:t,dispatch:e});let n=t.sliceDoc(i[0].from,i[0].to);if(t.selection.ranges.some((e=>t.sliceDoc(e.from,e.to)!=n)))return!1;let s=function(t,e){let{main:i,ranges:n}=t.selection,s=t.wordAt(i.head),r=s&&s.from==i.from&&s.to==i.to;for(let i=!1,s=new Kc(t.doc,e,n[n.length-1].to);;){if(s.next(),!s.done){if(i&&n.some((t=>t.from==s.value.from)))continue;if(r){let e=t.wordAt(s.value.from);if(!e||e.from!=s.value.from||e.to!=s.value.to)continue}return s.value}if(i)return null;s=new Kc(t.doc,e,0,Math.max(0,n[n.length-1].from-1)),i=!0}}(t,n);return!!s&&(e(t.update({selection:t.selection.addRange(B.range(s.from,s.to),!1),effects:Ks.scrollIntoView(s.to)})),!0)},preventDefault:!0}];class Uu{constructor(t){this.view=t;let e=this.query=t.state.field(Cu).query.spec;function i(t,e,i){return $c("button",{class:"cm-button",name:t,onclick:e,type:"button"},i)}this.commit=this.commit.bind(this),this.searchField=$c("input",{value:e.search,placeholder:Qu(t,"Find"),"aria-label":Qu(t,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=$c("input",{value:e.replace,placeholder:Qu(t,"Replace"),"aria-label":Qu(t,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=$c("input",{type:"checkbox",name:"case",form:"",checked:e.caseSensitive,onchange:this.commit}),this.reField=$c("input",{type:"checkbox",name:"re",form:"",checked:e.regexp,onchange:this.commit}),this.wordField=$c("input",{type:"checkbox",name:"word",form:"",checked:e.wholeWord,onchange:this.commit}),this.dom=$c("div",{onkeydown:t=>this.keydown(t),class:"cm-search"},[this.searchField,i("next",(()=>Ru(t)),[Qu(t,"next")]),i("prev",(()=>Bu(t)),[Qu(t,"previous")]),i("select",(()=>Nu(t)),[Qu(t,"all")]),$c("label",null,[this.caseField,Qu(t,"match case")]),$c("label",null,[this.reField,Qu(t,"regexp")]),$c("label",null,[this.wordField,Qu(t,"by word")]),...t.state.readOnly?[]:[$c("br"),this.replaceField,i("replace",(()=>Lu(t)),[Qu(t,"replace")]),i("replaceAll",(()=>Iu(t)),[Qu(t,"replace all")])],$c("button",{name:"close",onclick:()=>qu(t),"aria-label":Qu(t,"close"),type:"button"},["×"])])}commit(){let t=new mu({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});t.eq(this.query)||(this.query=t,this.view.dispatch({effects:Su.of(t)}))}keydown(t){var e,i,n;e=this.view,i=t,n="search-panel",cr(or(e.state),i,e,n)?t.preventDefault():13==t.keyCode&&t.target==this.searchField?(t.preventDefault(),(t.shiftKey?Bu:Ru)(this.view)):13==t.keyCode&&t.target==this.replaceField&&(t.preventDefault(),Lu(this.view))}update(t){for(let e of t.transactions)for(let t of e.effects)t.is(Su)&&!t.value.eq(this.query)&&this.setQuery(t.value)}setQuery(t){this.query=t,this.searchField.value=t.search,this.replaceField.value=t.replace,this.caseField.checked=t.caseSensitive,this.reField.checked=t.regexp,this.wordField.checked=t.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(gu).top}}function Qu(t,e){return t.state.phrase(e)}const Yu=30,$u=/[\s\.,:;?!]/;function _u(t,{from:e,to:i}){let n=t.state.doc.lineAt(e),s=t.state.doc.lineAt(i).to,r=Math.max(n.from,e-Yu),o=Math.min(s,i+Yu),l=t.state.sliceDoc(r,o);if(r!=n.from)for(let t=0;tl.length-Yu;t--)if(!$u.test(l[t-1])&&$u.test(l[t])){l=l.slice(0,t);break}return Ks.announce.of(`${t.state.phrase("current match")}. ${l} ${t.state.phrase("on line")} ${n.number}.`)}const ju=Ks.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),Ku=[Cu,j.low(Du),ju];class Gu{constructor(t,e,i,n){this.state=t,this.pos=e,this.explicit=i,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(t){let e=Zl(this.state).resolveInner(this.pos,-1);for(;e&&t.indexOf(e.name)<0;)e=e.parent;return e?{from:e.from,to:this.pos,text:this.state.sliceDoc(e.from,this.pos),type:e.type}:null}matchBefore(t){let e=this.state.doc.lineAt(this.pos),i=Math.max(e.from,this.pos-250),n=e.text.slice(i-e.from,this.pos-e.from),s=n.search(id(t,!1));return s<0?null:{from:i+s,to:this.pos,text:n.slice(s)}}get aborted(){return null==this.abortListeners}addEventListener(t,e,i){"abort"==t&&this.abortListeners&&(this.abortListeners.push(e),i&&i.onDocChange&&(this.abortOnDocChange=!0))}}function Zu(t){let e=Object.keys(t).join(""),i=/\w/.test(e);return i&&(e=e.replace(/\w/g,"")),`[${i?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function Ju(t){let e=t.map((t=>"string"==typeof t?{label:t}:t)),[i,n]=e.every((t=>/^\w+$/.test(t.label)))?[/\w*$/,/\w+$/]:function(t){let e=Object.create(null),i=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let t=1;t{let s=t.matchBefore(n);return s||t.explicit?{from:s?s.from:t.pos,options:e,validFor:i}:null}}class td{constructor(t,e,i,n){this.completion=t,this.source=e,this.match=i,this.score=n}}function ed(t){return t.selection.main.from}function id(t,e){var i;let{source:n}=t,s=e&&"^"!=n[0],r="$"!=n[n.length-1];return s||r?new RegExp(`${s?"^":""}(?:${n})${r?"$":""}`,null!==(i=t.flags)&&void 0!==i?i:t.ignoreCase?"i":""):t}const nd=ht.define();const sd=new WeakMap;function rd(t){if(!Array.isArray(t))return t;let e=sd.get(t);return e||sd.set(t,e=Ju(t)),e}const od=dt.define(),ld=dt.define();class ad{constructor(t){this.pattern=t,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let e=0;e=48&&a<=57||a>=97&&a<=122?2:a>=65&&a<=90?1:0:(w=y(a))!=w.toLowerCase()?1:w!=w.toUpperCase()?2:0;(!n||1==k&&g||0==v&&0!=k)&&(e[c]==a||i[c]==a&&(u=!0)?r[c++]=n:r.length&&(m=!1)),v=k,n+=x(a)}return c==l&&0==r[0]&&m?this.result((u?-200:0)-100,r,t):d==l&&0==f?this.ret(-200-t.length+(p==t.length?0:-100),[0,p]):o>-1?this.ret(-700-t.length,[o,o+this.pattern.length]):d==l?this.ret(-900-t.length,[f,p]):c==l?this.result((u?-200:0)-100-700+(m?0:-1100),r,t):2==e.length?null:this.result((n[0]?-700:0)-200-1100,n,t)}result(t,e,i){let n=[],s=0;for(let t of e){let e=t+(this.astral?x(b(i,t)):1);s&&n[s-1]==t?n[s-1]=e:(n[s++]=t,n[s++]=e)}return this.ret(t-i.length,n)}}class hd{constructor(t){this.pattern=t,this.matched=[],this.score=0,this.folded=t.toLowerCase()}match(t){if(t.lengthOt(t,{activateOnTyping:!0,activateOnCompletion:()=>!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:dd,filterStrict:!1,compareCompletions:(t,e)=>t.label.localeCompare(e.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(t,e)=>t&&e,closeOnBlur:(t,e)=>t&&e,icons:(t,e)=>t&&e,tooltipClass:(t,e)=>i=>ud(t(i),e(i)),optionClass:(t,e)=>i=>ud(t(i),e(i)),addToOptions:(t,e)=>t.concat(e),filterStrict:(t,e)=>t||e})});function ud(t,e){return t?e?t+" "+e:t:e}function dd(t,e,i,n,s,r){let o,l,a=t.textDirection==gi.RTL,h=a,c=!1,u="top",d=e.left-s.left,f=s.right-e.right,p=n.right-n.left,g=n.bottom-n.top;if(h&&d=g||t>e.top?o=i.bottom-e.top:(u="bottom",o=e.bottom-i.top)}return{style:`${u}: ${o/((e.bottom-e.top)/r.offsetHeight)}px; max-width: ${l/((e.right-e.left)/r.offsetWidth)}px`,class:"cm-completionInfo-"+(c?a?"left-narrow":"right-narrow":h?"left":"right")}}function fd(t,e,i){if(t<=i)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let t=Math.floor(e/i);return{from:t*i,to:(t+1)*i}}let n=Math.floor((t-e)/i);return{from:t-(n+1)*i,to:t-n*i}}class pd{constructor(t,e,i){this.view=t,this.stateField=e,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:t=>this.placeInfo(t),key:this},this.space=null,this.currentClass="";let n=t.state.field(e),{options:s,selected:r}=n.open,o=t.state.facet(cd);this.optionContent=function(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(t){let e=document.createElement("div");return e.classList.add("cm-completionIcon"),t.type&&e.classList.add(...t.type.split(/\s+/g).map((t=>"cm-completionIcon-"+t))),e.setAttribute("aria-hidden","true"),e},position:20}),e.push({render(t,e,i,n){let s=document.createElement("span");s.className="cm-completionLabel";let r=t.displayLabel||t.label,o=0;for(let t=0;to&&s.appendChild(document.createTextNode(r.slice(o,e)));let l=s.appendChild(document.createElement("span"));l.appendChild(document.createTextNode(r.slice(e,i))),l.className="cm-completionMatchedText",o=i}return ot.position-e.position)).map((t=>t.render))}(o),this.optionClass=o.optionClass,this.tooltipClass=o.tooltipClass,this.range=fd(s.length,r,o.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(t.state),this.dom.addEventListener("mousedown",(i=>{let{options:n}=t.state.field(e).open;for(let e,s=i.target;s&&s!=this.dom;s=s.parentNode)if("LI"==s.nodeName&&(e=/-(\d+)$/.exec(s.id))&&+e[1]{let i=t.state.field(this.stateField,!1);i&&i.tooltip&&t.state.facet(cd).closeOnBlur&&e.relatedTarget!=t.contentDOM&&t.dispatch({effects:ld.of(null)})})),this.showOptions(s,n.id)}mount(){this.updateSel()}showOptions(t,e){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(t,e,this.range)),this.list.addEventListener("scroll",(()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)}))}update(t){var e;let i=t.state.field(this.stateField),n=t.startState.field(this.stateField);if(this.updateTooltipClass(t.state),i!=n){let{options:s,selected:r,disabled:o}=i.open;n.open&&n.open.options==s||(this.range=fd(s.length,r,t.state.facet(cd).maxRenderedOptions),this.showOptions(s,i.id)),this.updateSel(),o!=(null===(e=n.open)||void 0===e?void 0:e.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!o)}}updateTooltipClass(t){let e=this.tooltipClass(t);if(e!=this.currentClass){for(let t of this.currentClass.split(" "))t&&this.dom.classList.remove(t);for(let t of e.split(" "))t&&this.dom.classList.add(t);this.currentClass=e}}positioned(t){this.space=t,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let t=this.view.state.field(this.stateField),e=t.open;if((e.selected>-1&&e.selected=this.range.to)&&(this.range=fd(e.options.length,e.selected,this.view.state.facet(cd).maxRenderedOptions),this.showOptions(e.options,t.id)),this.updateSelectedOption(e.selected)){this.destroyInfo();let{completion:i}=e.options[e.selected],{info:n}=i;if(!n)return;let s="string"==typeof n?document.createTextNode(n):n(i);if(!s)return;"then"in s?s.then((e=>{e&&this.view.state.field(this.stateField,!1)==t&&this.addInfoPane(e,i)})).catch((t=>$i(this.view.state,t,"completion info"))):this.addInfoPane(s,i)}}addInfoPane(t,e){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",null!=t.nodeType)i.appendChild(t),this.infoDestroy=null;else{let{dom:e,destroy:n}=t;i.appendChild(e),this.infoDestroy=n||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(t){let e=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)"LI"==i.nodeName&&i.id?n==t?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),e=i):i.hasAttribute("aria-selected")&&i.removeAttribute("aria-selected"):n--;return e&&function(t,e){let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),s=i.height/t.offsetHeight;n.topi.bottom&&(t.scrollTop+=(n.bottom-i.bottom)/s)}(this.list,e),e}measureInfo(){let t=this.dom.querySelector("[aria-selected]");if(!t||!this.info)return null;let e=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=t.getBoundingClientRect(),s=this.space;if(!s){let t=this.dom.ownerDocument.defaultView||window;s={left:0,top:0,right:t.innerWidth,bottom:t.innerHeight}}return n.top>Math.min(s.bottom,e.bottom)-10||n.bottomi.from||0==i.from))if(s=t,"string"!=typeof a&&a.header)n.appendChild(a.header(a));else{n.appendChild(document.createElement("completion-section")).textContent=t}}const h=n.appendChild(document.createElement("li"));h.id=e+"-"+r,h.setAttribute("role","option");let c=this.optionClass(o);c&&(h.className=c);for(let t of this.optionContent){let e=t(o,this.view.state,this.view,l);e&&h.appendChild(e)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.tonew pd(i,t,e)}function md(t){return 100*(t.boost||0)+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}class vd{constructor(t,e,i,n,s,r){this.options=t,this.attrs=e,this.tooltip=i,this.timestamp=n,this.selected=s,this.disabled=r}setSelected(t,e){return t==this.selected||t>=this.options.length?this:new vd(this.options,xd(e,t),this.tooltip,this.timestamp,t,this.disabled)}static build(t,e,i,n,s){let r=function(t,e){let i=[],n=null,s=t=>{i.push(t);let{section:e}=t.completion;if(e){n||(n=[]);let t="string"==typeof e?e:e.name;n.some((e=>e.name==t))||n.push("string"==typeof e?{name:t}:e)}},r=e.facet(cd);for(let n of t)if(n.hasResult()){let t=n.result.getMatch;if(!1===n.result.filter)for(let e of n.result.options)s(new td(e,n.source,t?t(e):[],1e9-i.length));else{let i,o=e.sliceDoc(n.from,n.to),l=r.filterStrict?new hd(o):new ad(o);for(let e of n.result.options)if(i=l.match(e.label)){let r=e.displayLabel?t?t(e,i.matched):[]:i.matched;s(new td(e,n.source,r,i.score+(e.boost||0)))}}}if(n){let t=Object.create(null),e=0,s=(t,e)=>{var i,n;return(null!==(i=t.rank)&&void 0!==i?i:1e9)-(null!==(n=e.rank)&&void 0!==n?n:1e9)||(t.namee.score-t.score||a(t.completion,e.completion)))){let e=t.completion;!l||l.label!=e.label||l.detail!=e.detail||null!=l.type&&null!=e.type&&l.type!=e.type||l.apply!=e.apply||l.boost!=e.boost?o.push(t):md(t.completion)>md(l)&&(o[o.length-1]=t),l=t.completion}return o}(t,e);if(!r.length)return n&&t.some((t=>1==t.state))?new vd(n.options,n.attrs,n.tooltip,n.timestamp,n.selected,!0):null;let o=e.facet(cd).selectOnOpen?0:-1;if(n&&n.selected!=o&&-1!=n.selected){let t=n.options[n.selected].completion;for(let e=0;ee.hasResult()?Math.min(t,e.from):t),1e8),create:Dd,above:s.aboveCursor},n?n.timestamp:Date.now(),o,!1)}map(t){return new vd(this.options,this.attrs,Object.assign(Object.assign({},this.tooltip),{pos:t.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}}class wd{constructor(t,e,i){this.active=t,this.id=e,this.open=i}static start(){return new wd(kd,"cm-ac-"+Math.floor(2e6*Math.random()).toString(36),null)}update(t){let{state:e}=t,i=e.facet(cd),n=(i.override||e.languageDataAt("autocomplete",ed(e)).map(rd)).map((e=>(this.active.find((t=>t.source==e))||new Sd(e,this.active.some((t=>0!=t.state))?1:0)).update(t,i)));n.length==this.active.length&&n.every(((t,e)=>t==this.active[e]))&&(n=this.active);let s=this.open;s&&t.docChanged&&(s=s.map(t.changes)),t.selection||n.some((e=>e.hasResult()&&t.changes.touchesRange(e.from,e.to)))||!function(t,e){if(t==e)return!0;for(let i=0,n=0;;){for(;i1==t.state))&&(s=null),!s&&n.every((t=>1!=t.state))&&n.some((t=>t.hasResult()))&&(n=n.map((t=>t.hasResult()?new Sd(t.source,0):t)));for(let e of t.effects)e.is(Ad)&&(s=s&&s.setSelected(e.value,this.id));return n==this.active&&s==this.open?this:new wd(n,this.id,s)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?bd:yd}}const bd={"aria-autocomplete":"list"},yd={};function xd(t,e){let i={"aria-autocomplete":"list","aria-haspopup":"listbox","aria-controls":t};return e>-1&&(i["aria-activedescendant"]=t+"-"+e),i}const kd=[];function Pd(t,e){if(t.isUserEvent("input.complete")){let i=t.annotation(nd);if(i&&e.activateOnCompletion(i))return 12}let i=t.isUserEvent("input.type");return i&&e.activateOnTyping?5:i?1:t.isUserEvent("delete.backward")?2:t.selection?8:t.docChanged?16:0}class Sd{constructor(t,e,i=-1){this.source=t,this.state=e,this.explicitPos=i}hasResult(){return!1}update(t,e){let i=Pd(t,e),n=this;(8&i||16&i&&this.touches(t))&&(n=new Sd(n.source,0)),4&i&&0==n.state&&(n=new Sd(this.source,1)),n=n.updateFor(t,i);for(let e of t.effects)if(e.is(od))n=new Sd(n.source,1,e.value?ed(t.state):-1);else if(e.is(ld))n=new Sd(n.source,0);else if(e.is(Cd))for(let t of e.value)t.source==n.source&&(n=t);return n}updateFor(t,e){return this.map(t.changes)}map(t){return t.empty||this.explicitPos<0?this:new Sd(this.source,this.state,t.mapPos(this.explicitPos))}touches(t){return t.changes.touchesRange(ed(t.state))}}class Od extends Sd{constructor(t,e,i,n,s){super(t,2,e),this.result=i,this.from=n,this.to=s}hasResult(){return!0}updateFor(t,e){var i;if(!(3&e))return this.map(t.changes);let n=this.result;n.map&&!t.changes.empty&&(n=n.map(n,t.changes));let s=t.changes.mapPos(this.from),r=t.changes.mapPos(this.to,1),o=ed(t.state);if((this.explicitPos<0?o<=s:or||!n||2&e&&ed(t.startState)==this.from)return new Sd(this.source,4&e?1:0);let l=this.explicitPos<0?-1:t.changes.mapPos(this.explicitPos);return function(t,e,i,n){if(!t)return!1;let s=e.sliceDoc(i,n);return"function"==typeof t?t(s,i,n,e):id(t,!0).test(s)}(n.validFor,t.state,s,r)?new Od(this.source,l,n,s,r):n.update&&(n=n.update(n,s,r,new Gu(t.state,o,l>=0)))?new Od(this.source,l,n,n.from,null!==(i=n.to)&&void 0!==i?i:ed(t.state)):new Sd(this.source,1,l)}map(t){if(t.empty)return this;return(this.result.map?this.result.map(this.result,t):this.result)?new Od(this.source,this.explicitPos<0?-1:t.mapPos(this.explicitPos),this.result,t.mapPos(this.from),t.mapPos(this.to,1)):new Sd(this.source,0)}touches(t){return t.changes.touchesRange(this.from,this.to)}}const Cd=dt.define({map:(t,e)=>t.map((t=>t.map(e)))}),Ad=dt.define(),Md=X.define({create:()=>wd.start(),update:(t,e)=>t.update(e),provide:t=>[io.from(t,(t=>t.tooltip)),Ks.contentAttributes.from(t,(t=>t.attrs))]});function Td(t,e){const i=e.completion.apply||e.completion.label;let n=t.state.field(Md).active.find((t=>t.source==e.source));return n instanceof Od&&("string"==typeof i?t.dispatch(Object.assign(Object.assign({},function(t,e,i,n){let{main:s}=t.selection,r=i-s.from,o=n-s.from;return Object.assign(Object.assign({},t.changeByRange((l=>l!=s&&i!=n&&t.sliceDoc(l.from+r,l.from+o)!=t.sliceDoc(i,n)?{range:l}:{changes:{from:l.from+r,to:n==s.from?l.to:l.from+o,insert:e},range:B.cursor(l.from+r+e.length)}))),{scrollIntoView:!0,userEvent:"input.complete"})}(t.state,i,n.from,n.to)),{annotations:nd.of(e.completion)})):i(t,e.completion,n.from,n.to),!0)}const Dd=gd(Md,Td);function Ed(t,e="option"){return i=>{let n=i.state.field(Md,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp-1?n.open.selected+r*(t?1:-1):t?0:o-1;return l<0?l="page"==e?0:o-1:l>=o&&(l="page"==e?o-1:0),i.dispatch({effects:Ad.of(l)}),!0}}class Rd{constructor(t,e){this.active=t,this.context=e,this.time=Date.now(),this.updates=[],this.done=void 0}}const Bd=Gi.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(Md).active)1==e.state&&this.startQuery(e)}update(t){let e=t.state.field(Md),i=t.state.facet(cd);if(!t.selectionSet&&!t.docChanged&&t.startState.field(Md)==e)return;let n=t.transactions.some((t=>{let e=Pd(t,i);return 8&e||(t.selection||t.docChanged)&&!(3&e)}));for(let e=0;e50&&Date.now()-i.time>1e3){for(let t of i.context.abortListeners)try{t()}catch(t){$i(this.view.state,t)}i.context.abortListeners=null,this.running.splice(e--,1)}else i.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some((t=>t.effects.some((t=>t.is(od)))))&&(this.pendingStart=!0);let s=this.pendingStart?50:i.activateOnTypingDelay;if(this.debounceUpdate=e.active.some((t=>1==t.state&&!this.running.some((e=>e.active.source==t.source))))?setTimeout((()=>this.startUpdate()),s):-1,0!=this.composing)for(let e of t.transactions)e.isUserEvent("input.type")?this.composing=2:2==this.composing&&e.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(Md);for(let t of e.active)1!=t.state||this.running.some((e=>e.active.source==t.source))||this.startQuery(t)}startQuery(t){let{state:e}=this.view,i=ed(e),n=new Gu(e,i,t.explicitPos==i,this.view),s=new Rd(t,n);this.running.push(s),Promise.resolve(t.source(n)).then((t=>{s.context.aborted||(s.done=t||null,this.scheduleAccept())}),(t=>{this.view.dispatch({effects:ld.of(null)}),$i(this.view.state,t)}))}scheduleAccept(){this.running.every((t=>void 0!==t.done))?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout((()=>this.accept()),this.view.state.facet(cd).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],i=this.view.state.facet(cd);for(let n=0;nt.source==s.active.source));if(r&&1==r.state)if(null==s.done){let t=new Sd(s.active.source,0);for(let e of s.updates)t=t.update(e,i);1!=t.state&&e.push(t)}else this.startQuery(r)}e.length&&this.view.dispatch({effects:Cd.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(Md,!1);if(e&&e.tooltip&&this.view.state.facet(cd).closeOnBlur){let i=e.open&&ho(this.view,e.open.tooltip);i&&i.dom.contains(t.relatedTarget)||setTimeout((()=>this.view.dispatch({effects:ld.of(null)})),10)}},compositionstart(){this.composing=1},compositionend(){3==this.composing&&setTimeout((()=>this.view.dispatch({effects:od.of(!1)})),20),this.composing=0}}}),Nd="object"==typeof navigator&&/Win/.test(navigator.platform),Ld=j.highest(Ks.domEventHandlers({keydown(t,e){let i=e.state.field(Md,!1);if(!i||!i.open||i.open.disabled||i.open.selected<0||t.key.length>1||t.ctrlKey&&(!Nd||!t.altKey)||t.metaKey)return!1;let n=i.open.options[i.open.selected],s=i.active.find((t=>t.source==n.source)),r=n.completion.commitCharacters||s.result.commitCharacters;return r&&r.indexOf(t.key)>-1&&Td(e,n),!1}})),Id=Ks.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}}),Fd={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Vd=dt.define({map(t,e){let i=e.mapPos(t,-1,P.TrackAfter);return null==i?void 0:i}}),Wd=new class extends Ct{};Wd.startSide=1,Wd.endSide=-1;const Hd=X.define({create:()=>Dt.empty,update(t,e){if(t=t.map(e.changes),e.selection){let i=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:t=>t>=i.from&&t<=i.to})}for(let i of e.effects)i.is(Vd)&&(t=t.update({add:[Wd.range(i.value,i.value+1)]}));return t}});const zd="()[]{}<>";function qd(t){for(let e=0;e{if((Ud?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let s=t.state.selection.main;if(n.length>2||2==n.length&&1==x(b(n,0))||e!=s.from||i!=s.to)return!1;let r=function(t,e){let i=Xd(t,t.selection.main.head),n=i.brackets||Fd.brackets;for(let s of n){let r=qd(b(s,0));if(e==s)return r==s?Gd(t,s,n.indexOf(s+s+s)>-1,i):jd(t,s,r,i.before||Fd.before);if(e==r&&$d(t,t.selection.main.from))return Kd(t,s,r)}return null}(t.state,n);return!!r&&(t.dispatch(r),!0)})),Yd=[{key:"Backspace",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=Xd(t,t.selection.main.head).brackets||Fd.brackets,n=null,s=t.changeByRange((e=>{if(e.empty){let n=function(t,e){let i=t.sliceString(e-2,e);return x(b(i,0))==i.length?i:i.slice(1)}(t.doc,e.head);for(let s of i)if(s==n&&_d(t.doc,e.head)==qd(b(s,0)))return{changes:{from:e.head-s.length,to:e.head+s.length},range:B.cursor(e.head-s.length)}}return{range:n=e}}));return n||e(t.update(s,{scrollIntoView:!0,userEvent:"delete.backward"})),!n}}];function $d(t,e){let i=!1;return t.field(Hd).between(0,t.doc.length,(t=>{t==e&&(i=!0)})),i}function _d(t,e){let i=t.sliceString(e,e+2);return i.slice(0,x(b(i,0)))}function jd(t,e,i,n){let s=null,r=t.changeByRange((r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:i,from:r.to}],effects:Vd.of(r.to+e.length),range:B.range(r.anchor+e.length,r.head+e.length)};let o=_d(t.doc,r.head);return!o||/\s/.test(o)||n.indexOf(o)>-1?{changes:{insert:e+i,from:r.head},effects:Vd.of(r.head+e.length),range:B.cursor(r.head+e.length)}:{range:s=r}}));return s?null:t.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function Kd(t,e,i){let n=null,s=t.changeByRange((e=>e.empty&&_d(t.doc,e.head)==i?{changes:{from:e.head,to:e.head+i.length,insert:i},range:B.cursor(e.head+i.length)}:n={range:e}));return n?null:t.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function Gd(t,e,i,n){let s=n.stringPrefixes||Fd.stringPrefixes,r=null,o=t.changeByRange((n=>{if(!n.empty)return{changes:[{insert:e,from:n.from},{insert:e,from:n.to}],effects:Vd.of(n.to+e.length),range:B.range(n.anchor+e.length,n.head+e.length)};let o,l=n.head,a=_d(t.doc,l);if(a==e){if(Zd(t,l))return{changes:{insert:e+e,from:l},effects:Vd.of(l+e.length),range:B.cursor(l+e.length)};if($d(t,l)){let n=i&&t.sliceDoc(l,l+3*e.length)==e+e+e?e+e+e:e;return{changes:{from:l,to:l+n.length,insert:n},range:B.cursor(l+n.length)}}}else{if(i&&t.sliceDoc(l-2*e.length,l)==e+e&&(o=Jd(t,l-2*e.length,s))>-1&&Zd(t,o))return{changes:{insert:e+e+e+e,from:l},effects:Vd.of(l+e.length),range:B.cursor(l+e.length)};if(t.charCategorizer(l)(a)!=yt.Word&&Jd(t,l,s)>-1&&!function(t,e,i,n){let s=Zl(t).resolveInner(e,-1),r=n.reduce(((t,e)=>Math.max(t,e.length)),0);for(let o=0;o<5;o++){let o=t.sliceDoc(s.from,Math.min(s.to,s.from+i.length+r)),l=o.indexOf(i);if(!l||l>-1&&n.indexOf(o.slice(0,l))>-1){let e=s.firstChild;for(;e&&e.from==s.from&&e.to-e.from>i.length+l;){if(t.sliceDoc(e.to-i.length,e.to)==i)return!1;e=e.firstChild}return!0}let a=s.to==e&&s.parent;if(!a)break;s=a}return!1}(t,l,e,s))return{changes:{insert:e+e,from:l},effects:Vd.of(l+e.length),range:B.cursor(l+e.length)}}return{range:r=n}}));return r?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function Zd(t,e){let i=Zl(t).resolveInner(e+1);return i.parent&&i.from==e}function Jd(t,e,i){let n=t.charCategorizer(e);if(n(t.sliceDoc(e-1,e))!=yt.Word)return e;for(let s of i){let i=e-s.length;if(t.sliceDoc(i,e)==s&&n(t.sliceDoc(i-1,i))!=yt.Word)return i}return-1}function tf(t={}){return[Ld,Md,cd.of(t),Bd,nf,Id]}const ef=[{key:"Ctrl-Space",run:t=>!!t.state.field(Md,!1)&&(t.dispatch({effects:od.of(!0)}),!0)},{key:"Escape",run:t=>{let e=t.state.field(Md,!1);return!(!e||!e.active.some((t=>0!=t.state)))&&(t.dispatch({effects:ld.of(null)}),!0)}},{key:"ArrowDown",run:Ed(!0)},{key:"ArrowUp",run:Ed(!1)},{key:"PageDown",run:Ed(!0,"page")},{key:"PageUp",run:Ed(!1,"page")},{key:"Enter",run:t=>{let e=t.state.field(Md,!1);return!(t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampt.facet(cd).defaultKeymap?[ef]:[])));class sf{constructor(t,e,i){this.from=t,this.to=e,this.diagnostic=i}}class rf{constructor(t,e,i){this.diagnostics=t,this.panel=e,this.selected=i}static init(t,e,i){let n=t,s=i.facet(mf).markerFilter;s&&(n=s(n,i));let r=ni.set(n.map((t=>t.from==t.to||t.from==t.to-1&&i.doc.lineAt(t.from).to==t.from?ni.widget({widget:new bf(t),diagnostic:t}).range(t.from):ni.mark({attributes:{class:"cm-lintRange cm-lintRange-"+t.severity+(t.markClass?" "+t.markClass:"")},diagnostic:t}).range(t.from,t.to))),!0);return new rf(r,e,of(r))}}function of(t,e=null,i=0){let n=null;return t.between(i,1e9,((t,i,{spec:s})=>{if(!e||s.diagnostic==e)return n=new sf(t,i,s.diagnostic),!1})),n}const lf=dt.define(),af=dt.define(),hf=dt.define(),cf=X.define({create:()=>new rf(ni.none,null,null),update(t,e){if(e.docChanged&&t.diagnostics.size){let i=t.diagnostics.map(e.changes),n=null,s=t.panel;if(t.selected){let s=e.changes.mapPos(t.selected.from,1);n=of(i,t.selected.diagnostic,s)||of(i,null,s)}!i.size&&s&&e.state.facet(mf).autoPanel&&(s=null),t=new rf(i,s,n)}for(let i of e.effects)if(i.is(lf)){let n=e.state.facet(mf).autoPanel?i.value.length?xf.open:null:t.panel;t=rf.init(i.value,n,e.state)}else i.is(af)?t=new rf(t.diagnostics,i.value?xf.open:null,t.selected):i.is(hf)&&(t=new rf(t.diagnostics,t.panel,i.value));return t},provide:t=>[vo.from(t,(t=>t.panel)),Ks.decorations.from(t,(t=>t.diagnostics))]}),uf=ni.mark({class:"cm-lintRange cm-lintRange-active"});function df(t,e,i){let{diagnostics:n}=t.state.field(cf),s=[],r=2e8,o=0;n.between(e-(i<0?1:0),e+(i>0?1:0),((t,n,{spec:l})=>{e>=t&&e<=n&&(t==n||(e>t||i>0)&&(e({dom:ff(t,s)})}:null}function ff(t,e){return $c("ul",{class:"cm-tooltip-lint"},e.map((e=>wf(t,e,!1))))}const pf=t=>{let e=t.state.field(cf,!1);return!(!e||!e.panel)&&(t.dispatch({effects:af.of(!1)}),!0)},gf=[{key:"Mod-Shift-m",run:t=>{let e=t.state.field(cf,!1);var i,n;e&&e.panel||t.dispatch({effects:(i=t.state,n=[af.of(!0)],i.field(cf,!1)?n:n.concat(dt.appendConfig.of(Sf)))});let s=fo(t,xf.open);return s&&s.dom.querySelector(".cm-panel-lint ul").focus(),!0},preventDefault:!0},{key:"F8",run:t=>{let e=t.state.field(cf,!1);if(!e)return!1;let i=t.state.selection.main,n=e.diagnostics.iter(i.to+1);return!(!n.value&&(n=e.diagnostics.iter(0),!n.value||n.from==i.from&&n.to==i.to))&&(t.dispatch({selection:{anchor:n.from,head:n.to},scrollIntoView:!0}),!0)}}],mf=I.define({combine:t=>Object.assign({sources:t.map((t=>t.source)).filter((t=>null!=t))},Ot(t.map((t=>t.config)),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{needsRefresh:(t,e)=>t?e?i=>t(i)||e(i):t:e}))});function vf(t){let e=[];if(t)t:for(let{name:i}of t){for(let t=0;tt.toLowerCase()==n.toLowerCase()))){e.push(n);continue t}}e.push("")}return e}function wf(t,e,i){var n;let s=i?vf(e.actions):[];return $c("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},$c("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(t):e.message),null===(n=e.actions)||void 0===n?void 0:n.map(((i,n)=>{let r=!1,o=n=>{if(n.preventDefault(),r)return;r=!0;let s=of(t.state.field(cf).diagnostics,e);s&&i.apply(t,s.from,s.to)},{name:l}=i,a=s[n]?l.indexOf(s[n]):-1,h=a<0?l:[l.slice(0,a),$c("u",l.slice(a,a+1)),l.slice(a+1)];return $c("button",{type:"button",class:"cm-diagnosticAction",onclick:o,onmousedown:o,"aria-label":` Action: ${l}${a<0?"":` (access key "${s[n]})"`}.`},h)})),e.source&&$c("div",{class:"cm-diagnosticSource"},e.source))}class bf extends ei{constructor(t){super(),this.diagnostic=t}eq(t){return t.diagnostic==this.diagnostic}toDOM(){return $c("span",{class:"cm-lintPoint cm-lintPoint-"+this.diagnostic.severity})}}class yf{constructor(t,e){this.diagnostic=e,this.id="item_"+Math.floor(4294967295*Math.random()).toString(16),this.dom=wf(t,e,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}}class xf{constructor(t){this.view=t,this.items=[];this.list=$c("ul",{tabIndex:0,role:"listbox","aria-label":this.view.state.phrase("Diagnostics"),onkeydown:e=>{if(27==e.keyCode)pf(this.view),this.view.focus();else if(38==e.keyCode||33==e.keyCode)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(40==e.keyCode||34==e.keyCode)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(36==e.keyCode)this.moveSelection(0);else if(35==e.keyCode)this.moveSelection(this.items.length-1);else if(13==e.keyCode)this.view.focus();else{if(!(e.keyCode>=65&&e.keyCode<=90&&this.selectedIndex>=0))return;{let{diagnostic:i}=this.items[this.selectedIndex],n=vf(i.actions);for(let s=0;s{for(let e=0;epf(this.view)},"×")),this.update()}get selectedIndex(){let t=this.view.state.field(cf).selected;if(!t)return-1;for(let e=0;e{let l,a=-1;for(let t=i;ti&&(this.items.splice(i,a-i),n=!0)),e&&l.diagnostic==e.diagnostic?l.dom.hasAttribute("aria-selected")||(l.dom.setAttribute("aria-selected","true"),s=l):l.dom.hasAttribute("aria-selected")&&l.dom.removeAttribute("aria-selected"),i++}));i({sel:s.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:t,panel:e})=>{let i=e.height/this.list.offsetHeight;t.tope.bottom&&(this.list.scrollTop+=(t.bottom-e.bottom)/i)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let t=this.list.firstChild;function e(){let e=t;t=e.nextSibling,e.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;t!=i.dom;)e();t=i.dom.nextSibling}else this.list.insertBefore(i.dom,t);for(;t;)e()}moveSelection(t){if(this.selectedIndex<0)return;let e=of(this.view.state.field(cf).diagnostics,this.items[t].diagnostic);e&&this.view.dispatch({selection:{anchor:e.from,head:e.to},scrollIntoView:!0,effects:hf.of(e)})}static open(t){return new xf(t)}}function kf(t){return function(t,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(t)}')`}(``,'width="6" height="3"')}const Pf=Ks.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:kf("#d11")},".cm-lintRange-warning":{backgroundImage:kf("orange")},".cm-lintRange-info":{backgroundImage:kf("#999")},".cm-lintRange-hint":{backgroundImage:kf("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}}),Sf=[cf,Ks.decorations.compute([cf],(t=>{let{selected:e,panel:i}=t.field(cf);return e&&i&&e.from!=e.to?ni.set([uf.range(e.from,e.to)]):ni.none})),ao(df,{hideOn:function(t,e){let i=e.pos,n=e.end||i,s=t.state.facet(mf).hideOn(t,i,n);if(null!=s)return s;let r=t.startState.doc.lineAt(e.pos);return!(!t.effects.some((t=>t.is(lf)))&&!t.changes.touchesRange(r.from,Math.max(r.to,n)))}}),Pf],Of=(()=>[Vo(),zo,Ir(),Lh(),Ua(),br(),[Ar,Mr],St.allowMultipleSelections.of(!0),St.transactionFilter.of((t=>{if(!t.docChanged||!t.isUserEvent("input.type")&&!t.isUserEvent("input.complete"))return t;let e=t.startState.languageDataAt("indentOnInput",t.startState.selection.main.head);if(!e.length)return t;let i=t.newDoc,{head:n}=t.newSelection.main,s=i.lineAt(n);if(n>s.from+200)return t;let r=i.sliceString(s.from,n);if(!e.some((t=>t.test(r))))return t;let{state:o}=t,l=-1,a=[];for(let{head:t}of o.selection.ranges){let e=o.doc.lineAt(t);if(e.from==l)continue;l=e.from;let i=fa(o,e.from);if(null==i)continue;let n=/^\s*/.exec(e.text)[0],s=da(o,i);n!=s&&a.push({from:e.from,to:e.from+n.length,insert:s})}return a.length?[t,{changes:a,sequential:!0}]:t})),Ka(Ja,{fallback:!0}),hh(),[Qd,Hd],tf(),Ks.mouseSelectionStyle.of(((t,e)=>{return(i=e).altKey&&0==i.button?Ur(t,e):null;var i})),$r(),zr,[pu,fu],sr.of([...Yd,...Yc,...Xu,...Zh,...La,...ef,...gf])])();class Cf{constructor(t,e,i,n,s,r,o,l,a,h=0,c){this.p=t,this.stack=e,this.state=i,this.reducePos=n,this.pos=s,this.score=r,this.buffer=o,this.bufferBase=l,this.curContext=a,this.lookAhead=h,this.parent=c}toString(){return`[${this.stack.filter(((t,e)=>e%3==0)).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,i=0){let n=t.parser.context;return new Cf(t,[],e,i,i,0,[],0,n?new Af(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let i=t>>19,n=65535&t,{parser:s}=this.p,r=this.reducePos=2e3&&!(null===(e=this.p.parser.nodeSet.types[n])||void 0===e?void 0:e.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=h):this.p.lastBigReductionSizel;)this.stack.pop();this.reduceContext(n,a)}storeNode(t,e,i,n=4,s=!1){if(0==t&&(!this.stack.length||this.stack[this.stack.length-1]0&&0==t.buffer[n-4]&&t.buffer[n-1]>-1){if(e==i)return;if(t.buffer[n-2]>=e)return void(t.buffer[n-2]=i)}}if(s&&this.pos!=i){let s=this.buffer.length;if(s>0&&0!=this.buffer[s-4]){let t=!1;for(let e=s;e>0&&this.buffer[e-2]>i;e-=4)if(this.buffer[e-1]>=0){t=!0;break}if(t)for(;s>0&&this.buffer[s-2]>i;)this.buffer[s]=this.buffer[s-4],this.buffer[s+1]=this.buffer[s-3],this.buffer[s+2]=this.buffer[s-2],this.buffer[s+3]=this.buffer[s-1],s-=4,n>4&&(n-=4)}this.buffer[s]=t,this.buffer[s+1]=e,this.buffer[s+2]=i,this.buffer[s+3]=n}else this.buffer.push(t,e,i,n)}shift(t,e,i,n){if(131072&t)this.pushState(65535&t,this.pos);else if(262144&t)this.pos=n,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,n,4);else{let s=t,{parser:r}=this.p;(n>this.pos||e<=r.maxNode)&&(this.pos=n,r.stateFlag(s,1)||(this.reducePos=n)),this.pushState(s,i),this.shiftContext(e,i),e<=r.maxNode&&this.buffer.push(e,i,n,4)}}apply(t,e,i,n){65536&t?this.reduce(t):this.shift(t,e,i,n)}useNode(t,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=t)&&(this.p.reused.push(t),i++);let n=this.pos;this.reducePos=this.pos=n+t.length,this.pushState(e,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let i=t.buffer.slice(e),n=t.bufferBase+e;for(;t&&n==t.bufferBase;)t=t.parent;return new Cf(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let i=t<=this.p.parser.maxNode;i&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new Mf(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(0==i)return!1;if(!(65536&i))return!0;e.reduce(i)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let i=[];for(let n,s=0;s1&e&&t==n))||i.push(e[t],n)}e=i}let i=[];for(let t=0;t>19,n=65535&e,s=this.stack.length-3*i;if(s<0||t.getGoto(this.stack[s],n,!1)<0){let t=this.findForcedReduction();if(null==t)return!1;e=t}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],i=(n,s)=>{if(!e.includes(n))return e.push(n),t.allActions(n,(e=>{if(393216&e);else if(65536&e){let i=(e>>19)-s;if(i>1){let n=65535&e,s=this.stack.length-3*i;if(s>=0&&t.getGoto(this.stack[s],n,!1)>=0)return i<<19|65536|n}}else{let t=i(e,s+1);if(null!=t)return t}}))};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(3!=this.stack.length)return!1;let{parser:t}=this.p;return 65535==t.data[t.stateSlot(this.state,1)]&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;ethis.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}}class Af{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}}class Mf{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=65535&t,i=t>>19;0==i?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=3*(i-1);let n=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=n}}class Tf{constructor(t,e,i){this.stack=t,this.pos=e,this.index=i,this.buffer=t.buffer,0==this.index&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new Tf(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;null!=t&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,0==this.index&&this.maybeNext()}fork(){return new Tf(this.stack,this.pos,this.index)}}function Df(t,e=Uint16Array){if("string"!=typeof t)return t;let i=null;for(let n=0,s=0;n=92&&e--,e>=34&&e--;let s=e-32;if(s>=46&&(s-=46,i=!0),r+=s,i)break;r*=46}i?i[s++]=r:i=new e(r)}return i}class Ef{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const Rf=new Ef;class Bf{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Rf,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let i=this.range,n=this.rangeIndex,s=this.pos+t;for(;si.to:s>=i.to;){if(n==this.ranges.length-1)return null;let t=this.ranges[++n];s+=t.from-i.to,i=t}return s}clipPos(t){if(t>=this.range.from&&tt)return Math.max(t,e.from);return this.end}peek(t){let e,i,n=this.chunkOff+t;if(n>=0&&n=this.chunk2Pos&&en.to&&(this.chunk2=this.chunk2.slice(0,n.to-e)),i=this.chunk2.charCodeAt(0)}}return e>=this.token.lookAhead&&(this.token.lookAhead=e+1),i}acceptToken(t,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(null==i||i=this.chunk2Pos&&this.posthis.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=Rf,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let i="";for(let n of this.ranges){if(n.from>=e)break;n.to>t&&(i+=this.input.read(Math.max(n.from,t),Math.min(n.to,e)))}return i}}class Nf{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:i}=e.p;!function(t,e,i,n,s,r){let o=0,l=1<0){let i=t[n];if(a.allows(i)&&(-1==e.token.value||e.token.value==i||Ff(i,e.token.value,s,r))){e.acceptToken(i);break}}let n=e.next,h=0,c=t[o+2];if(!(e.next<0&&c>h&&65535==t[i+3*c-3])){for(;h>1,r=i+s+(s<<1),l=t[r],a=t[r+1]||65536;if(n=a)){o=t[r+2],e.advance();continue t}h=s+1}}break}o=t[i+3*c-1]}}(this.data,t,e,this.id,i.data,i.tokenPrecTable)}}Nf.prototype.contextual=Nf.prototype.fallback=Nf.prototype.extend=!1,Nf.prototype.fallback=Nf.prototype.extend=!1;class Lf{constructor(t,e={}){this.token=t,this.contextual=!!e.contextual,this.fallback=!!e.fallback,this.extend=!!e.extend}}function If(t,e,i){for(let n,s=e;65535!=(n=t[s]);s++)if(n==i)return s-e;return-1}function Ff(t,e,i,n){let s=If(i,n,e);return s<0||If(i,n,t)e)&&!n.type.isError)return i<0?Math.max(0,Math.min(n.to-1,e-25)):Math.min(t.length,Math.max(n.from+1,e+25));if(i<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return i<0?0:t.length}}class zf{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?Hf(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?Hf(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(tt)return this.nextStart=r,null;if(s instanceof Jo){if(r==t){if(r=Math.max(this.safeFrom,t)&&(this.trees.push(s),this.start.push(r),this.index.push(0))}else this.index[e]++,this.nextStart=r+s.length}}}class qf{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map((t=>new Ef))}getActions(t){let e=0,i=null,{parser:n}=t.p,{tokenizers:s}=n,r=n.stateSlot(t.state,3),o=t.curContext?t.curContext.hash:0,l=0;for(let n=0;nh.end+25&&(l=Math.max(h.lookAhead,l)),0!=h.value)){let n=e;if(h.extended>-1&&(e=this.addActions(t,h.extended,h.end,e)),e=this.addActions(t,h.value,h.end,e),!a.extend&&(i=h,e>n))break}}for(;this.actions.length>e;)this.actions.pop();return l&&t.setLookAhead(l),i||t.pos!=this.stream.end||(i=new Ef,i.value=t.p.parser.eofTerm,i.start=i.end=t.pos,e=this.addActions(t,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new Ef,{pos:i,p:n}=t;return e.start=i,e.end=Math.min(i+1,n.stream.end),e.value=i==n.stream.end?n.parser.eofTerm:0,e}updateCachedToken(t,e,i){let n=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(n,t),i),t.value>-1){let{parser:e}=i.p;for(let n=0;n=0&&i.p.parser.dialect.allows(s>>1)){1&s?t.extended=s>>1:t.value=s>>1;break}}}else t.value=0,t.end=this.stream.clipPos(n+1)}putAction(t,e,i,n){for(let e=0;e4*t.bufferLength?new zf(i,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t,e,i=this.stacks,n=this.minStackPos,s=this.stacks=[];if(this.bigReductionCount>300&&1==i.length){let[t]=i;for(;t.forceReduce()&&t.stack.length&&t.stack[t.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;rn)s.push(o);else{if(this.advanceStack(o,s,i))continue;{t||(t=[],e=[]),t.push(o);let i=this.tokens.getMainToken(o);e.push(i.value,i.end)}}break}}if(!s.length){let e=t&&function(t){let e=null;for(let i of t){let t=i.p.stoppedAt;(i.pos==i.p.stream.end||null!=t&&i.pos>t)&&i.p.parser.stateFlag(i.state,2)&&(!e||e.scorethis.stoppedAt?t[0]:this.runRecovery(t,e,s);if(i)return Vf&&console.log("Force-finish "+this.stackID(i)),this.stackToTree(i.forceAll())}if(this.recovering){let t=1==this.recovering?1:3*this.recovering;if(s.length>t)for(s.sort(((t,e)=>e.score-t.score));s.length>t;)s.pop();s.some((t=>t.reducePos>n))&&this.recovering--}else if(s.length>1){t:for(let t=0;t500&&n.buffer.length>500){if(!((e.score-n.score||e.buffer.length-n.buffer.length)>0)){s.splice(t--,1);continue t}s.splice(i--,1)}}}s.length>12&&s.splice(12,s.length-12)}this.minStackPos=s[0].pos;for(let t=1;t ":"";if(null!=this.stoppedAt&&n>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let e=t.curContext&&t.curContext.tracker.strict,i=e?t.curContext.hash:0;for(let o=this.fragments.nodeAt(n);o;){let n=this.parser.nodeSet.types[o.type.id]==o.type?s.getGoto(t.state,o.type.id):-1;if(n>-1&&o.length&&(!e||(o.prop(Qo.contextHash)||0)==i))return t.useNode(o,n),Vf&&console.log(r+this.stackID(t)+` (via reuse of ${s.getName(o.type.id)})`),!0;if(!(o instanceof Jo)||0==o.children.length||o.positions[0]>0)break;let l=o.children[0];if(!(l instanceof Jo&&0==o.positions[0]))break;o=l}}let o=s.stateSlot(t.state,4);if(o>0)return t.reduce(o),Vf&&console.log(r+this.stackID(t)+` (via always-reduce ${s.getName(65535&o)})`),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let l=this.tokens.getActions(t);for(let o=0;on?e.push(d):i.push(d)}return!1}advanceFully(t,e){let i=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>i)return Uf(t,e),!0}}runRecovery(t,e,i){let n=null,s=!1;for(let r=0;r ":"";if(o.deadEnd){if(s)continue;if(s=!0,o.restart(),Vf&&console.log(h+this.stackID(o)+" (restarted)"),this.advanceFully(o,i))continue}let c=o.split(),u=h;for(let t=0;c.forceReduce()&&t<10;t++){if(Vf&&console.log(u+this.stackID(c)+" (via force-reduce)"),this.advanceFully(c,i))break;Vf&&(u=this.stackID(c)+" -> ")}for(let t of o.recoverByInsert(l))Vf&&console.log(h+this.stackID(t)+" (via recover-insert)"),this.advanceFully(t,i);this.stream.end>o.pos?(a==o.pos&&(a++,l=0),o.recoverByDelete(l,a),Vf&&console.log(h+this.stackID(o)+` (via recover-delete ${this.parser.getName(l)})`),Uf(o,i)):(!n||n.scoret.topRules[e][1])),n=[];for(let t=0;t=0)s(n,t,e[i++]);else{let r=e[i+-n];for(let o=-n;o>0;o--)s(e[i++],t,r);i++}}}this.nodeSet=new jo(e.map(((e,s)=>_o.define({name:s>=this.minRepeatTerm?void 0:e,id:s,props:n[s],top:i.indexOf(s)>-1,error:0==s,skipped:t.skippedNodes&&t.skippedNodes.indexOf(s)>-1})))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=qo;let r=Df(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let t=0;t"number"==typeof t?new Nf(r,t):t)),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,i){let n=new Xf(this,t,e,i);for(let s of this.wrappers)n=s(n,t,e,i);return n}getGoto(t,e,i=!1){let n=this.goto;if(e>=n[0])return-1;for(let s=n[e+1];;){let e=n[s++],r=1&e,o=n[s++];if(r&&i)return o;for(let i=s+(e>>1);s0}validAction(t,e){return!!this.allActions(t,(t=>t==e||null))}allActions(t,e){let i=this.stateSlot(t,4),n=i?e(i):void 0;for(let i=this.stateSlot(t,1);null==n;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=$f(this.data,i+2)}n=e($f(this.data,i+1))}return n}nextStates(t){let e=[];for(let i=this.stateSlot(t,1);;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=$f(this.data,i+2)}if(!(1&this.data[i+2])){let t=this.data[i+1];e.some(((e,i)=>1&i&&e==t))||e.push(this.data[i],t)}}return e}configure(t){let e=Object.assign(Object.create(Yf.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let i=this.topRules[t.top];if(!i)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=i}return t.tokenizers&&(e.tokenizers=this.tokenizers.map((e=>{let i=t.tokenizers.find((t=>t.from==e));return i?i.to:e}))),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map(((i,n)=>{let s=t.specializers.find((t=>t.from==i.external));if(!s)return i;let r=Object.assign(Object.assign({},i),{external:s.to});return e.specializers[n]=_f(r),r}))),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),null!=t.strict&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),null!=t.bufferLength&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return null==e?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),i=e.map((()=>!1));if(t)for(let n of t.split(" ")){let t=e.indexOf(n);t>=0&&(i[t]=!0)}let n=null;for(let t=0;tt.external(i,n)<<1|e}return t.get}const jf=10,Kf=13,Gf=39,Zf=45,Jf=46,tp=new Map;tp.set(13,["above","over"]),tp.set(14,["and"]),tp.set(15,["around","round"]),tp.set(16,["as"]),tp.set(33,["great","high","big","strong"]),tp.set(62,["less","low","small","weak"]),tp.set(17,["at"]),tp.set(18,["back"]),tp.set(19,["be"]),tp.set(20,["break"]),tp.set(21,["build"]),tp.set(22,["call"]),tp.set(23,["cast","burn"]),tp.set(24,["continue","take"]),tp.set(25,["debug"]),tp.set(26,["divided","between","over"]),tp.set(27,["down"]),tp.set(28,["else","otherwise"]),tp.set(29,["empty","silent","silence"]),tp.set(30,["end","yeah","baby","oh"]),tp.set(31,["exactly","totally","really"]),tp.set(32,["false","lies","no","wrong"]),tp.set(34,["his","her"]),tp.set(35,["if","when"]),tp.set(36,["into","in"]),tp.set(37,["is","was","are","were","am"]),tp.set(38,["isnt","isn't","aint","ain't","wasn't","wasnt","aren't","arent","weren't","werent"]),tp.set(39,["join","unite"]),tp.set(40,["knock"]),tp.set(41,["less","lower","smaller","weaker"]),tp.set(42,["let"]),tp.set(43,["like","so"]),tp.set(44,["listen"]),tp.set(45,["minus","without"]),tp.set(46,["greater","higher","bigger","stronger","more"]),tp.set(47,["mysterious"]),tp.set(48,["non"]),tp.set(49,["nor"]),tp.set(50,["not"]),tp.set(51,["now"]),tp.set(52,["null","nothing","nowhere","nobody","gone"]),tp.set(53,["or"]),tp.set(54,["over"]),tp.set(55,["plus","with"]),tp.set(56,["roll","pop"]),tp.set(57,["print","shout","say","scream","whisper"]),tp.set(4,["they","them","she","him","her","hir","zie","zir","xem","ver","ze","ve","xe","it","he","you","me","i"]),tp.set(58,["rock","push"]),tp.set(59,["put"]),tp.set(60,["return","giving","give","send"]),tp.set(61,["say","says","said"]),tp.set(63,["cut","split","shatter"]),tp.set(64,["takes","wants"]),tp.set(65,["taking"]),tp.set(66,["than"]),tp.set(67,["an","a","the","my","your","our","their"]),tp.set(68,["then"]),tp.set(69,["times","of"]),tp.set(70,["to"]),tp.set(71,["true","yes","ok","right"]),tp.set(72,["turn"]),tp.set(73,["under","below"]),tp.set(74,["until"]),tp.set(75,["up"]),tp.set(76,["using","with"]),tp.set(77,["while"]),tp.set(78,["with"]),tp.set(79,["write"]);const ep=Array.from(tp.values()).flat(),ip=[">=","<=",">","<","="],np=["+","/","*","-"],sp=gp(" \t,?!./;"),rp=gp("?!.;");let op=rp.concat([Kf,jf]);const lp=new Map;lp.set(6,[50,37,38]),lp.set(7,[55,45,26,69]),lp.set(5,[14,49,53]);function ap(t){var e="string"==typeof t?t.toLowerCase():String.fromCodePoint(...t).toLowerCase();return ep.includes(e)}const hp=gp(" \t"),cp=t=>pp(t,bp.concat(mp)),up=t=>pp(t,bp),dp=(t,e=0)=>{let i=[];for(;hp.includes(t.peek(e));)e++;for(;;){var n=t.peek(e);if(n<=0)break;if(hp.includes(n))break;i.push(n),e++}return[i,e]},fp=(t,e=0)=>{let i=[];for(;hp.includes(t.peek(e));)e++;if(t.peek(e)<=0)return[i,e];for(;bp.includes(t.peek(e));)i.push(t.peek(e++));for(;t.peek(e)==Jf;)i.push(t.peek(e++));return[i,e]};function pp(t,e){let i=[];for(;hp.includes(t.next);)t.advance();for(;e.includes(t.next);)i.push(t.next),t.advance();return i}function gp(t){for(var e=[],i=0;i=!+/-*"),vp=gp("ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĸĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ"),wp=gp("abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįi̇ijĵķĸĺļľŀłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷÿźżžʼnß"),bp=vp.concat(wp),yp=new Lf((function(t){var e=up(t),i=String.fromCodePoint(...e).toLowerCase();for(const[e,n]of tp)if(n.includes(i))return t.acceptToken(e)})),xp=new Lf((function(t){var e=up(t);if(e.length){var i=String.fromCodePoint(...e);if(tp.get(67).includes(i.toLowerCase()))return up(t),t.acceptToken(2);if(tp.get(34).includes(i.toLowerCase()))return e=up(t),i+=" "+String.fromCodePoint(...e),0==e.length||ap(e)?t.acceptToken(4):t.acceptToken(2);if(tp.get(4).includes(i.toLowerCase()))return t.acceptToken(4);if(!ap(e)){for(;t.next==Jf;)e.push(t.next),t.advance();for(var n=[],s=0,r=t.pos,o=0;o<99&&!ap(e);o++)vp.includes(e[0])&&(n.push(String.fromCodePoint(...e)),t.advance(s),r+=s),[e,s]=fp(t);return n.length>1?t.acceptTokenTo(1,r):t.acceptToken(3)}}})),kp=new Lf((function(t){var e=cp(t),i=String.fromCodePoint(...e).toLowerCase();if(ip.includes(i))return t.acceptToken(6);if(np.includes(i))return t.acceptToken(7);if(tp.get(37).includes(i)){for(var n of(e=cp(t),i=String.fromCodePoint(...e).toLowerCase(),[13,41,46,73]))if(tp.get(n).includes(i)){var s=t.pos;return e=cp(t),i=String.fromCodePoint(...e).toLowerCase(),tp.get(66).includes(i)?t.acceptToken(6):t.acceptTokenTo(6,s)}if("as"==i)for(var n of(e=cp(t),i=String.fromCodePoint(...e).toLowerCase(),[33,62]))if(tp.get(n).includes(i)&&(e=cp(t),i=String.fromCodePoint(...e).toLowerCase(),tp.get(16).includes(i)))return t.acceptToken(6)}else for(var r of lp.keys())for(var n of lp.get(r))if(tp.get(n).includes(i)){if("divided"==i){var[e,o]=fp(t);"by"==String.fromCodePoint(...e).toLowerCase()&&up(t)}return t.acceptToken(r)}})),Pp=new Lf((function(t){for(;t.next>=0&&t.next!=jf;)t.advance();t.acceptToken(9)})),Sp=new Lf((function(t){let e=[];for(;hp.includes(t.next);)t.advance();if(bp.concat([Gf,Zf]).includes(t.next)){for(;t.next>=0&&!hp.includes(t.next);)e.push(t.next),t.advance();if(!function(t){if(ip.includes(t))return!0;if(np.includes(t))return!0;for(var e of lp.keys())for(var i of lp.get(e))if(tp.get(i).includes(t))return!0;return!1}(String.fromCodePoint(...e).toLowerCase())){for(;t.next>=0&&t.next!=jf;)t.advance();return t.acceptToken(8)}}})),Op=new Lf((function(t){for(var e=hp.concat(sp);t.next>=0&&e.includes(t.next);)t.advance();var i=0;if(t.peek(i)==Kf&&i++,t.peek(i)==jf){if(t.advance(i+1),i=0,t.next<0)return;for(;t.peek(i)>=0;){for(;sp.includes(t.peek(i));)i++;if(t.peek(i)==Kf&&i++,t.peek(i)==jf)return t.acceptToken(10);for(;sp.includes(t.peek(i));)i++;let[e,s]=fp(t,i);var n=String.fromCodePoint(...e).toLowerCase();if(tp.get(28).includes(n))return t.acceptToken(10);if(tp.get(30).includes(n))return t.acceptToken(10);i++}}var[s,r]=fp(t);return n=String.fromCodePoint(...s),/oo*h/i.test(n)?(t.advance(1),t.acceptToken(10)):tp.get(28).includes(n)||tp.get(30).includes(n)?(up(t),t.acceptToken(10)):void 0})),Cp=new Lf((function(t){for(var e=!1,i=hp.concat(sp);t.next>=0&&i.includes(t.next);)rp.includes(t.next)&&(e=!0),t.advance();var n=0;t.peek(n)==Kf&&n++,t.peek(n)==jf&&(t.advance(n+1),e=!0);var[s,r]=dp(t);if(s.length){var o=String.fromCodePoint(...s).toLowerCase();if(tp.get(14).includes(o))return;if(["&","n'","'n'"].includes(o))return}if(e)return t.acceptToken(11)})),Ap=new Lf((function(t){for(;t.next>=0;){if(op.includes(t.peek()))return t.peek()==Kf&&t.advance(),t.acceptToken(12);t.advance()}})),Mp=Sl({ProperVariable:Ql.variableName,CommonVariable:Ql.variableName,SimpleVariable:Ql.variableName,Pronoun:Ql.variableName,Number:Ql.number,PoeticString:Ql.string,PoeticNumber:Ql.number,String:Ql.string,Comment:Ql.comment,LineComment:Ql.lineComment,BlockComment:Ql.blockComment,ArithmeticOperator:Ql.arithmeticOperator,LogicOperator:Ql.logicOperator,CompareOperator:Ql.compareOperator,VLS:Ql.separator,XLS:Ql.separator,ALS:Ql.separator,Comma:Ql.separator,Nacton:Ql.separator,Ampersand:Ql.separator,OxfordComma:Ql.separator,Wildcard:Ql.lineComment,End:Ql.controlKeyword,EOB:Ql.controlKeyword,EOS:Ql.controlKeyword,Above:Ql.compareOperator,And:Ql.logicOperator,Around:Ql.keyword,As:Ql.keyword,AsGreat:Ql.compareOperator,AsSmall:Ql.compareOperator,At:Ql.keyword,Back:Ql.controlKeyword,Be:Ql.keyword,Break:Ql.controlKeyword,Build:Ql.keyword,Call:Ql.keyword,Cast:Ql.keyword,Continue:Ql.controlKeyword,Debug:Ql.keyword,Divided:Ql.arithmeticOperator,Down:Ql.keyword,Else:Ql.controlKeyword,Empty:Ql.literal,End:Ql.keyword,Exactly:Ql.compareOperator,False:Ql.bool,If:Ql.controlKeyword,Into:Ql.keyword,Is:Ql.compareOperator,Isnt:Ql.compareOperator,Join:Ql.keyword,Knock:Ql.keyword,Less:Ql.compareOperator,Let:Ql.keyword,Like:Ql.keyword,Listen:Ql.keyword,Minus:Ql.arithmeticOperator,More:Ql.compareOperator,Mysterious:Ql.null,Non:Ql.logicOperator,Nor:Ql.logicOperator,Not:Ql.logicOperator,Now:Ql.keyword,Null:Ql.null,Or:Ql.logicOperator,Over:Ql.arithmeticOperator,Plus:Ql.arithmeticOperator,Pop:Ql.keyword,Print:Ql.keyword,Push:Ql.keyword,Put:Ql.keyword,Return:Ql.controlKeyword,Says:Ql.keyword,Split:Ql.keyword,Takes:Ql.keyword,Taking:Ql.keyword,Than:Ql.compareOperator,Then:Ql.controlKeyword,Times:Ql.arithmeticOperator,To:Ql.keyword,True:Ql.bool,Turn:Ql.keyword,Under:Ql.keyword,Until:Ql.controlKeyword,Up:Ql.keyword,Using:Ql.keyword,While:Ql.controlKeyword,With:Ql.keyword,Write:Ql.keyword}),Tp=Yf.deserialize({version:14,states:"*hO!TQ)aOOP![O&jOOOOQ$y'#Eq'#EqO!dQ)`O'#EVO!iQ)aO'#EaO#^Q)aO'#EbO#eQ'|O'#EcO#jQ'|O'#EdO!iQ)aO'#EeO!iQ)aO'#EgO#oQ)`O'#EgOOQ$w'#EU'#EUO!iQ)aO'#EUO#wQ*cO'#ETO$UQ&zOOQOQ&jOOPOOO'#EP'#EPPOOO)C@e)C@eO$^Q&kO,5:qO$lQ)bO'#E^OOQQ'#E_'#E_OOQQ'#EZ'#EZO$zQ&lO'#EYOOQ$y'#EX'#EXOOQ$w,5:{,5:{OOQ$w,5:|,5:|O!iQ)aO,5:|OOQ$w,5:},5:}OOQ$w,5;O,5;OO%VQ*RO,5;PO%^Q)`O,5;RO%cQ&rO,5;RO%hQ)fO,5;ROOQ$w,5:p,5:pOOQ$g'#Ej'#EjO%VQ*RO'#EkOOQ$w'#Ek'#EkO%yQ*cO,5:oOOQ$w,5:o,5:oOOQ$V'#Em'#EmO&TQ)qO'#ElO$UQ&zOOO&[Q*cO'#EpOOQ$w1G0]1G0]O'uQ)bO,5:xO!iQ)aO'#EWOOQ$y'#Ei'#EiOOQ#u'#E`'#E`O!iQ)aO,5:tOOQ$w1G0h1G0hO%VQ*RO'#EfOOQ$w'#Ef'#EfOOQ$w1G0k1G0kO$^Q&kO1G0mOOQ#u1G0m1G0mO!iQ)aO1G0mO$^Q&kO1G0mOOQ$g-E8h-E8hOOQ$w,5;V,5;VOOQ$w-E8i-E8iOOQ$w1G0Z1G0ZOOQ$V-E8k-E8kOOQ`,5;W,5;WOOQ`-E8j-E8jO(TQ*cO,5;[OOQ$y-E8g-E8gOOQ$y,5:r,5:rOOQ$y1G0`1G0`OOQ$w,5;Q,5;QOOQ#u7+&X7+&XO)nQ)`O7+&XO!iQ)aO<_!w!x!A[!x!y!Cu~!rS!{~XY!mYZ!m]^!mpq!m~#RR#b#c#[#f#g%s#h#i'|~#_Q#Z#[#e#b#c$r~#hP#`#a#k~#nP#X#Y#q~#tP!d!e#w~#zP#f#g#}~$QP#T#U$T~$WP#V#W$Z~$^P#_#`$a~$dP#X#Y$g~$jP#h#i$m~$rO!U~~$uP#c#d$x~${P#h#i%O~%RP#T#U%U~%XP#h#i%[~%_P#]#^%b~%eP#c#d%h~%kP#b#c%n~%sO!p~~%vP#]#^%y~%|P#h#i&P~&SP#[#]&V~&YP#a#b&]~&`P#X#Y&c~&fP#h#i&i~&lP#]#^&o~&rP#V#W&u~&xP!q!r&{~'OP#d#e'R~'UP#X#Y'X~'[P#f#g'_~'bP#T#U'e~'hP#h#i'k~'nP#c#d'q~'tP#f#g'w~'|Oy~~(PQ#c#d(V#h#i(b~(YP#a#b(]~(bOp~~(eP#f#g(h~(kP#]#^(n~(qP#U#V(t~(wP#i#j(z~(}P#h#i)Q~)TP#X#Y)W~)ZQ!p!q)a!x!y)x~)dP#T#U)g~)jP#a#b)m~)pP#X#Y)s~)xOZ~~){P#T#U*O~*RP#`#a*U~*XP#i#j*[~*_P#X#Y*b~*gOd~~*jS#]#^*v#`#a,m#c#d.Q#f#g.c~*yP#h#i*|~+PP#k#l+S~+VP#]#^+Y~+]P#g#h+`~+cP#X#Y+f~+iP!q!r+l~+oP#d#e+r~+uP#X#Y+x~+{P#f#g,O~,RP#T#U,U~,XP#h#i,[~,_P#c#d,b~,eP#f#g,h~,mO{~~,pP#c#d,s~,vP#V#W,y~,|P#_#`-P~-SP!e!f-V~-YP#c#d-]~-`P#a#b-c~-fP#a#b-i~-lP#X#Y-o~-rP#b#c-u~-xP#h#i-{~.QOS~~.TP#c#d.W~.ZP#`#a.^~.cOh~~.fP#T#U.i~.lP#V#W.o~.rQ#X#Y.x#_#`.}~.}O!X~~/QP#X#Y/T~/WP#h#i/Z~/`O!T~~/cR#[#]/l#`#a1X#c#d2Y~/oP#T#U/r~/uQ#b#c/{#f#g0d~0OP#Z#[0R~0UP#X#Y0X~0[P#W#X0_~0dO!l~~0gP#T#U0j~0mP#V#W0p~0sP#h#i0v~0yP#X#Y0|~1PP#f#g1S~1XOc~~1[P#T#U1_~1bP#g#h1e~1hP#g#h1k~1nP!p!q1q~1tP#T#U1w~1zP#a#b1}~2QP#X#Y2T~2YO[~~2]R#`#a2f#a#b2w#b#c5S~2iP#c#d2l~2oP#f#g2r~2wOk~~2zQ#a#b3Q#d#e3i~3TP#X#Y3W~3ZP#b#c3^~3aP#h#i3d~3iOQ~~3lP#T#U3o~3rP#f#g3u~3xP#X#Y3{~4OP!q!r4R~4UP#d#e4X~4[P#X#Y4_~4bP#f#g4e~4hP#T#U4k~4nP#h#i4q~4tP#c#d4w~4zP#f#g4}~5SO|~~5VQ#g#h5]#h#i6j~5`P#h#i5c~5fP#T#U5i~5lP#b#c5o~5rP#h#i5u~5xPxy5{~6OP#h#i6R~6UP#T#U6X~6[P#Z#[6_~6bPyz6e~6jO!s~~6mQ#X#Y6s#f#g8`~6vP#b#c6y~6|P#h#i7P~7UP!Y~!u!v7X~7[P#X#Y7_~7bP#d#e7e~7hP#T#U7k~7nP#f#g7q~7tP#T#U7w~7zP#h#i7}~8QP#c#d8T~8WP#f#g8Z~8`O!b~~8cP#c#d8f~8iP#`#a8l~8oQ!m!n8u!q!r9p~8xP#X#Y8{~9OP#m#n9R~9UP#k#l9X~9[P#c#d9_~9bP#f#g9e~9hP#W#X9k~9pOt~~9sP#d#e9v~9yP#X#Y9|~:PP#f#g:S~:VP#T#U:Y~:]P#h#i:`~:cP#c#d:f~:iP#f#g:l~:qO!Q~~:tQ#X#Y:z#c#d@{~:}R#Y#Z;W#`#a>y#f#g?h~;ZP#]#^;^~;aP#b#c;d~;gP#]#^;j~;mP#h#i;p~;sP#]#^;v~;yP#c#d;|~O~>RP#X#Y>U~>XP#f#g>[~>_P#T#U>b~>eP#h#i>h~>kP#c#d>n~>qP#f#g>t~>yO!O~~>|P#X#Y?P~?SP#h#i?V~?YP#X#Y?]~?`P#W#X?c~?hO!k~~?kP#X#Y?n~?qP#Y#Z?t~?wP!q!r?z~?}P#d#e@Q~@TP#X#Y@W~@ZP#f#g@^~@aP#T#U@d~@gP#h#i@j~@mP#c#d@p~@sP#f#g@v~@{Ox~~AOP#V#WAR~AUR!e!fA_!u!vBY#i#jB}~AbP#c#dAe~AhP#a#bAk~AnP#a#bAq~AtP#X#YAw~AzP#b#cA}~BQP#h#iBT~BYOT~~B]P#h#iB`~BcP#f#gBf~BiP#]#^Bl~BoP#b#cBr~BuP#Z#[Bx~B}Ob~~CQP#a#bCT~CWP#X#YCZ~C^P#b#cCa~CdP#h#iCg~CjP!o!pCm~CpP#X#YCs~CvP#h#iCy~C|P#T#UDP~DUO!o~~DXQ#a#bD_#g#hEY~DbP#d#eDe~DhP#[#]Dk~DnP#T#UDq~DtP#g#hDw~DzP#]#^D}~EQP#g#hET~EYO!e~~E]P#V#WE`~EcP#T#UEf~EiP#d#eEl~EoP#X#YEr~EwOj~~EzQ#`#aFQ#i#jFi~FTP#c#dFW~FZP#T#UF^~FaP#h#iFd~FiOg~~FlP#b#cFo~FrP#V#WFu~FxP#h#iF{~GOP#]#^GR~GUP#c#dGX~G[P#b#cG_~GbPxyGe~GhP#h#iGk~GnP#T#UGq~GtP#Z#[Gw~GzPyzG}~HSO!t~~HVP#X#YHY~H]P#T#UH`~HcP#W#XHf~HiP#]#^Hl~HoP#b#cHr~HuP#Z#[Hx~H}U!Z~!R!SIa!S!TIf!T!UIk!U!VIp!V!WIu!W!XIz~IfO![~~IkO!]~~IpO!^~~IuO!_~~IzO!`~~JPO!a~~JSP#b#cJV~JYR#g#hJc#h#iKW#j#kKu~JfP#X#YJi~JlP#f#gJo~JrP#h#iJu~JxP#X#YJ{~KOP#W#XKR~KWO!j~~KZP#X#YK^~KaP#Z#[Kd~KgP#X#YKj~KmP#f#gKp~KuOf~~KxP#T#UK{~LOP#`#aLR~LUP#]#^LX~L[P#W#XL_~LdO!m~~LgP#X#YLj~LmP#m#nLp~LsP#k#lLv~LyP#c#dL|~MPP#f#gMS~MVP#W#XMY~M_Om~~MbR#T#UMk#]#^Nl#c#d!#R~MnP#U#VMq~MtP#X#YMw~MzP#`#aM}~NQP!p!qNT~NWP#T#UNZ~N^P#a#bNa~NdP#X#YNg~NlO]~~NoR#b#cNx#g#h!!X#h#i!!d~N{Q#X#Y! R#_#`!!S~! UP!e!f! X~! [P#c#d! _~! bP#a#b! e~! hP#a#b! k~! nP#X#Y! q~! tP#b#c! w~! zP#h#i! }~!!SOR~~!!XO!g~~!![P#h#i!!_~!!dO!c~~!!gP#X#Y!!j~!!mP#f#g!!p~!!sP#T#U!!v~!!yP#`#a!!|~!#RO`~~!#UQ#V#W!#[#Z#[!$]~!#_P#T#U!#b~!#eP#`#a!#h~!#kPxy!#n~!#qP#h#i!#t~!#wP#T#U!#z~!#}P#Z#[!$Q~!$TPyz!$W~!$]O!v~~!$`P#]#^!$c~!$fP#V#W!$i~!$lP!q!r!$o~!$rP#d#e!$u~!$xP#X#Y!${~!%OP#f#g!%R~!%UP#T#U!%X~!%[P#h#i!%_~!%bP#c#d!%e~!%hP#f#g!%k~!%pOz~~!%sR#T#U!%|#X#Y!&}#c#d!'`~!&PP#V#W!&S~!&VP#f#g!&Y~!&]P#c#d!&`~!&cP!p!q!&f~!&iP#T#U!&l~!&oP#a#b!&r~!&uP#X#Y!&x~!&}O_~~!'QP#h#i!'T~!'WP#T#U!'Z~!'`O!n~~!'cQ#W#X!'i#b#c!)n~!'lQ#]#^!'r#i#j!(a~!'uP#Y#Z!'x~!'{P#]#^!(O~!(RP#X#Y!(U~!(XP#f#g!([~!(aOr~~!(dP#`#a!(g~!(jP#X#Y!(m~!(pP!m!n!(s~!(vP#X#Y!(y~!(|P#m#n!)P~!)SP#k#l!)V~!)YP#c#d!)]~!)`P#f#g!)c~!)fP#W#X!)i~!)nOv~~!)qP#c#d!)t~!)wP#g#h!)z~!)}P#d#e!*Q~!*TP#T#U!*W~!*ZP#V#W!*^~!*aP#X#Y!*d~!*iO!h~~!*lQ#T#U!*r#i#j!+u~!*uP#a#b!*x~!*{P#X#Y!+O~!+TPU~#g#h!+W~!+ZP#d#e!+^~!+aP#T#U!+d~!+gP#V#W!+j~!+mP#X#Y!+p~!+uO^~~!+xQ#`#a!,O#a#b!,Z~!,RP#`#a!,U~!,ZOo~~!,^P#U#V!,a~!,dP#X#Y!,g~!,jP#f#g!,m~!,rOe~~!,uP#d#e!,x~!,{P#X#Y!-O~!-RP#f#g!-U~!-XP#T#U!-[~!-_P#h#i!-b~!-eP#c#d!-h~!-kP#f#g!-n~!-sPw~!m!n!-v~!-yP#X#Y!-|~!.PP#m#n!.S~!.VP#k#l!.Y~!.]P#c#d!.`~!.cP#f#g!.f~!.iP#W#X!.l~!.qOs~~!.tR#T#U!.}#f#g!/f#i#j!3]~!/QP#f#g!/T~!/WP#X#Y!/Z~!/^P#b#c!/a~!/fO!W~~!/iP#c#d!/l~!/oQ#V#W!/u#d#e!2U~!/xP#X#Y!/{~!0OP#g#h!0R~!0UP#g#h!0X~!0[P#]#^!0_~!0bP#b#c!0e~!0hP#Z#[!0k~!0nP!k!l!0q~!0tP#b#c!0w~!0zP#g#h!0}~!1QP#h#i!1T~!1WP#f#g!1Z~!1^P#i#j!1a~!1dP#V#W!1g~!1jP#h#i!1m~!1pP#]#^!1s~!1vP#c#d!1y~!1|P#b#c!2P~!2UO!q~~!2XP#X#Y!2[~!2_P#f#g!2b~!2eP#h#i!2h~!2kP#m#n!2n~!2qP!p!q!2t~!2wP#T#U!2z~!2}P#a#b!3Q~!3TP#X#Y!3W~!3]OY~~!3`P#b#c!3c~!3fP#V#W!3i~!3lP#h#i!3o~!3rP#i#j!3u~!3xP#T#U!3{~!4OP#h#i!4R~!4UP#]#^!4X~!4[P#c#d!4_~!4bP#b#c!4e~!4jO!R~~!4mP#i#j!4p~!4sP#c#d!4v~!4yP#h#i!4|~!5PP#X#Y!5S~!5XO!d~~!5[P#X#Y!5_~!5bP#Z#[!5e~!5hP#X#Y!5k~!5nP#l#m!5q~!5tP#d#e!5w~!5|Oi~~!6PS#X#Y!6]#d#e!7l#e#f!9P#h#i!:j~!6`Q#`#a!6f#d#e!6q~!6iP#Y#Z!6l~!6qOn~~!6tP#T#U!6w~!6zP#f#g!6}~!7QP#T#U!7T~!7WP#h#i!7Z~!7^P#c#d!7a~!7dP#f#g!7g~!7lO!S~~!7oP#X#Y!7r~!7uP#V#W!7x~!7{P#]#^!8O~!8RP#T#U!8U~!8XP#`#a!8[~!8_Pxy!8b~!8eP#h#i!8h~!8kP#T#U!8n~!8qP#Z#[!8t~!8wPyz!8z~!9PO!w~~!9SP#i#j!9V~!9YP#T#U!9]~!9`P#f#g!9c~!9fP#X#Y!9i~!9lP!d!e!9o~!9rP#f#g!9u~!9xP#T#U!9{~!:OP#V#W!:R~!:UP#_#`!:X~!:[P#X#Y!:_~!:bP#h#i!:e~!:jO!V~~!:mQ#T#U!:s#f#g!PP#b#c!>S~!>VP#Z#[!>Y~!>_O!f~~!>bQ#T#U!>h#m#n!?]~!>kP#Z#[!>n~!>qP!p!q!>t~!>wP#T#U!>z~!>}P#a#b!?Q~!?TP#X#Y!?W~!?]OX~~!?`P#d#e!?c~!?fP#X#Y!?i~!?lQ!p!q!?r!q!r!@Z~!?uP#T#U!?x~!?{P#a#b!@O~!@RP#X#Y!@U~!@ZOW~~!@^P#d#e!@a~!@dP#X#Y!@g~!@jP#f#g!@m~!@pP#T#U!@s~!@vP#h#i!@y~!@|P#c#d!AP~!ASP#f#g!AV~!A[O!P~~!A_R#b#c!Ah#d#e!Ay#f#g!Cj~!AkP#]#^!An~!AqP#h#i!At~!AyOq~~!A|P#W#X!BP~!BSP#T#U!BV~!BYP#h#i!B]~!B`P#X#Y!Bc~!BfP!q!r!Bi~!BlP#d#e!Bo~!BrP#X#Y!Bu~!BxP#f#g!B{~!COP#T#U!CR~!CUP#h#i!CX~!C[P#c#d!C_~!CbP#f#g!Ce~!CjO}~~!CmP#`#a!Cp~!CuOl~~!CxP#T#U!C{~!DOP#f#g!DR~!DUP#]#^!DX~!D[P#T#U!D_~!DbP#U#V!De~!DhP#`#a!Dk~!DnP#X#Y!Dq~!DtP!p!q!Dw~!DzP#T#U!D}~!EQP#a#b!ET~!EWP#X#Y!EZ~!E`OV~",tokenizers:[0],topRules:{Program:[0,1]},tokenPrec:0}),Np=Gl.define({parser:Bp.configure({props:[ga.add({Application:function({closing:t,align:e=!0,units:i=1}){return n=>xa(n,e,i,t)}({closing:")",align:!1})}),Pa.add({Application:function(t){let e=t.firstChild,i=t.lastChild;return e&&e.to[Ks.theme({"&":{backgroundColor:e.background,color:e.foreground},".cm-content":{caretColor:e.caret},".cm-cursor, .cm-dropCursor":{borderLeftColor:e.caret},"&.cm-focused .cm-selectionBackgroundm .cm-selectionBackground, .cm-content ::selection":{backgroundColor:e.selection},".cm-activeLine":{backgroundColor:e.lineHighlight},".cm-gutters":{backgroundColor:e.gutterBackground,color:e.gutterForeground},".cm-activeLineGutter":{backgroundColor:e.lineHighlight}},{dark:"dark"===t}),Ka(Ya.define(i))],Fp=Ip({variant:"dark",settings:{background:"#000000",foreground:"#ffffff",caret:"#ff00ff",selection:"#0000ff",gutterBackground:"#006666",gutterForeground:"rgb(50, 90, 150)",lineHighlight:"#ffff00"},styles:function(){var t=[Ql.comment,Ql.lineComment,Ql.blockComment,Ql.docComment,Ql.name,Ql.variableName,Ql.typeName,Ql.tagName,Ql.propertyName,Ql.attributeName,Ql.className,Ql.labelName,Ql.namespace,Ql.macroName,Ql.literal,Ql.string,Ql.docString,Ql.character,Ql.attributeValue,Ql.number,Ql.integer,Ql.float,Ql.bool,Ql.regexp,Ql.escape,Ql.color,Ql.url,Ql.keyword,Ql.self,Ql.null,Ql.atom,Ql.unit,Ql.modifier,Ql.operatorKeyword,Ql.controlKeyword,Ql.definitionKeyword,Ql.moduleKeyword,Ql.operator,Ql.derefOperator,Ql.arithmeticOperator,Ql.logicOperator,Ql.bitwiseOperator,Ql.compareOperator,Ql.updateOperator,Ql.definitionOperator,Ql.typeOperator,Ql.controlOperator,Ql.punctuation,Ql.separator,Ql.bracket,Ql.angleBracket,Ql.squareBracket,Ql.paren,Ql.brace,Ql.content,Ql.heading,Ql.heading1,Ql.heading2,Ql.heading3,Ql.heading4,Ql.heading5,Ql.heading6,Ql.contentSeparator,Ql.list,Ql.quote,Ql.emphasis,Ql.strong,Ql.link,Ql.monospace,Ql.strikethrough,Ql.inserted,Ql.deleted,Ql.changed,Ql.invalid,Ql.meta,Ql.documentMeta,Ql.annotation,Ql.processingInstruction];const e=121;for(var i=e,n=e,s=e,r=[],o=0;o255&&(i=e,(n+=17)>255&&(n=e,(s+=17)>255&&(s=e)))}return r}()});const Vp=Ip({variant:"dark",settings:{background:"#00254b",foreground:"#FFFFFF",caret:"#FFFFFF",selection:"#B36539BF",gutterBackground:"#00254b",gutterForeground:"#FFFFFF70",lineHighlight:"#00000059"},styles:[{tag:Ql.comment,color:"#0088FF"},{tag:Ql.string,color:"#3AD900"},{tag:Ql.regexp,color:"#80FFC2"},{tag:[Ql.number,Ql.bool,Ql.null],color:"#FF628C"},{tag:[Ql.definitionKeyword,Ql.modifier],color:"#FFEE80"},{tag:Ql.variableName,color:"#CCCCCC"},{tag:Ql.self,color:"#FF80E1"},{tag:[Ql.className,Ql.definition(Ql.propertyName),Ql.function(Ql.variableName),Ql.definition(Ql.typeName),Ql.labelName],color:"#FFDD00"},{tag:[Ql.keyword,Ql.operator],color:"#FF9D00"},{tag:[Ql.propertyName,Ql.typeName],color:"#80FFBB"},{tag:Ql.special(Ql.brace),color:"#EDEF7D"},{tag:Ql.attributeName,color:"#9EFFFF"},{tag:Ql.derefOperator,color:"#fff"}]}),Wp=Ip({variant:"dark",settings:{background:"#2d2f3f",foreground:"#f8f8f2",caret:"#f8f8f0",selection:"#44475a",gutterBackground:"#282a36",gutterForeground:"rgb(144, 145, 148)",lineHighlight:"#44475a"},styles:[{tag:Ql.comment,color:"#6272a4"},{tag:[Ql.string,Ql.special(Ql.brace)],color:"#f1fa8c"},{tag:[Ql.number,Ql.self,Ql.bool,Ql.null],color:"#bd93f9"},{tag:[Ql.keyword,Ql.operator],color:"#ff79c6"},{tag:[Ql.definitionKeyword,Ql.typeName],color:"#8be9fd"},{tag:Ql.definition(Ql.typeName),color:"#f8f8f2"},{tag:[Ql.className,Ql.definition(Ql.propertyName),Ql.function(Ql.variableName),Ql.attributeName],color:"#50fa7b"}]}),Hp=Ip({variant:"light",settings:{background:"#FFFFFF",foreground:"#000000",caret:"#000000",selection:"#80C7FF",gutterBackground:"#FFFFFF",gutterForeground:"#00000070",lineHighlight:"#C1E2F8"},styles:[{tag:Ql.comment,color:"#AAAAAA"},{tag:[Ql.keyword,Ql.operator,Ql.typeName,Ql.tagName,Ql.propertyName],color:"#2F6F9F",fontWeight:"bold"},{tag:[Ql.attributeName,Ql.definition(Ql.propertyName)],color:"#4F9FD0"},{tag:[Ql.className,Ql.string,Ql.special(Ql.brace)],color:"#CF4F5F"},{tag:Ql.number,color:"#CF4F5F",fontWeight:"bold"},{tag:Ql.variableName,fontWeight:"bold"}]}),zp=Ip({variant:"dark",settings:{background:"#000000",foreground:"#ffffff",caret:"#ff00ff",selection:"#0000ff",gutterBackground:"#006666",gutterForeground:"rgb(50, 90, 150)",lineHighlight:"#111111"},styles:function(){for(var t=[Ql.comment,Ql.lineComment,Ql.blockComment,Ql.docComment,Ql.name,Ql.variableName,Ql.typeName,Ql.tagName,Ql.propertyName,Ql.attributeName,Ql.className,Ql.labelName,Ql.namespace,Ql.macroName,Ql.literal,Ql.string,Ql.docString,Ql.character,Ql.attributeValue,Ql.number,Ql.integer,Ql.float,Ql.bool,Ql.regexp,Ql.escape,Ql.color,Ql.url,Ql.keyword,Ql.self,Ql.null,Ql.atom,Ql.unit,Ql.modifier,Ql.operatorKeyword,Ql.controlKeyword,Ql.definitionKeyword,Ql.moduleKeyword,Ql.operator,Ql.derefOperator,Ql.arithmeticOperator,Ql.logicOperator,Ql.bitwiseOperator,Ql.compareOperator,Ql.updateOperator,Ql.definitionOperator,Ql.typeOperator,Ql.controlOperator,Ql.punctuation,Ql.separator,Ql.bracket,Ql.angleBracket,Ql.squareBracket,Ql.paren,Ql.brace,Ql.content,Ql.heading,Ql.heading1,Ql.heading2,Ql.heading3,Ql.heading4,Ql.heading5,Ql.heading6,Ql.contentSeparator,Ql.list,Ql.quote,Ql.emphasis,Ql.strong,Ql.link,Ql.monospace,Ql.strikethrough,Ql.inserted,Ql.deleted,Ql.changed,Ql.invalid,Ql.meta,Ql.documentMeta,Ql.annotation,Ql.processingInstruction,Ql.definition(Ql.name),Ql.constant(Ql.name),Ql.function(Ql.name),Ql.standard(Ql.name),Ql.local(Ql.name),Ql.special(Ql.name)],e=[],i=0;i {
+	var input = new parserInput(source);
+	rockstar.tokenizeEOB(input);
+	expect(input.token).toBe(tokens.EOB);
+	expect(input.pos).toBe(1);
+});
+
+
+const notEndOfStatement = [
+	" & ",
+	" 'n' ",
+	" n' ",
+//	", ",
+	", &",
+	", 'n'",
+	", n' ",
+	", and" ]
+test.each(notEndOfStatement)("%s does NOT end a statement", (source) => {
+	source = source.replace(/\\r/g, "\r").replace(/\\n/g, "\n");
+	var input = new parserInput(source);
+	rockstar.tokenizeEOS(input);
+	console.log(input.token);
+	expect(input.token).not.toBe(tokens.EOS);
+});
+
+const endOfStatementsWithSubsequentKeyword = [
+	[ ". Say it. ", 2 ],
+	[ "... print X", 4 ],
+	[ "??? Let X be 5", 4 ],
+	[ "!?;!...?     Say X", 13 ]
+];
+test.each(endOfStatementsWithSubsequentKeyword)("%s ends a statement at position %[", (source, tokenTo) => {
+	source = source.replace(/\\r/g, "\r").replace(/\\n/g, "\n");
+	var input = new parserInput(source);
+	rockstar.tokenizeEOS(input);
+	expect(input.token).toBe(tokens.EOS);
+	expect(input.pos).toBe(tokenTo);
+	//expect(input.tokenTo).toBe(tokenTo);
+});
+
+
+const endOfStatements = [ "\\n", "\\r\\n", "!", ";", "?", "...\\n", "...\\r\\n", "!\r\n", "?!?\\r\\n" ];
+test.each(endOfStatements)("%s ends a statement", (source) => {
+	source = source.replace(/\\r/g, "\r").replace(/\\n/g, "\n");
+	var input = new parserInput(source);
+	rockstar.tokenizeEOS(input);
+	expect(input.token).toBe(tokens.EOS);
+});
+
+const endOfBlocks = ["\\nyeah", "\\nEnd", "end", "yeah", "baby", "oh", ", end", ", yeah!", ".... yeah!", "\\r\\nelse", "\\r\\n\\r\\n", "\\n\\n", "\\n\\r\\n", "\\r\\nEnd", "\\r\\nBaby", "\\r\\nOh yeah baby"]
+test.each(endOfBlocks)("%s ends a block", (source) => {
+	source = source.replace(/\\r/g, "\r").replace(/\\n/g, "\n");
+	var input = new parserInput(source);
+	rockstar.tokenizeEOB(input);
+	expect(input.token).toBe(tokens.EOB);
+});
+
+const validPoeticNumbers = [ "'rock'", "a lovestruck ladykiller", "the sands of time", "ice. A life unfilled"];
+test.each(validPoeticNumbers)("%p is a poetic number", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizePoeticNumber(input);
+	expect(input.token).toBe(tokens.PoeticNumber);
+});
+
+const invalidPoeticNumbers = ["with a dream", "without fear", "times of no trust", "5"]
+
+test.each(invalidPoeticNumbers)("%p is not a poetic number", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizePoeticNumber(input);
+	expect(input.token).not.toBe(tokens.PoeticNumber);
+});
+
+
+const cases = [
+	[["shout", "Print", "ScreAM"], tokens.Print]
+];
+
+describe("tokenizer", () => {
+	describe.each(cases)("%p all match", (lexemes, token) => {
+		test.each(lexemes)("%p", (lexeme) => {
+			var input = new parserInput(lexeme);
+			rockstar.tokenizeKeyword(input);
+			expect(input.token).toBe(token);
+		});
+	});
+});
+
+const operators = [
+	[tokens.ArithmeticOperator, [
+		"+", "plus", "with", "WITH", "plUs",
+		"-", "minus", "without", "MInus",
+		"*", "times", "of", "tiMES",
+		"/", "divided by", "divided    by", "DIVIDED BY"
+	]],
+	[tokens.CompareOperator, [
+		">=", "is as great as", "IS AS HIGH AS", "is       as BIG as", "IS as strOnG as",
+		"<=", "is as low as", "is as SMALL as", "Is As Weak As",
+		">", "is stronger than", "is MOre Than", "is GREATER THAN", "IS bigger ThAN", "IS highEr ThAn", "is above",
+		"<", "IS WEAKER THAN", "is lower than", "is below", "is under", "is LESS than"
+	]],
+	[tokens.LogicOperator, [
+		"and", "or", "nor"
+	]]
+];
+
+describe.each(operators)("%p is operator ", (token, lexemes) => {
+	test.each(lexemes)("%p", (lexeme) => {
+		var input = new parserInput(lexeme);
+		rockstar.tokenizeOperator(input);
+		expect(input.token).toBe(token);
+	});
+});
+
+const notOperators = [ "1 say 2", "e" ];
+test.each(notOperators)("%p is not an operator ", (source) => {
+	var input = new parserInput(source);
+	rockstar.tokenizeOperator(input);
+	expect(input.token).toBe(undefined);
+});
+
+const notAnyKindOfVariables = ["true", "false", "1", "+2", "-5", "\n", " ", "\t", "12345", "!"]
+test.each(notAnyKindOfVariables)("%p is NOT any kind of variable", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizeVariable(input);
+	expect(input.token).toBe(undefined);
+});
+
+const notCommonVariables = ["his right", "her times"];
+test.each(notCommonVariables)("%p is NOT a common variable", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizeVariable(input);
+	expect(input.token).not.toBe(tokens.CommonVariable);
+});
+
+const commonVariables = ["the night", "a girl", "A BOY", "My Lies", "your love", "his word", "her hair", "an orange", "AN HONOUR",
+	"Their guitars", "OUR FLAG" ];
+test.each(commonVariables)("%p is a proper variable", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizeVariable(input);
+	expect(input.token).toBe(tokens.CommonVariable);
+});
+
+const simpleVariables = ["x", "y", "foo", "bar", "myVariable", "Midnight", "MyVariable" ];
+test.each(simpleVariables)("%p is a simple variable", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizeVariable(input);
+	expect(input.token).toBe(tokens.SimpleVariable);
+});
+
+const notSimpleVariables = ["say", "times", "Big Daddy", "my leg" ];
+test.each(notSimpleVariables)("%p is NOT a simple variable", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizeVariable(input);
+	expect(input.token).not.toBe(tokens.SimpleVariable);
+});
+
+const notProperVariables = ["My Dad", "Your Lies", "Scream II" ];
+test.each(notProperVariables)("%p is NOT a proper variable", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizeVariable(input);
+	expect(input.token).not.toBe(tokens.ProperVariable);
+});
+
+const properVariables = ["Johnny B. Goode", "Dr. Feelgood", "Black Betty", "Billie Jean", "JRR Tolkien" ];
+test.each(properVariables)("%p is a proper variable", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizeVariable(input);
+	expect(input.token).toBe(tokens.ProperVariable);
+});
+
+const pronouns = ['they', 'them', 'she', 'him', 'her', 'hir', 'zie', 'zir', 'xem', 'ver', 'ze', 've', 'xe', 'it', 'he', 'you', 'me', 'i'];
+test.each(pronouns)("%p is a pronoun", (lexeme) => {
+	var input = new parserInput(lexeme);
+	rockstar.tokenizeVariable(input);
+	expect(input.token).toBe(tokens.Pronoun);
+});
+
+class parserInput {
+	#token;
+	#s;
+	#i = 0;
+	#tokenTo = 0;
+	constructor(s) { this.#s = s; }
+	get token() { return this.#token; }
+	get tokenTo() { return this.#tokenTo; }
+	get next() { return this.#i >= this.#s.length ? -1 : this.#s.charCodeAt(this.#i); }
+	get pos() { return this.#i; }
+	peek = (offset = 0) => (this.#i + offset < this.#s.length ? this.#s.charCodeAt(this.#i + offset) : -1);
+	advance = (offset = 1) => {
+		this.#i += offset;
+		return this.next;
+	}
+	acceptToken = (token) => this.#token = token;
+	acceptTokenTo = (token, tokenTo) => {
+		this.#token = token;
+		this.#tokenTo = tokenTo;
+	}
+}
diff --git a/cm-lang-rockstar/tsconfig.json b/cm-lang-rockstar/tsconfig.json
new file mode 100644
index 00000000..f6a183cf
--- /dev/null
+++ b/cm-lang-rockstar/tsconfig.json
@@ -0,0 +1,11 @@
+{
+  "compilerOptions": {
+    "strict": true,
+    "target": "es6",
+    "module": "es2020",
+    "newLine": "lf",
+    "declaration": true,
+    "moduleResolution": "node"
+  },
+  "include": ["src/*.ts", "src/grammars/rockstar.grammar.d.ts"]
+}
diff --git a/codewithrockstar.com/.gitignore b/codewithrockstar.com/.gitignore
new file mode 100644
index 00000000..4d8767f4
--- /dev/null
+++ b/codewithrockstar.com/.gitignore
@@ -0,0 +1,16 @@
+# Not sure what a .gitignore is?
+# See: https://git-scm.com/docs/gitignore
+
+# These are directly copied from Jekyll's first-party docs on `.gitignore` files:
+# https://jekyllrb.com/tutorials/using-jekyll-with-bundler/#commit-to-source-control
+
+# Ignore the default location of the built site, and caches and metadata generated by Jekyll
+_site/
+.sass-cache/
+.jekyll-cache/
+.jekyll-metadata
+
+# Ignore folders generated by Bundler
+.bundle/
+vendor/
+codewithrockstar.com/wasm/**
\ No newline at end of file
diff --git a/codewithrockstar.com/Gemfile b/codewithrockstar.com/Gemfile
new file mode 100644
index 00000000..47e5fc31
--- /dev/null
+++ b/codewithrockstar.com/Gemfile
@@ -0,0 +1,7 @@
+source 'https://rubygems.org'
+
+gem "jekyll", "~> 4.3.3" # installed by `gem jekyll`
+
+gem "just-the-docs", "0.8.2" # pinned to the current release
+
+gem 'wdm', '>= 0.1.0', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
\ No newline at end of file
diff --git a/codewithrockstar.com/Gemfile.lock b/codewithrockstar.com/Gemfile.lock
new file mode 100644
index 00000000..9359d570
--- /dev/null
+++ b/codewithrockstar.com/Gemfile.lock
@@ -0,0 +1,101 @@
+GEM
+  remote: https://rubygems.org/
+  specs:
+    addressable (2.8.7)
+      public_suffix (>= 2.0.2, < 7.0)
+    bigdecimal (3.1.8)
+    colorator (1.1.0)
+    concurrent-ruby (1.3.4)
+    em-websocket (0.5.3)
+      eventmachine (>= 0.12.9)
+      http_parser.rb (~> 0)
+    eventmachine (1.2.7)
+    ffi (1.17.0-arm64-darwin)
+    ffi (1.17.0-x64-mingw-ucrt)
+    ffi (1.17.0-x86_64-linux-gnu)
+    forwardable-extended (2.6.0)
+    google-protobuf (4.28.2-arm64-darwin)
+      bigdecimal
+      rake (>= 13)
+    google-protobuf (4.28.2-x64-mingw-ucrt)
+      bigdecimal
+      rake (>= 13)
+    google-protobuf (4.28.2-x86_64-linux)
+      bigdecimal
+      rake (>= 13)
+    http_parser.rb (0.8.0)
+    i18n (1.14.6)
+      concurrent-ruby (~> 1.0)
+    jekyll (4.3.4)
+      addressable (~> 2.4)
+      colorator (~> 1.0)
+      em-websocket (~> 0.5)
+      i18n (~> 1.0)
+      jekyll-sass-converter (>= 2.0, < 4.0)
+      jekyll-watch (~> 2.0)
+      kramdown (~> 2.3, >= 2.3.1)
+      kramdown-parser-gfm (~> 1.0)
+      liquid (~> 4.0)
+      mercenary (>= 0.3.6, < 0.5)
+      pathutil (~> 0.9)
+      rouge (>= 3.0, < 5.0)
+      safe_yaml (~> 1.0)
+      terminal-table (>= 1.8, < 4.0)
+      webrick (~> 1.7)
+    jekyll-include-cache (0.2.1)
+      jekyll (>= 3.7, < 5.0)
+    jekyll-sass-converter (3.0.0)
+      sass-embedded (~> 1.54)
+    jekyll-seo-tag (2.8.0)
+      jekyll (>= 3.8, < 5.0)
+    jekyll-watch (2.2.1)
+      listen (~> 3.0)
+    just-the-docs (0.8.2)
+      jekyll (>= 3.8.5)
+      jekyll-include-cache
+      jekyll-seo-tag (>= 2.0)
+      rake (>= 12.3.1)
+    kramdown (2.4.0)
+      rexml
+    kramdown-parser-gfm (1.1.0)
+      kramdown (~> 2.0)
+    liquid (4.0.4)
+    listen (3.9.0)
+      rb-fsevent (~> 0.10, >= 0.10.3)
+      rb-inotify (~> 0.9, >= 0.9.10)
+    mercenary (0.4.0)
+    pathutil (0.16.2)
+      forwardable-extended (~> 2.6)
+    public_suffix (6.0.1)
+    rake (13.2.1)
+    rb-fsevent (0.11.2)
+    rb-inotify (0.11.1)
+      ffi (~> 1.0)
+    rexml (3.3.8)
+    rouge (4.4.0)
+    safe_yaml (1.0.5)
+    sass-embedded (1.79.4-arm64-darwin)
+      google-protobuf (~> 4.27)
+    sass-embedded (1.79.4-x64-mingw-ucrt)
+      google-protobuf (~> 4.27)
+    sass-embedded (1.79.4-x86_64-linux-gnu)
+      google-protobuf (~> 4.27)
+    terminal-table (3.0.2)
+      unicode-display_width (>= 1.1.1, < 3)
+    unicode-display_width (2.6.0)
+    wdm (0.2.0)
+    webrick (1.8.2)
+
+PLATFORMS
+  arm64-darwin
+  x64-mingw-ucrt
+  x86_64-linux
+  x86_64-linux-gnu
+
+DEPENDENCIES
+  jekyll (~> 4.3.3)
+  just-the-docs (= 0.8.2)
+  wdm (>= 0.1.0)
+
+BUNDLED WITH
+   2.5.9
diff --git a/satriani/LICENSE b/codewithrockstar.com/LICENSE
similarity index 96%
rename from satriani/LICENSE
rename to codewithrockstar.com/LICENSE
index 7fcdcda7..7d510d02 100644
--- a/satriani/LICENSE
+++ b/codewithrockstar.com/LICENSE
@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) 2019 Dylan Beattie
+Copyright (c) 2022 just-the-docs
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/codewithrockstar.com/README.md b/codewithrockstar.com/README.md
new file mode 100644
index 00000000..362efd42
--- /dev/null
+++ b/codewithrockstar.com/README.md
@@ -0,0 +1,174 @@
+# just-the-docs-template
+
+This is a *bare-minimum* template to create a [Jekyll] site that:
+
+- uses the [Just the Docs] theme;
+- can be built and published on [GitHub Pages];
+- can be built and previewed locally, and published on other platforms.
+
+More specifically, the created site:
+
+- uses a gem-based approach, i.e. uses a `Gemfile` and loads the `just-the-docs` gem;
+- uses the [GitHub Pages / Actions workflow] to build and publish the site on GitHub Pages.
+
+To get started with creating a site, simply:
+
+1. click "[use this template]" to create a GitHub repository
+2. go to Settings > Pages > Build and deployment > Source, and select GitHub Actions
+
+If you want to maintain your docs in the `docs` directory of an existing project repo, see [Hosting your docs from an existing project repo](#hosting-your-docs-from-an-existing-project-repo).
+
+After completing the creation of your new site on GitHub, update it as needed:
+
+## Replace the content of the template pages
+
+Update the following files to your own content:
+
+- `index.md` (your new home page)
+- `README.md` (information for those who access your site repo on GitHub)
+
+## Changing the version of the theme and/or Jekyll
+
+Simply edit the relevant line(s) in the `Gemfile`.
+
+## Adding a plugin
+
+The Just the Docs theme automatically includes the [`jekyll-seo-tag`] plugin.
+
+To add an extra plugin, you need to add it in the `Gemfile` *and* in `_config.yml`. For example, to add [`jekyll-default-layout`]:
+
+- Add the following to your site's `Gemfile`:
+
+  ```ruby
+  gem "jekyll-default-layout"
+  ```
+
+- And add the following to your site's `_config.yml`:
+
+  ```yaml
+  plugins:
+    - jekyll-default-layout
+  ```
+
+Note: If you are using a Jekyll version less than 3.5.0, use the `gems` key instead of `plugins`.
+
+## Publishing your site on GitHub Pages
+
+1.  If your created site is `YOUR-USERNAME/YOUR-SITE-NAME`, update `_config.yml` to:
+
+    ```yaml
+    title: YOUR TITLE
+    description: YOUR DESCRIPTION
+    theme: just-the-docs
+
+    url: https://YOUR-USERNAME.github.io/YOUR-SITE-NAME
+
+    aux_links: # remove if you don't want this link to appear on your pages
+      Template Repository: https://github.com/YOUR-USERNAME/YOUR-SITE-NAME
+    ```
+
+2.  Push your updated `_config.yml` to your site on GitHub.
+
+3.  In your newly created repo on GitHub:
+    - go to the `Settings` tab -> `Pages` -> `Build and deployment`, then select `Source`: `GitHub Actions`.
+    - if there were any failed Actions, go to the `Actions` tab and click on `Re-run jobs`.
+
+## Building and previewing your site locally
+
+Assuming [Jekyll] and [Bundler] are installed on your computer:
+
+1.  Change your working directory to the root directory of your site.
+
+2.  Run `bundle install`.
+
+3.  Run `bundle exec jekyll serve` to build your site and preview it at `localhost:4000`.
+
+    The built site is stored in the directory `_site`.
+
+## Publishing your built site on a different platform
+
+Just upload all the files in the directory `_site`.
+
+## Customization
+
+You're free to customize sites that you create with this template, however you like!
+
+[Browse our documentation][Just the Docs] to learn more about how to use this theme.
+
+## Hosting your docs from an existing project repo
+
+You might want to maintain your docs in an existing project repo. Instead of creating a new repo using the [just-the-docs template](https://github.com/just-the-docs/just-the-docs-template), you can copy the template files into your existing repo and configure the template's Github Actions workflow to build from a `docs` directory. You can clone the template to your local machine or download the `.zip` file to access the files.
+
+### Copy the template files
+
+1.  Create a `.github/workflows` directory at your project root if your repo doesn't already have one. Copy the `pages.yml` file into this directory. GitHub Actions searches this directory for workflow files.
+
+2.  Create a `docs` directory at your project root and copy all remaining template files into this directory.
+
+### Modify the GitHub Actions workflow
+
+The GitHub Actions workflow that builds and deploys your site to Github Pages is defined by the `pages.yml` file. You'll need to edit this file to that so that your build and deploy steps look to your `docs` directory, rather than the project root.
+
+1.  Set the default `working-directory` param for the build job.
+
+    ```yaml
+    build:
+      runs-on: ubuntu-latest
+      defaults:
+        run:
+          working-directory: docs
+    ```
+
+2.  Set the `working-directory` param for the Setup Ruby step.
+
+    ```yaml
+    - name: Setup Ruby
+        uses: ruby/setup-ruby@v1
+        with:
+          ruby-version: '3.1'
+          bundler-cache: true
+          cache-version: 0
+          working-directory: '${{ github.workspace }}/docs'
+    ```
+
+3.  Set the path param for the Upload artifact step:
+
+    ```yaml
+    - name: Upload artifact
+        uses: actions/upload-pages-artifact@v1
+        with:
+          path: "docs/_site/"
+    ```
+
+4.  Modify the trigger so that only changes within the `docs` directory start the workflow. Otherwise, every change to your project (even those that don't affect the docs) would trigger a new site build and deploy.
+
+    ```yaml
+    on:
+      push:
+        branches:
+          - "main"
+        paths:
+          - "docs/**"
+    ```
+
+## Licensing and Attribution
+
+This repository is licensed under the [MIT License]. You are generally free to reuse or extend upon this code as you see fit; just include the original copy of the license (which is preserved when you "make a template"). While it's not necessary, we'd love to hear from you if you do use this template, and how we can improve it for future use!
+
+The deployment GitHub Actions workflow is heavily based on GitHub's mixed-party [starter workflows]. A copy of their MIT License is available in [actions/starter-workflows].
+
+----
+
+[^1]: [It can take up to 10 minutes for changes to your site to publish after you push the changes to GitHub](https://docs.github.com/en/pages/setting-up-a-github-pages-site-with-jekyll/creating-a-github-pages-site-with-jekyll#creating-your-site).
+
+[Jekyll]: https://jekyllrb.com
+[Just the Docs]: https://just-the-docs.github.io/just-the-docs/
+[GitHub Pages]: https://docs.github.com/en/pages
+[GitHub Pages / Actions workflow]: https://github.blog/changelog/2022-07-27-github-pages-custom-github-actions-workflows-beta/
+[Bundler]: https://bundler.io
+[use this template]: https://github.com/just-the-docs/just-the-docs-template/generate
+[`jekyll-default-layout`]: https://github.com/benbalter/jekyll-default-layout
+[`jekyll-seo-tag`]: https://jekyll.github.io/jekyll-seo-tag
+[MIT License]: https://en.wikipedia.org/wiki/MIT_License
+[starter workflows]: https://github.com/actions/starter-workflows/blob/main/pages/jekyll.yml
+[actions/starter-workflows]: https://github.com/actions/starter-workflows/blob/main/LICENSE
diff --git a/codewithrockstar.com/_config.yml b/codewithrockstar.com/_config.yml
new file mode 100644
index 00000000..7cf4e623
--- /dev/null
+++ b/codewithrockstar.com/_config.yml
@@ -0,0 +1,11 @@
+title: Rockstar
+description: Tommy used to work on the docs.
+theme: just-the-docs
+
+url: https://beta.codewithrockstar.com
+
+color_scheme: darkstar
+
+include:
+ - _framework
+
diff --git a/codewithrockstar.com/_includes/footer_custom.html b/codewithrockstar.com/_includes/footer_custom.html
new file mode 100644
index 00000000..831f5607
--- /dev/null
+++ b/codewithrockstar.com/_includes/footer_custom.html
@@ -0,0 +1,32 @@
+
diff --git a/codewithrockstar.com/_includes/head_custom.html b/codewithrockstar.com/_includes/head_custom.html
new file mode 100644
index 00000000..28bccf06
--- /dev/null
+++ b/codewithrockstar.com/_includes/head_custom.html
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/codewithrockstar.com/_includes/header_custom.html b/codewithrockstar.com/_includes/header_custom.html
new file mode 100644
index 00000000..1cd32742
--- /dev/null
+++ b/codewithrockstar.com/_includes/header_custom.html
@@ -0,0 +1,4 @@
+
+	
+
+
diff --git a/codewithrockstar.com/_layouts/docs.html b/codewithrockstar.com/_layouts/docs.html
new file mode 100644
index 00000000..920ede66
--- /dev/null
+++ b/codewithrockstar.com/_layouts/docs.html
@@ -0,0 +1,6 @@
+---
+layout: home
+---
+

{{ page.title }}

+ +{{ content }} \ No newline at end of file diff --git a/codewithrockstar.com/_layouts/main.html b/codewithrockstar.com/_layouts/main.html new file mode 100644 index 00000000..d4d143dc --- /dev/null +++ b/codewithrockstar.com/_layouts/main.html @@ -0,0 +1,6 @@ +--- +layout: page +--- +
+ {{ content }} +
\ No newline at end of file diff --git a/codewithrockstar.com/_layouts/page.html b/codewithrockstar.com/_layouts/page.html new file mode 100644 index 00000000..4ce523cb --- /dev/null +++ b/codewithrockstar.com/_layouts/page.html @@ -0,0 +1,38 @@ +--- +layout: table_wrappers +--- + + + + +{% include head.html %} + + +
+

Rockstar

+

Tommy used to work on the docs

+
+ + {{ content }} + + + + \ No newline at end of file diff --git a/codewithrockstar.com/_plugins/rockstar_include.rb b/codewithrockstar.com/_plugins/rockstar_include.rb new file mode 100644 index 00000000..ac7f0102 --- /dev/null +++ b/codewithrockstar.com/_plugins/rockstar_include.rb @@ -0,0 +1,34 @@ +class RockstarInclude < Liquid::Tag + def initialize(_tag_name, markup, _parse_context) + super + @markup = markup.strip + end + + def render(context) + page = context.registers[:page] + parts = @markup.split(' ', 2) +# p parts[0] + expanded_path = Liquid::Template.parse(parts[0].strip).render(context) + page_filename = File.basename(page['path'], '.*') + root_path = File.expand_path(context.registers[:site].config['source']) + file_path = File.join(root_path, 'examples', page_filename, expanded_path) + attributes = parts.length > 1 ? parts[1] : "all" +# puts file_path +# p file_path +# bare_filename = File.basename(expanded_path) +##{bare_filename}: + <<-ROCKSTAR +{: data-controls="#{attributes}" } +```rockstar +#{read_file(file_path, context)} +``` +ROCKSTAR + end + + def read_file(path, context) + file_read_opts = context.registers[:site].file_read_opts + File.read(path, **file_read_opts) + end + end + + Liquid::Template.register_tag('rockstar_include', RockstarInclude) \ No newline at end of file diff --git a/codewithrockstar.com/_sass/color_schemes/darkstar.scss b/codewithrockstar.com/_sass/color_schemes/darkstar.scss new file mode 100644 index 00000000..de162851 --- /dev/null +++ b/codewithrockstar.com/_sass/color_schemes/darkstar.scss @@ -0,0 +1,32 @@ +@import "./color_schemes/dark"; + +$body-background-color: #000; +$table-background-color: #000; +$sidebar-color: #000; +$link-color: #b9f; +$code-background-color: #213; + +@import url('https://fonts.googleapis.com/css2?family=Fira+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); + +$body-font-family: system-ui, -apple-system, blinkmacsystemfont, "Segoe UI", roboto, "Helvetica Neue", arial, sans-serif, "Segoe UI Emoji" !default; +$mono-font-family: "SFMono-Regular", menlo, consolas, monospace !default; +$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems +$body-line-height: 1.4 !default; +$content-line-height: 1.6 !default; +$body-heading-line-height: 1.25 !default; + +/* +$body-heading-color: $grey-lt-000; +$body-text-color: $grey-lt-300; + +$nav-child-link-color: $grey-dk-000; +$base-button-color: $grey-dk-250; +$btn-primary-color: $blue-200; +$code-background-color: #31343f; +$code-linenumber-color: #dee2f7; +$feedback-color: darken($sidebar-color, 3%); +$table-background-color: $grey-dk-250; +$search-background-color: $grey-dk-250; +$search-result-preview-color: $grey-dk-000; +$border-color: $grey-dk-200; +*/ \ No newline at end of file diff --git a/codewithrockstar.com/_sass/color_schemes/rockstar.scss b/codewithrockstar.com/_sass/color_schemes/rockstar.scss new file mode 100644 index 00000000..325e2f35 --- /dev/null +++ b/codewithrockstar.com/_sass/color_schemes/rockstar.scss @@ -0,0 +1 @@ +$button-color: #9cf; diff --git a/codewithrockstar.com/_sass/custom/custom.scss b/codewithrockstar.com/_sass/custom/custom.scss new file mode 100644 index 00000000..88c8c384 --- /dev/null +++ b/codewithrockstar.com/_sass/custom/custom.scss @@ -0,0 +1,209 @@ +@import 'page.scss'; + + +div.site-header a.site-title { + font-size: 0 !important; + position: relative; + left: 8px; + top: 12px; + height: 64px; + width: 300px; + background: url(/assets/img/rockstar-logotype.svg) left center no-repeat; +} + +ul#index-nav { + list-style-type: none; + + li::before { + content: none; + } + + padding: 0; + margin: 0; + + a { + font-weight: bold; + } + + p { + padding-left: 20px; + } + } + +body { + main { + h2 { + margin-top: 1em; + padding-top: 1em; + border-top: 2px solid $button-color; + } + + h3 { + margin-top: 1em; + } + } +} +div.cm-editor { + border: 1px solid $link-color; + border-radius: 4px; + padding: 4px; +} + +div.rockstar-inputs { + display: flex; + flex-direction: row; + gap: 8px; + + label { + flex: 120px; + cursor: pointer; + display: block; + padding: 8px 8px 6px 8px; + text-align: left; + color: #ffffff !important; + } + + textarea { + padding: 8px; + font-size: 12px; + line-height: 1.1em; + box-sizing: border-box; + margin: 8px 0 0 0; + border: 1px solid $link-color; + height: 100%; + border-radius: 4px; + resize: vertical; + overflow-y: auto; + min-height: 40px; + width: 100%; + } +} + +div.rockstar-controls { + align-items: center; + display: flex; + flex-direction: column; + gap: 8px; + + @media (min-width: $breakpoint-fullwidth) { + flex-direction: row; + } + + box-sizing: border-box; + padding-top: 8px; + + .buttons { + align-self: flex-start; + display: flex; + flex-direction: row; + justify-content: space-between; + width: 100%; + gap: 8px; + + @media (min-width: $breakpoint-fullwidth) { + flex-direction: column; + width: auto; + flex: 120px; + height: 120px; + margin-bottom: 0; + } + + button { + width: 100%; + max-width: 120px; + cursor: pointer; + display: block; + padding: 6px 8px; + border-radius: 4px; + border: 1px outset $button-color; + background-color: $button-color !important; + text-align: left; + color: $button-text !important; + i { + position: relative; + top: 1px; + float: right; + } + } + } + + div.output { + position: relative; + font-family: monospace; + white-space: pre; + padding: 8px 8px 40px 8px; + font-size: 12px; + line-height: 1.1em; + box-sizing: border-box; + margin: 0; + border: 1px solid $link-color; + height: 100%; + border-radius: 4px; + resize: vertical; + overflow-y: auto; + min-height: 120px; + &.loading-messages { + text-align: center; + color: $link-color; + font-style: italic; + } + background: rgba(0,0,0,0.75); + + &.parse-tree { + color: $link-color; + font-style: italic; + } + + @media (max-width: $breakpoint-fullwidth) { + width: 100%; + } + + width: 100%; + + span { + font-style: italic; + position: absolute; + left: 8px; + bottom: 8px; + padding: 4px; + border-radius: 2px; + } + + span.error { + color: #f3c; + border: 1px solid #f3c; + background-color: #312; + } + + span.result { + color: $link-color; + border: 1px solid $link-color; + background-color: #000; + } + } + +} + +pre { + tab-size: 2 !important; +} + +:not(pre, figure)>code { + border: 0; + font-size: 1.0em !important; + background-color: $code-background-color; + padding: 2px; + margin: 0; +} + +article#teemill-gallery { + display: flex; + flex-wrap: wrap; + gap: 20px; + section { + flex: 240px; + a { + width: 100%; + } + } +} \ No newline at end of file diff --git a/codewithrockstar.com/_sass/custom/page.scss b/codewithrockstar.com/_sass/custom/page.scss new file mode 100644 index 00000000..0654a566 --- /dev/null +++ b/codewithrockstar.com/_sass/custom/page.scss @@ -0,0 +1,223 @@ +@use 'sass:color'; + +html.page { + + header, + main { + padding: 0 10px; + max-width: 960px; + margin: 0px auto; + box-sizing: border-box; + } + + main { + padding-top: 20px; + } + + article#hero { + margin: 2em 0; + background-color: color.scale($button-color, $lightness: -50%); + background-image: url(/assets/img/guitars-pattern.png); + border-width: 1px 0 1px 0; + width: 100%; + border-style: solid; + border-color: $button-color; + padding: 20px 10px; + + section { + display: flex; + column-gap: 20px; + max-width: 960px; + margin: 0px auto; + box-sizing: border-box; + justify-content: space-between; + flex-wrap: wrap; + + #homepage-message { + min-width: 320px; + flex: 400px; + } + + #homepage-example { + flex: 320px; + } + } + } + + article#homepage-sections { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + align-content: stretch; + gap: 20px; + + div { + flex: 450px; + display: flex; + + flex-wrap: wrap; + align-content: stretch; + + gap: 20px; + + section { + padding: 10px; + border-top: 4px solid $button-color; + flex: 200px; + display: flex; + flex-direction: column; + justify-content: space-between; + + >div { + display: block; + flex: 1; + + h3 i { + font-size: 120%; + padding-right: 5px; + } + } + + >p { + flex: 0; + margin: 0; + font-weight: 300; + } + } + } + } + + header { + margin-top: 8px; + padding-top: 64px; + + @media (max-width: 480px) { + padding-top: 48px; + } + + position: relative; + + h1 { + position: absolute; + top: 0; + left: 10px; + z-index: 2; + display: block; + + a { + display: block; + font-size: 0 !important; + height: 96px; + width: 300px; + background: url(/assets/img/rockstar-logotype.svg) left center no-repeat; + + @media (max-width: 580px) { + background: url(/assets/img/rockstar-logotype-no-tail.svg) left center no-repeat; + } + + @media (max-width: 480px) { + height: 64px; + } + } + } + + h2 { + position: absolute; + top: 0; + right: 10px; + font-weight: 100; + height: 60px; + margin: 0px 0 8px 0; + max-width: 50%; + display: flex; + flex-direction: column; + justify-content: flex-end; + text-align: right; + text-wrap: balance; + max-width: calc(100% - 320px); + font-size: 1.4em !important; + + @media (max-width: 640px) { + max-width: 35%; + } + + @media (max-width: 480px) { + font-size: 1.1em !important; + height: 40px; + } + } + } + + nav { + clear: both; + padding: 0 10px; + max-width: 960px; + width: calc(100vw - 20px); + margin: 0px auto; + box-sizing: border-box; + + background: linear-gradient($button-color, color.scale($button-color, $lightness: -33%)); + background-color: $button-color !important; + border-radius: 8px; + border: 1px outset color.scale($button-color, $saturation: -33%); + display: flex; + justify-content: center; + + @media (max-width: 480px) { + width: 100%; + border-radius: 0; + border-width: 1px 0 1px 0; + padding: 0; + margin: 0; + } + + a { + position: relative; + z-index: 3; + + @media (max-width: $breakpoint-fullwidth) { + font-size: 1.0em; + padding: 8px 8px; + } + + @media (max-width: 480px) { + font-size: 1.0em; + padding: 6px 6px; + + &:first-child { + border-left: none; + } + + &:last-child { + border-right: none; + } + } + + font-weight: 500; + font-size: 1.1em; + color: $body-text-color; + text-decoration: none; + padding: 8px 16px; + border-right: 1px outset color.scale($button-color, $saturation: -33%); + border-left: 1px outset color.scale($button-color, $saturation: -33%); + + &:hover { + background-color: color.scale($button-color, $lightness: -33%) + } + } + } + + footer { + margin-top: 20px; + border-top: 1px solid $button-color; + background: linear-gradient(color.scale($button-color, $lightness: -50%), #000); + background-color: $button-color !important; + padding: 20px; + font-size: 0.8em; + text-align: center; + + div { + padding: 5px; + } + } +} \ No newline at end of file diff --git a/codewithrockstar.com/_sass/custom/setup.scss b/codewithrockstar.com/_sass/custom/setup.scss new file mode 100644 index 00000000..c78403ec --- /dev/null +++ b/codewithrockstar.com/_sass/custom/setup.scss @@ -0,0 +1,7 @@ +//$button-color: #426; +$breakpoint-fullwidth: 768px; + +$button-color: #381c5d; +$button-text: #ffffff; + + diff --git a/codewithrockstar.com/assets/css/just-the-docs-darkstar.scss b/codewithrockstar.com/assets/css/just-the-docs-darkstar.scss new file mode 100644 index 00000000..762c13a2 --- /dev/null +++ b/codewithrockstar.com/assets/css/just-the-docs-darkstar.scss @@ -0,0 +1,3 @@ +--- +--- +{% include css/just-the-docs.scss.liquid color_scheme="darkstar" %} diff --git a/codewithrockstar.com/assets/css/just-the-docs-rockstar.scss b/codewithrockstar.com/assets/css/just-the-docs-rockstar.scss new file mode 100644 index 00000000..f9c4e21b --- /dev/null +++ b/codewithrockstar.com/assets/css/just-the-docs-rockstar.scss @@ -0,0 +1,3 @@ +--- +--- +{% include css/just-the-docs.scss.liquid color_scheme="rockstar" %} diff --git a/codewithrockstar.com/assets/fontawesome/css/all.css b/codewithrockstar.com/assets/fontawesome/css/all.css new file mode 100644 index 00000000..b514f2ba --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/all.css @@ -0,0 +1,6348 @@ +.fa { + font-family: var(--fa-style-family, "Font Awesome 6 Pro"); + font-weight: var(--fa-style, 900); } + +.fa-solid, +.fa-regular, +.fa-brands, +.fas, +.far, +.fab, +.fal, +.fat, +.fad, +.fass, +.fasr, +.fasl, +.fast, +.fasds, +.fa-light, +.fa-thin, +.fa-duotone, +.fa-sharp, +.fa-sharp-duotone, +.fa-sharp-solid, +.fa-classic, +.fa { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; } + +.fas, +.far, +.fal, +.fat, +.fa-solid, +.fa-regular, +.fa-light, +.fa-thin, +.fa-classic { + font-family: 'Font Awesome 6 Pro'; } + +.fab, +.fa-brands { + font-family: 'Font Awesome 6 Brands'; } + +.fad, +.fa-classic.fa-duotone, +.fa-duotone { + font-family: 'Font Awesome 6 Duotone'; } + +.fasds, +.fa-sharp-duotone { + font-family: 'Font Awesome 6 Sharp Duotone'; } + +.fasds, +.fa-sharp-duotone { + font-weight: 900; } + +.fass, +.fasr, +.fasl, +.fast, +.fa-sharp { + font-family: 'Font Awesome 6 Sharp'; } + +.fass, +.fa-sharp { + font-weight: 900; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; } + +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; } + +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; } + +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; } + +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; } + +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: calc(-1 * var(--fa-li-width, 2em)); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; } + +.fa-border { + border-color: var(--fa-border-color, #eee); + border-radius: var(--fa-border-radius, 0.1em); + border-style: var(--fa-border-style, solid); + border-width: var(--fa-border-width, 0.08em); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } + +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); } + +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); } + +.fa-beat { + animation-name: fa-beat; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-bounce { + animation-name: fa-bounce; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } + +.fa-fade { + animation-name: fa-fade; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-beat-fade { + animation-name: fa-beat-fade; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-flip { + animation-name: fa-flip; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-shake { + animation-name: fa-shake; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin { + animation-name: fa-spin; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 2s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin-reverse { + --fa-animation-direction: reverse; } + +.fa-pulse, +.fa-spin-pulse { + animation-name: fa-spin; + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, steps(8)); } + +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-bounce, + .fa-fade, + .fa-beat-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + animation-delay: -1ms; + animation-duration: 1ms; + animation-iteration-count: 1; + transition-delay: 0s; + transition-duration: 0s; } } + +@keyframes fa-beat { + 0%, 90% { + transform: scale(1); } + 45% { + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@keyframes fa-bounce { + 0% { + transform: scale(1, 1) translateY(0); } + 10% { + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + transform: scale(1, 1) translateY(0); } + 100% { + transform: scale(1, 1) translateY(0); } } + +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + transform: scale(1); } + 50% { + opacity: 1; + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@keyframes fa-flip { + 50% { + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@keyframes fa-shake { + 0% { + transform: rotate(-15deg); } + 4% { + transform: rotate(15deg); } + 8%, 24% { + transform: rotate(-18deg); } + 12%, 28% { + transform: rotate(18deg); } + 16% { + transform: rotate(-22deg); } + 20% { + transform: rotate(22deg); } + 32% { + transform: rotate(-12deg); } + 36% { + transform: rotate(12deg); } + 40%, 100% { + transform: rotate(0deg); } } + +@keyframes fa-spin { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(360deg); } } + +.fa-rotate-90 { + transform: rotate(90deg); } + +.fa-rotate-180 { + transform: rotate(180deg); } + +.fa-rotate-270 { + transform: rotate(270deg); } + +.fa-flip-horizontal { + transform: scale(-1, 1); } + +.fa-flip-vertical { + transform: scale(1, -1); } + +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + transform: scale(-1, -1); } + +.fa-rotate-by { + transform: rotate(var(--fa-rotate-angle, 0)); } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; + z-index: var(--fa-stack-z-index, auto); } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: var(--fa-inverse, #fff); } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-0::before { content: "\30"; } +.fa-00::before { content: "\e467"; } +.fa-1::before { content: "\31"; } +.fa-100::before { content: "\e41c"; } +.fa-2::before { content: "\32"; } +.fa-3::before { content: "\33"; } +.fa-360-degrees::before { content: "\e2dc"; } +.fa-4::before { content: "\34"; } +.fa-5::before { content: "\35"; } +.fa-6::before { content: "\36"; } +.fa-7::before { content: "\37"; } +.fa-8::before { content: "\38"; } +.fa-9::before { content: "\39"; } +.fa-a::before { content: "\41"; } +.fa-abacus::before { content: "\f640"; } +.fa-accent-grave::before { content: "\60"; } +.fa-acorn::before { content: "\f6ae"; } +.fa-ad::before { content: "\f641"; } +.fa-add::before { content: "\2b"; } +.fa-address-book::before { content: "\f2b9"; } +.fa-address-card::before { content: "\f2bb"; } +.fa-adjust::before { content: "\f042"; } +.fa-air-conditioner::before { content: "\f8f4"; } +.fa-air-freshener::before { content: "\f5d0"; } +.fa-airplay::before { content: "\e089"; } +.fa-alarm-clock::before { content: "\f34e"; } +.fa-alarm-exclamation::before { content: "\f843"; } +.fa-alarm-plus::before { content: "\f844"; } +.fa-alarm-snooze::before { content: "\f845"; } +.fa-album::before { content: "\f89f"; } +.fa-album-circle-plus::before { content: "\e48c"; } +.fa-album-circle-user::before { content: "\e48d"; } +.fa-album-collection::before { content: "\f8a0"; } +.fa-album-collection-circle-plus::before { content: "\e48e"; } +.fa-album-collection-circle-user::before { content: "\e48f"; } +.fa-alicorn::before { content: "\f6b0"; } +.fa-alien::before { content: "\f8f5"; } +.fa-alien-8bit::before { content: "\f8f6"; } +.fa-alien-monster::before { content: "\f8f6"; } +.fa-align-center::before { content: "\f037"; } +.fa-align-justify::before { content: "\f039"; } +.fa-align-left::before { content: "\f036"; } +.fa-align-right::before { content: "\f038"; } +.fa-align-slash::before { content: "\f846"; } +.fa-allergies::before { content: "\f461"; } +.fa-alt::before { content: "\e08a"; } +.fa-ambulance::before { content: "\f0f9"; } +.fa-american-sign-language-interpreting::before { content: "\f2a3"; } +.fa-amp-guitar::before { content: "\f8a1"; } +.fa-ampersand::before { content: "\26"; } +.fa-analytics::before { content: "\f643"; } +.fa-anchor::before { content: "\f13d"; } +.fa-anchor-circle-check::before { content: "\e4aa"; } +.fa-anchor-circle-exclamation::before { content: "\e4ab"; } +.fa-anchor-circle-xmark::before { content: "\e4ac"; } +.fa-anchor-lock::before { content: "\e4ad"; } +.fa-angel::before { content: "\f779"; } +.fa-angle::before { content: "\e08c"; } +.fa-angle-90::before { content: "\e08d"; } +.fa-angle-double-down::before { content: "\f103"; } +.fa-angle-double-left::before { content: "\f100"; } +.fa-angle-double-right::before { content: "\f101"; } +.fa-angle-double-up::before { content: "\f102"; } +.fa-angle-down::before { content: "\f107"; } +.fa-angle-left::before { content: "\f104"; } +.fa-angle-right::before { content: "\f105"; } +.fa-angle-up::before { content: "\f106"; } +.fa-angles-down::before { content: "\f103"; } +.fa-angles-left::before { content: "\f100"; } +.fa-angles-right::before { content: "\f101"; } +.fa-angles-up::before { content: "\f102"; } +.fa-angles-up-down::before { content: "\e60d"; } +.fa-angry::before { content: "\f556"; } +.fa-ankh::before { content: "\f644"; } +.fa-ant::before { content: "\e680"; } +.fa-apartment::before { content: "\e468"; } +.fa-aperture::before { content: "\e2df"; } +.fa-apostrophe::before { content: "\27"; } +.fa-apple-alt::before { content: "\f5d1"; } +.fa-apple-core::before { content: "\e08f"; } +.fa-apple-crate::before { content: "\f6b1"; } +.fa-apple-whole::before { content: "\f5d1"; } +.fa-archive::before { content: "\f187"; } +.fa-archway::before { content: "\f557"; } +.fa-area-chart::before { content: "\f1fe"; } +.fa-arrow-alt-circle-down::before { content: "\f358"; } +.fa-arrow-alt-circle-left::before { content: "\f359"; } +.fa-arrow-alt-circle-right::before { content: "\f35a"; } +.fa-arrow-alt-circle-up::before { content: "\f35b"; } +.fa-arrow-alt-down::before { content: "\f354"; } +.fa-arrow-alt-from-bottom::before { content: "\f346"; } +.fa-arrow-alt-from-left::before { content: "\f347"; } +.fa-arrow-alt-from-right::before { content: "\f348"; } +.fa-arrow-alt-from-top::before { content: "\f349"; } +.fa-arrow-alt-left::before { content: "\f355"; } +.fa-arrow-alt-right::before { content: "\f356"; } +.fa-arrow-alt-square-down::before { content: "\f350"; } +.fa-arrow-alt-square-left::before { content: "\f351"; } +.fa-arrow-alt-square-right::before { content: "\f352"; } +.fa-arrow-alt-square-up::before { content: "\f353"; } +.fa-arrow-alt-to-bottom::before { content: "\f34a"; } +.fa-arrow-alt-to-left::before { content: "\f34b"; } +.fa-arrow-alt-to-right::before { content: "\f34c"; } +.fa-arrow-alt-to-top::before { content: "\f34d"; } +.fa-arrow-alt-up::before { content: "\f357"; } +.fa-arrow-circle-down::before { content: "\f0ab"; } +.fa-arrow-circle-left::before { content: "\f0a8"; } +.fa-arrow-circle-right::before { content: "\f0a9"; } +.fa-arrow-circle-up::before { content: "\f0aa"; } +.fa-arrow-down::before { content: "\f063"; } +.fa-arrow-down-1-9::before { content: "\f162"; } +.fa-arrow-down-9-1::before { content: "\f886"; } +.fa-arrow-down-a-z::before { content: "\f15d"; } +.fa-arrow-down-arrow-up::before { content: "\f883"; } +.fa-arrow-down-big-small::before { content: "\f88c"; } +.fa-arrow-down-from-arc::before { content: "\e614"; } +.fa-arrow-down-from-bracket::before { content: "\e667"; } +.fa-arrow-down-from-dotted-line::before { content: "\e090"; } +.fa-arrow-down-from-line::before { content: "\f345"; } +.fa-arrow-down-left::before { content: "\e091"; } +.fa-arrow-down-left-and-arrow-up-right-to-center::before { content: "\e092"; } +.fa-arrow-down-long::before { content: "\f175"; } +.fa-arrow-down-right::before { content: "\e093"; } +.fa-arrow-down-short-wide::before { content: "\f884"; } +.fa-arrow-down-small-big::before { content: "\f88d"; } +.fa-arrow-down-square-triangle::before { content: "\f889"; } +.fa-arrow-down-to-arc::before { content: "\e4ae"; } +.fa-arrow-down-to-bracket::before { content: "\e094"; } +.fa-arrow-down-to-dotted-line::before { content: "\e095"; } +.fa-arrow-down-to-line::before { content: "\f33d"; } +.fa-arrow-down-to-square::before { content: "\e096"; } +.fa-arrow-down-triangle-square::before { content: "\f888"; } +.fa-arrow-down-up-across-line::before { content: "\e4af"; } +.fa-arrow-down-up-lock::before { content: "\e4b0"; } +.fa-arrow-down-wide-short::before { content: "\f160"; } +.fa-arrow-down-z-a::before { content: "\f881"; } +.fa-arrow-from-bottom::before { content: "\f342"; } +.fa-arrow-from-left::before { content: "\f343"; } +.fa-arrow-from-right::before { content: "\f344"; } +.fa-arrow-from-top::before { content: "\f345"; } +.fa-arrow-left::before { content: "\f060"; } +.fa-arrow-left-from-arc::before { content: "\e615"; } +.fa-arrow-left-from-bracket::before { content: "\e668"; } +.fa-arrow-left-from-line::before { content: "\f344"; } +.fa-arrow-left-long::before { content: "\f177"; } +.fa-arrow-left-long-to-line::before { content: "\e3d4"; } +.fa-arrow-left-rotate::before { content: "\f0e2"; } +.fa-arrow-left-to-arc::before { content: "\e616"; } +.fa-arrow-left-to-bracket::before { content: "\e669"; } +.fa-arrow-left-to-line::before { content: "\f33e"; } +.fa-arrow-pointer::before { content: "\f245"; } +.fa-arrow-progress::before { content: "\e5df"; } +.fa-arrow-right::before { content: "\f061"; } +.fa-arrow-right-arrow-left::before { content: "\f0ec"; } +.fa-arrow-right-from-arc::before { content: "\e4b1"; } +.fa-arrow-right-from-bracket::before { content: "\f08b"; } +.fa-arrow-right-from-file::before { content: "\f56e"; } +.fa-arrow-right-from-line::before { content: "\f343"; } +.fa-arrow-right-long::before { content: "\f178"; } +.fa-arrow-right-long-to-line::before { content: "\e3d5"; } +.fa-arrow-right-rotate::before { content: "\f01e"; } +.fa-arrow-right-to-arc::before { content: "\e4b2"; } +.fa-arrow-right-to-bracket::before { content: "\f090"; } +.fa-arrow-right-to-city::before { content: "\e4b3"; } +.fa-arrow-right-to-file::before { content: "\f56f"; } +.fa-arrow-right-to-line::before { content: "\f340"; } +.fa-arrow-rotate-back::before { content: "\f0e2"; } +.fa-arrow-rotate-backward::before { content: "\f0e2"; } +.fa-arrow-rotate-forward::before { content: "\f01e"; } +.fa-arrow-rotate-left::before { content: "\f0e2"; } +.fa-arrow-rotate-right::before { content: "\f01e"; } +.fa-arrow-square-down::before { content: "\f339"; } +.fa-arrow-square-left::before { content: "\f33a"; } +.fa-arrow-square-right::before { content: "\f33b"; } +.fa-arrow-square-up::before { content: "\f33c"; } +.fa-arrow-to-bottom::before { content: "\f33d"; } +.fa-arrow-to-left::before { content: "\f33e"; } +.fa-arrow-to-right::before { content: "\f340"; } +.fa-arrow-to-top::before { content: "\f341"; } +.fa-arrow-trend-down::before { content: "\e097"; } +.fa-arrow-trend-up::before { content: "\e098"; } +.fa-arrow-turn-down::before { content: "\f149"; } +.fa-arrow-turn-down-left::before { content: "\e2e1"; } +.fa-arrow-turn-down-right::before { content: "\e3d6"; } +.fa-arrow-turn-left::before { content: "\e632"; } +.fa-arrow-turn-left-down::before { content: "\e633"; } +.fa-arrow-turn-left-up::before { content: "\e634"; } +.fa-arrow-turn-right::before { content: "\e635"; } +.fa-arrow-turn-up::before { content: "\f148"; } +.fa-arrow-up::before { content: "\f062"; } +.fa-arrow-up-1-9::before { content: "\f163"; } +.fa-arrow-up-9-1::before { content: "\f887"; } +.fa-arrow-up-a-z::before { content: "\f15e"; } +.fa-arrow-up-arrow-down::before { content: "\e099"; } +.fa-arrow-up-big-small::before { content: "\f88e"; } +.fa-arrow-up-from-arc::before { content: "\e4b4"; } +.fa-arrow-up-from-bracket::before { content: "\e09a"; } +.fa-arrow-up-from-dotted-line::before { content: "\e09b"; } +.fa-arrow-up-from-ground-water::before { content: "\e4b5"; } +.fa-arrow-up-from-line::before { content: "\f342"; } +.fa-arrow-up-from-square::before { content: "\e09c"; } +.fa-arrow-up-from-water-pump::before { content: "\e4b6"; } +.fa-arrow-up-left::before { content: "\e09d"; } +.fa-arrow-up-left-from-circle::before { content: "\e09e"; } +.fa-arrow-up-long::before { content: "\f176"; } +.fa-arrow-up-right::before { content: "\e09f"; } +.fa-arrow-up-right-and-arrow-down-left-from-center::before { content: "\e0a0"; } +.fa-arrow-up-right-dots::before { content: "\e4b7"; } +.fa-arrow-up-right-from-square::before { content: "\f08e"; } +.fa-arrow-up-short-wide::before { content: "\f885"; } +.fa-arrow-up-small-big::before { content: "\f88f"; } +.fa-arrow-up-square-triangle::before { content: "\f88b"; } +.fa-arrow-up-to-arc::before { content: "\e617"; } +.fa-arrow-up-to-bracket::before { content: "\e66a"; } +.fa-arrow-up-to-dotted-line::before { content: "\e0a1"; } +.fa-arrow-up-to-line::before { content: "\f341"; } +.fa-arrow-up-triangle-square::before { content: "\f88a"; } +.fa-arrow-up-wide-short::before { content: "\f161"; } +.fa-arrow-up-z-a::before { content: "\f882"; } +.fa-arrows::before { content: "\f047"; } +.fa-arrows-alt::before { content: "\f0b2"; } +.fa-arrows-alt-h::before { content: "\f337"; } +.fa-arrows-alt-v::before { content: "\f338"; } +.fa-arrows-cross::before { content: "\e0a2"; } +.fa-arrows-down-to-line::before { content: "\e4b8"; } +.fa-arrows-down-to-people::before { content: "\e4b9"; } +.fa-arrows-from-dotted-line::before { content: "\e0a3"; } +.fa-arrows-from-line::before { content: "\e0a4"; } +.fa-arrows-h::before { content: "\f07e"; } +.fa-arrows-left-right::before { content: "\f07e"; } +.fa-arrows-left-right-to-line::before { content: "\e4ba"; } +.fa-arrows-maximize::before { content: "\f31d"; } +.fa-arrows-minimize::before { content: "\e0a5"; } +.fa-arrows-repeat::before { content: "\f364"; } +.fa-arrows-repeat-1::before { content: "\f366"; } +.fa-arrows-retweet::before { content: "\f361"; } +.fa-arrows-rotate::before { content: "\f021"; } +.fa-arrows-rotate-reverse::before { content: "\e630"; } +.fa-arrows-spin::before { content: "\e4bb"; } +.fa-arrows-split-up-and-left::before { content: "\e4bc"; } +.fa-arrows-to-circle::before { content: "\e4bd"; } +.fa-arrows-to-dot::before { content: "\e4be"; } +.fa-arrows-to-dotted-line::before { content: "\e0a6"; } +.fa-arrows-to-eye::before { content: "\e4bf"; } +.fa-arrows-to-line::before { content: "\e0a7"; } +.fa-arrows-turn-right::before { content: "\e4c0"; } +.fa-arrows-turn-to-dots::before { content: "\e4c1"; } +.fa-arrows-up-down::before { content: "\f07d"; } +.fa-arrows-up-down-left-right::before { content: "\f047"; } +.fa-arrows-up-to-line::before { content: "\e4c2"; } +.fa-arrows-v::before { content: "\f07d"; } +.fa-asl-interpreting::before { content: "\f2a3"; } +.fa-assistive-listening-systems::before { content: "\f2a2"; } +.fa-asterisk::before { content: "\2a"; } +.fa-at::before { content: "\40"; } +.fa-atlas::before { content: "\f558"; } +.fa-atom::before { content: "\f5d2"; } +.fa-atom-alt::before { content: "\f5d3"; } +.fa-atom-simple::before { content: "\f5d3"; } +.fa-audio-description::before { content: "\f29e"; } +.fa-audio-description-slash::before { content: "\e0a8"; } +.fa-austral-sign::before { content: "\e0a9"; } +.fa-automobile::before { content: "\f1b9"; } +.fa-avocado::before { content: "\e0aa"; } +.fa-award::before { content: "\f559"; } +.fa-award-simple::before { content: "\e0ab"; } +.fa-axe::before { content: "\f6b2"; } +.fa-axe-battle::before { content: "\f6b3"; } +.fa-b::before { content: "\42"; } +.fa-baby::before { content: "\f77c"; } +.fa-baby-carriage::before { content: "\f77d"; } +.fa-backpack::before { content: "\f5d4"; } +.fa-backspace::before { content: "\f55a"; } +.fa-backward::before { content: "\f04a"; } +.fa-backward-fast::before { content: "\f049"; } +.fa-backward-step::before { content: "\f048"; } +.fa-bacon::before { content: "\f7e5"; } +.fa-bacteria::before { content: "\e059"; } +.fa-bacterium::before { content: "\e05a"; } +.fa-badge::before { content: "\f335"; } +.fa-badge-check::before { content: "\f336"; } +.fa-badge-dollar::before { content: "\f645"; } +.fa-badge-percent::before { content: "\f646"; } +.fa-badge-sheriff::before { content: "\f8a2"; } +.fa-badger-honey::before { content: "\f6b4"; } +.fa-badminton::before { content: "\e33a"; } +.fa-bag-seedling::before { content: "\e5f2"; } +.fa-bag-shopping::before { content: "\f290"; } +.fa-bag-shopping-minus::before { content: "\e650"; } +.fa-bag-shopping-plus::before { content: "\e651"; } +.fa-bagel::before { content: "\e3d7"; } +.fa-bags-shopping::before { content: "\f847"; } +.fa-baguette::before { content: "\e3d8"; } +.fa-bahai::before { content: "\f666"; } +.fa-baht-sign::before { content: "\e0ac"; } +.fa-balance-scale::before { content: "\f24e"; } +.fa-balance-scale-left::before { content: "\f515"; } +.fa-balance-scale-right::before { content: "\f516"; } +.fa-ball-pile::before { content: "\f77e"; } +.fa-balloon::before { content: "\e2e3"; } +.fa-balloons::before { content: "\e2e4"; } +.fa-ballot::before { content: "\f732"; } +.fa-ballot-check::before { content: "\f733"; } +.fa-ban::before { content: "\f05e"; } +.fa-ban-bug::before { content: "\f7f9"; } +.fa-ban-parking::before { content: "\f616"; } +.fa-ban-smoking::before { content: "\f54d"; } +.fa-banana::before { content: "\e2e5"; } +.fa-band-aid::before { content: "\f462"; } +.fa-bandage::before { content: "\f462"; } +.fa-bangladeshi-taka-sign::before { content: "\e2e6"; } +.fa-banjo::before { content: "\f8a3"; } +.fa-bank::before { content: "\f19c"; } +.fa-bar-chart::before { content: "\f080"; } +.fa-barcode::before { content: "\f02a"; } +.fa-barcode-alt::before { content: "\f463"; } +.fa-barcode-read::before { content: "\f464"; } +.fa-barcode-scan::before { content: "\f465"; } +.fa-barn-silo::before { content: "\f864"; } +.fa-bars::before { content: "\f0c9"; } +.fa-bars-filter::before { content: "\e0ad"; } +.fa-bars-progress::before { content: "\f828"; } +.fa-bars-sort::before { content: "\e0ae"; } +.fa-bars-staggered::before { content: "\f550"; } +.fa-baseball::before { content: "\f433"; } +.fa-baseball-ball::before { content: "\f433"; } +.fa-baseball-bat-ball::before { content: "\f432"; } +.fa-basket-shopping::before { content: "\f291"; } +.fa-basket-shopping-minus::before { content: "\e652"; } +.fa-basket-shopping-plus::before { content: "\e653"; } +.fa-basket-shopping-simple::before { content: "\e0af"; } +.fa-basketball::before { content: "\f434"; } +.fa-basketball-ball::before { content: "\f434"; } +.fa-basketball-hoop::before { content: "\f435"; } +.fa-bat::before { content: "\f6b5"; } +.fa-bath::before { content: "\f2cd"; } +.fa-bathtub::before { content: "\f2cd"; } +.fa-battery::before { content: "\f240"; } +.fa-battery-0::before { content: "\f244"; } +.fa-battery-1::before { content: "\e0b1"; } +.fa-battery-2::before { content: "\f243"; } +.fa-battery-3::before { content: "\f242"; } +.fa-battery-4::before { content: "\f241"; } +.fa-battery-5::before { content: "\f240"; } +.fa-battery-bolt::before { content: "\f376"; } +.fa-battery-car::before { content: "\f5df"; } +.fa-battery-empty::before { content: "\f244"; } +.fa-battery-exclamation::before { content: "\e0b0"; } +.fa-battery-full::before { content: "\f240"; } +.fa-battery-half::before { content: "\f242"; } +.fa-battery-low::before { content: "\e0b1"; } +.fa-battery-quarter::before { content: "\f243"; } +.fa-battery-slash::before { content: "\f377"; } +.fa-battery-three-quarters::before { content: "\f241"; } +.fa-bed::before { content: "\f236"; } +.fa-bed-alt::before { content: "\f8f7"; } +.fa-bed-bunk::before { content: "\f8f8"; } +.fa-bed-empty::before { content: "\f8f9"; } +.fa-bed-front::before { content: "\f8f7"; } +.fa-bed-pulse::before { content: "\f487"; } +.fa-bee::before { content: "\e0b2"; } +.fa-beer::before { content: "\f0fc"; } +.fa-beer-foam::before { content: "\e0b3"; } +.fa-beer-mug::before { content: "\e0b3"; } +.fa-beer-mug-empty::before { content: "\f0fc"; } +.fa-bell::before { content: "\f0f3"; } +.fa-bell-concierge::before { content: "\f562"; } +.fa-bell-exclamation::before { content: "\f848"; } +.fa-bell-on::before { content: "\f8fa"; } +.fa-bell-plus::before { content: "\f849"; } +.fa-bell-ring::before { content: "\e62c"; } +.fa-bell-school::before { content: "\f5d5"; } +.fa-bell-school-slash::before { content: "\f5d6"; } +.fa-bell-slash::before { content: "\f1f6"; } +.fa-bells::before { content: "\f77f"; } +.fa-bench-tree::before { content: "\e2e7"; } +.fa-betamax::before { content: "\f8a4"; } +.fa-bezier-curve::before { content: "\f55b"; } +.fa-bible::before { content: "\f647"; } +.fa-bicycle::before { content: "\f206"; } +.fa-biking::before { content: "\f84a"; } +.fa-biking-mountain::before { content: "\f84b"; } +.fa-billboard::before { content: "\e5cd"; } +.fa-bin-bottles::before { content: "\e5f5"; } +.fa-bin-bottles-recycle::before { content: "\e5f6"; } +.fa-bin-recycle::before { content: "\e5f7"; } +.fa-binary::before { content: "\e33b"; } +.fa-binary-circle-check::before { content: "\e33c"; } +.fa-binary-lock::before { content: "\e33d"; } +.fa-binary-slash::before { content: "\e33e"; } +.fa-binoculars::before { content: "\f1e5"; } +.fa-biohazard::before { content: "\f780"; } +.fa-bird::before { content: "\e469"; } +.fa-birthday-cake::before { content: "\f1fd"; } +.fa-bitcoin-sign::before { content: "\e0b4"; } +.fa-blackboard::before { content: "\f51b"; } +.fa-blanket::before { content: "\f498"; } +.fa-blanket-fire::before { content: "\e3da"; } +.fa-blender::before { content: "\f517"; } +.fa-blender-phone::before { content: "\f6b6"; } +.fa-blind::before { content: "\f29d"; } +.fa-blinds::before { content: "\f8fb"; } +.fa-blinds-open::before { content: "\f8fc"; } +.fa-blinds-raised::before { content: "\f8fd"; } +.fa-block::before { content: "\e46a"; } +.fa-block-brick::before { content: "\e3db"; } +.fa-block-brick-fire::before { content: "\e3dc"; } +.fa-block-question::before { content: "\e3dd"; } +.fa-block-quote::before { content: "\e0b5"; } +.fa-blog::before { content: "\f781"; } +.fa-blueberries::before { content: "\e2e8"; } +.fa-bluetooth::before { content: "\f293"; } +.fa-bold::before { content: "\f032"; } +.fa-bolt::before { content: "\f0e7"; } +.fa-bolt-auto::before { content: "\e0b6"; } +.fa-bolt-lightning::before { content: "\e0b7"; } +.fa-bolt-slash::before { content: "\e0b8"; } +.fa-bomb::before { content: "\f1e2"; } +.fa-bone::before { content: "\f5d7"; } +.fa-bone-break::before { content: "\f5d8"; } +.fa-bong::before { content: "\f55c"; } +.fa-book::before { content: "\f02d"; } +.fa-book-alt::before { content: "\f5d9"; } +.fa-book-arrow-right::before { content: "\e0b9"; } +.fa-book-arrow-up::before { content: "\e0ba"; } +.fa-book-atlas::before { content: "\f558"; } +.fa-book-bible::before { content: "\f647"; } +.fa-book-blank::before { content: "\f5d9"; } +.fa-book-bookmark::before { content: "\e0bb"; } +.fa-book-circle::before { content: "\e0ff"; } +.fa-book-circle-arrow-right::before { content: "\e0bc"; } +.fa-book-circle-arrow-up::before { content: "\e0bd"; } +.fa-book-copy::before { content: "\e0be"; } +.fa-book-dead::before { content: "\f6b7"; } +.fa-book-font::before { content: "\e0bf"; } +.fa-book-heart::before { content: "\f499"; } +.fa-book-journal-whills::before { content: "\f66a"; } +.fa-book-law::before { content: "\e0c1"; } +.fa-book-medical::before { content: "\f7e6"; } +.fa-book-open::before { content: "\f518"; } +.fa-book-open-alt::before { content: "\e0c0"; } +.fa-book-open-cover::before { content: "\e0c0"; } +.fa-book-open-reader::before { content: "\f5da"; } +.fa-book-quran::before { content: "\f687"; } +.fa-book-reader::before { content: "\f5da"; } +.fa-book-section::before { content: "\e0c1"; } +.fa-book-skull::before { content: "\f6b7"; } +.fa-book-sparkles::before { content: "\f6b8"; } +.fa-book-spells::before { content: "\f6b8"; } +.fa-book-tanakh::before { content: "\f827"; } +.fa-book-user::before { content: "\f7e7"; } +.fa-bookmark::before { content: "\f02e"; } +.fa-bookmark-circle::before { content: "\e100"; } +.fa-bookmark-slash::before { content: "\e0c2"; } +.fa-books::before { content: "\f5db"; } +.fa-books-medical::before { content: "\f7e8"; } +.fa-boombox::before { content: "\f8a5"; } +.fa-boot::before { content: "\f782"; } +.fa-boot-heeled::before { content: "\e33f"; } +.fa-booth-curtain::before { content: "\f734"; } +.fa-border-all::before { content: "\f84c"; } +.fa-border-bottom::before { content: "\f84d"; } +.fa-border-bottom-right::before { content: "\f854"; } +.fa-border-center-h::before { content: "\f89c"; } +.fa-border-center-v::before { content: "\f89d"; } +.fa-border-inner::before { content: "\f84e"; } +.fa-border-left::before { content: "\f84f"; } +.fa-border-none::before { content: "\f850"; } +.fa-border-outer::before { content: "\f851"; } +.fa-border-right::before { content: "\f852"; } +.fa-border-style::before { content: "\f853"; } +.fa-border-style-alt::before { content: "\f854"; } +.fa-border-top::before { content: "\f855"; } +.fa-border-top-left::before { content: "\f853"; } +.fa-bore-hole::before { content: "\e4c3"; } +.fa-bottle-baby::before { content: "\e673"; } +.fa-bottle-droplet::before { content: "\e4c4"; } +.fa-bottle-water::before { content: "\e4c5"; } +.fa-bow-arrow::before { content: "\f6b9"; } +.fa-bowl-chopsticks::before { content: "\e2e9"; } +.fa-bowl-chopsticks-noodles::before { content: "\e2ea"; } +.fa-bowl-food::before { content: "\e4c6"; } +.fa-bowl-hot::before { content: "\f823"; } +.fa-bowl-rice::before { content: "\e2eb"; } +.fa-bowl-salad::before { content: "\f81e"; } +.fa-bowl-scoop::before { content: "\e3de"; } +.fa-bowl-scoops::before { content: "\e3df"; } +.fa-bowl-shaved-ice::before { content: "\e3de"; } +.fa-bowl-soft-serve::before { content: "\e46b"; } +.fa-bowl-spoon::before { content: "\e3e0"; } +.fa-bowling-ball::before { content: "\f436"; } +.fa-bowling-ball-pin::before { content: "\e0c3"; } +.fa-bowling-pins::before { content: "\f437"; } +.fa-box::before { content: "\f466"; } +.fa-box-alt::before { content: "\f49a"; } +.fa-box-archive::before { content: "\f187"; } +.fa-box-ballot::before { content: "\f735"; } +.fa-box-check::before { content: "\f467"; } +.fa-box-circle-check::before { content: "\e0c4"; } +.fa-box-dollar::before { content: "\f4a0"; } +.fa-box-fragile::before { content: "\f49b"; } +.fa-box-full::before { content: "\f49c"; } +.fa-box-heart::before { content: "\f49d"; } +.fa-box-open::before { content: "\f49e"; } +.fa-box-open-full::before { content: "\f49c"; } +.fa-box-taped::before { content: "\f49a"; } +.fa-box-tissue::before { content: "\e05b"; } +.fa-box-up::before { content: "\f49f"; } +.fa-box-usd::before { content: "\f4a0"; } +.fa-boxes::before { content: "\f468"; } +.fa-boxes-alt::before { content: "\f468"; } +.fa-boxes-packing::before { content: "\e4c7"; } +.fa-boxes-stacked::before { content: "\f468"; } +.fa-boxing-glove::before { content: "\f438"; } +.fa-bracket::before { content: "\5b"; } +.fa-bracket-curly::before { content: "\7b"; } +.fa-bracket-curly-left::before { content: "\7b"; } +.fa-bracket-curly-right::before { content: "\7d"; } +.fa-bracket-left::before { content: "\5b"; } +.fa-bracket-round::before { content: "\28"; } +.fa-bracket-round-right::before { content: "\29"; } +.fa-bracket-square::before { content: "\5b"; } +.fa-bracket-square-right::before { content: "\5d"; } +.fa-brackets::before { content: "\f7e9"; } +.fa-brackets-curly::before { content: "\f7ea"; } +.fa-brackets-round::before { content: "\e0c5"; } +.fa-brackets-square::before { content: "\f7e9"; } +.fa-braille::before { content: "\f2a1"; } +.fa-brain::before { content: "\f5dc"; } +.fa-brain-arrow-curved-right::before { content: "\f677"; } +.fa-brain-circuit::before { content: "\e0c6"; } +.fa-brake-warning::before { content: "\e0c7"; } +.fa-brazilian-real-sign::before { content: "\e46c"; } +.fa-bread-loaf::before { content: "\f7eb"; } +.fa-bread-slice::before { content: "\f7ec"; } +.fa-bread-slice-butter::before { content: "\e3e1"; } +.fa-bridge::before { content: "\e4c8"; } +.fa-bridge-circle-check::before { content: "\e4c9"; } +.fa-bridge-circle-exclamation::before { content: "\e4ca"; } +.fa-bridge-circle-xmark::before { content: "\e4cb"; } +.fa-bridge-lock::before { content: "\e4cc"; } +.fa-bridge-suspension::before { content: "\e4cd"; } +.fa-bridge-water::before { content: "\e4ce"; } +.fa-briefcase::before { content: "\f0b1"; } +.fa-briefcase-arrow-right::before { content: "\e2f2"; } +.fa-briefcase-blank::before { content: "\e0c8"; } +.fa-briefcase-clock::before { content: "\f64a"; } +.fa-briefcase-medical::before { content: "\f469"; } +.fa-brightness::before { content: "\e0c9"; } +.fa-brightness-low::before { content: "\e0ca"; } +.fa-bring-forward::before { content: "\f856"; } +.fa-bring-front::before { content: "\f857"; } +.fa-broadcast-tower::before { content: "\f519"; } +.fa-broccoli::before { content: "\e3e2"; } +.fa-broom::before { content: "\f51a"; } +.fa-broom-ball::before { content: "\f458"; } +.fa-broom-wide::before { content: "\e5d1"; } +.fa-browser::before { content: "\f37e"; } +.fa-browsers::before { content: "\e0cb"; } +.fa-brush::before { content: "\f55d"; } +.fa-bucket::before { content: "\e4cf"; } +.fa-bug::before { content: "\f188"; } +.fa-bug-slash::before { content: "\e490"; } +.fa-bugs::before { content: "\e4d0"; } +.fa-building::before { content: "\f1ad"; } +.fa-building-circle-arrow-right::before { content: "\e4d1"; } +.fa-building-circle-check::before { content: "\e4d2"; } +.fa-building-circle-exclamation::before { content: "\e4d3"; } +.fa-building-circle-xmark::before { content: "\e4d4"; } +.fa-building-columns::before { content: "\f19c"; } +.fa-building-flag::before { content: "\e4d5"; } +.fa-building-lock::before { content: "\e4d6"; } +.fa-building-magnifying-glass::before { content: "\e61c"; } +.fa-building-memo::before { content: "\e61e"; } +.fa-building-ngo::before { content: "\e4d7"; } +.fa-building-shield::before { content: "\e4d8"; } +.fa-building-un::before { content: "\e4d9"; } +.fa-building-user::before { content: "\e4da"; } +.fa-building-wheat::before { content: "\e4db"; } +.fa-buildings::before { content: "\e0cc"; } +.fa-bulldozer::before { content: "\e655"; } +.fa-bullhorn::before { content: "\f0a1"; } +.fa-bullseye::before { content: "\f140"; } +.fa-bullseye-arrow::before { content: "\f648"; } +.fa-bullseye-pointer::before { content: "\f649"; } +.fa-buoy::before { content: "\e5b5"; } +.fa-buoy-mooring::before { content: "\e5b6"; } +.fa-burger::before { content: "\f805"; } +.fa-burger-cheese::before { content: "\f7f1"; } +.fa-burger-fries::before { content: "\e0cd"; } +.fa-burger-glass::before { content: "\e0ce"; } +.fa-burger-lettuce::before { content: "\e3e3"; } +.fa-burger-soda::before { content: "\f858"; } +.fa-burn::before { content: "\f46a"; } +.fa-burrito::before { content: "\f7ed"; } +.fa-burst::before { content: "\e4dc"; } +.fa-bus::before { content: "\f207"; } +.fa-bus-alt::before { content: "\f55e"; } +.fa-bus-school::before { content: "\f5dd"; } +.fa-bus-simple::before { content: "\f55e"; } +.fa-business-front::before { content: "\e45c"; } +.fa-business-time::before { content: "\f64a"; } +.fa-butter::before { content: "\e3e4"; } +.fa-c::before { content: "\43"; } +.fa-cab::before { content: "\f1ba"; } +.fa-cabin::before { content: "\e46d"; } +.fa-cabinet-filing::before { content: "\f64b"; } +.fa-cable-car::before { content: "\f7da"; } +.fa-cactus::before { content: "\f8a7"; } +.fa-caduceus::before { content: "\e681"; } +.fa-cake::before { content: "\f1fd"; } +.fa-cake-candles::before { content: "\f1fd"; } +.fa-cake-slice::before { content: "\e3e5"; } +.fa-calculator::before { content: "\f1ec"; } +.fa-calculator-alt::before { content: "\f64c"; } +.fa-calculator-simple::before { content: "\f64c"; } +.fa-calendar::before { content: "\f133"; } +.fa-calendar-alt::before { content: "\f073"; } +.fa-calendar-arrow-down::before { content: "\e0d0"; } +.fa-calendar-arrow-up::before { content: "\e0d1"; } +.fa-calendar-check::before { content: "\f274"; } +.fa-calendar-circle::before { content: "\e102"; } +.fa-calendar-circle-exclamation::before { content: "\e46e"; } +.fa-calendar-circle-minus::before { content: "\e46f"; } +.fa-calendar-circle-plus::before { content: "\e470"; } +.fa-calendar-circle-user::before { content: "\e471"; } +.fa-calendar-clock::before { content: "\e0d2"; } +.fa-calendar-day::before { content: "\f783"; } +.fa-calendar-days::before { content: "\f073"; } +.fa-calendar-download::before { content: "\e0d0"; } +.fa-calendar-edit::before { content: "\f333"; } +.fa-calendar-exclamation::before { content: "\f334"; } +.fa-calendar-heart::before { content: "\e0d3"; } +.fa-calendar-image::before { content: "\e0d4"; } +.fa-calendar-lines::before { content: "\e0d5"; } +.fa-calendar-lines-pen::before { content: "\e472"; } +.fa-calendar-minus::before { content: "\f272"; } +.fa-calendar-note::before { content: "\e0d5"; } +.fa-calendar-pen::before { content: "\f333"; } +.fa-calendar-plus::before { content: "\f271"; } +.fa-calendar-range::before { content: "\e0d6"; } +.fa-calendar-star::before { content: "\f736"; } +.fa-calendar-time::before { content: "\e0d2"; } +.fa-calendar-times::before { content: "\f273"; } +.fa-calendar-upload::before { content: "\e0d1"; } +.fa-calendar-users::before { content: "\e5e2"; } +.fa-calendar-week::before { content: "\f784"; } +.fa-calendar-xmark::before { content: "\f273"; } +.fa-calendars::before { content: "\e0d7"; } +.fa-camcorder::before { content: "\f8a8"; } +.fa-camera::before { content: "\f030"; } +.fa-camera-alt::before { content: "\f030"; } +.fa-camera-cctv::before { content: "\f8ac"; } +.fa-camera-circle::before { content: "\e103"; } +.fa-camera-home::before { content: "\f8fe"; } +.fa-camera-movie::before { content: "\f8a9"; } +.fa-camera-polaroid::before { content: "\f8aa"; } +.fa-camera-retro::before { content: "\f083"; } +.fa-camera-rotate::before { content: "\e0d8"; } +.fa-camera-security::before { content: "\f8fe"; } +.fa-camera-slash::before { content: "\e0d9"; } +.fa-camera-viewfinder::before { content: "\e0da"; } +.fa-camera-web::before { content: "\f832"; } +.fa-camera-web-slash::before { content: "\f833"; } +.fa-campfire::before { content: "\f6ba"; } +.fa-campground::before { content: "\f6bb"; } +.fa-can-food::before { content: "\e3e6"; } +.fa-cancel::before { content: "\f05e"; } +.fa-candle-holder::before { content: "\f6bc"; } +.fa-candy::before { content: "\e3e7"; } +.fa-candy-bar::before { content: "\e3e8"; } +.fa-candy-cane::before { content: "\f786"; } +.fa-candy-corn::before { content: "\f6bd"; } +.fa-cannabis::before { content: "\f55f"; } +.fa-cannon::before { content: "\e642"; } +.fa-capsules::before { content: "\f46b"; } +.fa-car::before { content: "\f1b9"; } +.fa-car-alt::before { content: "\f5de"; } +.fa-car-battery::before { content: "\f5df"; } +.fa-car-bolt::before { content: "\e341"; } +.fa-car-building::before { content: "\f859"; } +.fa-car-bump::before { content: "\f5e0"; } +.fa-car-burst::before { content: "\f5e1"; } +.fa-car-bus::before { content: "\f85a"; } +.fa-car-circle-bolt::before { content: "\e342"; } +.fa-car-crash::before { content: "\f5e1"; } +.fa-car-garage::before { content: "\f5e2"; } +.fa-car-mechanic::before { content: "\f5e3"; } +.fa-car-mirrors::before { content: "\e343"; } +.fa-car-on::before { content: "\e4dd"; } +.fa-car-rear::before { content: "\f5de"; } +.fa-car-side::before { content: "\f5e4"; } +.fa-car-side-bolt::before { content: "\e344"; } +.fa-car-tilt::before { content: "\f5e5"; } +.fa-car-tunnel::before { content: "\e4de"; } +.fa-car-wash::before { content: "\f5e6"; } +.fa-car-wrench::before { content: "\f5e3"; } +.fa-caravan::before { content: "\f8ff"; } +.fa-caravan-alt::before { content: "\e000"; } +.fa-caravan-simple::before { content: "\e000"; } +.fa-card-club::before { content: "\e3e9"; } +.fa-card-diamond::before { content: "\e3ea"; } +.fa-card-heart::before { content: "\e3eb"; } +.fa-card-spade::before { content: "\e3ec"; } +.fa-cards::before { content: "\e3ed"; } +.fa-cards-blank::before { content: "\e4df"; } +.fa-caret-circle-down::before { content: "\f32d"; } +.fa-caret-circle-left::before { content: "\f32e"; } +.fa-caret-circle-right::before { content: "\f330"; } +.fa-caret-circle-up::before { content: "\f331"; } +.fa-caret-down::before { content: "\f0d7"; } +.fa-caret-left::before { content: "\f0d9"; } +.fa-caret-right::before { content: "\f0da"; } +.fa-caret-square-down::before { content: "\f150"; } +.fa-caret-square-left::before { content: "\f191"; } +.fa-caret-square-right::before { content: "\f152"; } +.fa-caret-square-up::before { content: "\f151"; } +.fa-caret-up::before { content: "\f0d8"; } +.fa-carriage-baby::before { content: "\f77d"; } +.fa-carrot::before { content: "\f787"; } +.fa-cars::before { content: "\f85b"; } +.fa-cart-arrow-down::before { content: "\f218"; } +.fa-cart-arrow-up::before { content: "\e3ee"; } +.fa-cart-circle-arrow-down::before { content: "\e3ef"; } +.fa-cart-circle-arrow-up::before { content: "\e3f0"; } +.fa-cart-circle-check::before { content: "\e3f1"; } +.fa-cart-circle-exclamation::before { content: "\e3f2"; } +.fa-cart-circle-plus::before { content: "\e3f3"; } +.fa-cart-circle-xmark::before { content: "\e3f4"; } +.fa-cart-flatbed::before { content: "\f474"; } +.fa-cart-flatbed-boxes::before { content: "\f475"; } +.fa-cart-flatbed-empty::before { content: "\f476"; } +.fa-cart-flatbed-suitcase::before { content: "\f59d"; } +.fa-cart-minus::before { content: "\e0db"; } +.fa-cart-plus::before { content: "\f217"; } +.fa-cart-shopping::before { content: "\f07a"; } +.fa-cart-shopping-fast::before { content: "\e0dc"; } +.fa-cart-xmark::before { content: "\e0dd"; } +.fa-cash-register::before { content: "\f788"; } +.fa-cassette-betamax::before { content: "\f8a4"; } +.fa-cassette-tape::before { content: "\f8ab"; } +.fa-cassette-vhs::before { content: "\f8ec"; } +.fa-castle::before { content: "\e0de"; } +.fa-cat::before { content: "\f6be"; } +.fa-cat-space::before { content: "\e001"; } +.fa-cauldron::before { content: "\f6bf"; } +.fa-cctv::before { content: "\f8ac"; } +.fa-cedi-sign::before { content: "\e0df"; } +.fa-cent-sign::before { content: "\e3f5"; } +.fa-certificate::before { content: "\f0a3"; } +.fa-chain::before { content: "\f0c1"; } +.fa-chain-broken::before { content: "\f127"; } +.fa-chain-horizontal::before { content: "\e1cb"; } +.fa-chain-horizontal-slash::before { content: "\e1cc"; } +.fa-chain-slash::before { content: "\f127"; } +.fa-chair::before { content: "\f6c0"; } +.fa-chair-office::before { content: "\f6c1"; } +.fa-chalkboard::before { content: "\f51b"; } +.fa-chalkboard-teacher::before { content: "\f51c"; } +.fa-chalkboard-user::before { content: "\f51c"; } +.fa-champagne-glass::before { content: "\f79e"; } +.fa-champagne-glasses::before { content: "\f79f"; } +.fa-charging-station::before { content: "\f5e7"; } +.fa-chart-area::before { content: "\f1fe"; } +.fa-chart-bar::before { content: "\f080"; } +.fa-chart-bullet::before { content: "\e0e1"; } +.fa-chart-candlestick::before { content: "\e0e2"; } +.fa-chart-column::before { content: "\e0e3"; } +.fa-chart-gantt::before { content: "\e0e4"; } +.fa-chart-kanban::before { content: "\e64f"; } +.fa-chart-line::before { content: "\f201"; } +.fa-chart-line-down::before { content: "\f64d"; } +.fa-chart-line-up::before { content: "\e0e5"; } +.fa-chart-line-up-down::before { content: "\e5d7"; } +.fa-chart-mixed::before { content: "\f643"; } +.fa-chart-mixed-up-circle-currency::before { content: "\e5d8"; } +.fa-chart-mixed-up-circle-dollar::before { content: "\e5d9"; } +.fa-chart-network::before { content: "\f78a"; } +.fa-chart-pie::before { content: "\f200"; } +.fa-chart-pie-alt::before { content: "\f64e"; } +.fa-chart-pie-simple::before { content: "\f64e"; } +.fa-chart-pie-simple-circle-currency::before { content: "\e604"; } +.fa-chart-pie-simple-circle-dollar::before { content: "\e605"; } +.fa-chart-pyramid::before { content: "\e0e6"; } +.fa-chart-radar::before { content: "\e0e7"; } +.fa-chart-scatter::before { content: "\f7ee"; } +.fa-chart-scatter-3d::before { content: "\e0e8"; } +.fa-chart-scatter-bubble::before { content: "\e0e9"; } +.fa-chart-simple::before { content: "\e473"; } +.fa-chart-simple-horizontal::before { content: "\e474"; } +.fa-chart-tree-map::before { content: "\e0ea"; } +.fa-chart-user::before { content: "\f6a3"; } +.fa-chart-waterfall::before { content: "\e0eb"; } +.fa-check::before { content: "\f00c"; } +.fa-check-circle::before { content: "\f058"; } +.fa-check-double::before { content: "\f560"; } +.fa-check-square::before { content: "\f14a"; } +.fa-check-to-slot::before { content: "\f772"; } +.fa-cheese::before { content: "\f7ef"; } +.fa-cheese-swiss::before { content: "\f7f0"; } +.fa-cheeseburger::before { content: "\f7f1"; } +.fa-cherries::before { content: "\e0ec"; } +.fa-chess::before { content: "\f439"; } +.fa-chess-bishop::before { content: "\f43a"; } +.fa-chess-bishop-alt::before { content: "\f43b"; } +.fa-chess-bishop-piece::before { content: "\f43b"; } +.fa-chess-board::before { content: "\f43c"; } +.fa-chess-clock::before { content: "\f43d"; } +.fa-chess-clock-alt::before { content: "\f43e"; } +.fa-chess-clock-flip::before { content: "\f43e"; } +.fa-chess-king::before { content: "\f43f"; } +.fa-chess-king-alt::before { content: "\f440"; } +.fa-chess-king-piece::before { content: "\f440"; } +.fa-chess-knight::before { content: "\f441"; } +.fa-chess-knight-alt::before { content: "\f442"; } +.fa-chess-knight-piece::before { content: "\f442"; } +.fa-chess-pawn::before { content: "\f443"; } +.fa-chess-pawn-alt::before { content: "\f444"; } +.fa-chess-pawn-piece::before { content: "\f444"; } +.fa-chess-queen::before { content: "\f445"; } +.fa-chess-queen-alt::before { content: "\f446"; } +.fa-chess-queen-piece::before { content: "\f446"; } +.fa-chess-rook::before { content: "\f447"; } +.fa-chess-rook-alt::before { content: "\f448"; } +.fa-chess-rook-piece::before { content: "\f448"; } +.fa-chestnut::before { content: "\e3f6"; } +.fa-chevron-circle-down::before { content: "\f13a"; } +.fa-chevron-circle-left::before { content: "\f137"; } +.fa-chevron-circle-right::before { content: "\f138"; } +.fa-chevron-circle-up::before { content: "\f139"; } +.fa-chevron-double-down::before { content: "\f322"; } +.fa-chevron-double-left::before { content: "\f323"; } +.fa-chevron-double-right::before { content: "\f324"; } +.fa-chevron-double-up::before { content: "\f325"; } +.fa-chevron-down::before { content: "\f078"; } +.fa-chevron-left::before { content: "\f053"; } +.fa-chevron-right::before { content: "\f054"; } +.fa-chevron-square-down::before { content: "\f329"; } +.fa-chevron-square-left::before { content: "\f32a"; } +.fa-chevron-square-right::before { content: "\f32b"; } +.fa-chevron-square-up::before { content: "\f32c"; } +.fa-chevron-up::before { content: "\f077"; } +.fa-chevrons-down::before { content: "\f322"; } +.fa-chevrons-left::before { content: "\f323"; } +.fa-chevrons-right::before { content: "\f324"; } +.fa-chevrons-up::before { content: "\f325"; } +.fa-chf-sign::before { content: "\e602"; } +.fa-child::before { content: "\f1ae"; } +.fa-child-combatant::before { content: "\e4e0"; } +.fa-child-dress::before { content: "\e59c"; } +.fa-child-reaching::before { content: "\e59d"; } +.fa-child-rifle::before { content: "\e4e0"; } +.fa-children::before { content: "\e4e1"; } +.fa-chimney::before { content: "\f78b"; } +.fa-chocolate-bar::before { content: "\e3e8"; } +.fa-chopsticks::before { content: "\e3f7"; } +.fa-church::before { content: "\f51d"; } +.fa-circle::before { content: "\f111"; } +.fa-circle-0::before { content: "\e0ed"; } +.fa-circle-1::before { content: "\e0ee"; } +.fa-circle-2::before { content: "\e0ef"; } +.fa-circle-3::before { content: "\e0f0"; } +.fa-circle-4::before { content: "\e0f1"; } +.fa-circle-5::before { content: "\e0f2"; } +.fa-circle-6::before { content: "\e0f3"; } +.fa-circle-7::before { content: "\e0f4"; } +.fa-circle-8::before { content: "\e0f5"; } +.fa-circle-9::before { content: "\e0f6"; } +.fa-circle-a::before { content: "\e0f7"; } +.fa-circle-ampersand::before { content: "\e0f8"; } +.fa-circle-arrow-down::before { content: "\f0ab"; } +.fa-circle-arrow-down-left::before { content: "\e0f9"; } +.fa-circle-arrow-down-right::before { content: "\e0fa"; } +.fa-circle-arrow-left::before { content: "\f0a8"; } +.fa-circle-arrow-right::before { content: "\f0a9"; } +.fa-circle-arrow-up::before { content: "\f0aa"; } +.fa-circle-arrow-up-left::before { content: "\e0fb"; } +.fa-circle-arrow-up-right::before { content: "\e0fc"; } +.fa-circle-b::before { content: "\e0fd"; } +.fa-circle-bolt::before { content: "\e0fe"; } +.fa-circle-book-open::before { content: "\e0ff"; } +.fa-circle-bookmark::before { content: "\e100"; } +.fa-circle-c::before { content: "\e101"; } +.fa-circle-calendar::before { content: "\e102"; } +.fa-circle-camera::before { content: "\e103"; } +.fa-circle-caret-down::before { content: "\f32d"; } +.fa-circle-caret-left::before { content: "\f32e"; } +.fa-circle-caret-right::before { content: "\f330"; } +.fa-circle-caret-up::before { content: "\f331"; } +.fa-circle-check::before { content: "\f058"; } +.fa-circle-chevron-down::before { content: "\f13a"; } +.fa-circle-chevron-left::before { content: "\f137"; } +.fa-circle-chevron-right::before { content: "\f138"; } +.fa-circle-chevron-up::before { content: "\f139"; } +.fa-circle-d::before { content: "\e104"; } +.fa-circle-dashed::before { content: "\e105"; } +.fa-circle-divide::before { content: "\e106"; } +.fa-circle-dollar::before { content: "\f2e8"; } +.fa-circle-dollar-to-slot::before { content: "\f4b9"; } +.fa-circle-dot::before { content: "\f192"; } +.fa-circle-down::before { content: "\f358"; } +.fa-circle-down-left::before { content: "\e107"; } +.fa-circle-down-right::before { content: "\e108"; } +.fa-circle-e::before { content: "\e109"; } +.fa-circle-ellipsis::before { content: "\e10a"; } +.fa-circle-ellipsis-vertical::before { content: "\e10b"; } +.fa-circle-envelope::before { content: "\e10c"; } +.fa-circle-euro::before { content: "\e5ce"; } +.fa-circle-exclamation::before { content: "\f06a"; } +.fa-circle-exclamation-check::before { content: "\e10d"; } +.fa-circle-f::before { content: "\e10e"; } +.fa-circle-g::before { content: "\e10f"; } +.fa-circle-gf::before { content: "\e67f"; } +.fa-circle-h::before { content: "\f47e"; } +.fa-circle-half::before { content: "\e110"; } +.fa-circle-half-stroke::before { content: "\f042"; } +.fa-circle-heart::before { content: "\f4c7"; } +.fa-circle-i::before { content: "\e111"; } +.fa-circle-info::before { content: "\f05a"; } +.fa-circle-j::before { content: "\e112"; } +.fa-circle-k::before { content: "\e113"; } +.fa-circle-l::before { content: "\e114"; } +.fa-circle-left::before { content: "\f359"; } +.fa-circle-location-arrow::before { content: "\f602"; } +.fa-circle-m::before { content: "\e115"; } +.fa-circle-microphone::before { content: "\e116"; } +.fa-circle-microphone-lines::before { content: "\e117"; } +.fa-circle-minus::before { content: "\f056"; } +.fa-circle-n::before { content: "\e118"; } +.fa-circle-nodes::before { content: "\e4e2"; } +.fa-circle-notch::before { content: "\f1ce"; } +.fa-circle-o::before { content: "\e119"; } +.fa-circle-p::before { content: "\e11a"; } +.fa-circle-parking::before { content: "\f615"; } +.fa-circle-pause::before { content: "\f28b"; } +.fa-circle-phone::before { content: "\e11b"; } +.fa-circle-phone-flip::before { content: "\e11c"; } +.fa-circle-phone-hangup::before { content: "\e11d"; } +.fa-circle-play::before { content: "\f144"; } +.fa-circle-plus::before { content: "\f055"; } +.fa-circle-q::before { content: "\e11e"; } +.fa-circle-quarter::before { content: "\e11f"; } +.fa-circle-quarter-stroke::before { content: "\e5d3"; } +.fa-circle-quarters::before { content: "\e3f8"; } +.fa-circle-question::before { content: "\f059"; } +.fa-circle-r::before { content: "\e120"; } +.fa-circle-radiation::before { content: "\f7ba"; } +.fa-circle-right::before { content: "\f35a"; } +.fa-circle-s::before { content: "\e121"; } +.fa-circle-small::before { content: "\e122"; } +.fa-circle-sort::before { content: "\e030"; } +.fa-circle-sort-down::before { content: "\e031"; } +.fa-circle-sort-up::before { content: "\e032"; } +.fa-circle-star::before { content: "\e123"; } +.fa-circle-sterling::before { content: "\e5cf"; } +.fa-circle-stop::before { content: "\f28d"; } +.fa-circle-t::before { content: "\e124"; } +.fa-circle-three-quarters::before { content: "\e125"; } +.fa-circle-three-quarters-stroke::before { content: "\e5d4"; } +.fa-circle-trash::before { content: "\e126"; } +.fa-circle-u::before { content: "\e127"; } +.fa-circle-up::before { content: "\f35b"; } +.fa-circle-up-left::before { content: "\e128"; } +.fa-circle-up-right::before { content: "\e129"; } +.fa-circle-user::before { content: "\f2bd"; } +.fa-circle-v::before { content: "\e12a"; } +.fa-circle-video::before { content: "\e12b"; } +.fa-circle-w::before { content: "\e12c"; } +.fa-circle-waveform-lines::before { content: "\e12d"; } +.fa-circle-wifi::before { content: "\e67d"; } +.fa-circle-wifi-circle-wifi::before { content: "\e67e"; } +.fa-circle-wifi-group::before { content: "\e67e"; } +.fa-circle-x::before { content: "\e12e"; } +.fa-circle-xmark::before { content: "\f057"; } +.fa-circle-y::before { content: "\e12f"; } +.fa-circle-yen::before { content: "\e5d0"; } +.fa-circle-z::before { content: "\e130"; } +.fa-circles-overlap::before { content: "\e600"; } +.fa-citrus::before { content: "\e2f4"; } +.fa-citrus-slice::before { content: "\e2f5"; } +.fa-city::before { content: "\f64f"; } +.fa-clapperboard::before { content: "\e131"; } +.fa-clapperboard-play::before { content: "\e132"; } +.fa-clarinet::before { content: "\f8ad"; } +.fa-claw-marks::before { content: "\f6c2"; } +.fa-clinic-medical::before { content: "\f7f2"; } +.fa-clipboard::before { content: "\f328"; } +.fa-clipboard-check::before { content: "\f46c"; } +.fa-clipboard-list::before { content: "\f46d"; } +.fa-clipboard-list-check::before { content: "\f737"; } +.fa-clipboard-medical::before { content: "\e133"; } +.fa-clipboard-prescription::before { content: "\f5e8"; } +.fa-clipboard-question::before { content: "\e4e3"; } +.fa-clipboard-user::before { content: "\f7f3"; } +.fa-clock::before { content: "\f017"; } +.fa-clock-desk::before { content: "\e134"; } +.fa-clock-eight::before { content: "\e345"; } +.fa-clock-eight-thirty::before { content: "\e346"; } +.fa-clock-eleven::before { content: "\e347"; } +.fa-clock-eleven-thirty::before { content: "\e348"; } +.fa-clock-five::before { content: "\e349"; } +.fa-clock-five-thirty::before { content: "\e34a"; } +.fa-clock-four::before { content: "\f017"; } +.fa-clock-four-thirty::before { content: "\e34b"; } +.fa-clock-nine::before { content: "\e34c"; } +.fa-clock-nine-thirty::before { content: "\e34d"; } +.fa-clock-one::before { content: "\e34e"; } +.fa-clock-one-thirty::before { content: "\e34f"; } +.fa-clock-rotate-left::before { content: "\f1da"; } +.fa-clock-seven::before { content: "\e350"; } +.fa-clock-seven-thirty::before { content: "\e351"; } +.fa-clock-six::before { content: "\e352"; } +.fa-clock-six-thirty::before { content: "\e353"; } +.fa-clock-ten::before { content: "\e354"; } +.fa-clock-ten-thirty::before { content: "\e355"; } +.fa-clock-three::before { content: "\e356"; } +.fa-clock-three-thirty::before { content: "\e357"; } +.fa-clock-twelve::before { content: "\e358"; } +.fa-clock-twelve-thirty::before { content: "\e359"; } +.fa-clock-two::before { content: "\e35a"; } +.fa-clock-two-thirty::before { content: "\e35b"; } +.fa-clone::before { content: "\f24d"; } +.fa-close::before { content: "\f00d"; } +.fa-closed-captioning::before { content: "\f20a"; } +.fa-closed-captioning-slash::before { content: "\e135"; } +.fa-clothes-hanger::before { content: "\e136"; } +.fa-cloud::before { content: "\f0c2"; } +.fa-cloud-arrow-down::before { content: "\f0ed"; } +.fa-cloud-arrow-up::before { content: "\f0ee"; } +.fa-cloud-binary::before { content: "\e601"; } +.fa-cloud-bolt::before { content: "\f76c"; } +.fa-cloud-bolt-moon::before { content: "\f76d"; } +.fa-cloud-bolt-sun::before { content: "\f76e"; } +.fa-cloud-check::before { content: "\e35c"; } +.fa-cloud-download::before { content: "\f0ed"; } +.fa-cloud-download-alt::before { content: "\f0ed"; } +.fa-cloud-drizzle::before { content: "\f738"; } +.fa-cloud-exclamation::before { content: "\e491"; } +.fa-cloud-fog::before { content: "\f74e"; } +.fa-cloud-hail::before { content: "\f739"; } +.fa-cloud-hail-mixed::before { content: "\f73a"; } +.fa-cloud-meatball::before { content: "\f73b"; } +.fa-cloud-minus::before { content: "\e35d"; } +.fa-cloud-moon::before { content: "\f6c3"; } +.fa-cloud-moon-rain::before { content: "\f73c"; } +.fa-cloud-music::before { content: "\f8ae"; } +.fa-cloud-plus::before { content: "\e35e"; } +.fa-cloud-question::before { content: "\e492"; } +.fa-cloud-rain::before { content: "\f73d"; } +.fa-cloud-rainbow::before { content: "\f73e"; } +.fa-cloud-showers::before { content: "\f73f"; } +.fa-cloud-showers-heavy::before { content: "\f740"; } +.fa-cloud-showers-water::before { content: "\e4e4"; } +.fa-cloud-slash::before { content: "\e137"; } +.fa-cloud-sleet::before { content: "\f741"; } +.fa-cloud-snow::before { content: "\f742"; } +.fa-cloud-sun::before { content: "\f6c4"; } +.fa-cloud-sun-rain::before { content: "\f743"; } +.fa-cloud-upload::before { content: "\f0ee"; } +.fa-cloud-upload-alt::before { content: "\f0ee"; } +.fa-cloud-word::before { content: "\e138"; } +.fa-cloud-xmark::before { content: "\e35f"; } +.fa-clouds::before { content: "\f744"; } +.fa-clouds-moon::before { content: "\f745"; } +.fa-clouds-sun::before { content: "\f746"; } +.fa-clover::before { content: "\e139"; } +.fa-club::before { content: "\f327"; } +.fa-cny::before { content: "\f157"; } +.fa-cocktail::before { content: "\f561"; } +.fa-coconut::before { content: "\e2f6"; } +.fa-code::before { content: "\f121"; } +.fa-code-branch::before { content: "\f126"; } +.fa-code-commit::before { content: "\f386"; } +.fa-code-compare::before { content: "\e13a"; } +.fa-code-fork::before { content: "\e13b"; } +.fa-code-merge::before { content: "\f387"; } +.fa-code-pull-request::before { content: "\e13c"; } +.fa-code-pull-request-closed::before { content: "\e3f9"; } +.fa-code-pull-request-draft::before { content: "\e3fa"; } +.fa-code-simple::before { content: "\e13d"; } +.fa-coffee::before { content: "\f0f4"; } +.fa-coffee-bean::before { content: "\e13e"; } +.fa-coffee-beans::before { content: "\e13f"; } +.fa-coffee-pot::before { content: "\e002"; } +.fa-coffee-togo::before { content: "\f6c5"; } +.fa-coffin::before { content: "\f6c6"; } +.fa-coffin-cross::before { content: "\e051"; } +.fa-cog::before { content: "\f013"; } +.fa-cogs::before { content: "\f085"; } +.fa-coin::before { content: "\f85c"; } +.fa-coin-blank::before { content: "\e3fb"; } +.fa-coin-front::before { content: "\e3fc"; } +.fa-coin-vertical::before { content: "\e3fd"; } +.fa-coins::before { content: "\f51e"; } +.fa-colon::before { content: "\3a"; } +.fa-colon-sign::before { content: "\e140"; } +.fa-columns::before { content: "\f0db"; } +.fa-columns-3::before { content: "\e361"; } +.fa-comet::before { content: "\e003"; } +.fa-comma::before { content: "\2c"; } +.fa-command::before { content: "\e142"; } +.fa-comment::before { content: "\f075"; } +.fa-comment-alt::before { content: "\f27a"; } +.fa-comment-alt-arrow-down::before { content: "\e1db"; } +.fa-comment-alt-arrow-up::before { content: "\e1dc"; } +.fa-comment-alt-captions::before { content: "\e1de"; } +.fa-comment-alt-check::before { content: "\f4a2"; } +.fa-comment-alt-dollar::before { content: "\f650"; } +.fa-comment-alt-dots::before { content: "\f4a3"; } +.fa-comment-alt-edit::before { content: "\f4a4"; } +.fa-comment-alt-exclamation::before { content: "\f4a5"; } +.fa-comment-alt-image::before { content: "\e1e0"; } +.fa-comment-alt-lines::before { content: "\f4a6"; } +.fa-comment-alt-medical::before { content: "\f7f4"; } +.fa-comment-alt-minus::before { content: "\f4a7"; } +.fa-comment-alt-music::before { content: "\f8af"; } +.fa-comment-alt-plus::before { content: "\f4a8"; } +.fa-comment-alt-quote::before { content: "\e1e4"; } +.fa-comment-alt-slash::before { content: "\f4a9"; } +.fa-comment-alt-smile::before { content: "\f4aa"; } +.fa-comment-alt-text::before { content: "\e1e6"; } +.fa-comment-alt-times::before { content: "\f4ab"; } +.fa-comment-arrow-down::before { content: "\e143"; } +.fa-comment-arrow-up::before { content: "\e144"; } +.fa-comment-arrow-up-right::before { content: "\e145"; } +.fa-comment-captions::before { content: "\e146"; } +.fa-comment-check::before { content: "\f4ac"; } +.fa-comment-code::before { content: "\e147"; } +.fa-comment-dollar::before { content: "\f651"; } +.fa-comment-dots::before { content: "\f4ad"; } +.fa-comment-edit::before { content: "\f4ae"; } +.fa-comment-exclamation::before { content: "\f4af"; } +.fa-comment-heart::before { content: "\e5c8"; } +.fa-comment-image::before { content: "\e148"; } +.fa-comment-lines::before { content: "\f4b0"; } +.fa-comment-medical::before { content: "\f7f5"; } +.fa-comment-middle::before { content: "\e149"; } +.fa-comment-middle-alt::before { content: "\e1e1"; } +.fa-comment-middle-top::before { content: "\e14a"; } +.fa-comment-middle-top-alt::before { content: "\e1e2"; } +.fa-comment-minus::before { content: "\f4b1"; } +.fa-comment-music::before { content: "\f8b0"; } +.fa-comment-pen::before { content: "\f4ae"; } +.fa-comment-plus::before { content: "\f4b2"; } +.fa-comment-question::before { content: "\e14b"; } +.fa-comment-quote::before { content: "\e14c"; } +.fa-comment-slash::before { content: "\f4b3"; } +.fa-comment-smile::before { content: "\f4b4"; } +.fa-comment-sms::before { content: "\f7cd"; } +.fa-comment-text::before { content: "\e14d"; } +.fa-comment-times::before { content: "\f4b5"; } +.fa-comment-xmark::before { content: "\f4b5"; } +.fa-commenting::before { content: "\f4ad"; } +.fa-comments::before { content: "\f086"; } +.fa-comments-alt::before { content: "\f4b6"; } +.fa-comments-alt-dollar::before { content: "\f652"; } +.fa-comments-dollar::before { content: "\f653"; } +.fa-comments-question::before { content: "\e14e"; } +.fa-comments-question-check::before { content: "\e14f"; } +.fa-compact-disc::before { content: "\f51f"; } +.fa-compass::before { content: "\f14e"; } +.fa-compass-drafting::before { content: "\f568"; } +.fa-compass-slash::before { content: "\f5e9"; } +.fa-compress::before { content: "\f066"; } +.fa-compress-alt::before { content: "\f422"; } +.fa-compress-arrows::before { content: "\e0a5"; } +.fa-compress-arrows-alt::before { content: "\f78c"; } +.fa-compress-wide::before { content: "\f326"; } +.fa-computer::before { content: "\e4e5"; } +.fa-computer-classic::before { content: "\f8b1"; } +.fa-computer-mouse::before { content: "\f8cc"; } +.fa-computer-mouse-scrollwheel::before { content: "\f8cd"; } +.fa-computer-speaker::before { content: "\f8b2"; } +.fa-concierge-bell::before { content: "\f562"; } +.fa-construction::before { content: "\f85d"; } +.fa-contact-book::before { content: "\f2b9"; } +.fa-contact-card::before { content: "\f2bb"; } +.fa-container-storage::before { content: "\f4b7"; } +.fa-conveyor-belt::before { content: "\f46e"; } +.fa-conveyor-belt-alt::before { content: "\f46f"; } +.fa-conveyor-belt-arm::before { content: "\e5f8"; } +.fa-conveyor-belt-boxes::before { content: "\f46f"; } +.fa-conveyor-belt-empty::before { content: "\e150"; } +.fa-cookie::before { content: "\f563"; } +.fa-cookie-bite::before { content: "\f564"; } +.fa-copy::before { content: "\f0c5"; } +.fa-copyright::before { content: "\f1f9"; } +.fa-corn::before { content: "\f6c7"; } +.fa-corner::before { content: "\e3fe"; } +.fa-couch::before { content: "\f4b8"; } +.fa-couch-small::before { content: "\f4cc"; } +.fa-court-sport::before { content: "\e643"; } +.fa-cow::before { content: "\f6c8"; } +.fa-cowbell::before { content: "\f8b3"; } +.fa-cowbell-circle-plus::before { content: "\f8b4"; } +.fa-cowbell-more::before { content: "\f8b4"; } +.fa-crab::before { content: "\e3ff"; } +.fa-crate-apple::before { content: "\f6b1"; } +.fa-crate-empty::before { content: "\e151"; } +.fa-credit-card::before { content: "\f09d"; } +.fa-credit-card-alt::before { content: "\f09d"; } +.fa-credit-card-blank::before { content: "\f389"; } +.fa-credit-card-front::before { content: "\f38a"; } +.fa-creemee::before { content: "\e400"; } +.fa-cricket::before { content: "\f449"; } +.fa-cricket-bat-ball::before { content: "\f449"; } +.fa-croissant::before { content: "\f7f6"; } +.fa-crop::before { content: "\f125"; } +.fa-crop-alt::before { content: "\f565"; } +.fa-crop-simple::before { content: "\f565"; } +.fa-cross::before { content: "\f654"; } +.fa-crosshairs::before { content: "\f05b"; } +.fa-crosshairs-simple::before { content: "\e59f"; } +.fa-crow::before { content: "\f520"; } +.fa-crown::before { content: "\f521"; } +.fa-crutch::before { content: "\f7f7"; } +.fa-crutches::before { content: "\f7f8"; } +.fa-cruzeiro-sign::before { content: "\e152"; } +.fa-crystal-ball::before { content: "\e362"; } +.fa-cube::before { content: "\f1b2"; } +.fa-cubes::before { content: "\f1b3"; } +.fa-cubes-stacked::before { content: "\e4e6"; } +.fa-cucumber::before { content: "\e401"; } +.fa-cup-straw::before { content: "\e363"; } +.fa-cup-straw-swoosh::before { content: "\e364"; } +.fa-cup-togo::before { content: "\f6c5"; } +.fa-cupcake::before { content: "\e402"; } +.fa-curling::before { content: "\f44a"; } +.fa-curling-stone::before { content: "\f44a"; } +.fa-custard::before { content: "\e403"; } +.fa-cut::before { content: "\f0c4"; } +.fa-cutlery::before { content: "\f2e7"; } +.fa-d::before { content: "\44"; } +.fa-dagger::before { content: "\f6cb"; } +.fa-dash::before { content: "\e404"; } +.fa-dashboard::before { content: "\f624"; } +.fa-database::before { content: "\f1c0"; } +.fa-deaf::before { content: "\f2a4"; } +.fa-deafness::before { content: "\f2a4"; } +.fa-debug::before { content: "\f7f9"; } +.fa-dedent::before { content: "\f03b"; } +.fa-deer::before { content: "\f78e"; } +.fa-deer-rudolph::before { content: "\f78f"; } +.fa-delete-left::before { content: "\f55a"; } +.fa-delete-right::before { content: "\e154"; } +.fa-democrat::before { content: "\f747"; } +.fa-desktop::before { content: "\f390"; } +.fa-desktop-alt::before { content: "\f390"; } +.fa-desktop-arrow-down::before { content: "\e155"; } +.fa-desktop-code::before { content: "\e165"; } +.fa-desktop-medical::before { content: "\e166"; } +.fa-desktop-slash::before { content: "\e2fa"; } +.fa-dewpoint::before { content: "\f748"; } +.fa-dharmachakra::before { content: "\f655"; } +.fa-diagnoses::before { content: "\f470"; } +.fa-diagram-cells::before { content: "\e475"; } +.fa-diagram-lean-canvas::before { content: "\e156"; } +.fa-diagram-nested::before { content: "\e157"; } +.fa-diagram-next::before { content: "\e476"; } +.fa-diagram-predecessor::before { content: "\e477"; } +.fa-diagram-previous::before { content: "\e478"; } +.fa-diagram-project::before { content: "\f542"; } +.fa-diagram-sankey::before { content: "\e158"; } +.fa-diagram-subtask::before { content: "\e479"; } +.fa-diagram-successor::before { content: "\e47a"; } +.fa-diagram-venn::before { content: "\e15a"; } +.fa-dial::before { content: "\e15b"; } +.fa-dial-high::before { content: "\e15c"; } +.fa-dial-low::before { content: "\e15d"; } +.fa-dial-max::before { content: "\e15e"; } +.fa-dial-med::before { content: "\e15f"; } +.fa-dial-med-high::before { content: "\e15b"; } +.fa-dial-med-low::before { content: "\e160"; } +.fa-dial-min::before { content: "\e161"; } +.fa-dial-off::before { content: "\e162"; } +.fa-diamond::before { content: "\f219"; } +.fa-diamond-exclamation::before { content: "\e405"; } +.fa-diamond-half::before { content: "\e5b7"; } +.fa-diamond-half-stroke::before { content: "\e5b8"; } +.fa-diamond-turn-right::before { content: "\f5eb"; } +.fa-diamonds-4::before { content: "\e68b"; } +.fa-dice::before { content: "\f522"; } +.fa-dice-d10::before { content: "\f6cd"; } +.fa-dice-d12::before { content: "\f6ce"; } +.fa-dice-d20::before { content: "\f6cf"; } +.fa-dice-d4::before { content: "\f6d0"; } +.fa-dice-d6::before { content: "\f6d1"; } +.fa-dice-d8::before { content: "\f6d2"; } +.fa-dice-five::before { content: "\f523"; } +.fa-dice-four::before { content: "\f524"; } +.fa-dice-one::before { content: "\f525"; } +.fa-dice-six::before { content: "\f526"; } +.fa-dice-three::before { content: "\f527"; } +.fa-dice-two::before { content: "\f528"; } +.fa-digging::before { content: "\f85e"; } +.fa-digital-tachograph::before { content: "\f566"; } +.fa-dinosaur::before { content: "\e5fe"; } +.fa-diploma::before { content: "\f5ea"; } +.fa-directions::before { content: "\f5eb"; } +.fa-disc-drive::before { content: "\f8b5"; } +.fa-disease::before { content: "\f7fa"; } +.fa-display::before { content: "\e163"; } +.fa-display-arrow-down::before { content: "\e164"; } +.fa-display-chart-up::before { content: "\e5e3"; } +.fa-display-chart-up-circle-currency::before { content: "\e5e5"; } +.fa-display-chart-up-circle-dollar::before { content: "\e5e6"; } +.fa-display-code::before { content: "\e165"; } +.fa-display-medical::before { content: "\e166"; } +.fa-display-slash::before { content: "\e2fa"; } +.fa-distribute-spacing-horizontal::before { content: "\e365"; } +.fa-distribute-spacing-vertical::before { content: "\e366"; } +.fa-ditto::before { content: "\22"; } +.fa-divide::before { content: "\f529"; } +.fa-dizzy::before { content: "\f567"; } +.fa-dna::before { content: "\f471"; } +.fa-do-not-enter::before { content: "\f5ec"; } +.fa-dog::before { content: "\f6d3"; } +.fa-dog-leashed::before { content: "\f6d4"; } +.fa-dollar::before { content: "\24"; } +.fa-dollar-circle::before { content: "\f2e8"; } +.fa-dollar-sign::before { content: "\24"; } +.fa-dollar-square::before { content: "\f2e9"; } +.fa-dolly::before { content: "\f472"; } +.fa-dolly-box::before { content: "\f472"; } +.fa-dolly-empty::before { content: "\f473"; } +.fa-dolly-flatbed::before { content: "\f474"; } +.fa-dolly-flatbed-alt::before { content: "\f475"; } +.fa-dolly-flatbed-empty::before { content: "\f476"; } +.fa-dolphin::before { content: "\e168"; } +.fa-donate::before { content: "\f4b9"; } +.fa-dong-sign::before { content: "\e169"; } +.fa-donut::before { content: "\e406"; } +.fa-door-closed::before { content: "\f52a"; } +.fa-door-open::before { content: "\f52b"; } +.fa-dot-circle::before { content: "\f192"; } +.fa-doughnut::before { content: "\e406"; } +.fa-dove::before { content: "\f4ba"; } +.fa-down::before { content: "\f354"; } +.fa-down-from-bracket::before { content: "\e66b"; } +.fa-down-from-dotted-line::before { content: "\e407"; } +.fa-down-from-line::before { content: "\f349"; } +.fa-down-left::before { content: "\e16a"; } +.fa-down-left-and-up-right-to-center::before { content: "\f422"; } +.fa-down-long::before { content: "\f309"; } +.fa-down-right::before { content: "\e16b"; } +.fa-down-to-bracket::before { content: "\e4e7"; } +.fa-down-to-dotted-line::before { content: "\e408"; } +.fa-down-to-line::before { content: "\f34a"; } +.fa-download::before { content: "\f019"; } +.fa-drafting-compass::before { content: "\f568"; } +.fa-dragon::before { content: "\f6d5"; } +.fa-draw-circle::before { content: "\f5ed"; } +.fa-draw-polygon::before { content: "\f5ee"; } +.fa-draw-square::before { content: "\f5ef"; } +.fa-dreidel::before { content: "\f792"; } +.fa-drivers-license::before { content: "\f2c2"; } +.fa-drone::before { content: "\f85f"; } +.fa-drone-alt::before { content: "\f860"; } +.fa-drone-front::before { content: "\f860"; } +.fa-droplet::before { content: "\f043"; } +.fa-droplet-degree::before { content: "\f748"; } +.fa-droplet-percent::before { content: "\f750"; } +.fa-droplet-slash::before { content: "\f5c7"; } +.fa-drum::before { content: "\f569"; } +.fa-drum-steelpan::before { content: "\f56a"; } +.fa-drumstick::before { content: "\f6d6"; } +.fa-drumstick-bite::before { content: "\f6d7"; } +.fa-dryer::before { content: "\f861"; } +.fa-dryer-alt::before { content: "\f862"; } +.fa-dryer-heat::before { content: "\f862"; } +.fa-duck::before { content: "\f6d8"; } +.fa-dumbbell::before { content: "\f44b"; } +.fa-dumpster::before { content: "\f793"; } +.fa-dumpster-fire::before { content: "\f794"; } +.fa-dungeon::before { content: "\f6d9"; } +.fa-e::before { content: "\45"; } +.fa-ear::before { content: "\f5f0"; } +.fa-ear-deaf::before { content: "\f2a4"; } +.fa-ear-listen::before { content: "\f2a2"; } +.fa-ear-muffs::before { content: "\f795"; } +.fa-earth::before { content: "\f57d"; } +.fa-earth-africa::before { content: "\f57c"; } +.fa-earth-america::before { content: "\f57d"; } +.fa-earth-americas::before { content: "\f57d"; } +.fa-earth-asia::before { content: "\f57e"; } +.fa-earth-europe::before { content: "\f7a2"; } +.fa-earth-oceania::before { content: "\e47b"; } +.fa-eclipse::before { content: "\f749"; } +.fa-eclipse-alt::before { content: "\f74a"; } +.fa-edit::before { content: "\f044"; } +.fa-egg::before { content: "\f7fb"; } +.fa-egg-fried::before { content: "\f7fc"; } +.fa-eggplant::before { content: "\e16c"; } +.fa-eject::before { content: "\f052"; } +.fa-elephant::before { content: "\f6da"; } +.fa-elevator::before { content: "\e16d"; } +.fa-ellipsis::before { content: "\f141"; } +.fa-ellipsis-h::before { content: "\f141"; } +.fa-ellipsis-h-alt::before { content: "\f39b"; } +.fa-ellipsis-stroke::before { content: "\f39b"; } +.fa-ellipsis-stroke-vertical::before { content: "\f39c"; } +.fa-ellipsis-v::before { content: "\f142"; } +.fa-ellipsis-v-alt::before { content: "\f39c"; } +.fa-ellipsis-vertical::before { content: "\f142"; } +.fa-empty-set::before { content: "\f656"; } +.fa-engine::before { content: "\e16e"; } +.fa-engine-exclamation::before { content: "\f5f2"; } +.fa-engine-warning::before { content: "\f5f2"; } +.fa-envelope::before { content: "\f0e0"; } +.fa-envelope-badge::before { content: "\e16f"; } +.fa-envelope-circle::before { content: "\e10c"; } +.fa-envelope-circle-check::before { content: "\e4e8"; } +.fa-envelope-dot::before { content: "\e16f"; } +.fa-envelope-open::before { content: "\f2b6"; } +.fa-envelope-open-dollar::before { content: "\f657"; } +.fa-envelope-open-text::before { content: "\f658"; } +.fa-envelope-square::before { content: "\f199"; } +.fa-envelopes::before { content: "\e170"; } +.fa-envelopes-bulk::before { content: "\f674"; } +.fa-equals::before { content: "\3d"; } +.fa-eraser::before { content: "\f12d"; } +.fa-escalator::before { content: "\e171"; } +.fa-ethernet::before { content: "\f796"; } +.fa-eur::before { content: "\f153"; } +.fa-euro::before { content: "\f153"; } +.fa-euro-sign::before { content: "\f153"; } +.fa-excavator::before { content: "\e656"; } +.fa-exchange::before { content: "\f0ec"; } +.fa-exchange-alt::before { content: "\f362"; } +.fa-exclamation::before { content: "\21"; } +.fa-exclamation-circle::before { content: "\f06a"; } +.fa-exclamation-square::before { content: "\f321"; } +.fa-exclamation-triangle::before { content: "\f071"; } +.fa-expand::before { content: "\f065"; } +.fa-expand-alt::before { content: "\f424"; } +.fa-expand-arrows::before { content: "\f31d"; } +.fa-expand-arrows-alt::before { content: "\f31e"; } +.fa-expand-wide::before { content: "\f320"; } +.fa-exploding-head::before { content: "\e2fe"; } +.fa-explosion::before { content: "\e4e9"; } +.fa-external-link::before { content: "\f08e"; } +.fa-external-link-alt::before { content: "\f35d"; } +.fa-external-link-square::before { content: "\f14c"; } +.fa-external-link-square-alt::before { content: "\f360"; } +.fa-eye::before { content: "\f06e"; } +.fa-eye-dropper::before { content: "\f1fb"; } +.fa-eye-dropper-empty::before { content: "\f1fb"; } +.fa-eye-dropper-full::before { content: "\e172"; } +.fa-eye-dropper-half::before { content: "\e173"; } +.fa-eye-evil::before { content: "\f6db"; } +.fa-eye-low-vision::before { content: "\f2a8"; } +.fa-eye-slash::before { content: "\f070"; } +.fa-eyedropper::before { content: "\f1fb"; } +.fa-eyes::before { content: "\e367"; } +.fa-f::before { content: "\46"; } +.fa-face-angry::before { content: "\f556"; } +.fa-face-angry-horns::before { content: "\e368"; } +.fa-face-anguished::before { content: "\e369"; } +.fa-face-anxious-sweat::before { content: "\e36a"; } +.fa-face-astonished::before { content: "\e36b"; } +.fa-face-awesome::before { content: "\e409"; } +.fa-face-beam-hand-over-mouth::before { content: "\e47c"; } +.fa-face-clouds::before { content: "\e47d"; } +.fa-face-confounded::before { content: "\e36c"; } +.fa-face-confused::before { content: "\e36d"; } +.fa-face-cowboy-hat::before { content: "\e36e"; } +.fa-face-diagonal-mouth::before { content: "\e47e"; } +.fa-face-disappointed::before { content: "\e36f"; } +.fa-face-disguise::before { content: "\e370"; } +.fa-face-dizzy::before { content: "\f567"; } +.fa-face-dotted::before { content: "\e47f"; } +.fa-face-downcast-sweat::before { content: "\e371"; } +.fa-face-drooling::before { content: "\e372"; } +.fa-face-exhaling::before { content: "\e480"; } +.fa-face-explode::before { content: "\e2fe"; } +.fa-face-expressionless::before { content: "\e373"; } +.fa-face-eyes-xmarks::before { content: "\e374"; } +.fa-face-fearful::before { content: "\e375"; } +.fa-face-flushed::before { content: "\f579"; } +.fa-face-frown::before { content: "\f119"; } +.fa-face-frown-open::before { content: "\f57a"; } +.fa-face-frown-slight::before { content: "\e376"; } +.fa-face-glasses::before { content: "\e377"; } +.fa-face-grimace::before { content: "\f57f"; } +.fa-face-grin::before { content: "\f580"; } +.fa-face-grin-beam::before { content: "\f582"; } +.fa-face-grin-beam-sweat::before { content: "\f583"; } +.fa-face-grin-hearts::before { content: "\f584"; } +.fa-face-grin-squint::before { content: "\f585"; } +.fa-face-grin-squint-tears::before { content: "\f586"; } +.fa-face-grin-stars::before { content: "\f587"; } +.fa-face-grin-tears::before { content: "\f588"; } +.fa-face-grin-tongue::before { content: "\f589"; } +.fa-face-grin-tongue-squint::before { content: "\f58a"; } +.fa-face-grin-tongue-wink::before { content: "\f58b"; } +.fa-face-grin-wide::before { content: "\f581"; } +.fa-face-grin-wink::before { content: "\f58c"; } +.fa-face-hand-over-mouth::before { content: "\e378"; } +.fa-face-hand-peeking::before { content: "\e481"; } +.fa-face-hand-yawn::before { content: "\e379"; } +.fa-face-head-bandage::before { content: "\e37a"; } +.fa-face-holding-back-tears::before { content: "\e482"; } +.fa-face-hushed::before { content: "\e37b"; } +.fa-face-icicles::before { content: "\e37c"; } +.fa-face-kiss::before { content: "\f596"; } +.fa-face-kiss-beam::before { content: "\f597"; } +.fa-face-kiss-closed-eyes::before { content: "\e37d"; } +.fa-face-kiss-wink-heart::before { content: "\f598"; } +.fa-face-laugh::before { content: "\f599"; } +.fa-face-laugh-beam::before { content: "\f59a"; } +.fa-face-laugh-squint::before { content: "\f59b"; } +.fa-face-laugh-wink::before { content: "\f59c"; } +.fa-face-lying::before { content: "\e37e"; } +.fa-face-mask::before { content: "\e37f"; } +.fa-face-meh::before { content: "\f11a"; } +.fa-face-meh-blank::before { content: "\f5a4"; } +.fa-face-melting::before { content: "\e483"; } +.fa-face-monocle::before { content: "\e380"; } +.fa-face-nauseated::before { content: "\e381"; } +.fa-face-nose-steam::before { content: "\e382"; } +.fa-face-party::before { content: "\e383"; } +.fa-face-pensive::before { content: "\e384"; } +.fa-face-persevering::before { content: "\e385"; } +.fa-face-pleading::before { content: "\e386"; } +.fa-face-pouting::before { content: "\e387"; } +.fa-face-raised-eyebrow::before { content: "\e388"; } +.fa-face-relieved::before { content: "\e389"; } +.fa-face-rolling-eyes::before { content: "\f5a5"; } +.fa-face-sad-cry::before { content: "\f5b3"; } +.fa-face-sad-sweat::before { content: "\e38a"; } +.fa-face-sad-tear::before { content: "\f5b4"; } +.fa-face-saluting::before { content: "\e484"; } +.fa-face-scream::before { content: "\e38b"; } +.fa-face-shush::before { content: "\e38c"; } +.fa-face-sleeping::before { content: "\e38d"; } +.fa-face-sleepy::before { content: "\e38e"; } +.fa-face-smile::before { content: "\f118"; } +.fa-face-smile-beam::before { content: "\f5b8"; } +.fa-face-smile-halo::before { content: "\e38f"; } +.fa-face-smile-hearts::before { content: "\e390"; } +.fa-face-smile-horns::before { content: "\e391"; } +.fa-face-smile-plus::before { content: "\f5b9"; } +.fa-face-smile-relaxed::before { content: "\e392"; } +.fa-face-smile-tear::before { content: "\e393"; } +.fa-face-smile-tongue::before { content: "\e394"; } +.fa-face-smile-upside-down::before { content: "\e395"; } +.fa-face-smile-wink::before { content: "\f4da"; } +.fa-face-smiling-hands::before { content: "\e396"; } +.fa-face-smirking::before { content: "\e397"; } +.fa-face-spiral-eyes::before { content: "\e485"; } +.fa-face-sunglasses::before { content: "\e398"; } +.fa-face-surprise::before { content: "\f5c2"; } +.fa-face-swear::before { content: "\e399"; } +.fa-face-thermometer::before { content: "\e39a"; } +.fa-face-thinking::before { content: "\e39b"; } +.fa-face-tired::before { content: "\f5c8"; } +.fa-face-tissue::before { content: "\e39c"; } +.fa-face-tongue-money::before { content: "\e39d"; } +.fa-face-tongue-sweat::before { content: "\e39e"; } +.fa-face-unamused::before { content: "\e39f"; } +.fa-face-viewfinder::before { content: "\e2ff"; } +.fa-face-vomit::before { content: "\e3a0"; } +.fa-face-weary::before { content: "\e3a1"; } +.fa-face-woozy::before { content: "\e3a2"; } +.fa-face-worried::before { content: "\e3a3"; } +.fa-face-zany::before { content: "\e3a4"; } +.fa-face-zipper::before { content: "\e3a5"; } +.fa-falafel::before { content: "\e40a"; } +.fa-family::before { content: "\e300"; } +.fa-family-dress::before { content: "\e301"; } +.fa-family-pants::before { content: "\e302"; } +.fa-fan::before { content: "\f863"; } +.fa-fan-table::before { content: "\e004"; } +.fa-farm::before { content: "\f864"; } +.fa-fast-backward::before { content: "\f049"; } +.fa-fast-forward::before { content: "\f050"; } +.fa-faucet::before { content: "\e005"; } +.fa-faucet-drip::before { content: "\e006"; } +.fa-fax::before { content: "\f1ac"; } +.fa-feather::before { content: "\f52d"; } +.fa-feather-alt::before { content: "\f56b"; } +.fa-feather-pointed::before { content: "\f56b"; } +.fa-feed::before { content: "\f09e"; } +.fa-female::before { content: "\f182"; } +.fa-fence::before { content: "\e303"; } +.fa-ferris-wheel::before { content: "\e174"; } +.fa-ferry::before { content: "\e4ea"; } +.fa-field-hockey::before { content: "\f44c"; } +.fa-field-hockey-stick-ball::before { content: "\f44c"; } +.fa-fighter-jet::before { content: "\f0fb"; } +.fa-file::before { content: "\f15b"; } +.fa-file-alt::before { content: "\f15c"; } +.fa-file-archive::before { content: "\f1c6"; } +.fa-file-arrow-down::before { content: "\f56d"; } +.fa-file-arrow-up::before { content: "\f574"; } +.fa-file-audio::before { content: "\f1c7"; } +.fa-file-award::before { content: "\f5f3"; } +.fa-file-binary::before { content: "\e175"; } +.fa-file-cad::before { content: "\e672"; } +.fa-file-caret-down::before { content: "\e429"; } +.fa-file-caret-up::before { content: "\e42a"; } +.fa-file-certificate::before { content: "\f5f3"; } +.fa-file-chart-column::before { content: "\f659"; } +.fa-file-chart-line::before { content: "\f659"; } +.fa-file-chart-pie::before { content: "\f65a"; } +.fa-file-check::before { content: "\f316"; } +.fa-file-circle-check::before { content: "\e5a0"; } +.fa-file-circle-exclamation::before { content: "\e4eb"; } +.fa-file-circle-info::before { content: "\e493"; } +.fa-file-circle-minus::before { content: "\e4ed"; } +.fa-file-circle-plus::before { content: "\e494"; } +.fa-file-circle-question::before { content: "\e4ef"; } +.fa-file-circle-xmark::before { content: "\e5a1"; } +.fa-file-clipboard::before { content: "\f0ea"; } +.fa-file-code::before { content: "\f1c9"; } +.fa-file-contract::before { content: "\f56c"; } +.fa-file-csv::before { content: "\f6dd"; } +.fa-file-dashed-line::before { content: "\f877"; } +.fa-file-doc::before { content: "\e5ed"; } +.fa-file-download::before { content: "\f56d"; } +.fa-file-edit::before { content: "\f31c"; } +.fa-file-eps::before { content: "\e644"; } +.fa-file-excel::before { content: "\f1c3"; } +.fa-file-exclamation::before { content: "\f31a"; } +.fa-file-export::before { content: "\f56e"; } +.fa-file-gif::before { content: "\e645"; } +.fa-file-heart::before { content: "\e176"; } +.fa-file-image::before { content: "\f1c5"; } +.fa-file-import::before { content: "\f56f"; } +.fa-file-invoice::before { content: "\f570"; } +.fa-file-invoice-dollar::before { content: "\f571"; } +.fa-file-jpg::before { content: "\e646"; } +.fa-file-lines::before { content: "\f15c"; } +.fa-file-lock::before { content: "\e3a6"; } +.fa-file-magnifying-glass::before { content: "\f865"; } +.fa-file-medical::before { content: "\f477"; } +.fa-file-medical-alt::before { content: "\f478"; } +.fa-file-minus::before { content: "\f318"; } +.fa-file-mov::before { content: "\e647"; } +.fa-file-mp3::before { content: "\e648"; } +.fa-file-mp4::before { content: "\e649"; } +.fa-file-music::before { content: "\f8b6"; } +.fa-file-pdf::before { content: "\f1c1"; } +.fa-file-pen::before { content: "\f31c"; } +.fa-file-plus::before { content: "\f319"; } +.fa-file-plus-minus::before { content: "\e177"; } +.fa-file-png::before { content: "\e666"; } +.fa-file-powerpoint::before { content: "\f1c4"; } +.fa-file-ppt::before { content: "\e64a"; } +.fa-file-prescription::before { content: "\f572"; } +.fa-file-search::before { content: "\f865"; } +.fa-file-shield::before { content: "\e4f0"; } +.fa-file-signature::before { content: "\f573"; } +.fa-file-slash::before { content: "\e3a7"; } +.fa-file-spreadsheet::before { content: "\f65b"; } +.fa-file-svg::before { content: "\e64b"; } +.fa-file-text::before { content: "\f15c"; } +.fa-file-times::before { content: "\f317"; } +.fa-file-upload::before { content: "\f574"; } +.fa-file-user::before { content: "\f65c"; } +.fa-file-vector::before { content: "\e64c"; } +.fa-file-video::before { content: "\f1c8"; } +.fa-file-waveform::before { content: "\f478"; } +.fa-file-word::before { content: "\f1c2"; } +.fa-file-xls::before { content: "\e64d"; } +.fa-file-xmark::before { content: "\f317"; } +.fa-file-xml::before { content: "\e654"; } +.fa-file-zip::before { content: "\e5ee"; } +.fa-file-zipper::before { content: "\f1c6"; } +.fa-files::before { content: "\e178"; } +.fa-files-medical::before { content: "\f7fd"; } +.fa-fill::before { content: "\f575"; } +.fa-fill-drip::before { content: "\f576"; } +.fa-film::before { content: "\f008"; } +.fa-film-alt::before { content: "\f3a0"; } +.fa-film-canister::before { content: "\f8b7"; } +.fa-film-cannister::before { content: "\f8b7"; } +.fa-film-simple::before { content: "\f3a0"; } +.fa-film-slash::before { content: "\e179"; } +.fa-films::before { content: "\e17a"; } +.fa-filter::before { content: "\f0b0"; } +.fa-filter-circle-dollar::before { content: "\f662"; } +.fa-filter-circle-xmark::before { content: "\e17b"; } +.fa-filter-list::before { content: "\e17c"; } +.fa-filter-slash::before { content: "\e17d"; } +.fa-filters::before { content: "\e17e"; } +.fa-fingerprint::before { content: "\f577"; } +.fa-fire::before { content: "\f06d"; } +.fa-fire-alt::before { content: "\f7e4"; } +.fa-fire-burner::before { content: "\e4f1"; } +.fa-fire-extinguisher::before { content: "\f134"; } +.fa-fire-flame::before { content: "\f6df"; } +.fa-fire-flame-curved::before { content: "\f7e4"; } +.fa-fire-flame-simple::before { content: "\f46a"; } +.fa-fire-hydrant::before { content: "\e17f"; } +.fa-fire-smoke::before { content: "\f74b"; } +.fa-fireplace::before { content: "\f79a"; } +.fa-firewall::before { content: "\e3dc"; } +.fa-first-aid::before { content: "\f479"; } +.fa-fish::before { content: "\f578"; } +.fa-fish-bones::before { content: "\e304"; } +.fa-fish-cooked::before { content: "\f7fe"; } +.fa-fish-fins::before { content: "\e4f2"; } +.fa-fishing-rod::before { content: "\e3a8"; } +.fa-fist-raised::before { content: "\f6de"; } +.fa-flag::before { content: "\f024"; } +.fa-flag-alt::before { content: "\f74c"; } +.fa-flag-checkered::before { content: "\f11e"; } +.fa-flag-pennant::before { content: "\f456"; } +.fa-flag-swallowtail::before { content: "\f74c"; } +.fa-flag-usa::before { content: "\f74d"; } +.fa-flame::before { content: "\f6df"; } +.fa-flashlight::before { content: "\f8b8"; } +.fa-flask::before { content: "\f0c3"; } +.fa-flask-gear::before { content: "\e5f1"; } +.fa-flask-poison::before { content: "\f6e0"; } +.fa-flask-potion::before { content: "\f6e1"; } +.fa-flask-round-poison::before { content: "\f6e0"; } +.fa-flask-round-potion::before { content: "\f6e1"; } +.fa-flask-vial::before { content: "\e4f3"; } +.fa-flatbread::before { content: "\e40b"; } +.fa-flatbread-stuffed::before { content: "\e40c"; } +.fa-floppy-disk::before { content: "\f0c7"; } +.fa-floppy-disk-circle-arrow-right::before { content: "\e180"; } +.fa-floppy-disk-circle-xmark::before { content: "\e181"; } +.fa-floppy-disk-pen::before { content: "\e182"; } +.fa-floppy-disk-times::before { content: "\e181"; } +.fa-floppy-disks::before { content: "\e183"; } +.fa-florin-sign::before { content: "\e184"; } +.fa-flower::before { content: "\f7ff"; } +.fa-flower-daffodil::before { content: "\f800"; } +.fa-flower-tulip::before { content: "\f801"; } +.fa-flushed::before { content: "\f579"; } +.fa-flute::before { content: "\f8b9"; } +.fa-flux-capacitor::before { content: "\f8ba"; } +.fa-flying-disc::before { content: "\e3a9"; } +.fa-fog::before { content: "\f74e"; } +.fa-folder::before { content: "\f07b"; } +.fa-folder-arrow-down::before { content: "\e053"; } +.fa-folder-arrow-up::before { content: "\e054"; } +.fa-folder-blank::before { content: "\f07b"; } +.fa-folder-bookmark::before { content: "\e186"; } +.fa-folder-check::before { content: "\e64e"; } +.fa-folder-closed::before { content: "\e185"; } +.fa-folder-cog::before { content: "\e187"; } +.fa-folder-download::before { content: "\e053"; } +.fa-folder-gear::before { content: "\e187"; } +.fa-folder-grid::before { content: "\e188"; } +.fa-folder-heart::before { content: "\e189"; } +.fa-folder-image::before { content: "\e18a"; } +.fa-folder-magnifying-glass::before { content: "\e18b"; } +.fa-folder-medical::before { content: "\e18c"; } +.fa-folder-minus::before { content: "\f65d"; } +.fa-folder-music::before { content: "\e18d"; } +.fa-folder-open::before { content: "\f07c"; } +.fa-folder-plus::before { content: "\f65e"; } +.fa-folder-search::before { content: "\e18b"; } +.fa-folder-times::before { content: "\f65f"; } +.fa-folder-tree::before { content: "\f802"; } +.fa-folder-upload::before { content: "\e054"; } +.fa-folder-user::before { content: "\e18e"; } +.fa-folder-xmark::before { content: "\f65f"; } +.fa-folders::before { content: "\f660"; } +.fa-fondue-pot::before { content: "\e40d"; } +.fa-font::before { content: "\f031"; } +.fa-font-awesome::before { content: "\f2b4"; } +.fa-font-awesome-flag::before { content: "\f2b4"; } +.fa-font-awesome-logo-full::before { content: "\f2b4"; } +.fa-font-case::before { content: "\f866"; } +.fa-football::before { content: "\f44e"; } +.fa-football-ball::before { content: "\f44e"; } +.fa-football-helmet::before { content: "\f44f"; } +.fa-fork::before { content: "\f2e3"; } +.fa-fork-knife::before { content: "\f2e6"; } +.fa-forklift::before { content: "\f47a"; } +.fa-fort::before { content: "\e486"; } +.fa-forward::before { content: "\f04e"; } +.fa-forward-fast::before { content: "\f050"; } +.fa-forward-step::before { content: "\f051"; } +.fa-fragile::before { content: "\f4bb"; } +.fa-frame::before { content: "\e495"; } +.fa-franc-sign::before { content: "\e18f"; } +.fa-french-fries::before { content: "\f803"; } +.fa-frog::before { content: "\f52e"; } +.fa-frosty-head::before { content: "\f79b"; } +.fa-frown::before { content: "\f119"; } +.fa-frown-open::before { content: "\f57a"; } +.fa-function::before { content: "\f661"; } +.fa-funnel-dollar::before { content: "\f662"; } +.fa-futbol::before { content: "\f1e3"; } +.fa-futbol-ball::before { content: "\f1e3"; } +.fa-g::before { content: "\47"; } +.fa-galaxy::before { content: "\e008"; } +.fa-gallery-thumbnails::before { content: "\e3aa"; } +.fa-game-board::before { content: "\f867"; } +.fa-game-board-alt::before { content: "\f868"; } +.fa-game-board-simple::before { content: "\f868"; } +.fa-game-console-handheld::before { content: "\f8bb"; } +.fa-game-console-handheld-crank::before { content: "\e5b9"; } +.fa-gamepad::before { content: "\f11b"; } +.fa-gamepad-alt::before { content: "\e5a2"; } +.fa-gamepad-modern::before { content: "\e5a2"; } +.fa-garage::before { content: "\e009"; } +.fa-garage-car::before { content: "\e00a"; } +.fa-garage-open::before { content: "\e00b"; } +.fa-garlic::before { content: "\e40e"; } +.fa-gas-pump::before { content: "\f52f"; } +.fa-gas-pump-slash::before { content: "\f5f4"; } +.fa-gauge::before { content: "\f624"; } +.fa-gauge-circle-bolt::before { content: "\e496"; } +.fa-gauge-circle-minus::before { content: "\e497"; } +.fa-gauge-circle-plus::before { content: "\e498"; } +.fa-gauge-high::before { content: "\f625"; } +.fa-gauge-low::before { content: "\f627"; } +.fa-gauge-max::before { content: "\f626"; } +.fa-gauge-med::before { content: "\f624"; } +.fa-gauge-min::before { content: "\f628"; } +.fa-gauge-simple::before { content: "\f629"; } +.fa-gauge-simple-high::before { content: "\f62a"; } +.fa-gauge-simple-low::before { content: "\f62c"; } +.fa-gauge-simple-max::before { content: "\f62b"; } +.fa-gauge-simple-med::before { content: "\f629"; } +.fa-gauge-simple-min::before { content: "\f62d"; } +.fa-gave-dandy::before { content: "\e409"; } +.fa-gavel::before { content: "\f0e3"; } +.fa-gbp::before { content: "\f154"; } +.fa-gear::before { content: "\f013"; } +.fa-gear-code::before { content: "\e5e8"; } +.fa-gear-complex::before { content: "\e5e9"; } +.fa-gear-complex-code::before { content: "\e5eb"; } +.fa-gears::before { content: "\f085"; } +.fa-gem::before { content: "\f3a5"; } +.fa-genderless::before { content: "\f22d"; } +.fa-ghost::before { content: "\f6e2"; } +.fa-gif::before { content: "\e190"; } +.fa-gift::before { content: "\f06b"; } +.fa-gift-card::before { content: "\f663"; } +.fa-gifts::before { content: "\f79c"; } +.fa-gingerbread-man::before { content: "\f79d"; } +.fa-glass::before { content: "\f804"; } +.fa-glass-champagne::before { content: "\f79e"; } +.fa-glass-cheers::before { content: "\f79f"; } +.fa-glass-citrus::before { content: "\f869"; } +.fa-glass-empty::before { content: "\e191"; } +.fa-glass-half::before { content: "\e192"; } +.fa-glass-half-empty::before { content: "\e192"; } +.fa-glass-half-full::before { content: "\e192"; } +.fa-glass-martini::before { content: "\f000"; } +.fa-glass-martini-alt::before { content: "\f57b"; } +.fa-glass-water::before { content: "\e4f4"; } +.fa-glass-water-droplet::before { content: "\e4f5"; } +.fa-glass-whiskey::before { content: "\f7a0"; } +.fa-glass-whiskey-rocks::before { content: "\f7a1"; } +.fa-glasses::before { content: "\f530"; } +.fa-glasses-alt::before { content: "\f5f5"; } +.fa-glasses-round::before { content: "\f5f5"; } +.fa-globe::before { content: "\f0ac"; } +.fa-globe-africa::before { content: "\f57c"; } +.fa-globe-americas::before { content: "\f57d"; } +.fa-globe-asia::before { content: "\f57e"; } +.fa-globe-europe::before { content: "\f7a2"; } +.fa-globe-oceania::before { content: "\e47b"; } +.fa-globe-pointer::before { content: "\e60e"; } +.fa-globe-snow::before { content: "\f7a3"; } +.fa-globe-stand::before { content: "\f5f6"; } +.fa-globe-wifi::before { content: "\e685"; } +.fa-glove-boxing::before { content: "\f438"; } +.fa-goal-net::before { content: "\e3ab"; } +.fa-golf-ball::before { content: "\f450"; } +.fa-golf-ball-tee::before { content: "\f450"; } +.fa-golf-club::before { content: "\f451"; } +.fa-golf-flag-hole::before { content: "\e3ac"; } +.fa-gopuram::before { content: "\f664"; } +.fa-graduation-cap::before { content: "\f19d"; } +.fa-gramophone::before { content: "\f8bd"; } +.fa-grapes::before { content: "\e306"; } +.fa-grate::before { content: "\e193"; } +.fa-grate-droplet::before { content: "\e194"; } +.fa-greater-than::before { content: "\3e"; } +.fa-greater-than-equal::before { content: "\f532"; } +.fa-grid::before { content: "\e195"; } +.fa-grid-2::before { content: "\e196"; } +.fa-grid-2-plus::before { content: "\e197"; } +.fa-grid-3::before { content: "\e195"; } +.fa-grid-4::before { content: "\e198"; } +.fa-grid-5::before { content: "\e199"; } +.fa-grid-dividers::before { content: "\e3ad"; } +.fa-grid-horizontal::before { content: "\e307"; } +.fa-grid-round::before { content: "\e5da"; } +.fa-grid-round-2::before { content: "\e5db"; } +.fa-grid-round-2-plus::before { content: "\e5dc"; } +.fa-grid-round-4::before { content: "\e5dd"; } +.fa-grid-round-5::before { content: "\e5de"; } +.fa-grill::before { content: "\e5a3"; } +.fa-grill-fire::before { content: "\e5a4"; } +.fa-grill-hot::before { content: "\e5a5"; } +.fa-grimace::before { content: "\f57f"; } +.fa-grin::before { content: "\f580"; } +.fa-grin-alt::before { content: "\f581"; } +.fa-grin-beam::before { content: "\f582"; } +.fa-grin-beam-sweat::before { content: "\f583"; } +.fa-grin-hearts::before { content: "\f584"; } +.fa-grin-squint::before { content: "\f585"; } +.fa-grin-squint-tears::before { content: "\f586"; } +.fa-grin-stars::before { content: "\f587"; } +.fa-grin-tears::before { content: "\f588"; } +.fa-grin-tongue::before { content: "\f589"; } +.fa-grin-tongue-squint::before { content: "\f58a"; } +.fa-grin-tongue-wink::before { content: "\f58b"; } +.fa-grin-wink::before { content: "\f58c"; } +.fa-grip::before { content: "\f58d"; } +.fa-grip-dots::before { content: "\e410"; } +.fa-grip-dots-vertical::before { content: "\e411"; } +.fa-grip-horizontal::before { content: "\f58d"; } +.fa-grip-lines::before { content: "\f7a4"; } +.fa-grip-lines-vertical::before { content: "\f7a5"; } +.fa-grip-vertical::before { content: "\f58e"; } +.fa-group-arrows-rotate::before { content: "\e4f6"; } +.fa-guarani-sign::before { content: "\e19a"; } +.fa-guitar::before { content: "\f7a6"; } +.fa-guitar-electric::before { content: "\f8be"; } +.fa-guitars::before { content: "\f8bf"; } +.fa-gun::before { content: "\e19b"; } +.fa-gun-slash::before { content: "\e19c"; } +.fa-gun-squirt::before { content: "\e19d"; } +.fa-h::before { content: "\48"; } +.fa-h-square::before { content: "\f0fd"; } +.fa-h1::before { content: "\f313"; } +.fa-h2::before { content: "\f314"; } +.fa-h3::before { content: "\f315"; } +.fa-h4::before { content: "\f86a"; } +.fa-h5::before { content: "\e412"; } +.fa-h6::before { content: "\e413"; } +.fa-hamburger::before { content: "\f805"; } +.fa-hammer::before { content: "\f6e3"; } +.fa-hammer-brush::before { content: "\e620"; } +.fa-hammer-crash::before { content: "\e414"; } +.fa-hammer-war::before { content: "\f6e4"; } +.fa-hamsa::before { content: "\f665"; } +.fa-hand::before { content: "\f256"; } +.fa-hand-back-fist::before { content: "\f255"; } +.fa-hand-back-point-down::before { content: "\e19e"; } +.fa-hand-back-point-left::before { content: "\e19f"; } +.fa-hand-back-point-ribbon::before { content: "\e1a0"; } +.fa-hand-back-point-right::before { content: "\e1a1"; } +.fa-hand-back-point-up::before { content: "\e1a2"; } +.fa-hand-dots::before { content: "\f461"; } +.fa-hand-fingers-crossed::before { content: "\e1a3"; } +.fa-hand-fist::before { content: "\f6de"; } +.fa-hand-heart::before { content: "\f4bc"; } +.fa-hand-holding::before { content: "\f4bd"; } +.fa-hand-holding-box::before { content: "\f47b"; } +.fa-hand-holding-circle-dollar::before { content: "\e621"; } +.fa-hand-holding-dollar::before { content: "\f4c0"; } +.fa-hand-holding-droplet::before { content: "\f4c1"; } +.fa-hand-holding-hand::before { content: "\e4f7"; } +.fa-hand-holding-heart::before { content: "\f4be"; } +.fa-hand-holding-magic::before { content: "\f6e5"; } +.fa-hand-holding-medical::before { content: "\e05c"; } +.fa-hand-holding-seedling::before { content: "\f4bf"; } +.fa-hand-holding-skull::before { content: "\e1a4"; } +.fa-hand-holding-usd::before { content: "\f4c0"; } +.fa-hand-holding-water::before { content: "\f4c1"; } +.fa-hand-horns::before { content: "\e1a9"; } +.fa-hand-lizard::before { content: "\f258"; } +.fa-hand-love::before { content: "\e1a5"; } +.fa-hand-middle-finger::before { content: "\f806"; } +.fa-hand-paper::before { content: "\f256"; } +.fa-hand-peace::before { content: "\f25b"; } +.fa-hand-point-down::before { content: "\f0a7"; } +.fa-hand-point-left::before { content: "\f0a5"; } +.fa-hand-point-ribbon::before { content: "\e1a6"; } +.fa-hand-point-right::before { content: "\f0a4"; } +.fa-hand-point-up::before { content: "\f0a6"; } +.fa-hand-pointer::before { content: "\f25a"; } +.fa-hand-receiving::before { content: "\f47c"; } +.fa-hand-rock::before { content: "\f255"; } +.fa-hand-scissors::before { content: "\f257"; } +.fa-hand-sparkles::before { content: "\e05d"; } +.fa-hand-spock::before { content: "\f259"; } +.fa-hand-wave::before { content: "\e1a7"; } +.fa-handcuffs::before { content: "\e4f8"; } +.fa-hands::before { content: "\f2a7"; } +.fa-hands-american-sign-language-interpreting::before { content: "\f2a3"; } +.fa-hands-asl-interpreting::before { content: "\f2a3"; } +.fa-hands-bound::before { content: "\e4f9"; } +.fa-hands-bubbles::before { content: "\e05e"; } +.fa-hands-clapping::before { content: "\e1a8"; } +.fa-hands-heart::before { content: "\f4c3"; } +.fa-hands-helping::before { content: "\f4c4"; } +.fa-hands-holding::before { content: "\f4c2"; } +.fa-hands-holding-child::before { content: "\e4fa"; } +.fa-hands-holding-circle::before { content: "\e4fb"; } +.fa-hands-holding-diamond::before { content: "\f47c"; } +.fa-hands-holding-dollar::before { content: "\f4c5"; } +.fa-hands-holding-heart::before { content: "\f4c3"; } +.fa-hands-praying::before { content: "\f684"; } +.fa-hands-usd::before { content: "\f4c5"; } +.fa-hands-wash::before { content: "\e05e"; } +.fa-handshake::before { content: "\f2b5"; } +.fa-handshake-alt::before { content: "\f4c6"; } +.fa-handshake-alt-slash::before { content: "\e05f"; } +.fa-handshake-angle::before { content: "\f4c4"; } +.fa-handshake-simple::before { content: "\f4c6"; } +.fa-handshake-simple-slash::before { content: "\e05f"; } +.fa-handshake-slash::before { content: "\e060"; } +.fa-hanukiah::before { content: "\f6e6"; } +.fa-hard-drive::before { content: "\f0a0"; } +.fa-hard-hat::before { content: "\f807"; } +.fa-hard-of-hearing::before { content: "\f2a4"; } +.fa-hashtag::before { content: "\23"; } +.fa-hashtag-lock::before { content: "\e415"; } +.fa-hat-beach::before { content: "\e606"; } +.fa-hat-chef::before { content: "\f86b"; } +.fa-hat-cowboy::before { content: "\f8c0"; } +.fa-hat-cowboy-side::before { content: "\f8c1"; } +.fa-hat-hard::before { content: "\f807"; } +.fa-hat-santa::before { content: "\f7a7"; } +.fa-hat-winter::before { content: "\f7a8"; } +.fa-hat-witch::before { content: "\f6e7"; } +.fa-hat-wizard::before { content: "\f6e8"; } +.fa-haykal::before { content: "\f666"; } +.fa-hdd::before { content: "\f0a0"; } +.fa-head-side::before { content: "\f6e9"; } +.fa-head-side-brain::before { content: "\f808"; } +.fa-head-side-cough::before { content: "\e061"; } +.fa-head-side-cough-slash::before { content: "\e062"; } +.fa-head-side-gear::before { content: "\e611"; } +.fa-head-side-goggles::before { content: "\f6ea"; } +.fa-head-side-headphones::before { content: "\f8c2"; } +.fa-head-side-heart::before { content: "\e1aa"; } +.fa-head-side-mask::before { content: "\e063"; } +.fa-head-side-medical::before { content: "\f809"; } +.fa-head-side-virus::before { content: "\e064"; } +.fa-head-vr::before { content: "\f6ea"; } +.fa-header::before { content: "\f1dc"; } +.fa-heading::before { content: "\f1dc"; } +.fa-headphones::before { content: "\f025"; } +.fa-headphones-alt::before { content: "\f58f"; } +.fa-headphones-simple::before { content: "\f58f"; } +.fa-headset::before { content: "\f590"; } +.fa-heart::before { content: "\f004"; } +.fa-heart-broken::before { content: "\f7a9"; } +.fa-heart-circle::before { content: "\f4c7"; } +.fa-heart-circle-bolt::before { content: "\e4fc"; } +.fa-heart-circle-check::before { content: "\e4fd"; } +.fa-heart-circle-exclamation::before { content: "\e4fe"; } +.fa-heart-circle-minus::before { content: "\e4ff"; } +.fa-heart-circle-plus::before { content: "\e500"; } +.fa-heart-circle-xmark::before { content: "\e501"; } +.fa-heart-crack::before { content: "\f7a9"; } +.fa-heart-half::before { content: "\e1ab"; } +.fa-heart-half-alt::before { content: "\e1ac"; } +.fa-heart-half-stroke::before { content: "\e1ac"; } +.fa-heart-music-camera-bolt::before { content: "\f86d"; } +.fa-heart-pulse::before { content: "\f21e"; } +.fa-heart-rate::before { content: "\f5f8"; } +.fa-heart-square::before { content: "\f4c8"; } +.fa-heartbeat::before { content: "\f21e"; } +.fa-heat::before { content: "\e00c"; } +.fa-helicopter::before { content: "\f533"; } +.fa-helicopter-symbol::before { content: "\e502"; } +.fa-helmet-battle::before { content: "\f6eb"; } +.fa-helmet-safety::before { content: "\f807"; } +.fa-helmet-un::before { content: "\e503"; } +.fa-hexagon::before { content: "\f312"; } +.fa-hexagon-check::before { content: "\e416"; } +.fa-hexagon-divide::before { content: "\e1ad"; } +.fa-hexagon-exclamation::before { content: "\e417"; } +.fa-hexagon-image::before { content: "\e504"; } +.fa-hexagon-minus::before { content: "\f307"; } +.fa-hexagon-plus::before { content: "\f300"; } +.fa-hexagon-vertical-nft::before { content: "\e505"; } +.fa-hexagon-vertical-nft-slanted::before { content: "\e506"; } +.fa-hexagon-xmark::before { content: "\f2ee"; } +.fa-high-definition::before { content: "\e1ae"; } +.fa-highlighter::before { content: "\f591"; } +.fa-highlighter-line::before { content: "\e1af"; } +.fa-hiking::before { content: "\f6ec"; } +.fa-hill-avalanche::before { content: "\e507"; } +.fa-hill-rockslide::before { content: "\e508"; } +.fa-hippo::before { content: "\f6ed"; } +.fa-history::before { content: "\f1da"; } +.fa-hockey-mask::before { content: "\f6ee"; } +.fa-hockey-puck::before { content: "\f453"; } +.fa-hockey-stick-puck::before { content: "\e3ae"; } +.fa-hockey-sticks::before { content: "\f454"; } +.fa-holly-berry::before { content: "\f7aa"; } +.fa-home::before { content: "\f015"; } +.fa-home-alt::before { content: "\f015"; } +.fa-home-blank::before { content: "\e487"; } +.fa-home-heart::before { content: "\f4c9"; } +.fa-home-lg::before { content: "\e3af"; } +.fa-home-lg-alt::before { content: "\f015"; } +.fa-home-user::before { content: "\e1b0"; } +.fa-honey-pot::before { content: "\e418"; } +.fa-hood-cloak::before { content: "\f6ef"; } +.fa-horizontal-rule::before { content: "\f86c"; } +.fa-horse::before { content: "\f6f0"; } +.fa-horse-head::before { content: "\f7ab"; } +.fa-horse-saddle::before { content: "\f8c3"; } +.fa-hose::before { content: "\e419"; } +.fa-hose-reel::before { content: "\e41a"; } +.fa-hospital::before { content: "\f0f8"; } +.fa-hospital-alt::before { content: "\f0f8"; } +.fa-hospital-symbol::before { content: "\f47e"; } +.fa-hospital-user::before { content: "\f80d"; } +.fa-hospital-wide::before { content: "\f0f8"; } +.fa-hospitals::before { content: "\f80e"; } +.fa-hot-tub::before { content: "\f593"; } +.fa-hot-tub-person::before { content: "\f593"; } +.fa-hotdog::before { content: "\f80f"; } +.fa-hotel::before { content: "\f594"; } +.fa-hourglass::before { content: "\f254"; } +.fa-hourglass-1::before { content: "\f251"; } +.fa-hourglass-2::before { content: "\f252"; } +.fa-hourglass-3::before { content: "\f253"; } +.fa-hourglass-clock::before { content: "\e41b"; } +.fa-hourglass-empty::before { content: "\f254"; } +.fa-hourglass-end::before { content: "\f253"; } +.fa-hourglass-half::before { content: "\f252"; } +.fa-hourglass-start::before { content: "\f251"; } +.fa-house::before { content: "\f015"; } +.fa-house-blank::before { content: "\e487"; } +.fa-house-building::before { content: "\e1b1"; } +.fa-house-chimney::before { content: "\e3af"; } +.fa-house-chimney-blank::before { content: "\e3b0"; } +.fa-house-chimney-crack::before { content: "\f6f1"; } +.fa-house-chimney-heart::before { content: "\e1b2"; } +.fa-house-chimney-medical::before { content: "\f7f2"; } +.fa-house-chimney-user::before { content: "\e065"; } +.fa-house-chimney-window::before { content: "\e00d"; } +.fa-house-circle-check::before { content: "\e509"; } +.fa-house-circle-exclamation::before { content: "\e50a"; } +.fa-house-circle-xmark::before { content: "\e50b"; } +.fa-house-crack::before { content: "\e3b1"; } +.fa-house-damage::before { content: "\f6f1"; } +.fa-house-day::before { content: "\e00e"; } +.fa-house-fire::before { content: "\e50c"; } +.fa-house-flag::before { content: "\e50d"; } +.fa-house-flood::before { content: "\f74f"; } +.fa-house-flood-water::before { content: "\e50e"; } +.fa-house-flood-water-circle-arrow-right::before { content: "\e50f"; } +.fa-house-heart::before { content: "\f4c9"; } +.fa-house-laptop::before { content: "\e066"; } +.fa-house-leave::before { content: "\e00f"; } +.fa-house-lock::before { content: "\e510"; } +.fa-house-medical::before { content: "\e3b2"; } +.fa-house-medical-circle-check::before { content: "\e511"; } +.fa-house-medical-circle-exclamation::before { content: "\e512"; } +.fa-house-medical-circle-xmark::before { content: "\e513"; } +.fa-house-medical-flag::before { content: "\e514"; } +.fa-house-night::before { content: "\e010"; } +.fa-house-person-arrive::before { content: "\e011"; } +.fa-house-person-depart::before { content: "\e00f"; } +.fa-house-person-leave::before { content: "\e00f"; } +.fa-house-person-return::before { content: "\e011"; } +.fa-house-return::before { content: "\e011"; } +.fa-house-signal::before { content: "\e012"; } +.fa-house-tree::before { content: "\e1b3"; } +.fa-house-tsunami::before { content: "\e515"; } +.fa-house-turret::before { content: "\e1b4"; } +.fa-house-user::before { content: "\e1b0"; } +.fa-house-water::before { content: "\f74f"; } +.fa-house-window::before { content: "\e3b3"; } +.fa-hryvnia::before { content: "\f6f2"; } +.fa-hryvnia-sign::before { content: "\f6f2"; } +.fa-humidity::before { content: "\f750"; } +.fa-hundred-points::before { content: "\e41c"; } +.fa-hurricane::before { content: "\f751"; } +.fa-hydra::before { content: "\e686"; } +.fa-hyphen::before { content: "\2d"; } +.fa-i::before { content: "\49"; } +.fa-i-cursor::before { content: "\f246"; } +.fa-ice-cream::before { content: "\f810"; } +.fa-ice-skate::before { content: "\f7ac"; } +.fa-icicles::before { content: "\f7ad"; } +.fa-icons::before { content: "\f86d"; } +.fa-icons-alt::before { content: "\f86e"; } +.fa-id-badge::before { content: "\f2c1"; } +.fa-id-card::before { content: "\f2c2"; } +.fa-id-card-alt::before { content: "\f47f"; } +.fa-id-card-clip::before { content: "\f47f"; } +.fa-igloo::before { content: "\f7ae"; } +.fa-ils::before { content: "\f20b"; } +.fa-image::before { content: "\f03e"; } +.fa-image-landscape::before { content: "\e1b5"; } +.fa-image-polaroid::before { content: "\f8c4"; } +.fa-image-polaroid-user::before { content: "\e1b6"; } +.fa-image-portrait::before { content: "\f3e0"; } +.fa-image-slash::before { content: "\e1b7"; } +.fa-image-user::before { content: "\e1b8"; } +.fa-images::before { content: "\f302"; } +.fa-images-user::before { content: "\e1b9"; } +.fa-inbox::before { content: "\f01c"; } +.fa-inbox-arrow-down::before { content: "\f310"; } +.fa-inbox-arrow-up::before { content: "\f311"; } +.fa-inbox-full::before { content: "\e1ba"; } +.fa-inbox-in::before { content: "\f310"; } +.fa-inbox-out::before { content: "\f311"; } +.fa-inboxes::before { content: "\e1bb"; } +.fa-indent::before { content: "\f03c"; } +.fa-indian-rupee::before { content: "\e1bc"; } +.fa-indian-rupee-sign::before { content: "\e1bc"; } +.fa-industry::before { content: "\f275"; } +.fa-industry-alt::before { content: "\f3b3"; } +.fa-industry-windows::before { content: "\f3b3"; } +.fa-infinity::before { content: "\f534"; } +.fa-info::before { content: "\f129"; } +.fa-info-circle::before { content: "\f05a"; } +.fa-info-square::before { content: "\f30f"; } +.fa-inhaler::before { content: "\f5f9"; } +.fa-input-numeric::before { content: "\e1bd"; } +.fa-input-pipe::before { content: "\e1be"; } +.fa-input-text::before { content: "\e1bf"; } +.fa-inr::before { content: "\e1bc"; } +.fa-institution::before { content: "\f19c"; } +.fa-integral::before { content: "\f667"; } +.fa-interrobang::before { content: "\e5ba"; } +.fa-intersection::before { content: "\f668"; } +.fa-inventory::before { content: "\f480"; } +.fa-island-tree-palm::before { content: "\f811"; } +.fa-island-tropical::before { content: "\f811"; } +.fa-italic::before { content: "\f033"; } +.fa-j::before { content: "\4a"; } +.fa-jack-o-lantern::before { content: "\f30e"; } +.fa-jar::before { content: "\e516"; } +.fa-jar-wheat::before { content: "\e517"; } +.fa-jedi::before { content: "\f669"; } +.fa-jet-fighter::before { content: "\f0fb"; } +.fa-jet-fighter-up::before { content: "\e518"; } +.fa-joint::before { content: "\f595"; } +.fa-journal-whills::before { content: "\f66a"; } +.fa-joystick::before { content: "\f8c5"; } +.fa-jpy::before { content: "\f157"; } +.fa-jug::before { content: "\f8c6"; } +.fa-jug-bottle::before { content: "\e5fb"; } +.fa-jug-detergent::before { content: "\e519"; } +.fa-k::before { content: "\4b"; } +.fa-kaaba::before { content: "\f66b"; } +.fa-kazoo::before { content: "\f8c7"; } +.fa-kerning::before { content: "\f86f"; } +.fa-key::before { content: "\f084"; } +.fa-key-skeleton::before { content: "\f6f3"; } +.fa-key-skeleton-left-right::before { content: "\e3b4"; } +.fa-keyboard::before { content: "\f11c"; } +.fa-keyboard-brightness::before { content: "\e1c0"; } +.fa-keyboard-brightness-low::before { content: "\e1c1"; } +.fa-keyboard-down::before { content: "\e1c2"; } +.fa-keyboard-left::before { content: "\e1c3"; } +.fa-keynote::before { content: "\f66c"; } +.fa-khanda::before { content: "\f66d"; } +.fa-kidneys::before { content: "\f5fb"; } +.fa-kip-sign::before { content: "\e1c4"; } +.fa-kiss::before { content: "\f596"; } +.fa-kiss-beam::before { content: "\f597"; } +.fa-kiss-wink-heart::before { content: "\f598"; } +.fa-kit-medical::before { content: "\f479"; } +.fa-kitchen-set::before { content: "\e51a"; } +.fa-kite::before { content: "\f6f4"; } +.fa-kiwi-bird::before { content: "\f535"; } +.fa-kiwi-fruit::before { content: "\e30c"; } +.fa-knife::before { content: "\f2e4"; } +.fa-knife-kitchen::before { content: "\f6f5"; } +.fa-krw::before { content: "\f159"; } +.fa-l::before { content: "\4c"; } +.fa-lacrosse-stick::before { content: "\e3b5"; } +.fa-lacrosse-stick-ball::before { content: "\e3b6"; } +.fa-ladder-water::before { content: "\f5c5"; } +.fa-lambda::before { content: "\f66e"; } +.fa-lamp::before { content: "\f4ca"; } +.fa-lamp-desk::before { content: "\e014"; } +.fa-lamp-floor::before { content: "\e015"; } +.fa-lamp-street::before { content: "\e1c5"; } +.fa-land-mine-on::before { content: "\e51b"; } +.fa-landmark::before { content: "\f66f"; } +.fa-landmark-alt::before { content: "\f752"; } +.fa-landmark-dome::before { content: "\f752"; } +.fa-landmark-flag::before { content: "\e51c"; } +.fa-landmark-magnifying-glass::before { content: "\e622"; } +.fa-landscape::before { content: "\e1b5"; } +.fa-language::before { content: "\f1ab"; } +.fa-laptop::before { content: "\f109"; } +.fa-laptop-arrow-down::before { content: "\e1c6"; } +.fa-laptop-binary::before { content: "\e5e7"; } +.fa-laptop-code::before { content: "\f5fc"; } +.fa-laptop-file::before { content: "\e51d"; } +.fa-laptop-house::before { content: "\e066"; } +.fa-laptop-medical::before { content: "\f812"; } +.fa-laptop-mobile::before { content: "\f87a"; } +.fa-laptop-slash::before { content: "\e1c7"; } +.fa-lari-sign::before { content: "\e1c8"; } +.fa-lasso::before { content: "\f8c8"; } +.fa-lasso-sparkles::before { content: "\e1c9"; } +.fa-laugh::before { content: "\f599"; } +.fa-laugh-beam::before { content: "\f59a"; } +.fa-laugh-squint::before { content: "\f59b"; } +.fa-laugh-wink::before { content: "\f59c"; } +.fa-layer-group::before { content: "\f5fd"; } +.fa-layer-group-minus::before { content: "\f5fe"; } +.fa-layer-group-plus::before { content: "\f5ff"; } +.fa-layer-minus::before { content: "\f5fe"; } +.fa-layer-plus::before { content: "\f5ff"; } +.fa-leaf::before { content: "\f06c"; } +.fa-leaf-heart::before { content: "\f4cb"; } +.fa-leaf-maple::before { content: "\f6f6"; } +.fa-leaf-oak::before { content: "\f6f7"; } +.fa-leafy-green::before { content: "\e41d"; } +.fa-left::before { content: "\f355"; } +.fa-left-from-bracket::before { content: "\e66c"; } +.fa-left-from-line::before { content: "\f348"; } +.fa-left-long::before { content: "\f30a"; } +.fa-left-long-to-line::before { content: "\e41e"; } +.fa-left-right::before { content: "\f337"; } +.fa-left-to-bracket::before { content: "\e66d"; } +.fa-left-to-line::before { content: "\f34b"; } +.fa-legal::before { content: "\f0e3"; } +.fa-lemon::before { content: "\f094"; } +.fa-less-than::before { content: "\3c"; } +.fa-less-than-equal::before { content: "\f537"; } +.fa-level-down::before { content: "\f149"; } +.fa-level-down-alt::before { content: "\f3be"; } +.fa-level-up::before { content: "\f148"; } +.fa-level-up-alt::before { content: "\f3bf"; } +.fa-life-ring::before { content: "\f1cd"; } +.fa-light-ceiling::before { content: "\e016"; } +.fa-light-emergency::before { content: "\e41f"; } +.fa-light-emergency-on::before { content: "\e420"; } +.fa-light-switch::before { content: "\e017"; } +.fa-light-switch-off::before { content: "\e018"; } +.fa-light-switch-on::before { content: "\e019"; } +.fa-lightbulb::before { content: "\f0eb"; } +.fa-lightbulb-cfl::before { content: "\e5a6"; } +.fa-lightbulb-cfl-on::before { content: "\e5a7"; } +.fa-lightbulb-dollar::before { content: "\f670"; } +.fa-lightbulb-exclamation::before { content: "\f671"; } +.fa-lightbulb-exclamation-on::before { content: "\e1ca"; } +.fa-lightbulb-gear::before { content: "\e5fd"; } +.fa-lightbulb-message::before { content: "\e687"; } +.fa-lightbulb-on::before { content: "\f672"; } +.fa-lightbulb-slash::before { content: "\f673"; } +.fa-lighthouse::before { content: "\e612"; } +.fa-lights-holiday::before { content: "\f7b2"; } +.fa-line-chart::before { content: "\f201"; } +.fa-line-columns::before { content: "\f870"; } +.fa-line-height::before { content: "\f871"; } +.fa-lines-leaning::before { content: "\e51e"; } +.fa-link::before { content: "\f0c1"; } +.fa-link-horizontal::before { content: "\e1cb"; } +.fa-link-horizontal-slash::before { content: "\e1cc"; } +.fa-link-simple::before { content: "\e1cd"; } +.fa-link-simple-slash::before { content: "\e1ce"; } +.fa-link-slash::before { content: "\f127"; } +.fa-lips::before { content: "\f600"; } +.fa-lira-sign::before { content: "\f195"; } +.fa-list::before { content: "\f03a"; } +.fa-list-1-2::before { content: "\f0cb"; } +.fa-list-alt::before { content: "\f022"; } +.fa-list-check::before { content: "\f0ae"; } +.fa-list-dots::before { content: "\f0ca"; } +.fa-list-dropdown::before { content: "\e1cf"; } +.fa-list-music::before { content: "\f8c9"; } +.fa-list-numeric::before { content: "\f0cb"; } +.fa-list-ol::before { content: "\f0cb"; } +.fa-list-radio::before { content: "\e1d0"; } +.fa-list-squares::before { content: "\f03a"; } +.fa-list-timeline::before { content: "\e1d1"; } +.fa-list-tree::before { content: "\e1d2"; } +.fa-list-ul::before { content: "\f0ca"; } +.fa-litecoin-sign::before { content: "\e1d3"; } +.fa-loader::before { content: "\e1d4"; } +.fa-lobster::before { content: "\e421"; } +.fa-location::before { content: "\f601"; } +.fa-location-arrow::before { content: "\f124"; } +.fa-location-arrow-up::before { content: "\e63a"; } +.fa-location-check::before { content: "\f606"; } +.fa-location-circle::before { content: "\f602"; } +.fa-location-crosshairs::before { content: "\f601"; } +.fa-location-crosshairs-slash::before { content: "\f603"; } +.fa-location-dot::before { content: "\f3c5"; } +.fa-location-dot-slash::before { content: "\f605"; } +.fa-location-exclamation::before { content: "\f608"; } +.fa-location-minus::before { content: "\f609"; } +.fa-location-pen::before { content: "\f607"; } +.fa-location-pin::before { content: "\f041"; } +.fa-location-pin-lock::before { content: "\e51f"; } +.fa-location-pin-slash::before { content: "\f60c"; } +.fa-location-plus::before { content: "\f60a"; } +.fa-location-question::before { content: "\f60b"; } +.fa-location-slash::before { content: "\f603"; } +.fa-location-smile::before { content: "\f60d"; } +.fa-location-xmark::before { content: "\f60e"; } +.fa-lock::before { content: "\f023"; } +.fa-lock-a::before { content: "\e422"; } +.fa-lock-alt::before { content: "\f30d"; } +.fa-lock-hashtag::before { content: "\e423"; } +.fa-lock-keyhole::before { content: "\f30d"; } +.fa-lock-keyhole-open::before { content: "\f3c2"; } +.fa-lock-open::before { content: "\f3c1"; } +.fa-lock-open-alt::before { content: "\f3c2"; } +.fa-locust::before { content: "\e520"; } +.fa-lollipop::before { content: "\e424"; } +.fa-lollypop::before { content: "\e424"; } +.fa-long-arrow-alt-down::before { content: "\f309"; } +.fa-long-arrow-alt-left::before { content: "\f30a"; } +.fa-long-arrow-alt-right::before { content: "\f30b"; } +.fa-long-arrow-alt-up::before { content: "\f30c"; } +.fa-long-arrow-down::before { content: "\f175"; } +.fa-long-arrow-left::before { content: "\f177"; } +.fa-long-arrow-right::before { content: "\f178"; } +.fa-long-arrow-up::before { content: "\f176"; } +.fa-loveseat::before { content: "\f4cc"; } +.fa-low-vision::before { content: "\f2a8"; } +.fa-luchador::before { content: "\f455"; } +.fa-luchador-mask::before { content: "\f455"; } +.fa-luggage-cart::before { content: "\f59d"; } +.fa-lungs::before { content: "\f604"; } +.fa-lungs-virus::before { content: "\e067"; } +.fa-m::before { content: "\4d"; } +.fa-mace::before { content: "\f6f8"; } +.fa-magic::before { content: "\f0d0"; } +.fa-magic-wand-sparkles::before { content: "\e2ca"; } +.fa-magnet::before { content: "\f076"; } +.fa-magnifying-glass::before { content: "\f002"; } +.fa-magnifying-glass-arrow-right::before { content: "\e521"; } +.fa-magnifying-glass-arrows-rotate::before { content: "\e65e"; } +.fa-magnifying-glass-chart::before { content: "\e522"; } +.fa-magnifying-glass-dollar::before { content: "\f688"; } +.fa-magnifying-glass-location::before { content: "\f689"; } +.fa-magnifying-glass-minus::before { content: "\f010"; } +.fa-magnifying-glass-music::before { content: "\e65f"; } +.fa-magnifying-glass-play::before { content: "\e660"; } +.fa-magnifying-glass-plus::before { content: "\f00e"; } +.fa-magnifying-glass-waveform::before { content: "\e661"; } +.fa-mail-bulk::before { content: "\f674"; } +.fa-mail-forward::before { content: "\f064"; } +.fa-mail-reply::before { content: "\f3e5"; } +.fa-mail-reply-all::before { content: "\f122"; } +.fa-mailbox::before { content: "\f813"; } +.fa-mailbox-flag-up::before { content: "\e5bb"; } +.fa-maki-roll::before { content: "\e48b"; } +.fa-makizushi::before { content: "\e48b"; } +.fa-male::before { content: "\f183"; } +.fa-manat-sign::before { content: "\e1d5"; } +.fa-mandolin::before { content: "\f6f9"; } +.fa-mango::before { content: "\e30f"; } +.fa-manhole::before { content: "\e1d6"; } +.fa-map::before { content: "\f279"; } +.fa-map-location::before { content: "\f59f"; } +.fa-map-location-dot::before { content: "\f5a0"; } +.fa-map-marked::before { content: "\f59f"; } +.fa-map-marked-alt::before { content: "\f5a0"; } +.fa-map-marker::before { content: "\f041"; } +.fa-map-marker-alt::before { content: "\f3c5"; } +.fa-map-marker-alt-slash::before { content: "\f605"; } +.fa-map-marker-check::before { content: "\f606"; } +.fa-map-marker-edit::before { content: "\f607"; } +.fa-map-marker-exclamation::before { content: "\f608"; } +.fa-map-marker-minus::before { content: "\f609"; } +.fa-map-marker-plus::before { content: "\f60a"; } +.fa-map-marker-question::before { content: "\f60b"; } +.fa-map-marker-slash::before { content: "\f60c"; } +.fa-map-marker-smile::before { content: "\f60d"; } +.fa-map-marker-times::before { content: "\f60e"; } +.fa-map-marker-xmark::before { content: "\f60e"; } +.fa-map-pin::before { content: "\f276"; } +.fa-map-signs::before { content: "\f277"; } +.fa-marker::before { content: "\f5a1"; } +.fa-mars::before { content: "\f222"; } +.fa-mars-and-venus::before { content: "\f224"; } +.fa-mars-and-venus-burst::before { content: "\e523"; } +.fa-mars-double::before { content: "\f227"; } +.fa-mars-stroke::before { content: "\f229"; } +.fa-mars-stroke-h::before { content: "\f22b"; } +.fa-mars-stroke-right::before { content: "\f22b"; } +.fa-mars-stroke-up::before { content: "\f22a"; } +.fa-mars-stroke-v::before { content: "\f22a"; } +.fa-martini-glass::before { content: "\f57b"; } +.fa-martini-glass-citrus::before { content: "\f561"; } +.fa-martini-glass-empty::before { content: "\f000"; } +.fa-mask::before { content: "\f6fa"; } +.fa-mask-face::before { content: "\e1d7"; } +.fa-mask-luchador::before { content: "\f455"; } +.fa-mask-snorkel::before { content: "\e3b7"; } +.fa-mask-ventilator::before { content: "\e524"; } +.fa-masks-theater::before { content: "\f630"; } +.fa-mattress-pillow::before { content: "\e525"; } +.fa-maximize::before { content: "\f31e"; } +.fa-meat::before { content: "\f814"; } +.fa-medal::before { content: "\f5a2"; } +.fa-medkit::before { content: "\f0fa"; } +.fa-megaphone::before { content: "\f675"; } +.fa-meh::before { content: "\f11a"; } +.fa-meh-blank::before { content: "\f5a4"; } +.fa-meh-rolling-eyes::before { content: "\f5a5"; } +.fa-melon::before { content: "\e310"; } +.fa-melon-slice::before { content: "\e311"; } +.fa-memo::before { content: "\e1d8"; } +.fa-memo-circle-check::before { content: "\e1d9"; } +.fa-memo-circle-info::before { content: "\e49a"; } +.fa-memo-pad::before { content: "\e1da"; } +.fa-memory::before { content: "\f538"; } +.fa-menorah::before { content: "\f676"; } +.fa-mercury::before { content: "\f223"; } +.fa-merge::before { content: "\e526"; } +.fa-message::before { content: "\f27a"; } +.fa-message-arrow-down::before { content: "\e1db"; } +.fa-message-arrow-up::before { content: "\e1dc"; } +.fa-message-arrow-up-right::before { content: "\e1dd"; } +.fa-message-bot::before { content: "\e3b8"; } +.fa-message-captions::before { content: "\e1de"; } +.fa-message-check::before { content: "\f4a2"; } +.fa-message-code::before { content: "\e1df"; } +.fa-message-dollar::before { content: "\f650"; } +.fa-message-dots::before { content: "\f4a3"; } +.fa-message-edit::before { content: "\f4a4"; } +.fa-message-exclamation::before { content: "\f4a5"; } +.fa-message-heart::before { content: "\e5c9"; } +.fa-message-image::before { content: "\e1e0"; } +.fa-message-lines::before { content: "\f4a6"; } +.fa-message-medical::before { content: "\f7f4"; } +.fa-message-middle::before { content: "\e1e1"; } +.fa-message-middle-top::before { content: "\e1e2"; } +.fa-message-minus::before { content: "\f4a7"; } +.fa-message-music::before { content: "\f8af"; } +.fa-message-pen::before { content: "\f4a4"; } +.fa-message-plus::before { content: "\f4a8"; } +.fa-message-question::before { content: "\e1e3"; } +.fa-message-quote::before { content: "\e1e4"; } +.fa-message-slash::before { content: "\f4a9"; } +.fa-message-smile::before { content: "\f4aa"; } +.fa-message-sms::before { content: "\e1e5"; } +.fa-message-text::before { content: "\e1e6"; } +.fa-message-times::before { content: "\f4ab"; } +.fa-message-xmark::before { content: "\f4ab"; } +.fa-messages::before { content: "\f4b6"; } +.fa-messages-dollar::before { content: "\f652"; } +.fa-messages-question::before { content: "\e1e7"; } +.fa-messaging::before { content: "\f4a3"; } +.fa-meteor::before { content: "\f753"; } +.fa-meter::before { content: "\e1e8"; } +.fa-meter-bolt::before { content: "\e1e9"; } +.fa-meter-droplet::before { content: "\e1ea"; } +.fa-meter-fire::before { content: "\e1eb"; } +.fa-microchip::before { content: "\f2db"; } +.fa-microchip-ai::before { content: "\e1ec"; } +.fa-microphone::before { content: "\f130"; } +.fa-microphone-alt::before { content: "\f3c9"; } +.fa-microphone-alt-slash::before { content: "\f539"; } +.fa-microphone-circle::before { content: "\e116"; } +.fa-microphone-circle-alt::before { content: "\e117"; } +.fa-microphone-lines::before { content: "\f3c9"; } +.fa-microphone-lines-slash::before { content: "\f539"; } +.fa-microphone-slash::before { content: "\f131"; } +.fa-microphone-stand::before { content: "\f8cb"; } +.fa-microscope::before { content: "\f610"; } +.fa-microwave::before { content: "\e01b"; } +.fa-mill-sign::before { content: "\e1ed"; } +.fa-mind-share::before { content: "\f677"; } +.fa-minimize::before { content: "\f78c"; } +.fa-minus::before { content: "\f068"; } +.fa-minus-circle::before { content: "\f056"; } +.fa-minus-hexagon::before { content: "\f307"; } +.fa-minus-large::before { content: "\e404"; } +.fa-minus-octagon::before { content: "\f308"; } +.fa-minus-square::before { content: "\f146"; } +.fa-mistletoe::before { content: "\f7b4"; } +.fa-mitten::before { content: "\f7b5"; } +.fa-mobile::before { content: "\f3ce"; } +.fa-mobile-alt::before { content: "\f3cd"; } +.fa-mobile-android::before { content: "\f3ce"; } +.fa-mobile-android-alt::before { content: "\f3cf"; } +.fa-mobile-button::before { content: "\f10b"; } +.fa-mobile-iphone::before { content: "\e1ee"; } +.fa-mobile-notch::before { content: "\e1ee"; } +.fa-mobile-phone::before { content: "\f3ce"; } +.fa-mobile-retro::before { content: "\e527"; } +.fa-mobile-screen::before { content: "\f3cf"; } +.fa-mobile-screen-button::before { content: "\f3cd"; } +.fa-mobile-signal::before { content: "\e1ef"; } +.fa-mobile-signal-out::before { content: "\e1f0"; } +.fa-money-bill::before { content: "\f0d6"; } +.fa-money-bill-1::before { content: "\f3d1"; } +.fa-money-bill-1-wave::before { content: "\f53b"; } +.fa-money-bill-alt::before { content: "\f3d1"; } +.fa-money-bill-simple::before { content: "\e1f1"; } +.fa-money-bill-simple-wave::before { content: "\e1f2"; } +.fa-money-bill-transfer::before { content: "\e528"; } +.fa-money-bill-trend-up::before { content: "\e529"; } +.fa-money-bill-wave::before { content: "\f53a"; } +.fa-money-bill-wave-alt::before { content: "\f53b"; } +.fa-money-bill-wheat::before { content: "\e52a"; } +.fa-money-bills::before { content: "\e1f3"; } +.fa-money-bills-alt::before { content: "\e1f4"; } +.fa-money-bills-simple::before { content: "\e1f4"; } +.fa-money-check::before { content: "\f53c"; } +.fa-money-check-alt::before { content: "\f53d"; } +.fa-money-check-dollar::before { content: "\f53d"; } +.fa-money-check-dollar-pen::before { content: "\f873"; } +.fa-money-check-edit::before { content: "\f872"; } +.fa-money-check-edit-alt::before { content: "\f873"; } +.fa-money-check-pen::before { content: "\f872"; } +.fa-money-from-bracket::before { content: "\e312"; } +.fa-money-simple-from-bracket::before { content: "\e313"; } +.fa-monitor-heart-rate::before { content: "\f611"; } +.fa-monitor-waveform::before { content: "\f611"; } +.fa-monkey::before { content: "\f6fb"; } +.fa-monument::before { content: "\f5a6"; } +.fa-moon::before { content: "\f186"; } +.fa-moon-cloud::before { content: "\f754"; } +.fa-moon-over-sun::before { content: "\f74a"; } +.fa-moon-stars::before { content: "\f755"; } +.fa-moped::before { content: "\e3b9"; } +.fa-mortar-board::before { content: "\f19d"; } +.fa-mortar-pestle::before { content: "\f5a7"; } +.fa-mosque::before { content: "\f678"; } +.fa-mosquito::before { content: "\e52b"; } +.fa-mosquito-net::before { content: "\e52c"; } +.fa-motorcycle::before { content: "\f21c"; } +.fa-mound::before { content: "\e52d"; } +.fa-mountain::before { content: "\f6fc"; } +.fa-mountain-city::before { content: "\e52e"; } +.fa-mountain-sun::before { content: "\e52f"; } +.fa-mountains::before { content: "\f6fd"; } +.fa-mouse::before { content: "\f8cc"; } +.fa-mouse-alt::before { content: "\f8cd"; } +.fa-mouse-field::before { content: "\e5a8"; } +.fa-mouse-pointer::before { content: "\f245"; } +.fa-mp3-player::before { content: "\f8ce"; } +.fa-mug::before { content: "\f874"; } +.fa-mug-hot::before { content: "\f7b6"; } +.fa-mug-marshmallows::before { content: "\f7b7"; } +.fa-mug-saucer::before { content: "\f0f4"; } +.fa-mug-tea::before { content: "\f875"; } +.fa-mug-tea-saucer::before { content: "\e1f5"; } +.fa-multiply::before { content: "\f00d"; } +.fa-museum::before { content: "\f19c"; } +.fa-mushroom::before { content: "\e425"; } +.fa-music::before { content: "\f001"; } +.fa-music-alt::before { content: "\f8cf"; } +.fa-music-alt-slash::before { content: "\f8d0"; } +.fa-music-magnifying-glass::before { content: "\e662"; } +.fa-music-note::before { content: "\f8cf"; } +.fa-music-note-slash::before { content: "\f8d0"; } +.fa-music-slash::before { content: "\f8d1"; } +.fa-mustache::before { content: "\e5bc"; } +.fa-n::before { content: "\4e"; } +.fa-naira-sign::before { content: "\e1f6"; } +.fa-narwhal::before { content: "\f6fe"; } +.fa-navicon::before { content: "\f0c9"; } +.fa-nesting-dolls::before { content: "\e3ba"; } +.fa-network-wired::before { content: "\f6ff"; } +.fa-neuter::before { content: "\f22c"; } +.fa-newspaper::before { content: "\f1ea"; } +.fa-nfc::before { content: "\e1f7"; } +.fa-nfc-lock::before { content: "\e1f8"; } +.fa-nfc-magnifying-glass::before { content: "\e1f9"; } +.fa-nfc-pen::before { content: "\e1fa"; } +.fa-nfc-signal::before { content: "\e1fb"; } +.fa-nfc-slash::before { content: "\e1fc"; } +.fa-nfc-symbol::before { content: "\e531"; } +.fa-nfc-trash::before { content: "\e1fd"; } +.fa-nigiri::before { content: "\e48a"; } +.fa-nose::before { content: "\e5bd"; } +.fa-not-equal::before { content: "\f53e"; } +.fa-notdef::before { content: "\e1fe"; } +.fa-note::before { content: "\e1ff"; } +.fa-note-medical::before { content: "\e200"; } +.fa-note-sticky::before { content: "\f249"; } +.fa-notebook::before { content: "\e201"; } +.fa-notes::before { content: "\e202"; } +.fa-notes-medical::before { content: "\f481"; } +.fa-o::before { content: "\4f"; } +.fa-object-exclude::before { content: "\e49c"; } +.fa-object-group::before { content: "\f247"; } +.fa-object-intersect::before { content: "\e49d"; } +.fa-object-subtract::before { content: "\e49e"; } +.fa-object-ungroup::before { content: "\f248"; } +.fa-object-union::before { content: "\e49f"; } +.fa-objects-align-bottom::before { content: "\e3bb"; } +.fa-objects-align-center-horizontal::before { content: "\e3bc"; } +.fa-objects-align-center-vertical::before { content: "\e3bd"; } +.fa-objects-align-left::before { content: "\e3be"; } +.fa-objects-align-right::before { content: "\e3bf"; } +.fa-objects-align-top::before { content: "\e3c0"; } +.fa-objects-column::before { content: "\e3c1"; } +.fa-octagon::before { content: "\f306"; } +.fa-octagon-check::before { content: "\e426"; } +.fa-octagon-divide::before { content: "\e203"; } +.fa-octagon-exclamation::before { content: "\e204"; } +.fa-octagon-minus::before { content: "\f308"; } +.fa-octagon-plus::before { content: "\f301"; } +.fa-octagon-xmark::before { content: "\f2f0"; } +.fa-octopus::before { content: "\e688"; } +.fa-oil-can::before { content: "\f613"; } +.fa-oil-can-drip::before { content: "\e205"; } +.fa-oil-temp::before { content: "\f614"; } +.fa-oil-temperature::before { content: "\f614"; } +.fa-oil-well::before { content: "\e532"; } +.fa-olive::before { content: "\e316"; } +.fa-olive-branch::before { content: "\e317"; } +.fa-om::before { content: "\f679"; } +.fa-omega::before { content: "\f67a"; } +.fa-onion::before { content: "\e427"; } +.fa-option::before { content: "\e318"; } +.fa-ornament::before { content: "\f7b8"; } +.fa-otter::before { content: "\f700"; } +.fa-outdent::before { content: "\f03b"; } +.fa-outlet::before { content: "\e01c"; } +.fa-oven::before { content: "\e01d"; } +.fa-overline::before { content: "\f876"; } +.fa-p::before { content: "\50"; } +.fa-page::before { content: "\e428"; } +.fa-page-break::before { content: "\f877"; } +.fa-page-caret-down::before { content: "\e429"; } +.fa-page-caret-up::before { content: "\e42a"; } +.fa-pager::before { content: "\f815"; } +.fa-paint-brush::before { content: "\f1fc"; } +.fa-paint-brush-alt::before { content: "\f5a9"; } +.fa-paint-brush-fine::before { content: "\f5a9"; } +.fa-paint-roller::before { content: "\f5aa"; } +.fa-paintbrush::before { content: "\f1fc"; } +.fa-paintbrush-alt::before { content: "\f5a9"; } +.fa-paintbrush-fine::before { content: "\f5a9"; } +.fa-paintbrush-pencil::before { content: "\e206"; } +.fa-palette::before { content: "\f53f"; } +.fa-palette-boxes::before { content: "\f483"; } +.fa-pallet::before { content: "\f482"; } +.fa-pallet-alt::before { content: "\f483"; } +.fa-pallet-box::before { content: "\e208"; } +.fa-pallet-boxes::before { content: "\f483"; } +.fa-pan-food::before { content: "\e42b"; } +.fa-pan-frying::before { content: "\e42c"; } +.fa-pancakes::before { content: "\e42d"; } +.fa-panel-ews::before { content: "\e42e"; } +.fa-panel-fire::before { content: "\e42f"; } +.fa-panorama::before { content: "\e209"; } +.fa-paper-plane::before { content: "\f1d8"; } +.fa-paper-plane-alt::before { content: "\e20a"; } +.fa-paper-plane-top::before { content: "\e20a"; } +.fa-paperclip::before { content: "\f0c6"; } +.fa-paperclip-vertical::before { content: "\e3c2"; } +.fa-parachute-box::before { content: "\f4cd"; } +.fa-paragraph::before { content: "\f1dd"; } +.fa-paragraph-left::before { content: "\f878"; } +.fa-paragraph-rtl::before { content: "\f878"; } +.fa-parentheses::before { content: "\e0c5"; } +.fa-parenthesis::before { content: "\28"; } +.fa-parking::before { content: "\f540"; } +.fa-parking-circle::before { content: "\f615"; } +.fa-parking-circle-slash::before { content: "\f616"; } +.fa-parking-slash::before { content: "\f617"; } +.fa-party-back::before { content: "\e45c"; } +.fa-party-bell::before { content: "\e31a"; } +.fa-party-horn::before { content: "\e31b"; } +.fa-passport::before { content: "\f5ab"; } +.fa-pastafarianism::before { content: "\f67b"; } +.fa-paste::before { content: "\f0ea"; } +.fa-pause::before { content: "\f04c"; } +.fa-pause-circle::before { content: "\f28b"; } +.fa-paw::before { content: "\f1b0"; } +.fa-paw-alt::before { content: "\f701"; } +.fa-paw-claws::before { content: "\f702"; } +.fa-paw-simple::before { content: "\f701"; } +.fa-peace::before { content: "\f67c"; } +.fa-peach::before { content: "\e20b"; } +.fa-peanut::before { content: "\e430"; } +.fa-peanuts::before { content: "\e431"; } +.fa-peapod::before { content: "\e31c"; } +.fa-pear::before { content: "\e20c"; } +.fa-pedestal::before { content: "\e20d"; } +.fa-pegasus::before { content: "\f703"; } +.fa-pen::before { content: "\f304"; } +.fa-pen-alt::before { content: "\f305"; } +.fa-pen-alt-slash::before { content: "\e20f"; } +.fa-pen-circle::before { content: "\e20e"; } +.fa-pen-clip::before { content: "\f305"; } +.fa-pen-clip-slash::before { content: "\e20f"; } +.fa-pen-fancy::before { content: "\f5ac"; } +.fa-pen-fancy-slash::before { content: "\e210"; } +.fa-pen-field::before { content: "\e211"; } +.fa-pen-line::before { content: "\e212"; } +.fa-pen-nib::before { content: "\f5ad"; } +.fa-pen-nib-slash::before { content: "\e4a1"; } +.fa-pen-paintbrush::before { content: "\f618"; } +.fa-pen-ruler::before { content: "\f5ae"; } +.fa-pen-slash::before { content: "\e213"; } +.fa-pen-square::before { content: "\f14b"; } +.fa-pen-swirl::before { content: "\e214"; } +.fa-pen-to-square::before { content: "\f044"; } +.fa-pencil::before { content: "\f303"; } +.fa-pencil-alt::before { content: "\f303"; } +.fa-pencil-mechanical::before { content: "\e5ca"; } +.fa-pencil-paintbrush::before { content: "\f618"; } +.fa-pencil-ruler::before { content: "\f5ae"; } +.fa-pencil-slash::before { content: "\e215"; } +.fa-pencil-square::before { content: "\f14b"; } +.fa-pennant::before { content: "\f456"; } +.fa-people::before { content: "\e216"; } +.fa-people-arrows::before { content: "\e068"; } +.fa-people-arrows-left-right::before { content: "\e068"; } +.fa-people-carry::before { content: "\f4ce"; } +.fa-people-carry-box::before { content: "\f4ce"; } +.fa-people-dress::before { content: "\e217"; } +.fa-people-dress-simple::before { content: "\e218"; } +.fa-people-group::before { content: "\e533"; } +.fa-people-line::before { content: "\e534"; } +.fa-people-pants::before { content: "\e219"; } +.fa-people-pants-simple::before { content: "\e21a"; } +.fa-people-pulling::before { content: "\e535"; } +.fa-people-robbery::before { content: "\e536"; } +.fa-people-roof::before { content: "\e537"; } +.fa-people-simple::before { content: "\e21b"; } +.fa-pepper::before { content: "\e432"; } +.fa-pepper-hot::before { content: "\f816"; } +.fa-percent::before { content: "\25"; } +.fa-percentage::before { content: "\25"; } +.fa-period::before { content: "\2e"; } +.fa-person::before { content: "\f183"; } +.fa-person-arrow-down-to-line::before { content: "\e538"; } +.fa-person-arrow-up-from-line::before { content: "\e539"; } +.fa-person-biking::before { content: "\f84a"; } +.fa-person-biking-mountain::before { content: "\f84b"; } +.fa-person-booth::before { content: "\f756"; } +.fa-person-breastfeeding::before { content: "\e53a"; } +.fa-person-burst::before { content: "\e53b"; } +.fa-person-cane::before { content: "\e53c"; } +.fa-person-carry::before { content: "\f4cf"; } +.fa-person-carry-box::before { content: "\f4cf"; } +.fa-person-chalkboard::before { content: "\e53d"; } +.fa-person-circle-check::before { content: "\e53e"; } +.fa-person-circle-exclamation::before { content: "\e53f"; } +.fa-person-circle-minus::before { content: "\e540"; } +.fa-person-circle-plus::before { content: "\e541"; } +.fa-person-circle-question::before { content: "\e542"; } +.fa-person-circle-xmark::before { content: "\e543"; } +.fa-person-digging::before { content: "\f85e"; } +.fa-person-dolly::before { content: "\f4d0"; } +.fa-person-dolly-empty::before { content: "\f4d1"; } +.fa-person-dots-from-line::before { content: "\f470"; } +.fa-person-dress::before { content: "\f182"; } +.fa-person-dress-burst::before { content: "\e544"; } +.fa-person-dress-fairy::before { content: "\e607"; } +.fa-person-dress-simple::before { content: "\e21c"; } +.fa-person-drowning::before { content: "\e545"; } +.fa-person-fairy::before { content: "\e608"; } +.fa-person-falling::before { content: "\e546"; } +.fa-person-falling-burst::before { content: "\e547"; } +.fa-person-from-portal::before { content: "\e023"; } +.fa-person-half-dress::before { content: "\e548"; } +.fa-person-harassing::before { content: "\e549"; } +.fa-person-hiking::before { content: "\f6ec"; } +.fa-person-military-pointing::before { content: "\e54a"; } +.fa-person-military-rifle::before { content: "\e54b"; } +.fa-person-military-to-person::before { content: "\e54c"; } +.fa-person-pinball::before { content: "\e21d"; } +.fa-person-praying::before { content: "\f683"; } +.fa-person-pregnant::before { content: "\e31e"; } +.fa-person-rays::before { content: "\e54d"; } +.fa-person-rifle::before { content: "\e54e"; } +.fa-person-running::before { content: "\f70c"; } +.fa-person-running-fast::before { content: "\e5ff"; } +.fa-person-seat::before { content: "\e21e"; } +.fa-person-seat-reclined::before { content: "\e21f"; } +.fa-person-shelter::before { content: "\e54f"; } +.fa-person-sign::before { content: "\f757"; } +.fa-person-simple::before { content: "\e220"; } +.fa-person-skating::before { content: "\f7c5"; } +.fa-person-ski-jumping::before { content: "\f7c7"; } +.fa-person-ski-lift::before { content: "\f7c8"; } +.fa-person-skiing::before { content: "\f7c9"; } +.fa-person-skiing-nordic::before { content: "\f7ca"; } +.fa-person-sledding::before { content: "\f7cb"; } +.fa-person-snowboarding::before { content: "\f7ce"; } +.fa-person-snowmobiling::before { content: "\f7d1"; } +.fa-person-swimming::before { content: "\f5c4"; } +.fa-person-through-window::before { content: "\e5a9"; } +.fa-person-to-door::before { content: "\e433"; } +.fa-person-to-portal::before { content: "\e022"; } +.fa-person-walking::before { content: "\f554"; } +.fa-person-walking-arrow-loop-left::before { content: "\e551"; } +.fa-person-walking-arrow-right::before { content: "\e552"; } +.fa-person-walking-dashed-line-arrow-right::before { content: "\e553"; } +.fa-person-walking-luggage::before { content: "\e554"; } +.fa-person-walking-with-cane::before { content: "\f29d"; } +.fa-peseta-sign::before { content: "\e221"; } +.fa-peso-sign::before { content: "\e222"; } +.fa-phone::before { content: "\f095"; } +.fa-phone-alt::before { content: "\f879"; } +.fa-phone-arrow-down::before { content: "\e223"; } +.fa-phone-arrow-down-left::before { content: "\e223"; } +.fa-phone-arrow-right::before { content: "\e5be"; } +.fa-phone-arrow-up::before { content: "\e224"; } +.fa-phone-arrow-up-right::before { content: "\e224"; } +.fa-phone-circle::before { content: "\e11b"; } +.fa-phone-circle-alt::before { content: "\e11c"; } +.fa-phone-circle-down::before { content: "\e11d"; } +.fa-phone-flip::before { content: "\f879"; } +.fa-phone-hangup::before { content: "\e225"; } +.fa-phone-incoming::before { content: "\e223"; } +.fa-phone-intercom::before { content: "\e434"; } +.fa-phone-laptop::before { content: "\f87a"; } +.fa-phone-missed::before { content: "\e226"; } +.fa-phone-office::before { content: "\f67d"; } +.fa-phone-outgoing::before { content: "\e224"; } +.fa-phone-plus::before { content: "\f4d2"; } +.fa-phone-rotary::before { content: "\f8d3"; } +.fa-phone-slash::before { content: "\f3dd"; } +.fa-phone-square::before { content: "\f098"; } +.fa-phone-square-alt::before { content: "\f87b"; } +.fa-phone-square-down::before { content: "\e27a"; } +.fa-phone-volume::before { content: "\f2a0"; } +.fa-phone-xmark::before { content: "\e227"; } +.fa-photo-film::before { content: "\f87c"; } +.fa-photo-film-music::before { content: "\e228"; } +.fa-photo-video::before { content: "\f87c"; } +.fa-pi::before { content: "\f67e"; } +.fa-piano::before { content: "\f8d4"; } +.fa-piano-keyboard::before { content: "\f8d5"; } +.fa-pickaxe::before { content: "\e5bf"; } +.fa-pickleball::before { content: "\e435"; } +.fa-pie::before { content: "\f705"; } +.fa-pie-chart::before { content: "\f200"; } +.fa-pig::before { content: "\f706"; } +.fa-piggy-bank::before { content: "\f4d3"; } +.fa-pills::before { content: "\f484"; } +.fa-pinata::before { content: "\e3c3"; } +.fa-pinball::before { content: "\e229"; } +.fa-pineapple::before { content: "\e31f"; } +.fa-ping-pong-paddle-ball::before { content: "\f45d"; } +.fa-pipe::before { content: "\7c"; } +.fa-pipe-circle-check::before { content: "\e436"; } +.fa-pipe-collar::before { content: "\e437"; } +.fa-pipe-section::before { content: "\e438"; } +.fa-pipe-smoking::before { content: "\e3c4"; } +.fa-pipe-valve::before { content: "\e439"; } +.fa-pizza::before { content: "\f817"; } +.fa-pizza-slice::before { content: "\f818"; } +.fa-place-of-worship::before { content: "\f67f"; } +.fa-plane::before { content: "\f072"; } +.fa-plane-alt::before { content: "\f3de"; } +.fa-plane-arrival::before { content: "\f5af"; } +.fa-plane-circle-check::before { content: "\e555"; } +.fa-plane-circle-exclamation::before { content: "\e556"; } +.fa-plane-circle-xmark::before { content: "\e557"; } +.fa-plane-departure::before { content: "\f5b0"; } +.fa-plane-engines::before { content: "\f3de"; } +.fa-plane-lock::before { content: "\e558"; } +.fa-plane-prop::before { content: "\e22b"; } +.fa-plane-slash::before { content: "\e069"; } +.fa-plane-tail::before { content: "\e22c"; } +.fa-plane-up::before { content: "\e22d"; } +.fa-plane-up-slash::before { content: "\e22e"; } +.fa-planet-moon::before { content: "\e01f"; } +.fa-planet-ringed::before { content: "\e020"; } +.fa-plant-wilt::before { content: "\e5aa"; } +.fa-plate-utensils::before { content: "\e43b"; } +.fa-plate-wheat::before { content: "\e55a"; } +.fa-play::before { content: "\f04b"; } +.fa-play-circle::before { content: "\f144"; } +.fa-play-pause::before { content: "\e22f"; } +.fa-plug::before { content: "\f1e6"; } +.fa-plug-circle-bolt::before { content: "\e55b"; } +.fa-plug-circle-check::before { content: "\e55c"; } +.fa-plug-circle-exclamation::before { content: "\e55d"; } +.fa-plug-circle-minus::before { content: "\e55e"; } +.fa-plug-circle-plus::before { content: "\e55f"; } +.fa-plug-circle-xmark::before { content: "\e560"; } +.fa-plus::before { content: "\2b"; } +.fa-plus-circle::before { content: "\f055"; } +.fa-plus-hexagon::before { content: "\f300"; } +.fa-plus-large::before { content: "\e59e"; } +.fa-plus-minus::before { content: "\e43c"; } +.fa-plus-octagon::before { content: "\f301"; } +.fa-plus-square::before { content: "\f0fe"; } +.fa-podcast::before { content: "\f2ce"; } +.fa-podium::before { content: "\f680"; } +.fa-podium-star::before { content: "\f758"; } +.fa-police-box::before { content: "\e021"; } +.fa-poll::before { content: "\f681"; } +.fa-poll-h::before { content: "\f682"; } +.fa-poll-people::before { content: "\f759"; } +.fa-pompebled::before { content: "\e43d"; } +.fa-poo::before { content: "\f2fe"; } +.fa-poo-bolt::before { content: "\f75a"; } +.fa-poo-storm::before { content: "\f75a"; } +.fa-pool-8-ball::before { content: "\e3c5"; } +.fa-poop::before { content: "\f619"; } +.fa-popcorn::before { content: "\f819"; } +.fa-popsicle::before { content: "\e43e"; } +.fa-portal-enter::before { content: "\e022"; } +.fa-portal-exit::before { content: "\e023"; } +.fa-portrait::before { content: "\f3e0"; } +.fa-pot-food::before { content: "\e43f"; } +.fa-potato::before { content: "\e440"; } +.fa-pound-sign::before { content: "\f154"; } +.fa-power-off::before { content: "\f011"; } +.fa-pray::before { content: "\f683"; } +.fa-praying-hands::before { content: "\f684"; } +.fa-prescription::before { content: "\f5b1"; } +.fa-prescription-bottle::before { content: "\f485"; } +.fa-prescription-bottle-alt::before { content: "\f486"; } +.fa-prescription-bottle-medical::before { content: "\f486"; } +.fa-prescription-bottle-pill::before { content: "\e5c0"; } +.fa-presentation::before { content: "\f685"; } +.fa-presentation-screen::before { content: "\f685"; } +.fa-pretzel::before { content: "\e441"; } +.fa-print::before { content: "\f02f"; } +.fa-print-magnifying-glass::before { content: "\f81a"; } +.fa-print-search::before { content: "\f81a"; } +.fa-print-slash::before { content: "\f686"; } +.fa-pro::before { content: "\e235"; } +.fa-procedures::before { content: "\f487"; } +.fa-project-diagram::before { content: "\f542"; } +.fa-projector::before { content: "\f8d6"; } +.fa-pump::before { content: "\e442"; } +.fa-pump-medical::before { content: "\e06a"; } +.fa-pump-soap::before { content: "\e06b"; } +.fa-pumpkin::before { content: "\f707"; } +.fa-puzzle::before { content: "\e443"; } +.fa-puzzle-piece::before { content: "\f12e"; } +.fa-puzzle-piece-alt::before { content: "\e231"; } +.fa-puzzle-piece-simple::before { content: "\e231"; } +.fa-q::before { content: "\51"; } +.fa-qrcode::before { content: "\f029"; } +.fa-question::before { content: "\3f"; } +.fa-question-circle::before { content: "\f059"; } +.fa-question-square::before { content: "\f2fd"; } +.fa-quidditch::before { content: "\f458"; } +.fa-quidditch-broom-ball::before { content: "\f458"; } +.fa-quote-left::before { content: "\f10d"; } +.fa-quote-left-alt::before { content: "\f10d"; } +.fa-quote-right::before { content: "\f10e"; } +.fa-quote-right-alt::before { content: "\f10e"; } +.fa-quotes::before { content: "\e234"; } +.fa-quran::before { content: "\f687"; } +.fa-r::before { content: "\52"; } +.fa-rabbit::before { content: "\f708"; } +.fa-rabbit-fast::before { content: "\f709"; } +.fa-rabbit-running::before { content: "\f709"; } +.fa-raccoon::before { content: "\e613"; } +.fa-racquet::before { content: "\f45a"; } +.fa-radar::before { content: "\e024"; } +.fa-radiation::before { content: "\f7b9"; } +.fa-radiation-alt::before { content: "\f7ba"; } +.fa-radio::before { content: "\f8d7"; } +.fa-radio-alt::before { content: "\f8d8"; } +.fa-radio-tuner::before { content: "\f8d8"; } +.fa-rainbow::before { content: "\f75b"; } +.fa-raindrops::before { content: "\f75c"; } +.fa-ram::before { content: "\f70a"; } +.fa-ramp-loading::before { content: "\f4d4"; } +.fa-random::before { content: "\f074"; } +.fa-ranking-star::before { content: "\e561"; } +.fa-raygun::before { content: "\e025"; } +.fa-receipt::before { content: "\f543"; } +.fa-record-vinyl::before { content: "\f8d9"; } +.fa-rectangle::before { content: "\f2fa"; } +.fa-rectangle-ad::before { content: "\f641"; } +.fa-rectangle-barcode::before { content: "\f463"; } +.fa-rectangle-code::before { content: "\e322"; } +.fa-rectangle-hd::before { content: "\e1ae"; } +.fa-rectangle-history::before { content: "\e4a2"; } +.fa-rectangle-history-circle-plus::before { content: "\e4a3"; } +.fa-rectangle-history-circle-user::before { content: "\e4a4"; } +.fa-rectangle-landscape::before { content: "\f2fa"; } +.fa-rectangle-list::before { content: "\f022"; } +.fa-rectangle-portrait::before { content: "\f2fb"; } +.fa-rectangle-pro::before { content: "\e235"; } +.fa-rectangle-sd::before { content: "\e28a"; } +.fa-rectangle-terminal::before { content: "\e236"; } +.fa-rectangle-times::before { content: "\f410"; } +.fa-rectangle-vertical::before { content: "\f2fb"; } +.fa-rectangle-vertical-history::before { content: "\e237"; } +.fa-rectangle-wide::before { content: "\f2fc"; } +.fa-rectangle-xmark::before { content: "\f410"; } +.fa-rectangles-mixed::before { content: "\e323"; } +.fa-recycle::before { content: "\f1b8"; } +.fa-redo::before { content: "\f01e"; } +.fa-redo-alt::before { content: "\f2f9"; } +.fa-reel::before { content: "\e238"; } +.fa-reflect-both::before { content: "\e66f"; } +.fa-reflect-horizontal::before { content: "\e664"; } +.fa-reflect-vertical::before { content: "\e665"; } +.fa-refresh::before { content: "\f021"; } +.fa-refrigerator::before { content: "\e026"; } +.fa-registered::before { content: "\f25d"; } +.fa-remove::before { content: "\f00d"; } +.fa-remove-format::before { content: "\f87d"; } +.fa-reorder::before { content: "\f550"; } +.fa-repeat::before { content: "\f363"; } +.fa-repeat-1::before { content: "\f365"; } +.fa-repeat-1-alt::before { content: "\f366"; } +.fa-repeat-alt::before { content: "\f364"; } +.fa-reply::before { content: "\f3e5"; } +.fa-reply-all::before { content: "\f122"; } +.fa-reply-clock::before { content: "\e239"; } +.fa-reply-time::before { content: "\e239"; } +.fa-republican::before { content: "\f75e"; } +.fa-restroom::before { content: "\f7bd"; } +.fa-restroom-simple::before { content: "\e23a"; } +.fa-retweet::before { content: "\f079"; } +.fa-retweet-alt::before { content: "\f361"; } +.fa-rhombus::before { content: "\e23b"; } +.fa-ribbon::before { content: "\f4d6"; } +.fa-right::before { content: "\f356"; } +.fa-right-from-bracket::before { content: "\f2f5"; } +.fa-right-from-line::before { content: "\f347"; } +.fa-right-left::before { content: "\f362"; } +.fa-right-left-large::before { content: "\e5e1"; } +.fa-right-long::before { content: "\f30b"; } +.fa-right-long-to-line::before { content: "\e444"; } +.fa-right-to-bracket::before { content: "\f2f6"; } +.fa-right-to-line::before { content: "\f34c"; } +.fa-ring::before { content: "\f70b"; } +.fa-ring-diamond::before { content: "\e5ab"; } +.fa-rings-wedding::before { content: "\f81b"; } +.fa-rmb::before { content: "\f157"; } +.fa-road::before { content: "\f018"; } +.fa-road-barrier::before { content: "\e562"; } +.fa-road-bridge::before { content: "\e563"; } +.fa-road-circle-check::before { content: "\e564"; } +.fa-road-circle-exclamation::before { content: "\e565"; } +.fa-road-circle-xmark::before { content: "\e566"; } +.fa-road-lock::before { content: "\e567"; } +.fa-road-spikes::before { content: "\e568"; } +.fa-robot::before { content: "\f544"; } +.fa-robot-astromech::before { content: "\e2d2"; } +.fa-rocket::before { content: "\f135"; } +.fa-rocket-launch::before { content: "\e027"; } +.fa-rod-asclepius::before { content: "\e579"; } +.fa-rod-snake::before { content: "\e579"; } +.fa-roller-coaster::before { content: "\e324"; } +.fa-rotate::before { content: "\f2f1"; } +.fa-rotate-back::before { content: "\f2ea"; } +.fa-rotate-backward::before { content: "\f2ea"; } +.fa-rotate-exclamation::before { content: "\e23c"; } +.fa-rotate-forward::before { content: "\f2f9"; } +.fa-rotate-left::before { content: "\f2ea"; } +.fa-rotate-reverse::before { content: "\e631"; } +.fa-rotate-right::before { content: "\f2f9"; } +.fa-rouble::before { content: "\f158"; } +.fa-route::before { content: "\f4d7"; } +.fa-route-highway::before { content: "\f61a"; } +.fa-route-interstate::before { content: "\f61b"; } +.fa-router::before { content: "\f8da"; } +.fa-rows::before { content: "\e292"; } +.fa-rss::before { content: "\f09e"; } +.fa-rss-square::before { content: "\f143"; } +.fa-rub::before { content: "\f158"; } +.fa-ruble::before { content: "\f158"; } +.fa-ruble-sign::before { content: "\f158"; } +.fa-rug::before { content: "\e569"; } +.fa-rugby-ball::before { content: "\e3c6"; } +.fa-ruler::before { content: "\f545"; } +.fa-ruler-combined::before { content: "\f546"; } +.fa-ruler-horizontal::before { content: "\f547"; } +.fa-ruler-triangle::before { content: "\f61c"; } +.fa-ruler-vertical::before { content: "\f548"; } +.fa-running::before { content: "\f70c"; } +.fa-rupee::before { content: "\f156"; } +.fa-rupee-sign::before { content: "\f156"; } +.fa-rupiah-sign::before { content: "\e23d"; } +.fa-rv::before { content: "\f7be"; } +.fa-s::before { content: "\53"; } +.fa-sack::before { content: "\f81c"; } +.fa-sack-dollar::before { content: "\f81d"; } +.fa-sack-xmark::before { content: "\e56a"; } +.fa-sad-cry::before { content: "\f5b3"; } +.fa-sad-tear::before { content: "\f5b4"; } +.fa-sailboat::before { content: "\e445"; } +.fa-salad::before { content: "\f81e"; } +.fa-salt-shaker::before { content: "\e446"; } +.fa-sandwich::before { content: "\f81f"; } +.fa-satellite::before { content: "\f7bf"; } +.fa-satellite-dish::before { content: "\f7c0"; } +.fa-sausage::before { content: "\f820"; } +.fa-save::before { content: "\f0c7"; } +.fa-save-circle-arrow-right::before { content: "\e180"; } +.fa-save-circle-xmark::before { content: "\e181"; } +.fa-save-times::before { content: "\e181"; } +.fa-sax-hot::before { content: "\f8db"; } +.fa-saxophone::before { content: "\f8dc"; } +.fa-saxophone-fire::before { content: "\f8db"; } +.fa-scale-balanced::before { content: "\f24e"; } +.fa-scale-unbalanced::before { content: "\f515"; } +.fa-scale-unbalanced-flip::before { content: "\f516"; } +.fa-scalpel::before { content: "\f61d"; } +.fa-scalpel-line-dashed::before { content: "\f61e"; } +.fa-scalpel-path::before { content: "\f61e"; } +.fa-scanner::before { content: "\f488"; } +.fa-scanner-gun::before { content: "\f488"; } +.fa-scanner-image::before { content: "\f8f3"; } +.fa-scanner-keyboard::before { content: "\f489"; } +.fa-scanner-touchscreen::before { content: "\f48a"; } +.fa-scarecrow::before { content: "\f70d"; } +.fa-scarf::before { content: "\f7c1"; } +.fa-school::before { content: "\f549"; } +.fa-school-circle-check::before { content: "\e56b"; } +.fa-school-circle-exclamation::before { content: "\e56c"; } +.fa-school-circle-xmark::before { content: "\e56d"; } +.fa-school-flag::before { content: "\e56e"; } +.fa-school-lock::before { content: "\e56f"; } +.fa-scissors::before { content: "\f0c4"; } +.fa-screen-users::before { content: "\f63d"; } +.fa-screencast::before { content: "\e23e"; } +.fa-screenshot::before { content: "\e0da"; } +.fa-screwdriver::before { content: "\f54a"; } +.fa-screwdriver-wrench::before { content: "\f7d9"; } +.fa-scribble::before { content: "\e23f"; } +.fa-scroll::before { content: "\f70e"; } +.fa-scroll-old::before { content: "\f70f"; } +.fa-scroll-ribbon::before { content: "\f5ea"; } +.fa-scroll-torah::before { content: "\f6a0"; } +.fa-scrubber::before { content: "\f2f8"; } +.fa-scythe::before { content: "\f710"; } +.fa-sd-card::before { content: "\f7c2"; } +.fa-sd-cards::before { content: "\e240"; } +.fa-seal::before { content: "\e241"; } +.fa-seal-exclamation::before { content: "\e242"; } +.fa-seal-question::before { content: "\e243"; } +.fa-search::before { content: "\f002"; } +.fa-search-dollar::before { content: "\f688"; } +.fa-search-location::before { content: "\f689"; } +.fa-search-minus::before { content: "\f010"; } +.fa-search-plus::before { content: "\f00e"; } +.fa-seat-airline::before { content: "\e244"; } +.fa-section::before { content: "\e447"; } +.fa-seedling::before { content: "\f4d8"; } +.fa-semicolon::before { content: "\3b"; } +.fa-send::before { content: "\e20a"; } +.fa-send-back::before { content: "\f87e"; } +.fa-send-backward::before { content: "\f87f"; } +.fa-sensor::before { content: "\e028"; } +.fa-sensor-alert::before { content: "\e029"; } +.fa-sensor-cloud::before { content: "\e02c"; } +.fa-sensor-fire::before { content: "\e02a"; } +.fa-sensor-on::before { content: "\e02b"; } +.fa-sensor-smoke::before { content: "\e02c"; } +.fa-sensor-triangle-exclamation::before { content: "\e029"; } +.fa-server::before { content: "\f233"; } +.fa-shapes::before { content: "\f61f"; } +.fa-share::before { content: "\f064"; } +.fa-share-all::before { content: "\f367"; } +.fa-share-alt::before { content: "\f1e0"; } +.fa-share-alt-square::before { content: "\f1e1"; } +.fa-share-from-square::before { content: "\f14d"; } +.fa-share-nodes::before { content: "\f1e0"; } +.fa-share-square::before { content: "\f14d"; } +.fa-sheep::before { content: "\f711"; } +.fa-sheet-plastic::before { content: "\e571"; } +.fa-shekel::before { content: "\f20b"; } +.fa-shekel-sign::before { content: "\f20b"; } +.fa-shelves::before { content: "\f480"; } +.fa-shelves-empty::before { content: "\e246"; } +.fa-sheqel::before { content: "\f20b"; } +.fa-sheqel-sign::before { content: "\f20b"; } +.fa-shield::before { content: "\f132"; } +.fa-shield-alt::before { content: "\f3ed"; } +.fa-shield-blank::before { content: "\f132"; } +.fa-shield-cat::before { content: "\e572"; } +.fa-shield-check::before { content: "\f2f7"; } +.fa-shield-cross::before { content: "\f712"; } +.fa-shield-dog::before { content: "\e573"; } +.fa-shield-exclamation::before { content: "\e247"; } +.fa-shield-halved::before { content: "\f3ed"; } +.fa-shield-heart::before { content: "\e574"; } +.fa-shield-keyhole::before { content: "\e248"; } +.fa-shield-minus::before { content: "\e249"; } +.fa-shield-plus::before { content: "\e24a"; } +.fa-shield-quartered::before { content: "\e575"; } +.fa-shield-slash::before { content: "\e24b"; } +.fa-shield-times::before { content: "\e24c"; } +.fa-shield-virus::before { content: "\e06c"; } +.fa-shield-xmark::before { content: "\e24c"; } +.fa-ship::before { content: "\f21a"; } +.fa-shipping-fast::before { content: "\f48b"; } +.fa-shipping-timed::before { content: "\f48c"; } +.fa-shirt::before { content: "\f553"; } +.fa-shirt-long-sleeve::before { content: "\e3c7"; } +.fa-shirt-running::before { content: "\e3c8"; } +.fa-shirt-tank-top::before { content: "\e3c9"; } +.fa-shish-kebab::before { content: "\f821"; } +.fa-shoe-prints::before { content: "\f54b"; } +.fa-shop::before { content: "\f54f"; } +.fa-shop-lock::before { content: "\e4a5"; } +.fa-shop-slash::before { content: "\e070"; } +.fa-shopping-bag::before { content: "\f290"; } +.fa-shopping-basket::before { content: "\f291"; } +.fa-shopping-basket-alt::before { content: "\e0af"; } +.fa-shopping-cart::before { content: "\f07a"; } +.fa-shortcake::before { content: "\e3e5"; } +.fa-shovel::before { content: "\f713"; } +.fa-shovel-snow::before { content: "\f7c3"; } +.fa-shower::before { content: "\f2cc"; } +.fa-shower-alt::before { content: "\e24d"; } +.fa-shower-down::before { content: "\e24d"; } +.fa-shredder::before { content: "\f68a"; } +.fa-shrimp::before { content: "\e448"; } +.fa-shuffle::before { content: "\f074"; } +.fa-shutters::before { content: "\e449"; } +.fa-shuttle-space::before { content: "\f197"; } +.fa-shuttle-van::before { content: "\f5b6"; } +.fa-shuttlecock::before { content: "\f45b"; } +.fa-sickle::before { content: "\f822"; } +.fa-sidebar::before { content: "\e24e"; } +.fa-sidebar-flip::before { content: "\e24f"; } +.fa-sigma::before { content: "\f68b"; } +.fa-sign::before { content: "\f4d9"; } +.fa-sign-hanging::before { content: "\f4d9"; } +.fa-sign-in::before { content: "\f090"; } +.fa-sign-in-alt::before { content: "\f2f6"; } +.fa-sign-language::before { content: "\f2a7"; } +.fa-sign-out::before { content: "\f08b"; } +.fa-sign-out-alt::before { content: "\f2f5"; } +.fa-sign-post::before { content: "\e624"; } +.fa-sign-posts::before { content: "\e625"; } +.fa-sign-posts-wrench::before { content: "\e626"; } +.fa-signal::before { content: "\f012"; } +.fa-signal-1::before { content: "\f68c"; } +.fa-signal-2::before { content: "\f68d"; } +.fa-signal-3::before { content: "\f68e"; } +.fa-signal-4::before { content: "\f68f"; } +.fa-signal-5::before { content: "\f012"; } +.fa-signal-alt::before { content: "\f690"; } +.fa-signal-alt-1::before { content: "\f691"; } +.fa-signal-alt-2::before { content: "\f692"; } +.fa-signal-alt-3::before { content: "\f693"; } +.fa-signal-alt-4::before { content: "\f690"; } +.fa-signal-alt-slash::before { content: "\f694"; } +.fa-signal-bars::before { content: "\f690"; } +.fa-signal-bars-fair::before { content: "\f692"; } +.fa-signal-bars-good::before { content: "\f693"; } +.fa-signal-bars-slash::before { content: "\f694"; } +.fa-signal-bars-strong::before { content: "\f690"; } +.fa-signal-bars-weak::before { content: "\f691"; } +.fa-signal-fair::before { content: "\f68d"; } +.fa-signal-good::before { content: "\f68e"; } +.fa-signal-perfect::before { content: "\f012"; } +.fa-signal-slash::before { content: "\f695"; } +.fa-signal-stream::before { content: "\f8dd"; } +.fa-signal-stream-slash::before { content: "\e250"; } +.fa-signal-strong::before { content: "\f68f"; } +.fa-signal-weak::before { content: "\f68c"; } +.fa-signature::before { content: "\f5b7"; } +.fa-signature-lock::before { content: "\e3ca"; } +.fa-signature-slash::before { content: "\e3cb"; } +.fa-signing::before { content: "\f2a7"; } +.fa-signs-post::before { content: "\f277"; } +.fa-sim-card::before { content: "\f7c4"; } +.fa-sim-cards::before { content: "\e251"; } +.fa-sink::before { content: "\e06d"; } +.fa-siren::before { content: "\e02d"; } +.fa-siren-on::before { content: "\e02e"; } +.fa-sitemap::before { content: "\f0e8"; } +.fa-skating::before { content: "\f7c5"; } +.fa-skeleton::before { content: "\f620"; } +.fa-skeleton-ribs::before { content: "\e5cb"; } +.fa-ski-boot::before { content: "\e3cc"; } +.fa-ski-boot-ski::before { content: "\e3cd"; } +.fa-ski-jump::before { content: "\f7c7"; } +.fa-ski-lift::before { content: "\f7c8"; } +.fa-skiing::before { content: "\f7c9"; } +.fa-skiing-nordic::before { content: "\f7ca"; } +.fa-skull::before { content: "\f54c"; } +.fa-skull-cow::before { content: "\f8de"; } +.fa-skull-crossbones::before { content: "\f714"; } +.fa-slash::before { content: "\f715"; } +.fa-slash-back::before { content: "\5c"; } +.fa-slash-forward::before { content: "\2f"; } +.fa-sledding::before { content: "\f7cb"; } +.fa-sleigh::before { content: "\f7cc"; } +.fa-slider::before { content: "\e252"; } +.fa-sliders::before { content: "\f1de"; } +.fa-sliders-h::before { content: "\f1de"; } +.fa-sliders-h-square::before { content: "\f3f0"; } +.fa-sliders-simple::before { content: "\e253"; } +.fa-sliders-up::before { content: "\f3f1"; } +.fa-sliders-v::before { content: "\f3f1"; } +.fa-sliders-v-square::before { content: "\f3f2"; } +.fa-slot-machine::before { content: "\e3ce"; } +.fa-smile::before { content: "\f118"; } +.fa-smile-beam::before { content: "\f5b8"; } +.fa-smile-plus::before { content: "\f5b9"; } +.fa-smile-wink::before { content: "\f4da"; } +.fa-smog::before { content: "\f75f"; } +.fa-smoke::before { content: "\f760"; } +.fa-smoking::before { content: "\f48d"; } +.fa-smoking-ban::before { content: "\f54d"; } +.fa-sms::before { content: "\f7cd"; } +.fa-snake::before { content: "\f716"; } +.fa-snooze::before { content: "\f880"; } +.fa-snow-blowing::before { content: "\f761"; } +.fa-snowboarding::before { content: "\f7ce"; } +.fa-snowflake::before { content: "\f2dc"; } +.fa-snowflake-droplets::before { content: "\e5c1"; } +.fa-snowflakes::before { content: "\f7cf"; } +.fa-snowman::before { content: "\f7d0"; } +.fa-snowman-head::before { content: "\f79b"; } +.fa-snowmobile::before { content: "\f7d1"; } +.fa-snowplow::before { content: "\f7d2"; } +.fa-soap::before { content: "\e06e"; } +.fa-soccer-ball::before { content: "\f1e3"; } +.fa-socks::before { content: "\f696"; } +.fa-soft-serve::before { content: "\e400"; } +.fa-solar-panel::before { content: "\f5ba"; } +.fa-solar-system::before { content: "\e02f"; } +.fa-sort::before { content: "\f0dc"; } +.fa-sort-alpha-asc::before { content: "\f15d"; } +.fa-sort-alpha-desc::before { content: "\f881"; } +.fa-sort-alpha-down::before { content: "\f15d"; } +.fa-sort-alpha-down-alt::before { content: "\f881"; } +.fa-sort-alpha-up::before { content: "\f15e"; } +.fa-sort-alpha-up-alt::before { content: "\f882"; } +.fa-sort-alt::before { content: "\f883"; } +.fa-sort-amount-asc::before { content: "\f160"; } +.fa-sort-amount-desc::before { content: "\f884"; } +.fa-sort-amount-down::before { content: "\f160"; } +.fa-sort-amount-down-alt::before { content: "\f884"; } +.fa-sort-amount-up::before { content: "\f161"; } +.fa-sort-amount-up-alt::before { content: "\f885"; } +.fa-sort-asc::before { content: "\f0de"; } +.fa-sort-circle::before { content: "\e030"; } +.fa-sort-circle-down::before { content: "\e031"; } +.fa-sort-circle-up::before { content: "\e032"; } +.fa-sort-desc::before { content: "\f0dd"; } +.fa-sort-down::before { content: "\f0dd"; } +.fa-sort-numeric-asc::before { content: "\f162"; } +.fa-sort-numeric-desc::before { content: "\f886"; } +.fa-sort-numeric-down::before { content: "\f162"; } +.fa-sort-numeric-down-alt::before { content: "\f886"; } +.fa-sort-numeric-up::before { content: "\f163"; } +.fa-sort-numeric-up-alt::before { content: "\f887"; } +.fa-sort-shapes-down::before { content: "\f888"; } +.fa-sort-shapes-down-alt::before { content: "\f889"; } +.fa-sort-shapes-up::before { content: "\f88a"; } +.fa-sort-shapes-up-alt::before { content: "\f88b"; } +.fa-sort-size-down::before { content: "\f88c"; } +.fa-sort-size-down-alt::before { content: "\f88d"; } +.fa-sort-size-up::before { content: "\f88e"; } +.fa-sort-size-up-alt::before { content: "\f88f"; } +.fa-sort-up::before { content: "\f0de"; } +.fa-sort-up-down::before { content: "\e099"; } +.fa-soup::before { content: "\f823"; } +.fa-spa::before { content: "\f5bb"; } +.fa-space-shuttle::before { content: "\f197"; } +.fa-space-station-moon::before { content: "\e033"; } +.fa-space-station-moon-alt::before { content: "\e034"; } +.fa-space-station-moon-construction::before { content: "\e034"; } +.fa-spade::before { content: "\f2f4"; } +.fa-spaghetti-monster-flying::before { content: "\f67b"; } +.fa-sparkle::before { content: "\e5d6"; } +.fa-sparkles::before { content: "\f890"; } +.fa-speaker::before { content: "\f8df"; } +.fa-speakers::before { content: "\f8e0"; } +.fa-spell-check::before { content: "\f891"; } +.fa-spider::before { content: "\f717"; } +.fa-spider-black-widow::before { content: "\f718"; } +.fa-spider-web::before { content: "\f719"; } +.fa-spinner::before { content: "\f110"; } +.fa-spinner-scale::before { content: "\e62a"; } +.fa-spinner-third::before { content: "\f3f4"; } +.fa-split::before { content: "\e254"; } +.fa-splotch::before { content: "\f5bc"; } +.fa-spoon::before { content: "\f2e5"; } +.fa-sportsball::before { content: "\e44b"; } +.fa-spray-can::before { content: "\f5bd"; } +.fa-spray-can-sparkles::before { content: "\f5d0"; } +.fa-sprinkler::before { content: "\e035"; } +.fa-sprinkler-ceiling::before { content: "\e44c"; } +.fa-sprout::before { content: "\f4d8"; } +.fa-square::before { content: "\f0c8"; } +.fa-square-0::before { content: "\e255"; } +.fa-square-1::before { content: "\e256"; } +.fa-square-2::before { content: "\e257"; } +.fa-square-3::before { content: "\e258"; } +.fa-square-4::before { content: "\e259"; } +.fa-square-5::before { content: "\e25a"; } +.fa-square-6::before { content: "\e25b"; } +.fa-square-7::before { content: "\e25c"; } +.fa-square-8::before { content: "\e25d"; } +.fa-square-9::before { content: "\e25e"; } +.fa-square-a::before { content: "\e25f"; } +.fa-square-a-lock::before { content: "\e44d"; } +.fa-square-ampersand::before { content: "\e260"; } +.fa-square-arrow-down::before { content: "\f339"; } +.fa-square-arrow-down-left::before { content: "\e261"; } +.fa-square-arrow-down-right::before { content: "\e262"; } +.fa-square-arrow-left::before { content: "\f33a"; } +.fa-square-arrow-right::before { content: "\f33b"; } +.fa-square-arrow-up::before { content: "\f33c"; } +.fa-square-arrow-up-left::before { content: "\e263"; } +.fa-square-arrow-up-right::before { content: "\f14c"; } +.fa-square-b::before { content: "\e264"; } +.fa-square-bolt::before { content: "\e265"; } +.fa-square-c::before { content: "\e266"; } +.fa-square-caret-down::before { content: "\f150"; } +.fa-square-caret-left::before { content: "\f191"; } +.fa-square-caret-right::before { content: "\f152"; } +.fa-square-caret-up::before { content: "\f151"; } +.fa-square-check::before { content: "\f14a"; } +.fa-square-chevron-down::before { content: "\f329"; } +.fa-square-chevron-left::before { content: "\f32a"; } +.fa-square-chevron-right::before { content: "\f32b"; } +.fa-square-chevron-up::before { content: "\f32c"; } +.fa-square-code::before { content: "\e267"; } +.fa-square-d::before { content: "\e268"; } +.fa-square-dashed::before { content: "\e269"; } +.fa-square-dashed-circle-plus::before { content: "\e5c2"; } +.fa-square-divide::before { content: "\e26a"; } +.fa-square-dollar::before { content: "\f2e9"; } +.fa-square-down::before { content: "\f350"; } +.fa-square-down-left::before { content: "\e26b"; } +.fa-square-down-right::before { content: "\e26c"; } +.fa-square-e::before { content: "\e26d"; } +.fa-square-ellipsis::before { content: "\e26e"; } +.fa-square-ellipsis-vertical::before { content: "\e26f"; } +.fa-square-envelope::before { content: "\f199"; } +.fa-square-exclamation::before { content: "\f321"; } +.fa-square-f::before { content: "\e270"; } +.fa-square-fragile::before { content: "\f49b"; } +.fa-square-full::before { content: "\f45c"; } +.fa-square-g::before { content: "\e271"; } +.fa-square-h::before { content: "\f0fd"; } +.fa-square-heart::before { content: "\f4c8"; } +.fa-square-i::before { content: "\e272"; } +.fa-square-info::before { content: "\f30f"; } +.fa-square-j::before { content: "\e273"; } +.fa-square-k::before { content: "\e274"; } +.fa-square-kanban::before { content: "\e488"; } +.fa-square-l::before { content: "\e275"; } +.fa-square-left::before { content: "\f351"; } +.fa-square-list::before { content: "\e489"; } +.fa-square-m::before { content: "\e276"; } +.fa-square-minus::before { content: "\f146"; } +.fa-square-n::before { content: "\e277"; } +.fa-square-nfi::before { content: "\e576"; } +.fa-square-o::before { content: "\e278"; } +.fa-square-p::before { content: "\e279"; } +.fa-square-parking::before { content: "\f540"; } +.fa-square-parking-slash::before { content: "\f617"; } +.fa-square-pen::before { content: "\f14b"; } +.fa-square-person-confined::before { content: "\e577"; } +.fa-square-phone::before { content: "\f098"; } +.fa-square-phone-flip::before { content: "\f87b"; } +.fa-square-phone-hangup::before { content: "\e27a"; } +.fa-square-plus::before { content: "\f0fe"; } +.fa-square-poll-horizontal::before { content: "\f682"; } +.fa-square-poll-vertical::before { content: "\f681"; } +.fa-square-q::before { content: "\e27b"; } +.fa-square-quarters::before { content: "\e44e"; } +.fa-square-question::before { content: "\f2fd"; } +.fa-square-quote::before { content: "\e329"; } +.fa-square-r::before { content: "\e27c"; } +.fa-square-right::before { content: "\f352"; } +.fa-square-ring::before { content: "\e44f"; } +.fa-square-root::before { content: "\f697"; } +.fa-square-root-alt::before { content: "\f698"; } +.fa-square-root-variable::before { content: "\f698"; } +.fa-square-rss::before { content: "\f143"; } +.fa-square-s::before { content: "\e27d"; } +.fa-square-share-nodes::before { content: "\f1e1"; } +.fa-square-sliders::before { content: "\f3f0"; } +.fa-square-sliders-vertical::before { content: "\f3f2"; } +.fa-square-small::before { content: "\e27e"; } +.fa-square-star::before { content: "\e27f"; } +.fa-square-t::before { content: "\e280"; } +.fa-square-terminal::before { content: "\e32a"; } +.fa-square-this-way-up::before { content: "\f49f"; } +.fa-square-u::before { content: "\e281"; } +.fa-square-up::before { content: "\f353"; } +.fa-square-up-left::before { content: "\e282"; } +.fa-square-up-right::before { content: "\f360"; } +.fa-square-user::before { content: "\e283"; } +.fa-square-v::before { content: "\e284"; } +.fa-square-virus::before { content: "\e578"; } +.fa-square-w::before { content: "\e285"; } +.fa-square-wine-glass-crack::before { content: "\f49b"; } +.fa-square-x::before { content: "\e286"; } +.fa-square-xmark::before { content: "\f2d3"; } +.fa-square-y::before { content: "\e287"; } +.fa-square-z::before { content: "\e288"; } +.fa-squid::before { content: "\e450"; } +.fa-squirrel::before { content: "\f71a"; } +.fa-staff::before { content: "\f71b"; } +.fa-staff-aesculapius::before { content: "\e579"; } +.fa-staff-snake::before { content: "\e579"; } +.fa-stairs::before { content: "\e289"; } +.fa-stamp::before { content: "\f5bf"; } +.fa-standard-definition::before { content: "\e28a"; } +.fa-stapler::before { content: "\e5af"; } +.fa-star::before { content: "\f005"; } +.fa-star-and-crescent::before { content: "\f699"; } +.fa-star-christmas::before { content: "\f7d4"; } +.fa-star-circle::before { content: "\e123"; } +.fa-star-exclamation::before { content: "\f2f3"; } +.fa-star-half::before { content: "\f089"; } +.fa-star-half-alt::before { content: "\f5c0"; } +.fa-star-half-stroke::before { content: "\f5c0"; } +.fa-star-of-david::before { content: "\f69a"; } +.fa-star-of-life::before { content: "\f621"; } +.fa-star-sharp::before { content: "\e28b"; } +.fa-star-sharp-half::before { content: "\e28c"; } +.fa-star-sharp-half-alt::before { content: "\e28d"; } +.fa-star-sharp-half-stroke::before { content: "\e28d"; } +.fa-star-shooting::before { content: "\e036"; } +.fa-starfighter::before { content: "\e037"; } +.fa-starfighter-alt::before { content: "\e038"; } +.fa-starfighter-alt-advanced::before { content: "\e28e"; } +.fa-starfighter-twin-ion-engine::before { content: "\e038"; } +.fa-starfighter-twin-ion-engine-advanced::before { content: "\e28e"; } +.fa-stars::before { content: "\f762"; } +.fa-starship::before { content: "\e039"; } +.fa-starship-freighter::before { content: "\e03a"; } +.fa-steak::before { content: "\f824"; } +.fa-steering-wheel::before { content: "\f622"; } +.fa-step-backward::before { content: "\f048"; } +.fa-step-forward::before { content: "\f051"; } +.fa-sterling-sign::before { content: "\f154"; } +.fa-stethoscope::before { content: "\f0f1"; } +.fa-sticky-note::before { content: "\f249"; } +.fa-stocking::before { content: "\f7d5"; } +.fa-stomach::before { content: "\f623"; } +.fa-stop::before { content: "\f04d"; } +.fa-stop-circle::before { content: "\f28d"; } +.fa-stopwatch::before { content: "\f2f2"; } +.fa-stopwatch-20::before { content: "\e06f"; } +.fa-store::before { content: "\f54e"; } +.fa-store-alt::before { content: "\f54f"; } +.fa-store-alt-slash::before { content: "\e070"; } +.fa-store-lock::before { content: "\e4a6"; } +.fa-store-slash::before { content: "\e071"; } +.fa-strawberry::before { content: "\e32b"; } +.fa-stream::before { content: "\f550"; } +.fa-street-view::before { content: "\f21d"; } +.fa-stretcher::before { content: "\f825"; } +.fa-strikethrough::before { content: "\f0cc"; } +.fa-stroopwafel::before { content: "\f551"; } +.fa-subscript::before { content: "\f12c"; } +.fa-subtitles::before { content: "\e60f"; } +.fa-subtitles-slash::before { content: "\e610"; } +.fa-subtract::before { content: "\f068"; } +.fa-subway::before { content: "\f239"; } +.fa-subway-tunnel::before { content: "\e2a3"; } +.fa-suitcase::before { content: "\f0f2"; } +.fa-suitcase-medical::before { content: "\f0fa"; } +.fa-suitcase-rolling::before { content: "\f5c1"; } +.fa-sun::before { content: "\f185"; } +.fa-sun-alt::before { content: "\e28f"; } +.fa-sun-bright::before { content: "\e28f"; } +.fa-sun-cloud::before { content: "\f763"; } +.fa-sun-dust::before { content: "\f764"; } +.fa-sun-haze::before { content: "\f765"; } +.fa-sun-plant-wilt::before { content: "\e57a"; } +.fa-sunglasses::before { content: "\f892"; } +.fa-sunrise::before { content: "\f766"; } +.fa-sunset::before { content: "\f767"; } +.fa-superscript::before { content: "\f12b"; } +.fa-surprise::before { content: "\f5c2"; } +.fa-sushi::before { content: "\e48a"; } +.fa-sushi-roll::before { content: "\e48b"; } +.fa-swap::before { content: "\e609"; } +.fa-swap-arrows::before { content: "\e60a"; } +.fa-swatchbook::before { content: "\f5c3"; } +.fa-swimmer::before { content: "\f5c4"; } +.fa-swimming-pool::before { content: "\f5c5"; } +.fa-sword::before { content: "\f71c"; } +.fa-sword-laser::before { content: "\e03b"; } +.fa-sword-laser-alt::before { content: "\e03c"; } +.fa-swords::before { content: "\f71d"; } +.fa-swords-laser::before { content: "\e03d"; } +.fa-symbols::before { content: "\f86e"; } +.fa-synagogue::before { content: "\f69b"; } +.fa-sync::before { content: "\f021"; } +.fa-sync-alt::before { content: "\f2f1"; } +.fa-syringe::before { content: "\f48e"; } +.fa-t::before { content: "\54"; } +.fa-t-rex::before { content: "\e629"; } +.fa-t-shirt::before { content: "\f553"; } +.fa-table::before { content: "\f0ce"; } +.fa-table-cells::before { content: "\f00a"; } +.fa-table-cells-column-lock::before { content: "\e678"; } +.fa-table-cells-column-unlock::before { content: "\e690"; } +.fa-table-cells-large::before { content: "\f009"; } +.fa-table-cells-lock::before { content: "\e679"; } +.fa-table-cells-row-lock::before { content: "\e67a"; } +.fa-table-cells-row-unlock::before { content: "\e691"; } +.fa-table-cells-unlock::before { content: "\e692"; } +.fa-table-columns::before { content: "\f0db"; } +.fa-table-layout::before { content: "\e290"; } +.fa-table-list::before { content: "\f00b"; } +.fa-table-picnic::before { content: "\e32d"; } +.fa-table-pivot::before { content: "\e291"; } +.fa-table-rows::before { content: "\e292"; } +.fa-table-tennis::before { content: "\f45d"; } +.fa-table-tennis-paddle-ball::before { content: "\f45d"; } +.fa-table-tree::before { content: "\e293"; } +.fa-tablet::before { content: "\f3fb"; } +.fa-tablet-alt::before { content: "\f3fa"; } +.fa-tablet-android::before { content: "\f3fb"; } +.fa-tablet-android-alt::before { content: "\f3fc"; } +.fa-tablet-button::before { content: "\f10a"; } +.fa-tablet-rugged::before { content: "\f48f"; } +.fa-tablet-screen::before { content: "\f3fc"; } +.fa-tablet-screen-button::before { content: "\f3fa"; } +.fa-tablets::before { content: "\f490"; } +.fa-tachograph-digital::before { content: "\f566"; } +.fa-tachometer::before { content: "\f62a"; } +.fa-tachometer-alt::before { content: "\f625"; } +.fa-tachometer-alt-average::before { content: "\f624"; } +.fa-tachometer-alt-fast::before { content: "\f625"; } +.fa-tachometer-alt-fastest::before { content: "\f626"; } +.fa-tachometer-alt-slow::before { content: "\f627"; } +.fa-tachometer-alt-slowest::before { content: "\f628"; } +.fa-tachometer-average::before { content: "\f629"; } +.fa-tachometer-fast::before { content: "\f62a"; } +.fa-tachometer-fastest::before { content: "\f62b"; } +.fa-tachometer-slow::before { content: "\f62c"; } +.fa-tachometer-slowest::before { content: "\f62d"; } +.fa-taco::before { content: "\f826"; } +.fa-tag::before { content: "\f02b"; } +.fa-tags::before { content: "\f02c"; } +.fa-tally::before { content: "\f69c"; } +.fa-tally-1::before { content: "\e294"; } +.fa-tally-2::before { content: "\e295"; } +.fa-tally-3::before { content: "\e296"; } +.fa-tally-4::before { content: "\e297"; } +.fa-tally-5::before { content: "\f69c"; } +.fa-tamale::before { content: "\e451"; } +.fa-tanakh::before { content: "\f827"; } +.fa-tank-water::before { content: "\e452"; } +.fa-tape::before { content: "\f4db"; } +.fa-tarp::before { content: "\e57b"; } +.fa-tarp-droplet::before { content: "\e57c"; } +.fa-tasks::before { content: "\f0ae"; } +.fa-tasks-alt::before { content: "\f828"; } +.fa-taxi::before { content: "\f1ba"; } +.fa-taxi-bus::before { content: "\e298"; } +.fa-teddy-bear::before { content: "\e3cf"; } +.fa-teeth::before { content: "\f62e"; } +.fa-teeth-open::before { content: "\f62f"; } +.fa-telescope::before { content: "\e03e"; } +.fa-teletype::before { content: "\f1e4"; } +.fa-teletype-answer::before { content: "\e2b9"; } +.fa-television::before { content: "\f26c"; } +.fa-temperature-0::before { content: "\f2cb"; } +.fa-temperature-1::before { content: "\f2ca"; } +.fa-temperature-2::before { content: "\f2c9"; } +.fa-temperature-3::before { content: "\f2c8"; } +.fa-temperature-4::before { content: "\f2c7"; } +.fa-temperature-arrow-down::before { content: "\e03f"; } +.fa-temperature-arrow-up::before { content: "\e040"; } +.fa-temperature-down::before { content: "\e03f"; } +.fa-temperature-empty::before { content: "\f2cb"; } +.fa-temperature-frigid::before { content: "\f768"; } +.fa-temperature-full::before { content: "\f2c7"; } +.fa-temperature-half::before { content: "\f2c9"; } +.fa-temperature-high::before { content: "\f769"; } +.fa-temperature-hot::before { content: "\f76a"; } +.fa-temperature-list::before { content: "\e299"; } +.fa-temperature-low::before { content: "\f76b"; } +.fa-temperature-quarter::before { content: "\f2ca"; } +.fa-temperature-snow::before { content: "\f768"; } +.fa-temperature-sun::before { content: "\f76a"; } +.fa-temperature-three-quarters::before { content: "\f2c8"; } +.fa-temperature-up::before { content: "\e040"; } +.fa-tenge::before { content: "\f7d7"; } +.fa-tenge-sign::before { content: "\f7d7"; } +.fa-tennis-ball::before { content: "\f45e"; } +.fa-tent::before { content: "\e57d"; } +.fa-tent-arrow-down-to-line::before { content: "\e57e"; } +.fa-tent-arrow-left-right::before { content: "\e57f"; } +.fa-tent-arrow-turn-left::before { content: "\e580"; } +.fa-tent-arrows-down::before { content: "\e581"; } +.fa-tent-double-peak::before { content: "\e627"; } +.fa-tents::before { content: "\e582"; } +.fa-terminal::before { content: "\f120"; } +.fa-text::before { content: "\f893"; } +.fa-text-height::before { content: "\f034"; } +.fa-text-size::before { content: "\f894"; } +.fa-text-slash::before { content: "\f87d"; } +.fa-text-width::before { content: "\f035"; } +.fa-th::before { content: "\f00a"; } +.fa-th-large::before { content: "\f009"; } +.fa-th-list::before { content: "\f00b"; } +.fa-theater-masks::before { content: "\f630"; } +.fa-thermometer::before { content: "\f491"; } +.fa-thermometer-0::before { content: "\f2cb"; } +.fa-thermometer-1::before { content: "\f2ca"; } +.fa-thermometer-2::before { content: "\f2c9"; } +.fa-thermometer-3::before { content: "\f2c8"; } +.fa-thermometer-4::before { content: "\f2c7"; } +.fa-thermometer-empty::before { content: "\f2cb"; } +.fa-thermometer-full::before { content: "\f2c7"; } +.fa-thermometer-half::before { content: "\f2c9"; } +.fa-thermometer-quarter::before { content: "\f2ca"; } +.fa-thermometer-three-quarters::before { content: "\f2c8"; } +.fa-theta::before { content: "\f69e"; } +.fa-thought-bubble::before { content: "\e32e"; } +.fa-thumb-tack::before { content: "\f08d"; } +.fa-thumb-tack-slash::before { content: "\e68f"; } +.fa-thumbs-down::before { content: "\f165"; } +.fa-thumbs-up::before { content: "\f164"; } +.fa-thumbtack::before { content: "\f08d"; } +.fa-thumbtack-slash::before { content: "\e68f"; } +.fa-thunderstorm::before { content: "\f76c"; } +.fa-thunderstorm-moon::before { content: "\f76d"; } +.fa-thunderstorm-sun::before { content: "\f76e"; } +.fa-tick::before { content: "\e32f"; } +.fa-ticket::before { content: "\f145"; } +.fa-ticket-airline::before { content: "\e29a"; } +.fa-ticket-alt::before { content: "\f3ff"; } +.fa-ticket-perforated::before { content: "\e63e"; } +.fa-ticket-perforated-plane::before { content: "\e29a"; } +.fa-ticket-plane::before { content: "\e29a"; } +.fa-ticket-simple::before { content: "\f3ff"; } +.fa-tickets::before { content: "\e658"; } +.fa-tickets-airline::before { content: "\e29b"; } +.fa-tickets-perforated::before { content: "\e63f"; } +.fa-tickets-perforated-plane::before { content: "\e29b"; } +.fa-tickets-plane::before { content: "\e29b"; } +.fa-tickets-simple::before { content: "\e659"; } +.fa-tilde::before { content: "\7e"; } +.fa-timeline::before { content: "\e29c"; } +.fa-timeline-arrow::before { content: "\e29d"; } +.fa-timer::before { content: "\e29e"; } +.fa-times::before { content: "\f00d"; } +.fa-times-circle::before { content: "\f057"; } +.fa-times-hexagon::before { content: "\f2ee"; } +.fa-times-octagon::before { content: "\f2f0"; } +.fa-times-rectangle::before { content: "\f410"; } +.fa-times-square::before { content: "\f2d3"; } +.fa-times-to-slot::before { content: "\f771"; } +.fa-tint::before { content: "\f043"; } +.fa-tint-slash::before { content: "\f5c7"; } +.fa-tire::before { content: "\f631"; } +.fa-tire-flat::before { content: "\f632"; } +.fa-tire-pressure-warning::before { content: "\f633"; } +.fa-tire-rugged::before { content: "\f634"; } +.fa-tired::before { content: "\f5c8"; } +.fa-toggle-large-off::before { content: "\e5b0"; } +.fa-toggle-large-on::before { content: "\e5b1"; } +.fa-toggle-off::before { content: "\f204"; } +.fa-toggle-on::before { content: "\f205"; } +.fa-toilet::before { content: "\f7d8"; } +.fa-toilet-paper::before { content: "\f71e"; } +.fa-toilet-paper-alt::before { content: "\f71f"; } +.fa-toilet-paper-blank::before { content: "\f71f"; } +.fa-toilet-paper-blank-under::before { content: "\e29f"; } +.fa-toilet-paper-check::before { content: "\e5b2"; } +.fa-toilet-paper-reverse::before { content: "\e2a0"; } +.fa-toilet-paper-reverse-alt::before { content: "\e29f"; } +.fa-toilet-paper-reverse-slash::before { content: "\e2a1"; } +.fa-toilet-paper-slash::before { content: "\e072"; } +.fa-toilet-paper-under::before { content: "\e2a0"; } +.fa-toilet-paper-under-slash::before { content: "\e2a1"; } +.fa-toilet-paper-xmark::before { content: "\e5b3"; } +.fa-toilet-portable::before { content: "\e583"; } +.fa-toilets-portable::before { content: "\e584"; } +.fa-tomato::before { content: "\e330"; } +.fa-tombstone::before { content: "\f720"; } +.fa-tombstone-alt::before { content: "\f721"; } +.fa-tombstone-blank::before { content: "\f721"; } +.fa-toolbox::before { content: "\f552"; } +.fa-tools::before { content: "\f7d9"; } +.fa-tooth::before { content: "\f5c9"; } +.fa-toothbrush::before { content: "\f635"; } +.fa-torah::before { content: "\f6a0"; } +.fa-torii-gate::before { content: "\f6a1"; } +.fa-tornado::before { content: "\f76f"; } +.fa-tower-broadcast::before { content: "\f519"; } +.fa-tower-cell::before { content: "\e585"; } +.fa-tower-control::before { content: "\e2a2"; } +.fa-tower-observation::before { content: "\e586"; } +.fa-tractor::before { content: "\f722"; } +.fa-trademark::before { content: "\f25c"; } +.fa-traffic-cone::before { content: "\f636"; } +.fa-traffic-light::before { content: "\f637"; } +.fa-traffic-light-go::before { content: "\f638"; } +.fa-traffic-light-slow::before { content: "\f639"; } +.fa-traffic-light-stop::before { content: "\f63a"; } +.fa-trailer::before { content: "\e041"; } +.fa-train::before { content: "\f238"; } +.fa-train-subway::before { content: "\f239"; } +.fa-train-subway-tunnel::before { content: "\e2a3"; } +.fa-train-track::before { content: "\e453"; } +.fa-train-tram::before { content: "\e5b4"; } +.fa-train-tunnel::before { content: "\e454"; } +.fa-tram::before { content: "\f7da"; } +.fa-transformer-bolt::before { content: "\e2a4"; } +.fa-transgender::before { content: "\f225"; } +.fa-transgender-alt::before { content: "\f225"; } +.fa-transporter::before { content: "\e042"; } +.fa-transporter-1::before { content: "\e043"; } +.fa-transporter-2::before { content: "\e044"; } +.fa-transporter-3::before { content: "\e045"; } +.fa-transporter-4::before { content: "\e2a5"; } +.fa-transporter-5::before { content: "\e2a6"; } +.fa-transporter-6::before { content: "\e2a7"; } +.fa-transporter-7::before { content: "\e2a8"; } +.fa-transporter-empty::before { content: "\e046"; } +.fa-trash::before { content: "\f1f8"; } +.fa-trash-alt::before { content: "\f2ed"; } +.fa-trash-alt-slash::before { content: "\e2ad"; } +.fa-trash-arrow-turn-left::before { content: "\f895"; } +.fa-trash-arrow-up::before { content: "\f829"; } +.fa-trash-can::before { content: "\f2ed"; } +.fa-trash-can-arrow-turn-left::before { content: "\f896"; } +.fa-trash-can-arrow-up::before { content: "\f82a"; } +.fa-trash-can-check::before { content: "\e2a9"; } +.fa-trash-can-clock::before { content: "\e2aa"; } +.fa-trash-can-list::before { content: "\e2ab"; } +.fa-trash-can-plus::before { content: "\e2ac"; } +.fa-trash-can-slash::before { content: "\e2ad"; } +.fa-trash-can-undo::before { content: "\f896"; } +.fa-trash-can-xmark::before { content: "\e2ae"; } +.fa-trash-check::before { content: "\e2af"; } +.fa-trash-circle::before { content: "\e126"; } +.fa-trash-clock::before { content: "\e2b0"; } +.fa-trash-list::before { content: "\e2b1"; } +.fa-trash-plus::before { content: "\e2b2"; } +.fa-trash-restore::before { content: "\f829"; } +.fa-trash-restore-alt::before { content: "\f82a"; } +.fa-trash-slash::before { content: "\e2b3"; } +.fa-trash-undo::before { content: "\f895"; } +.fa-trash-undo-alt::before { content: "\f896"; } +.fa-trash-xmark::before { content: "\e2b4"; } +.fa-treasure-chest::before { content: "\f723"; } +.fa-tree::before { content: "\f1bb"; } +.fa-tree-alt::before { content: "\f400"; } +.fa-tree-christmas::before { content: "\f7db"; } +.fa-tree-city::before { content: "\e587"; } +.fa-tree-deciduous::before { content: "\f400"; } +.fa-tree-decorated::before { content: "\f7dc"; } +.fa-tree-large::before { content: "\f7dd"; } +.fa-tree-palm::before { content: "\f82b"; } +.fa-trees::before { content: "\f724"; } +.fa-trian-balbot::before { content: "\e45c"; } +.fa-triangle::before { content: "\f2ec"; } +.fa-triangle-circle-square::before { content: "\f61f"; } +.fa-triangle-exclamation::before { content: "\f071"; } +.fa-triangle-instrument::before { content: "\f8e2"; } +.fa-triangle-music::before { content: "\f8e2"; } +.fa-triangle-person-digging::before { content: "\f85d"; } +.fa-tricycle::before { content: "\e5c3"; } +.fa-tricycle-adult::before { content: "\e5c4"; } +.fa-trillium::before { content: "\e588"; } +.fa-trophy::before { content: "\f091"; } +.fa-trophy-alt::before { content: "\f2eb"; } +.fa-trophy-star::before { content: "\f2eb"; } +.fa-trowel::before { content: "\e589"; } +.fa-trowel-bricks::before { content: "\e58a"; } +.fa-truck::before { content: "\f0d1"; } +.fa-truck-arrow-right::before { content: "\e58b"; } +.fa-truck-bolt::before { content: "\e3d0"; } +.fa-truck-clock::before { content: "\f48c"; } +.fa-truck-container::before { content: "\f4dc"; } +.fa-truck-container-empty::before { content: "\e2b5"; } +.fa-truck-couch::before { content: "\f4dd"; } +.fa-truck-droplet::before { content: "\e58c"; } +.fa-truck-fast::before { content: "\f48b"; } +.fa-truck-field::before { content: "\e58d"; } +.fa-truck-field-un::before { content: "\e58e"; } +.fa-truck-fire::before { content: "\e65a"; } +.fa-truck-flatbed::before { content: "\e2b6"; } +.fa-truck-front::before { content: "\e2b7"; } +.fa-truck-ladder::before { content: "\e657"; } +.fa-truck-loading::before { content: "\f4de"; } +.fa-truck-medical::before { content: "\f0f9"; } +.fa-truck-monster::before { content: "\f63b"; } +.fa-truck-moving::before { content: "\f4df"; } +.fa-truck-pickup::before { content: "\f63c"; } +.fa-truck-plane::before { content: "\e58f"; } +.fa-truck-plow::before { content: "\f7de"; } +.fa-truck-ramp::before { content: "\f4e0"; } +.fa-truck-ramp-box::before { content: "\f4de"; } +.fa-truck-ramp-couch::before { content: "\f4dd"; } +.fa-truck-tow::before { content: "\e2b8"; } +.fa-truck-utensils::before { content: "\e628"; } +.fa-trumpet::before { content: "\f8e3"; } +.fa-try::before { content: "\e2bb"; } +.fa-tshirt::before { content: "\f553"; } +.fa-tty::before { content: "\f1e4"; } +.fa-tty-answer::before { content: "\e2b9"; } +.fa-tugrik-sign::before { content: "\e2ba"; } +.fa-turkey::before { content: "\f725"; } +.fa-turkish-lira::before { content: "\e2bb"; } +.fa-turkish-lira-sign::before { content: "\e2bb"; } +.fa-turn-down::before { content: "\f3be"; } +.fa-turn-down-left::before { content: "\e331"; } +.fa-turn-down-right::before { content: "\e455"; } +.fa-turn-left::before { content: "\e636"; } +.fa-turn-left-down::before { content: "\e637"; } +.fa-turn-left-up::before { content: "\e638"; } +.fa-turn-right::before { content: "\e639"; } +.fa-turn-up::before { content: "\f3bf"; } +.fa-turntable::before { content: "\f8e4"; } +.fa-turtle::before { content: "\f726"; } +.fa-tv::before { content: "\f26c"; } +.fa-tv-alt::before { content: "\f26c"; } +.fa-tv-music::before { content: "\f8e6"; } +.fa-tv-retro::before { content: "\f401"; } +.fa-typewriter::before { content: "\f8e7"; } +.fa-u::before { content: "\55"; } +.fa-ufo::before { content: "\e047"; } +.fa-ufo-beam::before { content: "\e048"; } +.fa-umbrella::before { content: "\f0e9"; } +.fa-umbrella-alt::before { content: "\e2bc"; } +.fa-umbrella-beach::before { content: "\f5ca"; } +.fa-umbrella-simple::before { content: "\e2bc"; } +.fa-underline::before { content: "\f0cd"; } +.fa-undo::before { content: "\f0e2"; } +.fa-undo-alt::before { content: "\f2ea"; } +.fa-unicorn::before { content: "\f727"; } +.fa-uniform-martial-arts::before { content: "\e3d1"; } +.fa-union::before { content: "\f6a2"; } +.fa-universal-access::before { content: "\f29a"; } +.fa-university::before { content: "\f19c"; } +.fa-unlink::before { content: "\f127"; } +.fa-unlock::before { content: "\f09c"; } +.fa-unlock-alt::before { content: "\f13e"; } +.fa-unlock-keyhole::before { content: "\f13e"; } +.fa-unsorted::before { content: "\f0dc"; } +.fa-up::before { content: "\f357"; } +.fa-up-down::before { content: "\f338"; } +.fa-up-down-left-right::before { content: "\f0b2"; } +.fa-up-from-bracket::before { content: "\e590"; } +.fa-up-from-dotted-line::before { content: "\e456"; } +.fa-up-from-line::before { content: "\f346"; } +.fa-up-left::before { content: "\e2bd"; } +.fa-up-long::before { content: "\f30c"; } +.fa-up-right::before { content: "\e2be"; } +.fa-up-right-and-down-left-from-center::before { content: "\f424"; } +.fa-up-right-from-square::before { content: "\f35d"; } +.fa-up-to-bracket::before { content: "\e66e"; } +.fa-up-to-dotted-line::before { content: "\e457"; } +.fa-up-to-line::before { content: "\f34d"; } +.fa-upload::before { content: "\f093"; } +.fa-usb-drive::before { content: "\f8e9"; } +.fa-usd::before { content: "\24"; } +.fa-usd-circle::before { content: "\f2e8"; } +.fa-usd-square::before { content: "\f2e9"; } +.fa-user::before { content: "\f007"; } +.fa-user-alien::before { content: "\e04a"; } +.fa-user-alt::before { content: "\f406"; } +.fa-user-alt-slash::before { content: "\f4fa"; } +.fa-user-astronaut::before { content: "\f4fb"; } +.fa-user-beard-bolt::before { content: "\e689"; } +.fa-user-bounty-hunter::before { content: "\e2bf"; } +.fa-user-chart::before { content: "\f6a3"; } +.fa-user-check::before { content: "\f4fc"; } +.fa-user-chef::before { content: "\e3d2"; } +.fa-user-circle::before { content: "\f2bd"; } +.fa-user-clock::before { content: "\f4fd"; } +.fa-user-cog::before { content: "\f4fe"; } +.fa-user-construction::before { content: "\f82c"; } +.fa-user-cowboy::before { content: "\f8ea"; } +.fa-user-crown::before { content: "\f6a4"; } +.fa-user-doctor::before { content: "\f0f0"; } +.fa-user-doctor-hair::before { content: "\e458"; } +.fa-user-doctor-hair-long::before { content: "\e459"; } +.fa-user-doctor-message::before { content: "\f82e"; } +.fa-user-edit::before { content: "\f4ff"; } +.fa-user-friends::before { content: "\f500"; } +.fa-user-gear::before { content: "\f4fe"; } +.fa-user-graduate::before { content: "\f501"; } +.fa-user-group::before { content: "\f500"; } +.fa-user-group-crown::before { content: "\f6a5"; } +.fa-user-group-simple::before { content: "\e603"; } +.fa-user-hair::before { content: "\e45a"; } +.fa-user-hair-buns::before { content: "\e3d3"; } +.fa-user-hair-long::before { content: "\e45b"; } +.fa-user-hair-mullet::before { content: "\e45c"; } +.fa-user-hard-hat::before { content: "\f82c"; } +.fa-user-headset::before { content: "\f82d"; } +.fa-user-helmet-safety::before { content: "\f82c"; } +.fa-user-hoodie::before { content: "\e68a"; } +.fa-user-injured::before { content: "\f728"; } +.fa-user-large::before { content: "\f406"; } +.fa-user-large-slash::before { content: "\f4fa"; } +.fa-user-lock::before { content: "\f502"; } +.fa-user-magnifying-glass::before { content: "\e5c5"; } +.fa-user-md::before { content: "\f0f0"; } +.fa-user-md-chat::before { content: "\f82e"; } +.fa-user-minus::before { content: "\f503"; } +.fa-user-music::before { content: "\f8eb"; } +.fa-user-ninja::before { content: "\f504"; } +.fa-user-nurse::before { content: "\f82f"; } +.fa-user-nurse-hair::before { content: "\e45d"; } +.fa-user-nurse-hair-long::before { content: "\e45e"; } +.fa-user-pen::before { content: "\f4ff"; } +.fa-user-pilot::before { content: "\e2c0"; } +.fa-user-pilot-tie::before { content: "\e2c1"; } +.fa-user-plus::before { content: "\f234"; } +.fa-user-police::before { content: "\e333"; } +.fa-user-police-tie::before { content: "\e334"; } +.fa-user-robot::before { content: "\e04b"; } +.fa-user-robot-xmarks::before { content: "\e4a7"; } +.fa-user-secret::before { content: "\f21b"; } +.fa-user-shakespeare::before { content: "\e2c2"; } +.fa-user-shield::before { content: "\f505"; } +.fa-user-slash::before { content: "\f506"; } +.fa-user-tag::before { content: "\f507"; } +.fa-user-tie::before { content: "\f508"; } +.fa-user-tie-hair::before { content: "\e45f"; } +.fa-user-tie-hair-long::before { content: "\e460"; } +.fa-user-times::before { content: "\f235"; } +.fa-user-unlock::before { content: "\e058"; } +.fa-user-visor::before { content: "\e04c"; } +.fa-user-vneck::before { content: "\e461"; } +.fa-user-vneck-hair::before { content: "\e462"; } +.fa-user-vneck-hair-long::before { content: "\e463"; } +.fa-user-xmark::before { content: "\f235"; } +.fa-users::before { content: "\f0c0"; } +.fa-users-between-lines::before { content: "\e591"; } +.fa-users-class::before { content: "\f63d"; } +.fa-users-cog::before { content: "\f509"; } +.fa-users-crown::before { content: "\f6a5"; } +.fa-users-gear::before { content: "\f509"; } +.fa-users-line::before { content: "\e592"; } +.fa-users-medical::before { content: "\f830"; } +.fa-users-rays::before { content: "\e593"; } +.fa-users-rectangle::before { content: "\e594"; } +.fa-users-slash::before { content: "\e073"; } +.fa-users-viewfinder::before { content: "\e595"; } +.fa-utensil-fork::before { content: "\f2e3"; } +.fa-utensil-knife::before { content: "\f2e4"; } +.fa-utensil-spoon::before { content: "\f2e5"; } +.fa-utensils::before { content: "\f2e7"; } +.fa-utensils-alt::before { content: "\f2e6"; } +.fa-utensils-slash::before { content: "\e464"; } +.fa-utility-pole::before { content: "\e2c3"; } +.fa-utility-pole-double::before { content: "\e2c4"; } +.fa-v::before { content: "\56"; } +.fa-vacuum::before { content: "\e04d"; } +.fa-vacuum-robot::before { content: "\e04e"; } +.fa-value-absolute::before { content: "\f6a6"; } +.fa-van-shuttle::before { content: "\f5b6"; } +.fa-vault::before { content: "\e2c5"; } +.fa-vcard::before { content: "\f2bb"; } +.fa-vector-circle::before { content: "\e2c6"; } +.fa-vector-polygon::before { content: "\e2c7"; } +.fa-vector-square::before { content: "\f5cb"; } +.fa-vent-damper::before { content: "\e465"; } +.fa-venus::before { content: "\f221"; } +.fa-venus-double::before { content: "\f226"; } +.fa-venus-mars::before { content: "\f228"; } +.fa-vest::before { content: "\e085"; } +.fa-vest-patches::before { content: "\e086"; } +.fa-vhs::before { content: "\f8ec"; } +.fa-vial::before { content: "\f492"; } +.fa-vial-circle-check::before { content: "\e596"; } +.fa-vial-virus::before { content: "\e597"; } +.fa-vials::before { content: "\f493"; } +.fa-video::before { content: "\f03d"; } +.fa-video-arrow-down-left::before { content: "\e2c8"; } +.fa-video-arrow-up-right::before { content: "\e2c9"; } +.fa-video-camera::before { content: "\f03d"; } +.fa-video-circle::before { content: "\e12b"; } +.fa-video-handheld::before { content: "\f8a8"; } +.fa-video-plus::before { content: "\f4e1"; } +.fa-video-slash::before { content: "\f4e2"; } +.fa-vihara::before { content: "\f6a7"; } +.fa-violin::before { content: "\f8ed"; } +.fa-virus::before { content: "\e074"; } +.fa-virus-covid::before { content: "\e4a8"; } +.fa-virus-covid-slash::before { content: "\e4a9"; } +.fa-virus-slash::before { content: "\e075"; } +.fa-viruses::before { content: "\e076"; } +.fa-voicemail::before { content: "\f897"; } +.fa-volcano::before { content: "\f770"; } +.fa-volleyball::before { content: "\f45f"; } +.fa-volleyball-ball::before { content: "\f45f"; } +.fa-volume::before { content: "\f6a8"; } +.fa-volume-control-phone::before { content: "\f2a0"; } +.fa-volume-down::before { content: "\f027"; } +.fa-volume-high::before { content: "\f028"; } +.fa-volume-low::before { content: "\f027"; } +.fa-volume-medium::before { content: "\f6a8"; } +.fa-volume-mute::before { content: "\f6a9"; } +.fa-volume-off::before { content: "\f026"; } +.fa-volume-slash::before { content: "\f2e2"; } +.fa-volume-times::before { content: "\f6a9"; } +.fa-volume-up::before { content: "\f028"; } +.fa-volume-xmark::before { content: "\f6a9"; } +.fa-vote-nay::before { content: "\f771"; } +.fa-vote-yea::before { content: "\f772"; } +.fa-vr-cardboard::before { content: "\f729"; } +.fa-w::before { content: "\57"; } +.fa-waffle::before { content: "\e466"; } +.fa-wagon-covered::before { content: "\f8ee"; } +.fa-walker::before { content: "\f831"; } +.fa-walkie-talkie::before { content: "\f8ef"; } +.fa-walking::before { content: "\f554"; } +.fa-wall-brick::before { content: "\e3db"; } +.fa-wallet::before { content: "\f555"; } +.fa-wand::before { content: "\f72a"; } +.fa-wand-magic::before { content: "\f0d0"; } +.fa-wand-magic-sparkles::before { content: "\e2ca"; } +.fa-wand-sparkles::before { content: "\f72b"; } +.fa-warehouse::before { content: "\f494"; } +.fa-warehouse-alt::before { content: "\f495"; } +.fa-warehouse-full::before { content: "\f495"; } +.fa-warning::before { content: "\f071"; } +.fa-washer::before { content: "\f898"; } +.fa-washing-machine::before { content: "\f898"; } +.fa-watch::before { content: "\f2e1"; } +.fa-watch-apple::before { content: "\e2cb"; } +.fa-watch-calculator::before { content: "\f8f0"; } +.fa-watch-fitness::before { content: "\f63e"; } +.fa-watch-smart::before { content: "\e2cc"; } +.fa-water::before { content: "\f773"; } +.fa-water-arrow-down::before { content: "\f774"; } +.fa-water-arrow-up::before { content: "\f775"; } +.fa-water-ladder::before { content: "\f5c5"; } +.fa-water-lower::before { content: "\f774"; } +.fa-water-rise::before { content: "\f775"; } +.fa-watermelon-slice::before { content: "\e337"; } +.fa-wave::before { content: "\e65b"; } +.fa-wave-pulse::before { content: "\f5f8"; } +.fa-wave-sine::before { content: "\f899"; } +.fa-wave-square::before { content: "\f83e"; } +.fa-wave-triangle::before { content: "\f89a"; } +.fa-waveform::before { content: "\f8f1"; } +.fa-waveform-circle::before { content: "\e12d"; } +.fa-waveform-lines::before { content: "\f8f2"; } +.fa-waveform-path::before { content: "\f8f2"; } +.fa-waves-sine::before { content: "\e65d"; } +.fa-web-awesome::before { content: "\e682"; } +.fa-webcam::before { content: "\f832"; } +.fa-webcam-slash::before { content: "\f833"; } +.fa-webhook::before { content: "\e5d5"; } +.fa-weight::before { content: "\f496"; } +.fa-weight-hanging::before { content: "\f5cd"; } +.fa-weight-scale::before { content: "\f496"; } +.fa-whale::before { content: "\f72c"; } +.fa-wheat::before { content: "\f72d"; } +.fa-wheat-alt::before { content: "\e2cd"; } +.fa-wheat-awn::before { content: "\e2cd"; } +.fa-wheat-awn-circle-exclamation::before { content: "\e598"; } +.fa-wheat-awn-slash::before { content: "\e338"; } +.fa-wheat-slash::before { content: "\e339"; } +.fa-wheelchair::before { content: "\f193"; } +.fa-wheelchair-alt::before { content: "\e2ce"; } +.fa-wheelchair-move::before { content: "\e2ce"; } +.fa-whiskey-glass::before { content: "\f7a0"; } +.fa-whiskey-glass-ice::before { content: "\f7a1"; } +.fa-whistle::before { content: "\f460"; } +.fa-wifi::before { content: "\f1eb"; } +.fa-wifi-1::before { content: "\f6aa"; } +.fa-wifi-2::before { content: "\f6ab"; } +.fa-wifi-3::before { content: "\f1eb"; } +.fa-wifi-exclamation::before { content: "\e2cf"; } +.fa-wifi-fair::before { content: "\f6ab"; } +.fa-wifi-slash::before { content: "\f6ac"; } +.fa-wifi-strong::before { content: "\f1eb"; } +.fa-wifi-weak::before { content: "\f6aa"; } +.fa-wind::before { content: "\f72e"; } +.fa-wind-circle-exclamation::before { content: "\f776"; } +.fa-wind-turbine::before { content: "\f89b"; } +.fa-wind-warning::before { content: "\f776"; } +.fa-window::before { content: "\f40e"; } +.fa-window-alt::before { content: "\f40f"; } +.fa-window-close::before { content: "\f410"; } +.fa-window-flip::before { content: "\f40f"; } +.fa-window-frame::before { content: "\e04f"; } +.fa-window-frame-open::before { content: "\e050"; } +.fa-window-maximize::before { content: "\f2d0"; } +.fa-window-minimize::before { content: "\f2d1"; } +.fa-window-restore::before { content: "\f2d2"; } +.fa-windsock::before { content: "\f777"; } +.fa-wine-bottle::before { content: "\f72f"; } +.fa-wine-glass::before { content: "\f4e3"; } +.fa-wine-glass-alt::before { content: "\f5ce"; } +.fa-wine-glass-crack::before { content: "\f4bb"; } +.fa-wine-glass-empty::before { content: "\f5ce"; } +.fa-won::before { content: "\f159"; } +.fa-won-sign::before { content: "\f159"; } +.fa-worm::before { content: "\e599"; } +.fa-wreath::before { content: "\f7e2"; } +.fa-wreath-laurel::before { content: "\e5d2"; } +.fa-wrench::before { content: "\f0ad"; } +.fa-wrench-simple::before { content: "\e2d1"; } +.fa-x::before { content: "\58"; } +.fa-x-ray::before { content: "\f497"; } +.fa-xmark::before { content: "\f00d"; } +.fa-xmark-circle::before { content: "\f057"; } +.fa-xmark-hexagon::before { content: "\f2ee"; } +.fa-xmark-large::before { content: "\e59b"; } +.fa-xmark-octagon::before { content: "\f2f0"; } +.fa-xmark-square::before { content: "\f2d3"; } +.fa-xmark-to-slot::before { content: "\f771"; } +.fa-xmarks-lines::before { content: "\e59a"; } +.fa-y::before { content: "\59"; } +.fa-yen::before { content: "\f157"; } +.fa-yen-sign::before { content: "\f157"; } +.fa-yin-yang::before { content: "\f6ad"; } +.fa-z::before { content: "\5a"; } +.fa-zap::before { content: "\f0e7"; } +.fa-zzz::before { content: "\f880"; } + +.sr-only, +.fa-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + +.sr-only-focusable:not(:focus), +.fa-sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-style-family-brands: 'Font Awesome 6 Brands'; + --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; } + +@font-face { + font-family: 'Font Awesome 6 Brands'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +.fab, +.fa-brands { + font-weight: 400; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-redhat:before { + content: "\f7bc"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-cloudflare:before { + content: "\e07d"; } + +.fa-ups:before { + content: "\f7e0"; } + +.fa-pixiv:before { + content: "\e640"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-stackpath:before { + content: "\f842"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-guilded:before { + content: "\e07e"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-square-js:before { + content: "\f3b9"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-orcid:before { + content: "\f8d2"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-invision:before { + content: "\f7b0"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-jxl:before { + content: "\e67b"; } + +.fa-dart-lang:before { + content: "\e693"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-unity:before { + content: "\e049"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-square-reddit:before { + content: "\f1a2"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-square-font-awesome:before { + content: "\e5ad"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-brave:before { + content: "\e63c"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-square-instagram:before { + content: "\e055"; } + +.fa-instagram-square:before { + content: "\e055"; } + +.fa-battle-net:before { + content: "\f835"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-square-hacker-news:before { + content: "\f3af"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-threads:before { + content: "\e618"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-square-snapchat:before { + content: "\f2ad"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-artstation:before { + content: "\f77a"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-sourcetree:before { + content: "\f7d3"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-diaspora:before { + content: "\f791"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-square-font-awesome-stroke:before { + content: "\f35c"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-atlassian:before { + content: "\f77b"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-chromecast:before { + content: "\f838"; } + +.fa-evernote:before { + content: "\f839"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-watchman-monitoring:before { + content: "\e087"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-git-alt:before { + content: "\f841"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-square-viadeo:before { + content: "\f2aa"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-centos:before { + content: "\f789"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-opensuse:before { + content: "\e62b"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-square-dribbble:before { + content: "\f397"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-node:before { + content: "\f419"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-debian:before { + content: "\e60b"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-instalod:before { + content: "\e081"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-square-twitter:before { + content: "\f081"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-golang:before { + content: "\e40f"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-square-kickstarter:before { + content: "\f3bb"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-uncharted:before { + content: "\e084"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-square-youtube:before { + content: "\f431"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wpressr:before { + content: "\f3e4"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-nfc-directional:before { + content: "\e530"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-fedora:before { + content: "\f798"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-meta:before { + content: "\e49b"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-square-letterboxd:before { + content: "\e62e"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-confluence:before { + content: "\f78d"; } + +.fa-shoelace:before { + content: "\e60c"; } + +.fa-mdb:before { + content: "\f8ca"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-unsplash:before { + content: "\e07c"; } + +.fa-yarn:before { + content: "\f7e3"; } + +.fa-square-steam:before { + content: "\f1b7"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-500px:before { + content: "\f26e"; } + +.fa-square-vimeo:before { + content: "\f194"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-flag:before { + content: "\f2b4"; } + +.fa-font-awesome-logo-full:before { + content: "\f2b4"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-hive:before { + content: "\e07f"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-padlet:before { + content: "\e4a0"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-square-github:before { + content: "\f092"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-fedex:before { + content: "\f797"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-shopify:before { + content: "\e057"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-square-threads:before { + content: "\e619"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-swift:before { + content: "\f8e1"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-google-scholar:before { + content: "\e63b"; } + +.fa-square-gitlab:before { + content: "\e5ae"; } + +.fa-gitlab-square:before { + content: "\e5ae"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-square-odnoklassniki:before { + content: "\f264"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-hashnode:before { + content: "\e499"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-itch-io:before { + content: "\f83a"; } + +.fa-umbraco:before { + content: "\f8e8"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-ubuntu:before { + content: "\f7df"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-dhl:before { + content: "\f790"; } + +.fa-square-pinterest:before { + content: "\f0d3"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-signal-messenger:before { + content: "\e663"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-dailymotion:before { + content: "\e052"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-bootstrap:before { + content: "\f836"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-nfc-symbol:before { + content: "\e531"; } + +.fa-mintbit:before { + content: "\e62f"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-speaker-deck:before { + content: "\f83c"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-brave-reverse:before { + content: "\e63d"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-square-google-plus:before { + content: "\f0d4"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-web-awesome:before { + content: "\e682"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-d-and-d-beyond:before { + content: "\f6ca"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-square-xing:before { + content: "\f169"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-usps:before { + content: "\f7e1"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-letterboxd:before { + content: "\e62d"; } + +.fa-symfony:before { + content: "\f83d"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-think-peaks:before { + content: "\f731"; } + +.fa-bilibili:before { + content: "\e3d9"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-x-twitter:before { + content: "\e61b"; } + +.fa-cotton-bureau:before { + content: "\f89e"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-42-group:before { + content: "\e080"; } + +.fa-innosoft:before { + content: "\e080"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-square-pied-piper:before { + content: "\e01e"; } + +.fa-pied-piper-square:before { + content: "\e01e"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-square-web-awesome-stroke:before { + content: "\e684"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-tiktok:before { + content: "\e07b"; } + +.fa-square-facebook:before { + content: "\f082"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-flutter:before { + content: "\e694"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-mixer:before { + content: "\e056"; } + +.fa-square-lastfm:before { + content: "\f203"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-mendeley:before { + content: "\f7b3"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-figma:before { + content: "\f799"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-cmplid:before { + content: "\e360"; } + +.fa-upwork:before { + content: "\e641"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-square-upwork:before { + content: "\e67c"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-deezer:before { + content: "\e077"; } + +.fa-raspberry-pi:before { + content: "\f7bb"; } + +.fa-jira:before { + content: "\f7b1"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-screenpal:before { + content: "\e570"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-microblog:before { + content: "\e01a"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-square-web-awesome:before { + content: "\e683"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-wirsindhandwerk:before { + content: "\e2d0"; } + +.fa-wsh:before { + content: "\e2d0"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-salesforce:before { + content: "\f83b"; } + +.fa-octopus-deploy:before { + content: "\e082"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-waze:before { + content: "\f83f"; } + +.fa-bluesky:before { + content: "\e671"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-rust:before { + content: "\e07a"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-square-behance:before { + content: "\f1b5"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-webflow:before { + content: "\e65c"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-space-awesome:before { + content: "\e5ac"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-square-git:before { + content: "\f1d2"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-square-tumblr:before { + content: "\f174"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-perbyte:before { + content: "\e083"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-bots:before { + content: "\e340"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-ideal:before { + content: "\e013"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-sketch:before { + content: "\f7c6"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-php:before { + content: "\f457"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-firefox-browser:before { + content: "\e007"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-suse:before { + content: "\f7d6"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-buffer:before { + content: "\f837"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-yammer:before { + content: "\f840"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-stubber:before { + content: "\e5c7"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f2c6"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-odysee:before { + content: "\e5c6"; } + +.fa-square-whatsapp:before { + content: "\f40c"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-edge-legacy:before { + content: "\e078"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f198"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-square-x-twitter:before { + content: "\e61a"; } + +.fa-reacteurope:before { + content: "\f75d"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f23a"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-sitrox:before { + content: "\e44a"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-airbnb:before { + content: "\f834"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-buy-n-large:before { + content: "\f8a6"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-canadian-maple-leaf:before { + content: "\f785"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-wodu:before { + content: "\e088"; } + +.fa-google-pay:before { + content: "\e079"; } + +.fa-intercom:before { + content: "\f7af"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-pix:before { + content: "\e43a"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } + +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Pro'; + --fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro'; } + +@font-face { + font-family: 'Font Awesome 6 Pro'; + font-style: normal; + font-weight: 300; + font-display: block; + src: url("../webfonts/fa-light-300.woff2") format("woff2"), url("../webfonts/fa-light-300.ttf") format("truetype"); } + +.fal, +.fa-light { + font-weight: 300; } + +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Pro'; + --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Pro'; } + +@font-face { + font-family: 'Font Awesome 6 Pro'; + font-style: normal; + font-weight: 900; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +.fas, +.fa-solid { + font-weight: 900; } + +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Pro'; + --fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro'; } + +@font-face { + font-family: 'Font Awesome 6 Pro'; + font-style: normal; + font-weight: 100; + font-display: block; + src: url("../webfonts/fa-thin-100.woff2") format("woff2"), url("../webfonts/fa-thin-100.ttf") format("truetype"); } + +.fat, +.fa-thin { + font-weight: 100; } + diff --git a/codewithrockstar.com/assets/fontawesome/css/all.min.css b/codewithrockstar.com/assets/fontawesome/css/all.min.css new file mode 100644 index 00000000..64597774 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/all.min.css @@ -0,0 +1 @@ +@charset "utf-8";.fa{font-family:var(--fa-style-family,"Font Awesome 6 Pro");font-weight:var(--fa-style,900)}.fa-solid,.fa-regular,.fa-brands,.fas,.far,.fab,.fal,.fat,.fad,.fass,.fasr,.fasl,.fast,.fasds,.fa-light,.fa-thin,.fa-duotone,.fa-sharp,.fa-sharp-duotone,.fa-sharp-solid,.fa-classic,.fa{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-variant:normal;text-rendering:auto;font-style:normal;line-height:1}.fas,.far,.fal,.fat,.fa-solid,.fa-regular,.fa-light,.fa-thin,.fa-classic{font-family:"Font Awesome 6 Pro"}.fab,.fa-brands{font-family:"Font Awesome 6 Brands"}.fad,.fa-classic.fa-duotone,.fa-duotone{font-family:"Font Awesome 6 Duotone"}.fasds,.fa-sharp-duotone{font-family:"Font Awesome 6 Sharp Duotone";font-weight:900}.fass,.fasr,.fasl,.fast,.fa-sharp{font-family:"Font Awesome 6 Sharp"}.fass,.fa-sharp{font-weight:900}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{vertical-align:.225em;font-size:.625em;line-height:.1em}.fa-xs{vertical-align:.125em;font-size:.75em;line-height:.08333em}.fa-sm{vertical-align:.05357em;font-size:.875em;line-height:.07143em}.fa-lg{vertical-align:-.075em;font-size:1.25em;line-height:.05em}.fa-xl{vertical-align:-.125em;font-size:1.5em;line-height:.04167em}.fa-2xl{vertical-align:-.1875em;font-size:2em;line-height:.03125em}.fa-fw{text-align:center;width:1.25em}.fa-ul{margin-left:var(--fa-li-margin,2.5em);padding-left:0;list-style-type:none}.fa-ul>li{position:relative}.fa-li{left:calc(-1*var(--fa-li-width,2em));text-align:center;width:var(--fa-li-width,2em);line-height:inherit;position:absolute}.fa-border{border-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-bounce,.fa-fade,.fa-beat-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-transition-duration:0s;transition-duration:0s;-webkit-transition-delay:0s;transition-delay:0s;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-delay:-1ms;animation-delay:-1ms}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0)}57%{-webkit-transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}to{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes fa-bounce{0%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0)}57%{-webkit-transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}to{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{vertical-align:middle;width:2.5em;height:2em;line-height:2em;display:inline-block;position:relative}.fa-stack-1x,.fa-stack-2x{text-align:center;z-index:var(--fa-stack-z-index,auto);width:100%;position:absolute;left:0}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"0"}.fa-00:before{content:""}.fa-1:before{content:"1"}.fa-100:before{content:""}.fa-2:before{content:"2"}.fa-3:before{content:"3"}.fa-360-degrees:before{content:""}.fa-4:before{content:"4"}.fa-5:before{content:"5"}.fa-6:before{content:"6"}.fa-7:before{content:"7"}.fa-8:before{content:"8"}.fa-9:before{content:"9"}.fa-a:before{content:"A"}.fa-abacus:before{content:""}.fa-accent-grave:before{content:"`"}.fa-acorn:before{content:""}.fa-ad:before{content:""}.fa-add:before{content:"+"}.fa-address-book:before{content:""}.fa-address-card:before{content:""}.fa-adjust:before{content:""}.fa-air-conditioner:before{content:""}.fa-air-freshener:before{content:""}.fa-airplay:before{content:""}.fa-alarm-clock:before{content:""}.fa-alarm-exclamation:before{content:""}.fa-alarm-plus:before{content:""}.fa-alarm-snooze:before{content:""}.fa-album:before{content:""}.fa-album-circle-plus:before{content:""}.fa-album-circle-user:before{content:""}.fa-album-collection:before{content:""}.fa-album-collection-circle-plus:before{content:""}.fa-album-collection-circle-user:before{content:""}.fa-alicorn:before{content:""}.fa-alien:before{content:""}.fa-alien-8bit:before,.fa-alien-monster:before{content:""}.fa-align-center:before{content:""}.fa-align-justify:before{content:""}.fa-align-left:before{content:""}.fa-align-right:before{content:""}.fa-align-slash:before{content:""}.fa-allergies:before{content:""}.fa-alt:before{content:""}.fa-ambulance:before{content:""}.fa-american-sign-language-interpreting:before{content:""}.fa-amp-guitar:before{content:""}.fa-ampersand:before{content:"&"}.fa-analytics:before{content:""}.fa-anchor:before{content:""}.fa-anchor-circle-check:before{content:""}.fa-anchor-circle-exclamation:before{content:""}.fa-anchor-circle-xmark:before{content:""}.fa-anchor-lock:before{content:""}.fa-angel:before{content:""}.fa-angle:before{content:""}.fa-angle-90:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angles-down:before{content:""}.fa-angles-left:before{content:""}.fa-angles-right:before{content:""}.fa-angles-up:before{content:""}.fa-angles-up-down:before{content:""}.fa-angry:before{content:""}.fa-ankh:before{content:""}.fa-ant:before{content:""}.fa-apartment:before{content:""}.fa-aperture:before{content:""}.fa-apostrophe:before{content:"'"}.fa-apple-alt:before{content:""}.fa-apple-core:before{content:""}.fa-apple-crate:before{content:""}.fa-apple-whole:before{content:""}.fa-archive:before{content:""}.fa-archway:before{content:""}.fa-area-chart:before{content:""}.fa-arrow-alt-circle-down:before{content:""}.fa-arrow-alt-circle-left:before{content:""}.fa-arrow-alt-circle-right:before{content:""}.fa-arrow-alt-circle-up:before{content:""}.fa-arrow-alt-down:before{content:""}.fa-arrow-alt-from-bottom:before{content:""}.fa-arrow-alt-from-left:before{content:""}.fa-arrow-alt-from-right:before{content:""}.fa-arrow-alt-from-top:before{content:""}.fa-arrow-alt-left:before{content:""}.fa-arrow-alt-right:before{content:""}.fa-arrow-alt-square-down:before{content:""}.fa-arrow-alt-square-left:before{content:""}.fa-arrow-alt-square-right:before{content:""}.fa-arrow-alt-square-up:before{content:""}.fa-arrow-alt-to-bottom:before{content:""}.fa-arrow-alt-to-left:before{content:""}.fa-arrow-alt-to-right:before{content:""}.fa-arrow-alt-to-top:before{content:""}.fa-arrow-alt-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-down:before{content:""}.fa-arrow-down-1-9:before{content:""}.fa-arrow-down-9-1:before{content:""}.fa-arrow-down-a-z:before{content:""}.fa-arrow-down-arrow-up:before{content:""}.fa-arrow-down-big-small:before{content:""}.fa-arrow-down-from-arc:before{content:""}.fa-arrow-down-from-bracket:before{content:""}.fa-arrow-down-from-dotted-line:before{content:""}.fa-arrow-down-from-line:before{content:""}.fa-arrow-down-left:before{content:""}.fa-arrow-down-left-and-arrow-up-right-to-center:before{content:""}.fa-arrow-down-long:before{content:""}.fa-arrow-down-right:before{content:""}.fa-arrow-down-short-wide:before{content:""}.fa-arrow-down-small-big:before{content:""}.fa-arrow-down-square-triangle:before{content:""}.fa-arrow-down-to-arc:before{content:""}.fa-arrow-down-to-bracket:before{content:""}.fa-arrow-down-to-dotted-line:before{content:""}.fa-arrow-down-to-line:before{content:""}.fa-arrow-down-to-square:before{content:""}.fa-arrow-down-triangle-square:before{content:""}.fa-arrow-down-up-across-line:before{content:""}.fa-arrow-down-up-lock:before{content:""}.fa-arrow-down-wide-short:before{content:""}.fa-arrow-down-z-a:before{content:""}.fa-arrow-from-bottom:before{content:""}.fa-arrow-from-left:before{content:""}.fa-arrow-from-right:before{content:""}.fa-arrow-from-top:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-left-from-arc:before{content:""}.fa-arrow-left-from-bracket:before{content:""}.fa-arrow-left-from-line:before{content:""}.fa-arrow-left-long:before{content:""}.fa-arrow-left-long-to-line:before{content:""}.fa-arrow-left-rotate:before{content:""}.fa-arrow-left-to-arc:before{content:""}.fa-arrow-left-to-bracket:before{content:""}.fa-arrow-left-to-line:before{content:""}.fa-arrow-pointer:before{content:""}.fa-arrow-progress:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-right-arrow-left:before{content:""}.fa-arrow-right-from-arc:before{content:""}.fa-arrow-right-from-bracket:before{content:""}.fa-arrow-right-from-file:before{content:""}.fa-arrow-right-from-line:before{content:""}.fa-arrow-right-long:before{content:""}.fa-arrow-right-long-to-line:before{content:""}.fa-arrow-right-rotate:before{content:""}.fa-arrow-right-to-arc:before{content:""}.fa-arrow-right-to-bracket:before{content:""}.fa-arrow-right-to-city:before{content:""}.fa-arrow-right-to-file:before{content:""}.fa-arrow-right-to-line:before{content:""}.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before{content:""}.fa-arrow-rotate-forward:before{content:""}.fa-arrow-rotate-left:before{content:""}.fa-arrow-rotate-right:before{content:""}.fa-arrow-square-down:before{content:""}.fa-arrow-square-left:before{content:""}.fa-arrow-square-right:before{content:""}.fa-arrow-square-up:before{content:""}.fa-arrow-to-bottom:before{content:""}.fa-arrow-to-left:before{content:""}.fa-arrow-to-right:before{content:""}.fa-arrow-to-top:before{content:""}.fa-arrow-trend-down:before{content:""}.fa-arrow-trend-up:before{content:""}.fa-arrow-turn-down:before{content:""}.fa-arrow-turn-down-left:before{content:""}.fa-arrow-turn-down-right:before{content:""}.fa-arrow-turn-left:before{content:""}.fa-arrow-turn-left-down:before{content:""}.fa-arrow-turn-left-up:before{content:""}.fa-arrow-turn-right:before{content:""}.fa-arrow-turn-up:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-up-1-9:before{content:""}.fa-arrow-up-9-1:before{content:""}.fa-arrow-up-a-z:before{content:""}.fa-arrow-up-arrow-down:before{content:""}.fa-arrow-up-big-small:before{content:""}.fa-arrow-up-from-arc:before{content:""}.fa-arrow-up-from-bracket:before{content:""}.fa-arrow-up-from-dotted-line:before{content:""}.fa-arrow-up-from-ground-water:before{content:""}.fa-arrow-up-from-line:before{content:""}.fa-arrow-up-from-square:before{content:""}.fa-arrow-up-from-water-pump:before{content:""}.fa-arrow-up-left:before{content:""}.fa-arrow-up-left-from-circle:before{content:""}.fa-arrow-up-long:before{content:""}.fa-arrow-up-right:before{content:""}.fa-arrow-up-right-and-arrow-down-left-from-center:before{content:""}.fa-arrow-up-right-dots:before{content:""}.fa-arrow-up-right-from-square:before{content:""}.fa-arrow-up-short-wide:before{content:""}.fa-arrow-up-small-big:before{content:""}.fa-arrow-up-square-triangle:before{content:""}.fa-arrow-up-to-arc:before{content:""}.fa-arrow-up-to-bracket:before{content:""}.fa-arrow-up-to-dotted-line:before{content:""}.fa-arrow-up-to-line:before{content:""}.fa-arrow-up-triangle-square:before{content:""}.fa-arrow-up-wide-short:before{content:""}.fa-arrow-up-z-a:before{content:""}.fa-arrows:before{content:""}.fa-arrows-alt:before{content:""}.fa-arrows-alt-h:before{content:""}.fa-arrows-alt-v:before{content:""}.fa-arrows-cross:before{content:""}.fa-arrows-down-to-line:before{content:""}.fa-arrows-down-to-people:before{content:""}.fa-arrows-from-dotted-line:before{content:""}.fa-arrows-from-line:before{content:""}.fa-arrows-h:before,.fa-arrows-left-right:before{content:""}.fa-arrows-left-right-to-line:before{content:""}.fa-arrows-maximize:before{content:""}.fa-arrows-minimize:before{content:""}.fa-arrows-repeat:before{content:""}.fa-arrows-repeat-1:before{content:""}.fa-arrows-retweet:before{content:""}.fa-arrows-rotate:before{content:""}.fa-arrows-rotate-reverse:before{content:""}.fa-arrows-spin:before{content:""}.fa-arrows-split-up-and-left:before{content:""}.fa-arrows-to-circle:before{content:""}.fa-arrows-to-dot:before{content:""}.fa-arrows-to-dotted-line:before{content:""}.fa-arrows-to-eye:before{content:""}.fa-arrows-to-line:before{content:""}.fa-arrows-turn-right:before{content:""}.fa-arrows-turn-to-dots:before{content:""}.fa-arrows-up-down:before{content:""}.fa-arrows-up-down-left-right:before{content:""}.fa-arrows-up-to-line:before{content:""}.fa-arrows-v:before{content:""}.fa-asl-interpreting:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asterisk:before{content:"*"}.fa-at:before{content:"@"}.fa-atlas:before{content:""}.fa-atom:before{content:""}.fa-atom-alt:before,.fa-atom-simple:before{content:""}.fa-audio-description:before{content:""}.fa-audio-description-slash:before{content:""}.fa-austral-sign:before{content:""}.fa-automobile:before{content:""}.fa-avocado:before{content:""}.fa-award:before{content:""}.fa-award-simple:before{content:""}.fa-axe:before{content:""}.fa-axe-battle:before{content:""}.fa-b:before{content:"B"}.fa-baby:before{content:""}.fa-baby-carriage:before{content:""}.fa-backpack:before{content:""}.fa-backspace:before{content:""}.fa-backward:before{content:""}.fa-backward-fast:before{content:""}.fa-backward-step:before{content:""}.fa-bacon:before{content:""}.fa-bacteria:before{content:""}.fa-bacterium:before{content:""}.fa-badge:before{content:""}.fa-badge-check:before{content:""}.fa-badge-dollar:before{content:""}.fa-badge-percent:before{content:""}.fa-badge-sheriff:before{content:""}.fa-badger-honey:before{content:""}.fa-badminton:before{content:""}.fa-bag-seedling:before{content:""}.fa-bag-shopping:before{content:""}.fa-bag-shopping-minus:before{content:""}.fa-bag-shopping-plus:before{content:""}.fa-bagel:before{content:""}.fa-bags-shopping:before{content:""}.fa-baguette:before{content:""}.fa-bahai:before{content:""}.fa-baht-sign:before{content:""}.fa-balance-scale:before{content:""}.fa-balance-scale-left:before{content:""}.fa-balance-scale-right:before{content:""}.fa-ball-pile:before{content:""}.fa-balloon:before{content:""}.fa-balloons:before{content:""}.fa-ballot:before{content:""}.fa-ballot-check:before{content:""}.fa-ban:before{content:""}.fa-ban-bug:before{content:""}.fa-ban-parking:before{content:""}.fa-ban-smoking:before{content:""}.fa-banana:before{content:""}.fa-band-aid:before,.fa-bandage:before{content:""}.fa-bangladeshi-taka-sign:before{content:""}.fa-banjo:before{content:""}.fa-bank:before{content:""}.fa-bar-chart:before{content:""}.fa-barcode:before{content:""}.fa-barcode-alt:before{content:""}.fa-barcode-read:before{content:""}.fa-barcode-scan:before{content:""}.fa-barn-silo:before{content:""}.fa-bars:before{content:""}.fa-bars-filter:before{content:""}.fa-bars-progress:before{content:""}.fa-bars-sort:before{content:""}.fa-bars-staggered:before{content:""}.fa-baseball:before,.fa-baseball-ball:before{content:""}.fa-baseball-bat-ball:before{content:""}.fa-basket-shopping:before{content:""}.fa-basket-shopping-minus:before{content:""}.fa-basket-shopping-plus:before{content:""}.fa-basket-shopping-simple:before{content:""}.fa-basketball:before,.fa-basketball-ball:before{content:""}.fa-basketball-hoop:before{content:""}.fa-bat:before{content:""}.fa-bath:before,.fa-bathtub:before{content:""}.fa-battery:before{content:""}.fa-battery-0:before{content:""}.fa-battery-1:before{content:""}.fa-battery-2:before{content:""}.fa-battery-3:before{content:""}.fa-battery-4:before{content:""}.fa-battery-5:before{content:""}.fa-battery-bolt:before{content:""}.fa-battery-car:before{content:""}.fa-battery-empty:before{content:""}.fa-battery-exclamation:before{content:""}.fa-battery-full:before{content:""}.fa-battery-half:before{content:""}.fa-battery-low:before{content:""}.fa-battery-quarter:before{content:""}.fa-battery-slash:before{content:""}.fa-battery-three-quarters:before{content:""}.fa-bed:before{content:""}.fa-bed-alt:before{content:""}.fa-bed-bunk:before{content:""}.fa-bed-empty:before{content:""}.fa-bed-front:before{content:""}.fa-bed-pulse:before{content:""}.fa-bee:before{content:""}.fa-beer:before{content:""}.fa-beer-foam:before,.fa-beer-mug:before{content:""}.fa-beer-mug-empty:before{content:""}.fa-bell:before{content:""}.fa-bell-concierge:before{content:""}.fa-bell-exclamation:before{content:""}.fa-bell-on:before{content:""}.fa-bell-plus:before{content:""}.fa-bell-ring:before{content:""}.fa-bell-school:before{content:""}.fa-bell-school-slash:before{content:""}.fa-bell-slash:before{content:""}.fa-bells:before{content:""}.fa-bench-tree:before{content:""}.fa-betamax:before{content:""}.fa-bezier-curve:before{content:""}.fa-bible:before{content:""}.fa-bicycle:before{content:""}.fa-biking:before{content:""}.fa-biking-mountain:before{content:""}.fa-billboard:before{content:""}.fa-bin-bottles:before{content:""}.fa-bin-bottles-recycle:before{content:""}.fa-bin-recycle:before{content:""}.fa-binary:before{content:""}.fa-binary-circle-check:before{content:""}.fa-binary-lock:before{content:""}.fa-binary-slash:before{content:""}.fa-binoculars:before{content:""}.fa-biohazard:before{content:""}.fa-bird:before{content:""}.fa-birthday-cake:before{content:""}.fa-bitcoin-sign:before{content:""}.fa-blackboard:before{content:""}.fa-blanket:before{content:""}.fa-blanket-fire:before{content:""}.fa-blender:before{content:""}.fa-blender-phone:before{content:""}.fa-blind:before{content:""}.fa-blinds:before{content:""}.fa-blinds-open:before{content:""}.fa-blinds-raised:before{content:""}.fa-block:before{content:""}.fa-block-brick:before{content:""}.fa-block-brick-fire:before{content:""}.fa-block-question:before{content:""}.fa-block-quote:before{content:""}.fa-blog:before{content:""}.fa-blueberries:before{content:""}.fa-bold:before{content:""}.fa-bolt:before{content:""}.fa-bolt-auto:before{content:""}.fa-bolt-lightning:before{content:""}.fa-bolt-slash:before{content:""}.fa-bomb:before{content:""}.fa-bone:before{content:""}.fa-bone-break:before{content:""}.fa-bong:before{content:""}.fa-book:before{content:""}.fa-book-alt:before{content:""}.fa-book-arrow-right:before{content:""}.fa-book-arrow-up:before{content:""}.fa-book-atlas:before{content:""}.fa-book-bible:before{content:""}.fa-book-blank:before{content:""}.fa-book-bookmark:before{content:""}.fa-book-circle:before{content:""}.fa-book-circle-arrow-right:before{content:""}.fa-book-circle-arrow-up:before{content:""}.fa-book-copy:before{content:""}.fa-book-dead:before{content:""}.fa-book-font:before{content:""}.fa-book-heart:before{content:""}.fa-book-journal-whills:before{content:""}.fa-book-law:before{content:""}.fa-book-medical:before{content:""}.fa-book-open:before{content:""}.fa-book-open-alt:before,.fa-book-open-cover:before{content:""}.fa-book-open-reader:before{content:""}.fa-book-quran:before{content:""}.fa-book-reader:before{content:""}.fa-book-section:before{content:""}.fa-book-skull:before{content:""}.fa-book-sparkles:before,.fa-book-spells:before{content:""}.fa-book-tanakh:before{content:""}.fa-book-user:before{content:""}.fa-bookmark:before{content:""}.fa-bookmark-circle:before{content:""}.fa-bookmark-slash:before{content:""}.fa-books:before{content:""}.fa-books-medical:before{content:""}.fa-boombox:before{content:""}.fa-boot:before{content:""}.fa-boot-heeled:before{content:""}.fa-booth-curtain:before{content:""}.fa-border-all:before{content:""}.fa-border-bottom:before{content:""}.fa-border-bottom-right:before{content:""}.fa-border-center-h:before{content:""}.fa-border-center-v:before{content:""}.fa-border-inner:before{content:""}.fa-border-left:before{content:""}.fa-border-none:before{content:""}.fa-border-outer:before{content:""}.fa-border-right:before{content:""}.fa-border-style:before{content:""}.fa-border-style-alt:before{content:""}.fa-border-top:before{content:""}.fa-border-top-left:before{content:""}.fa-bore-hole:before{content:""}.fa-bottle-baby:before{content:""}.fa-bottle-droplet:before{content:""}.fa-bottle-water:before{content:""}.fa-bow-arrow:before{content:""}.fa-bowl-chopsticks:before{content:""}.fa-bowl-chopsticks-noodles:before{content:""}.fa-bowl-food:before{content:""}.fa-bowl-hot:before{content:""}.fa-bowl-rice:before{content:""}.fa-bowl-salad:before{content:""}.fa-bowl-scoop:before{content:""}.fa-bowl-scoops:before{content:""}.fa-bowl-shaved-ice:before{content:""}.fa-bowl-soft-serve:before{content:""}.fa-bowl-spoon:before{content:""}.fa-bowling-ball:before{content:""}.fa-bowling-ball-pin:before{content:""}.fa-bowling-pins:before{content:""}.fa-box:before{content:""}.fa-box-alt:before{content:""}.fa-box-archive:before{content:""}.fa-box-ballot:before{content:""}.fa-box-check:before{content:""}.fa-box-circle-check:before{content:""}.fa-box-dollar:before{content:""}.fa-box-fragile:before{content:""}.fa-box-full:before{content:""}.fa-box-heart:before{content:""}.fa-box-open:before{content:""}.fa-box-open-full:before{content:""}.fa-box-taped:before{content:""}.fa-box-tissue:before{content:""}.fa-box-up:before{content:""}.fa-box-usd:before{content:""}.fa-boxes:before,.fa-boxes-alt:before{content:""}.fa-boxes-packing:before{content:""}.fa-boxes-stacked:before{content:""}.fa-boxing-glove:before{content:""}.fa-bracket:before{content:"["}.fa-bracket-curly:before,.fa-bracket-curly-left:before{content:"{"}.fa-bracket-curly-right:before{content:"}"}.fa-bracket-left:before{content:"["}.fa-bracket-round:before{content:"("}.fa-bracket-round-right:before{content:")"}.fa-bracket-square:before{content:"["}.fa-bracket-square-right:before{content:"]"}.fa-brackets:before{content:""}.fa-brackets-curly:before{content:""}.fa-brackets-round:before{content:""}.fa-brackets-square:before{content:""}.fa-braille:before{content:""}.fa-brain:before{content:""}.fa-brain-arrow-curved-right:before{content:""}.fa-brain-circuit:before{content:""}.fa-brake-warning:before{content:""}.fa-brazilian-real-sign:before{content:""}.fa-bread-loaf:before{content:""}.fa-bread-slice:before{content:""}.fa-bread-slice-butter:before{content:""}.fa-bridge:before{content:""}.fa-bridge-circle-check:before{content:""}.fa-bridge-circle-exclamation:before{content:""}.fa-bridge-circle-xmark:before{content:""}.fa-bridge-lock:before{content:""}.fa-bridge-suspension:before{content:""}.fa-bridge-water:before{content:""}.fa-briefcase:before{content:""}.fa-briefcase-arrow-right:before{content:""}.fa-briefcase-blank:before{content:""}.fa-briefcase-clock:before{content:""}.fa-briefcase-medical:before{content:""}.fa-brightness:before{content:""}.fa-brightness-low:before{content:""}.fa-bring-forward:before{content:""}.fa-bring-front:before{content:""}.fa-broadcast-tower:before{content:""}.fa-broccoli:before{content:""}.fa-broom:before{content:""}.fa-broom-ball:before{content:""}.fa-broom-wide:before{content:""}.fa-browser:before{content:""}.fa-browsers:before{content:""}.fa-brush:before{content:""}.fa-bucket:before{content:""}.fa-bug:before{content:""}.fa-bug-slash:before{content:""}.fa-bugs:before{content:""}.fa-building:before{content:""}.fa-building-circle-arrow-right:before{content:""}.fa-building-circle-check:before{content:""}.fa-building-circle-exclamation:before{content:""}.fa-building-circle-xmark:before{content:""}.fa-building-columns:before{content:""}.fa-building-flag:before{content:""}.fa-building-lock:before{content:""}.fa-building-magnifying-glass:before{content:""}.fa-building-memo:before{content:""}.fa-building-ngo:before{content:""}.fa-building-shield:before{content:""}.fa-building-un:before{content:""}.fa-building-user:before{content:""}.fa-building-wheat:before{content:""}.fa-buildings:before{content:""}.fa-bulldozer:before{content:""}.fa-bullhorn:before{content:""}.fa-bullseye:before{content:""}.fa-bullseye-arrow:before{content:""}.fa-bullseye-pointer:before{content:""}.fa-buoy:before{content:""}.fa-buoy-mooring:before{content:""}.fa-burger:before{content:""}.fa-burger-cheese:before{content:""}.fa-burger-fries:before{content:""}.fa-burger-glass:before{content:""}.fa-burger-lettuce:before{content:""}.fa-burger-soda:before{content:""}.fa-burn:before{content:""}.fa-burrito:before{content:""}.fa-burst:before{content:""}.fa-bus:before{content:""}.fa-bus-alt:before{content:""}.fa-bus-school:before{content:""}.fa-bus-simple:before{content:""}.fa-business-front:before{content:""}.fa-business-time:before{content:""}.fa-butter:before{content:""}.fa-c:before{content:"C"}.fa-cab:before{content:""}.fa-cabin:before{content:""}.fa-cabinet-filing:before{content:""}.fa-cable-car:before{content:""}.fa-cactus:before{content:""}.fa-caduceus:before{content:""}.fa-cake:before,.fa-cake-candles:before{content:""}.fa-cake-slice:before{content:""}.fa-calculator:before{content:""}.fa-calculator-alt:before,.fa-calculator-simple:before{content:""}.fa-calendar:before{content:""}.fa-calendar-alt:before{content:""}.fa-calendar-arrow-down:before{content:""}.fa-calendar-arrow-up:before{content:""}.fa-calendar-check:before{content:""}.fa-calendar-circle:before{content:""}.fa-calendar-circle-exclamation:before{content:""}.fa-calendar-circle-minus:before{content:""}.fa-calendar-circle-plus:before{content:""}.fa-calendar-circle-user:before{content:""}.fa-calendar-clock:before{content:""}.fa-calendar-day:before{content:""}.fa-calendar-days:before{content:""}.fa-calendar-download:before{content:""}.fa-calendar-edit:before{content:""}.fa-calendar-exclamation:before{content:""}.fa-calendar-heart:before{content:""}.fa-calendar-image:before{content:""}.fa-calendar-lines:before{content:""}.fa-calendar-lines-pen:before{content:""}.fa-calendar-minus:before{content:""}.fa-calendar-note:before{content:""}.fa-calendar-pen:before{content:""}.fa-calendar-plus:before{content:""}.fa-calendar-range:before{content:""}.fa-calendar-star:before{content:""}.fa-calendar-time:before{content:""}.fa-calendar-times:before{content:""}.fa-calendar-upload:before{content:""}.fa-calendar-users:before{content:""}.fa-calendar-week:before{content:""}.fa-calendar-xmark:before{content:""}.fa-calendars:before{content:""}.fa-camcorder:before{content:""}.fa-camera:before,.fa-camera-alt:before{content:""}.fa-camera-cctv:before{content:""}.fa-camera-circle:before{content:""}.fa-camera-home:before{content:""}.fa-camera-movie:before{content:""}.fa-camera-polaroid:before{content:""}.fa-camera-retro:before{content:""}.fa-camera-rotate:before{content:""}.fa-camera-security:before{content:""}.fa-camera-slash:before{content:""}.fa-camera-viewfinder:before{content:""}.fa-camera-web:before{content:""}.fa-camera-web-slash:before{content:""}.fa-campfire:before{content:""}.fa-campground:before{content:""}.fa-can-food:before{content:""}.fa-cancel:before{content:""}.fa-candle-holder:before{content:""}.fa-candy:before{content:""}.fa-candy-bar:before{content:""}.fa-candy-cane:before{content:""}.fa-candy-corn:before{content:""}.fa-cannabis:before{content:""}.fa-cannon:before{content:""}.fa-capsules:before{content:""}.fa-car:before{content:""}.fa-car-alt:before{content:""}.fa-car-battery:before{content:""}.fa-car-bolt:before{content:""}.fa-car-building:before{content:""}.fa-car-bump:before{content:""}.fa-car-burst:before{content:""}.fa-car-bus:before{content:""}.fa-car-circle-bolt:before{content:""}.fa-car-crash:before{content:""}.fa-car-garage:before{content:""}.fa-car-mechanic:before{content:""}.fa-car-mirrors:before{content:""}.fa-car-on:before{content:""}.fa-car-rear:before{content:""}.fa-car-side:before{content:""}.fa-car-side-bolt:before{content:""}.fa-car-tilt:before{content:""}.fa-car-tunnel:before{content:""}.fa-car-wash:before{content:""}.fa-car-wrench:before{content:""}.fa-caravan:before{content:""}.fa-caravan-alt:before,.fa-caravan-simple:before{content:""}.fa-card-club:before{content:""}.fa-card-diamond:before{content:""}.fa-card-heart:before{content:""}.fa-card-spade:before{content:""}.fa-cards:before{content:""}.fa-cards-blank:before{content:""}.fa-caret-circle-down:before{content:""}.fa-caret-circle-left:before{content:""}.fa-caret-circle-right:before{content:""}.fa-caret-circle-up:before{content:""}.fa-caret-down:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-caret-square-down:before{content:""}.fa-caret-square-left:before{content:""}.fa-caret-square-right:before{content:""}.fa-caret-square-up:before{content:""}.fa-caret-up:before{content:""}.fa-carriage-baby:before{content:""}.fa-carrot:before{content:""}.fa-cars:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-cart-arrow-up:before{content:""}.fa-cart-circle-arrow-down:before{content:""}.fa-cart-circle-arrow-up:before{content:""}.fa-cart-circle-check:before{content:""}.fa-cart-circle-exclamation:before{content:""}.fa-cart-circle-plus:before{content:""}.fa-cart-circle-xmark:before{content:""}.fa-cart-flatbed:before{content:""}.fa-cart-flatbed-boxes:before{content:""}.fa-cart-flatbed-empty:before{content:""}.fa-cart-flatbed-suitcase:before{content:""}.fa-cart-minus:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-shopping:before{content:""}.fa-cart-shopping-fast:before{content:""}.fa-cart-xmark:before{content:""}.fa-cash-register:before{content:""}.fa-cassette-betamax:before{content:""}.fa-cassette-tape:before{content:""}.fa-cassette-vhs:before{content:""}.fa-castle:before{content:""}.fa-cat:before{content:""}.fa-cat-space:before{content:""}.fa-cauldron:before{content:""}.fa-cctv:before{content:""}.fa-cedi-sign:before{content:""}.fa-cent-sign:before{content:""}.fa-certificate:before{content:""}.fa-chain:before{content:""}.fa-chain-broken:before{content:""}.fa-chain-horizontal:before{content:""}.fa-chain-horizontal-slash:before{content:""}.fa-chain-slash:before{content:""}.fa-chair:before{content:""}.fa-chair-office:before{content:""}.fa-chalkboard:before{content:""}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:""}.fa-champagne-glass:before{content:""}.fa-champagne-glasses:before{content:""}.fa-charging-station:before{content:""}.fa-chart-area:before{content:""}.fa-chart-bar:before{content:""}.fa-chart-bullet:before{content:""}.fa-chart-candlestick:before{content:""}.fa-chart-column:before{content:""}.fa-chart-gantt:before{content:""}.fa-chart-kanban:before{content:""}.fa-chart-line:before{content:""}.fa-chart-line-down:before{content:""}.fa-chart-line-up:before{content:""}.fa-chart-line-up-down:before{content:""}.fa-chart-mixed:before{content:""}.fa-chart-mixed-up-circle-currency:before{content:""}.fa-chart-mixed-up-circle-dollar:before{content:""}.fa-chart-network:before{content:""}.fa-chart-pie:before{content:""}.fa-chart-pie-alt:before,.fa-chart-pie-simple:before{content:""}.fa-chart-pie-simple-circle-currency:before{content:""}.fa-chart-pie-simple-circle-dollar:before{content:""}.fa-chart-pyramid:before{content:""}.fa-chart-radar:before{content:""}.fa-chart-scatter:before{content:""}.fa-chart-scatter-3d:before{content:""}.fa-chart-scatter-bubble:before{content:""}.fa-chart-simple:before{content:""}.fa-chart-simple-horizontal:before{content:""}.fa-chart-tree-map:before{content:""}.fa-chart-user:before{content:""}.fa-chart-waterfall:before{content:""}.fa-check:before{content:""}.fa-check-circle:before{content:""}.fa-check-double:before{content:""}.fa-check-square:before{content:""}.fa-check-to-slot:before{content:""}.fa-cheese:before{content:""}.fa-cheese-swiss:before{content:""}.fa-cheeseburger:before{content:""}.fa-cherries:before{content:""}.fa-chess:before{content:""}.fa-chess-bishop:before{content:""}.fa-chess-bishop-alt:before,.fa-chess-bishop-piece:before{content:""}.fa-chess-board:before{content:""}.fa-chess-clock:before{content:""}.fa-chess-clock-alt:before,.fa-chess-clock-flip:before{content:""}.fa-chess-king:before{content:""}.fa-chess-king-alt:before,.fa-chess-king-piece:before{content:""}.fa-chess-knight:before{content:""}.fa-chess-knight-alt:before,.fa-chess-knight-piece:before{content:""}.fa-chess-pawn:before{content:""}.fa-chess-pawn-alt:before,.fa-chess-pawn-piece:before{content:""}.fa-chess-queen:before{content:""}.fa-chess-queen-alt:before,.fa-chess-queen-piece:before{content:""}.fa-chess-rook:before{content:""}.fa-chess-rook-alt:before,.fa-chess-rook-piece:before{content:""}.fa-chestnut:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-double-down:before{content:""}.fa-chevron-double-left:before{content:""}.fa-chevron-double-right:before{content:""}.fa-chevron-double-up:before{content:""}.fa-chevron-down:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-chevron-square-down:before{content:""}.fa-chevron-square-left:before{content:""}.fa-chevron-square-right:before{content:""}.fa-chevron-square-up:before{content:""}.fa-chevron-up:before{content:""}.fa-chevrons-down:before{content:""}.fa-chevrons-left:before{content:""}.fa-chevrons-right:before{content:""}.fa-chevrons-up:before{content:""}.fa-chf-sign:before{content:""}.fa-child:before{content:""}.fa-child-combatant:before{content:""}.fa-child-dress:before{content:""}.fa-child-reaching:before{content:""}.fa-child-rifle:before{content:""}.fa-children:before{content:""}.fa-chimney:before{content:""}.fa-chocolate-bar:before{content:""}.fa-chopsticks:before{content:""}.fa-church:before{content:""}.fa-circle:before{content:""}.fa-circle-0:before{content:""}.fa-circle-1:before{content:""}.fa-circle-2:before{content:""}.fa-circle-3:before{content:""}.fa-circle-4:before{content:""}.fa-circle-5:before{content:""}.fa-circle-6:before{content:""}.fa-circle-7:before{content:""}.fa-circle-8:before{content:""}.fa-circle-9:before{content:""}.fa-circle-a:before{content:""}.fa-circle-ampersand:before{content:""}.fa-circle-arrow-down:before{content:""}.fa-circle-arrow-down-left:before{content:""}.fa-circle-arrow-down-right:before{content:""}.fa-circle-arrow-left:before{content:""}.fa-circle-arrow-right:before{content:""}.fa-circle-arrow-up:before{content:""}.fa-circle-arrow-up-left:before{content:""}.fa-circle-arrow-up-right:before{content:""}.fa-circle-b:before{content:""}.fa-circle-bolt:before{content:""}.fa-circle-book-open:before{content:""}.fa-circle-bookmark:before{content:""}.fa-circle-c:before{content:""}.fa-circle-calendar:before{content:""}.fa-circle-camera:before{content:""}.fa-circle-caret-down:before{content:""}.fa-circle-caret-left:before{content:""}.fa-circle-caret-right:before{content:""}.fa-circle-caret-up:before{content:""}.fa-circle-check:before{content:""}.fa-circle-chevron-down:before{content:""}.fa-circle-chevron-left:before{content:""}.fa-circle-chevron-right:before{content:""}.fa-circle-chevron-up:before{content:""}.fa-circle-d:before{content:""}.fa-circle-dashed:before{content:""}.fa-circle-divide:before{content:""}.fa-circle-dollar:before{content:""}.fa-circle-dollar-to-slot:before{content:""}.fa-circle-dot:before{content:""}.fa-circle-down:before{content:""}.fa-circle-down-left:before{content:""}.fa-circle-down-right:before{content:""}.fa-circle-e:before{content:""}.fa-circle-ellipsis:before{content:""}.fa-circle-ellipsis-vertical:before{content:""}.fa-circle-envelope:before{content:""}.fa-circle-euro:before{content:""}.fa-circle-exclamation:before{content:""}.fa-circle-exclamation-check:before{content:""}.fa-circle-f:before{content:""}.fa-circle-g:before{content:""}.fa-circle-gf:before{content:""}.fa-circle-h:before{content:""}.fa-circle-half:before{content:""}.fa-circle-half-stroke:before{content:""}.fa-circle-heart:before{content:""}.fa-circle-i:before{content:""}.fa-circle-info:before{content:""}.fa-circle-j:before{content:""}.fa-circle-k:before{content:""}.fa-circle-l:before{content:""}.fa-circle-left:before{content:""}.fa-circle-location-arrow:before{content:""}.fa-circle-m:before{content:""}.fa-circle-microphone:before{content:""}.fa-circle-microphone-lines:before{content:""}.fa-circle-minus:before{content:""}.fa-circle-n:before{content:""}.fa-circle-nodes:before{content:""}.fa-circle-notch:before{content:""}.fa-circle-o:before{content:""}.fa-circle-p:before{content:""}.fa-circle-parking:before{content:""}.fa-circle-pause:before{content:""}.fa-circle-phone:before{content:""}.fa-circle-phone-flip:before{content:""}.fa-circle-phone-hangup:before{content:""}.fa-circle-play:before{content:""}.fa-circle-plus:before{content:""}.fa-circle-q:before{content:""}.fa-circle-quarter:before{content:""}.fa-circle-quarter-stroke:before{content:""}.fa-circle-quarters:before{content:""}.fa-circle-question:before{content:""}.fa-circle-r:before{content:""}.fa-circle-radiation:before{content:""}.fa-circle-right:before{content:""}.fa-circle-s:before{content:""}.fa-circle-small:before{content:""}.fa-circle-sort:before{content:""}.fa-circle-sort-down:before{content:""}.fa-circle-sort-up:before{content:""}.fa-circle-star:before{content:""}.fa-circle-sterling:before{content:""}.fa-circle-stop:before{content:""}.fa-circle-t:before{content:""}.fa-circle-three-quarters:before{content:""}.fa-circle-three-quarters-stroke:before{content:""}.fa-circle-trash:before{content:""}.fa-circle-u:before{content:""}.fa-circle-up:before{content:""}.fa-circle-up-left:before{content:""}.fa-circle-up-right:before{content:""}.fa-circle-user:before{content:""}.fa-circle-v:before{content:""}.fa-circle-video:before{content:""}.fa-circle-w:before{content:""}.fa-circle-waveform-lines:before{content:""}.fa-circle-wifi:before{content:""}.fa-circle-wifi-circle-wifi:before,.fa-circle-wifi-group:before{content:""}.fa-circle-x:before{content:""}.fa-circle-xmark:before{content:""}.fa-circle-y:before{content:""}.fa-circle-yen:before{content:""}.fa-circle-z:before{content:""}.fa-circles-overlap:before{content:""}.fa-citrus:before{content:""}.fa-citrus-slice:before{content:""}.fa-city:before{content:""}.fa-clapperboard:before{content:""}.fa-clapperboard-play:before{content:""}.fa-clarinet:before{content:""}.fa-claw-marks:before{content:""}.fa-clinic-medical:before{content:""}.fa-clipboard:before{content:""}.fa-clipboard-check:before{content:""}.fa-clipboard-list:before{content:""}.fa-clipboard-list-check:before{content:""}.fa-clipboard-medical:before{content:""}.fa-clipboard-prescription:before{content:""}.fa-clipboard-question:before{content:""}.fa-clipboard-user:before{content:""}.fa-clock:before{content:""}.fa-clock-desk:before{content:""}.fa-clock-eight:before{content:""}.fa-clock-eight-thirty:before{content:""}.fa-clock-eleven:before{content:""}.fa-clock-eleven-thirty:before{content:""}.fa-clock-five:before{content:""}.fa-clock-five-thirty:before{content:""}.fa-clock-four:before{content:""}.fa-clock-four-thirty:before{content:""}.fa-clock-nine:before{content:""}.fa-clock-nine-thirty:before{content:""}.fa-clock-one:before{content:""}.fa-clock-one-thirty:before{content:""}.fa-clock-rotate-left:before{content:""}.fa-clock-seven:before{content:""}.fa-clock-seven-thirty:before{content:""}.fa-clock-six:before{content:""}.fa-clock-six-thirty:before{content:""}.fa-clock-ten:before{content:""}.fa-clock-ten-thirty:before{content:""}.fa-clock-three:before{content:""}.fa-clock-three-thirty:before{content:""}.fa-clock-twelve:before{content:""}.fa-clock-twelve-thirty:before{content:""}.fa-clock-two:before{content:""}.fa-clock-two-thirty:before{content:""}.fa-clone:before{content:""}.fa-close:before{content:""}.fa-closed-captioning:before{content:""}.fa-closed-captioning-slash:before{content:""}.fa-clothes-hanger:before{content:""}.fa-cloud:before{content:""}.fa-cloud-arrow-down:before{content:""}.fa-cloud-arrow-up:before{content:""}.fa-cloud-binary:before{content:""}.fa-cloud-bolt:before{content:""}.fa-cloud-bolt-moon:before{content:""}.fa-cloud-bolt-sun:before{content:""}.fa-cloud-check:before{content:""}.fa-cloud-download:before,.fa-cloud-download-alt:before{content:""}.fa-cloud-drizzle:before{content:""}.fa-cloud-exclamation:before{content:""}.fa-cloud-fog:before{content:""}.fa-cloud-hail:before{content:""}.fa-cloud-hail-mixed:before{content:""}.fa-cloud-meatball:before{content:""}.fa-cloud-minus:before{content:""}.fa-cloud-moon:before{content:""}.fa-cloud-moon-rain:before{content:""}.fa-cloud-music:before{content:""}.fa-cloud-plus:before{content:""}.fa-cloud-question:before{content:""}.fa-cloud-rain:before{content:""}.fa-cloud-rainbow:before{content:""}.fa-cloud-showers:before{content:""}.fa-cloud-showers-heavy:before{content:""}.fa-cloud-showers-water:before{content:""}.fa-cloud-slash:before{content:""}.fa-cloud-sleet:before{content:""}.fa-cloud-snow:before{content:""}.fa-cloud-sun:before{content:""}.fa-cloud-sun-rain:before{content:""}.fa-cloud-upload:before,.fa-cloud-upload-alt:before{content:""}.fa-cloud-word:before{content:""}.fa-cloud-xmark:before{content:""}.fa-clouds:before{content:""}.fa-clouds-moon:before{content:""}.fa-clouds-sun:before{content:""}.fa-clover:before{content:""}.fa-club:before{content:""}.fa-cny:before{content:""}.fa-cocktail:before{content:""}.fa-coconut:before{content:""}.fa-code:before{content:""}.fa-code-branch:before{content:""}.fa-code-commit:before{content:""}.fa-code-compare:before{content:""}.fa-code-fork:before{content:""}.fa-code-merge:before{content:""}.fa-code-pull-request:before{content:""}.fa-code-pull-request-closed:before{content:""}.fa-code-pull-request-draft:before{content:""}.fa-code-simple:before{content:""}.fa-coffee:before{content:""}.fa-coffee-bean:before{content:""}.fa-coffee-beans:before{content:""}.fa-coffee-pot:before{content:""}.fa-coffee-togo:before{content:""}.fa-coffin:before{content:""}.fa-coffin-cross:before{content:""}.fa-cog:before{content:""}.fa-cogs:before{content:""}.fa-coin:before{content:""}.fa-coin-blank:before{content:""}.fa-coin-front:before{content:""}.fa-coin-vertical:before{content:""}.fa-coins:before{content:""}.fa-colon:before{content:":"}.fa-colon-sign:before{content:""}.fa-columns:before{content:""}.fa-columns-3:before{content:""}.fa-comet:before{content:""}.fa-comma:before{content:","}.fa-command:before{content:""}.fa-comment:before{content:""}.fa-comment-alt:before{content:""}.fa-comment-alt-arrow-down:before{content:""}.fa-comment-alt-arrow-up:before{content:""}.fa-comment-alt-captions:before{content:""}.fa-comment-alt-check:before{content:""}.fa-comment-alt-dollar:before{content:""}.fa-comment-alt-dots:before{content:""}.fa-comment-alt-edit:before{content:""}.fa-comment-alt-exclamation:before{content:""}.fa-comment-alt-image:before{content:""}.fa-comment-alt-lines:before{content:""}.fa-comment-alt-medical:before{content:""}.fa-comment-alt-minus:before{content:""}.fa-comment-alt-music:before{content:""}.fa-comment-alt-plus:before{content:""}.fa-comment-alt-quote:before{content:""}.fa-comment-alt-slash:before{content:""}.fa-comment-alt-smile:before{content:""}.fa-comment-alt-text:before{content:""}.fa-comment-alt-times:before{content:""}.fa-comment-arrow-down:before{content:""}.fa-comment-arrow-up:before{content:""}.fa-comment-arrow-up-right:before{content:""}.fa-comment-captions:before{content:""}.fa-comment-check:before{content:""}.fa-comment-code:before{content:""}.fa-comment-dollar:before{content:""}.fa-comment-dots:before{content:""}.fa-comment-edit:before{content:""}.fa-comment-exclamation:before{content:""}.fa-comment-heart:before{content:""}.fa-comment-image:before{content:""}.fa-comment-lines:before{content:""}.fa-comment-medical:before{content:""}.fa-comment-middle:before{content:""}.fa-comment-middle-alt:before{content:""}.fa-comment-middle-top:before{content:""}.fa-comment-middle-top-alt:before{content:""}.fa-comment-minus:before{content:""}.fa-comment-music:before{content:""}.fa-comment-pen:before{content:""}.fa-comment-plus:before{content:""}.fa-comment-question:before{content:""}.fa-comment-quote:before{content:""}.fa-comment-slash:before{content:""}.fa-comment-smile:before{content:""}.fa-comment-sms:before{content:""}.fa-comment-text:before{content:""}.fa-comment-times:before,.fa-comment-xmark:before{content:""}.fa-commenting:before{content:""}.fa-comments:before{content:""}.fa-comments-alt:before{content:""}.fa-comments-alt-dollar:before{content:""}.fa-comments-dollar:before{content:""}.fa-comments-question:before{content:""}.fa-comments-question-check:before{content:""}.fa-compact-disc:before{content:""}.fa-compass:before{content:""}.fa-compass-drafting:before{content:""}.fa-compass-slash:before{content:""}.fa-compress:before{content:""}.fa-compress-alt:before{content:""}.fa-compress-arrows:before{content:""}.fa-compress-arrows-alt:before{content:""}.fa-compress-wide:before{content:""}.fa-computer:before{content:""}.fa-computer-classic:before{content:""}.fa-computer-mouse:before{content:""}.fa-computer-mouse-scrollwheel:before{content:""}.fa-computer-speaker:before{content:""}.fa-concierge-bell:before{content:""}.fa-construction:before{content:""}.fa-contact-book:before{content:""}.fa-contact-card:before{content:""}.fa-container-storage:before{content:""}.fa-conveyor-belt:before{content:""}.fa-conveyor-belt-alt:before{content:""}.fa-conveyor-belt-arm:before{content:""}.fa-conveyor-belt-boxes:before{content:""}.fa-conveyor-belt-empty:before{content:""}.fa-cookie:before{content:""}.fa-cookie-bite:before{content:""}.fa-copy:before{content:""}.fa-copyright:before{content:""}.fa-corn:before{content:""}.fa-corner:before{content:""}.fa-couch:before{content:""}.fa-couch-small:before{content:""}.fa-court-sport:before{content:""}.fa-cow:before{content:""}.fa-cowbell:before{content:""}.fa-cowbell-circle-plus:before,.fa-cowbell-more:before{content:""}.fa-crab:before{content:""}.fa-crate-apple:before{content:""}.fa-crate-empty:before{content:""}.fa-credit-card:before,.fa-credit-card-alt:before{content:""}.fa-credit-card-blank:before{content:""}.fa-credit-card-front:before{content:""}.fa-creemee:before{content:""}.fa-cricket:before,.fa-cricket-bat-ball:before{content:""}.fa-croissant:before{content:""}.fa-crop:before{content:""}.fa-crop-alt:before,.fa-crop-simple:before{content:""}.fa-cross:before{content:""}.fa-crosshairs:before{content:""}.fa-crosshairs-simple:before{content:""}.fa-crow:before{content:""}.fa-crown:before{content:""}.fa-crutch:before{content:""}.fa-crutches:before{content:""}.fa-cruzeiro-sign:before{content:""}.fa-crystal-ball:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-cubes-stacked:before{content:""}.fa-cucumber:before{content:""}.fa-cup-straw:before{content:""}.fa-cup-straw-swoosh:before{content:""}.fa-cup-togo:before{content:""}.fa-cupcake:before{content:""}.fa-curling:before,.fa-curling-stone:before{content:""}.fa-custard:before{content:""}.fa-cut:before{content:""}.fa-cutlery:before{content:""}.fa-d:before{content:"D"}.fa-dagger:before{content:""}.fa-dash:before{content:""}.fa-dashboard:before{content:""}.fa-database:before{content:""}.fa-deaf:before,.fa-deafness:before{content:""}.fa-debug:before{content:""}.fa-dedent:before{content:""}.fa-deer:before{content:""}.fa-deer-rudolph:before{content:""}.fa-delete-left:before{content:""}.fa-delete-right:before{content:""}.fa-democrat:before{content:""}.fa-desktop:before,.fa-desktop-alt:before{content:""}.fa-desktop-arrow-down:before{content:""}.fa-desktop-code:before{content:""}.fa-desktop-medical:before{content:""}.fa-desktop-slash:before{content:""}.fa-dewpoint:before{content:""}.fa-dharmachakra:before{content:""}.fa-diagnoses:before{content:""}.fa-diagram-cells:before{content:""}.fa-diagram-lean-canvas:before{content:""}.fa-diagram-nested:before{content:""}.fa-diagram-next:before{content:""}.fa-diagram-predecessor:before{content:""}.fa-diagram-previous:before{content:""}.fa-diagram-project:before{content:""}.fa-diagram-sankey:before{content:""}.fa-diagram-subtask:before{content:""}.fa-diagram-successor:before{content:""}.fa-diagram-venn:before{content:""}.fa-dial:before{content:""}.fa-dial-high:before{content:""}.fa-dial-low:before{content:""}.fa-dial-max:before{content:""}.fa-dial-med:before{content:""}.fa-dial-med-high:before{content:""}.fa-dial-med-low:before{content:""}.fa-dial-min:before{content:""}.fa-dial-off:before{content:""}.fa-diamond:before{content:""}.fa-diamond-exclamation:before{content:""}.fa-diamond-half:before{content:""}.fa-diamond-half-stroke:before{content:""}.fa-diamond-turn-right:before{content:""}.fa-diamonds-4:before{content:""}.fa-dice:before{content:""}.fa-dice-d10:before{content:""}.fa-dice-d12:before{content:""}.fa-dice-d20:before{content:""}.fa-dice-d4:before{content:""}.fa-dice-d6:before{content:""}.fa-dice-d8:before{content:""}.fa-dice-five:before{content:""}.fa-dice-four:before{content:""}.fa-dice-one:before{content:""}.fa-dice-six:before{content:""}.fa-dice-three:before{content:""}.fa-dice-two:before{content:""}.fa-digging:before{content:""}.fa-digital-tachograph:before{content:""}.fa-dinosaur:before{content:""}.fa-diploma:before{content:""}.fa-directions:before{content:""}.fa-disc-drive:before{content:""}.fa-disease:before{content:""}.fa-display:before{content:""}.fa-display-arrow-down:before{content:""}.fa-display-chart-up:before{content:""}.fa-display-chart-up-circle-currency:before{content:""}.fa-display-chart-up-circle-dollar:before{content:""}.fa-display-code:before{content:""}.fa-display-medical:before{content:""}.fa-display-slash:before{content:""}.fa-distribute-spacing-horizontal:before{content:""}.fa-distribute-spacing-vertical:before{content:""}.fa-ditto:before{content:"\""}.fa-divide:before{content:""}.fa-dizzy:before{content:""}.fa-dna:before{content:""}.fa-do-not-enter:before{content:""}.fa-dog:before{content:""}.fa-dog-leashed:before{content:""}.fa-dollar:before{content:"$"}.fa-dollar-circle:before{content:""}.fa-dollar-sign:before{content:"$"}.fa-dollar-square:before{content:""}.fa-dolly:before,.fa-dolly-box:before{content:""}.fa-dolly-empty:before{content:""}.fa-dolly-flatbed:before{content:""}.fa-dolly-flatbed-alt:before{content:""}.fa-dolly-flatbed-empty:before{content:""}.fa-dolphin:before{content:""}.fa-donate:before{content:""}.fa-dong-sign:before{content:""}.fa-donut:before{content:""}.fa-door-closed:before{content:""}.fa-door-open:before{content:""}.fa-dot-circle:before{content:""}.fa-doughnut:before{content:""}.fa-dove:before{content:""}.fa-down:before{content:""}.fa-down-from-bracket:before{content:""}.fa-down-from-dotted-line:before{content:""}.fa-down-from-line:before{content:""}.fa-down-left:before{content:""}.fa-down-left-and-up-right-to-center:before{content:""}.fa-down-long:before{content:""}.fa-down-right:before{content:""}.fa-down-to-bracket:before{content:""}.fa-down-to-dotted-line:before{content:""}.fa-down-to-line:before{content:""}.fa-download:before{content:""}.fa-drafting-compass:before{content:""}.fa-dragon:before{content:""}.fa-draw-circle:before{content:""}.fa-draw-polygon:before{content:""}.fa-draw-square:before{content:""}.fa-dreidel:before{content:""}.fa-drivers-license:before{content:""}.fa-drone:before{content:""}.fa-drone-alt:before,.fa-drone-front:before{content:""}.fa-droplet:before{content:""}.fa-droplet-degree:before{content:""}.fa-droplet-percent:before{content:""}.fa-droplet-slash:before{content:""}.fa-drum:before{content:""}.fa-drum-steelpan:before{content:""}.fa-drumstick:before{content:""}.fa-drumstick-bite:before{content:""}.fa-dryer:before{content:""}.fa-dryer-alt:before,.fa-dryer-heat:before{content:""}.fa-duck:before{content:""}.fa-dumbbell:before{content:""}.fa-dumpster:before{content:""}.fa-dumpster-fire:before{content:""}.fa-dungeon:before{content:""}.fa-e:before{content:"E"}.fa-ear:before{content:""}.fa-ear-deaf:before{content:""}.fa-ear-listen:before{content:""}.fa-ear-muffs:before{content:""}.fa-earth:before{content:""}.fa-earth-africa:before{content:""}.fa-earth-america:before,.fa-earth-americas:before{content:""}.fa-earth-asia:before{content:""}.fa-earth-europe:before{content:""}.fa-earth-oceania:before{content:""}.fa-eclipse:before{content:""}.fa-eclipse-alt:before{content:""}.fa-edit:before{content:""}.fa-egg:before{content:""}.fa-egg-fried:before{content:""}.fa-eggplant:before{content:""}.fa-eject:before{content:""}.fa-elephant:before{content:""}.fa-elevator:before{content:""}.fa-ellipsis:before,.fa-ellipsis-h:before{content:""}.fa-ellipsis-h-alt:before,.fa-ellipsis-stroke:before{content:""}.fa-ellipsis-stroke-vertical:before{content:""}.fa-ellipsis-v:before{content:""}.fa-ellipsis-v-alt:before{content:""}.fa-ellipsis-vertical:before{content:""}.fa-empty-set:before{content:""}.fa-engine:before{content:""}.fa-engine-exclamation:before,.fa-engine-warning:before{content:""}.fa-envelope:before{content:""}.fa-envelope-badge:before{content:""}.fa-envelope-circle:before{content:""}.fa-envelope-circle-check:before{content:""}.fa-envelope-dot:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-dollar:before{content:""}.fa-envelope-open-text:before{content:""}.fa-envelope-square:before{content:""}.fa-envelopes:before{content:""}.fa-envelopes-bulk:before{content:""}.fa-equals:before{content:"="}.fa-eraser:before{content:""}.fa-escalator:before{content:""}.fa-ethernet:before{content:""}.fa-eur:before,.fa-euro:before,.fa-euro-sign:before{content:""}.fa-excavator:before{content:""}.fa-exchange:before{content:""}.fa-exchange-alt:before{content:""}.fa-exclamation:before{content:"!"}.fa-exclamation-circle:before{content:""}.fa-exclamation-square:before{content:""}.fa-exclamation-triangle:before{content:""}.fa-expand:before{content:""}.fa-expand-alt:before{content:""}.fa-expand-arrows:before{content:""}.fa-expand-arrows-alt:before{content:""}.fa-expand-wide:before{content:""}.fa-exploding-head:before{content:""}.fa-explosion:before{content:""}.fa-external-link:before{content:""}.fa-external-link-alt:before{content:""}.fa-external-link-square:before{content:""}.fa-external-link-square-alt:before{content:""}.fa-eye:before{content:""}.fa-eye-dropper:before,.fa-eye-dropper-empty:before{content:""}.fa-eye-dropper-full:before{content:""}.fa-eye-dropper-half:before{content:""}.fa-eye-evil:before{content:""}.fa-eye-low-vision:before{content:""}.fa-eye-slash:before{content:""}.fa-eyedropper:before{content:""}.fa-eyes:before{content:""}.fa-f:before{content:"F"}.fa-face-angry:before{content:""}.fa-face-angry-horns:before{content:""}.fa-face-anguished:before{content:""}.fa-face-anxious-sweat:before{content:""}.fa-face-astonished:before{content:""}.fa-face-awesome:before{content:""}.fa-face-beam-hand-over-mouth:before{content:""}.fa-face-clouds:before{content:""}.fa-face-confounded:before{content:""}.fa-face-confused:before{content:""}.fa-face-cowboy-hat:before{content:""}.fa-face-diagonal-mouth:before{content:""}.fa-face-disappointed:before{content:""}.fa-face-disguise:before{content:""}.fa-face-dizzy:before{content:""}.fa-face-dotted:before{content:""}.fa-face-downcast-sweat:before{content:""}.fa-face-drooling:before{content:""}.fa-face-exhaling:before{content:""}.fa-face-explode:before{content:""}.fa-face-expressionless:before{content:""}.fa-face-eyes-xmarks:before{content:""}.fa-face-fearful:before{content:""}.fa-face-flushed:before{content:""}.fa-face-frown:before{content:""}.fa-face-frown-open:before{content:""}.fa-face-frown-slight:before{content:""}.fa-face-glasses:before{content:""}.fa-face-grimace:before{content:""}.fa-face-grin:before{content:""}.fa-face-grin-beam:before{content:""}.fa-face-grin-beam-sweat:before{content:""}.fa-face-grin-hearts:before{content:""}.fa-face-grin-squint:before{content:""}.fa-face-grin-squint-tears:before{content:""}.fa-face-grin-stars:before{content:""}.fa-face-grin-tears:before{content:""}.fa-face-grin-tongue:before{content:""}.fa-face-grin-tongue-squint:before{content:""}.fa-face-grin-tongue-wink:before{content:""}.fa-face-grin-wide:before{content:""}.fa-face-grin-wink:before{content:""}.fa-face-hand-over-mouth:before{content:""}.fa-face-hand-peeking:before{content:""}.fa-face-hand-yawn:before{content:""}.fa-face-head-bandage:before{content:""}.fa-face-holding-back-tears:before{content:""}.fa-face-hushed:before{content:""}.fa-face-icicles:before{content:""}.fa-face-kiss:before{content:""}.fa-face-kiss-beam:before{content:""}.fa-face-kiss-closed-eyes:before{content:""}.fa-face-kiss-wink-heart:before{content:""}.fa-face-laugh:before{content:""}.fa-face-laugh-beam:before{content:""}.fa-face-laugh-squint:before{content:""}.fa-face-laugh-wink:before{content:""}.fa-face-lying:before{content:""}.fa-face-mask:before{content:""}.fa-face-meh:before{content:""}.fa-face-meh-blank:before{content:""}.fa-face-melting:before{content:""}.fa-face-monocle:before{content:""}.fa-face-nauseated:before{content:""}.fa-face-nose-steam:before{content:""}.fa-face-party:before{content:""}.fa-face-pensive:before{content:""}.fa-face-persevering:before{content:""}.fa-face-pleading:before{content:""}.fa-face-pouting:before{content:""}.fa-face-raised-eyebrow:before{content:""}.fa-face-relieved:before{content:""}.fa-face-rolling-eyes:before{content:""}.fa-face-sad-cry:before{content:""}.fa-face-sad-sweat:before{content:""}.fa-face-sad-tear:before{content:""}.fa-face-saluting:before{content:""}.fa-face-scream:before{content:""}.fa-face-shush:before{content:""}.fa-face-sleeping:before{content:""}.fa-face-sleepy:before{content:""}.fa-face-smile:before{content:""}.fa-face-smile-beam:before{content:""}.fa-face-smile-halo:before{content:""}.fa-face-smile-hearts:before{content:""}.fa-face-smile-horns:before{content:""}.fa-face-smile-plus:before{content:""}.fa-face-smile-relaxed:before{content:""}.fa-face-smile-tear:before{content:""}.fa-face-smile-tongue:before{content:""}.fa-face-smile-upside-down:before{content:""}.fa-face-smile-wink:before{content:""}.fa-face-smiling-hands:before{content:""}.fa-face-smirking:before{content:""}.fa-face-spiral-eyes:before{content:""}.fa-face-sunglasses:before{content:""}.fa-face-surprise:before{content:""}.fa-face-swear:before{content:""}.fa-face-thermometer:before{content:""}.fa-face-thinking:before{content:""}.fa-face-tired:before{content:""}.fa-face-tissue:before{content:""}.fa-face-tongue-money:before{content:""}.fa-face-tongue-sweat:before{content:""}.fa-face-unamused:before{content:""}.fa-face-viewfinder:before{content:""}.fa-face-vomit:before{content:""}.fa-face-weary:before{content:""}.fa-face-woozy:before{content:""}.fa-face-worried:before{content:""}.fa-face-zany:before{content:""}.fa-face-zipper:before{content:""}.fa-falafel:before{content:""}.fa-family:before{content:""}.fa-family-dress:before{content:""}.fa-family-pants:before{content:""}.fa-fan:before{content:""}.fa-fan-table:before{content:""}.fa-farm:before{content:""}.fa-fast-backward:before{content:""}.fa-fast-forward:before{content:""}.fa-faucet:before{content:""}.fa-faucet-drip:before{content:""}.fa-fax:before{content:""}.fa-feather:before{content:""}.fa-feather-alt:before,.fa-feather-pointed:before{content:""}.fa-feed:before{content:""}.fa-female:before{content:""}.fa-fence:before{content:""}.fa-ferris-wheel:before{content:""}.fa-ferry:before{content:""}.fa-field-hockey:before,.fa-field-hockey-stick-ball:before{content:""}.fa-fighter-jet:before{content:""}.fa-file:before{content:""}.fa-file-alt:before{content:""}.fa-file-archive:before{content:""}.fa-file-arrow-down:before{content:""}.fa-file-arrow-up:before{content:""}.fa-file-audio:before{content:""}.fa-file-award:before{content:""}.fa-file-binary:before{content:""}.fa-file-cad:before{content:""}.fa-file-caret-down:before{content:""}.fa-file-caret-up:before{content:""}.fa-file-certificate:before{content:""}.fa-file-chart-column:before,.fa-file-chart-line:before{content:""}.fa-file-chart-pie:before{content:""}.fa-file-check:before{content:""}.fa-file-circle-check:before{content:""}.fa-file-circle-exclamation:before{content:""}.fa-file-circle-info:before{content:""}.fa-file-circle-minus:before{content:""}.fa-file-circle-plus:before{content:""}.fa-file-circle-question:before{content:""}.fa-file-circle-xmark:before{content:""}.fa-file-clipboard:before{content:""}.fa-file-code:before{content:""}.fa-file-contract:before{content:""}.fa-file-csv:before{content:""}.fa-file-dashed-line:before{content:""}.fa-file-doc:before{content:""}.fa-file-download:before{content:""}.fa-file-edit:before{content:""}.fa-file-eps:before{content:""}.fa-file-excel:before{content:""}.fa-file-exclamation:before{content:""}.fa-file-export:before{content:""}.fa-file-gif:before{content:""}.fa-file-heart:before{content:""}.fa-file-image:before{content:""}.fa-file-import:before{content:""}.fa-file-invoice:before{content:""}.fa-file-invoice-dollar:before{content:""}.fa-file-jpg:before{content:""}.fa-file-lines:before{content:""}.fa-file-lock:before{content:""}.fa-file-magnifying-glass:before{content:""}.fa-file-medical:before{content:""}.fa-file-medical-alt:before{content:""}.fa-file-minus:before{content:""}.fa-file-mov:before{content:""}.fa-file-mp3:before{content:""}.fa-file-mp4:before{content:""}.fa-file-music:before{content:""}.fa-file-pdf:before{content:""}.fa-file-pen:before{content:""}.fa-file-plus:before{content:""}.fa-file-plus-minus:before{content:""}.fa-file-png:before{content:""}.fa-file-powerpoint:before{content:""}.fa-file-ppt:before{content:""}.fa-file-prescription:before{content:""}.fa-file-search:before{content:""}.fa-file-shield:before{content:""}.fa-file-signature:before{content:""}.fa-file-slash:before{content:""}.fa-file-spreadsheet:before{content:""}.fa-file-svg:before{content:""}.fa-file-text:before{content:""}.fa-file-times:before{content:""}.fa-file-upload:before{content:""}.fa-file-user:before{content:""}.fa-file-vector:before{content:""}.fa-file-video:before{content:""}.fa-file-waveform:before{content:""}.fa-file-word:before{content:""}.fa-file-xls:before{content:""}.fa-file-xmark:before{content:""}.fa-file-xml:before{content:""}.fa-file-zip:before{content:""}.fa-file-zipper:before{content:""}.fa-files:before{content:""}.fa-files-medical:before{content:""}.fa-fill:before{content:""}.fa-fill-drip:before{content:""}.fa-film:before{content:""}.fa-film-alt:before{content:""}.fa-film-canister:before,.fa-film-cannister:before{content:""}.fa-film-simple:before{content:""}.fa-film-slash:before{content:""}.fa-films:before{content:""}.fa-filter:before{content:""}.fa-filter-circle-dollar:before{content:""}.fa-filter-circle-xmark:before{content:""}.fa-filter-list:before{content:""}.fa-filter-slash:before{content:""}.fa-filters:before{content:""}.fa-fingerprint:before{content:""}.fa-fire:before{content:""}.fa-fire-alt:before{content:""}.fa-fire-burner:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-fire-flame:before{content:""}.fa-fire-flame-curved:before{content:""}.fa-fire-flame-simple:before{content:""}.fa-fire-hydrant:before{content:""}.fa-fire-smoke:before{content:""}.fa-fireplace:before{content:""}.fa-firewall:before{content:""}.fa-first-aid:before{content:""}.fa-fish:before{content:""}.fa-fish-bones:before{content:""}.fa-fish-cooked:before{content:""}.fa-fish-fins:before{content:""}.fa-fishing-rod:before{content:""}.fa-fist-raised:before{content:""}.fa-flag:before{content:""}.fa-flag-alt:before{content:""}.fa-flag-checkered:before{content:""}.fa-flag-pennant:before{content:""}.fa-flag-swallowtail:before{content:""}.fa-flag-usa:before{content:""}.fa-flame:before{content:""}.fa-flashlight:before{content:""}.fa-flask:before{content:""}.fa-flask-gear:before{content:""}.fa-flask-poison:before{content:""}.fa-flask-potion:before{content:""}.fa-flask-round-poison:before{content:""}.fa-flask-round-potion:before{content:""}.fa-flask-vial:before{content:""}.fa-flatbread:before{content:""}.fa-flatbread-stuffed:before{content:""}.fa-floppy-disk:before{content:""}.fa-floppy-disk-circle-arrow-right:before{content:""}.fa-floppy-disk-circle-xmark:before{content:""}.fa-floppy-disk-pen:before{content:""}.fa-floppy-disk-times:before{content:""}.fa-floppy-disks:before{content:""}.fa-florin-sign:before{content:""}.fa-flower:before{content:""}.fa-flower-daffodil:before{content:""}.fa-flower-tulip:before{content:""}.fa-flushed:before{content:""}.fa-flute:before{content:""}.fa-flux-capacitor:before{content:""}.fa-flying-disc:before{content:""}.fa-fog:before{content:""}.fa-folder:before{content:""}.fa-folder-arrow-down:before{content:""}.fa-folder-arrow-up:before{content:""}.fa-folder-blank:before{content:""}.fa-folder-bookmark:before{content:""}.fa-folder-check:before{content:""}.fa-folder-closed:before{content:""}.fa-folder-cog:before{content:""}.fa-folder-download:before{content:""}.fa-folder-gear:before{content:""}.fa-folder-grid:before{content:""}.fa-folder-heart:before{content:""}.fa-folder-image:before{content:""}.fa-folder-magnifying-glass:before{content:""}.fa-folder-medical:before{content:""}.fa-folder-minus:before{content:""}.fa-folder-music:before{content:""}.fa-folder-open:before{content:""}.fa-folder-plus:before{content:""}.fa-folder-search:before{content:""}.fa-folder-times:before{content:""}.fa-folder-tree:before{content:""}.fa-folder-upload:before{content:""}.fa-folder-user:before{content:""}.fa-folder-xmark:before{content:""}.fa-folders:before{content:""}.fa-fondue-pot:before{content:""}.fa-font:before{content:""}.fa-font-awesome:before,.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before{content:""}.fa-font-case:before{content:""}.fa-football:before,.fa-football-ball:before{content:""}.fa-football-helmet:before{content:""}.fa-fork:before{content:""}.fa-fork-knife:before{content:""}.fa-forklift:before{content:""}.fa-fort:before{content:""}.fa-forward:before{content:""}.fa-forward-fast:before{content:""}.fa-forward-step:before{content:""}.fa-fragile:before{content:""}.fa-frame:before{content:""}.fa-franc-sign:before{content:""}.fa-french-fries:before{content:""}.fa-frog:before{content:""}.fa-frosty-head:before{content:""}.fa-frown:before{content:""}.fa-frown-open:before{content:""}.fa-function:before{content:""}.fa-funnel-dollar:before{content:""}.fa-futbol:before,.fa-futbol-ball:before{content:""}.fa-g:before{content:"G"}.fa-galaxy:before{content:""}.fa-gallery-thumbnails:before{content:""}.fa-game-board:before{content:""}.fa-game-board-alt:before,.fa-game-board-simple:before{content:""}.fa-game-console-handheld:before{content:""}.fa-game-console-handheld-crank:before{content:""}.fa-gamepad:before{content:""}.fa-gamepad-alt:before,.fa-gamepad-modern:before{content:""}.fa-garage:before{content:""}.fa-garage-car:before{content:""}.fa-garage-open:before{content:""}.fa-garlic:before{content:""}.fa-gas-pump:before{content:""}.fa-gas-pump-slash:before{content:""}.fa-gauge:before{content:""}.fa-gauge-circle-bolt:before{content:""}.fa-gauge-circle-minus:before{content:""}.fa-gauge-circle-plus:before{content:""}.fa-gauge-high:before{content:""}.fa-gauge-low:before{content:""}.fa-gauge-max:before{content:""}.fa-gauge-med:before{content:""}.fa-gauge-min:before{content:""}.fa-gauge-simple:before{content:""}.fa-gauge-simple-high:before{content:""}.fa-gauge-simple-low:before{content:""}.fa-gauge-simple-max:before{content:""}.fa-gauge-simple-med:before{content:""}.fa-gauge-simple-min:before{content:""}.fa-gave-dandy:before{content:""}.fa-gavel:before{content:""}.fa-gbp:before{content:""}.fa-gear:before{content:""}.fa-gear-code:before{content:""}.fa-gear-complex:before{content:""}.fa-gear-complex-code:before{content:""}.fa-gears:before{content:""}.fa-gem:before{content:""}.fa-genderless:before{content:""}.fa-ghost:before{content:""}.fa-gif:before{content:""}.fa-gift:before{content:""}.fa-gift-card:before{content:""}.fa-gifts:before{content:""}.fa-gingerbread-man:before{content:""}.fa-glass:before{content:""}.fa-glass-champagne:before{content:""}.fa-glass-cheers:before{content:""}.fa-glass-citrus:before{content:""}.fa-glass-empty:before{content:""}.fa-glass-half:before,.fa-glass-half-empty:before,.fa-glass-half-full:before{content:""}.fa-glass-martini:before{content:""}.fa-glass-martini-alt:before{content:""}.fa-glass-water:before{content:""}.fa-glass-water-droplet:before{content:""}.fa-glass-whiskey:before{content:""}.fa-glass-whiskey-rocks:before{content:""}.fa-glasses:before{content:""}.fa-glasses-alt:before,.fa-glasses-round:before{content:""}.fa-globe:before{content:""}.fa-globe-africa:before{content:""}.fa-globe-americas:before{content:""}.fa-globe-asia:before{content:""}.fa-globe-europe:before{content:""}.fa-globe-oceania:before{content:""}.fa-globe-pointer:before{content:""}.fa-globe-snow:before{content:""}.fa-globe-stand:before{content:""}.fa-globe-wifi:before{content:""}.fa-glove-boxing:before{content:""}.fa-goal-net:before{content:""}.fa-golf-ball:before,.fa-golf-ball-tee:before{content:""}.fa-golf-club:before{content:""}.fa-golf-flag-hole:before{content:""}.fa-gopuram:before{content:""}.fa-graduation-cap:before{content:""}.fa-gramophone:before{content:""}.fa-grapes:before{content:""}.fa-grate:before{content:""}.fa-grate-droplet:before{content:""}.fa-greater-than:before{content:">"}.fa-greater-than-equal:before{content:""}.fa-grid:before{content:""}.fa-grid-2:before{content:""}.fa-grid-2-plus:before{content:""}.fa-grid-3:before{content:""}.fa-grid-4:before{content:""}.fa-grid-5:before{content:""}.fa-grid-dividers:before{content:""}.fa-grid-horizontal:before{content:""}.fa-grid-round:before{content:""}.fa-grid-round-2:before{content:""}.fa-grid-round-2-plus:before{content:""}.fa-grid-round-4:before{content:""}.fa-grid-round-5:before{content:""}.fa-grill:before{content:""}.fa-grill-fire:before{content:""}.fa-grill-hot:before{content:""}.fa-grimace:before{content:""}.fa-grin:before{content:""}.fa-grin-alt:before{content:""}.fa-grin-beam:before{content:""}.fa-grin-beam-sweat:before{content:""}.fa-grin-hearts:before{content:""}.fa-grin-squint:before{content:""}.fa-grin-squint-tears:before{content:""}.fa-grin-stars:before{content:""}.fa-grin-tears:before{content:""}.fa-grin-tongue:before{content:""}.fa-grin-tongue-squint:before{content:""}.fa-grin-tongue-wink:before{content:""}.fa-grin-wink:before{content:""}.fa-grip:before{content:""}.fa-grip-dots:before{content:""}.fa-grip-dots-vertical:before{content:""}.fa-grip-horizontal:before{content:""}.fa-grip-lines:before{content:""}.fa-grip-lines-vertical:before{content:""}.fa-grip-vertical:before{content:""}.fa-group-arrows-rotate:before{content:""}.fa-guarani-sign:before{content:""}.fa-guitar:before{content:""}.fa-guitar-electric:before{content:""}.fa-guitars:before{content:""}.fa-gun:before{content:""}.fa-gun-slash:before{content:""}.fa-gun-squirt:before{content:""}.fa-h:before{content:"H"}.fa-h-square:before{content:""}.fa-h1:before{content:""}.fa-h2:before{content:""}.fa-h3:before{content:""}.fa-h4:before{content:""}.fa-h5:before{content:""}.fa-h6:before{content:""}.fa-hamburger:before{content:""}.fa-hammer:before{content:""}.fa-hammer-brush:before{content:""}.fa-hammer-crash:before{content:""}.fa-hammer-war:before{content:""}.fa-hamsa:before{content:""}.fa-hand:before{content:""}.fa-hand-back-fist:before{content:""}.fa-hand-back-point-down:before{content:""}.fa-hand-back-point-left:before{content:""}.fa-hand-back-point-ribbon:before{content:""}.fa-hand-back-point-right:before{content:""}.fa-hand-back-point-up:before{content:""}.fa-hand-dots:before{content:""}.fa-hand-fingers-crossed:before{content:""}.fa-hand-fist:before{content:""}.fa-hand-heart:before{content:""}.fa-hand-holding:before{content:""}.fa-hand-holding-box:before{content:""}.fa-hand-holding-circle-dollar:before{content:""}.fa-hand-holding-dollar:before{content:""}.fa-hand-holding-droplet:before{content:""}.fa-hand-holding-hand:before{content:""}.fa-hand-holding-heart:before{content:""}.fa-hand-holding-magic:before{content:""}.fa-hand-holding-medical:before{content:""}.fa-hand-holding-seedling:before{content:""}.fa-hand-holding-skull:before{content:""}.fa-hand-holding-usd:before{content:""}.fa-hand-holding-water:before{content:""}.fa-hand-horns:before{content:""}.fa-hand-lizard:before{content:""}.fa-hand-love:before{content:""}.fa-hand-middle-finger:before{content:""}.fa-hand-paper:before{content:""}.fa-hand-peace:before{content:""}.fa-hand-point-down:before{content:""}.fa-hand-point-left:before{content:""}.fa-hand-point-ribbon:before{content:""}.fa-hand-point-right:before{content:""}.fa-hand-point-up:before{content:""}.fa-hand-pointer:before{content:""}.fa-hand-receiving:before{content:""}.fa-hand-rock:before{content:""}.fa-hand-scissors:before{content:""}.fa-hand-sparkles:before{content:""}.fa-hand-spock:before{content:""}.fa-hand-wave:before{content:""}.fa-handcuffs:before{content:""}.fa-hands:before{content:""}.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:""}.fa-hands-bound:before{content:""}.fa-hands-bubbles:before{content:""}.fa-hands-clapping:before{content:""}.fa-hands-heart:before{content:""}.fa-hands-helping:before{content:""}.fa-hands-holding:before{content:""}.fa-hands-holding-child:before{content:""}.fa-hands-holding-circle:before{content:""}.fa-hands-holding-diamond:before{content:""}.fa-hands-holding-dollar:before{content:""}.fa-hands-holding-heart:before{content:""}.fa-hands-praying:before{content:""}.fa-hands-usd:before{content:""}.fa-hands-wash:before{content:""}.fa-handshake:before{content:""}.fa-handshake-alt:before{content:""}.fa-handshake-alt-slash:before{content:""}.fa-handshake-angle:before{content:""}.fa-handshake-simple:before{content:""}.fa-handshake-simple-slash:before{content:""}.fa-handshake-slash:before{content:""}.fa-hanukiah:before{content:""}.fa-hard-drive:before{content:""}.fa-hard-hat:before{content:""}.fa-hard-of-hearing:before{content:""}.fa-hashtag:before{content:"#"}.fa-hashtag-lock:before{content:""}.fa-hat-beach:before{content:""}.fa-hat-chef:before{content:""}.fa-hat-cowboy:before{content:""}.fa-hat-cowboy-side:before{content:""}.fa-hat-hard:before{content:""}.fa-hat-santa:before{content:""}.fa-hat-winter:before{content:""}.fa-hat-witch:before{content:""}.fa-hat-wizard:before{content:""}.fa-haykal:before{content:""}.fa-hdd:before{content:""}.fa-head-side:before{content:""}.fa-head-side-brain:before{content:""}.fa-head-side-cough:before{content:""}.fa-head-side-cough-slash:before{content:""}.fa-head-side-gear:before{content:""}.fa-head-side-goggles:before{content:""}.fa-head-side-headphones:before{content:""}.fa-head-side-heart:before{content:""}.fa-head-side-mask:before{content:""}.fa-head-side-medical:before{content:""}.fa-head-side-virus:before{content:""}.fa-head-vr:before{content:""}.fa-header:before,.fa-heading:before{content:""}.fa-headphones:before{content:""}.fa-headphones-alt:before,.fa-headphones-simple:before{content:""}.fa-headset:before{content:""}.fa-heart:before{content:""}.fa-heart-broken:before{content:""}.fa-heart-circle:before{content:""}.fa-heart-circle-bolt:before{content:""}.fa-heart-circle-check:before{content:""}.fa-heart-circle-exclamation:before{content:""}.fa-heart-circle-minus:before{content:""}.fa-heart-circle-plus:before{content:""}.fa-heart-circle-xmark:before{content:""}.fa-heart-crack:before{content:""}.fa-heart-half:before{content:""}.fa-heart-half-alt:before,.fa-heart-half-stroke:before{content:""}.fa-heart-music-camera-bolt:before{content:""}.fa-heart-pulse:before{content:""}.fa-heart-rate:before{content:""}.fa-heart-square:before{content:""}.fa-heartbeat:before{content:""}.fa-heat:before{content:""}.fa-helicopter:before{content:""}.fa-helicopter-symbol:before{content:""}.fa-helmet-battle:before{content:""}.fa-helmet-safety:before{content:""}.fa-helmet-un:before{content:""}.fa-hexagon:before{content:""}.fa-hexagon-check:before{content:""}.fa-hexagon-divide:before{content:""}.fa-hexagon-exclamation:before{content:""}.fa-hexagon-image:before{content:""}.fa-hexagon-minus:before{content:""}.fa-hexagon-plus:before{content:""}.fa-hexagon-vertical-nft:before{content:""}.fa-hexagon-vertical-nft-slanted:before{content:""}.fa-hexagon-xmark:before{content:""}.fa-high-definition:before{content:""}.fa-highlighter:before{content:""}.fa-highlighter-line:before{content:""}.fa-hiking:before{content:""}.fa-hill-avalanche:before{content:""}.fa-hill-rockslide:before{content:""}.fa-hippo:before{content:""}.fa-history:before{content:""}.fa-hockey-mask:before{content:""}.fa-hockey-puck:before{content:""}.fa-hockey-stick-puck:before{content:""}.fa-hockey-sticks:before{content:""}.fa-holly-berry:before{content:""}.fa-home:before,.fa-home-alt:before{content:""}.fa-home-blank:before{content:""}.fa-home-heart:before{content:""}.fa-home-lg:before{content:""}.fa-home-lg-alt:before{content:""}.fa-home-user:before{content:""}.fa-honey-pot:before{content:""}.fa-hood-cloak:before{content:""}.fa-horizontal-rule:before{content:""}.fa-horse:before{content:""}.fa-horse-head:before{content:""}.fa-horse-saddle:before{content:""}.fa-hose:before{content:""}.fa-hose-reel:before{content:""}.fa-hospital:before,.fa-hospital-alt:before{content:""}.fa-hospital-symbol:before{content:""}.fa-hospital-user:before{content:""}.fa-hospital-wide:before{content:""}.fa-hospitals:before{content:""}.fa-hot-tub:before,.fa-hot-tub-person:before{content:""}.fa-hotdog:before{content:""}.fa-hotel:before{content:""}.fa-hourglass:before{content:""}.fa-hourglass-1:before{content:""}.fa-hourglass-2:before{content:""}.fa-hourglass-3:before{content:""}.fa-hourglass-clock:before{content:""}.fa-hourglass-empty:before{content:""}.fa-hourglass-end:before{content:""}.fa-hourglass-half:before{content:""}.fa-hourglass-start:before{content:""}.fa-house:before{content:""}.fa-house-blank:before{content:""}.fa-house-building:before{content:""}.fa-house-chimney:before{content:""}.fa-house-chimney-blank:before{content:""}.fa-house-chimney-crack:before{content:""}.fa-house-chimney-heart:before{content:""}.fa-house-chimney-medical:before{content:""}.fa-house-chimney-user:before{content:""}.fa-house-chimney-window:before{content:""}.fa-house-circle-check:before{content:""}.fa-house-circle-exclamation:before{content:""}.fa-house-circle-xmark:before{content:""}.fa-house-crack:before{content:""}.fa-house-damage:before{content:""}.fa-house-day:before{content:""}.fa-house-fire:before{content:""}.fa-house-flag:before{content:""}.fa-house-flood:before{content:""}.fa-house-flood-water:before{content:""}.fa-house-flood-water-circle-arrow-right:before{content:""}.fa-house-heart:before{content:""}.fa-house-laptop:before{content:""}.fa-house-leave:before{content:""}.fa-house-lock:before{content:""}.fa-house-medical:before{content:""}.fa-house-medical-circle-check:before{content:""}.fa-house-medical-circle-exclamation:before{content:""}.fa-house-medical-circle-xmark:before{content:""}.fa-house-medical-flag:before{content:""}.fa-house-night:before{content:""}.fa-house-person-arrive:before{content:""}.fa-house-person-depart:before,.fa-house-person-leave:before{content:""}.fa-house-person-return:before,.fa-house-return:before{content:""}.fa-house-signal:before{content:""}.fa-house-tree:before{content:""}.fa-house-tsunami:before{content:""}.fa-house-turret:before{content:""}.fa-house-user:before{content:""}.fa-house-water:before{content:""}.fa-house-window:before{content:""}.fa-hryvnia:before,.fa-hryvnia-sign:before{content:""}.fa-humidity:before{content:""}.fa-hundred-points:before{content:""}.fa-hurricane:before{content:""}.fa-hydra:before{content:""}.fa-hyphen:before{content:"-"}.fa-i:before{content:"I"}.fa-i-cursor:before{content:""}.fa-ice-cream:before{content:""}.fa-ice-skate:before{content:""}.fa-icicles:before{content:""}.fa-icons:before{content:""}.fa-icons-alt:before{content:""}.fa-id-badge:before{content:""}.fa-id-card:before{content:""}.fa-id-card-alt:before,.fa-id-card-clip:before{content:""}.fa-igloo:before{content:""}.fa-ils:before{content:""}.fa-image:before{content:""}.fa-image-landscape:before{content:""}.fa-image-polaroid:before{content:""}.fa-image-polaroid-user:before{content:""}.fa-image-portrait:before{content:""}.fa-image-slash:before{content:""}.fa-image-user:before{content:""}.fa-images:before{content:""}.fa-images-user:before{content:""}.fa-inbox:before{content:""}.fa-inbox-arrow-down:before{content:""}.fa-inbox-arrow-up:before{content:""}.fa-inbox-full:before{content:""}.fa-inbox-in:before{content:""}.fa-inbox-out:before{content:""}.fa-inboxes:before{content:""}.fa-indent:before{content:""}.fa-indian-rupee:before,.fa-indian-rupee-sign:before{content:""}.fa-industry:before{content:""}.fa-industry-alt:before,.fa-industry-windows:before{content:""}.fa-infinity:before{content:""}.fa-info:before{content:""}.fa-info-circle:before{content:""}.fa-info-square:before{content:""}.fa-inhaler:before{content:""}.fa-input-numeric:before{content:""}.fa-input-pipe:before{content:""}.fa-input-text:before{content:""}.fa-inr:before{content:""}.fa-institution:before{content:""}.fa-integral:before{content:""}.fa-interrobang:before{content:""}.fa-intersection:before{content:""}.fa-inventory:before{content:""}.fa-island-tree-palm:before,.fa-island-tropical:before{content:""}.fa-italic:before{content:""}.fa-j:before{content:"J"}.fa-jack-o-lantern:before{content:""}.fa-jar:before{content:""}.fa-jar-wheat:before{content:""}.fa-jedi:before{content:""}.fa-jet-fighter:before{content:""}.fa-jet-fighter-up:before{content:""}.fa-joint:before{content:""}.fa-journal-whills:before{content:""}.fa-joystick:before{content:""}.fa-jpy:before{content:""}.fa-jug:before{content:""}.fa-jug-bottle:before{content:""}.fa-jug-detergent:before{content:""}.fa-k:before{content:"K"}.fa-kaaba:before{content:""}.fa-kazoo:before{content:""}.fa-kerning:before{content:""}.fa-key:before{content:""}.fa-key-skeleton:before{content:""}.fa-key-skeleton-left-right:before{content:""}.fa-keyboard:before{content:""}.fa-keyboard-brightness:before{content:""}.fa-keyboard-brightness-low:before{content:""}.fa-keyboard-down:before{content:""}.fa-keyboard-left:before{content:""}.fa-keynote:before{content:""}.fa-khanda:before{content:""}.fa-kidneys:before{content:""}.fa-kip-sign:before{content:""}.fa-kiss:before{content:""}.fa-kiss-beam:before{content:""}.fa-kiss-wink-heart:before{content:""}.fa-kit-medical:before{content:""}.fa-kitchen-set:before{content:""}.fa-kite:before{content:""}.fa-kiwi-bird:before{content:""}.fa-kiwi-fruit:before{content:""}.fa-knife:before{content:""}.fa-knife-kitchen:before{content:""}.fa-krw:before{content:""}.fa-l:before{content:"L"}.fa-lacrosse-stick:before{content:""}.fa-lacrosse-stick-ball:before{content:""}.fa-ladder-water:before{content:""}.fa-lambda:before{content:""}.fa-lamp:before{content:""}.fa-lamp-desk:before{content:""}.fa-lamp-floor:before{content:""}.fa-lamp-street:before{content:""}.fa-land-mine-on:before{content:""}.fa-landmark:before{content:""}.fa-landmark-alt:before,.fa-landmark-dome:before{content:""}.fa-landmark-flag:before{content:""}.fa-landmark-magnifying-glass:before{content:""}.fa-landscape:before{content:""}.fa-language:before{content:""}.fa-laptop:before{content:""}.fa-laptop-arrow-down:before{content:""}.fa-laptop-binary:before{content:""}.fa-laptop-code:before{content:""}.fa-laptop-file:before{content:""}.fa-laptop-house:before{content:""}.fa-laptop-medical:before{content:""}.fa-laptop-mobile:before{content:""}.fa-laptop-slash:before{content:""}.fa-lari-sign:before{content:""}.fa-lasso:before{content:""}.fa-lasso-sparkles:before{content:""}.fa-laugh:before{content:""}.fa-laugh-beam:before{content:""}.fa-laugh-squint:before{content:""}.fa-laugh-wink:before{content:""}.fa-layer-group:before{content:""}.fa-layer-group-minus:before{content:""}.fa-layer-group-plus:before{content:""}.fa-layer-minus:before{content:""}.fa-layer-plus:before{content:""}.fa-leaf:before{content:""}.fa-leaf-heart:before{content:""}.fa-leaf-maple:before{content:""}.fa-leaf-oak:before{content:""}.fa-leafy-green:before{content:""}.fa-left:before{content:""}.fa-left-from-bracket:before{content:""}.fa-left-from-line:before{content:""}.fa-left-long:before{content:""}.fa-left-long-to-line:before{content:""}.fa-left-right:before{content:""}.fa-left-to-bracket:before{content:""}.fa-left-to-line:before{content:""}.fa-legal:before{content:""}.fa-lemon:before{content:""}.fa-less-than:before{content:"<"}.fa-less-than-equal:before{content:""}.fa-level-down:before{content:""}.fa-level-down-alt:before{content:""}.fa-level-up:before{content:""}.fa-level-up-alt:before{content:""}.fa-life-ring:before{content:""}.fa-light-ceiling:before{content:""}.fa-light-emergency:before{content:""}.fa-light-emergency-on:before{content:""}.fa-light-switch:before{content:""}.fa-light-switch-off:before{content:""}.fa-light-switch-on:before{content:""}.fa-lightbulb:before{content:""}.fa-lightbulb-cfl:before{content:""}.fa-lightbulb-cfl-on:before{content:""}.fa-lightbulb-dollar:before{content:""}.fa-lightbulb-exclamation:before{content:""}.fa-lightbulb-exclamation-on:before{content:""}.fa-lightbulb-gear:before{content:""}.fa-lightbulb-message:before{content:""}.fa-lightbulb-on:before{content:""}.fa-lightbulb-slash:before{content:""}.fa-lighthouse:before{content:""}.fa-lights-holiday:before{content:""}.fa-line-chart:before{content:""}.fa-line-columns:before{content:""}.fa-line-height:before{content:""}.fa-lines-leaning:before{content:""}.fa-link:before{content:""}.fa-link-horizontal:before{content:""}.fa-link-horizontal-slash:before{content:""}.fa-link-simple:before{content:""}.fa-link-simple-slash:before{content:""}.fa-link-slash:before{content:""}.fa-lips:before{content:""}.fa-lira-sign:before{content:""}.fa-list:before{content:""}.fa-list-1-2:before{content:""}.fa-list-alt:before{content:""}.fa-list-check:before{content:""}.fa-list-dots:before{content:""}.fa-list-dropdown:before{content:""}.fa-list-music:before{content:""}.fa-list-numeric:before,.fa-list-ol:before{content:""}.fa-list-radio:before{content:""}.fa-list-squares:before{content:""}.fa-list-timeline:before{content:""}.fa-list-tree:before{content:""}.fa-list-ul:before{content:""}.fa-litecoin-sign:before{content:""}.fa-loader:before{content:""}.fa-lobster:before{content:""}.fa-location:before{content:""}.fa-location-arrow:before{content:""}.fa-location-arrow-up:before{content:""}.fa-location-check:before{content:""}.fa-location-circle:before{content:""}.fa-location-crosshairs:before{content:""}.fa-location-crosshairs-slash:before{content:""}.fa-location-dot:before{content:""}.fa-location-dot-slash:before{content:""}.fa-location-exclamation:before{content:""}.fa-location-minus:before{content:""}.fa-location-pen:before{content:""}.fa-location-pin:before{content:""}.fa-location-pin-lock:before{content:""}.fa-location-pin-slash:before{content:""}.fa-location-plus:before{content:""}.fa-location-question:before{content:""}.fa-location-slash:before{content:""}.fa-location-smile:before{content:""}.fa-location-xmark:before{content:""}.fa-lock:before{content:""}.fa-lock-a:before{content:""}.fa-lock-alt:before{content:""}.fa-lock-hashtag:before{content:""}.fa-lock-keyhole:before{content:""}.fa-lock-keyhole-open:before{content:""}.fa-lock-open:before{content:""}.fa-lock-open-alt:before{content:""}.fa-locust:before{content:""}.fa-lollipop:before,.fa-lollypop:before{content:""}.fa-long-arrow-alt-down:before{content:""}.fa-long-arrow-alt-left:before{content:""}.fa-long-arrow-alt-right:before{content:""}.fa-long-arrow-alt-up:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-long-arrow-up:before{content:""}.fa-loveseat:before{content:""}.fa-low-vision:before{content:""}.fa-luchador:before,.fa-luchador-mask:before{content:""}.fa-luggage-cart:before{content:""}.fa-lungs:before{content:""}.fa-lungs-virus:before{content:""}.fa-m:before{content:"M"}.fa-mace:before{content:""}.fa-magic:before{content:""}.fa-magic-wand-sparkles:before{content:""}.fa-magnet:before{content:""}.fa-magnifying-glass:before{content:""}.fa-magnifying-glass-arrow-right:before{content:""}.fa-magnifying-glass-arrows-rotate:before{content:""}.fa-magnifying-glass-chart:before{content:""}.fa-magnifying-glass-dollar:before{content:""}.fa-magnifying-glass-location:before{content:""}.fa-magnifying-glass-minus:before{content:""}.fa-magnifying-glass-music:before{content:""}.fa-magnifying-glass-play:before{content:""}.fa-magnifying-glass-plus:before{content:""}.fa-magnifying-glass-waveform:before{content:""}.fa-mail-bulk:before{content:""}.fa-mail-forward:before{content:""}.fa-mail-reply:before{content:""}.fa-mail-reply-all:before{content:""}.fa-mailbox:before{content:""}.fa-mailbox-flag-up:before{content:""}.fa-maki-roll:before,.fa-makizushi:before{content:""}.fa-male:before{content:""}.fa-manat-sign:before{content:""}.fa-mandolin:before{content:""}.fa-mango:before{content:""}.fa-manhole:before{content:""}.fa-map:before{content:""}.fa-map-location:before{content:""}.fa-map-location-dot:before{content:""}.fa-map-marked:before{content:""}.fa-map-marked-alt:before{content:""}.fa-map-marker:before{content:""}.fa-map-marker-alt:before{content:""}.fa-map-marker-alt-slash:before{content:""}.fa-map-marker-check:before{content:""}.fa-map-marker-edit:before{content:""}.fa-map-marker-exclamation:before{content:""}.fa-map-marker-minus:before{content:""}.fa-map-marker-plus:before{content:""}.fa-map-marker-question:before{content:""}.fa-map-marker-slash:before{content:""}.fa-map-marker-smile:before{content:""}.fa-map-marker-times:before,.fa-map-marker-xmark:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-marker:before{content:""}.fa-mars:before{content:""}.fa-mars-and-venus:before{content:""}.fa-mars-and-venus-burst:before{content:""}.fa-mars-double:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:""}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:""}.fa-martini-glass:before{content:""}.fa-martini-glass-citrus:before{content:""}.fa-martini-glass-empty:before{content:""}.fa-mask:before{content:""}.fa-mask-face:before{content:""}.fa-mask-luchador:before{content:""}.fa-mask-snorkel:before{content:""}.fa-mask-ventilator:before{content:""}.fa-masks-theater:before{content:""}.fa-mattress-pillow:before{content:""}.fa-maximize:before{content:""}.fa-meat:before{content:""}.fa-medal:before{content:""}.fa-medkit:before{content:""}.fa-megaphone:before{content:""}.fa-meh:before{content:""}.fa-meh-blank:before{content:""}.fa-meh-rolling-eyes:before{content:""}.fa-melon:before{content:""}.fa-melon-slice:before{content:""}.fa-memo:before{content:""}.fa-memo-circle-check:before{content:""}.fa-memo-circle-info:before{content:""}.fa-memo-pad:before{content:""}.fa-memory:before{content:""}.fa-menorah:before{content:""}.fa-mercury:before{content:""}.fa-merge:before{content:""}.fa-message:before{content:""}.fa-message-arrow-down:before{content:""}.fa-message-arrow-up:before{content:""}.fa-message-arrow-up-right:before{content:""}.fa-message-bot:before{content:""}.fa-message-captions:before{content:""}.fa-message-check:before{content:""}.fa-message-code:before{content:""}.fa-message-dollar:before{content:""}.fa-message-dots:before{content:""}.fa-message-edit:before{content:""}.fa-message-exclamation:before{content:""}.fa-message-heart:before{content:""}.fa-message-image:before{content:""}.fa-message-lines:before{content:""}.fa-message-medical:before{content:""}.fa-message-middle:before{content:""}.fa-message-middle-top:before{content:""}.fa-message-minus:before{content:""}.fa-message-music:before{content:""}.fa-message-pen:before{content:""}.fa-message-plus:before{content:""}.fa-message-question:before{content:""}.fa-message-quote:before{content:""}.fa-message-slash:before{content:""}.fa-message-smile:before{content:""}.fa-message-sms:before{content:""}.fa-message-text:before{content:""}.fa-message-times:before,.fa-message-xmark:before{content:""}.fa-messages:before{content:""}.fa-messages-dollar:before{content:""}.fa-messages-question:before{content:""}.fa-messaging:before{content:""}.fa-meteor:before{content:""}.fa-meter:before{content:""}.fa-meter-bolt:before{content:""}.fa-meter-droplet:before{content:""}.fa-meter-fire:before{content:""}.fa-microchip:before{content:""}.fa-microchip-ai:before{content:""}.fa-microphone:before{content:""}.fa-microphone-alt:before{content:""}.fa-microphone-alt-slash:before{content:""}.fa-microphone-circle:before{content:""}.fa-microphone-circle-alt:before{content:""}.fa-microphone-lines:before{content:""}.fa-microphone-lines-slash:before{content:""}.fa-microphone-slash:before{content:""}.fa-microphone-stand:before{content:""}.fa-microscope:before{content:""}.fa-microwave:before{content:""}.fa-mill-sign:before{content:""}.fa-mind-share:before{content:""}.fa-minimize:before{content:""}.fa-minus:before{content:""}.fa-minus-circle:before{content:""}.fa-minus-hexagon:before{content:""}.fa-minus-large:before{content:""}.fa-minus-octagon:before{content:""}.fa-minus-square:before{content:""}.fa-mistletoe:before{content:""}.fa-mitten:before{content:""}.fa-mobile:before{content:""}.fa-mobile-alt:before{content:""}.fa-mobile-android:before{content:""}.fa-mobile-android-alt:before{content:""}.fa-mobile-button:before{content:""}.fa-mobile-iphone:before,.fa-mobile-notch:before{content:""}.fa-mobile-phone:before{content:""}.fa-mobile-retro:before{content:""}.fa-mobile-screen:before{content:""}.fa-mobile-screen-button:before{content:""}.fa-mobile-signal:before{content:""}.fa-mobile-signal-out:before{content:""}.fa-money-bill:before{content:""}.fa-money-bill-1:before{content:""}.fa-money-bill-1-wave:before{content:""}.fa-money-bill-alt:before{content:""}.fa-money-bill-simple:before{content:""}.fa-money-bill-simple-wave:before{content:""}.fa-money-bill-transfer:before{content:""}.fa-money-bill-trend-up:before{content:""}.fa-money-bill-wave:before{content:""}.fa-money-bill-wave-alt:before{content:""}.fa-money-bill-wheat:before{content:""}.fa-money-bills:before{content:""}.fa-money-bills-alt:before,.fa-money-bills-simple:before{content:""}.fa-money-check:before{content:""}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:""}.fa-money-check-dollar-pen:before{content:""}.fa-money-check-edit:before{content:""}.fa-money-check-edit-alt:before{content:""}.fa-money-check-pen:before{content:""}.fa-money-from-bracket:before{content:""}.fa-money-simple-from-bracket:before{content:""}.fa-monitor-heart-rate:before,.fa-monitor-waveform:before{content:""}.fa-monkey:before{content:""}.fa-monument:before{content:""}.fa-moon:before{content:""}.fa-moon-cloud:before{content:""}.fa-moon-over-sun:before{content:""}.fa-moon-stars:before{content:""}.fa-moped:before{content:""}.fa-mortar-board:before{content:""}.fa-mortar-pestle:before{content:""}.fa-mosque:before{content:""}.fa-mosquito:before{content:""}.fa-mosquito-net:before{content:""}.fa-motorcycle:before{content:""}.fa-mound:before{content:""}.fa-mountain:before{content:""}.fa-mountain-city:before{content:""}.fa-mountain-sun:before{content:""}.fa-mountains:before{content:""}.fa-mouse:before{content:""}.fa-mouse-alt:before{content:""}.fa-mouse-field:before{content:""}.fa-mouse-pointer:before{content:""}.fa-mp3-player:before{content:""}.fa-mug:before{content:""}.fa-mug-hot:before{content:""}.fa-mug-marshmallows:before{content:""}.fa-mug-saucer:before{content:""}.fa-mug-tea:before{content:""}.fa-mug-tea-saucer:before{content:""}.fa-multiply:before{content:""}.fa-museum:before{content:""}.fa-mushroom:before{content:""}.fa-music:before{content:""}.fa-music-alt:before{content:""}.fa-music-alt-slash:before{content:""}.fa-music-magnifying-glass:before{content:""}.fa-music-note:before{content:""}.fa-music-note-slash:before{content:""}.fa-music-slash:before{content:""}.fa-mustache:before{content:""}.fa-n:before{content:"N"}.fa-naira-sign:before{content:""}.fa-narwhal:before{content:""}.fa-navicon:before{content:""}.fa-nesting-dolls:before{content:""}.fa-network-wired:before{content:""}.fa-neuter:before{content:""}.fa-newspaper:before{content:""}.fa-nfc:before{content:""}.fa-nfc-lock:before{content:""}.fa-nfc-magnifying-glass:before{content:""}.fa-nfc-pen:before{content:""}.fa-nfc-signal:before{content:""}.fa-nfc-slash:before{content:""}.fa-nfc-trash:before{content:""}.fa-nigiri:before{content:""}.fa-nose:before{content:""}.fa-not-equal:before{content:""}.fa-notdef:before{content:""}.fa-note:before{content:""}.fa-note-medical:before{content:""}.fa-note-sticky:before{content:""}.fa-notebook:before{content:""}.fa-notes:before{content:""}.fa-notes-medical:before{content:""}.fa-o:before{content:"O"}.fa-object-exclude:before{content:""}.fa-object-group:before{content:""}.fa-object-intersect:before{content:""}.fa-object-subtract:before{content:""}.fa-object-ungroup:before{content:""}.fa-object-union:before{content:""}.fa-objects-align-bottom:before{content:""}.fa-objects-align-center-horizontal:before{content:""}.fa-objects-align-center-vertical:before{content:""}.fa-objects-align-left:before{content:""}.fa-objects-align-right:before{content:""}.fa-objects-align-top:before{content:""}.fa-objects-column:before{content:""}.fa-octagon:before{content:""}.fa-octagon-check:before{content:""}.fa-octagon-divide:before{content:""}.fa-octagon-exclamation:before{content:""}.fa-octagon-minus:before{content:""}.fa-octagon-plus:before{content:""}.fa-octagon-xmark:before{content:""}.fa-octopus:before{content:""}.fa-oil-can:before{content:""}.fa-oil-can-drip:before{content:""}.fa-oil-temp:before,.fa-oil-temperature:before{content:""}.fa-oil-well:before{content:""}.fa-olive:before{content:""}.fa-olive-branch:before{content:""}.fa-om:before{content:""}.fa-omega:before{content:""}.fa-onion:before{content:""}.fa-option:before{content:""}.fa-ornament:before{content:""}.fa-otter:before{content:""}.fa-outdent:before{content:""}.fa-outlet:before{content:""}.fa-oven:before{content:""}.fa-overline:before{content:""}.fa-p:before{content:"P"}.fa-page:before{content:""}.fa-page-break:before{content:""}.fa-page-caret-down:before{content:""}.fa-page-caret-up:before{content:""}.fa-pager:before{content:""}.fa-paint-brush:before{content:""}.fa-paint-brush-alt:before,.fa-paint-brush-fine:before{content:""}.fa-paint-roller:before{content:""}.fa-paintbrush:before{content:""}.fa-paintbrush-alt:before,.fa-paintbrush-fine:before{content:""}.fa-paintbrush-pencil:before{content:""}.fa-palette:before{content:""}.fa-palette-boxes:before{content:""}.fa-pallet:before{content:""}.fa-pallet-alt:before{content:""}.fa-pallet-box:before{content:""}.fa-pallet-boxes:before{content:""}.fa-pan-food:before{content:""}.fa-pan-frying:before{content:""}.fa-pancakes:before{content:""}.fa-panel-ews:before{content:""}.fa-panel-fire:before{content:""}.fa-panorama:before{content:""}.fa-paper-plane:before{content:""}.fa-paper-plane-alt:before,.fa-paper-plane-top:before{content:""}.fa-paperclip:before{content:""}.fa-paperclip-vertical:before{content:""}.fa-parachute-box:before{content:""}.fa-paragraph:before{content:""}.fa-paragraph-left:before,.fa-paragraph-rtl:before{content:""}.fa-parentheses:before{content:""}.fa-parenthesis:before{content:"("}.fa-parking:before{content:""}.fa-parking-circle:before{content:""}.fa-parking-circle-slash:before{content:""}.fa-parking-slash:before{content:""}.fa-party-back:before{content:""}.fa-party-bell:before{content:""}.fa-party-horn:before{content:""}.fa-passport:before{content:""}.fa-pastafarianism:before{content:""}.fa-paste:before{content:""}.fa-pause:before{content:""}.fa-pause-circle:before{content:""}.fa-paw:before{content:""}.fa-paw-alt:before{content:""}.fa-paw-claws:before{content:""}.fa-paw-simple:before{content:""}.fa-peace:before{content:""}.fa-peach:before{content:""}.fa-peanut:before{content:""}.fa-peanuts:before{content:""}.fa-peapod:before{content:""}.fa-pear:before{content:""}.fa-pedestal:before{content:""}.fa-pegasus:before{content:""}.fa-pen:before{content:""}.fa-pen-alt:before{content:""}.fa-pen-alt-slash:before{content:""}.fa-pen-circle:before{content:""}.fa-pen-clip:before{content:""}.fa-pen-clip-slash:before{content:""}.fa-pen-fancy:before{content:""}.fa-pen-fancy-slash:before{content:""}.fa-pen-field:before{content:""}.fa-pen-line:before{content:""}.fa-pen-nib:before{content:""}.fa-pen-nib-slash:before{content:""}.fa-pen-paintbrush:before{content:""}.fa-pen-ruler:before{content:""}.fa-pen-slash:before{content:""}.fa-pen-square:before{content:""}.fa-pen-swirl:before{content:""}.fa-pen-to-square:before{content:""}.fa-pencil:before,.fa-pencil-alt:before{content:""}.fa-pencil-mechanical:before{content:""}.fa-pencil-paintbrush:before{content:""}.fa-pencil-ruler:before{content:""}.fa-pencil-slash:before{content:""}.fa-pencil-square:before{content:""}.fa-pennant:before{content:""}.fa-people:before{content:""}.fa-people-arrows:before,.fa-people-arrows-left-right:before{content:""}.fa-people-carry:before,.fa-people-carry-box:before{content:""}.fa-people-dress:before{content:""}.fa-people-dress-simple:before{content:""}.fa-people-group:before{content:""}.fa-people-line:before{content:""}.fa-people-pants:before{content:""}.fa-people-pants-simple:before{content:""}.fa-people-pulling:before{content:""}.fa-people-robbery:before{content:""}.fa-people-roof:before{content:""}.fa-people-simple:before{content:""}.fa-pepper:before{content:""}.fa-pepper-hot:before{content:""}.fa-percent:before,.fa-percentage:before{content:"%"}.fa-period:before{content:"."}.fa-person:before{content:""}.fa-person-arrow-down-to-line:before{content:""}.fa-person-arrow-up-from-line:before{content:""}.fa-person-biking:before{content:""}.fa-person-biking-mountain:before{content:""}.fa-person-booth:before{content:""}.fa-person-breastfeeding:before{content:""}.fa-person-burst:before{content:""}.fa-person-cane:before{content:""}.fa-person-carry:before,.fa-person-carry-box:before{content:""}.fa-person-chalkboard:before{content:""}.fa-person-circle-check:before{content:""}.fa-person-circle-exclamation:before{content:""}.fa-person-circle-minus:before{content:""}.fa-person-circle-plus:before{content:""}.fa-person-circle-question:before{content:""}.fa-person-circle-xmark:before{content:""}.fa-person-digging:before{content:""}.fa-person-dolly:before{content:""}.fa-person-dolly-empty:before{content:""}.fa-person-dots-from-line:before{content:""}.fa-person-dress:before{content:""}.fa-person-dress-burst:before{content:""}.fa-person-dress-fairy:before{content:""}.fa-person-dress-simple:before{content:""}.fa-person-drowning:before{content:""}.fa-person-fairy:before{content:""}.fa-person-falling:before{content:""}.fa-person-falling-burst:before{content:""}.fa-person-from-portal:before{content:""}.fa-person-half-dress:before{content:""}.fa-person-harassing:before{content:""}.fa-person-hiking:before{content:""}.fa-person-military-pointing:before{content:""}.fa-person-military-rifle:before{content:""}.fa-person-military-to-person:before{content:""}.fa-person-pinball:before{content:""}.fa-person-praying:before{content:""}.fa-person-pregnant:before{content:""}.fa-person-rays:before{content:""}.fa-person-rifle:before{content:""}.fa-person-running:before{content:""}.fa-person-running-fast:before{content:""}.fa-person-seat:before{content:""}.fa-person-seat-reclined:before{content:""}.fa-person-shelter:before{content:""}.fa-person-sign:before{content:""}.fa-person-simple:before{content:""}.fa-person-skating:before{content:""}.fa-person-ski-jumping:before{content:""}.fa-person-ski-lift:before{content:""}.fa-person-skiing:before{content:""}.fa-person-skiing-nordic:before{content:""}.fa-person-sledding:before{content:""}.fa-person-snowboarding:before{content:""}.fa-person-snowmobiling:before{content:""}.fa-person-swimming:before{content:""}.fa-person-through-window:before{content:""}.fa-person-to-door:before{content:""}.fa-person-to-portal:before{content:""}.fa-person-walking:before{content:""}.fa-person-walking-arrow-loop-left:before{content:""}.fa-person-walking-arrow-right:before{content:""}.fa-person-walking-dashed-line-arrow-right:before{content:""}.fa-person-walking-luggage:before{content:""}.fa-person-walking-with-cane:before{content:""}.fa-peseta-sign:before{content:""}.fa-peso-sign:before{content:""}.fa-phone:before{content:""}.fa-phone-alt:before{content:""}.fa-phone-arrow-down:before,.fa-phone-arrow-down-left:before{content:""}.fa-phone-arrow-right:before{content:""}.fa-phone-arrow-up:before,.fa-phone-arrow-up-right:before{content:""}.fa-phone-circle:before{content:""}.fa-phone-circle-alt:before{content:""}.fa-phone-circle-down:before{content:""}.fa-phone-flip:before{content:""}.fa-phone-hangup:before{content:""}.fa-phone-incoming:before{content:""}.fa-phone-intercom:before{content:""}.fa-phone-laptop:before{content:""}.fa-phone-missed:before{content:""}.fa-phone-office:before{content:""}.fa-phone-outgoing:before{content:""}.fa-phone-plus:before{content:""}.fa-phone-rotary:before{content:""}.fa-phone-slash:before{content:""}.fa-phone-square:before{content:""}.fa-phone-square-alt:before{content:""}.fa-phone-square-down:before{content:""}.fa-phone-volume:before{content:""}.fa-phone-xmark:before{content:""}.fa-photo-film:before{content:""}.fa-photo-film-music:before{content:""}.fa-photo-video:before{content:""}.fa-pi:before{content:""}.fa-piano:before{content:""}.fa-piano-keyboard:before{content:""}.fa-pickaxe:before{content:""}.fa-pickleball:before{content:""}.fa-pie:before{content:""}.fa-pie-chart:before{content:""}.fa-pig:before{content:""}.fa-piggy-bank:before{content:""}.fa-pills:before{content:""}.fa-pinata:before{content:""}.fa-pinball:before{content:""}.fa-pineapple:before{content:""}.fa-ping-pong-paddle-ball:before{content:""}.fa-pipe:before{content:"|"}.fa-pipe-circle-check:before{content:""}.fa-pipe-collar:before{content:""}.fa-pipe-section:before{content:""}.fa-pipe-smoking:before{content:""}.fa-pipe-valve:before{content:""}.fa-pizza:before{content:""}.fa-pizza-slice:before{content:""}.fa-place-of-worship:before{content:""}.fa-plane:before{content:""}.fa-plane-alt:before{content:""}.fa-plane-arrival:before{content:""}.fa-plane-circle-check:before{content:""}.fa-plane-circle-exclamation:before{content:""}.fa-plane-circle-xmark:before{content:""}.fa-plane-departure:before{content:""}.fa-plane-engines:before{content:""}.fa-plane-lock:before{content:""}.fa-plane-prop:before{content:""}.fa-plane-slash:before{content:""}.fa-plane-tail:before{content:""}.fa-plane-up:before{content:""}.fa-plane-up-slash:before{content:""}.fa-planet-moon:before{content:""}.fa-planet-ringed:before{content:""}.fa-plant-wilt:before{content:""}.fa-plate-utensils:before{content:""}.fa-plate-wheat:before{content:""}.fa-play:before{content:""}.fa-play-circle:before{content:""}.fa-play-pause:before{content:""}.fa-plug:before{content:""}.fa-plug-circle-bolt:before{content:""}.fa-plug-circle-check:before{content:""}.fa-plug-circle-exclamation:before{content:""}.fa-plug-circle-minus:before{content:""}.fa-plug-circle-plus:before{content:""}.fa-plug-circle-xmark:before{content:""}.fa-plus:before{content:"+"}.fa-plus-circle:before{content:""}.fa-plus-hexagon:before{content:""}.fa-plus-large:before{content:""}.fa-plus-minus:before{content:""}.fa-plus-octagon:before{content:""}.fa-plus-square:before{content:""}.fa-podcast:before{content:""}.fa-podium:before{content:""}.fa-podium-star:before{content:""}.fa-police-box:before{content:""}.fa-poll:before{content:""}.fa-poll-h:before{content:""}.fa-poll-people:before{content:""}.fa-pompebled:before{content:""}.fa-poo:before{content:""}.fa-poo-bolt:before,.fa-poo-storm:before{content:""}.fa-pool-8-ball:before{content:""}.fa-poop:before{content:""}.fa-popcorn:before{content:""}.fa-popsicle:before{content:""}.fa-portal-enter:before{content:""}.fa-portal-exit:before{content:""}.fa-portrait:before{content:""}.fa-pot-food:before{content:""}.fa-potato:before{content:""}.fa-pound-sign:before{content:""}.fa-power-off:before{content:""}.fa-pray:before{content:""}.fa-praying-hands:before{content:""}.fa-prescription:before{content:""}.fa-prescription-bottle:before{content:""}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:""}.fa-prescription-bottle-pill:before{content:""}.fa-presentation:before,.fa-presentation-screen:before{content:""}.fa-pretzel:before{content:""}.fa-print:before{content:""}.fa-print-magnifying-glass:before,.fa-print-search:before{content:""}.fa-print-slash:before{content:""}.fa-pro:before{content:""}.fa-procedures:before{content:""}.fa-project-diagram:before{content:""}.fa-projector:before{content:""}.fa-pump:before{content:""}.fa-pump-medical:before{content:""}.fa-pump-soap:before{content:""}.fa-pumpkin:before{content:""}.fa-puzzle:before{content:""}.fa-puzzle-piece:before{content:""}.fa-puzzle-piece-alt:before,.fa-puzzle-piece-simple:before{content:""}.fa-q:before{content:"Q"}.fa-qrcode:before{content:""}.fa-question:before{content:"?"}.fa-question-circle:before{content:""}.fa-question-square:before{content:""}.fa-quidditch:before,.fa-quidditch-broom-ball:before{content:""}.fa-quote-left:before,.fa-quote-left-alt:before{content:""}.fa-quote-right:before,.fa-quote-right-alt:before{content:""}.fa-quotes:before{content:""}.fa-quran:before{content:""}.fa-r:before{content:"R"}.fa-rabbit:before{content:""}.fa-rabbit-fast:before,.fa-rabbit-running:before{content:""}.fa-raccoon:before{content:""}.fa-racquet:before{content:""}.fa-radar:before{content:""}.fa-radiation:before{content:""}.fa-radiation-alt:before{content:""}.fa-radio:before{content:""}.fa-radio-alt:before,.fa-radio-tuner:before{content:""}.fa-rainbow:before{content:""}.fa-raindrops:before{content:""}.fa-ram:before{content:""}.fa-ramp-loading:before{content:""}.fa-random:before{content:""}.fa-ranking-star:before{content:""}.fa-raygun:before{content:""}.fa-receipt:before{content:""}.fa-record-vinyl:before{content:""}.fa-rectangle:before{content:""}.fa-rectangle-ad:before{content:""}.fa-rectangle-barcode:before{content:""}.fa-rectangle-code:before{content:""}.fa-rectangle-hd:before{content:""}.fa-rectangle-history:before{content:""}.fa-rectangle-history-circle-plus:before{content:""}.fa-rectangle-history-circle-user:before{content:""}.fa-rectangle-landscape:before{content:""}.fa-rectangle-list:before{content:""}.fa-rectangle-portrait:before{content:""}.fa-rectangle-pro:before{content:""}.fa-rectangle-sd:before{content:""}.fa-rectangle-terminal:before{content:""}.fa-rectangle-times:before{content:""}.fa-rectangle-vertical:before{content:""}.fa-rectangle-vertical-history:before{content:""}.fa-rectangle-wide:before{content:""}.fa-rectangle-xmark:before{content:""}.fa-rectangles-mixed:before{content:""}.fa-recycle:before{content:""}.fa-redo:before{content:""}.fa-redo-alt:before{content:""}.fa-reel:before{content:""}.fa-reflect-both:before{content:""}.fa-reflect-horizontal:before{content:""}.fa-reflect-vertical:before{content:""}.fa-refresh:before{content:""}.fa-refrigerator:before{content:""}.fa-registered:before{content:""}.fa-remove:before{content:""}.fa-remove-format:before{content:""}.fa-reorder:before{content:""}.fa-repeat:before{content:""}.fa-repeat-1:before{content:""}.fa-repeat-1-alt:before{content:""}.fa-repeat-alt:before{content:""}.fa-reply:before{content:""}.fa-reply-all:before{content:""}.fa-reply-clock:before,.fa-reply-time:before{content:""}.fa-republican:before{content:""}.fa-restroom:before{content:""}.fa-restroom-simple:before{content:""}.fa-retweet:before{content:""}.fa-retweet-alt:before{content:""}.fa-rhombus:before{content:""}.fa-ribbon:before{content:""}.fa-right:before{content:""}.fa-right-from-bracket:before{content:""}.fa-right-from-line:before{content:""}.fa-right-left:before{content:""}.fa-right-left-large:before{content:""}.fa-right-long:before{content:""}.fa-right-long-to-line:before{content:""}.fa-right-to-bracket:before{content:""}.fa-right-to-line:before{content:""}.fa-ring:before{content:""}.fa-ring-diamond:before{content:""}.fa-rings-wedding:before{content:""}.fa-rmb:before{content:""}.fa-road:before{content:""}.fa-road-barrier:before{content:""}.fa-road-bridge:before{content:""}.fa-road-circle-check:before{content:""}.fa-road-circle-exclamation:before{content:""}.fa-road-circle-xmark:before{content:""}.fa-road-lock:before{content:""}.fa-road-spikes:before{content:""}.fa-robot:before{content:""}.fa-robot-astromech:before{content:""}.fa-rocket:before{content:""}.fa-rocket-launch:before{content:""}.fa-rod-asclepius:before,.fa-rod-snake:before{content:""}.fa-roller-coaster:before{content:""}.fa-rotate:before{content:""}.fa-rotate-back:before,.fa-rotate-backward:before{content:""}.fa-rotate-exclamation:before{content:""}.fa-rotate-forward:before{content:""}.fa-rotate-left:before{content:""}.fa-rotate-reverse:before{content:""}.fa-rotate-right:before{content:""}.fa-rouble:before{content:""}.fa-route:before{content:""}.fa-route-highway:before{content:""}.fa-route-interstate:before{content:""}.fa-router:before{content:""}.fa-rows:before{content:""}.fa-rss:before{content:""}.fa-rss-square:before{content:""}.fa-rub:before,.fa-ruble:before,.fa-ruble-sign:before{content:""}.fa-rug:before{content:""}.fa-rugby-ball:before{content:""}.fa-ruler:before{content:""}.fa-ruler-combined:before{content:""}.fa-ruler-horizontal:before{content:""}.fa-ruler-triangle:before{content:""}.fa-ruler-vertical:before{content:""}.fa-running:before{content:""}.fa-rupee:before,.fa-rupee-sign:before{content:""}.fa-rupiah-sign:before{content:""}.fa-rv:before{content:""}.fa-s:before{content:"S"}.fa-sack:before{content:""}.fa-sack-dollar:before{content:""}.fa-sack-xmark:before{content:""}.fa-sad-cry:before{content:""}.fa-sad-tear:before{content:""}.fa-sailboat:before{content:""}.fa-salad:before{content:""}.fa-salt-shaker:before{content:""}.fa-sandwich:before{content:""}.fa-satellite:before{content:""}.fa-satellite-dish:before{content:""}.fa-sausage:before{content:""}.fa-save:before{content:""}.fa-save-circle-arrow-right:before{content:""}.fa-save-circle-xmark:before,.fa-save-times:before{content:""}.fa-sax-hot:before{content:""}.fa-saxophone:before{content:""}.fa-saxophone-fire:before{content:""}.fa-scale-balanced:before{content:""}.fa-scale-unbalanced:before{content:""}.fa-scale-unbalanced-flip:before{content:""}.fa-scalpel:before{content:""}.fa-scalpel-line-dashed:before,.fa-scalpel-path:before{content:""}.fa-scanner:before,.fa-scanner-gun:before{content:""}.fa-scanner-image:before{content:""}.fa-scanner-keyboard:before{content:""}.fa-scanner-touchscreen:before{content:""}.fa-scarecrow:before{content:""}.fa-scarf:before{content:""}.fa-school:before{content:""}.fa-school-circle-check:before{content:""}.fa-school-circle-exclamation:before{content:""}.fa-school-circle-xmark:before{content:""}.fa-school-flag:before{content:""}.fa-school-lock:before{content:""}.fa-scissors:before{content:""}.fa-screen-users:before{content:""}.fa-screencast:before{content:""}.fa-screenshot:before{content:""}.fa-screwdriver:before{content:""}.fa-screwdriver-wrench:before{content:""}.fa-scribble:before{content:""}.fa-scroll:before{content:""}.fa-scroll-old:before{content:""}.fa-scroll-ribbon:before{content:""}.fa-scroll-torah:before{content:""}.fa-scrubber:before{content:""}.fa-scythe:before{content:""}.fa-sd-card:before{content:""}.fa-sd-cards:before{content:""}.fa-seal:before{content:""}.fa-seal-exclamation:before{content:""}.fa-seal-question:before{content:""}.fa-search:before{content:""}.fa-search-dollar:before{content:""}.fa-search-location:before{content:""}.fa-search-minus:before{content:""}.fa-search-plus:before{content:""}.fa-seat-airline:before{content:""}.fa-section:before{content:""}.fa-seedling:before{content:""}.fa-semicolon:before{content:";"}.fa-send:before{content:""}.fa-send-back:before{content:""}.fa-send-backward:before{content:""}.fa-sensor:before{content:""}.fa-sensor-alert:before{content:""}.fa-sensor-cloud:before{content:""}.fa-sensor-fire:before{content:""}.fa-sensor-on:before{content:""}.fa-sensor-smoke:before{content:""}.fa-sensor-triangle-exclamation:before{content:""}.fa-server:before{content:""}.fa-shapes:before{content:""}.fa-share:before{content:""}.fa-share-all:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-share-from-square:before{content:""}.fa-share-nodes:before{content:""}.fa-share-square:before{content:""}.fa-sheep:before{content:""}.fa-sheet-plastic:before{content:""}.fa-shekel:before,.fa-shekel-sign:before{content:""}.fa-shelves:before{content:""}.fa-shelves-empty:before{content:""}.fa-sheqel:before,.fa-sheqel-sign:before{content:""}.fa-shield:before{content:""}.fa-shield-alt:before{content:""}.fa-shield-blank:before{content:""}.fa-shield-cat:before{content:""}.fa-shield-check:before{content:""}.fa-shield-cross:before{content:""}.fa-shield-dog:before{content:""}.fa-shield-exclamation:before{content:""}.fa-shield-halved:before{content:""}.fa-shield-heart:before{content:""}.fa-shield-keyhole:before{content:""}.fa-shield-minus:before{content:""}.fa-shield-plus:before{content:""}.fa-shield-quartered:before{content:""}.fa-shield-slash:before{content:""}.fa-shield-times:before{content:""}.fa-shield-virus:before{content:""}.fa-shield-xmark:before{content:""}.fa-ship:before{content:""}.fa-shipping-fast:before{content:""}.fa-shipping-timed:before{content:""}.fa-shirt:before{content:""}.fa-shirt-long-sleeve:before{content:""}.fa-shirt-running:before{content:""}.fa-shirt-tank-top:before{content:""}.fa-shish-kebab:before{content:""}.fa-shoe-prints:before{content:""}.fa-shop:before{content:""}.fa-shop-lock:before{content:""}.fa-shop-slash:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-shopping-basket-alt:before{content:""}.fa-shopping-cart:before{content:""}.fa-shortcake:before{content:""}.fa-shovel:before{content:""}.fa-shovel-snow:before{content:""}.fa-shower:before{content:""}.fa-shower-alt:before,.fa-shower-down:before{content:""}.fa-shredder:before{content:""}.fa-shrimp:before{content:""}.fa-shuffle:before{content:""}.fa-shutters:before{content:""}.fa-shuttle-space:before{content:""}.fa-shuttle-van:before{content:""}.fa-shuttlecock:before{content:""}.fa-sickle:before{content:""}.fa-sidebar:before{content:""}.fa-sidebar-flip:before{content:""}.fa-sigma:before{content:""}.fa-sign:before,.fa-sign-hanging:before{content:""}.fa-sign-in:before{content:""}.fa-sign-in-alt:before{content:""}.fa-sign-language:before{content:""}.fa-sign-out:before{content:""}.fa-sign-out-alt:before{content:""}.fa-sign-post:before{content:""}.fa-sign-posts:before{content:""}.fa-sign-posts-wrench:before{content:""}.fa-signal:before{content:""}.fa-signal-1:before{content:""}.fa-signal-2:before{content:""}.fa-signal-3:before{content:""}.fa-signal-4:before{content:""}.fa-signal-5:before{content:""}.fa-signal-alt:before{content:""}.fa-signal-alt-1:before{content:""}.fa-signal-alt-2:before{content:""}.fa-signal-alt-3:before{content:""}.fa-signal-alt-4:before{content:""}.fa-signal-alt-slash:before{content:""}.fa-signal-bars:before{content:""}.fa-signal-bars-fair:before{content:""}.fa-signal-bars-good:before{content:""}.fa-signal-bars-slash:before{content:""}.fa-signal-bars-strong:before{content:""}.fa-signal-bars-weak:before{content:""}.fa-signal-fair:before{content:""}.fa-signal-good:before{content:""}.fa-signal-perfect:before{content:""}.fa-signal-slash:before{content:""}.fa-signal-stream:before{content:""}.fa-signal-stream-slash:before{content:""}.fa-signal-strong:before{content:""}.fa-signal-weak:before{content:""}.fa-signature:before{content:""}.fa-signature-lock:before{content:""}.fa-signature-slash:before{content:""}.fa-signing:before{content:""}.fa-signs-post:before{content:""}.fa-sim-card:before{content:""}.fa-sim-cards:before{content:""}.fa-sink:before{content:""}.fa-siren:before{content:""}.fa-siren-on:before{content:""}.fa-sitemap:before{content:""}.fa-skating:before{content:""}.fa-skeleton:before{content:""}.fa-skeleton-ribs:before{content:""}.fa-ski-boot:before{content:""}.fa-ski-boot-ski:before{content:""}.fa-ski-jump:before{content:""}.fa-ski-lift:before{content:""}.fa-skiing:before{content:""}.fa-skiing-nordic:before{content:""}.fa-skull:before{content:""}.fa-skull-cow:before{content:""}.fa-skull-crossbones:before{content:""}.fa-slash:before{content:""}.fa-slash-back:before{content:"\\"}.fa-slash-forward:before{content:"/"}.fa-sledding:before{content:""}.fa-sleigh:before{content:""}.fa-slider:before{content:""}.fa-sliders:before,.fa-sliders-h:before{content:""}.fa-sliders-h-square:before{content:""}.fa-sliders-simple:before{content:""}.fa-sliders-up:before,.fa-sliders-v:before{content:""}.fa-sliders-v-square:before{content:""}.fa-slot-machine:before{content:""}.fa-smile:before{content:""}.fa-smile-beam:before{content:""}.fa-smile-plus:before{content:""}.fa-smile-wink:before{content:""}.fa-smog:before{content:""}.fa-smoke:before{content:""}.fa-smoking:before{content:""}.fa-smoking-ban:before{content:""}.fa-sms:before{content:""}.fa-snake:before{content:""}.fa-snooze:before{content:""}.fa-snow-blowing:before{content:""}.fa-snowboarding:before{content:""}.fa-snowflake:before{content:""}.fa-snowflake-droplets:before{content:""}.fa-snowflakes:before{content:""}.fa-snowman:before{content:""}.fa-snowman-head:before{content:""}.fa-snowmobile:before{content:""}.fa-snowplow:before{content:""}.fa-soap:before{content:""}.fa-soccer-ball:before{content:""}.fa-socks:before{content:""}.fa-soft-serve:before{content:""}.fa-solar-panel:before{content:""}.fa-solar-system:before{content:""}.fa-sort:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-alpha-down:before{content:""}.fa-sort-alpha-down-alt:before{content:""}.fa-sort-alpha-up:before{content:""}.fa-sort-alpha-up-alt:before{content:""}.fa-sort-alt:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-amount-down:before{content:""}.fa-sort-amount-down-alt:before{content:""}.fa-sort-amount-up:before{content:""}.fa-sort-amount-up-alt:before{content:""}.fa-sort-asc:before{content:""}.fa-sort-circle:before{content:""}.fa-sort-circle-down:before{content:""}.fa-sort-circle-up:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-sort-numeric-down:before{content:""}.fa-sort-numeric-down-alt:before{content:""}.fa-sort-numeric-up:before{content:""}.fa-sort-numeric-up-alt:before{content:""}.fa-sort-shapes-down:before{content:""}.fa-sort-shapes-down-alt:before{content:""}.fa-sort-shapes-up:before{content:""}.fa-sort-shapes-up-alt:before{content:""}.fa-sort-size-down:before{content:""}.fa-sort-size-down-alt:before{content:""}.fa-sort-size-up:before{content:""}.fa-sort-size-up-alt:before{content:""}.fa-sort-up:before{content:""}.fa-sort-up-down:before{content:""}.fa-soup:before{content:""}.fa-spa:before{content:""}.fa-space-shuttle:before{content:""}.fa-space-station-moon:before{content:""}.fa-space-station-moon-alt:before,.fa-space-station-moon-construction:before{content:""}.fa-spade:before{content:""}.fa-spaghetti-monster-flying:before{content:""}.fa-sparkle:before{content:""}.fa-sparkles:before{content:""}.fa-speaker:before{content:""}.fa-speakers:before{content:""}.fa-spell-check:before{content:""}.fa-spider:before{content:""}.fa-spider-black-widow:before{content:""}.fa-spider-web:before{content:""}.fa-spinner:before{content:""}.fa-spinner-scale:before{content:""}.fa-spinner-third:before{content:""}.fa-split:before{content:""}.fa-splotch:before{content:""}.fa-spoon:before{content:""}.fa-sportsball:before{content:""}.fa-spray-can:before{content:""}.fa-spray-can-sparkles:before{content:""}.fa-sprinkler:before{content:""}.fa-sprinkler-ceiling:before{content:""}.fa-sprout:before{content:""}.fa-square:before{content:""}.fa-square-0:before{content:""}.fa-square-1:before{content:""}.fa-square-2:before{content:""}.fa-square-3:before{content:""}.fa-square-4:before{content:""}.fa-square-5:before{content:""}.fa-square-6:before{content:""}.fa-square-7:before{content:""}.fa-square-8:before{content:""}.fa-square-9:before{content:""}.fa-square-a:before{content:""}.fa-square-a-lock:before{content:""}.fa-square-ampersand:before{content:""}.fa-square-arrow-down:before{content:""}.fa-square-arrow-down-left:before{content:""}.fa-square-arrow-down-right:before{content:""}.fa-square-arrow-left:before{content:""}.fa-square-arrow-right:before{content:""}.fa-square-arrow-up:before{content:""}.fa-square-arrow-up-left:before{content:""}.fa-square-arrow-up-right:before{content:""}.fa-square-b:before{content:""}.fa-square-bolt:before{content:""}.fa-square-c:before{content:""}.fa-square-caret-down:before{content:""}.fa-square-caret-left:before{content:""}.fa-square-caret-right:before{content:""}.fa-square-caret-up:before{content:""}.fa-square-check:before{content:""}.fa-square-chevron-down:before{content:""}.fa-square-chevron-left:before{content:""}.fa-square-chevron-right:before{content:""}.fa-square-chevron-up:before{content:""}.fa-square-code:before{content:""}.fa-square-d:before{content:""}.fa-square-dashed:before{content:""}.fa-square-dashed-circle-plus:before{content:""}.fa-square-divide:before{content:""}.fa-square-dollar:before{content:""}.fa-square-down:before{content:""}.fa-square-down-left:before{content:""}.fa-square-down-right:before{content:""}.fa-square-e:before{content:""}.fa-square-ellipsis:before{content:""}.fa-square-ellipsis-vertical:before{content:""}.fa-square-envelope:before{content:""}.fa-square-exclamation:before{content:""}.fa-square-f:before{content:""}.fa-square-fragile:before{content:""}.fa-square-full:before{content:""}.fa-square-g:before{content:""}.fa-square-h:before{content:""}.fa-square-heart:before{content:""}.fa-square-i:before{content:""}.fa-square-info:before{content:""}.fa-square-j:before{content:""}.fa-square-k:before{content:""}.fa-square-kanban:before{content:""}.fa-square-l:before{content:""}.fa-square-left:before{content:""}.fa-square-list:before{content:""}.fa-square-m:before{content:""}.fa-square-minus:before{content:""}.fa-square-n:before{content:""}.fa-square-nfi:before{content:""}.fa-square-o:before{content:""}.fa-square-p:before{content:""}.fa-square-parking:before{content:""}.fa-square-parking-slash:before{content:""}.fa-square-pen:before{content:""}.fa-square-person-confined:before{content:""}.fa-square-phone:before{content:""}.fa-square-phone-flip:before{content:""}.fa-square-phone-hangup:before{content:""}.fa-square-plus:before{content:""}.fa-square-poll-horizontal:before{content:""}.fa-square-poll-vertical:before{content:""}.fa-square-q:before{content:""}.fa-square-quarters:before{content:""}.fa-square-question:before{content:""}.fa-square-quote:before{content:""}.fa-square-r:before{content:""}.fa-square-right:before{content:""}.fa-square-ring:before{content:""}.fa-square-root:before{content:""}.fa-square-root-alt:before,.fa-square-root-variable:before{content:""}.fa-square-rss:before{content:""}.fa-square-s:before{content:""}.fa-square-share-nodes:before{content:""}.fa-square-sliders:before{content:""}.fa-square-sliders-vertical:before{content:""}.fa-square-small:before{content:""}.fa-square-star:before{content:""}.fa-square-t:before{content:""}.fa-square-terminal:before{content:""}.fa-square-this-way-up:before{content:""}.fa-square-u:before{content:""}.fa-square-up:before{content:""}.fa-square-up-left:before{content:""}.fa-square-up-right:before{content:""}.fa-square-user:before{content:""}.fa-square-v:before{content:""}.fa-square-virus:before{content:""}.fa-square-w:before{content:""}.fa-square-wine-glass-crack:before{content:""}.fa-square-x:before{content:""}.fa-square-xmark:before{content:""}.fa-square-y:before{content:""}.fa-square-z:before{content:""}.fa-squid:before{content:""}.fa-squirrel:before{content:""}.fa-staff:before{content:""}.fa-staff-aesculapius:before,.fa-staff-snake:before{content:""}.fa-stairs:before{content:""}.fa-stamp:before{content:""}.fa-standard-definition:before{content:""}.fa-stapler:before{content:""}.fa-star:before{content:""}.fa-star-and-crescent:before{content:""}.fa-star-christmas:before{content:""}.fa-star-circle:before{content:""}.fa-star-exclamation:before{content:""}.fa-star-half:before{content:""}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:""}.fa-star-of-david:before{content:""}.fa-star-of-life:before{content:""}.fa-star-sharp:before{content:""}.fa-star-sharp-half:before{content:""}.fa-star-sharp-half-alt:before,.fa-star-sharp-half-stroke:before{content:""}.fa-star-shooting:before{content:""}.fa-starfighter:before{content:""}.fa-starfighter-alt:before{content:""}.fa-starfighter-alt-advanced:before{content:""}.fa-starfighter-twin-ion-engine:before{content:""}.fa-starfighter-twin-ion-engine-advanced:before{content:""}.fa-stars:before{content:""}.fa-starship:before{content:""}.fa-starship-freighter:before{content:""}.fa-steak:before{content:""}.fa-steering-wheel:before{content:""}.fa-step-backward:before{content:""}.fa-step-forward:before{content:""}.fa-sterling-sign:before{content:""}.fa-stethoscope:before{content:""}.fa-sticky-note:before{content:""}.fa-stocking:before{content:""}.fa-stomach:before{content:""}.fa-stop:before{content:""}.fa-stop-circle:before{content:""}.fa-stopwatch:before{content:""}.fa-stopwatch-20:before{content:""}.fa-store:before{content:""}.fa-store-alt:before{content:""}.fa-store-alt-slash:before{content:""}.fa-store-lock:before{content:""}.fa-store-slash:before{content:""}.fa-strawberry:before{content:""}.fa-stream:before{content:""}.fa-street-view:before{content:""}.fa-stretcher:before{content:""}.fa-strikethrough:before{content:""}.fa-stroopwafel:before{content:""}.fa-subscript:before{content:""}.fa-subtitles:before{content:""}.fa-subtitles-slash:before{content:""}.fa-subtract:before{content:""}.fa-subway:before{content:""}.fa-subway-tunnel:before{content:""}.fa-suitcase:before{content:""}.fa-suitcase-medical:before{content:""}.fa-suitcase-rolling:before{content:""}.fa-sun:before{content:""}.fa-sun-alt:before,.fa-sun-bright:before{content:""}.fa-sun-cloud:before{content:""}.fa-sun-dust:before{content:""}.fa-sun-haze:before{content:""}.fa-sun-plant-wilt:before{content:""}.fa-sunglasses:before{content:""}.fa-sunrise:before{content:""}.fa-sunset:before{content:""}.fa-superscript:before{content:""}.fa-surprise:before{content:""}.fa-sushi:before{content:""}.fa-sushi-roll:before{content:""}.fa-swap:before{content:""}.fa-swap-arrows:before{content:""}.fa-swatchbook:before{content:""}.fa-swimmer:before{content:""}.fa-swimming-pool:before{content:""}.fa-sword:before{content:""}.fa-sword-laser:before{content:""}.fa-sword-laser-alt:before{content:""}.fa-swords:before{content:""}.fa-swords-laser:before{content:""}.fa-symbols:before{content:""}.fa-synagogue:before{content:""}.fa-sync:before{content:""}.fa-sync-alt:before{content:""}.fa-syringe:before{content:""}.fa-t:before{content:"T"}.fa-t-rex:before{content:""}.fa-t-shirt:before{content:""}.fa-table:before{content:""}.fa-table-cells:before{content:""}.fa-table-cells-column-lock:before{content:""}.fa-table-cells-column-unlock:before{content:""}.fa-table-cells-large:before{content:""}.fa-table-cells-lock:before{content:""}.fa-table-cells-row-lock:before{content:""}.fa-table-cells-row-unlock:before{content:""}.fa-table-cells-unlock:before{content:""}.fa-table-columns:before{content:""}.fa-table-layout:before{content:""}.fa-table-list:before{content:""}.fa-table-picnic:before{content:""}.fa-table-pivot:before{content:""}.fa-table-rows:before{content:""}.fa-table-tennis:before,.fa-table-tennis-paddle-ball:before{content:""}.fa-table-tree:before{content:""}.fa-tablet:before{content:""}.fa-tablet-alt:before{content:""}.fa-tablet-android:before{content:""}.fa-tablet-android-alt:before{content:""}.fa-tablet-button:before{content:""}.fa-tablet-rugged:before{content:""}.fa-tablet-screen:before{content:""}.fa-tablet-screen-button:before{content:""}.fa-tablets:before{content:""}.fa-tachograph-digital:before{content:""}.fa-tachometer:before{content:""}.fa-tachometer-alt:before{content:""}.fa-tachometer-alt-average:before{content:""}.fa-tachometer-alt-fast:before{content:""}.fa-tachometer-alt-fastest:before{content:""}.fa-tachometer-alt-slow:before{content:""}.fa-tachometer-alt-slowest:before{content:""}.fa-tachometer-average:before{content:""}.fa-tachometer-fast:before{content:""}.fa-tachometer-fastest:before{content:""}.fa-tachometer-slow:before{content:""}.fa-tachometer-slowest:before{content:""}.fa-taco:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-tally:before{content:""}.fa-tally-1:before{content:""}.fa-tally-2:before{content:""}.fa-tally-3:before{content:""}.fa-tally-4:before{content:""}.fa-tally-5:before{content:""}.fa-tamale:before{content:""}.fa-tanakh:before{content:""}.fa-tank-water:before{content:""}.fa-tape:before{content:""}.fa-tarp:before{content:""}.fa-tarp-droplet:before{content:""}.fa-tasks:before{content:""}.fa-tasks-alt:before{content:""}.fa-taxi:before{content:""}.fa-taxi-bus:before{content:""}.fa-teddy-bear:before{content:""}.fa-teeth:before{content:""}.fa-teeth-open:before{content:""}.fa-telescope:before{content:""}.fa-teletype:before{content:""}.fa-teletype-answer:before{content:""}.fa-television:before{content:""}.fa-temperature-0:before{content:""}.fa-temperature-1:before{content:""}.fa-temperature-2:before{content:""}.fa-temperature-3:before{content:""}.fa-temperature-4:before{content:""}.fa-temperature-arrow-down:before{content:""}.fa-temperature-arrow-up:before{content:""}.fa-temperature-down:before{content:""}.fa-temperature-empty:before{content:""}.fa-temperature-frigid:before{content:""}.fa-temperature-full:before{content:""}.fa-temperature-half:before{content:""}.fa-temperature-high:before{content:""}.fa-temperature-hot:before{content:""}.fa-temperature-list:before{content:""}.fa-temperature-low:before{content:""}.fa-temperature-quarter:before{content:""}.fa-temperature-snow:before{content:""}.fa-temperature-sun:before{content:""}.fa-temperature-three-quarters:before{content:""}.fa-temperature-up:before{content:""}.fa-tenge:before,.fa-tenge-sign:before{content:""}.fa-tennis-ball:before{content:""}.fa-tent:before{content:""}.fa-tent-arrow-down-to-line:before{content:""}.fa-tent-arrow-left-right:before{content:""}.fa-tent-arrow-turn-left:before{content:""}.fa-tent-arrows-down:before{content:""}.fa-tent-double-peak:before{content:""}.fa-tents:before{content:""}.fa-terminal:before{content:""}.fa-text:before{content:""}.fa-text-height:before{content:""}.fa-text-size:before{content:""}.fa-text-slash:before{content:""}.fa-text-width:before{content:""}.fa-th:before{content:""}.fa-th-large:before{content:""}.fa-th-list:before{content:""}.fa-theater-masks:before{content:""}.fa-thermometer:before{content:""}.fa-thermometer-0:before{content:""}.fa-thermometer-1:before{content:""}.fa-thermometer-2:before{content:""}.fa-thermometer-3:before{content:""}.fa-thermometer-4:before{content:""}.fa-thermometer-empty:before{content:""}.fa-thermometer-full:before{content:""}.fa-thermometer-half:before{content:""}.fa-thermometer-quarter:before{content:""}.fa-thermometer-three-quarters:before{content:""}.fa-theta:before{content:""}.fa-thought-bubble:before{content:""}.fa-thumb-tack:before{content:""}.fa-thumb-tack-slash:before{content:""}.fa-thumbs-down:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbtack:before{content:""}.fa-thumbtack-slash:before{content:""}.fa-thunderstorm:before{content:""}.fa-thunderstorm-moon:before{content:""}.fa-thunderstorm-sun:before{content:""}.fa-tick:before{content:""}.fa-ticket:before{content:""}.fa-ticket-airline:before{content:""}.fa-ticket-alt:before{content:""}.fa-ticket-perforated:before{content:""}.fa-ticket-perforated-plane:before,.fa-ticket-plane:before{content:""}.fa-ticket-simple:before{content:""}.fa-tickets:before{content:""}.fa-tickets-airline:before{content:""}.fa-tickets-perforated:before{content:""}.fa-tickets-perforated-plane:before,.fa-tickets-plane:before{content:""}.fa-tickets-simple:before{content:""}.fa-tilde:before{content:"~"}.fa-timeline:before{content:""}.fa-timeline-arrow:before{content:""}.fa-timer:before{content:""}.fa-times:before{content:""}.fa-times-circle:before{content:""}.fa-times-hexagon:before{content:""}.fa-times-octagon:before{content:""}.fa-times-rectangle:before{content:""}.fa-times-square:before{content:""}.fa-times-to-slot:before{content:""}.fa-tint:before{content:""}.fa-tint-slash:before{content:""}.fa-tire:before{content:""}.fa-tire-flat:before{content:""}.fa-tire-pressure-warning:before{content:""}.fa-tire-rugged:before{content:""}.fa-tired:before{content:""}.fa-toggle-large-off:before{content:""}.fa-toggle-large-on:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-toilet:before{content:""}.fa-toilet-paper:before{content:""}.fa-toilet-paper-alt:before,.fa-toilet-paper-blank:before{content:""}.fa-toilet-paper-blank-under:before{content:""}.fa-toilet-paper-check:before{content:""}.fa-toilet-paper-reverse:before{content:""}.fa-toilet-paper-reverse-alt:before{content:""}.fa-toilet-paper-reverse-slash:before{content:""}.fa-toilet-paper-slash:before{content:""}.fa-toilet-paper-under:before{content:""}.fa-toilet-paper-under-slash:before{content:""}.fa-toilet-paper-xmark:before{content:""}.fa-toilet-portable:before{content:""}.fa-toilets-portable:before{content:""}.fa-tomato:before{content:""}.fa-tombstone:before{content:""}.fa-tombstone-alt:before,.fa-tombstone-blank:before{content:""}.fa-toolbox:before{content:""}.fa-tools:before{content:""}.fa-tooth:before{content:""}.fa-toothbrush:before{content:""}.fa-torah:before{content:""}.fa-torii-gate:before{content:""}.fa-tornado:before{content:""}.fa-tower-broadcast:before{content:""}.fa-tower-cell:before{content:""}.fa-tower-control:before{content:""}.fa-tower-observation:before{content:""}.fa-tractor:before{content:""}.fa-trademark:before{content:""}.fa-traffic-cone:before{content:""}.fa-traffic-light:before{content:""}.fa-traffic-light-go:before{content:""}.fa-traffic-light-slow:before{content:""}.fa-traffic-light-stop:before{content:""}.fa-trailer:before{content:""}.fa-train:before{content:""}.fa-train-subway:before{content:""}.fa-train-subway-tunnel:before{content:""}.fa-train-track:before{content:""}.fa-train-tram:before{content:""}.fa-train-tunnel:before{content:""}.fa-tram:before{content:""}.fa-transformer-bolt:before{content:""}.fa-transgender:before,.fa-transgender-alt:before{content:""}.fa-transporter:before{content:""}.fa-transporter-1:before{content:""}.fa-transporter-2:before{content:""}.fa-transporter-3:before{content:""}.fa-transporter-4:before{content:""}.fa-transporter-5:before{content:""}.fa-transporter-6:before{content:""}.fa-transporter-7:before{content:""}.fa-transporter-empty:before{content:""}.fa-trash:before{content:""}.fa-trash-alt:before{content:""}.fa-trash-alt-slash:before{content:""}.fa-trash-arrow-turn-left:before{content:""}.fa-trash-arrow-up:before{content:""}.fa-trash-can:before{content:""}.fa-trash-can-arrow-turn-left:before{content:""}.fa-trash-can-arrow-up:before{content:""}.fa-trash-can-check:before{content:""}.fa-trash-can-clock:before{content:""}.fa-trash-can-list:before{content:""}.fa-trash-can-plus:before{content:""}.fa-trash-can-slash:before{content:""}.fa-trash-can-undo:before{content:""}.fa-trash-can-xmark:before{content:""}.fa-trash-check:before{content:""}.fa-trash-circle:before{content:""}.fa-trash-clock:before{content:""}.fa-trash-list:before{content:""}.fa-trash-plus:before{content:""}.fa-trash-restore:before{content:""}.fa-trash-restore-alt:before{content:""}.fa-trash-slash:before{content:""}.fa-trash-undo:before{content:""}.fa-trash-undo-alt:before{content:""}.fa-trash-xmark:before{content:""}.fa-treasure-chest:before{content:""}.fa-tree:before{content:""}.fa-tree-alt:before{content:""}.fa-tree-christmas:before{content:""}.fa-tree-city:before{content:""}.fa-tree-deciduous:before{content:""}.fa-tree-decorated:before{content:""}.fa-tree-large:before{content:""}.fa-tree-palm:before{content:""}.fa-trees:before{content:""}.fa-trian-balbot:before{content:""}.fa-triangle:before{content:""}.fa-triangle-circle-square:before{content:""}.fa-triangle-exclamation:before{content:""}.fa-triangle-instrument:before,.fa-triangle-music:before{content:""}.fa-triangle-person-digging:before{content:""}.fa-tricycle:before{content:""}.fa-tricycle-adult:before{content:""}.fa-trillium:before{content:""}.fa-trophy:before{content:""}.fa-trophy-alt:before,.fa-trophy-star:before{content:""}.fa-trowel:before{content:""}.fa-trowel-bricks:before{content:""}.fa-truck:before{content:""}.fa-truck-arrow-right:before{content:""}.fa-truck-bolt:before{content:""}.fa-truck-clock:before{content:""}.fa-truck-container:before{content:""}.fa-truck-container-empty:before{content:""}.fa-truck-couch:before{content:""}.fa-truck-droplet:before{content:""}.fa-truck-fast:before{content:""}.fa-truck-field:before{content:""}.fa-truck-field-un:before{content:""}.fa-truck-fire:before{content:""}.fa-truck-flatbed:before{content:""}.fa-truck-front:before{content:""}.fa-truck-ladder:before{content:""}.fa-truck-loading:before{content:""}.fa-truck-medical:before{content:""}.fa-truck-monster:before{content:""}.fa-truck-moving:before{content:""}.fa-truck-pickup:before{content:""}.fa-truck-plane:before{content:""}.fa-truck-plow:before{content:""}.fa-truck-ramp:before{content:""}.fa-truck-ramp-box:before{content:""}.fa-truck-ramp-couch:before{content:""}.fa-truck-tow:before{content:""}.fa-truck-utensils:before{content:""}.fa-trumpet:before{content:""}.fa-try:before{content:""}.fa-tshirt:before{content:""}.fa-tty:before{content:""}.fa-tty-answer:before{content:""}.fa-tugrik-sign:before{content:""}.fa-turkey:before{content:""}.fa-turkish-lira:before,.fa-turkish-lira-sign:before{content:""}.fa-turn-down:before{content:""}.fa-turn-down-left:before{content:""}.fa-turn-down-right:before{content:""}.fa-turn-left:before{content:""}.fa-turn-left-down:before{content:""}.fa-turn-left-up:before{content:""}.fa-turn-right:before{content:""}.fa-turn-up:before{content:""}.fa-turntable:before{content:""}.fa-turtle:before{content:""}.fa-tv:before,.fa-tv-alt:before{content:""}.fa-tv-music:before{content:""}.fa-tv-retro:before{content:""}.fa-typewriter:before{content:""}.fa-u:before{content:"U"}.fa-ufo:before{content:""}.fa-ufo-beam:before{content:""}.fa-umbrella:before{content:""}.fa-umbrella-alt:before{content:""}.fa-umbrella-beach:before{content:""}.fa-umbrella-simple:before{content:""}.fa-underline:before{content:""}.fa-undo:before{content:""}.fa-undo-alt:before{content:""}.fa-unicorn:before{content:""}.fa-uniform-martial-arts:before{content:""}.fa-union:before{content:""}.fa-universal-access:before{content:""}.fa-university:before{content:""}.fa-unlink:before{content:""}.fa-unlock:before{content:""}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:""}.fa-unsorted:before{content:""}.fa-up:before{content:""}.fa-up-down:before{content:""}.fa-up-down-left-right:before{content:""}.fa-up-from-bracket:before{content:""}.fa-up-from-dotted-line:before{content:""}.fa-up-from-line:before{content:""}.fa-up-left:before{content:""}.fa-up-long:before{content:""}.fa-up-right:before{content:""}.fa-up-right-and-down-left-from-center:before{content:""}.fa-up-right-from-square:before{content:""}.fa-up-to-bracket:before{content:""}.fa-up-to-dotted-line:before{content:""}.fa-up-to-line:before{content:""}.fa-upload:before{content:""}.fa-usb-drive:before{content:""}.fa-usd:before{content:"$"}.fa-usd-circle:before{content:""}.fa-usd-square:before{content:""}.fa-user:before{content:""}.fa-user-alien:before{content:""}.fa-user-alt:before{content:""}.fa-user-alt-slash:before{content:""}.fa-user-astronaut:before{content:""}.fa-user-beard-bolt:before{content:""}.fa-user-bounty-hunter:before{content:""}.fa-user-chart:before{content:""}.fa-user-check:before{content:""}.fa-user-chef:before{content:""}.fa-user-circle:before{content:""}.fa-user-clock:before{content:""}.fa-user-cog:before{content:""}.fa-user-construction:before{content:""}.fa-user-cowboy:before{content:""}.fa-user-crown:before{content:""}.fa-user-doctor:before{content:""}.fa-user-doctor-hair:before{content:""}.fa-user-doctor-hair-long:before{content:""}.fa-user-doctor-message:before{content:""}.fa-user-edit:before{content:""}.fa-user-friends:before{content:""}.fa-user-gear:before{content:""}.fa-user-graduate:before{content:""}.fa-user-group:before{content:""}.fa-user-group-crown:before{content:""}.fa-user-group-simple:before{content:""}.fa-user-hair:before{content:""}.fa-user-hair-buns:before{content:""}.fa-user-hair-long:before{content:""}.fa-user-hair-mullet:before{content:""}.fa-user-hard-hat:before{content:""}.fa-user-headset:before{content:""}.fa-user-helmet-safety:before{content:""}.fa-user-hoodie:before{content:""}.fa-user-injured:before{content:""}.fa-user-large:before{content:""}.fa-user-large-slash:before{content:""}.fa-user-lock:before{content:""}.fa-user-magnifying-glass:before{content:""}.fa-user-md:before{content:""}.fa-user-md-chat:before{content:""}.fa-user-minus:before{content:""}.fa-user-music:before{content:""}.fa-user-ninja:before{content:""}.fa-user-nurse:before{content:""}.fa-user-nurse-hair:before{content:""}.fa-user-nurse-hair-long:before{content:""}.fa-user-pen:before{content:""}.fa-user-pilot:before{content:""}.fa-user-pilot-tie:before{content:""}.fa-user-plus:before{content:""}.fa-user-police:before{content:""}.fa-user-police-tie:before{content:""}.fa-user-robot:before{content:""}.fa-user-robot-xmarks:before{content:""}.fa-user-secret:before{content:""}.fa-user-shakespeare:before{content:""}.fa-user-shield:before{content:""}.fa-user-slash:before{content:""}.fa-user-tag:before{content:""}.fa-user-tie:before{content:""}.fa-user-tie-hair:before{content:""}.fa-user-tie-hair-long:before{content:""}.fa-user-times:before{content:""}.fa-user-unlock:before{content:""}.fa-user-visor:before{content:""}.fa-user-vneck:before{content:""}.fa-user-vneck-hair:before{content:""}.fa-user-vneck-hair-long:before{content:""}.fa-user-xmark:before{content:""}.fa-users:before{content:""}.fa-users-between-lines:before{content:""}.fa-users-class:before{content:""}.fa-users-cog:before{content:""}.fa-users-crown:before{content:""}.fa-users-gear:before{content:""}.fa-users-line:before{content:""}.fa-users-medical:before{content:""}.fa-users-rays:before{content:""}.fa-users-rectangle:before{content:""}.fa-users-slash:before{content:""}.fa-users-viewfinder:before{content:""}.fa-utensil-fork:before{content:""}.fa-utensil-knife:before{content:""}.fa-utensil-spoon:before{content:""}.fa-utensils:before{content:""}.fa-utensils-alt:before{content:""}.fa-utensils-slash:before{content:""}.fa-utility-pole:before{content:""}.fa-utility-pole-double:before{content:""}.fa-v:before{content:"V"}.fa-vacuum:before{content:""}.fa-vacuum-robot:before{content:""}.fa-value-absolute:before{content:""}.fa-van-shuttle:before{content:""}.fa-vault:before{content:""}.fa-vcard:before{content:""}.fa-vector-circle:before{content:""}.fa-vector-polygon:before{content:""}.fa-vector-square:before{content:""}.fa-vent-damper:before{content:""}.fa-venus:before{content:""}.fa-venus-double:before{content:""}.fa-venus-mars:before{content:""}.fa-vest:before{content:""}.fa-vest-patches:before{content:""}.fa-vhs:before{content:""}.fa-vial:before{content:""}.fa-vial-circle-check:before{content:""}.fa-vial-virus:before{content:""}.fa-vials:before{content:""}.fa-video:before{content:""}.fa-video-arrow-down-left:before{content:""}.fa-video-arrow-up-right:before{content:""}.fa-video-camera:before{content:""}.fa-video-circle:before{content:""}.fa-video-handheld:before{content:""}.fa-video-plus:before{content:""}.fa-video-slash:before{content:""}.fa-vihara:before{content:""}.fa-violin:before{content:""}.fa-virus:before{content:""}.fa-virus-covid:before{content:""}.fa-virus-covid-slash:before{content:""}.fa-virus-slash:before{content:""}.fa-viruses:before{content:""}.fa-voicemail:before{content:""}.fa-volcano:before{content:""}.fa-volleyball:before,.fa-volleyball-ball:before{content:""}.fa-volume:before{content:""}.fa-volume-control-phone:before{content:""}.fa-volume-down:before{content:""}.fa-volume-high:before{content:""}.fa-volume-low:before{content:""}.fa-volume-medium:before{content:""}.fa-volume-mute:before{content:""}.fa-volume-off:before{content:""}.fa-volume-slash:before{content:""}.fa-volume-times:before{content:""}.fa-volume-up:before{content:""}.fa-volume-xmark:before{content:""}.fa-vote-nay:before{content:""}.fa-vote-yea:before{content:""}.fa-vr-cardboard:before{content:""}.fa-w:before{content:"W"}.fa-waffle:before{content:""}.fa-wagon-covered:before{content:""}.fa-walker:before{content:""}.fa-walkie-talkie:before{content:""}.fa-walking:before{content:""}.fa-wall-brick:before{content:""}.fa-wallet:before{content:""}.fa-wand:before{content:""}.fa-wand-magic:before{content:""}.fa-wand-magic-sparkles:before{content:""}.fa-wand-sparkles:before{content:""}.fa-warehouse:before{content:""}.fa-warehouse-alt:before,.fa-warehouse-full:before{content:""}.fa-warning:before{content:""}.fa-washer:before,.fa-washing-machine:before{content:""}.fa-watch:before{content:""}.fa-watch-apple:before{content:""}.fa-watch-calculator:before{content:""}.fa-watch-fitness:before{content:""}.fa-watch-smart:before{content:""}.fa-water:before{content:""}.fa-water-arrow-down:before{content:""}.fa-water-arrow-up:before{content:""}.fa-water-ladder:before{content:""}.fa-water-lower:before{content:""}.fa-water-rise:before{content:""}.fa-watermelon-slice:before{content:""}.fa-wave:before{content:""}.fa-wave-pulse:before{content:""}.fa-wave-sine:before{content:""}.fa-wave-square:before{content:""}.fa-wave-triangle:before{content:""}.fa-waveform:before{content:""}.fa-waveform-circle:before{content:""}.fa-waveform-lines:before,.fa-waveform-path:before{content:""}.fa-waves-sine:before{content:""}.fa-webcam:before{content:""}.fa-webcam-slash:before{content:""}.fa-webhook:before{content:""}.fa-weight:before{content:""}.fa-weight-hanging:before{content:""}.fa-weight-scale:before{content:""}.fa-whale:before{content:""}.fa-wheat:before{content:""}.fa-wheat-alt:before,.fa-wheat-awn:before{content:""}.fa-wheat-awn-circle-exclamation:before{content:""}.fa-wheat-awn-slash:before{content:""}.fa-wheat-slash:before{content:""}.fa-wheelchair:before{content:""}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:""}.fa-whiskey-glass:before{content:""}.fa-whiskey-glass-ice:before{content:""}.fa-whistle:before{content:""}.fa-wifi:before{content:""}.fa-wifi-1:before{content:""}.fa-wifi-2:before{content:""}.fa-wifi-3:before{content:""}.fa-wifi-exclamation:before{content:""}.fa-wifi-fair:before{content:""}.fa-wifi-slash:before{content:""}.fa-wifi-strong:before{content:""}.fa-wifi-weak:before{content:""}.fa-wind:before{content:""}.fa-wind-circle-exclamation:before{content:""}.fa-wind-turbine:before{content:""}.fa-wind-warning:before{content:""}.fa-window:before{content:""}.fa-window-alt:before{content:""}.fa-window-close:before{content:""}.fa-window-flip:before{content:""}.fa-window-frame:before{content:""}.fa-window-frame-open:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-windsock:before{content:""}.fa-wine-bottle:before{content:""}.fa-wine-glass:before{content:""}.fa-wine-glass-alt:before{content:""}.fa-wine-glass-crack:before{content:""}.fa-wine-glass-empty:before{content:""}.fa-won:before,.fa-won-sign:before{content:""}.fa-worm:before{content:""}.fa-wreath:before{content:""}.fa-wreath-laurel:before{content:""}.fa-wrench:before{content:""}.fa-wrench-simple:before{content:""}.fa-x:before{content:"X"}.fa-x-ray:before{content:""}.fa-xmark:before{content:""}.fa-xmark-circle:before{content:""}.fa-xmark-hexagon:before{content:""}.fa-xmark-large:before{content:""}.fa-xmark-octagon:before{content:""}.fa-xmark-square:before{content:""}.fa-xmark-to-slot:before{content:""}.fa-xmarks-lines:before{content:""}.fa-y:before{content:"Y"}.fa-yen:before,.fa-yen-sign:before{content:""}.fa-yin-yang:before{content:""}.fa-z:before{content:"Z"}.fa-zap:before{content:""}.fa-zzz:before{content:""}.sr-only,.fa-sr-only,.sr-only-focusable:not(:focus),.fa-sr-only-focusable:not(:focus){clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}:host{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2)format("woff2"),url(../webfonts/fa-brands-400.ttf)format("truetype")}.fab,.fa-brands{font-weight:400}.fa-monero:before{content:""}.fa-hooli:before{content:""}.fa-yelp:before{content:""}.fa-cc-visa:before{content:""}.fa-lastfm:before{content:""}.fa-shopware:before{content:""}.fa-creative-commons-nc:before{content:""}.fa-aws:before{content:""}.fa-redhat:before{content:""}.fa-yoast:before{content:""}.fa-cloudflare:before{content:""}.fa-ups:before{content:""}.fa-pixiv:before{content:""}.fa-wpexplorer:before{content:""}.fa-dyalog:before{content:""}.fa-bity:before{content:""}.fa-stackpath:before{content:""}.fa-buysellads:before{content:""}.fa-first-order:before{content:""}.fa-modx:before{content:""}.fa-guilded:before{content:""}.fa-vnv:before{content:""}.fa-square-js:before,.fa-js-square:before{content:""}.fa-microsoft:before{content:""}.fa-qq:before{content:""}.fa-orcid:before{content:""}.fa-java:before{content:""}.fa-invision:before{content:""}.fa-creative-commons-pd-alt:before{content:""}.fa-centercode:before{content:""}.fa-glide-g:before{content:""}.fa-drupal:before{content:""}.fa-jxl:before{content:""}.fa-dart-lang:before{content:""}.fa-hire-a-helper:before{content:""}.fa-creative-commons-by:before{content:""}.fa-unity:before{content:""}.fa-whmcs:before{content:""}.fa-rocketchat:before{content:""}.fa-vk:before{content:""}.fa-untappd:before{content:""}.fa-mailchimp:before{content:""}.fa-css3-alt:before{content:""}.fa-square-reddit:before,.fa-reddit-square:before{content:""}.fa-vimeo-v:before{content:""}.fa-contao:before{content:""}.fa-square-font-awesome:before{content:""}.fa-deskpro:before{content:""}.fa-brave:before{content:""}.fa-sistrix:before{content:""}.fa-square-instagram:before,.fa-instagram-square:before{content:""}.fa-battle-net:before{content:""}.fa-the-red-yeti:before{content:""}.fa-square-hacker-news:before,.fa-hacker-news-square:before{content:""}.fa-edge:before{content:""}.fa-threads:before{content:""}.fa-napster:before{content:""}.fa-square-snapchat:before,.fa-snapchat-square:before{content:""}.fa-google-plus-g:before{content:""}.fa-artstation:before{content:""}.fa-markdown:before{content:""}.fa-sourcetree:before{content:""}.fa-google-plus:before{content:""}.fa-diaspora:before{content:""}.fa-foursquare:before{content:""}.fa-stack-overflow:before{content:""}.fa-github-alt:before{content:""}.fa-phoenix-squadron:before{content:""}.fa-pagelines:before{content:""}.fa-algolia:before{content:""}.fa-red-river:before{content:""}.fa-creative-commons-sa:before{content:""}.fa-safari:before{content:""}.fa-google:before{content:""}.fa-square-font-awesome-stroke:before,.fa-font-awesome-alt:before{content:""}.fa-atlassian:before{content:""}.fa-linkedin-in:before{content:""}.fa-digital-ocean:before{content:""}.fa-nimblr:before{content:""}.fa-chromecast:before{content:""}.fa-evernote:before{content:""}.fa-hacker-news:before{content:""}.fa-creative-commons-sampling:before{content:""}.fa-adversal:before{content:""}.fa-creative-commons:before{content:""}.fa-watchman-monitoring:before{content:""}.fa-fonticons:before{content:""}.fa-weixin:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-codepen:before{content:""}.fa-git-alt:before{content:""}.fa-lyft:before{content:""}.fa-rev:before{content:""}.fa-windows:before{content:""}.fa-wizards-of-the-coast:before{content:""}.fa-square-viadeo:before,.fa-viadeo-square:before{content:""}.fa-meetup:before{content:""}.fa-centos:before{content:""}.fa-adn:before{content:""}.fa-cloudsmith:before{content:""}.fa-opensuse:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-square-dribbble:before,.fa-dribbble-square:before{content:""}.fa-codiepie:before{content:""}.fa-node:before{content:""}.fa-mix:before{content:""}.fa-steam:before{content:""}.fa-cc-apple-pay:before{content:""}.fa-scribd:before{content:""}.fa-debian:before{content:""}.fa-openid:before{content:""}.fa-instalod:before{content:""}.fa-expeditedssl:before{content:""}.fa-sellcast:before{content:""}.fa-square-twitter:before,.fa-twitter-square:before{content:""}.fa-r-project:before{content:""}.fa-delicious:before{content:""}.fa-freebsd:before{content:""}.fa-vuejs:before{content:""}.fa-accusoft:before{content:""}.fa-ioxhost:before{content:""}.fa-fonticons-fi:before{content:""}.fa-app-store:before{content:""}.fa-cc-mastercard:before{content:""}.fa-itunes-note:before{content:""}.fa-golang:before{content:""}.fa-kickstarter:before,.fa-square-kickstarter:before{content:""}.fa-grav:before{content:""}.fa-weibo:before{content:""}.fa-uncharted:before{content:""}.fa-firstdraft:before{content:""}.fa-square-youtube:before,.fa-youtube-square:before{content:""}.fa-wikipedia-w:before{content:""}.fa-wpressr:before,.fa-rendact:before{content:""}.fa-angellist:before{content:""}.fa-galactic-republic:before{content:""}.fa-nfc-directional:before{content:""}.fa-skype:before{content:""}.fa-joget:before{content:""}.fa-fedora:before{content:""}.fa-stripe-s:before{content:""}.fa-meta:before{content:""}.fa-laravel:before{content:""}.fa-hotjar:before{content:""}.fa-bluetooth-b:before{content:""}.fa-square-letterboxd:before{content:""}.fa-sticker-mule:before{content:""}.fa-creative-commons-zero:before{content:""}.fa-hips:before{content:""}.fa-behance:before{content:""}.fa-reddit:before{content:""}.fa-discord:before{content:""}.fa-chrome:before{content:""}.fa-app-store-ios:before{content:""}.fa-cc-discover:before{content:""}.fa-wpbeginner:before{content:""}.fa-confluence:before{content:""}.fa-shoelace:before{content:""}.fa-mdb:before{content:""}.fa-dochub:before{content:""}.fa-accessible-icon:before{content:""}.fa-ebay:before{content:""}.fa-amazon:before{content:""}.fa-unsplash:before{content:""}.fa-yarn:before{content:""}.fa-square-steam:before,.fa-steam-square:before{content:""}.fa-500px:before{content:""}.fa-square-vimeo:before,.fa-vimeo-square:before{content:""}.fa-asymmetrik:before{content:""}.fa-font-awesome:before,.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before{content:""}.fa-gratipay:before{content:""}.fa-apple:before{content:""}.fa-hive:before{content:""}.fa-gitkraken:before{content:""}.fa-keybase:before{content:""}.fa-apple-pay:before{content:""}.fa-padlet:before{content:""}.fa-amazon-pay:before{content:""}.fa-square-github:before,.fa-github-square:before{content:""}.fa-stumbleupon:before{content:""}.fa-fedex:before{content:""}.fa-phoenix-framework:before{content:""}.fa-shopify:before{content:""}.fa-neos:before{content:""}.fa-square-threads:before{content:""}.fa-hackerrank:before{content:""}.fa-researchgate:before{content:""}.fa-swift:before{content:""}.fa-angular:before{content:""}.fa-speakap:before{content:""}.fa-angrycreative:before{content:""}.fa-y-combinator:before{content:""}.fa-empire:before{content:""}.fa-envira:before{content:""}.fa-google-scholar:before{content:""}.fa-square-gitlab:before,.fa-gitlab-square:before{content:""}.fa-studiovinari:before{content:""}.fa-pied-piper:before{content:""}.fa-wordpress:before{content:""}.fa-product-hunt:before{content:""}.fa-firefox:before{content:""}.fa-linode:before{content:""}.fa-goodreads:before{content:""}.fa-square-odnoklassniki:before,.fa-odnoklassniki-square:before{content:""}.fa-jsfiddle:before{content:""}.fa-sith:before{content:""}.fa-themeisle:before{content:""}.fa-page4:before{content:""}.fa-hashnode:before{content:""}.fa-react:before{content:""}.fa-cc-paypal:before{content:""}.fa-squarespace:before{content:""}.fa-cc-stripe:before{content:""}.fa-creative-commons-share:before{content:""}.fa-bitcoin:before{content:""}.fa-keycdn:before{content:""}.fa-opera:before{content:""}.fa-itch-io:before{content:""}.fa-umbraco:before{content:""}.fa-galactic-senate:before{content:""}.fa-ubuntu:before{content:""}.fa-draft2digital:before{content:""}.fa-stripe:before{content:""}.fa-houzz:before{content:""}.fa-gg:before{content:""}.fa-dhl:before{content:""}.fa-square-pinterest:before,.fa-pinterest-square:before{content:""}.fa-xing:before{content:""}.fa-blackberry:before{content:""}.fa-creative-commons-pd:before{content:""}.fa-playstation:before{content:""}.fa-quinscape:before{content:""}.fa-less:before{content:""}.fa-blogger-b:before{content:""}.fa-opencart:before{content:""}.fa-vine:before{content:""}.fa-signal-messenger:before{content:""}.fa-paypal:before{content:""}.fa-gitlab:before{content:""}.fa-typo3:before{content:""}.fa-reddit-alien:before{content:""}.fa-yahoo:before{content:""}.fa-dailymotion:before{content:""}.fa-affiliatetheme:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-bootstrap:before{content:""}.fa-odnoklassniki:before{content:""}.fa-nfc-symbol:before{content:""}.fa-mintbit:before{content:""}.fa-ethereum:before{content:""}.fa-speaker-deck:before{content:""}.fa-creative-commons-nc-eu:before{content:""}.fa-patreon:before{content:""}.fa-avianex:before{content:""}.fa-ello:before{content:""}.fa-gofore:before{content:""}.fa-bimobject:before{content:""}.fa-brave-reverse:before{content:""}.fa-facebook-f:before{content:""}.fa-square-google-plus:before,.fa-google-plus-square:before{content:""}.fa-web-awesome:before{content:""}.fa-mandalorian:before{content:""}.fa-first-order-alt:before{content:""}.fa-osi:before{content:""}.fa-google-wallet:before{content:""}.fa-d-and-d-beyond:before{content:""}.fa-periscope:before{content:""}.fa-fulcrum:before{content:""}.fa-cloudscale:before{content:""}.fa-forumbee:before{content:""}.fa-mizuni:before{content:""}.fa-schlix:before{content:""}.fa-square-xing:before,.fa-xing-square:before{content:""}.fa-bandcamp:before{content:""}.fa-wpforms:before{content:""}.fa-cloudversify:before{content:""}.fa-usps:before{content:""}.fa-megaport:before{content:""}.fa-magento:before{content:""}.fa-spotify:before{content:""}.fa-optin-monster:before{content:""}.fa-fly:before{content:""}.fa-aviato:before{content:""}.fa-itunes:before{content:""}.fa-cuttlefish:before{content:""}.fa-blogger:before{content:""}.fa-flickr:before{content:""}.fa-viber:before{content:""}.fa-soundcloud:before{content:""}.fa-digg:before{content:""}.fa-tencent-weibo:before{content:""}.fa-letterboxd:before{content:""}.fa-symfony:before{content:""}.fa-maxcdn:before{content:""}.fa-etsy:before{content:""}.fa-facebook-messenger:before{content:""}.fa-audible:before{content:""}.fa-think-peaks:before{content:""}.fa-bilibili:before{content:""}.fa-erlang:before{content:""}.fa-x-twitter:before{content:""}.fa-cotton-bureau:before{content:""}.fa-dashcube:before{content:""}.fa-42-group:before,.fa-innosoft:before{content:""}.fa-stack-exchange:before{content:""}.fa-elementor:before{content:""}.fa-square-pied-piper:before,.fa-pied-piper-square:before{content:""}.fa-creative-commons-nd:before{content:""}.fa-palfed:before{content:""}.fa-superpowers:before{content:""}.fa-resolving:before{content:""}.fa-xbox:before{content:""}.fa-square-web-awesome-stroke:before{content:""}.fa-searchengin:before{content:""}.fa-tiktok:before{content:""}.fa-square-facebook:before,.fa-facebook-square:before{content:""}.fa-renren:before{content:""}.fa-linux:before{content:""}.fa-glide:before{content:""}.fa-linkedin:before{content:""}.fa-hubspot:before{content:""}.fa-deploydog:before{content:""}.fa-twitch:before{content:""}.fa-flutter:before{content:""}.fa-ravelry:before{content:""}.fa-mixer:before{content:""}.fa-square-lastfm:before,.fa-lastfm-square:before{content:""}.fa-vimeo:before{content:""}.fa-mendeley:before{content:""}.fa-uniregistry:before{content:""}.fa-figma:before{content:""}.fa-creative-commons-remix:before{content:""}.fa-cc-amazon-pay:before{content:""}.fa-dropbox:before{content:""}.fa-instagram:before{content:""}.fa-cmplid:before{content:""}.fa-upwork:before{content:""}.fa-facebook:before{content:""}.fa-gripfire:before{content:""}.fa-jedi-order:before{content:""}.fa-uikit:before{content:""}.fa-fort-awesome-alt:before{content:""}.fa-phabricator:before{content:""}.fa-ussunnah:before{content:""}.fa-earlybirds:before{content:""}.fa-trade-federation:before{content:""}.fa-autoprefixer:before{content:""}.fa-whatsapp:before{content:""}.fa-square-upwork:before{content:""}.fa-slideshare:before{content:""}.fa-google-play:before{content:""}.fa-viadeo:before{content:""}.fa-line:before{content:""}.fa-google-drive:before{content:""}.fa-servicestack:before{content:""}.fa-simplybuilt:before{content:""}.fa-bitbucket:before{content:""}.fa-imdb:before{content:""}.fa-deezer:before{content:""}.fa-raspberry-pi:before{content:""}.fa-jira:before{content:""}.fa-docker:before{content:""}.fa-screenpal:before{content:""}.fa-bluetooth:before{content:""}.fa-gitter:before{content:""}.fa-d-and-d:before{content:""}.fa-microblog:before{content:""}.fa-cc-diners-club:before{content:""}.fa-gg-circle:before{content:""}.fa-pied-piper-hat:before{content:""}.fa-kickstarter-k:before{content:""}.fa-yandex:before{content:""}.fa-readme:before{content:""}.fa-html5:before{content:""}.fa-sellsy:before{content:""}.fa-square-web-awesome:before{content:""}.fa-sass:before{content:""}.fa-wirsindhandwerk:before,.fa-wsh:before{content:""}.fa-buromobelexperte:before{content:""}.fa-salesforce:before{content:""}.fa-octopus-deploy:before{content:""}.fa-medapps:before{content:""}.fa-ns8:before{content:""}.fa-pinterest-p:before{content:""}.fa-apper:before{content:""}.fa-fort-awesome:before{content:""}.fa-waze:before{content:""}.fa-bluesky:before{content:""}.fa-cc-jcb:before{content:""}.fa-snapchat:before,.fa-snapchat-ghost:before{content:""}.fa-fantasy-flight-games:before{content:""}.fa-rust:before{content:""}.fa-wix:before{content:""}.fa-square-behance:before,.fa-behance-square:before{content:""}.fa-supple:before{content:""}.fa-webflow:before{content:""}.fa-rebel:before{content:""}.fa-css3:before{content:""}.fa-staylinked:before{content:""}.fa-kaggle:before{content:""}.fa-space-awesome:before{content:""}.fa-deviantart:before{content:""}.fa-cpanel:before{content:""}.fa-goodreads-g:before{content:""}.fa-square-git:before,.fa-git-square:before{content:""}.fa-square-tumblr:before,.fa-tumblr-square:before{content:""}.fa-trello:before{content:""}.fa-creative-commons-nc-jp:before{content:""}.fa-get-pocket:before{content:""}.fa-perbyte:before{content:""}.fa-grunt:before{content:""}.fa-weebly:before{content:""}.fa-connectdevelop:before{content:""}.fa-leanpub:before{content:""}.fa-black-tie:before{content:""}.fa-themeco:before{content:""}.fa-python:before{content:""}.fa-android:before{content:""}.fa-bots:before{content:""}.fa-free-code-camp:before{content:""}.fa-hornbill:before{content:""}.fa-js:before{content:""}.fa-ideal:before{content:""}.fa-git:before{content:""}.fa-dev:before{content:""}.fa-sketch:before{content:""}.fa-yandex-international:before{content:""}.fa-cc-amex:before{content:""}.fa-uber:before{content:""}.fa-github:before{content:""}.fa-php:before{content:""}.fa-alipay:before{content:""}.fa-youtube:before{content:""}.fa-skyatlas:before{content:""}.fa-firefox-browser:before{content:""}.fa-replyd:before{content:""}.fa-suse:before{content:""}.fa-jenkins:before{content:""}.fa-twitter:before{content:""}.fa-rockrms:before{content:""}.fa-pinterest:before{content:""}.fa-buffer:before{content:""}.fa-npm:before{content:""}.fa-yammer:before{content:""}.fa-btc:before{content:""}.fa-dribbble:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-internet-explorer:before{content:""}.fa-stubber:before{content:""}.fa-telegram:before,.fa-telegram-plane:before{content:""}.fa-old-republic:before{content:""}.fa-odysee:before{content:""}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:""}.fa-node-js:before{content:""}.fa-edge-legacy:before{content:""}.fa-slack:before,.fa-slack-hash:before{content:""}.fa-medrt:before{content:""}.fa-usb:before{content:""}.fa-tumblr:before{content:""}.fa-vaadin:before{content:""}.fa-quora:before{content:""}.fa-square-x-twitter:before{content:""}.fa-reacteurope:before{content:""}.fa-medium:before,.fa-medium-m:before{content:""}.fa-amilia:before{content:""}.fa-mixcloud:before{content:""}.fa-flipboard:before{content:""}.fa-viacoin:before{content:""}.fa-critical-role:before{content:""}.fa-sitrox:before{content:""}.fa-discourse:before{content:""}.fa-joomla:before{content:""}.fa-mastodon:before{content:""}.fa-airbnb:before{content:""}.fa-wolf-pack-battalion:before{content:""}.fa-buy-n-large:before{content:""}.fa-gulp:before{content:""}.fa-creative-commons-sampling-plus:before{content:""}.fa-strava:before{content:""}.fa-ember:before{content:""}.fa-canadian-maple-leaf:before{content:""}.fa-teamspeak:before{content:""}.fa-pushed:before{content:""}.fa-wordpress-simple:before{content:""}.fa-nutritionix:before{content:""}.fa-wodu:before{content:""}.fa-google-pay:before{content:""}.fa-intercom:before{content:""}.fa-zhihu:before{content:""}.fa-korvue:before{content:""}.fa-pix:before{content:""}.fa-steam-symbol:before{content:""}:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro"}:host{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:300;font-display:block;src:url(../webfonts/fa-light-300.woff2)format("woff2"),url(../webfonts/fa-light-300.ttf)format("truetype")}.fal,.fa-light{font-weight:300}:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Pro"}:host{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2)format("woff2"),url(../webfonts/fa-solid-900.ttf)format("truetype")}.fas,.fa-solid{font-weight:900}:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro"}:host{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:100;font-display:block;src:url(../webfonts/fa-thin-100.woff2)format("woff2"),url(../webfonts/fa-thin-100.ttf)format("truetype")}.fat,.fa-thin{font-weight:100} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/brands.css b/codewithrockstar.com/assets/fontawesome/css/brands.css new file mode 100644 index 00000000..19a5446b --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/brands.css @@ -0,0 +1,1600 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-style-family-brands: 'Font Awesome 6 Brands'; + --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; } + +@font-face { + font-family: 'Font Awesome 6 Brands'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +.fab, +.fa-brands { + font-weight: 400; } + +.fa-monero:before { + content: "\f3d0"; } + +.fa-hooli:before { + content: "\f427"; } + +.fa-yelp:before { + content: "\f1e9"; } + +.fa-cc-visa:before { + content: "\f1f0"; } + +.fa-lastfm:before { + content: "\f202"; } + +.fa-shopware:before { + content: "\f5b5"; } + +.fa-creative-commons-nc:before { + content: "\f4e8"; } + +.fa-aws:before { + content: "\f375"; } + +.fa-redhat:before { + content: "\f7bc"; } + +.fa-yoast:before { + content: "\f2b1"; } + +.fa-cloudflare:before { + content: "\e07d"; } + +.fa-ups:before { + content: "\f7e0"; } + +.fa-pixiv:before { + content: "\e640"; } + +.fa-wpexplorer:before { + content: "\f2de"; } + +.fa-dyalog:before { + content: "\f399"; } + +.fa-bity:before { + content: "\f37a"; } + +.fa-stackpath:before { + content: "\f842"; } + +.fa-buysellads:before { + content: "\f20d"; } + +.fa-first-order:before { + content: "\f2b0"; } + +.fa-modx:before { + content: "\f285"; } + +.fa-guilded:before { + content: "\e07e"; } + +.fa-vnv:before { + content: "\f40b"; } + +.fa-square-js:before { + content: "\f3b9"; } + +.fa-js-square:before { + content: "\f3b9"; } + +.fa-microsoft:before { + content: "\f3ca"; } + +.fa-qq:before { + content: "\f1d6"; } + +.fa-orcid:before { + content: "\f8d2"; } + +.fa-java:before { + content: "\f4e4"; } + +.fa-invision:before { + content: "\f7b0"; } + +.fa-creative-commons-pd-alt:before { + content: "\f4ed"; } + +.fa-centercode:before { + content: "\f380"; } + +.fa-glide-g:before { + content: "\f2a6"; } + +.fa-drupal:before { + content: "\f1a9"; } + +.fa-jxl:before { + content: "\e67b"; } + +.fa-dart-lang:before { + content: "\e693"; } + +.fa-hire-a-helper:before { + content: "\f3b0"; } + +.fa-creative-commons-by:before { + content: "\f4e7"; } + +.fa-unity:before { + content: "\e049"; } + +.fa-whmcs:before { + content: "\f40d"; } + +.fa-rocketchat:before { + content: "\f3e8"; } + +.fa-vk:before { + content: "\f189"; } + +.fa-untappd:before { + content: "\f405"; } + +.fa-mailchimp:before { + content: "\f59e"; } + +.fa-css3-alt:before { + content: "\f38b"; } + +.fa-square-reddit:before { + content: "\f1a2"; } + +.fa-reddit-square:before { + content: "\f1a2"; } + +.fa-vimeo-v:before { + content: "\f27d"; } + +.fa-contao:before { + content: "\f26d"; } + +.fa-square-font-awesome:before { + content: "\e5ad"; } + +.fa-deskpro:before { + content: "\f38f"; } + +.fa-brave:before { + content: "\e63c"; } + +.fa-sistrix:before { + content: "\f3ee"; } + +.fa-square-instagram:before { + content: "\e055"; } + +.fa-instagram-square:before { + content: "\e055"; } + +.fa-battle-net:before { + content: "\f835"; } + +.fa-the-red-yeti:before { + content: "\f69d"; } + +.fa-square-hacker-news:before { + content: "\f3af"; } + +.fa-hacker-news-square:before { + content: "\f3af"; } + +.fa-edge:before { + content: "\f282"; } + +.fa-threads:before { + content: "\e618"; } + +.fa-napster:before { + content: "\f3d2"; } + +.fa-square-snapchat:before { + content: "\f2ad"; } + +.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa-google-plus-g:before { + content: "\f0d5"; } + +.fa-artstation:before { + content: "\f77a"; } + +.fa-markdown:before { + content: "\f60f"; } + +.fa-sourcetree:before { + content: "\f7d3"; } + +.fa-google-plus:before { + content: "\f2b3"; } + +.fa-diaspora:before { + content: "\f791"; } + +.fa-foursquare:before { + content: "\f180"; } + +.fa-stack-overflow:before { + content: "\f16c"; } + +.fa-github-alt:before { + content: "\f113"; } + +.fa-phoenix-squadron:before { + content: "\f511"; } + +.fa-pagelines:before { + content: "\f18c"; } + +.fa-algolia:before { + content: "\f36c"; } + +.fa-red-river:before { + content: "\f3e3"; } + +.fa-creative-commons-sa:before { + content: "\f4ef"; } + +.fa-safari:before { + content: "\f267"; } + +.fa-google:before { + content: "\f1a0"; } + +.fa-square-font-awesome-stroke:before { + content: "\f35c"; } + +.fa-font-awesome-alt:before { + content: "\f35c"; } + +.fa-atlassian:before { + content: "\f77b"; } + +.fa-linkedin-in:before { + content: "\f0e1"; } + +.fa-digital-ocean:before { + content: "\f391"; } + +.fa-nimblr:before { + content: "\f5a8"; } + +.fa-chromecast:before { + content: "\f838"; } + +.fa-evernote:before { + content: "\f839"; } + +.fa-hacker-news:before { + content: "\f1d4"; } + +.fa-creative-commons-sampling:before { + content: "\f4f0"; } + +.fa-adversal:before { + content: "\f36a"; } + +.fa-creative-commons:before { + content: "\f25e"; } + +.fa-watchman-monitoring:before { + content: "\e087"; } + +.fa-fonticons:before { + content: "\f280"; } + +.fa-weixin:before { + content: "\f1d7"; } + +.fa-shirtsinbulk:before { + content: "\f214"; } + +.fa-codepen:before { + content: "\f1cb"; } + +.fa-git-alt:before { + content: "\f841"; } + +.fa-lyft:before { + content: "\f3c3"; } + +.fa-rev:before { + content: "\f5b2"; } + +.fa-windows:before { + content: "\f17a"; } + +.fa-wizards-of-the-coast:before { + content: "\f730"; } + +.fa-square-viadeo:before { + content: "\f2aa"; } + +.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa-meetup:before { + content: "\f2e0"; } + +.fa-centos:before { + content: "\f789"; } + +.fa-adn:before { + content: "\f170"; } + +.fa-cloudsmith:before { + content: "\f384"; } + +.fa-opensuse:before { + content: "\e62b"; } + +.fa-pied-piper-alt:before { + content: "\f1a8"; } + +.fa-square-dribbble:before { + content: "\f397"; } + +.fa-dribbble-square:before { + content: "\f397"; } + +.fa-codiepie:before { + content: "\f284"; } + +.fa-node:before { + content: "\f419"; } + +.fa-mix:before { + content: "\f3cb"; } + +.fa-steam:before { + content: "\f1b6"; } + +.fa-cc-apple-pay:before { + content: "\f416"; } + +.fa-scribd:before { + content: "\f28a"; } + +.fa-debian:before { + content: "\e60b"; } + +.fa-openid:before { + content: "\f19b"; } + +.fa-instalod:before { + content: "\e081"; } + +.fa-expeditedssl:before { + content: "\f23e"; } + +.fa-sellcast:before { + content: "\f2da"; } + +.fa-square-twitter:before { + content: "\f081"; } + +.fa-twitter-square:before { + content: "\f081"; } + +.fa-r-project:before { + content: "\f4f7"; } + +.fa-delicious:before { + content: "\f1a5"; } + +.fa-freebsd:before { + content: "\f3a4"; } + +.fa-vuejs:before { + content: "\f41f"; } + +.fa-accusoft:before { + content: "\f369"; } + +.fa-ioxhost:before { + content: "\f208"; } + +.fa-fonticons-fi:before { + content: "\f3a2"; } + +.fa-app-store:before { + content: "\f36f"; } + +.fa-cc-mastercard:before { + content: "\f1f1"; } + +.fa-itunes-note:before { + content: "\f3b5"; } + +.fa-golang:before { + content: "\e40f"; } + +.fa-kickstarter:before { + content: "\f3bb"; } + +.fa-square-kickstarter:before { + content: "\f3bb"; } + +.fa-grav:before { + content: "\f2d6"; } + +.fa-weibo:before { + content: "\f18a"; } + +.fa-uncharted:before { + content: "\e084"; } + +.fa-firstdraft:before { + content: "\f3a1"; } + +.fa-square-youtube:before { + content: "\f431"; } + +.fa-youtube-square:before { + content: "\f431"; } + +.fa-wikipedia-w:before { + content: "\f266"; } + +.fa-wpressr:before { + content: "\f3e4"; } + +.fa-rendact:before { + content: "\f3e4"; } + +.fa-angellist:before { + content: "\f209"; } + +.fa-galactic-republic:before { + content: "\f50c"; } + +.fa-nfc-directional:before { + content: "\e530"; } + +.fa-skype:before { + content: "\f17e"; } + +.fa-joget:before { + content: "\f3b7"; } + +.fa-fedora:before { + content: "\f798"; } + +.fa-stripe-s:before { + content: "\f42a"; } + +.fa-meta:before { + content: "\e49b"; } + +.fa-laravel:before { + content: "\f3bd"; } + +.fa-hotjar:before { + content: "\f3b1"; } + +.fa-bluetooth-b:before { + content: "\f294"; } + +.fa-square-letterboxd:before { + content: "\e62e"; } + +.fa-sticker-mule:before { + content: "\f3f7"; } + +.fa-creative-commons-zero:before { + content: "\f4f3"; } + +.fa-hips:before { + content: "\f452"; } + +.fa-behance:before { + content: "\f1b4"; } + +.fa-reddit:before { + content: "\f1a1"; } + +.fa-discord:before { + content: "\f392"; } + +.fa-chrome:before { + content: "\f268"; } + +.fa-app-store-ios:before { + content: "\f370"; } + +.fa-cc-discover:before { + content: "\f1f2"; } + +.fa-wpbeginner:before { + content: "\f297"; } + +.fa-confluence:before { + content: "\f78d"; } + +.fa-shoelace:before { + content: "\e60c"; } + +.fa-mdb:before { + content: "\f8ca"; } + +.fa-dochub:before { + content: "\f394"; } + +.fa-accessible-icon:before { + content: "\f368"; } + +.fa-ebay:before { + content: "\f4f4"; } + +.fa-amazon:before { + content: "\f270"; } + +.fa-unsplash:before { + content: "\e07c"; } + +.fa-yarn:before { + content: "\f7e3"; } + +.fa-square-steam:before { + content: "\f1b7"; } + +.fa-steam-square:before { + content: "\f1b7"; } + +.fa-500px:before { + content: "\f26e"; } + +.fa-square-vimeo:before { + content: "\f194"; } + +.fa-vimeo-square:before { + content: "\f194"; } + +.fa-asymmetrik:before { + content: "\f372"; } + +.fa-font-awesome:before { + content: "\f2b4"; } + +.fa-font-awesome-flag:before { + content: "\f2b4"; } + +.fa-font-awesome-logo-full:before { + content: "\f2b4"; } + +.fa-gratipay:before { + content: "\f184"; } + +.fa-apple:before { + content: "\f179"; } + +.fa-hive:before { + content: "\e07f"; } + +.fa-gitkraken:before { + content: "\f3a6"; } + +.fa-keybase:before { + content: "\f4f5"; } + +.fa-apple-pay:before { + content: "\f415"; } + +.fa-padlet:before { + content: "\e4a0"; } + +.fa-amazon-pay:before { + content: "\f42c"; } + +.fa-square-github:before { + content: "\f092"; } + +.fa-github-square:before { + content: "\f092"; } + +.fa-stumbleupon:before { + content: "\f1a4"; } + +.fa-fedex:before { + content: "\f797"; } + +.fa-phoenix-framework:before { + content: "\f3dc"; } + +.fa-shopify:before { + content: "\e057"; } + +.fa-neos:before { + content: "\f612"; } + +.fa-square-threads:before { + content: "\e619"; } + +.fa-hackerrank:before { + content: "\f5f7"; } + +.fa-researchgate:before { + content: "\f4f8"; } + +.fa-swift:before { + content: "\f8e1"; } + +.fa-angular:before { + content: "\f420"; } + +.fa-speakap:before { + content: "\f3f3"; } + +.fa-angrycreative:before { + content: "\f36e"; } + +.fa-y-combinator:before { + content: "\f23b"; } + +.fa-empire:before { + content: "\f1d1"; } + +.fa-envira:before { + content: "\f299"; } + +.fa-google-scholar:before { + content: "\e63b"; } + +.fa-square-gitlab:before { + content: "\e5ae"; } + +.fa-gitlab-square:before { + content: "\e5ae"; } + +.fa-studiovinari:before { + content: "\f3f8"; } + +.fa-pied-piper:before { + content: "\f2ae"; } + +.fa-wordpress:before { + content: "\f19a"; } + +.fa-product-hunt:before { + content: "\f288"; } + +.fa-firefox:before { + content: "\f269"; } + +.fa-linode:before { + content: "\f2b8"; } + +.fa-goodreads:before { + content: "\f3a8"; } + +.fa-square-odnoklassniki:before { + content: "\f264"; } + +.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa-jsfiddle:before { + content: "\f1cc"; } + +.fa-sith:before { + content: "\f512"; } + +.fa-themeisle:before { + content: "\f2b2"; } + +.fa-page4:before { + content: "\f3d7"; } + +.fa-hashnode:before { + content: "\e499"; } + +.fa-react:before { + content: "\f41b"; } + +.fa-cc-paypal:before { + content: "\f1f4"; } + +.fa-squarespace:before { + content: "\f5be"; } + +.fa-cc-stripe:before { + content: "\f1f5"; } + +.fa-creative-commons-share:before { + content: "\f4f2"; } + +.fa-bitcoin:before { + content: "\f379"; } + +.fa-keycdn:before { + content: "\f3ba"; } + +.fa-opera:before { + content: "\f26a"; } + +.fa-itch-io:before { + content: "\f83a"; } + +.fa-umbraco:before { + content: "\f8e8"; } + +.fa-galactic-senate:before { + content: "\f50d"; } + +.fa-ubuntu:before { + content: "\f7df"; } + +.fa-draft2digital:before { + content: "\f396"; } + +.fa-stripe:before { + content: "\f429"; } + +.fa-houzz:before { + content: "\f27c"; } + +.fa-gg:before { + content: "\f260"; } + +.fa-dhl:before { + content: "\f790"; } + +.fa-square-pinterest:before { + content: "\f0d3"; } + +.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa-xing:before { + content: "\f168"; } + +.fa-blackberry:before { + content: "\f37b"; } + +.fa-creative-commons-pd:before { + content: "\f4ec"; } + +.fa-playstation:before { + content: "\f3df"; } + +.fa-quinscape:before { + content: "\f459"; } + +.fa-less:before { + content: "\f41d"; } + +.fa-blogger-b:before { + content: "\f37d"; } + +.fa-opencart:before { + content: "\f23d"; } + +.fa-vine:before { + content: "\f1ca"; } + +.fa-signal-messenger:before { + content: "\e663"; } + +.fa-paypal:before { + content: "\f1ed"; } + +.fa-gitlab:before { + content: "\f296"; } + +.fa-typo3:before { + content: "\f42b"; } + +.fa-reddit-alien:before { + content: "\f281"; } + +.fa-yahoo:before { + content: "\f19e"; } + +.fa-dailymotion:before { + content: "\e052"; } + +.fa-affiliatetheme:before { + content: "\f36b"; } + +.fa-pied-piper-pp:before { + content: "\f1a7"; } + +.fa-bootstrap:before { + content: "\f836"; } + +.fa-odnoklassniki:before { + content: "\f263"; } + +.fa-nfc-symbol:before { + content: "\e531"; } + +.fa-mintbit:before { + content: "\e62f"; } + +.fa-ethereum:before { + content: "\f42e"; } + +.fa-speaker-deck:before { + content: "\f83c"; } + +.fa-creative-commons-nc-eu:before { + content: "\f4e9"; } + +.fa-patreon:before { + content: "\f3d9"; } + +.fa-avianex:before { + content: "\f374"; } + +.fa-ello:before { + content: "\f5f1"; } + +.fa-gofore:before { + content: "\f3a7"; } + +.fa-bimobject:before { + content: "\f378"; } + +.fa-brave-reverse:before { + content: "\e63d"; } + +.fa-facebook-f:before { + content: "\f39e"; } + +.fa-square-google-plus:before { + content: "\f0d4"; } + +.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa-web-awesome:before { + content: "\e682"; } + +.fa-mandalorian:before { + content: "\f50f"; } + +.fa-first-order-alt:before { + content: "\f50a"; } + +.fa-osi:before { + content: "\f41a"; } + +.fa-google-wallet:before { + content: "\f1ee"; } + +.fa-d-and-d-beyond:before { + content: "\f6ca"; } + +.fa-periscope:before { + content: "\f3da"; } + +.fa-fulcrum:before { + content: "\f50b"; } + +.fa-cloudscale:before { + content: "\f383"; } + +.fa-forumbee:before { + content: "\f211"; } + +.fa-mizuni:before { + content: "\f3cc"; } + +.fa-schlix:before { + content: "\f3ea"; } + +.fa-square-xing:before { + content: "\f169"; } + +.fa-xing-square:before { + content: "\f169"; } + +.fa-bandcamp:before { + content: "\f2d5"; } + +.fa-wpforms:before { + content: "\f298"; } + +.fa-cloudversify:before { + content: "\f385"; } + +.fa-usps:before { + content: "\f7e1"; } + +.fa-megaport:before { + content: "\f5a3"; } + +.fa-magento:before { + content: "\f3c4"; } + +.fa-spotify:before { + content: "\f1bc"; } + +.fa-optin-monster:before { + content: "\f23c"; } + +.fa-fly:before { + content: "\f417"; } + +.fa-aviato:before { + content: "\f421"; } + +.fa-itunes:before { + content: "\f3b4"; } + +.fa-cuttlefish:before { + content: "\f38c"; } + +.fa-blogger:before { + content: "\f37c"; } + +.fa-flickr:before { + content: "\f16e"; } + +.fa-viber:before { + content: "\f409"; } + +.fa-soundcloud:before { + content: "\f1be"; } + +.fa-digg:before { + content: "\f1a6"; } + +.fa-tencent-weibo:before { + content: "\f1d5"; } + +.fa-letterboxd:before { + content: "\e62d"; } + +.fa-symfony:before { + content: "\f83d"; } + +.fa-maxcdn:before { + content: "\f136"; } + +.fa-etsy:before { + content: "\f2d7"; } + +.fa-facebook-messenger:before { + content: "\f39f"; } + +.fa-audible:before { + content: "\f373"; } + +.fa-think-peaks:before { + content: "\f731"; } + +.fa-bilibili:before { + content: "\e3d9"; } + +.fa-erlang:before { + content: "\f39d"; } + +.fa-x-twitter:before { + content: "\e61b"; } + +.fa-cotton-bureau:before { + content: "\f89e"; } + +.fa-dashcube:before { + content: "\f210"; } + +.fa-42-group:before { + content: "\e080"; } + +.fa-innosoft:before { + content: "\e080"; } + +.fa-stack-exchange:before { + content: "\f18d"; } + +.fa-elementor:before { + content: "\f430"; } + +.fa-square-pied-piper:before { + content: "\e01e"; } + +.fa-pied-piper-square:before { + content: "\e01e"; } + +.fa-creative-commons-nd:before { + content: "\f4eb"; } + +.fa-palfed:before { + content: "\f3d8"; } + +.fa-superpowers:before { + content: "\f2dd"; } + +.fa-resolving:before { + content: "\f3e7"; } + +.fa-xbox:before { + content: "\f412"; } + +.fa-square-web-awesome-stroke:before { + content: "\e684"; } + +.fa-searchengin:before { + content: "\f3eb"; } + +.fa-tiktok:before { + content: "\e07b"; } + +.fa-square-facebook:before { + content: "\f082"; } + +.fa-facebook-square:before { + content: "\f082"; } + +.fa-renren:before { + content: "\f18b"; } + +.fa-linux:before { + content: "\f17c"; } + +.fa-glide:before { + content: "\f2a5"; } + +.fa-linkedin:before { + content: "\f08c"; } + +.fa-hubspot:before { + content: "\f3b2"; } + +.fa-deploydog:before { + content: "\f38e"; } + +.fa-twitch:before { + content: "\f1e8"; } + +.fa-flutter:before { + content: "\e694"; } + +.fa-ravelry:before { + content: "\f2d9"; } + +.fa-mixer:before { + content: "\e056"; } + +.fa-square-lastfm:before { + content: "\f203"; } + +.fa-lastfm-square:before { + content: "\f203"; } + +.fa-vimeo:before { + content: "\f40a"; } + +.fa-mendeley:before { + content: "\f7b3"; } + +.fa-uniregistry:before { + content: "\f404"; } + +.fa-figma:before { + content: "\f799"; } + +.fa-creative-commons-remix:before { + content: "\f4ee"; } + +.fa-cc-amazon-pay:before { + content: "\f42d"; } + +.fa-dropbox:before { + content: "\f16b"; } + +.fa-instagram:before { + content: "\f16d"; } + +.fa-cmplid:before { + content: "\e360"; } + +.fa-upwork:before { + content: "\e641"; } + +.fa-facebook:before { + content: "\f09a"; } + +.fa-gripfire:before { + content: "\f3ac"; } + +.fa-jedi-order:before { + content: "\f50e"; } + +.fa-uikit:before { + content: "\f403"; } + +.fa-fort-awesome-alt:before { + content: "\f3a3"; } + +.fa-phabricator:before { + content: "\f3db"; } + +.fa-ussunnah:before { + content: "\f407"; } + +.fa-earlybirds:before { + content: "\f39a"; } + +.fa-trade-federation:before { + content: "\f513"; } + +.fa-autoprefixer:before { + content: "\f41c"; } + +.fa-whatsapp:before { + content: "\f232"; } + +.fa-square-upwork:before { + content: "\e67c"; } + +.fa-slideshare:before { + content: "\f1e7"; } + +.fa-google-play:before { + content: "\f3ab"; } + +.fa-viadeo:before { + content: "\f2a9"; } + +.fa-line:before { + content: "\f3c0"; } + +.fa-google-drive:before { + content: "\f3aa"; } + +.fa-servicestack:before { + content: "\f3ec"; } + +.fa-simplybuilt:before { + content: "\f215"; } + +.fa-bitbucket:before { + content: "\f171"; } + +.fa-imdb:before { + content: "\f2d8"; } + +.fa-deezer:before { + content: "\e077"; } + +.fa-raspberry-pi:before { + content: "\f7bb"; } + +.fa-jira:before { + content: "\f7b1"; } + +.fa-docker:before { + content: "\f395"; } + +.fa-screenpal:before { + content: "\e570"; } + +.fa-bluetooth:before { + content: "\f293"; } + +.fa-gitter:before { + content: "\f426"; } + +.fa-d-and-d:before { + content: "\f38d"; } + +.fa-microblog:before { + content: "\e01a"; } + +.fa-cc-diners-club:before { + content: "\f24c"; } + +.fa-gg-circle:before { + content: "\f261"; } + +.fa-pied-piper-hat:before { + content: "\f4e5"; } + +.fa-kickstarter-k:before { + content: "\f3bc"; } + +.fa-yandex:before { + content: "\f413"; } + +.fa-readme:before { + content: "\f4d5"; } + +.fa-html5:before { + content: "\f13b"; } + +.fa-sellsy:before { + content: "\f213"; } + +.fa-square-web-awesome:before { + content: "\e683"; } + +.fa-sass:before { + content: "\f41e"; } + +.fa-wirsindhandwerk:before { + content: "\e2d0"; } + +.fa-wsh:before { + content: "\e2d0"; } + +.fa-buromobelexperte:before { + content: "\f37f"; } + +.fa-salesforce:before { + content: "\f83b"; } + +.fa-octopus-deploy:before { + content: "\e082"; } + +.fa-medapps:before { + content: "\f3c6"; } + +.fa-ns8:before { + content: "\f3d5"; } + +.fa-pinterest-p:before { + content: "\f231"; } + +.fa-apper:before { + content: "\f371"; } + +.fa-fort-awesome:before { + content: "\f286"; } + +.fa-waze:before { + content: "\f83f"; } + +.fa-bluesky:before { + content: "\e671"; } + +.fa-cc-jcb:before { + content: "\f24b"; } + +.fa-snapchat:before { + content: "\f2ab"; } + +.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa-fantasy-flight-games:before { + content: "\f6dc"; } + +.fa-rust:before { + content: "\e07a"; } + +.fa-wix:before { + content: "\f5cf"; } + +.fa-square-behance:before { + content: "\f1b5"; } + +.fa-behance-square:before { + content: "\f1b5"; } + +.fa-supple:before { + content: "\f3f9"; } + +.fa-webflow:before { + content: "\e65c"; } + +.fa-rebel:before { + content: "\f1d0"; } + +.fa-css3:before { + content: "\f13c"; } + +.fa-staylinked:before { + content: "\f3f5"; } + +.fa-kaggle:before { + content: "\f5fa"; } + +.fa-space-awesome:before { + content: "\e5ac"; } + +.fa-deviantart:before { + content: "\f1bd"; } + +.fa-cpanel:before { + content: "\f388"; } + +.fa-goodreads-g:before { + content: "\f3a9"; } + +.fa-square-git:before { + content: "\f1d2"; } + +.fa-git-square:before { + content: "\f1d2"; } + +.fa-square-tumblr:before { + content: "\f174"; } + +.fa-tumblr-square:before { + content: "\f174"; } + +.fa-trello:before { + content: "\f181"; } + +.fa-creative-commons-nc-jp:before { + content: "\f4ea"; } + +.fa-get-pocket:before { + content: "\f265"; } + +.fa-perbyte:before { + content: "\e083"; } + +.fa-grunt:before { + content: "\f3ad"; } + +.fa-weebly:before { + content: "\f5cc"; } + +.fa-connectdevelop:before { + content: "\f20e"; } + +.fa-leanpub:before { + content: "\f212"; } + +.fa-black-tie:before { + content: "\f27e"; } + +.fa-themeco:before { + content: "\f5c6"; } + +.fa-python:before { + content: "\f3e2"; } + +.fa-android:before { + content: "\f17b"; } + +.fa-bots:before { + content: "\e340"; } + +.fa-free-code-camp:before { + content: "\f2c5"; } + +.fa-hornbill:before { + content: "\f592"; } + +.fa-js:before { + content: "\f3b8"; } + +.fa-ideal:before { + content: "\e013"; } + +.fa-git:before { + content: "\f1d3"; } + +.fa-dev:before { + content: "\f6cc"; } + +.fa-sketch:before { + content: "\f7c6"; } + +.fa-yandex-international:before { + content: "\f414"; } + +.fa-cc-amex:before { + content: "\f1f3"; } + +.fa-uber:before { + content: "\f402"; } + +.fa-github:before { + content: "\f09b"; } + +.fa-php:before { + content: "\f457"; } + +.fa-alipay:before { + content: "\f642"; } + +.fa-youtube:before { + content: "\f167"; } + +.fa-skyatlas:before { + content: "\f216"; } + +.fa-firefox-browser:before { + content: "\e007"; } + +.fa-replyd:before { + content: "\f3e6"; } + +.fa-suse:before { + content: "\f7d6"; } + +.fa-jenkins:before { + content: "\f3b6"; } + +.fa-twitter:before { + content: "\f099"; } + +.fa-rockrms:before { + content: "\f3e9"; } + +.fa-pinterest:before { + content: "\f0d2"; } + +.fa-buffer:before { + content: "\f837"; } + +.fa-npm:before { + content: "\f3d4"; } + +.fa-yammer:before { + content: "\f840"; } + +.fa-btc:before { + content: "\f15a"; } + +.fa-dribbble:before { + content: "\f17d"; } + +.fa-stumbleupon-circle:before { + content: "\f1a3"; } + +.fa-internet-explorer:before { + content: "\f26b"; } + +.fa-stubber:before { + content: "\e5c7"; } + +.fa-telegram:before { + content: "\f2c6"; } + +.fa-telegram-plane:before { + content: "\f2c6"; } + +.fa-old-republic:before { + content: "\f510"; } + +.fa-odysee:before { + content: "\e5c6"; } + +.fa-square-whatsapp:before { + content: "\f40c"; } + +.fa-whatsapp-square:before { + content: "\f40c"; } + +.fa-node-js:before { + content: "\f3d3"; } + +.fa-edge-legacy:before { + content: "\e078"; } + +.fa-slack:before { + content: "\f198"; } + +.fa-slack-hash:before { + content: "\f198"; } + +.fa-medrt:before { + content: "\f3c8"; } + +.fa-usb:before { + content: "\f287"; } + +.fa-tumblr:before { + content: "\f173"; } + +.fa-vaadin:before { + content: "\f408"; } + +.fa-quora:before { + content: "\f2c4"; } + +.fa-square-x-twitter:before { + content: "\e61a"; } + +.fa-reacteurope:before { + content: "\f75d"; } + +.fa-medium:before { + content: "\f23a"; } + +.fa-medium-m:before { + content: "\f23a"; } + +.fa-amilia:before { + content: "\f36d"; } + +.fa-mixcloud:before { + content: "\f289"; } + +.fa-flipboard:before { + content: "\f44d"; } + +.fa-viacoin:before { + content: "\f237"; } + +.fa-critical-role:before { + content: "\f6c9"; } + +.fa-sitrox:before { + content: "\e44a"; } + +.fa-discourse:before { + content: "\f393"; } + +.fa-joomla:before { + content: "\f1aa"; } + +.fa-mastodon:before { + content: "\f4f6"; } + +.fa-airbnb:before { + content: "\f834"; } + +.fa-wolf-pack-battalion:before { + content: "\f514"; } + +.fa-buy-n-large:before { + content: "\f8a6"; } + +.fa-gulp:before { + content: "\f3ae"; } + +.fa-creative-commons-sampling-plus:before { + content: "\f4f1"; } + +.fa-strava:before { + content: "\f428"; } + +.fa-ember:before { + content: "\f423"; } + +.fa-canadian-maple-leaf:before { + content: "\f785"; } + +.fa-teamspeak:before { + content: "\f4f9"; } + +.fa-pushed:before { + content: "\f3e1"; } + +.fa-wordpress-simple:before { + content: "\f411"; } + +.fa-nutritionix:before { + content: "\f3d6"; } + +.fa-wodu:before { + content: "\e088"; } + +.fa-google-pay:before { + content: "\e079"; } + +.fa-intercom:before { + content: "\f7af"; } + +.fa-zhihu:before { + content: "\f63f"; } + +.fa-korvue:before { + content: "\f42f"; } + +.fa-pix:before { + content: "\e43a"; } + +.fa-steam-symbol:before { + content: "\f3f6"; } diff --git a/codewithrockstar.com/assets/fontawesome/css/brands.min.css b/codewithrockstar.com/assets/fontawesome/css/brands.min.css new file mode 100644 index 00000000..5d6181c7 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/brands.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-jxl:before{content:"\e67b"}.fa-dart-lang:before{content:"\e693"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before,.fa-square-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-web-awesome:before{content:"\e682"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-square-web-awesome-stroke:before{content:"\e684"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-flutter:before{content:"\e694"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-square-upwork:before{content:"\e67c"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-square-web-awesome:before{content:"\e683"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-bluesky:before{content:"\e671"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/fontawesome.css b/codewithrockstar.com/assets/fontawesome/css/fontawesome.css new file mode 100644 index 00000000..01e2539e --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/fontawesome.css @@ -0,0 +1,4686 @@ +.fa { + font-family: var(--fa-style-family, "Font Awesome 6 Pro"); + font-weight: var(--fa-style, 900); } + +.fa-solid, +.fa-regular, +.fa-brands, +.fas, +.far, +.fab, +.fal, +.fat, +.fad, +.fass, +.fasr, +.fasl, +.fast, +.fasds, +.fa-light, +.fa-thin, +.fa-duotone, +.fa-sharp, +.fa-sharp-duotone, +.fa-sharp-solid, +.fa-classic, +.fa { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: var(--fa-display, inline-block); + font-style: normal; + font-variant: normal; + line-height: 1; + text-rendering: auto; } + +.fas, +.far, +.fal, +.fat, +.fa-solid, +.fa-regular, +.fa-light, +.fa-thin, +.fa-classic { + font-family: 'Font Awesome 6 Pro'; } + +.fab, +.fa-brands { + font-family: 'Font Awesome 6 Brands'; } + +.fad, +.fa-classic.fa-duotone, +.fa-duotone { + font-family: 'Font Awesome 6 Duotone'; } + +.fasds, +.fa-sharp-duotone { + font-family: 'Font Awesome 6 Sharp Duotone'; } + +.fasds, +.fa-sharp-duotone { + font-weight: 900; } + +.fass, +.fasr, +.fasl, +.fast, +.fa-sharp { + font-family: 'Font Awesome 6 Sharp'; } + +.fass, +.fa-sharp { + font-weight: 900; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; } + +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; } + +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; } + +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; } + +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; } + +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: calc(-1 * var(--fa-li-width, 2em)); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; } + +.fa-border { + border-color: var(--fa-border-color, #eee); + border-radius: var(--fa-border-radius, 0.1em); + border-style: var(--fa-border-style, solid); + border-width: var(--fa-border-width, 0.08em); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } + +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); } + +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); } + +.fa-beat { + animation-name: fa-beat; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-bounce { + animation-name: fa-bounce; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } + +.fa-fade { + animation-name: fa-fade; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-beat-fade { + animation-name: fa-beat-fade; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-flip { + animation-name: fa-flip; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-shake { + animation-name: fa-shake; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin { + animation-name: fa-spin; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 2s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin-reverse { + --fa-animation-direction: reverse; } + +.fa-pulse, +.fa-spin-pulse { + animation-name: fa-spin; + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, steps(8)); } + +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-bounce, + .fa-fade, + .fa-beat-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + animation-delay: -1ms; + animation-duration: 1ms; + animation-iteration-count: 1; + transition-delay: 0s; + transition-duration: 0s; } } + +@keyframes fa-beat { + 0%, 90% { + transform: scale(1); } + 45% { + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@keyframes fa-bounce { + 0% { + transform: scale(1, 1) translateY(0); } + 10% { + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + transform: scale(1, 1) translateY(0); } + 100% { + transform: scale(1, 1) translateY(0); } } + +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + transform: scale(1); } + 50% { + opacity: 1; + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@keyframes fa-flip { + 50% { + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@keyframes fa-shake { + 0% { + transform: rotate(-15deg); } + 4% { + transform: rotate(15deg); } + 8%, 24% { + transform: rotate(-18deg); } + 12%, 28% { + transform: rotate(18deg); } + 16% { + transform: rotate(-22deg); } + 20% { + transform: rotate(22deg); } + 32% { + transform: rotate(-12deg); } + 36% { + transform: rotate(12deg); } + 40%, 100% { + transform: rotate(0deg); } } + +@keyframes fa-spin { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(360deg); } } + +.fa-rotate-90 { + transform: rotate(90deg); } + +.fa-rotate-180 { + transform: rotate(180deg); } + +.fa-rotate-270 { + transform: rotate(270deg); } + +.fa-flip-horizontal { + transform: scale(-1, 1); } + +.fa-flip-vertical { + transform: scale(1, -1); } + +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + transform: scale(-1, -1); } + +.fa-rotate-by { + transform: rotate(var(--fa-rotate-angle, 0)); } + +.fa-stack { + display: inline-block; + height: 2em; + line-height: 2em; + position: relative; + vertical-align: middle; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + left: 0; + position: absolute; + text-align: center; + width: 100%; + z-index: var(--fa-stack-z-index, auto); } + +.fa-stack-1x { + line-height: inherit; } + +.fa-stack-2x { + font-size: 2em; } + +.fa-inverse { + color: var(--fa-inverse, #fff); } + +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen +readers do not read off random characters that represent icons */ +.fa-0::before { content: "\30"; } +.fa-00::before { content: "\e467"; } +.fa-1::before { content: "\31"; } +.fa-100::before { content: "\e41c"; } +.fa-2::before { content: "\32"; } +.fa-3::before { content: "\33"; } +.fa-360-degrees::before { content: "\e2dc"; } +.fa-4::before { content: "\34"; } +.fa-5::before { content: "\35"; } +.fa-6::before { content: "\36"; } +.fa-7::before { content: "\37"; } +.fa-8::before { content: "\38"; } +.fa-9::before { content: "\39"; } +.fa-a::before { content: "\41"; } +.fa-abacus::before { content: "\f640"; } +.fa-accent-grave::before { content: "\60"; } +.fa-acorn::before { content: "\f6ae"; } +.fa-ad::before { content: "\f641"; } +.fa-add::before { content: "\2b"; } +.fa-address-book::before { content: "\f2b9"; } +.fa-address-card::before { content: "\f2bb"; } +.fa-adjust::before { content: "\f042"; } +.fa-air-conditioner::before { content: "\f8f4"; } +.fa-air-freshener::before { content: "\f5d0"; } +.fa-airplay::before { content: "\e089"; } +.fa-alarm-clock::before { content: "\f34e"; } +.fa-alarm-exclamation::before { content: "\f843"; } +.fa-alarm-plus::before { content: "\f844"; } +.fa-alarm-snooze::before { content: "\f845"; } +.fa-album::before { content: "\f89f"; } +.fa-album-circle-plus::before { content: "\e48c"; } +.fa-album-circle-user::before { content: "\e48d"; } +.fa-album-collection::before { content: "\f8a0"; } +.fa-album-collection-circle-plus::before { content: "\e48e"; } +.fa-album-collection-circle-user::before { content: "\e48f"; } +.fa-alicorn::before { content: "\f6b0"; } +.fa-alien::before { content: "\f8f5"; } +.fa-alien-8bit::before { content: "\f8f6"; } +.fa-alien-monster::before { content: "\f8f6"; } +.fa-align-center::before { content: "\f037"; } +.fa-align-justify::before { content: "\f039"; } +.fa-align-left::before { content: "\f036"; } +.fa-align-right::before { content: "\f038"; } +.fa-align-slash::before { content: "\f846"; } +.fa-allergies::before { content: "\f461"; } +.fa-alt::before { content: "\e08a"; } +.fa-ambulance::before { content: "\f0f9"; } +.fa-american-sign-language-interpreting::before { content: "\f2a3"; } +.fa-amp-guitar::before { content: "\f8a1"; } +.fa-ampersand::before { content: "\26"; } +.fa-analytics::before { content: "\f643"; } +.fa-anchor::before { content: "\f13d"; } +.fa-anchor-circle-check::before { content: "\e4aa"; } +.fa-anchor-circle-exclamation::before { content: "\e4ab"; } +.fa-anchor-circle-xmark::before { content: "\e4ac"; } +.fa-anchor-lock::before { content: "\e4ad"; } +.fa-angel::before { content: "\f779"; } +.fa-angle::before { content: "\e08c"; } +.fa-angle-90::before { content: "\e08d"; } +.fa-angle-double-down::before { content: "\f103"; } +.fa-angle-double-left::before { content: "\f100"; } +.fa-angle-double-right::before { content: "\f101"; } +.fa-angle-double-up::before { content: "\f102"; } +.fa-angle-down::before { content: "\f107"; } +.fa-angle-left::before { content: "\f104"; } +.fa-angle-right::before { content: "\f105"; } +.fa-angle-up::before { content: "\f106"; } +.fa-angles-down::before { content: "\f103"; } +.fa-angles-left::before { content: "\f100"; } +.fa-angles-right::before { content: "\f101"; } +.fa-angles-up::before { content: "\f102"; } +.fa-angles-up-down::before { content: "\e60d"; } +.fa-angry::before { content: "\f556"; } +.fa-ankh::before { content: "\f644"; } +.fa-ant::before { content: "\e680"; } +.fa-apartment::before { content: "\e468"; } +.fa-aperture::before { content: "\e2df"; } +.fa-apostrophe::before { content: "\27"; } +.fa-apple-alt::before { content: "\f5d1"; } +.fa-apple-core::before { content: "\e08f"; } +.fa-apple-crate::before { content: "\f6b1"; } +.fa-apple-whole::before { content: "\f5d1"; } +.fa-archive::before { content: "\f187"; } +.fa-archway::before { content: "\f557"; } +.fa-area-chart::before { content: "\f1fe"; } +.fa-arrow-alt-circle-down::before { content: "\f358"; } +.fa-arrow-alt-circle-left::before { content: "\f359"; } +.fa-arrow-alt-circle-right::before { content: "\f35a"; } +.fa-arrow-alt-circle-up::before { content: "\f35b"; } +.fa-arrow-alt-down::before { content: "\f354"; } +.fa-arrow-alt-from-bottom::before { content: "\f346"; } +.fa-arrow-alt-from-left::before { content: "\f347"; } +.fa-arrow-alt-from-right::before { content: "\f348"; } +.fa-arrow-alt-from-top::before { content: "\f349"; } +.fa-arrow-alt-left::before { content: "\f355"; } +.fa-arrow-alt-right::before { content: "\f356"; } +.fa-arrow-alt-square-down::before { content: "\f350"; } +.fa-arrow-alt-square-left::before { content: "\f351"; } +.fa-arrow-alt-square-right::before { content: "\f352"; } +.fa-arrow-alt-square-up::before { content: "\f353"; } +.fa-arrow-alt-to-bottom::before { content: "\f34a"; } +.fa-arrow-alt-to-left::before { content: "\f34b"; } +.fa-arrow-alt-to-right::before { content: "\f34c"; } +.fa-arrow-alt-to-top::before { content: "\f34d"; } +.fa-arrow-alt-up::before { content: "\f357"; } +.fa-arrow-circle-down::before { content: "\f0ab"; } +.fa-arrow-circle-left::before { content: "\f0a8"; } +.fa-arrow-circle-right::before { content: "\f0a9"; } +.fa-arrow-circle-up::before { content: "\f0aa"; } +.fa-arrow-down::before { content: "\f063"; } +.fa-arrow-down-1-9::before { content: "\f162"; } +.fa-arrow-down-9-1::before { content: "\f886"; } +.fa-arrow-down-a-z::before { content: "\f15d"; } +.fa-arrow-down-arrow-up::before { content: "\f883"; } +.fa-arrow-down-big-small::before { content: "\f88c"; } +.fa-arrow-down-from-arc::before { content: "\e614"; } +.fa-arrow-down-from-bracket::before { content: "\e667"; } +.fa-arrow-down-from-dotted-line::before { content: "\e090"; } +.fa-arrow-down-from-line::before { content: "\f345"; } +.fa-arrow-down-left::before { content: "\e091"; } +.fa-arrow-down-left-and-arrow-up-right-to-center::before { content: "\e092"; } +.fa-arrow-down-long::before { content: "\f175"; } +.fa-arrow-down-right::before { content: "\e093"; } +.fa-arrow-down-short-wide::before { content: "\f884"; } +.fa-arrow-down-small-big::before { content: "\f88d"; } +.fa-arrow-down-square-triangle::before { content: "\f889"; } +.fa-arrow-down-to-arc::before { content: "\e4ae"; } +.fa-arrow-down-to-bracket::before { content: "\e094"; } +.fa-arrow-down-to-dotted-line::before { content: "\e095"; } +.fa-arrow-down-to-line::before { content: "\f33d"; } +.fa-arrow-down-to-square::before { content: "\e096"; } +.fa-arrow-down-triangle-square::before { content: "\f888"; } +.fa-arrow-down-up-across-line::before { content: "\e4af"; } +.fa-arrow-down-up-lock::before { content: "\e4b0"; } +.fa-arrow-down-wide-short::before { content: "\f160"; } +.fa-arrow-down-z-a::before { content: "\f881"; } +.fa-arrow-from-bottom::before { content: "\f342"; } +.fa-arrow-from-left::before { content: "\f343"; } +.fa-arrow-from-right::before { content: "\f344"; } +.fa-arrow-from-top::before { content: "\f345"; } +.fa-arrow-left::before { content: "\f060"; } +.fa-arrow-left-from-arc::before { content: "\e615"; } +.fa-arrow-left-from-bracket::before { content: "\e668"; } +.fa-arrow-left-from-line::before { content: "\f344"; } +.fa-arrow-left-long::before { content: "\f177"; } +.fa-arrow-left-long-to-line::before { content: "\e3d4"; } +.fa-arrow-left-rotate::before { content: "\f0e2"; } +.fa-arrow-left-to-arc::before { content: "\e616"; } +.fa-arrow-left-to-bracket::before { content: "\e669"; } +.fa-arrow-left-to-line::before { content: "\f33e"; } +.fa-arrow-pointer::before { content: "\f245"; } +.fa-arrow-progress::before { content: "\e5df"; } +.fa-arrow-right::before { content: "\f061"; } +.fa-arrow-right-arrow-left::before { content: "\f0ec"; } +.fa-arrow-right-from-arc::before { content: "\e4b1"; } +.fa-arrow-right-from-bracket::before { content: "\f08b"; } +.fa-arrow-right-from-file::before { content: "\f56e"; } +.fa-arrow-right-from-line::before { content: "\f343"; } +.fa-arrow-right-long::before { content: "\f178"; } +.fa-arrow-right-long-to-line::before { content: "\e3d5"; } +.fa-arrow-right-rotate::before { content: "\f01e"; } +.fa-arrow-right-to-arc::before { content: "\e4b2"; } +.fa-arrow-right-to-bracket::before { content: "\f090"; } +.fa-arrow-right-to-city::before { content: "\e4b3"; } +.fa-arrow-right-to-file::before { content: "\f56f"; } +.fa-arrow-right-to-line::before { content: "\f340"; } +.fa-arrow-rotate-back::before { content: "\f0e2"; } +.fa-arrow-rotate-backward::before { content: "\f0e2"; } +.fa-arrow-rotate-forward::before { content: "\f01e"; } +.fa-arrow-rotate-left::before { content: "\f0e2"; } +.fa-arrow-rotate-right::before { content: "\f01e"; } +.fa-arrow-square-down::before { content: "\f339"; } +.fa-arrow-square-left::before { content: "\f33a"; } +.fa-arrow-square-right::before { content: "\f33b"; } +.fa-arrow-square-up::before { content: "\f33c"; } +.fa-arrow-to-bottom::before { content: "\f33d"; } +.fa-arrow-to-left::before { content: "\f33e"; } +.fa-arrow-to-right::before { content: "\f340"; } +.fa-arrow-to-top::before { content: "\f341"; } +.fa-arrow-trend-down::before { content: "\e097"; } +.fa-arrow-trend-up::before { content: "\e098"; } +.fa-arrow-turn-down::before { content: "\f149"; } +.fa-arrow-turn-down-left::before { content: "\e2e1"; } +.fa-arrow-turn-down-right::before { content: "\e3d6"; } +.fa-arrow-turn-left::before { content: "\e632"; } +.fa-arrow-turn-left-down::before { content: "\e633"; } +.fa-arrow-turn-left-up::before { content: "\e634"; } +.fa-arrow-turn-right::before { content: "\e635"; } +.fa-arrow-turn-up::before { content: "\f148"; } +.fa-arrow-up::before { content: "\f062"; } +.fa-arrow-up-1-9::before { content: "\f163"; } +.fa-arrow-up-9-1::before { content: "\f887"; } +.fa-arrow-up-a-z::before { content: "\f15e"; } +.fa-arrow-up-arrow-down::before { content: "\e099"; } +.fa-arrow-up-big-small::before { content: "\f88e"; } +.fa-arrow-up-from-arc::before { content: "\e4b4"; } +.fa-arrow-up-from-bracket::before { content: "\e09a"; } +.fa-arrow-up-from-dotted-line::before { content: "\e09b"; } +.fa-arrow-up-from-ground-water::before { content: "\e4b5"; } +.fa-arrow-up-from-line::before { content: "\f342"; } +.fa-arrow-up-from-square::before { content: "\e09c"; } +.fa-arrow-up-from-water-pump::before { content: "\e4b6"; } +.fa-arrow-up-left::before { content: "\e09d"; } +.fa-arrow-up-left-from-circle::before { content: "\e09e"; } +.fa-arrow-up-long::before { content: "\f176"; } +.fa-arrow-up-right::before { content: "\e09f"; } +.fa-arrow-up-right-and-arrow-down-left-from-center::before { content: "\e0a0"; } +.fa-arrow-up-right-dots::before { content: "\e4b7"; } +.fa-arrow-up-right-from-square::before { content: "\f08e"; } +.fa-arrow-up-short-wide::before { content: "\f885"; } +.fa-arrow-up-small-big::before { content: "\f88f"; } +.fa-arrow-up-square-triangle::before { content: "\f88b"; } +.fa-arrow-up-to-arc::before { content: "\e617"; } +.fa-arrow-up-to-bracket::before { content: "\e66a"; } +.fa-arrow-up-to-dotted-line::before { content: "\e0a1"; } +.fa-arrow-up-to-line::before { content: "\f341"; } +.fa-arrow-up-triangle-square::before { content: "\f88a"; } +.fa-arrow-up-wide-short::before { content: "\f161"; } +.fa-arrow-up-z-a::before { content: "\f882"; } +.fa-arrows::before { content: "\f047"; } +.fa-arrows-alt::before { content: "\f0b2"; } +.fa-arrows-alt-h::before { content: "\f337"; } +.fa-arrows-alt-v::before { content: "\f338"; } +.fa-arrows-cross::before { content: "\e0a2"; } +.fa-arrows-down-to-line::before { content: "\e4b8"; } +.fa-arrows-down-to-people::before { content: "\e4b9"; } +.fa-arrows-from-dotted-line::before { content: "\e0a3"; } +.fa-arrows-from-line::before { content: "\e0a4"; } +.fa-arrows-h::before { content: "\f07e"; } +.fa-arrows-left-right::before { content: "\f07e"; } +.fa-arrows-left-right-to-line::before { content: "\e4ba"; } +.fa-arrows-maximize::before { content: "\f31d"; } +.fa-arrows-minimize::before { content: "\e0a5"; } +.fa-arrows-repeat::before { content: "\f364"; } +.fa-arrows-repeat-1::before { content: "\f366"; } +.fa-arrows-retweet::before { content: "\f361"; } +.fa-arrows-rotate::before { content: "\f021"; } +.fa-arrows-rotate-reverse::before { content: "\e630"; } +.fa-arrows-spin::before { content: "\e4bb"; } +.fa-arrows-split-up-and-left::before { content: "\e4bc"; } +.fa-arrows-to-circle::before { content: "\e4bd"; } +.fa-arrows-to-dot::before { content: "\e4be"; } +.fa-arrows-to-dotted-line::before { content: "\e0a6"; } +.fa-arrows-to-eye::before { content: "\e4bf"; } +.fa-arrows-to-line::before { content: "\e0a7"; } +.fa-arrows-turn-right::before { content: "\e4c0"; } +.fa-arrows-turn-to-dots::before { content: "\e4c1"; } +.fa-arrows-up-down::before { content: "\f07d"; } +.fa-arrows-up-down-left-right::before { content: "\f047"; } +.fa-arrows-up-to-line::before { content: "\e4c2"; } +.fa-arrows-v::before { content: "\f07d"; } +.fa-asl-interpreting::before { content: "\f2a3"; } +.fa-assistive-listening-systems::before { content: "\f2a2"; } +.fa-asterisk::before { content: "\2a"; } +.fa-at::before { content: "\40"; } +.fa-atlas::before { content: "\f558"; } +.fa-atom::before { content: "\f5d2"; } +.fa-atom-alt::before { content: "\f5d3"; } +.fa-atom-simple::before { content: "\f5d3"; } +.fa-audio-description::before { content: "\f29e"; } +.fa-audio-description-slash::before { content: "\e0a8"; } +.fa-austral-sign::before { content: "\e0a9"; } +.fa-automobile::before { content: "\f1b9"; } +.fa-avocado::before { content: "\e0aa"; } +.fa-award::before { content: "\f559"; } +.fa-award-simple::before { content: "\e0ab"; } +.fa-axe::before { content: "\f6b2"; } +.fa-axe-battle::before { content: "\f6b3"; } +.fa-b::before { content: "\42"; } +.fa-baby::before { content: "\f77c"; } +.fa-baby-carriage::before { content: "\f77d"; } +.fa-backpack::before { content: "\f5d4"; } +.fa-backspace::before { content: "\f55a"; } +.fa-backward::before { content: "\f04a"; } +.fa-backward-fast::before { content: "\f049"; } +.fa-backward-step::before { content: "\f048"; } +.fa-bacon::before { content: "\f7e5"; } +.fa-bacteria::before { content: "\e059"; } +.fa-bacterium::before { content: "\e05a"; } +.fa-badge::before { content: "\f335"; } +.fa-badge-check::before { content: "\f336"; } +.fa-badge-dollar::before { content: "\f645"; } +.fa-badge-percent::before { content: "\f646"; } +.fa-badge-sheriff::before { content: "\f8a2"; } +.fa-badger-honey::before { content: "\f6b4"; } +.fa-badminton::before { content: "\e33a"; } +.fa-bag-seedling::before { content: "\e5f2"; } +.fa-bag-shopping::before { content: "\f290"; } +.fa-bag-shopping-minus::before { content: "\e650"; } +.fa-bag-shopping-plus::before { content: "\e651"; } +.fa-bagel::before { content: "\e3d7"; } +.fa-bags-shopping::before { content: "\f847"; } +.fa-baguette::before { content: "\e3d8"; } +.fa-bahai::before { content: "\f666"; } +.fa-baht-sign::before { content: "\e0ac"; } +.fa-balance-scale::before { content: "\f24e"; } +.fa-balance-scale-left::before { content: "\f515"; } +.fa-balance-scale-right::before { content: "\f516"; } +.fa-ball-pile::before { content: "\f77e"; } +.fa-balloon::before { content: "\e2e3"; } +.fa-balloons::before { content: "\e2e4"; } +.fa-ballot::before { content: "\f732"; } +.fa-ballot-check::before { content: "\f733"; } +.fa-ban::before { content: "\f05e"; } +.fa-ban-bug::before { content: "\f7f9"; } +.fa-ban-parking::before { content: "\f616"; } +.fa-ban-smoking::before { content: "\f54d"; } +.fa-banana::before { content: "\e2e5"; } +.fa-band-aid::before { content: "\f462"; } +.fa-bandage::before { content: "\f462"; } +.fa-bangladeshi-taka-sign::before { content: "\e2e6"; } +.fa-banjo::before { content: "\f8a3"; } +.fa-bank::before { content: "\f19c"; } +.fa-bar-chart::before { content: "\f080"; } +.fa-barcode::before { content: "\f02a"; } +.fa-barcode-alt::before { content: "\f463"; } +.fa-barcode-read::before { content: "\f464"; } +.fa-barcode-scan::before { content: "\f465"; } +.fa-barn-silo::before { content: "\f864"; } +.fa-bars::before { content: "\f0c9"; } +.fa-bars-filter::before { content: "\e0ad"; } +.fa-bars-progress::before { content: "\f828"; } +.fa-bars-sort::before { content: "\e0ae"; } +.fa-bars-staggered::before { content: "\f550"; } +.fa-baseball::before { content: "\f433"; } +.fa-baseball-ball::before { content: "\f433"; } +.fa-baseball-bat-ball::before { content: "\f432"; } +.fa-basket-shopping::before { content: "\f291"; } +.fa-basket-shopping-minus::before { content: "\e652"; } +.fa-basket-shopping-plus::before { content: "\e653"; } +.fa-basket-shopping-simple::before { content: "\e0af"; } +.fa-basketball::before { content: "\f434"; } +.fa-basketball-ball::before { content: "\f434"; } +.fa-basketball-hoop::before { content: "\f435"; } +.fa-bat::before { content: "\f6b5"; } +.fa-bath::before { content: "\f2cd"; } +.fa-bathtub::before { content: "\f2cd"; } +.fa-battery::before { content: "\f240"; } +.fa-battery-0::before { content: "\f244"; } +.fa-battery-1::before { content: "\e0b1"; } +.fa-battery-2::before { content: "\f243"; } +.fa-battery-3::before { content: "\f242"; } +.fa-battery-4::before { content: "\f241"; } +.fa-battery-5::before { content: "\f240"; } +.fa-battery-bolt::before { content: "\f376"; } +.fa-battery-car::before { content: "\f5df"; } +.fa-battery-empty::before { content: "\f244"; } +.fa-battery-exclamation::before { content: "\e0b0"; } +.fa-battery-full::before { content: "\f240"; } +.fa-battery-half::before { content: "\f242"; } +.fa-battery-low::before { content: "\e0b1"; } +.fa-battery-quarter::before { content: "\f243"; } +.fa-battery-slash::before { content: "\f377"; } +.fa-battery-three-quarters::before { content: "\f241"; } +.fa-bed::before { content: "\f236"; } +.fa-bed-alt::before { content: "\f8f7"; } +.fa-bed-bunk::before { content: "\f8f8"; } +.fa-bed-empty::before { content: "\f8f9"; } +.fa-bed-front::before { content: "\f8f7"; } +.fa-bed-pulse::before { content: "\f487"; } +.fa-bee::before { content: "\e0b2"; } +.fa-beer::before { content: "\f0fc"; } +.fa-beer-foam::before { content: "\e0b3"; } +.fa-beer-mug::before { content: "\e0b3"; } +.fa-beer-mug-empty::before { content: "\f0fc"; } +.fa-bell::before { content: "\f0f3"; } +.fa-bell-concierge::before { content: "\f562"; } +.fa-bell-exclamation::before { content: "\f848"; } +.fa-bell-on::before { content: "\f8fa"; } +.fa-bell-plus::before { content: "\f849"; } +.fa-bell-ring::before { content: "\e62c"; } +.fa-bell-school::before { content: "\f5d5"; } +.fa-bell-school-slash::before { content: "\f5d6"; } +.fa-bell-slash::before { content: "\f1f6"; } +.fa-bells::before { content: "\f77f"; } +.fa-bench-tree::before { content: "\e2e7"; } +.fa-betamax::before { content: "\f8a4"; } +.fa-bezier-curve::before { content: "\f55b"; } +.fa-bible::before { content: "\f647"; } +.fa-bicycle::before { content: "\f206"; } +.fa-biking::before { content: "\f84a"; } +.fa-biking-mountain::before { content: "\f84b"; } +.fa-billboard::before { content: "\e5cd"; } +.fa-bin-bottles::before { content: "\e5f5"; } +.fa-bin-bottles-recycle::before { content: "\e5f6"; } +.fa-bin-recycle::before { content: "\e5f7"; } +.fa-binary::before { content: "\e33b"; } +.fa-binary-circle-check::before { content: "\e33c"; } +.fa-binary-lock::before { content: "\e33d"; } +.fa-binary-slash::before { content: "\e33e"; } +.fa-binoculars::before { content: "\f1e5"; } +.fa-biohazard::before { content: "\f780"; } +.fa-bird::before { content: "\e469"; } +.fa-birthday-cake::before { content: "\f1fd"; } +.fa-bitcoin-sign::before { content: "\e0b4"; } +.fa-blackboard::before { content: "\f51b"; } +.fa-blanket::before { content: "\f498"; } +.fa-blanket-fire::before { content: "\e3da"; } +.fa-blender::before { content: "\f517"; } +.fa-blender-phone::before { content: "\f6b6"; } +.fa-blind::before { content: "\f29d"; } +.fa-blinds::before { content: "\f8fb"; } +.fa-blinds-open::before { content: "\f8fc"; } +.fa-blinds-raised::before { content: "\f8fd"; } +.fa-block::before { content: "\e46a"; } +.fa-block-brick::before { content: "\e3db"; } +.fa-block-brick-fire::before { content: "\e3dc"; } +.fa-block-question::before { content: "\e3dd"; } +.fa-block-quote::before { content: "\e0b5"; } +.fa-blog::before { content: "\f781"; } +.fa-blueberries::before { content: "\e2e8"; } +.fa-bluetooth::before { content: "\f293"; } +.fa-bold::before { content: "\f032"; } +.fa-bolt::before { content: "\f0e7"; } +.fa-bolt-auto::before { content: "\e0b6"; } +.fa-bolt-lightning::before { content: "\e0b7"; } +.fa-bolt-slash::before { content: "\e0b8"; } +.fa-bomb::before { content: "\f1e2"; } +.fa-bone::before { content: "\f5d7"; } +.fa-bone-break::before { content: "\f5d8"; } +.fa-bong::before { content: "\f55c"; } +.fa-book::before { content: "\f02d"; } +.fa-book-alt::before { content: "\f5d9"; } +.fa-book-arrow-right::before { content: "\e0b9"; } +.fa-book-arrow-up::before { content: "\e0ba"; } +.fa-book-atlas::before { content: "\f558"; } +.fa-book-bible::before { content: "\f647"; } +.fa-book-blank::before { content: "\f5d9"; } +.fa-book-bookmark::before { content: "\e0bb"; } +.fa-book-circle::before { content: "\e0ff"; } +.fa-book-circle-arrow-right::before { content: "\e0bc"; } +.fa-book-circle-arrow-up::before { content: "\e0bd"; } +.fa-book-copy::before { content: "\e0be"; } +.fa-book-dead::before { content: "\f6b7"; } +.fa-book-font::before { content: "\e0bf"; } +.fa-book-heart::before { content: "\f499"; } +.fa-book-journal-whills::before { content: "\f66a"; } +.fa-book-law::before { content: "\e0c1"; } +.fa-book-medical::before { content: "\f7e6"; } +.fa-book-open::before { content: "\f518"; } +.fa-book-open-alt::before { content: "\e0c0"; } +.fa-book-open-cover::before { content: "\e0c0"; } +.fa-book-open-reader::before { content: "\f5da"; } +.fa-book-quran::before { content: "\f687"; } +.fa-book-reader::before { content: "\f5da"; } +.fa-book-section::before { content: "\e0c1"; } +.fa-book-skull::before { content: "\f6b7"; } +.fa-book-sparkles::before { content: "\f6b8"; } +.fa-book-spells::before { content: "\f6b8"; } +.fa-book-tanakh::before { content: "\f827"; } +.fa-book-user::before { content: "\f7e7"; } +.fa-bookmark::before { content: "\f02e"; } +.fa-bookmark-circle::before { content: "\e100"; } +.fa-bookmark-slash::before { content: "\e0c2"; } +.fa-books::before { content: "\f5db"; } +.fa-books-medical::before { content: "\f7e8"; } +.fa-boombox::before { content: "\f8a5"; } +.fa-boot::before { content: "\f782"; } +.fa-boot-heeled::before { content: "\e33f"; } +.fa-booth-curtain::before { content: "\f734"; } +.fa-border-all::before { content: "\f84c"; } +.fa-border-bottom::before { content: "\f84d"; } +.fa-border-bottom-right::before { content: "\f854"; } +.fa-border-center-h::before { content: "\f89c"; } +.fa-border-center-v::before { content: "\f89d"; } +.fa-border-inner::before { content: "\f84e"; } +.fa-border-left::before { content: "\f84f"; } +.fa-border-none::before { content: "\f850"; } +.fa-border-outer::before { content: "\f851"; } +.fa-border-right::before { content: "\f852"; } +.fa-border-style::before { content: "\f853"; } +.fa-border-style-alt::before { content: "\f854"; } +.fa-border-top::before { content: "\f855"; } +.fa-border-top-left::before { content: "\f853"; } +.fa-bore-hole::before { content: "\e4c3"; } +.fa-bottle-baby::before { content: "\e673"; } +.fa-bottle-droplet::before { content: "\e4c4"; } +.fa-bottle-water::before { content: "\e4c5"; } +.fa-bow-arrow::before { content: "\f6b9"; } +.fa-bowl-chopsticks::before { content: "\e2e9"; } +.fa-bowl-chopsticks-noodles::before { content: "\e2ea"; } +.fa-bowl-food::before { content: "\e4c6"; } +.fa-bowl-hot::before { content: "\f823"; } +.fa-bowl-rice::before { content: "\e2eb"; } +.fa-bowl-salad::before { content: "\f81e"; } +.fa-bowl-scoop::before { content: "\e3de"; } +.fa-bowl-scoops::before { content: "\e3df"; } +.fa-bowl-shaved-ice::before { content: "\e3de"; } +.fa-bowl-soft-serve::before { content: "\e46b"; } +.fa-bowl-spoon::before { content: "\e3e0"; } +.fa-bowling-ball::before { content: "\f436"; } +.fa-bowling-ball-pin::before { content: "\e0c3"; } +.fa-bowling-pins::before { content: "\f437"; } +.fa-box::before { content: "\f466"; } +.fa-box-alt::before { content: "\f49a"; } +.fa-box-archive::before { content: "\f187"; } +.fa-box-ballot::before { content: "\f735"; } +.fa-box-check::before { content: "\f467"; } +.fa-box-circle-check::before { content: "\e0c4"; } +.fa-box-dollar::before { content: "\f4a0"; } +.fa-box-fragile::before { content: "\f49b"; } +.fa-box-full::before { content: "\f49c"; } +.fa-box-heart::before { content: "\f49d"; } +.fa-box-open::before { content: "\f49e"; } +.fa-box-open-full::before { content: "\f49c"; } +.fa-box-taped::before { content: "\f49a"; } +.fa-box-tissue::before { content: "\e05b"; } +.fa-box-up::before { content: "\f49f"; } +.fa-box-usd::before { content: "\f4a0"; } +.fa-boxes::before { content: "\f468"; } +.fa-boxes-alt::before { content: "\f468"; } +.fa-boxes-packing::before { content: "\e4c7"; } +.fa-boxes-stacked::before { content: "\f468"; } +.fa-boxing-glove::before { content: "\f438"; } +.fa-bracket::before { content: "\5b"; } +.fa-bracket-curly::before { content: "\7b"; } +.fa-bracket-curly-left::before { content: "\7b"; } +.fa-bracket-curly-right::before { content: "\7d"; } +.fa-bracket-left::before { content: "\5b"; } +.fa-bracket-round::before { content: "\28"; } +.fa-bracket-round-right::before { content: "\29"; } +.fa-bracket-square::before { content: "\5b"; } +.fa-bracket-square-right::before { content: "\5d"; } +.fa-brackets::before { content: "\f7e9"; } +.fa-brackets-curly::before { content: "\f7ea"; } +.fa-brackets-round::before { content: "\e0c5"; } +.fa-brackets-square::before { content: "\f7e9"; } +.fa-braille::before { content: "\f2a1"; } +.fa-brain::before { content: "\f5dc"; } +.fa-brain-arrow-curved-right::before { content: "\f677"; } +.fa-brain-circuit::before { content: "\e0c6"; } +.fa-brake-warning::before { content: "\e0c7"; } +.fa-brazilian-real-sign::before { content: "\e46c"; } +.fa-bread-loaf::before { content: "\f7eb"; } +.fa-bread-slice::before { content: "\f7ec"; } +.fa-bread-slice-butter::before { content: "\e3e1"; } +.fa-bridge::before { content: "\e4c8"; } +.fa-bridge-circle-check::before { content: "\e4c9"; } +.fa-bridge-circle-exclamation::before { content: "\e4ca"; } +.fa-bridge-circle-xmark::before { content: "\e4cb"; } +.fa-bridge-lock::before { content: "\e4cc"; } +.fa-bridge-suspension::before { content: "\e4cd"; } +.fa-bridge-water::before { content: "\e4ce"; } +.fa-briefcase::before { content: "\f0b1"; } +.fa-briefcase-arrow-right::before { content: "\e2f2"; } +.fa-briefcase-blank::before { content: "\e0c8"; } +.fa-briefcase-clock::before { content: "\f64a"; } +.fa-briefcase-medical::before { content: "\f469"; } +.fa-brightness::before { content: "\e0c9"; } +.fa-brightness-low::before { content: "\e0ca"; } +.fa-bring-forward::before { content: "\f856"; } +.fa-bring-front::before { content: "\f857"; } +.fa-broadcast-tower::before { content: "\f519"; } +.fa-broccoli::before { content: "\e3e2"; } +.fa-broom::before { content: "\f51a"; } +.fa-broom-ball::before { content: "\f458"; } +.fa-broom-wide::before { content: "\e5d1"; } +.fa-browser::before { content: "\f37e"; } +.fa-browsers::before { content: "\e0cb"; } +.fa-brush::before { content: "\f55d"; } +.fa-bucket::before { content: "\e4cf"; } +.fa-bug::before { content: "\f188"; } +.fa-bug-slash::before { content: "\e490"; } +.fa-bugs::before { content: "\e4d0"; } +.fa-building::before { content: "\f1ad"; } +.fa-building-circle-arrow-right::before { content: "\e4d1"; } +.fa-building-circle-check::before { content: "\e4d2"; } +.fa-building-circle-exclamation::before { content: "\e4d3"; } +.fa-building-circle-xmark::before { content: "\e4d4"; } +.fa-building-columns::before { content: "\f19c"; } +.fa-building-flag::before { content: "\e4d5"; } +.fa-building-lock::before { content: "\e4d6"; } +.fa-building-magnifying-glass::before { content: "\e61c"; } +.fa-building-memo::before { content: "\e61e"; } +.fa-building-ngo::before { content: "\e4d7"; } +.fa-building-shield::before { content: "\e4d8"; } +.fa-building-un::before { content: "\e4d9"; } +.fa-building-user::before { content: "\e4da"; } +.fa-building-wheat::before { content: "\e4db"; } +.fa-buildings::before { content: "\e0cc"; } +.fa-bulldozer::before { content: "\e655"; } +.fa-bullhorn::before { content: "\f0a1"; } +.fa-bullseye::before { content: "\f140"; } +.fa-bullseye-arrow::before { content: "\f648"; } +.fa-bullseye-pointer::before { content: "\f649"; } +.fa-buoy::before { content: "\e5b5"; } +.fa-buoy-mooring::before { content: "\e5b6"; } +.fa-burger::before { content: "\f805"; } +.fa-burger-cheese::before { content: "\f7f1"; } +.fa-burger-fries::before { content: "\e0cd"; } +.fa-burger-glass::before { content: "\e0ce"; } +.fa-burger-lettuce::before { content: "\e3e3"; } +.fa-burger-soda::before { content: "\f858"; } +.fa-burn::before { content: "\f46a"; } +.fa-burrito::before { content: "\f7ed"; } +.fa-burst::before { content: "\e4dc"; } +.fa-bus::before { content: "\f207"; } +.fa-bus-alt::before { content: "\f55e"; } +.fa-bus-school::before { content: "\f5dd"; } +.fa-bus-simple::before { content: "\f55e"; } +.fa-business-front::before { content: "\e45c"; } +.fa-business-time::before { content: "\f64a"; } +.fa-butter::before { content: "\e3e4"; } +.fa-c::before { content: "\43"; } +.fa-cab::before { content: "\f1ba"; } +.fa-cabin::before { content: "\e46d"; } +.fa-cabinet-filing::before { content: "\f64b"; } +.fa-cable-car::before { content: "\f7da"; } +.fa-cactus::before { content: "\f8a7"; } +.fa-caduceus::before { content: "\e681"; } +.fa-cake::before { content: "\f1fd"; } +.fa-cake-candles::before { content: "\f1fd"; } +.fa-cake-slice::before { content: "\e3e5"; } +.fa-calculator::before { content: "\f1ec"; } +.fa-calculator-alt::before { content: "\f64c"; } +.fa-calculator-simple::before { content: "\f64c"; } +.fa-calendar::before { content: "\f133"; } +.fa-calendar-alt::before { content: "\f073"; } +.fa-calendar-arrow-down::before { content: "\e0d0"; } +.fa-calendar-arrow-up::before { content: "\e0d1"; } +.fa-calendar-check::before { content: "\f274"; } +.fa-calendar-circle::before { content: "\e102"; } +.fa-calendar-circle-exclamation::before { content: "\e46e"; } +.fa-calendar-circle-minus::before { content: "\e46f"; } +.fa-calendar-circle-plus::before { content: "\e470"; } +.fa-calendar-circle-user::before { content: "\e471"; } +.fa-calendar-clock::before { content: "\e0d2"; } +.fa-calendar-day::before { content: "\f783"; } +.fa-calendar-days::before { content: "\f073"; } +.fa-calendar-download::before { content: "\e0d0"; } +.fa-calendar-edit::before { content: "\f333"; } +.fa-calendar-exclamation::before { content: "\f334"; } +.fa-calendar-heart::before { content: "\e0d3"; } +.fa-calendar-image::before { content: "\e0d4"; } +.fa-calendar-lines::before { content: "\e0d5"; } +.fa-calendar-lines-pen::before { content: "\e472"; } +.fa-calendar-minus::before { content: "\f272"; } +.fa-calendar-note::before { content: "\e0d5"; } +.fa-calendar-pen::before { content: "\f333"; } +.fa-calendar-plus::before { content: "\f271"; } +.fa-calendar-range::before { content: "\e0d6"; } +.fa-calendar-star::before { content: "\f736"; } +.fa-calendar-time::before { content: "\e0d2"; } +.fa-calendar-times::before { content: "\f273"; } +.fa-calendar-upload::before { content: "\e0d1"; } +.fa-calendar-users::before { content: "\e5e2"; } +.fa-calendar-week::before { content: "\f784"; } +.fa-calendar-xmark::before { content: "\f273"; } +.fa-calendars::before { content: "\e0d7"; } +.fa-camcorder::before { content: "\f8a8"; } +.fa-camera::before { content: "\f030"; } +.fa-camera-alt::before { content: "\f030"; } +.fa-camera-cctv::before { content: "\f8ac"; } +.fa-camera-circle::before { content: "\e103"; } +.fa-camera-home::before { content: "\f8fe"; } +.fa-camera-movie::before { content: "\f8a9"; } +.fa-camera-polaroid::before { content: "\f8aa"; } +.fa-camera-retro::before { content: "\f083"; } +.fa-camera-rotate::before { content: "\e0d8"; } +.fa-camera-security::before { content: "\f8fe"; } +.fa-camera-slash::before { content: "\e0d9"; } +.fa-camera-viewfinder::before { content: "\e0da"; } +.fa-camera-web::before { content: "\f832"; } +.fa-camera-web-slash::before { content: "\f833"; } +.fa-campfire::before { content: "\f6ba"; } +.fa-campground::before { content: "\f6bb"; } +.fa-can-food::before { content: "\e3e6"; } +.fa-cancel::before { content: "\f05e"; } +.fa-candle-holder::before { content: "\f6bc"; } +.fa-candy::before { content: "\e3e7"; } +.fa-candy-bar::before { content: "\e3e8"; } +.fa-candy-cane::before { content: "\f786"; } +.fa-candy-corn::before { content: "\f6bd"; } +.fa-cannabis::before { content: "\f55f"; } +.fa-cannon::before { content: "\e642"; } +.fa-capsules::before { content: "\f46b"; } +.fa-car::before { content: "\f1b9"; } +.fa-car-alt::before { content: "\f5de"; } +.fa-car-battery::before { content: "\f5df"; } +.fa-car-bolt::before { content: "\e341"; } +.fa-car-building::before { content: "\f859"; } +.fa-car-bump::before { content: "\f5e0"; } +.fa-car-burst::before { content: "\f5e1"; } +.fa-car-bus::before { content: "\f85a"; } +.fa-car-circle-bolt::before { content: "\e342"; } +.fa-car-crash::before { content: "\f5e1"; } +.fa-car-garage::before { content: "\f5e2"; } +.fa-car-mechanic::before { content: "\f5e3"; } +.fa-car-mirrors::before { content: "\e343"; } +.fa-car-on::before { content: "\e4dd"; } +.fa-car-rear::before { content: "\f5de"; } +.fa-car-side::before { content: "\f5e4"; } +.fa-car-side-bolt::before { content: "\e344"; } +.fa-car-tilt::before { content: "\f5e5"; } +.fa-car-tunnel::before { content: "\e4de"; } +.fa-car-wash::before { content: "\f5e6"; } +.fa-car-wrench::before { content: "\f5e3"; } +.fa-caravan::before { content: "\f8ff"; } +.fa-caravan-alt::before { content: "\e000"; } +.fa-caravan-simple::before { content: "\e000"; } +.fa-card-club::before { content: "\e3e9"; } +.fa-card-diamond::before { content: "\e3ea"; } +.fa-card-heart::before { content: "\e3eb"; } +.fa-card-spade::before { content: "\e3ec"; } +.fa-cards::before { content: "\e3ed"; } +.fa-cards-blank::before { content: "\e4df"; } +.fa-caret-circle-down::before { content: "\f32d"; } +.fa-caret-circle-left::before { content: "\f32e"; } +.fa-caret-circle-right::before { content: "\f330"; } +.fa-caret-circle-up::before { content: "\f331"; } +.fa-caret-down::before { content: "\f0d7"; } +.fa-caret-left::before { content: "\f0d9"; } +.fa-caret-right::before { content: "\f0da"; } +.fa-caret-square-down::before { content: "\f150"; } +.fa-caret-square-left::before { content: "\f191"; } +.fa-caret-square-right::before { content: "\f152"; } +.fa-caret-square-up::before { content: "\f151"; } +.fa-caret-up::before { content: "\f0d8"; } +.fa-carriage-baby::before { content: "\f77d"; } +.fa-carrot::before { content: "\f787"; } +.fa-cars::before { content: "\f85b"; } +.fa-cart-arrow-down::before { content: "\f218"; } +.fa-cart-arrow-up::before { content: "\e3ee"; } +.fa-cart-circle-arrow-down::before { content: "\e3ef"; } +.fa-cart-circle-arrow-up::before { content: "\e3f0"; } +.fa-cart-circle-check::before { content: "\e3f1"; } +.fa-cart-circle-exclamation::before { content: "\e3f2"; } +.fa-cart-circle-plus::before { content: "\e3f3"; } +.fa-cart-circle-xmark::before { content: "\e3f4"; } +.fa-cart-flatbed::before { content: "\f474"; } +.fa-cart-flatbed-boxes::before { content: "\f475"; } +.fa-cart-flatbed-empty::before { content: "\f476"; } +.fa-cart-flatbed-suitcase::before { content: "\f59d"; } +.fa-cart-minus::before { content: "\e0db"; } +.fa-cart-plus::before { content: "\f217"; } +.fa-cart-shopping::before { content: "\f07a"; } +.fa-cart-shopping-fast::before { content: "\e0dc"; } +.fa-cart-xmark::before { content: "\e0dd"; } +.fa-cash-register::before { content: "\f788"; } +.fa-cassette-betamax::before { content: "\f8a4"; } +.fa-cassette-tape::before { content: "\f8ab"; } +.fa-cassette-vhs::before { content: "\f8ec"; } +.fa-castle::before { content: "\e0de"; } +.fa-cat::before { content: "\f6be"; } +.fa-cat-space::before { content: "\e001"; } +.fa-cauldron::before { content: "\f6bf"; } +.fa-cctv::before { content: "\f8ac"; } +.fa-cedi-sign::before { content: "\e0df"; } +.fa-cent-sign::before { content: "\e3f5"; } +.fa-certificate::before { content: "\f0a3"; } +.fa-chain::before { content: "\f0c1"; } +.fa-chain-broken::before { content: "\f127"; } +.fa-chain-horizontal::before { content: "\e1cb"; } +.fa-chain-horizontal-slash::before { content: "\e1cc"; } +.fa-chain-slash::before { content: "\f127"; } +.fa-chair::before { content: "\f6c0"; } +.fa-chair-office::before { content: "\f6c1"; } +.fa-chalkboard::before { content: "\f51b"; } +.fa-chalkboard-teacher::before { content: "\f51c"; } +.fa-chalkboard-user::before { content: "\f51c"; } +.fa-champagne-glass::before { content: "\f79e"; } +.fa-champagne-glasses::before { content: "\f79f"; } +.fa-charging-station::before { content: "\f5e7"; } +.fa-chart-area::before { content: "\f1fe"; } +.fa-chart-bar::before { content: "\f080"; } +.fa-chart-bullet::before { content: "\e0e1"; } +.fa-chart-candlestick::before { content: "\e0e2"; } +.fa-chart-column::before { content: "\e0e3"; } +.fa-chart-gantt::before { content: "\e0e4"; } +.fa-chart-kanban::before { content: "\e64f"; } +.fa-chart-line::before { content: "\f201"; } +.fa-chart-line-down::before { content: "\f64d"; } +.fa-chart-line-up::before { content: "\e0e5"; } +.fa-chart-line-up-down::before { content: "\e5d7"; } +.fa-chart-mixed::before { content: "\f643"; } +.fa-chart-mixed-up-circle-currency::before { content: "\e5d8"; } +.fa-chart-mixed-up-circle-dollar::before { content: "\e5d9"; } +.fa-chart-network::before { content: "\f78a"; } +.fa-chart-pie::before { content: "\f200"; } +.fa-chart-pie-alt::before { content: "\f64e"; } +.fa-chart-pie-simple::before { content: "\f64e"; } +.fa-chart-pie-simple-circle-currency::before { content: "\e604"; } +.fa-chart-pie-simple-circle-dollar::before { content: "\e605"; } +.fa-chart-pyramid::before { content: "\e0e6"; } +.fa-chart-radar::before { content: "\e0e7"; } +.fa-chart-scatter::before { content: "\f7ee"; } +.fa-chart-scatter-3d::before { content: "\e0e8"; } +.fa-chart-scatter-bubble::before { content: "\e0e9"; } +.fa-chart-simple::before { content: "\e473"; } +.fa-chart-simple-horizontal::before { content: "\e474"; } +.fa-chart-tree-map::before { content: "\e0ea"; } +.fa-chart-user::before { content: "\f6a3"; } +.fa-chart-waterfall::before { content: "\e0eb"; } +.fa-check::before { content: "\f00c"; } +.fa-check-circle::before { content: "\f058"; } +.fa-check-double::before { content: "\f560"; } +.fa-check-square::before { content: "\f14a"; } +.fa-check-to-slot::before { content: "\f772"; } +.fa-cheese::before { content: "\f7ef"; } +.fa-cheese-swiss::before { content: "\f7f0"; } +.fa-cheeseburger::before { content: "\f7f1"; } +.fa-cherries::before { content: "\e0ec"; } +.fa-chess::before { content: "\f439"; } +.fa-chess-bishop::before { content: "\f43a"; } +.fa-chess-bishop-alt::before { content: "\f43b"; } +.fa-chess-bishop-piece::before { content: "\f43b"; } +.fa-chess-board::before { content: "\f43c"; } +.fa-chess-clock::before { content: "\f43d"; } +.fa-chess-clock-alt::before { content: "\f43e"; } +.fa-chess-clock-flip::before { content: "\f43e"; } +.fa-chess-king::before { content: "\f43f"; } +.fa-chess-king-alt::before { content: "\f440"; } +.fa-chess-king-piece::before { content: "\f440"; } +.fa-chess-knight::before { content: "\f441"; } +.fa-chess-knight-alt::before { content: "\f442"; } +.fa-chess-knight-piece::before { content: "\f442"; } +.fa-chess-pawn::before { content: "\f443"; } +.fa-chess-pawn-alt::before { content: "\f444"; } +.fa-chess-pawn-piece::before { content: "\f444"; } +.fa-chess-queen::before { content: "\f445"; } +.fa-chess-queen-alt::before { content: "\f446"; } +.fa-chess-queen-piece::before { content: "\f446"; } +.fa-chess-rook::before { content: "\f447"; } +.fa-chess-rook-alt::before { content: "\f448"; } +.fa-chess-rook-piece::before { content: "\f448"; } +.fa-chestnut::before { content: "\e3f6"; } +.fa-chevron-circle-down::before { content: "\f13a"; } +.fa-chevron-circle-left::before { content: "\f137"; } +.fa-chevron-circle-right::before { content: "\f138"; } +.fa-chevron-circle-up::before { content: "\f139"; } +.fa-chevron-double-down::before { content: "\f322"; } +.fa-chevron-double-left::before { content: "\f323"; } +.fa-chevron-double-right::before { content: "\f324"; } +.fa-chevron-double-up::before { content: "\f325"; } +.fa-chevron-down::before { content: "\f078"; } +.fa-chevron-left::before { content: "\f053"; } +.fa-chevron-right::before { content: "\f054"; } +.fa-chevron-square-down::before { content: "\f329"; } +.fa-chevron-square-left::before { content: "\f32a"; } +.fa-chevron-square-right::before { content: "\f32b"; } +.fa-chevron-square-up::before { content: "\f32c"; } +.fa-chevron-up::before { content: "\f077"; } +.fa-chevrons-down::before { content: "\f322"; } +.fa-chevrons-left::before { content: "\f323"; } +.fa-chevrons-right::before { content: "\f324"; } +.fa-chevrons-up::before { content: "\f325"; } +.fa-chf-sign::before { content: "\e602"; } +.fa-child::before { content: "\f1ae"; } +.fa-child-combatant::before { content: "\e4e0"; } +.fa-child-dress::before { content: "\e59c"; } +.fa-child-reaching::before { content: "\e59d"; } +.fa-child-rifle::before { content: "\e4e0"; } +.fa-children::before { content: "\e4e1"; } +.fa-chimney::before { content: "\f78b"; } +.fa-chocolate-bar::before { content: "\e3e8"; } +.fa-chopsticks::before { content: "\e3f7"; } +.fa-church::before { content: "\f51d"; } +.fa-circle::before { content: "\f111"; } +.fa-circle-0::before { content: "\e0ed"; } +.fa-circle-1::before { content: "\e0ee"; } +.fa-circle-2::before { content: "\e0ef"; } +.fa-circle-3::before { content: "\e0f0"; } +.fa-circle-4::before { content: "\e0f1"; } +.fa-circle-5::before { content: "\e0f2"; } +.fa-circle-6::before { content: "\e0f3"; } +.fa-circle-7::before { content: "\e0f4"; } +.fa-circle-8::before { content: "\e0f5"; } +.fa-circle-9::before { content: "\e0f6"; } +.fa-circle-a::before { content: "\e0f7"; } +.fa-circle-ampersand::before { content: "\e0f8"; } +.fa-circle-arrow-down::before { content: "\f0ab"; } +.fa-circle-arrow-down-left::before { content: "\e0f9"; } +.fa-circle-arrow-down-right::before { content: "\e0fa"; } +.fa-circle-arrow-left::before { content: "\f0a8"; } +.fa-circle-arrow-right::before { content: "\f0a9"; } +.fa-circle-arrow-up::before { content: "\f0aa"; } +.fa-circle-arrow-up-left::before { content: "\e0fb"; } +.fa-circle-arrow-up-right::before { content: "\e0fc"; } +.fa-circle-b::before { content: "\e0fd"; } +.fa-circle-bolt::before { content: "\e0fe"; } +.fa-circle-book-open::before { content: "\e0ff"; } +.fa-circle-bookmark::before { content: "\e100"; } +.fa-circle-c::before { content: "\e101"; } +.fa-circle-calendar::before { content: "\e102"; } +.fa-circle-camera::before { content: "\e103"; } +.fa-circle-caret-down::before { content: "\f32d"; } +.fa-circle-caret-left::before { content: "\f32e"; } +.fa-circle-caret-right::before { content: "\f330"; } +.fa-circle-caret-up::before { content: "\f331"; } +.fa-circle-check::before { content: "\f058"; } +.fa-circle-chevron-down::before { content: "\f13a"; } +.fa-circle-chevron-left::before { content: "\f137"; } +.fa-circle-chevron-right::before { content: "\f138"; } +.fa-circle-chevron-up::before { content: "\f139"; } +.fa-circle-d::before { content: "\e104"; } +.fa-circle-dashed::before { content: "\e105"; } +.fa-circle-divide::before { content: "\e106"; } +.fa-circle-dollar::before { content: "\f2e8"; } +.fa-circle-dollar-to-slot::before { content: "\f4b9"; } +.fa-circle-dot::before { content: "\f192"; } +.fa-circle-down::before { content: "\f358"; } +.fa-circle-down-left::before { content: "\e107"; } +.fa-circle-down-right::before { content: "\e108"; } +.fa-circle-e::before { content: "\e109"; } +.fa-circle-ellipsis::before { content: "\e10a"; } +.fa-circle-ellipsis-vertical::before { content: "\e10b"; } +.fa-circle-envelope::before { content: "\e10c"; } +.fa-circle-euro::before { content: "\e5ce"; } +.fa-circle-exclamation::before { content: "\f06a"; } +.fa-circle-exclamation-check::before { content: "\e10d"; } +.fa-circle-f::before { content: "\e10e"; } +.fa-circle-g::before { content: "\e10f"; } +.fa-circle-gf::before { content: "\e67f"; } +.fa-circle-h::before { content: "\f47e"; } +.fa-circle-half::before { content: "\e110"; } +.fa-circle-half-stroke::before { content: "\f042"; } +.fa-circle-heart::before { content: "\f4c7"; } +.fa-circle-i::before { content: "\e111"; } +.fa-circle-info::before { content: "\f05a"; } +.fa-circle-j::before { content: "\e112"; } +.fa-circle-k::before { content: "\e113"; } +.fa-circle-l::before { content: "\e114"; } +.fa-circle-left::before { content: "\f359"; } +.fa-circle-location-arrow::before { content: "\f602"; } +.fa-circle-m::before { content: "\e115"; } +.fa-circle-microphone::before { content: "\e116"; } +.fa-circle-microphone-lines::before { content: "\e117"; } +.fa-circle-minus::before { content: "\f056"; } +.fa-circle-n::before { content: "\e118"; } +.fa-circle-nodes::before { content: "\e4e2"; } +.fa-circle-notch::before { content: "\f1ce"; } +.fa-circle-o::before { content: "\e119"; } +.fa-circle-p::before { content: "\e11a"; } +.fa-circle-parking::before { content: "\f615"; } +.fa-circle-pause::before { content: "\f28b"; } +.fa-circle-phone::before { content: "\e11b"; } +.fa-circle-phone-flip::before { content: "\e11c"; } +.fa-circle-phone-hangup::before { content: "\e11d"; } +.fa-circle-play::before { content: "\f144"; } +.fa-circle-plus::before { content: "\f055"; } +.fa-circle-q::before { content: "\e11e"; } +.fa-circle-quarter::before { content: "\e11f"; } +.fa-circle-quarter-stroke::before { content: "\e5d3"; } +.fa-circle-quarters::before { content: "\e3f8"; } +.fa-circle-question::before { content: "\f059"; } +.fa-circle-r::before { content: "\e120"; } +.fa-circle-radiation::before { content: "\f7ba"; } +.fa-circle-right::before { content: "\f35a"; } +.fa-circle-s::before { content: "\e121"; } +.fa-circle-small::before { content: "\e122"; } +.fa-circle-sort::before { content: "\e030"; } +.fa-circle-sort-down::before { content: "\e031"; } +.fa-circle-sort-up::before { content: "\e032"; } +.fa-circle-star::before { content: "\e123"; } +.fa-circle-sterling::before { content: "\e5cf"; } +.fa-circle-stop::before { content: "\f28d"; } +.fa-circle-t::before { content: "\e124"; } +.fa-circle-three-quarters::before { content: "\e125"; } +.fa-circle-three-quarters-stroke::before { content: "\e5d4"; } +.fa-circle-trash::before { content: "\e126"; } +.fa-circle-u::before { content: "\e127"; } +.fa-circle-up::before { content: "\f35b"; } +.fa-circle-up-left::before { content: "\e128"; } +.fa-circle-up-right::before { content: "\e129"; } +.fa-circle-user::before { content: "\f2bd"; } +.fa-circle-v::before { content: "\e12a"; } +.fa-circle-video::before { content: "\e12b"; } +.fa-circle-w::before { content: "\e12c"; } +.fa-circle-waveform-lines::before { content: "\e12d"; } +.fa-circle-wifi::before { content: "\e67d"; } +.fa-circle-wifi-circle-wifi::before { content: "\e67e"; } +.fa-circle-wifi-group::before { content: "\e67e"; } +.fa-circle-x::before { content: "\e12e"; } +.fa-circle-xmark::before { content: "\f057"; } +.fa-circle-y::before { content: "\e12f"; } +.fa-circle-yen::before { content: "\e5d0"; } +.fa-circle-z::before { content: "\e130"; } +.fa-circles-overlap::before { content: "\e600"; } +.fa-citrus::before { content: "\e2f4"; } +.fa-citrus-slice::before { content: "\e2f5"; } +.fa-city::before { content: "\f64f"; } +.fa-clapperboard::before { content: "\e131"; } +.fa-clapperboard-play::before { content: "\e132"; } +.fa-clarinet::before { content: "\f8ad"; } +.fa-claw-marks::before { content: "\f6c2"; } +.fa-clinic-medical::before { content: "\f7f2"; } +.fa-clipboard::before { content: "\f328"; } +.fa-clipboard-check::before { content: "\f46c"; } +.fa-clipboard-list::before { content: "\f46d"; } +.fa-clipboard-list-check::before { content: "\f737"; } +.fa-clipboard-medical::before { content: "\e133"; } +.fa-clipboard-prescription::before { content: "\f5e8"; } +.fa-clipboard-question::before { content: "\e4e3"; } +.fa-clipboard-user::before { content: "\f7f3"; } +.fa-clock::before { content: "\f017"; } +.fa-clock-desk::before { content: "\e134"; } +.fa-clock-eight::before { content: "\e345"; } +.fa-clock-eight-thirty::before { content: "\e346"; } +.fa-clock-eleven::before { content: "\e347"; } +.fa-clock-eleven-thirty::before { content: "\e348"; } +.fa-clock-five::before { content: "\e349"; } +.fa-clock-five-thirty::before { content: "\e34a"; } +.fa-clock-four::before { content: "\f017"; } +.fa-clock-four-thirty::before { content: "\e34b"; } +.fa-clock-nine::before { content: "\e34c"; } +.fa-clock-nine-thirty::before { content: "\e34d"; } +.fa-clock-one::before { content: "\e34e"; } +.fa-clock-one-thirty::before { content: "\e34f"; } +.fa-clock-rotate-left::before { content: "\f1da"; } +.fa-clock-seven::before { content: "\e350"; } +.fa-clock-seven-thirty::before { content: "\e351"; } +.fa-clock-six::before { content: "\e352"; } +.fa-clock-six-thirty::before { content: "\e353"; } +.fa-clock-ten::before { content: "\e354"; } +.fa-clock-ten-thirty::before { content: "\e355"; } +.fa-clock-three::before { content: "\e356"; } +.fa-clock-three-thirty::before { content: "\e357"; } +.fa-clock-twelve::before { content: "\e358"; } +.fa-clock-twelve-thirty::before { content: "\e359"; } +.fa-clock-two::before { content: "\e35a"; } +.fa-clock-two-thirty::before { content: "\e35b"; } +.fa-clone::before { content: "\f24d"; } +.fa-close::before { content: "\f00d"; } +.fa-closed-captioning::before { content: "\f20a"; } +.fa-closed-captioning-slash::before { content: "\e135"; } +.fa-clothes-hanger::before { content: "\e136"; } +.fa-cloud::before { content: "\f0c2"; } +.fa-cloud-arrow-down::before { content: "\f0ed"; } +.fa-cloud-arrow-up::before { content: "\f0ee"; } +.fa-cloud-binary::before { content: "\e601"; } +.fa-cloud-bolt::before { content: "\f76c"; } +.fa-cloud-bolt-moon::before { content: "\f76d"; } +.fa-cloud-bolt-sun::before { content: "\f76e"; } +.fa-cloud-check::before { content: "\e35c"; } +.fa-cloud-download::before { content: "\f0ed"; } +.fa-cloud-download-alt::before { content: "\f0ed"; } +.fa-cloud-drizzle::before { content: "\f738"; } +.fa-cloud-exclamation::before { content: "\e491"; } +.fa-cloud-fog::before { content: "\f74e"; } +.fa-cloud-hail::before { content: "\f739"; } +.fa-cloud-hail-mixed::before { content: "\f73a"; } +.fa-cloud-meatball::before { content: "\f73b"; } +.fa-cloud-minus::before { content: "\e35d"; } +.fa-cloud-moon::before { content: "\f6c3"; } +.fa-cloud-moon-rain::before { content: "\f73c"; } +.fa-cloud-music::before { content: "\f8ae"; } +.fa-cloud-plus::before { content: "\e35e"; } +.fa-cloud-question::before { content: "\e492"; } +.fa-cloud-rain::before { content: "\f73d"; } +.fa-cloud-rainbow::before { content: "\f73e"; } +.fa-cloud-showers::before { content: "\f73f"; } +.fa-cloud-showers-heavy::before { content: "\f740"; } +.fa-cloud-showers-water::before { content: "\e4e4"; } +.fa-cloud-slash::before { content: "\e137"; } +.fa-cloud-sleet::before { content: "\f741"; } +.fa-cloud-snow::before { content: "\f742"; } +.fa-cloud-sun::before { content: "\f6c4"; } +.fa-cloud-sun-rain::before { content: "\f743"; } +.fa-cloud-upload::before { content: "\f0ee"; } +.fa-cloud-upload-alt::before { content: "\f0ee"; } +.fa-cloud-word::before { content: "\e138"; } +.fa-cloud-xmark::before { content: "\e35f"; } +.fa-clouds::before { content: "\f744"; } +.fa-clouds-moon::before { content: "\f745"; } +.fa-clouds-sun::before { content: "\f746"; } +.fa-clover::before { content: "\e139"; } +.fa-club::before { content: "\f327"; } +.fa-cny::before { content: "\f157"; } +.fa-cocktail::before { content: "\f561"; } +.fa-coconut::before { content: "\e2f6"; } +.fa-code::before { content: "\f121"; } +.fa-code-branch::before { content: "\f126"; } +.fa-code-commit::before { content: "\f386"; } +.fa-code-compare::before { content: "\e13a"; } +.fa-code-fork::before { content: "\e13b"; } +.fa-code-merge::before { content: "\f387"; } +.fa-code-pull-request::before { content: "\e13c"; } +.fa-code-pull-request-closed::before { content: "\e3f9"; } +.fa-code-pull-request-draft::before { content: "\e3fa"; } +.fa-code-simple::before { content: "\e13d"; } +.fa-coffee::before { content: "\f0f4"; } +.fa-coffee-bean::before { content: "\e13e"; } +.fa-coffee-beans::before { content: "\e13f"; } +.fa-coffee-pot::before { content: "\e002"; } +.fa-coffee-togo::before { content: "\f6c5"; } +.fa-coffin::before { content: "\f6c6"; } +.fa-coffin-cross::before { content: "\e051"; } +.fa-cog::before { content: "\f013"; } +.fa-cogs::before { content: "\f085"; } +.fa-coin::before { content: "\f85c"; } +.fa-coin-blank::before { content: "\e3fb"; } +.fa-coin-front::before { content: "\e3fc"; } +.fa-coin-vertical::before { content: "\e3fd"; } +.fa-coins::before { content: "\f51e"; } +.fa-colon::before { content: "\3a"; } +.fa-colon-sign::before { content: "\e140"; } +.fa-columns::before { content: "\f0db"; } +.fa-columns-3::before { content: "\e361"; } +.fa-comet::before { content: "\e003"; } +.fa-comma::before { content: "\2c"; } +.fa-command::before { content: "\e142"; } +.fa-comment::before { content: "\f075"; } +.fa-comment-alt::before { content: "\f27a"; } +.fa-comment-alt-arrow-down::before { content: "\e1db"; } +.fa-comment-alt-arrow-up::before { content: "\e1dc"; } +.fa-comment-alt-captions::before { content: "\e1de"; } +.fa-comment-alt-check::before { content: "\f4a2"; } +.fa-comment-alt-dollar::before { content: "\f650"; } +.fa-comment-alt-dots::before { content: "\f4a3"; } +.fa-comment-alt-edit::before { content: "\f4a4"; } +.fa-comment-alt-exclamation::before { content: "\f4a5"; } +.fa-comment-alt-image::before { content: "\e1e0"; } +.fa-comment-alt-lines::before { content: "\f4a6"; } +.fa-comment-alt-medical::before { content: "\f7f4"; } +.fa-comment-alt-minus::before { content: "\f4a7"; } +.fa-comment-alt-music::before { content: "\f8af"; } +.fa-comment-alt-plus::before { content: "\f4a8"; } +.fa-comment-alt-quote::before { content: "\e1e4"; } +.fa-comment-alt-slash::before { content: "\f4a9"; } +.fa-comment-alt-smile::before { content: "\f4aa"; } +.fa-comment-alt-text::before { content: "\e1e6"; } +.fa-comment-alt-times::before { content: "\f4ab"; } +.fa-comment-arrow-down::before { content: "\e143"; } +.fa-comment-arrow-up::before { content: "\e144"; } +.fa-comment-arrow-up-right::before { content: "\e145"; } +.fa-comment-captions::before { content: "\e146"; } +.fa-comment-check::before { content: "\f4ac"; } +.fa-comment-code::before { content: "\e147"; } +.fa-comment-dollar::before { content: "\f651"; } +.fa-comment-dots::before { content: "\f4ad"; } +.fa-comment-edit::before { content: "\f4ae"; } +.fa-comment-exclamation::before { content: "\f4af"; } +.fa-comment-heart::before { content: "\e5c8"; } +.fa-comment-image::before { content: "\e148"; } +.fa-comment-lines::before { content: "\f4b0"; } +.fa-comment-medical::before { content: "\f7f5"; } +.fa-comment-middle::before { content: "\e149"; } +.fa-comment-middle-alt::before { content: "\e1e1"; } +.fa-comment-middle-top::before { content: "\e14a"; } +.fa-comment-middle-top-alt::before { content: "\e1e2"; } +.fa-comment-minus::before { content: "\f4b1"; } +.fa-comment-music::before { content: "\f8b0"; } +.fa-comment-pen::before { content: "\f4ae"; } +.fa-comment-plus::before { content: "\f4b2"; } +.fa-comment-question::before { content: "\e14b"; } +.fa-comment-quote::before { content: "\e14c"; } +.fa-comment-slash::before { content: "\f4b3"; } +.fa-comment-smile::before { content: "\f4b4"; } +.fa-comment-sms::before { content: "\f7cd"; } +.fa-comment-text::before { content: "\e14d"; } +.fa-comment-times::before { content: "\f4b5"; } +.fa-comment-xmark::before { content: "\f4b5"; } +.fa-commenting::before { content: "\f4ad"; } +.fa-comments::before { content: "\f086"; } +.fa-comments-alt::before { content: "\f4b6"; } +.fa-comments-alt-dollar::before { content: "\f652"; } +.fa-comments-dollar::before { content: "\f653"; } +.fa-comments-question::before { content: "\e14e"; } +.fa-comments-question-check::before { content: "\e14f"; } +.fa-compact-disc::before { content: "\f51f"; } +.fa-compass::before { content: "\f14e"; } +.fa-compass-drafting::before { content: "\f568"; } +.fa-compass-slash::before { content: "\f5e9"; } +.fa-compress::before { content: "\f066"; } +.fa-compress-alt::before { content: "\f422"; } +.fa-compress-arrows::before { content: "\e0a5"; } +.fa-compress-arrows-alt::before { content: "\f78c"; } +.fa-compress-wide::before { content: "\f326"; } +.fa-computer::before { content: "\e4e5"; } +.fa-computer-classic::before { content: "\f8b1"; } +.fa-computer-mouse::before { content: "\f8cc"; } +.fa-computer-mouse-scrollwheel::before { content: "\f8cd"; } +.fa-computer-speaker::before { content: "\f8b2"; } +.fa-concierge-bell::before { content: "\f562"; } +.fa-construction::before { content: "\f85d"; } +.fa-contact-book::before { content: "\f2b9"; } +.fa-contact-card::before { content: "\f2bb"; } +.fa-container-storage::before { content: "\f4b7"; } +.fa-conveyor-belt::before { content: "\f46e"; } +.fa-conveyor-belt-alt::before { content: "\f46f"; } +.fa-conveyor-belt-arm::before { content: "\e5f8"; } +.fa-conveyor-belt-boxes::before { content: "\f46f"; } +.fa-conveyor-belt-empty::before { content: "\e150"; } +.fa-cookie::before { content: "\f563"; } +.fa-cookie-bite::before { content: "\f564"; } +.fa-copy::before { content: "\f0c5"; } +.fa-copyright::before { content: "\f1f9"; } +.fa-corn::before { content: "\f6c7"; } +.fa-corner::before { content: "\e3fe"; } +.fa-couch::before { content: "\f4b8"; } +.fa-couch-small::before { content: "\f4cc"; } +.fa-court-sport::before { content: "\e643"; } +.fa-cow::before { content: "\f6c8"; } +.fa-cowbell::before { content: "\f8b3"; } +.fa-cowbell-circle-plus::before { content: "\f8b4"; } +.fa-cowbell-more::before { content: "\f8b4"; } +.fa-crab::before { content: "\e3ff"; } +.fa-crate-apple::before { content: "\f6b1"; } +.fa-crate-empty::before { content: "\e151"; } +.fa-credit-card::before { content: "\f09d"; } +.fa-credit-card-alt::before { content: "\f09d"; } +.fa-credit-card-blank::before { content: "\f389"; } +.fa-credit-card-front::before { content: "\f38a"; } +.fa-creemee::before { content: "\e400"; } +.fa-cricket::before { content: "\f449"; } +.fa-cricket-bat-ball::before { content: "\f449"; } +.fa-croissant::before { content: "\f7f6"; } +.fa-crop::before { content: "\f125"; } +.fa-crop-alt::before { content: "\f565"; } +.fa-crop-simple::before { content: "\f565"; } +.fa-cross::before { content: "\f654"; } +.fa-crosshairs::before { content: "\f05b"; } +.fa-crosshairs-simple::before { content: "\e59f"; } +.fa-crow::before { content: "\f520"; } +.fa-crown::before { content: "\f521"; } +.fa-crutch::before { content: "\f7f7"; } +.fa-crutches::before { content: "\f7f8"; } +.fa-cruzeiro-sign::before { content: "\e152"; } +.fa-crystal-ball::before { content: "\e362"; } +.fa-cube::before { content: "\f1b2"; } +.fa-cubes::before { content: "\f1b3"; } +.fa-cubes-stacked::before { content: "\e4e6"; } +.fa-cucumber::before { content: "\e401"; } +.fa-cup-straw::before { content: "\e363"; } +.fa-cup-straw-swoosh::before { content: "\e364"; } +.fa-cup-togo::before { content: "\f6c5"; } +.fa-cupcake::before { content: "\e402"; } +.fa-curling::before { content: "\f44a"; } +.fa-curling-stone::before { content: "\f44a"; } +.fa-custard::before { content: "\e403"; } +.fa-cut::before { content: "\f0c4"; } +.fa-cutlery::before { content: "\f2e7"; } +.fa-d::before { content: "\44"; } +.fa-dagger::before { content: "\f6cb"; } +.fa-dash::before { content: "\e404"; } +.fa-dashboard::before { content: "\f624"; } +.fa-database::before { content: "\f1c0"; } +.fa-deaf::before { content: "\f2a4"; } +.fa-deafness::before { content: "\f2a4"; } +.fa-debug::before { content: "\f7f9"; } +.fa-dedent::before { content: "\f03b"; } +.fa-deer::before { content: "\f78e"; } +.fa-deer-rudolph::before { content: "\f78f"; } +.fa-delete-left::before { content: "\f55a"; } +.fa-delete-right::before { content: "\e154"; } +.fa-democrat::before { content: "\f747"; } +.fa-desktop::before { content: "\f390"; } +.fa-desktop-alt::before { content: "\f390"; } +.fa-desktop-arrow-down::before { content: "\e155"; } +.fa-desktop-code::before { content: "\e165"; } +.fa-desktop-medical::before { content: "\e166"; } +.fa-desktop-slash::before { content: "\e2fa"; } +.fa-dewpoint::before { content: "\f748"; } +.fa-dharmachakra::before { content: "\f655"; } +.fa-diagnoses::before { content: "\f470"; } +.fa-diagram-cells::before { content: "\e475"; } +.fa-diagram-lean-canvas::before { content: "\e156"; } +.fa-diagram-nested::before { content: "\e157"; } +.fa-diagram-next::before { content: "\e476"; } +.fa-diagram-predecessor::before { content: "\e477"; } +.fa-diagram-previous::before { content: "\e478"; } +.fa-diagram-project::before { content: "\f542"; } +.fa-diagram-sankey::before { content: "\e158"; } +.fa-diagram-subtask::before { content: "\e479"; } +.fa-diagram-successor::before { content: "\e47a"; } +.fa-diagram-venn::before { content: "\e15a"; } +.fa-dial::before { content: "\e15b"; } +.fa-dial-high::before { content: "\e15c"; } +.fa-dial-low::before { content: "\e15d"; } +.fa-dial-max::before { content: "\e15e"; } +.fa-dial-med::before { content: "\e15f"; } +.fa-dial-med-high::before { content: "\e15b"; } +.fa-dial-med-low::before { content: "\e160"; } +.fa-dial-min::before { content: "\e161"; } +.fa-dial-off::before { content: "\e162"; } +.fa-diamond::before { content: "\f219"; } +.fa-diamond-exclamation::before { content: "\e405"; } +.fa-diamond-half::before { content: "\e5b7"; } +.fa-diamond-half-stroke::before { content: "\e5b8"; } +.fa-diamond-turn-right::before { content: "\f5eb"; } +.fa-diamonds-4::before { content: "\e68b"; } +.fa-dice::before { content: "\f522"; } +.fa-dice-d10::before { content: "\f6cd"; } +.fa-dice-d12::before { content: "\f6ce"; } +.fa-dice-d20::before { content: "\f6cf"; } +.fa-dice-d4::before { content: "\f6d0"; } +.fa-dice-d6::before { content: "\f6d1"; } +.fa-dice-d8::before { content: "\f6d2"; } +.fa-dice-five::before { content: "\f523"; } +.fa-dice-four::before { content: "\f524"; } +.fa-dice-one::before { content: "\f525"; } +.fa-dice-six::before { content: "\f526"; } +.fa-dice-three::before { content: "\f527"; } +.fa-dice-two::before { content: "\f528"; } +.fa-digging::before { content: "\f85e"; } +.fa-digital-tachograph::before { content: "\f566"; } +.fa-dinosaur::before { content: "\e5fe"; } +.fa-diploma::before { content: "\f5ea"; } +.fa-directions::before { content: "\f5eb"; } +.fa-disc-drive::before { content: "\f8b5"; } +.fa-disease::before { content: "\f7fa"; } +.fa-display::before { content: "\e163"; } +.fa-display-arrow-down::before { content: "\e164"; } +.fa-display-chart-up::before { content: "\e5e3"; } +.fa-display-chart-up-circle-currency::before { content: "\e5e5"; } +.fa-display-chart-up-circle-dollar::before { content: "\e5e6"; } +.fa-display-code::before { content: "\e165"; } +.fa-display-medical::before { content: "\e166"; } +.fa-display-slash::before { content: "\e2fa"; } +.fa-distribute-spacing-horizontal::before { content: "\e365"; } +.fa-distribute-spacing-vertical::before { content: "\e366"; } +.fa-ditto::before { content: "\22"; } +.fa-divide::before { content: "\f529"; } +.fa-dizzy::before { content: "\f567"; } +.fa-dna::before { content: "\f471"; } +.fa-do-not-enter::before { content: "\f5ec"; } +.fa-dog::before { content: "\f6d3"; } +.fa-dog-leashed::before { content: "\f6d4"; } +.fa-dollar::before { content: "\24"; } +.fa-dollar-circle::before { content: "\f2e8"; } +.fa-dollar-sign::before { content: "\24"; } +.fa-dollar-square::before { content: "\f2e9"; } +.fa-dolly::before { content: "\f472"; } +.fa-dolly-box::before { content: "\f472"; } +.fa-dolly-empty::before { content: "\f473"; } +.fa-dolly-flatbed::before { content: "\f474"; } +.fa-dolly-flatbed-alt::before { content: "\f475"; } +.fa-dolly-flatbed-empty::before { content: "\f476"; } +.fa-dolphin::before { content: "\e168"; } +.fa-donate::before { content: "\f4b9"; } +.fa-dong-sign::before { content: "\e169"; } +.fa-donut::before { content: "\e406"; } +.fa-door-closed::before { content: "\f52a"; } +.fa-door-open::before { content: "\f52b"; } +.fa-dot-circle::before { content: "\f192"; } +.fa-doughnut::before { content: "\e406"; } +.fa-dove::before { content: "\f4ba"; } +.fa-down::before { content: "\f354"; } +.fa-down-from-bracket::before { content: "\e66b"; } +.fa-down-from-dotted-line::before { content: "\e407"; } +.fa-down-from-line::before { content: "\f349"; } +.fa-down-left::before { content: "\e16a"; } +.fa-down-left-and-up-right-to-center::before { content: "\f422"; } +.fa-down-long::before { content: "\f309"; } +.fa-down-right::before { content: "\e16b"; } +.fa-down-to-bracket::before { content: "\e4e7"; } +.fa-down-to-dotted-line::before { content: "\e408"; } +.fa-down-to-line::before { content: "\f34a"; } +.fa-download::before { content: "\f019"; } +.fa-drafting-compass::before { content: "\f568"; } +.fa-dragon::before { content: "\f6d5"; } +.fa-draw-circle::before { content: "\f5ed"; } +.fa-draw-polygon::before { content: "\f5ee"; } +.fa-draw-square::before { content: "\f5ef"; } +.fa-dreidel::before { content: "\f792"; } +.fa-drivers-license::before { content: "\f2c2"; } +.fa-drone::before { content: "\f85f"; } +.fa-drone-alt::before { content: "\f860"; } +.fa-drone-front::before { content: "\f860"; } +.fa-droplet::before { content: "\f043"; } +.fa-droplet-degree::before { content: "\f748"; } +.fa-droplet-percent::before { content: "\f750"; } +.fa-droplet-slash::before { content: "\f5c7"; } +.fa-drum::before { content: "\f569"; } +.fa-drum-steelpan::before { content: "\f56a"; } +.fa-drumstick::before { content: "\f6d6"; } +.fa-drumstick-bite::before { content: "\f6d7"; } +.fa-dryer::before { content: "\f861"; } +.fa-dryer-alt::before { content: "\f862"; } +.fa-dryer-heat::before { content: "\f862"; } +.fa-duck::before { content: "\f6d8"; } +.fa-dumbbell::before { content: "\f44b"; } +.fa-dumpster::before { content: "\f793"; } +.fa-dumpster-fire::before { content: "\f794"; } +.fa-dungeon::before { content: "\f6d9"; } +.fa-e::before { content: "\45"; } +.fa-ear::before { content: "\f5f0"; } +.fa-ear-deaf::before { content: "\f2a4"; } +.fa-ear-listen::before { content: "\f2a2"; } +.fa-ear-muffs::before { content: "\f795"; } +.fa-earth::before { content: "\f57d"; } +.fa-earth-africa::before { content: "\f57c"; } +.fa-earth-america::before { content: "\f57d"; } +.fa-earth-americas::before { content: "\f57d"; } +.fa-earth-asia::before { content: "\f57e"; } +.fa-earth-europe::before { content: "\f7a2"; } +.fa-earth-oceania::before { content: "\e47b"; } +.fa-eclipse::before { content: "\f749"; } +.fa-eclipse-alt::before { content: "\f74a"; } +.fa-edit::before { content: "\f044"; } +.fa-egg::before { content: "\f7fb"; } +.fa-egg-fried::before { content: "\f7fc"; } +.fa-eggplant::before { content: "\e16c"; } +.fa-eject::before { content: "\f052"; } +.fa-elephant::before { content: "\f6da"; } +.fa-elevator::before { content: "\e16d"; } +.fa-ellipsis::before { content: "\f141"; } +.fa-ellipsis-h::before { content: "\f141"; } +.fa-ellipsis-h-alt::before { content: "\f39b"; } +.fa-ellipsis-stroke::before { content: "\f39b"; } +.fa-ellipsis-stroke-vertical::before { content: "\f39c"; } +.fa-ellipsis-v::before { content: "\f142"; } +.fa-ellipsis-v-alt::before { content: "\f39c"; } +.fa-ellipsis-vertical::before { content: "\f142"; } +.fa-empty-set::before { content: "\f656"; } +.fa-engine::before { content: "\e16e"; } +.fa-engine-exclamation::before { content: "\f5f2"; } +.fa-engine-warning::before { content: "\f5f2"; } +.fa-envelope::before { content: "\f0e0"; } +.fa-envelope-badge::before { content: "\e16f"; } +.fa-envelope-circle::before { content: "\e10c"; } +.fa-envelope-circle-check::before { content: "\e4e8"; } +.fa-envelope-dot::before { content: "\e16f"; } +.fa-envelope-open::before { content: "\f2b6"; } +.fa-envelope-open-dollar::before { content: "\f657"; } +.fa-envelope-open-text::before { content: "\f658"; } +.fa-envelope-square::before { content: "\f199"; } +.fa-envelopes::before { content: "\e170"; } +.fa-envelopes-bulk::before { content: "\f674"; } +.fa-equals::before { content: "\3d"; } +.fa-eraser::before { content: "\f12d"; } +.fa-escalator::before { content: "\e171"; } +.fa-ethernet::before { content: "\f796"; } +.fa-eur::before { content: "\f153"; } +.fa-euro::before { content: "\f153"; } +.fa-euro-sign::before { content: "\f153"; } +.fa-excavator::before { content: "\e656"; } +.fa-exchange::before { content: "\f0ec"; } +.fa-exchange-alt::before { content: "\f362"; } +.fa-exclamation::before { content: "\21"; } +.fa-exclamation-circle::before { content: "\f06a"; } +.fa-exclamation-square::before { content: "\f321"; } +.fa-exclamation-triangle::before { content: "\f071"; } +.fa-expand::before { content: "\f065"; } +.fa-expand-alt::before { content: "\f424"; } +.fa-expand-arrows::before { content: "\f31d"; } +.fa-expand-arrows-alt::before { content: "\f31e"; } +.fa-expand-wide::before { content: "\f320"; } +.fa-exploding-head::before { content: "\e2fe"; } +.fa-explosion::before { content: "\e4e9"; } +.fa-external-link::before { content: "\f08e"; } +.fa-external-link-alt::before { content: "\f35d"; } +.fa-external-link-square::before { content: "\f14c"; } +.fa-external-link-square-alt::before { content: "\f360"; } +.fa-eye::before { content: "\f06e"; } +.fa-eye-dropper::before { content: "\f1fb"; } +.fa-eye-dropper-empty::before { content: "\f1fb"; } +.fa-eye-dropper-full::before { content: "\e172"; } +.fa-eye-dropper-half::before { content: "\e173"; } +.fa-eye-evil::before { content: "\f6db"; } +.fa-eye-low-vision::before { content: "\f2a8"; } +.fa-eye-slash::before { content: "\f070"; } +.fa-eyedropper::before { content: "\f1fb"; } +.fa-eyes::before { content: "\e367"; } +.fa-f::before { content: "\46"; } +.fa-face-angry::before { content: "\f556"; } +.fa-face-angry-horns::before { content: "\e368"; } +.fa-face-anguished::before { content: "\e369"; } +.fa-face-anxious-sweat::before { content: "\e36a"; } +.fa-face-astonished::before { content: "\e36b"; } +.fa-face-awesome::before { content: "\e409"; } +.fa-face-beam-hand-over-mouth::before { content: "\e47c"; } +.fa-face-clouds::before { content: "\e47d"; } +.fa-face-confounded::before { content: "\e36c"; } +.fa-face-confused::before { content: "\e36d"; } +.fa-face-cowboy-hat::before { content: "\e36e"; } +.fa-face-diagonal-mouth::before { content: "\e47e"; } +.fa-face-disappointed::before { content: "\e36f"; } +.fa-face-disguise::before { content: "\e370"; } +.fa-face-dizzy::before { content: "\f567"; } +.fa-face-dotted::before { content: "\e47f"; } +.fa-face-downcast-sweat::before { content: "\e371"; } +.fa-face-drooling::before { content: "\e372"; } +.fa-face-exhaling::before { content: "\e480"; } +.fa-face-explode::before { content: "\e2fe"; } +.fa-face-expressionless::before { content: "\e373"; } +.fa-face-eyes-xmarks::before { content: "\e374"; } +.fa-face-fearful::before { content: "\e375"; } +.fa-face-flushed::before { content: "\f579"; } +.fa-face-frown::before { content: "\f119"; } +.fa-face-frown-open::before { content: "\f57a"; } +.fa-face-frown-slight::before { content: "\e376"; } +.fa-face-glasses::before { content: "\e377"; } +.fa-face-grimace::before { content: "\f57f"; } +.fa-face-grin::before { content: "\f580"; } +.fa-face-grin-beam::before { content: "\f582"; } +.fa-face-grin-beam-sweat::before { content: "\f583"; } +.fa-face-grin-hearts::before { content: "\f584"; } +.fa-face-grin-squint::before { content: "\f585"; } +.fa-face-grin-squint-tears::before { content: "\f586"; } +.fa-face-grin-stars::before { content: "\f587"; } +.fa-face-grin-tears::before { content: "\f588"; } +.fa-face-grin-tongue::before { content: "\f589"; } +.fa-face-grin-tongue-squint::before { content: "\f58a"; } +.fa-face-grin-tongue-wink::before { content: "\f58b"; } +.fa-face-grin-wide::before { content: "\f581"; } +.fa-face-grin-wink::before { content: "\f58c"; } +.fa-face-hand-over-mouth::before { content: "\e378"; } +.fa-face-hand-peeking::before { content: "\e481"; } +.fa-face-hand-yawn::before { content: "\e379"; } +.fa-face-head-bandage::before { content: "\e37a"; } +.fa-face-holding-back-tears::before { content: "\e482"; } +.fa-face-hushed::before { content: "\e37b"; } +.fa-face-icicles::before { content: "\e37c"; } +.fa-face-kiss::before { content: "\f596"; } +.fa-face-kiss-beam::before { content: "\f597"; } +.fa-face-kiss-closed-eyes::before { content: "\e37d"; } +.fa-face-kiss-wink-heart::before { content: "\f598"; } +.fa-face-laugh::before { content: "\f599"; } +.fa-face-laugh-beam::before { content: "\f59a"; } +.fa-face-laugh-squint::before { content: "\f59b"; } +.fa-face-laugh-wink::before { content: "\f59c"; } +.fa-face-lying::before { content: "\e37e"; } +.fa-face-mask::before { content: "\e37f"; } +.fa-face-meh::before { content: "\f11a"; } +.fa-face-meh-blank::before { content: "\f5a4"; } +.fa-face-melting::before { content: "\e483"; } +.fa-face-monocle::before { content: "\e380"; } +.fa-face-nauseated::before { content: "\e381"; } +.fa-face-nose-steam::before { content: "\e382"; } +.fa-face-party::before { content: "\e383"; } +.fa-face-pensive::before { content: "\e384"; } +.fa-face-persevering::before { content: "\e385"; } +.fa-face-pleading::before { content: "\e386"; } +.fa-face-pouting::before { content: "\e387"; } +.fa-face-raised-eyebrow::before { content: "\e388"; } +.fa-face-relieved::before { content: "\e389"; } +.fa-face-rolling-eyes::before { content: "\f5a5"; } +.fa-face-sad-cry::before { content: "\f5b3"; } +.fa-face-sad-sweat::before { content: "\e38a"; } +.fa-face-sad-tear::before { content: "\f5b4"; } +.fa-face-saluting::before { content: "\e484"; } +.fa-face-scream::before { content: "\e38b"; } +.fa-face-shush::before { content: "\e38c"; } +.fa-face-sleeping::before { content: "\e38d"; } +.fa-face-sleepy::before { content: "\e38e"; } +.fa-face-smile::before { content: "\f118"; } +.fa-face-smile-beam::before { content: "\f5b8"; } +.fa-face-smile-halo::before { content: "\e38f"; } +.fa-face-smile-hearts::before { content: "\e390"; } +.fa-face-smile-horns::before { content: "\e391"; } +.fa-face-smile-plus::before { content: "\f5b9"; } +.fa-face-smile-relaxed::before { content: "\e392"; } +.fa-face-smile-tear::before { content: "\e393"; } +.fa-face-smile-tongue::before { content: "\e394"; } +.fa-face-smile-upside-down::before { content: "\e395"; } +.fa-face-smile-wink::before { content: "\f4da"; } +.fa-face-smiling-hands::before { content: "\e396"; } +.fa-face-smirking::before { content: "\e397"; } +.fa-face-spiral-eyes::before { content: "\e485"; } +.fa-face-sunglasses::before { content: "\e398"; } +.fa-face-surprise::before { content: "\f5c2"; } +.fa-face-swear::before { content: "\e399"; } +.fa-face-thermometer::before { content: "\e39a"; } +.fa-face-thinking::before { content: "\e39b"; } +.fa-face-tired::before { content: "\f5c8"; } +.fa-face-tissue::before { content: "\e39c"; } +.fa-face-tongue-money::before { content: "\e39d"; } +.fa-face-tongue-sweat::before { content: "\e39e"; } +.fa-face-unamused::before { content: "\e39f"; } +.fa-face-viewfinder::before { content: "\e2ff"; } +.fa-face-vomit::before { content: "\e3a0"; } +.fa-face-weary::before { content: "\e3a1"; } +.fa-face-woozy::before { content: "\e3a2"; } +.fa-face-worried::before { content: "\e3a3"; } +.fa-face-zany::before { content: "\e3a4"; } +.fa-face-zipper::before { content: "\e3a5"; } +.fa-falafel::before { content: "\e40a"; } +.fa-family::before { content: "\e300"; } +.fa-family-dress::before { content: "\e301"; } +.fa-family-pants::before { content: "\e302"; } +.fa-fan::before { content: "\f863"; } +.fa-fan-table::before { content: "\e004"; } +.fa-farm::before { content: "\f864"; } +.fa-fast-backward::before { content: "\f049"; } +.fa-fast-forward::before { content: "\f050"; } +.fa-faucet::before { content: "\e005"; } +.fa-faucet-drip::before { content: "\e006"; } +.fa-fax::before { content: "\f1ac"; } +.fa-feather::before { content: "\f52d"; } +.fa-feather-alt::before { content: "\f56b"; } +.fa-feather-pointed::before { content: "\f56b"; } +.fa-feed::before { content: "\f09e"; } +.fa-female::before { content: "\f182"; } +.fa-fence::before { content: "\e303"; } +.fa-ferris-wheel::before { content: "\e174"; } +.fa-ferry::before { content: "\e4ea"; } +.fa-field-hockey::before { content: "\f44c"; } +.fa-field-hockey-stick-ball::before { content: "\f44c"; } +.fa-fighter-jet::before { content: "\f0fb"; } +.fa-file::before { content: "\f15b"; } +.fa-file-alt::before { content: "\f15c"; } +.fa-file-archive::before { content: "\f1c6"; } +.fa-file-arrow-down::before { content: "\f56d"; } +.fa-file-arrow-up::before { content: "\f574"; } +.fa-file-audio::before { content: "\f1c7"; } +.fa-file-award::before { content: "\f5f3"; } +.fa-file-binary::before { content: "\e175"; } +.fa-file-cad::before { content: "\e672"; } +.fa-file-caret-down::before { content: "\e429"; } +.fa-file-caret-up::before { content: "\e42a"; } +.fa-file-certificate::before { content: "\f5f3"; } +.fa-file-chart-column::before { content: "\f659"; } +.fa-file-chart-line::before { content: "\f659"; } +.fa-file-chart-pie::before { content: "\f65a"; } +.fa-file-check::before { content: "\f316"; } +.fa-file-circle-check::before { content: "\e5a0"; } +.fa-file-circle-exclamation::before { content: "\e4eb"; } +.fa-file-circle-info::before { content: "\e493"; } +.fa-file-circle-minus::before { content: "\e4ed"; } +.fa-file-circle-plus::before { content: "\e494"; } +.fa-file-circle-question::before { content: "\e4ef"; } +.fa-file-circle-xmark::before { content: "\e5a1"; } +.fa-file-clipboard::before { content: "\f0ea"; } +.fa-file-code::before { content: "\f1c9"; } +.fa-file-contract::before { content: "\f56c"; } +.fa-file-csv::before { content: "\f6dd"; } +.fa-file-dashed-line::before { content: "\f877"; } +.fa-file-doc::before { content: "\e5ed"; } +.fa-file-download::before { content: "\f56d"; } +.fa-file-edit::before { content: "\f31c"; } +.fa-file-eps::before { content: "\e644"; } +.fa-file-excel::before { content: "\f1c3"; } +.fa-file-exclamation::before { content: "\f31a"; } +.fa-file-export::before { content: "\f56e"; } +.fa-file-gif::before { content: "\e645"; } +.fa-file-heart::before { content: "\e176"; } +.fa-file-image::before { content: "\f1c5"; } +.fa-file-import::before { content: "\f56f"; } +.fa-file-invoice::before { content: "\f570"; } +.fa-file-invoice-dollar::before { content: "\f571"; } +.fa-file-jpg::before { content: "\e646"; } +.fa-file-lines::before { content: "\f15c"; } +.fa-file-lock::before { content: "\e3a6"; } +.fa-file-magnifying-glass::before { content: "\f865"; } +.fa-file-medical::before { content: "\f477"; } +.fa-file-medical-alt::before { content: "\f478"; } +.fa-file-minus::before { content: "\f318"; } +.fa-file-mov::before { content: "\e647"; } +.fa-file-mp3::before { content: "\e648"; } +.fa-file-mp4::before { content: "\e649"; } +.fa-file-music::before { content: "\f8b6"; } +.fa-file-pdf::before { content: "\f1c1"; } +.fa-file-pen::before { content: "\f31c"; } +.fa-file-plus::before { content: "\f319"; } +.fa-file-plus-minus::before { content: "\e177"; } +.fa-file-png::before { content: "\e666"; } +.fa-file-powerpoint::before { content: "\f1c4"; } +.fa-file-ppt::before { content: "\e64a"; } +.fa-file-prescription::before { content: "\f572"; } +.fa-file-search::before { content: "\f865"; } +.fa-file-shield::before { content: "\e4f0"; } +.fa-file-signature::before { content: "\f573"; } +.fa-file-slash::before { content: "\e3a7"; } +.fa-file-spreadsheet::before { content: "\f65b"; } +.fa-file-svg::before { content: "\e64b"; } +.fa-file-text::before { content: "\f15c"; } +.fa-file-times::before { content: "\f317"; } +.fa-file-upload::before { content: "\f574"; } +.fa-file-user::before { content: "\f65c"; } +.fa-file-vector::before { content: "\e64c"; } +.fa-file-video::before { content: "\f1c8"; } +.fa-file-waveform::before { content: "\f478"; } +.fa-file-word::before { content: "\f1c2"; } +.fa-file-xls::before { content: "\e64d"; } +.fa-file-xmark::before { content: "\f317"; } +.fa-file-xml::before { content: "\e654"; } +.fa-file-zip::before { content: "\e5ee"; } +.fa-file-zipper::before { content: "\f1c6"; } +.fa-files::before { content: "\e178"; } +.fa-files-medical::before { content: "\f7fd"; } +.fa-fill::before { content: "\f575"; } +.fa-fill-drip::before { content: "\f576"; } +.fa-film::before { content: "\f008"; } +.fa-film-alt::before { content: "\f3a0"; } +.fa-film-canister::before { content: "\f8b7"; } +.fa-film-cannister::before { content: "\f8b7"; } +.fa-film-simple::before { content: "\f3a0"; } +.fa-film-slash::before { content: "\e179"; } +.fa-films::before { content: "\e17a"; } +.fa-filter::before { content: "\f0b0"; } +.fa-filter-circle-dollar::before { content: "\f662"; } +.fa-filter-circle-xmark::before { content: "\e17b"; } +.fa-filter-list::before { content: "\e17c"; } +.fa-filter-slash::before { content: "\e17d"; } +.fa-filters::before { content: "\e17e"; } +.fa-fingerprint::before { content: "\f577"; } +.fa-fire::before { content: "\f06d"; } +.fa-fire-alt::before { content: "\f7e4"; } +.fa-fire-burner::before { content: "\e4f1"; } +.fa-fire-extinguisher::before { content: "\f134"; } +.fa-fire-flame::before { content: "\f6df"; } +.fa-fire-flame-curved::before { content: "\f7e4"; } +.fa-fire-flame-simple::before { content: "\f46a"; } +.fa-fire-hydrant::before { content: "\e17f"; } +.fa-fire-smoke::before { content: "\f74b"; } +.fa-fireplace::before { content: "\f79a"; } +.fa-firewall::before { content: "\e3dc"; } +.fa-first-aid::before { content: "\f479"; } +.fa-fish::before { content: "\f578"; } +.fa-fish-bones::before { content: "\e304"; } +.fa-fish-cooked::before { content: "\f7fe"; } +.fa-fish-fins::before { content: "\e4f2"; } +.fa-fishing-rod::before { content: "\e3a8"; } +.fa-fist-raised::before { content: "\f6de"; } +.fa-flag::before { content: "\f024"; } +.fa-flag-alt::before { content: "\f74c"; } +.fa-flag-checkered::before { content: "\f11e"; } +.fa-flag-pennant::before { content: "\f456"; } +.fa-flag-swallowtail::before { content: "\f74c"; } +.fa-flag-usa::before { content: "\f74d"; } +.fa-flame::before { content: "\f6df"; } +.fa-flashlight::before { content: "\f8b8"; } +.fa-flask::before { content: "\f0c3"; } +.fa-flask-gear::before { content: "\e5f1"; } +.fa-flask-poison::before { content: "\f6e0"; } +.fa-flask-potion::before { content: "\f6e1"; } +.fa-flask-round-poison::before { content: "\f6e0"; } +.fa-flask-round-potion::before { content: "\f6e1"; } +.fa-flask-vial::before { content: "\e4f3"; } +.fa-flatbread::before { content: "\e40b"; } +.fa-flatbread-stuffed::before { content: "\e40c"; } +.fa-floppy-disk::before { content: "\f0c7"; } +.fa-floppy-disk-circle-arrow-right::before { content: "\e180"; } +.fa-floppy-disk-circle-xmark::before { content: "\e181"; } +.fa-floppy-disk-pen::before { content: "\e182"; } +.fa-floppy-disk-times::before { content: "\e181"; } +.fa-floppy-disks::before { content: "\e183"; } +.fa-florin-sign::before { content: "\e184"; } +.fa-flower::before { content: "\f7ff"; } +.fa-flower-daffodil::before { content: "\f800"; } +.fa-flower-tulip::before { content: "\f801"; } +.fa-flushed::before { content: "\f579"; } +.fa-flute::before { content: "\f8b9"; } +.fa-flux-capacitor::before { content: "\f8ba"; } +.fa-flying-disc::before { content: "\e3a9"; } +.fa-fog::before { content: "\f74e"; } +.fa-folder::before { content: "\f07b"; } +.fa-folder-arrow-down::before { content: "\e053"; } +.fa-folder-arrow-up::before { content: "\e054"; } +.fa-folder-blank::before { content: "\f07b"; } +.fa-folder-bookmark::before { content: "\e186"; } +.fa-folder-check::before { content: "\e64e"; } +.fa-folder-closed::before { content: "\e185"; } +.fa-folder-cog::before { content: "\e187"; } +.fa-folder-download::before { content: "\e053"; } +.fa-folder-gear::before { content: "\e187"; } +.fa-folder-grid::before { content: "\e188"; } +.fa-folder-heart::before { content: "\e189"; } +.fa-folder-image::before { content: "\e18a"; } +.fa-folder-magnifying-glass::before { content: "\e18b"; } +.fa-folder-medical::before { content: "\e18c"; } +.fa-folder-minus::before { content: "\f65d"; } +.fa-folder-music::before { content: "\e18d"; } +.fa-folder-open::before { content: "\f07c"; } +.fa-folder-plus::before { content: "\f65e"; } +.fa-folder-search::before { content: "\e18b"; } +.fa-folder-times::before { content: "\f65f"; } +.fa-folder-tree::before { content: "\f802"; } +.fa-folder-upload::before { content: "\e054"; } +.fa-folder-user::before { content: "\e18e"; } +.fa-folder-xmark::before { content: "\f65f"; } +.fa-folders::before { content: "\f660"; } +.fa-fondue-pot::before { content: "\e40d"; } +.fa-font::before { content: "\f031"; } +.fa-font-awesome::before { content: "\f2b4"; } +.fa-font-awesome-flag::before { content: "\f2b4"; } +.fa-font-awesome-logo-full::before { content: "\f2b4"; } +.fa-font-case::before { content: "\f866"; } +.fa-football::before { content: "\f44e"; } +.fa-football-ball::before { content: "\f44e"; } +.fa-football-helmet::before { content: "\f44f"; } +.fa-fork::before { content: "\f2e3"; } +.fa-fork-knife::before { content: "\f2e6"; } +.fa-forklift::before { content: "\f47a"; } +.fa-fort::before { content: "\e486"; } +.fa-forward::before { content: "\f04e"; } +.fa-forward-fast::before { content: "\f050"; } +.fa-forward-step::before { content: "\f051"; } +.fa-fragile::before { content: "\f4bb"; } +.fa-frame::before { content: "\e495"; } +.fa-franc-sign::before { content: "\e18f"; } +.fa-french-fries::before { content: "\f803"; } +.fa-frog::before { content: "\f52e"; } +.fa-frosty-head::before { content: "\f79b"; } +.fa-frown::before { content: "\f119"; } +.fa-frown-open::before { content: "\f57a"; } +.fa-function::before { content: "\f661"; } +.fa-funnel-dollar::before { content: "\f662"; } +.fa-futbol::before { content: "\f1e3"; } +.fa-futbol-ball::before { content: "\f1e3"; } +.fa-g::before { content: "\47"; } +.fa-galaxy::before { content: "\e008"; } +.fa-gallery-thumbnails::before { content: "\e3aa"; } +.fa-game-board::before { content: "\f867"; } +.fa-game-board-alt::before { content: "\f868"; } +.fa-game-board-simple::before { content: "\f868"; } +.fa-game-console-handheld::before { content: "\f8bb"; } +.fa-game-console-handheld-crank::before { content: "\e5b9"; } +.fa-gamepad::before { content: "\f11b"; } +.fa-gamepad-alt::before { content: "\e5a2"; } +.fa-gamepad-modern::before { content: "\e5a2"; } +.fa-garage::before { content: "\e009"; } +.fa-garage-car::before { content: "\e00a"; } +.fa-garage-open::before { content: "\e00b"; } +.fa-garlic::before { content: "\e40e"; } +.fa-gas-pump::before { content: "\f52f"; } +.fa-gas-pump-slash::before { content: "\f5f4"; } +.fa-gauge::before { content: "\f624"; } +.fa-gauge-circle-bolt::before { content: "\e496"; } +.fa-gauge-circle-minus::before { content: "\e497"; } +.fa-gauge-circle-plus::before { content: "\e498"; } +.fa-gauge-high::before { content: "\f625"; } +.fa-gauge-low::before { content: "\f627"; } +.fa-gauge-max::before { content: "\f626"; } +.fa-gauge-med::before { content: "\f624"; } +.fa-gauge-min::before { content: "\f628"; } +.fa-gauge-simple::before { content: "\f629"; } +.fa-gauge-simple-high::before { content: "\f62a"; } +.fa-gauge-simple-low::before { content: "\f62c"; } +.fa-gauge-simple-max::before { content: "\f62b"; } +.fa-gauge-simple-med::before { content: "\f629"; } +.fa-gauge-simple-min::before { content: "\f62d"; } +.fa-gave-dandy::before { content: "\e409"; } +.fa-gavel::before { content: "\f0e3"; } +.fa-gbp::before { content: "\f154"; } +.fa-gear::before { content: "\f013"; } +.fa-gear-code::before { content: "\e5e8"; } +.fa-gear-complex::before { content: "\e5e9"; } +.fa-gear-complex-code::before { content: "\e5eb"; } +.fa-gears::before { content: "\f085"; } +.fa-gem::before { content: "\f3a5"; } +.fa-genderless::before { content: "\f22d"; } +.fa-ghost::before { content: "\f6e2"; } +.fa-gif::before { content: "\e190"; } +.fa-gift::before { content: "\f06b"; } +.fa-gift-card::before { content: "\f663"; } +.fa-gifts::before { content: "\f79c"; } +.fa-gingerbread-man::before { content: "\f79d"; } +.fa-glass::before { content: "\f804"; } +.fa-glass-champagne::before { content: "\f79e"; } +.fa-glass-cheers::before { content: "\f79f"; } +.fa-glass-citrus::before { content: "\f869"; } +.fa-glass-empty::before { content: "\e191"; } +.fa-glass-half::before { content: "\e192"; } +.fa-glass-half-empty::before { content: "\e192"; } +.fa-glass-half-full::before { content: "\e192"; } +.fa-glass-martini::before { content: "\f000"; } +.fa-glass-martini-alt::before { content: "\f57b"; } +.fa-glass-water::before { content: "\e4f4"; } +.fa-glass-water-droplet::before { content: "\e4f5"; } +.fa-glass-whiskey::before { content: "\f7a0"; } +.fa-glass-whiskey-rocks::before { content: "\f7a1"; } +.fa-glasses::before { content: "\f530"; } +.fa-glasses-alt::before { content: "\f5f5"; } +.fa-glasses-round::before { content: "\f5f5"; } +.fa-globe::before { content: "\f0ac"; } +.fa-globe-africa::before { content: "\f57c"; } +.fa-globe-americas::before { content: "\f57d"; } +.fa-globe-asia::before { content: "\f57e"; } +.fa-globe-europe::before { content: "\f7a2"; } +.fa-globe-oceania::before { content: "\e47b"; } +.fa-globe-pointer::before { content: "\e60e"; } +.fa-globe-snow::before { content: "\f7a3"; } +.fa-globe-stand::before { content: "\f5f6"; } +.fa-globe-wifi::before { content: "\e685"; } +.fa-glove-boxing::before { content: "\f438"; } +.fa-goal-net::before { content: "\e3ab"; } +.fa-golf-ball::before { content: "\f450"; } +.fa-golf-ball-tee::before { content: "\f450"; } +.fa-golf-club::before { content: "\f451"; } +.fa-golf-flag-hole::before { content: "\e3ac"; } +.fa-gopuram::before { content: "\f664"; } +.fa-graduation-cap::before { content: "\f19d"; } +.fa-gramophone::before { content: "\f8bd"; } +.fa-grapes::before { content: "\e306"; } +.fa-grate::before { content: "\e193"; } +.fa-grate-droplet::before { content: "\e194"; } +.fa-greater-than::before { content: "\3e"; } +.fa-greater-than-equal::before { content: "\f532"; } +.fa-grid::before { content: "\e195"; } +.fa-grid-2::before { content: "\e196"; } +.fa-grid-2-plus::before { content: "\e197"; } +.fa-grid-3::before { content: "\e195"; } +.fa-grid-4::before { content: "\e198"; } +.fa-grid-5::before { content: "\e199"; } +.fa-grid-dividers::before { content: "\e3ad"; } +.fa-grid-horizontal::before { content: "\e307"; } +.fa-grid-round::before { content: "\e5da"; } +.fa-grid-round-2::before { content: "\e5db"; } +.fa-grid-round-2-plus::before { content: "\e5dc"; } +.fa-grid-round-4::before { content: "\e5dd"; } +.fa-grid-round-5::before { content: "\e5de"; } +.fa-grill::before { content: "\e5a3"; } +.fa-grill-fire::before { content: "\e5a4"; } +.fa-grill-hot::before { content: "\e5a5"; } +.fa-grimace::before { content: "\f57f"; } +.fa-grin::before { content: "\f580"; } +.fa-grin-alt::before { content: "\f581"; } +.fa-grin-beam::before { content: "\f582"; } +.fa-grin-beam-sweat::before { content: "\f583"; } +.fa-grin-hearts::before { content: "\f584"; } +.fa-grin-squint::before { content: "\f585"; } +.fa-grin-squint-tears::before { content: "\f586"; } +.fa-grin-stars::before { content: "\f587"; } +.fa-grin-tears::before { content: "\f588"; } +.fa-grin-tongue::before { content: "\f589"; } +.fa-grin-tongue-squint::before { content: "\f58a"; } +.fa-grin-tongue-wink::before { content: "\f58b"; } +.fa-grin-wink::before { content: "\f58c"; } +.fa-grip::before { content: "\f58d"; } +.fa-grip-dots::before { content: "\e410"; } +.fa-grip-dots-vertical::before { content: "\e411"; } +.fa-grip-horizontal::before { content: "\f58d"; } +.fa-grip-lines::before { content: "\f7a4"; } +.fa-grip-lines-vertical::before { content: "\f7a5"; } +.fa-grip-vertical::before { content: "\f58e"; } +.fa-group-arrows-rotate::before { content: "\e4f6"; } +.fa-guarani-sign::before { content: "\e19a"; } +.fa-guitar::before { content: "\f7a6"; } +.fa-guitar-electric::before { content: "\f8be"; } +.fa-guitars::before { content: "\f8bf"; } +.fa-gun::before { content: "\e19b"; } +.fa-gun-slash::before { content: "\e19c"; } +.fa-gun-squirt::before { content: "\e19d"; } +.fa-h::before { content: "\48"; } +.fa-h-square::before { content: "\f0fd"; } +.fa-h1::before { content: "\f313"; } +.fa-h2::before { content: "\f314"; } +.fa-h3::before { content: "\f315"; } +.fa-h4::before { content: "\f86a"; } +.fa-h5::before { content: "\e412"; } +.fa-h6::before { content: "\e413"; } +.fa-hamburger::before { content: "\f805"; } +.fa-hammer::before { content: "\f6e3"; } +.fa-hammer-brush::before { content: "\e620"; } +.fa-hammer-crash::before { content: "\e414"; } +.fa-hammer-war::before { content: "\f6e4"; } +.fa-hamsa::before { content: "\f665"; } +.fa-hand::before { content: "\f256"; } +.fa-hand-back-fist::before { content: "\f255"; } +.fa-hand-back-point-down::before { content: "\e19e"; } +.fa-hand-back-point-left::before { content: "\e19f"; } +.fa-hand-back-point-ribbon::before { content: "\e1a0"; } +.fa-hand-back-point-right::before { content: "\e1a1"; } +.fa-hand-back-point-up::before { content: "\e1a2"; } +.fa-hand-dots::before { content: "\f461"; } +.fa-hand-fingers-crossed::before { content: "\e1a3"; } +.fa-hand-fist::before { content: "\f6de"; } +.fa-hand-heart::before { content: "\f4bc"; } +.fa-hand-holding::before { content: "\f4bd"; } +.fa-hand-holding-box::before { content: "\f47b"; } +.fa-hand-holding-circle-dollar::before { content: "\e621"; } +.fa-hand-holding-dollar::before { content: "\f4c0"; } +.fa-hand-holding-droplet::before { content: "\f4c1"; } +.fa-hand-holding-hand::before { content: "\e4f7"; } +.fa-hand-holding-heart::before { content: "\f4be"; } +.fa-hand-holding-magic::before { content: "\f6e5"; } +.fa-hand-holding-medical::before { content: "\e05c"; } +.fa-hand-holding-seedling::before { content: "\f4bf"; } +.fa-hand-holding-skull::before { content: "\e1a4"; } +.fa-hand-holding-usd::before { content: "\f4c0"; } +.fa-hand-holding-water::before { content: "\f4c1"; } +.fa-hand-horns::before { content: "\e1a9"; } +.fa-hand-lizard::before { content: "\f258"; } +.fa-hand-love::before { content: "\e1a5"; } +.fa-hand-middle-finger::before { content: "\f806"; } +.fa-hand-paper::before { content: "\f256"; } +.fa-hand-peace::before { content: "\f25b"; } +.fa-hand-point-down::before { content: "\f0a7"; } +.fa-hand-point-left::before { content: "\f0a5"; } +.fa-hand-point-ribbon::before { content: "\e1a6"; } +.fa-hand-point-right::before { content: "\f0a4"; } +.fa-hand-point-up::before { content: "\f0a6"; } +.fa-hand-pointer::before { content: "\f25a"; } +.fa-hand-receiving::before { content: "\f47c"; } +.fa-hand-rock::before { content: "\f255"; } +.fa-hand-scissors::before { content: "\f257"; } +.fa-hand-sparkles::before { content: "\e05d"; } +.fa-hand-spock::before { content: "\f259"; } +.fa-hand-wave::before { content: "\e1a7"; } +.fa-handcuffs::before { content: "\e4f8"; } +.fa-hands::before { content: "\f2a7"; } +.fa-hands-american-sign-language-interpreting::before { content: "\f2a3"; } +.fa-hands-asl-interpreting::before { content: "\f2a3"; } +.fa-hands-bound::before { content: "\e4f9"; } +.fa-hands-bubbles::before { content: "\e05e"; } +.fa-hands-clapping::before { content: "\e1a8"; } +.fa-hands-heart::before { content: "\f4c3"; } +.fa-hands-helping::before { content: "\f4c4"; } +.fa-hands-holding::before { content: "\f4c2"; } +.fa-hands-holding-child::before { content: "\e4fa"; } +.fa-hands-holding-circle::before { content: "\e4fb"; } +.fa-hands-holding-diamond::before { content: "\f47c"; } +.fa-hands-holding-dollar::before { content: "\f4c5"; } +.fa-hands-holding-heart::before { content: "\f4c3"; } +.fa-hands-praying::before { content: "\f684"; } +.fa-hands-usd::before { content: "\f4c5"; } +.fa-hands-wash::before { content: "\e05e"; } +.fa-handshake::before { content: "\f2b5"; } +.fa-handshake-alt::before { content: "\f4c6"; } +.fa-handshake-alt-slash::before { content: "\e05f"; } +.fa-handshake-angle::before { content: "\f4c4"; } +.fa-handshake-simple::before { content: "\f4c6"; } +.fa-handshake-simple-slash::before { content: "\e05f"; } +.fa-handshake-slash::before { content: "\e060"; } +.fa-hanukiah::before { content: "\f6e6"; } +.fa-hard-drive::before { content: "\f0a0"; } +.fa-hard-hat::before { content: "\f807"; } +.fa-hard-of-hearing::before { content: "\f2a4"; } +.fa-hashtag::before { content: "\23"; } +.fa-hashtag-lock::before { content: "\e415"; } +.fa-hat-beach::before { content: "\e606"; } +.fa-hat-chef::before { content: "\f86b"; } +.fa-hat-cowboy::before { content: "\f8c0"; } +.fa-hat-cowboy-side::before { content: "\f8c1"; } +.fa-hat-hard::before { content: "\f807"; } +.fa-hat-santa::before { content: "\f7a7"; } +.fa-hat-winter::before { content: "\f7a8"; } +.fa-hat-witch::before { content: "\f6e7"; } +.fa-hat-wizard::before { content: "\f6e8"; } +.fa-haykal::before { content: "\f666"; } +.fa-hdd::before { content: "\f0a0"; } +.fa-head-side::before { content: "\f6e9"; } +.fa-head-side-brain::before { content: "\f808"; } +.fa-head-side-cough::before { content: "\e061"; } +.fa-head-side-cough-slash::before { content: "\e062"; } +.fa-head-side-gear::before { content: "\e611"; } +.fa-head-side-goggles::before { content: "\f6ea"; } +.fa-head-side-headphones::before { content: "\f8c2"; } +.fa-head-side-heart::before { content: "\e1aa"; } +.fa-head-side-mask::before { content: "\e063"; } +.fa-head-side-medical::before { content: "\f809"; } +.fa-head-side-virus::before { content: "\e064"; } +.fa-head-vr::before { content: "\f6ea"; } +.fa-header::before { content: "\f1dc"; } +.fa-heading::before { content: "\f1dc"; } +.fa-headphones::before { content: "\f025"; } +.fa-headphones-alt::before { content: "\f58f"; } +.fa-headphones-simple::before { content: "\f58f"; } +.fa-headset::before { content: "\f590"; } +.fa-heart::before { content: "\f004"; } +.fa-heart-broken::before { content: "\f7a9"; } +.fa-heart-circle::before { content: "\f4c7"; } +.fa-heart-circle-bolt::before { content: "\e4fc"; } +.fa-heart-circle-check::before { content: "\e4fd"; } +.fa-heart-circle-exclamation::before { content: "\e4fe"; } +.fa-heart-circle-minus::before { content: "\e4ff"; } +.fa-heart-circle-plus::before { content: "\e500"; } +.fa-heart-circle-xmark::before { content: "\e501"; } +.fa-heart-crack::before { content: "\f7a9"; } +.fa-heart-half::before { content: "\e1ab"; } +.fa-heart-half-alt::before { content: "\e1ac"; } +.fa-heart-half-stroke::before { content: "\e1ac"; } +.fa-heart-music-camera-bolt::before { content: "\f86d"; } +.fa-heart-pulse::before { content: "\f21e"; } +.fa-heart-rate::before { content: "\f5f8"; } +.fa-heart-square::before { content: "\f4c8"; } +.fa-heartbeat::before { content: "\f21e"; } +.fa-heat::before { content: "\e00c"; } +.fa-helicopter::before { content: "\f533"; } +.fa-helicopter-symbol::before { content: "\e502"; } +.fa-helmet-battle::before { content: "\f6eb"; } +.fa-helmet-safety::before { content: "\f807"; } +.fa-helmet-un::before { content: "\e503"; } +.fa-hexagon::before { content: "\f312"; } +.fa-hexagon-check::before { content: "\e416"; } +.fa-hexagon-divide::before { content: "\e1ad"; } +.fa-hexagon-exclamation::before { content: "\e417"; } +.fa-hexagon-image::before { content: "\e504"; } +.fa-hexagon-minus::before { content: "\f307"; } +.fa-hexagon-plus::before { content: "\f300"; } +.fa-hexagon-vertical-nft::before { content: "\e505"; } +.fa-hexagon-vertical-nft-slanted::before { content: "\e506"; } +.fa-hexagon-xmark::before { content: "\f2ee"; } +.fa-high-definition::before { content: "\e1ae"; } +.fa-highlighter::before { content: "\f591"; } +.fa-highlighter-line::before { content: "\e1af"; } +.fa-hiking::before { content: "\f6ec"; } +.fa-hill-avalanche::before { content: "\e507"; } +.fa-hill-rockslide::before { content: "\e508"; } +.fa-hippo::before { content: "\f6ed"; } +.fa-history::before { content: "\f1da"; } +.fa-hockey-mask::before { content: "\f6ee"; } +.fa-hockey-puck::before { content: "\f453"; } +.fa-hockey-stick-puck::before { content: "\e3ae"; } +.fa-hockey-sticks::before { content: "\f454"; } +.fa-holly-berry::before { content: "\f7aa"; } +.fa-home::before { content: "\f015"; } +.fa-home-alt::before { content: "\f015"; } +.fa-home-blank::before { content: "\e487"; } +.fa-home-heart::before { content: "\f4c9"; } +.fa-home-lg::before { content: "\e3af"; } +.fa-home-lg-alt::before { content: "\f015"; } +.fa-home-user::before { content: "\e1b0"; } +.fa-honey-pot::before { content: "\e418"; } +.fa-hood-cloak::before { content: "\f6ef"; } +.fa-horizontal-rule::before { content: "\f86c"; } +.fa-horse::before { content: "\f6f0"; } +.fa-horse-head::before { content: "\f7ab"; } +.fa-horse-saddle::before { content: "\f8c3"; } +.fa-hose::before { content: "\e419"; } +.fa-hose-reel::before { content: "\e41a"; } +.fa-hospital::before { content: "\f0f8"; } +.fa-hospital-alt::before { content: "\f0f8"; } +.fa-hospital-symbol::before { content: "\f47e"; } +.fa-hospital-user::before { content: "\f80d"; } +.fa-hospital-wide::before { content: "\f0f8"; } +.fa-hospitals::before { content: "\f80e"; } +.fa-hot-tub::before { content: "\f593"; } +.fa-hot-tub-person::before { content: "\f593"; } +.fa-hotdog::before { content: "\f80f"; } +.fa-hotel::before { content: "\f594"; } +.fa-hourglass::before { content: "\f254"; } +.fa-hourglass-1::before { content: "\f251"; } +.fa-hourglass-2::before { content: "\f252"; } +.fa-hourglass-3::before { content: "\f253"; } +.fa-hourglass-clock::before { content: "\e41b"; } +.fa-hourglass-empty::before { content: "\f254"; } +.fa-hourglass-end::before { content: "\f253"; } +.fa-hourglass-half::before { content: "\f252"; } +.fa-hourglass-start::before { content: "\f251"; } +.fa-house::before { content: "\f015"; } +.fa-house-blank::before { content: "\e487"; } +.fa-house-building::before { content: "\e1b1"; } +.fa-house-chimney::before { content: "\e3af"; } +.fa-house-chimney-blank::before { content: "\e3b0"; } +.fa-house-chimney-crack::before { content: "\f6f1"; } +.fa-house-chimney-heart::before { content: "\e1b2"; } +.fa-house-chimney-medical::before { content: "\f7f2"; } +.fa-house-chimney-user::before { content: "\e065"; } +.fa-house-chimney-window::before { content: "\e00d"; } +.fa-house-circle-check::before { content: "\e509"; } +.fa-house-circle-exclamation::before { content: "\e50a"; } +.fa-house-circle-xmark::before { content: "\e50b"; } +.fa-house-crack::before { content: "\e3b1"; } +.fa-house-damage::before { content: "\f6f1"; } +.fa-house-day::before { content: "\e00e"; } +.fa-house-fire::before { content: "\e50c"; } +.fa-house-flag::before { content: "\e50d"; } +.fa-house-flood::before { content: "\f74f"; } +.fa-house-flood-water::before { content: "\e50e"; } +.fa-house-flood-water-circle-arrow-right::before { content: "\e50f"; } +.fa-house-heart::before { content: "\f4c9"; } +.fa-house-laptop::before { content: "\e066"; } +.fa-house-leave::before { content: "\e00f"; } +.fa-house-lock::before { content: "\e510"; } +.fa-house-medical::before { content: "\e3b2"; } +.fa-house-medical-circle-check::before { content: "\e511"; } +.fa-house-medical-circle-exclamation::before { content: "\e512"; } +.fa-house-medical-circle-xmark::before { content: "\e513"; } +.fa-house-medical-flag::before { content: "\e514"; } +.fa-house-night::before { content: "\e010"; } +.fa-house-person-arrive::before { content: "\e011"; } +.fa-house-person-depart::before { content: "\e00f"; } +.fa-house-person-leave::before { content: "\e00f"; } +.fa-house-person-return::before { content: "\e011"; } +.fa-house-return::before { content: "\e011"; } +.fa-house-signal::before { content: "\e012"; } +.fa-house-tree::before { content: "\e1b3"; } +.fa-house-tsunami::before { content: "\e515"; } +.fa-house-turret::before { content: "\e1b4"; } +.fa-house-user::before { content: "\e1b0"; } +.fa-house-water::before { content: "\f74f"; } +.fa-house-window::before { content: "\e3b3"; } +.fa-hryvnia::before { content: "\f6f2"; } +.fa-hryvnia-sign::before { content: "\f6f2"; } +.fa-humidity::before { content: "\f750"; } +.fa-hundred-points::before { content: "\e41c"; } +.fa-hurricane::before { content: "\f751"; } +.fa-hydra::before { content: "\e686"; } +.fa-hyphen::before { content: "\2d"; } +.fa-i::before { content: "\49"; } +.fa-i-cursor::before { content: "\f246"; } +.fa-ice-cream::before { content: "\f810"; } +.fa-ice-skate::before { content: "\f7ac"; } +.fa-icicles::before { content: "\f7ad"; } +.fa-icons::before { content: "\f86d"; } +.fa-icons-alt::before { content: "\f86e"; } +.fa-id-badge::before { content: "\f2c1"; } +.fa-id-card::before { content: "\f2c2"; } +.fa-id-card-alt::before { content: "\f47f"; } +.fa-id-card-clip::before { content: "\f47f"; } +.fa-igloo::before { content: "\f7ae"; } +.fa-ils::before { content: "\f20b"; } +.fa-image::before { content: "\f03e"; } +.fa-image-landscape::before { content: "\e1b5"; } +.fa-image-polaroid::before { content: "\f8c4"; } +.fa-image-polaroid-user::before { content: "\e1b6"; } +.fa-image-portrait::before { content: "\f3e0"; } +.fa-image-slash::before { content: "\e1b7"; } +.fa-image-user::before { content: "\e1b8"; } +.fa-images::before { content: "\f302"; } +.fa-images-user::before { content: "\e1b9"; } +.fa-inbox::before { content: "\f01c"; } +.fa-inbox-arrow-down::before { content: "\f310"; } +.fa-inbox-arrow-up::before { content: "\f311"; } +.fa-inbox-full::before { content: "\e1ba"; } +.fa-inbox-in::before { content: "\f310"; } +.fa-inbox-out::before { content: "\f311"; } +.fa-inboxes::before { content: "\e1bb"; } +.fa-indent::before { content: "\f03c"; } +.fa-indian-rupee::before { content: "\e1bc"; } +.fa-indian-rupee-sign::before { content: "\e1bc"; } +.fa-industry::before { content: "\f275"; } +.fa-industry-alt::before { content: "\f3b3"; } +.fa-industry-windows::before { content: "\f3b3"; } +.fa-infinity::before { content: "\f534"; } +.fa-info::before { content: "\f129"; } +.fa-info-circle::before { content: "\f05a"; } +.fa-info-square::before { content: "\f30f"; } +.fa-inhaler::before { content: "\f5f9"; } +.fa-input-numeric::before { content: "\e1bd"; } +.fa-input-pipe::before { content: "\e1be"; } +.fa-input-text::before { content: "\e1bf"; } +.fa-inr::before { content: "\e1bc"; } +.fa-institution::before { content: "\f19c"; } +.fa-integral::before { content: "\f667"; } +.fa-interrobang::before { content: "\e5ba"; } +.fa-intersection::before { content: "\f668"; } +.fa-inventory::before { content: "\f480"; } +.fa-island-tree-palm::before { content: "\f811"; } +.fa-island-tropical::before { content: "\f811"; } +.fa-italic::before { content: "\f033"; } +.fa-j::before { content: "\4a"; } +.fa-jack-o-lantern::before { content: "\f30e"; } +.fa-jar::before { content: "\e516"; } +.fa-jar-wheat::before { content: "\e517"; } +.fa-jedi::before { content: "\f669"; } +.fa-jet-fighter::before { content: "\f0fb"; } +.fa-jet-fighter-up::before { content: "\e518"; } +.fa-joint::before { content: "\f595"; } +.fa-journal-whills::before { content: "\f66a"; } +.fa-joystick::before { content: "\f8c5"; } +.fa-jpy::before { content: "\f157"; } +.fa-jug::before { content: "\f8c6"; } +.fa-jug-bottle::before { content: "\e5fb"; } +.fa-jug-detergent::before { content: "\e519"; } +.fa-k::before { content: "\4b"; } +.fa-kaaba::before { content: "\f66b"; } +.fa-kazoo::before { content: "\f8c7"; } +.fa-kerning::before { content: "\f86f"; } +.fa-key::before { content: "\f084"; } +.fa-key-skeleton::before { content: "\f6f3"; } +.fa-key-skeleton-left-right::before { content: "\e3b4"; } +.fa-keyboard::before { content: "\f11c"; } +.fa-keyboard-brightness::before { content: "\e1c0"; } +.fa-keyboard-brightness-low::before { content: "\e1c1"; } +.fa-keyboard-down::before { content: "\e1c2"; } +.fa-keyboard-left::before { content: "\e1c3"; } +.fa-keynote::before { content: "\f66c"; } +.fa-khanda::before { content: "\f66d"; } +.fa-kidneys::before { content: "\f5fb"; } +.fa-kip-sign::before { content: "\e1c4"; } +.fa-kiss::before { content: "\f596"; } +.fa-kiss-beam::before { content: "\f597"; } +.fa-kiss-wink-heart::before { content: "\f598"; } +.fa-kit-medical::before { content: "\f479"; } +.fa-kitchen-set::before { content: "\e51a"; } +.fa-kite::before { content: "\f6f4"; } +.fa-kiwi-bird::before { content: "\f535"; } +.fa-kiwi-fruit::before { content: "\e30c"; } +.fa-knife::before { content: "\f2e4"; } +.fa-knife-kitchen::before { content: "\f6f5"; } +.fa-krw::before { content: "\f159"; } +.fa-l::before { content: "\4c"; } +.fa-lacrosse-stick::before { content: "\e3b5"; } +.fa-lacrosse-stick-ball::before { content: "\e3b6"; } +.fa-ladder-water::before { content: "\f5c5"; } +.fa-lambda::before { content: "\f66e"; } +.fa-lamp::before { content: "\f4ca"; } +.fa-lamp-desk::before { content: "\e014"; } +.fa-lamp-floor::before { content: "\e015"; } +.fa-lamp-street::before { content: "\e1c5"; } +.fa-land-mine-on::before { content: "\e51b"; } +.fa-landmark::before { content: "\f66f"; } +.fa-landmark-alt::before { content: "\f752"; } +.fa-landmark-dome::before { content: "\f752"; } +.fa-landmark-flag::before { content: "\e51c"; } +.fa-landmark-magnifying-glass::before { content: "\e622"; } +.fa-landscape::before { content: "\e1b5"; } +.fa-language::before { content: "\f1ab"; } +.fa-laptop::before { content: "\f109"; } +.fa-laptop-arrow-down::before { content: "\e1c6"; } +.fa-laptop-binary::before { content: "\e5e7"; } +.fa-laptop-code::before { content: "\f5fc"; } +.fa-laptop-file::before { content: "\e51d"; } +.fa-laptop-house::before { content: "\e066"; } +.fa-laptop-medical::before { content: "\f812"; } +.fa-laptop-mobile::before { content: "\f87a"; } +.fa-laptop-slash::before { content: "\e1c7"; } +.fa-lari-sign::before { content: "\e1c8"; } +.fa-lasso::before { content: "\f8c8"; } +.fa-lasso-sparkles::before { content: "\e1c9"; } +.fa-laugh::before { content: "\f599"; } +.fa-laugh-beam::before { content: "\f59a"; } +.fa-laugh-squint::before { content: "\f59b"; } +.fa-laugh-wink::before { content: "\f59c"; } +.fa-layer-group::before { content: "\f5fd"; } +.fa-layer-group-minus::before { content: "\f5fe"; } +.fa-layer-group-plus::before { content: "\f5ff"; } +.fa-layer-minus::before { content: "\f5fe"; } +.fa-layer-plus::before { content: "\f5ff"; } +.fa-leaf::before { content: "\f06c"; } +.fa-leaf-heart::before { content: "\f4cb"; } +.fa-leaf-maple::before { content: "\f6f6"; } +.fa-leaf-oak::before { content: "\f6f7"; } +.fa-leafy-green::before { content: "\e41d"; } +.fa-left::before { content: "\f355"; } +.fa-left-from-bracket::before { content: "\e66c"; } +.fa-left-from-line::before { content: "\f348"; } +.fa-left-long::before { content: "\f30a"; } +.fa-left-long-to-line::before { content: "\e41e"; } +.fa-left-right::before { content: "\f337"; } +.fa-left-to-bracket::before { content: "\e66d"; } +.fa-left-to-line::before { content: "\f34b"; } +.fa-legal::before { content: "\f0e3"; } +.fa-lemon::before { content: "\f094"; } +.fa-less-than::before { content: "\3c"; } +.fa-less-than-equal::before { content: "\f537"; } +.fa-level-down::before { content: "\f149"; } +.fa-level-down-alt::before { content: "\f3be"; } +.fa-level-up::before { content: "\f148"; } +.fa-level-up-alt::before { content: "\f3bf"; } +.fa-life-ring::before { content: "\f1cd"; } +.fa-light-ceiling::before { content: "\e016"; } +.fa-light-emergency::before { content: "\e41f"; } +.fa-light-emergency-on::before { content: "\e420"; } +.fa-light-switch::before { content: "\e017"; } +.fa-light-switch-off::before { content: "\e018"; } +.fa-light-switch-on::before { content: "\e019"; } +.fa-lightbulb::before { content: "\f0eb"; } +.fa-lightbulb-cfl::before { content: "\e5a6"; } +.fa-lightbulb-cfl-on::before { content: "\e5a7"; } +.fa-lightbulb-dollar::before { content: "\f670"; } +.fa-lightbulb-exclamation::before { content: "\f671"; } +.fa-lightbulb-exclamation-on::before { content: "\e1ca"; } +.fa-lightbulb-gear::before { content: "\e5fd"; } +.fa-lightbulb-message::before { content: "\e687"; } +.fa-lightbulb-on::before { content: "\f672"; } +.fa-lightbulb-slash::before { content: "\f673"; } +.fa-lighthouse::before { content: "\e612"; } +.fa-lights-holiday::before { content: "\f7b2"; } +.fa-line-chart::before { content: "\f201"; } +.fa-line-columns::before { content: "\f870"; } +.fa-line-height::before { content: "\f871"; } +.fa-lines-leaning::before { content: "\e51e"; } +.fa-link::before { content: "\f0c1"; } +.fa-link-horizontal::before { content: "\e1cb"; } +.fa-link-horizontal-slash::before { content: "\e1cc"; } +.fa-link-simple::before { content: "\e1cd"; } +.fa-link-simple-slash::before { content: "\e1ce"; } +.fa-link-slash::before { content: "\f127"; } +.fa-lips::before { content: "\f600"; } +.fa-lira-sign::before { content: "\f195"; } +.fa-list::before { content: "\f03a"; } +.fa-list-1-2::before { content: "\f0cb"; } +.fa-list-alt::before { content: "\f022"; } +.fa-list-check::before { content: "\f0ae"; } +.fa-list-dots::before { content: "\f0ca"; } +.fa-list-dropdown::before { content: "\e1cf"; } +.fa-list-music::before { content: "\f8c9"; } +.fa-list-numeric::before { content: "\f0cb"; } +.fa-list-ol::before { content: "\f0cb"; } +.fa-list-radio::before { content: "\e1d0"; } +.fa-list-squares::before { content: "\f03a"; } +.fa-list-timeline::before { content: "\e1d1"; } +.fa-list-tree::before { content: "\e1d2"; } +.fa-list-ul::before { content: "\f0ca"; } +.fa-litecoin-sign::before { content: "\e1d3"; } +.fa-loader::before { content: "\e1d4"; } +.fa-lobster::before { content: "\e421"; } +.fa-location::before { content: "\f601"; } +.fa-location-arrow::before { content: "\f124"; } +.fa-location-arrow-up::before { content: "\e63a"; } +.fa-location-check::before { content: "\f606"; } +.fa-location-circle::before { content: "\f602"; } +.fa-location-crosshairs::before { content: "\f601"; } +.fa-location-crosshairs-slash::before { content: "\f603"; } +.fa-location-dot::before { content: "\f3c5"; } +.fa-location-dot-slash::before { content: "\f605"; } +.fa-location-exclamation::before { content: "\f608"; } +.fa-location-minus::before { content: "\f609"; } +.fa-location-pen::before { content: "\f607"; } +.fa-location-pin::before { content: "\f041"; } +.fa-location-pin-lock::before { content: "\e51f"; } +.fa-location-pin-slash::before { content: "\f60c"; } +.fa-location-plus::before { content: "\f60a"; } +.fa-location-question::before { content: "\f60b"; } +.fa-location-slash::before { content: "\f603"; } +.fa-location-smile::before { content: "\f60d"; } +.fa-location-xmark::before { content: "\f60e"; } +.fa-lock::before { content: "\f023"; } +.fa-lock-a::before { content: "\e422"; } +.fa-lock-alt::before { content: "\f30d"; } +.fa-lock-hashtag::before { content: "\e423"; } +.fa-lock-keyhole::before { content: "\f30d"; } +.fa-lock-keyhole-open::before { content: "\f3c2"; } +.fa-lock-open::before { content: "\f3c1"; } +.fa-lock-open-alt::before { content: "\f3c2"; } +.fa-locust::before { content: "\e520"; } +.fa-lollipop::before { content: "\e424"; } +.fa-lollypop::before { content: "\e424"; } +.fa-long-arrow-alt-down::before { content: "\f309"; } +.fa-long-arrow-alt-left::before { content: "\f30a"; } +.fa-long-arrow-alt-right::before { content: "\f30b"; } +.fa-long-arrow-alt-up::before { content: "\f30c"; } +.fa-long-arrow-down::before { content: "\f175"; } +.fa-long-arrow-left::before { content: "\f177"; } +.fa-long-arrow-right::before { content: "\f178"; } +.fa-long-arrow-up::before { content: "\f176"; } +.fa-loveseat::before { content: "\f4cc"; } +.fa-low-vision::before { content: "\f2a8"; } +.fa-luchador::before { content: "\f455"; } +.fa-luchador-mask::before { content: "\f455"; } +.fa-luggage-cart::before { content: "\f59d"; } +.fa-lungs::before { content: "\f604"; } +.fa-lungs-virus::before { content: "\e067"; } +.fa-m::before { content: "\4d"; } +.fa-mace::before { content: "\f6f8"; } +.fa-magic::before { content: "\f0d0"; } +.fa-magic-wand-sparkles::before { content: "\e2ca"; } +.fa-magnet::before { content: "\f076"; } +.fa-magnifying-glass::before { content: "\f002"; } +.fa-magnifying-glass-arrow-right::before { content: "\e521"; } +.fa-magnifying-glass-arrows-rotate::before { content: "\e65e"; } +.fa-magnifying-glass-chart::before { content: "\e522"; } +.fa-magnifying-glass-dollar::before { content: "\f688"; } +.fa-magnifying-glass-location::before { content: "\f689"; } +.fa-magnifying-glass-minus::before { content: "\f010"; } +.fa-magnifying-glass-music::before { content: "\e65f"; } +.fa-magnifying-glass-play::before { content: "\e660"; } +.fa-magnifying-glass-plus::before { content: "\f00e"; } +.fa-magnifying-glass-waveform::before { content: "\e661"; } +.fa-mail-bulk::before { content: "\f674"; } +.fa-mail-forward::before { content: "\f064"; } +.fa-mail-reply::before { content: "\f3e5"; } +.fa-mail-reply-all::before { content: "\f122"; } +.fa-mailbox::before { content: "\f813"; } +.fa-mailbox-flag-up::before { content: "\e5bb"; } +.fa-maki-roll::before { content: "\e48b"; } +.fa-makizushi::before { content: "\e48b"; } +.fa-male::before { content: "\f183"; } +.fa-manat-sign::before { content: "\e1d5"; } +.fa-mandolin::before { content: "\f6f9"; } +.fa-mango::before { content: "\e30f"; } +.fa-manhole::before { content: "\e1d6"; } +.fa-map::before { content: "\f279"; } +.fa-map-location::before { content: "\f59f"; } +.fa-map-location-dot::before { content: "\f5a0"; } +.fa-map-marked::before { content: "\f59f"; } +.fa-map-marked-alt::before { content: "\f5a0"; } +.fa-map-marker::before { content: "\f041"; } +.fa-map-marker-alt::before { content: "\f3c5"; } +.fa-map-marker-alt-slash::before { content: "\f605"; } +.fa-map-marker-check::before { content: "\f606"; } +.fa-map-marker-edit::before { content: "\f607"; } +.fa-map-marker-exclamation::before { content: "\f608"; } +.fa-map-marker-minus::before { content: "\f609"; } +.fa-map-marker-plus::before { content: "\f60a"; } +.fa-map-marker-question::before { content: "\f60b"; } +.fa-map-marker-slash::before { content: "\f60c"; } +.fa-map-marker-smile::before { content: "\f60d"; } +.fa-map-marker-times::before { content: "\f60e"; } +.fa-map-marker-xmark::before { content: "\f60e"; } +.fa-map-pin::before { content: "\f276"; } +.fa-map-signs::before { content: "\f277"; } +.fa-marker::before { content: "\f5a1"; } +.fa-mars::before { content: "\f222"; } +.fa-mars-and-venus::before { content: "\f224"; } +.fa-mars-and-venus-burst::before { content: "\e523"; } +.fa-mars-double::before { content: "\f227"; } +.fa-mars-stroke::before { content: "\f229"; } +.fa-mars-stroke-h::before { content: "\f22b"; } +.fa-mars-stroke-right::before { content: "\f22b"; } +.fa-mars-stroke-up::before { content: "\f22a"; } +.fa-mars-stroke-v::before { content: "\f22a"; } +.fa-martini-glass::before { content: "\f57b"; } +.fa-martini-glass-citrus::before { content: "\f561"; } +.fa-martini-glass-empty::before { content: "\f000"; } +.fa-mask::before { content: "\f6fa"; } +.fa-mask-face::before { content: "\e1d7"; } +.fa-mask-luchador::before { content: "\f455"; } +.fa-mask-snorkel::before { content: "\e3b7"; } +.fa-mask-ventilator::before { content: "\e524"; } +.fa-masks-theater::before { content: "\f630"; } +.fa-mattress-pillow::before { content: "\e525"; } +.fa-maximize::before { content: "\f31e"; } +.fa-meat::before { content: "\f814"; } +.fa-medal::before { content: "\f5a2"; } +.fa-medkit::before { content: "\f0fa"; } +.fa-megaphone::before { content: "\f675"; } +.fa-meh::before { content: "\f11a"; } +.fa-meh-blank::before { content: "\f5a4"; } +.fa-meh-rolling-eyes::before { content: "\f5a5"; } +.fa-melon::before { content: "\e310"; } +.fa-melon-slice::before { content: "\e311"; } +.fa-memo::before { content: "\e1d8"; } +.fa-memo-circle-check::before { content: "\e1d9"; } +.fa-memo-circle-info::before { content: "\e49a"; } +.fa-memo-pad::before { content: "\e1da"; } +.fa-memory::before { content: "\f538"; } +.fa-menorah::before { content: "\f676"; } +.fa-mercury::before { content: "\f223"; } +.fa-merge::before { content: "\e526"; } +.fa-message::before { content: "\f27a"; } +.fa-message-arrow-down::before { content: "\e1db"; } +.fa-message-arrow-up::before { content: "\e1dc"; } +.fa-message-arrow-up-right::before { content: "\e1dd"; } +.fa-message-bot::before { content: "\e3b8"; } +.fa-message-captions::before { content: "\e1de"; } +.fa-message-check::before { content: "\f4a2"; } +.fa-message-code::before { content: "\e1df"; } +.fa-message-dollar::before { content: "\f650"; } +.fa-message-dots::before { content: "\f4a3"; } +.fa-message-edit::before { content: "\f4a4"; } +.fa-message-exclamation::before { content: "\f4a5"; } +.fa-message-heart::before { content: "\e5c9"; } +.fa-message-image::before { content: "\e1e0"; } +.fa-message-lines::before { content: "\f4a6"; } +.fa-message-medical::before { content: "\f7f4"; } +.fa-message-middle::before { content: "\e1e1"; } +.fa-message-middle-top::before { content: "\e1e2"; } +.fa-message-minus::before { content: "\f4a7"; } +.fa-message-music::before { content: "\f8af"; } +.fa-message-pen::before { content: "\f4a4"; } +.fa-message-plus::before { content: "\f4a8"; } +.fa-message-question::before { content: "\e1e3"; } +.fa-message-quote::before { content: "\e1e4"; } +.fa-message-slash::before { content: "\f4a9"; } +.fa-message-smile::before { content: "\f4aa"; } +.fa-message-sms::before { content: "\e1e5"; } +.fa-message-text::before { content: "\e1e6"; } +.fa-message-times::before { content: "\f4ab"; } +.fa-message-xmark::before { content: "\f4ab"; } +.fa-messages::before { content: "\f4b6"; } +.fa-messages-dollar::before { content: "\f652"; } +.fa-messages-question::before { content: "\e1e7"; } +.fa-messaging::before { content: "\f4a3"; } +.fa-meteor::before { content: "\f753"; } +.fa-meter::before { content: "\e1e8"; } +.fa-meter-bolt::before { content: "\e1e9"; } +.fa-meter-droplet::before { content: "\e1ea"; } +.fa-meter-fire::before { content: "\e1eb"; } +.fa-microchip::before { content: "\f2db"; } +.fa-microchip-ai::before { content: "\e1ec"; } +.fa-microphone::before { content: "\f130"; } +.fa-microphone-alt::before { content: "\f3c9"; } +.fa-microphone-alt-slash::before { content: "\f539"; } +.fa-microphone-circle::before { content: "\e116"; } +.fa-microphone-circle-alt::before { content: "\e117"; } +.fa-microphone-lines::before { content: "\f3c9"; } +.fa-microphone-lines-slash::before { content: "\f539"; } +.fa-microphone-slash::before { content: "\f131"; } +.fa-microphone-stand::before { content: "\f8cb"; } +.fa-microscope::before { content: "\f610"; } +.fa-microwave::before { content: "\e01b"; } +.fa-mill-sign::before { content: "\e1ed"; } +.fa-mind-share::before { content: "\f677"; } +.fa-minimize::before { content: "\f78c"; } +.fa-minus::before { content: "\f068"; } +.fa-minus-circle::before { content: "\f056"; } +.fa-minus-hexagon::before { content: "\f307"; } +.fa-minus-large::before { content: "\e404"; } +.fa-minus-octagon::before { content: "\f308"; } +.fa-minus-square::before { content: "\f146"; } +.fa-mistletoe::before { content: "\f7b4"; } +.fa-mitten::before { content: "\f7b5"; } +.fa-mobile::before { content: "\f3ce"; } +.fa-mobile-alt::before { content: "\f3cd"; } +.fa-mobile-android::before { content: "\f3ce"; } +.fa-mobile-android-alt::before { content: "\f3cf"; } +.fa-mobile-button::before { content: "\f10b"; } +.fa-mobile-iphone::before { content: "\e1ee"; } +.fa-mobile-notch::before { content: "\e1ee"; } +.fa-mobile-phone::before { content: "\f3ce"; } +.fa-mobile-retro::before { content: "\e527"; } +.fa-mobile-screen::before { content: "\f3cf"; } +.fa-mobile-screen-button::before { content: "\f3cd"; } +.fa-mobile-signal::before { content: "\e1ef"; } +.fa-mobile-signal-out::before { content: "\e1f0"; } +.fa-money-bill::before { content: "\f0d6"; } +.fa-money-bill-1::before { content: "\f3d1"; } +.fa-money-bill-1-wave::before { content: "\f53b"; } +.fa-money-bill-alt::before { content: "\f3d1"; } +.fa-money-bill-simple::before { content: "\e1f1"; } +.fa-money-bill-simple-wave::before { content: "\e1f2"; } +.fa-money-bill-transfer::before { content: "\e528"; } +.fa-money-bill-trend-up::before { content: "\e529"; } +.fa-money-bill-wave::before { content: "\f53a"; } +.fa-money-bill-wave-alt::before { content: "\f53b"; } +.fa-money-bill-wheat::before { content: "\e52a"; } +.fa-money-bills::before { content: "\e1f3"; } +.fa-money-bills-alt::before { content: "\e1f4"; } +.fa-money-bills-simple::before { content: "\e1f4"; } +.fa-money-check::before { content: "\f53c"; } +.fa-money-check-alt::before { content: "\f53d"; } +.fa-money-check-dollar::before { content: "\f53d"; } +.fa-money-check-dollar-pen::before { content: "\f873"; } +.fa-money-check-edit::before { content: "\f872"; } +.fa-money-check-edit-alt::before { content: "\f873"; } +.fa-money-check-pen::before { content: "\f872"; } +.fa-money-from-bracket::before { content: "\e312"; } +.fa-money-simple-from-bracket::before { content: "\e313"; } +.fa-monitor-heart-rate::before { content: "\f611"; } +.fa-monitor-waveform::before { content: "\f611"; } +.fa-monkey::before { content: "\f6fb"; } +.fa-monument::before { content: "\f5a6"; } +.fa-moon::before { content: "\f186"; } +.fa-moon-cloud::before { content: "\f754"; } +.fa-moon-over-sun::before { content: "\f74a"; } +.fa-moon-stars::before { content: "\f755"; } +.fa-moped::before { content: "\e3b9"; } +.fa-mortar-board::before { content: "\f19d"; } +.fa-mortar-pestle::before { content: "\f5a7"; } +.fa-mosque::before { content: "\f678"; } +.fa-mosquito::before { content: "\e52b"; } +.fa-mosquito-net::before { content: "\e52c"; } +.fa-motorcycle::before { content: "\f21c"; } +.fa-mound::before { content: "\e52d"; } +.fa-mountain::before { content: "\f6fc"; } +.fa-mountain-city::before { content: "\e52e"; } +.fa-mountain-sun::before { content: "\e52f"; } +.fa-mountains::before { content: "\f6fd"; } +.fa-mouse::before { content: "\f8cc"; } +.fa-mouse-alt::before { content: "\f8cd"; } +.fa-mouse-field::before { content: "\e5a8"; } +.fa-mouse-pointer::before { content: "\f245"; } +.fa-mp3-player::before { content: "\f8ce"; } +.fa-mug::before { content: "\f874"; } +.fa-mug-hot::before { content: "\f7b6"; } +.fa-mug-marshmallows::before { content: "\f7b7"; } +.fa-mug-saucer::before { content: "\f0f4"; } +.fa-mug-tea::before { content: "\f875"; } +.fa-mug-tea-saucer::before { content: "\e1f5"; } +.fa-multiply::before { content: "\f00d"; } +.fa-museum::before { content: "\f19c"; } +.fa-mushroom::before { content: "\e425"; } +.fa-music::before { content: "\f001"; } +.fa-music-alt::before { content: "\f8cf"; } +.fa-music-alt-slash::before { content: "\f8d0"; } +.fa-music-magnifying-glass::before { content: "\e662"; } +.fa-music-note::before { content: "\f8cf"; } +.fa-music-note-slash::before { content: "\f8d0"; } +.fa-music-slash::before { content: "\f8d1"; } +.fa-mustache::before { content: "\e5bc"; } +.fa-n::before { content: "\4e"; } +.fa-naira-sign::before { content: "\e1f6"; } +.fa-narwhal::before { content: "\f6fe"; } +.fa-navicon::before { content: "\f0c9"; } +.fa-nesting-dolls::before { content: "\e3ba"; } +.fa-network-wired::before { content: "\f6ff"; } +.fa-neuter::before { content: "\f22c"; } +.fa-newspaper::before { content: "\f1ea"; } +.fa-nfc::before { content: "\e1f7"; } +.fa-nfc-lock::before { content: "\e1f8"; } +.fa-nfc-magnifying-glass::before { content: "\e1f9"; } +.fa-nfc-pen::before { content: "\e1fa"; } +.fa-nfc-signal::before { content: "\e1fb"; } +.fa-nfc-slash::before { content: "\e1fc"; } +.fa-nfc-symbol::before { content: "\e531"; } +.fa-nfc-trash::before { content: "\e1fd"; } +.fa-nigiri::before { content: "\e48a"; } +.fa-nose::before { content: "\e5bd"; } +.fa-not-equal::before { content: "\f53e"; } +.fa-notdef::before { content: "\e1fe"; } +.fa-note::before { content: "\e1ff"; } +.fa-note-medical::before { content: "\e200"; } +.fa-note-sticky::before { content: "\f249"; } +.fa-notebook::before { content: "\e201"; } +.fa-notes::before { content: "\e202"; } +.fa-notes-medical::before { content: "\f481"; } +.fa-o::before { content: "\4f"; } +.fa-object-exclude::before { content: "\e49c"; } +.fa-object-group::before { content: "\f247"; } +.fa-object-intersect::before { content: "\e49d"; } +.fa-object-subtract::before { content: "\e49e"; } +.fa-object-ungroup::before { content: "\f248"; } +.fa-object-union::before { content: "\e49f"; } +.fa-objects-align-bottom::before { content: "\e3bb"; } +.fa-objects-align-center-horizontal::before { content: "\e3bc"; } +.fa-objects-align-center-vertical::before { content: "\e3bd"; } +.fa-objects-align-left::before { content: "\e3be"; } +.fa-objects-align-right::before { content: "\e3bf"; } +.fa-objects-align-top::before { content: "\e3c0"; } +.fa-objects-column::before { content: "\e3c1"; } +.fa-octagon::before { content: "\f306"; } +.fa-octagon-check::before { content: "\e426"; } +.fa-octagon-divide::before { content: "\e203"; } +.fa-octagon-exclamation::before { content: "\e204"; } +.fa-octagon-minus::before { content: "\f308"; } +.fa-octagon-plus::before { content: "\f301"; } +.fa-octagon-xmark::before { content: "\f2f0"; } +.fa-octopus::before { content: "\e688"; } +.fa-oil-can::before { content: "\f613"; } +.fa-oil-can-drip::before { content: "\e205"; } +.fa-oil-temp::before { content: "\f614"; } +.fa-oil-temperature::before { content: "\f614"; } +.fa-oil-well::before { content: "\e532"; } +.fa-olive::before { content: "\e316"; } +.fa-olive-branch::before { content: "\e317"; } +.fa-om::before { content: "\f679"; } +.fa-omega::before { content: "\f67a"; } +.fa-onion::before { content: "\e427"; } +.fa-option::before { content: "\e318"; } +.fa-ornament::before { content: "\f7b8"; } +.fa-otter::before { content: "\f700"; } +.fa-outdent::before { content: "\f03b"; } +.fa-outlet::before { content: "\e01c"; } +.fa-oven::before { content: "\e01d"; } +.fa-overline::before { content: "\f876"; } +.fa-p::before { content: "\50"; } +.fa-page::before { content: "\e428"; } +.fa-page-break::before { content: "\f877"; } +.fa-page-caret-down::before { content: "\e429"; } +.fa-page-caret-up::before { content: "\e42a"; } +.fa-pager::before { content: "\f815"; } +.fa-paint-brush::before { content: "\f1fc"; } +.fa-paint-brush-alt::before { content: "\f5a9"; } +.fa-paint-brush-fine::before { content: "\f5a9"; } +.fa-paint-roller::before { content: "\f5aa"; } +.fa-paintbrush::before { content: "\f1fc"; } +.fa-paintbrush-alt::before { content: "\f5a9"; } +.fa-paintbrush-fine::before { content: "\f5a9"; } +.fa-paintbrush-pencil::before { content: "\e206"; } +.fa-palette::before { content: "\f53f"; } +.fa-palette-boxes::before { content: "\f483"; } +.fa-pallet::before { content: "\f482"; } +.fa-pallet-alt::before { content: "\f483"; } +.fa-pallet-box::before { content: "\e208"; } +.fa-pallet-boxes::before { content: "\f483"; } +.fa-pan-food::before { content: "\e42b"; } +.fa-pan-frying::before { content: "\e42c"; } +.fa-pancakes::before { content: "\e42d"; } +.fa-panel-ews::before { content: "\e42e"; } +.fa-panel-fire::before { content: "\e42f"; } +.fa-panorama::before { content: "\e209"; } +.fa-paper-plane::before { content: "\f1d8"; } +.fa-paper-plane-alt::before { content: "\e20a"; } +.fa-paper-plane-top::before { content: "\e20a"; } +.fa-paperclip::before { content: "\f0c6"; } +.fa-paperclip-vertical::before { content: "\e3c2"; } +.fa-parachute-box::before { content: "\f4cd"; } +.fa-paragraph::before { content: "\f1dd"; } +.fa-paragraph-left::before { content: "\f878"; } +.fa-paragraph-rtl::before { content: "\f878"; } +.fa-parentheses::before { content: "\e0c5"; } +.fa-parenthesis::before { content: "\28"; } +.fa-parking::before { content: "\f540"; } +.fa-parking-circle::before { content: "\f615"; } +.fa-parking-circle-slash::before { content: "\f616"; } +.fa-parking-slash::before { content: "\f617"; } +.fa-party-back::before { content: "\e45c"; } +.fa-party-bell::before { content: "\e31a"; } +.fa-party-horn::before { content: "\e31b"; } +.fa-passport::before { content: "\f5ab"; } +.fa-pastafarianism::before { content: "\f67b"; } +.fa-paste::before { content: "\f0ea"; } +.fa-pause::before { content: "\f04c"; } +.fa-pause-circle::before { content: "\f28b"; } +.fa-paw::before { content: "\f1b0"; } +.fa-paw-alt::before { content: "\f701"; } +.fa-paw-claws::before { content: "\f702"; } +.fa-paw-simple::before { content: "\f701"; } +.fa-peace::before { content: "\f67c"; } +.fa-peach::before { content: "\e20b"; } +.fa-peanut::before { content: "\e430"; } +.fa-peanuts::before { content: "\e431"; } +.fa-peapod::before { content: "\e31c"; } +.fa-pear::before { content: "\e20c"; } +.fa-pedestal::before { content: "\e20d"; } +.fa-pegasus::before { content: "\f703"; } +.fa-pen::before { content: "\f304"; } +.fa-pen-alt::before { content: "\f305"; } +.fa-pen-alt-slash::before { content: "\e20f"; } +.fa-pen-circle::before { content: "\e20e"; } +.fa-pen-clip::before { content: "\f305"; } +.fa-pen-clip-slash::before { content: "\e20f"; } +.fa-pen-fancy::before { content: "\f5ac"; } +.fa-pen-fancy-slash::before { content: "\e210"; } +.fa-pen-field::before { content: "\e211"; } +.fa-pen-line::before { content: "\e212"; } +.fa-pen-nib::before { content: "\f5ad"; } +.fa-pen-nib-slash::before { content: "\e4a1"; } +.fa-pen-paintbrush::before { content: "\f618"; } +.fa-pen-ruler::before { content: "\f5ae"; } +.fa-pen-slash::before { content: "\e213"; } +.fa-pen-square::before { content: "\f14b"; } +.fa-pen-swirl::before { content: "\e214"; } +.fa-pen-to-square::before { content: "\f044"; } +.fa-pencil::before { content: "\f303"; } +.fa-pencil-alt::before { content: "\f303"; } +.fa-pencil-mechanical::before { content: "\e5ca"; } +.fa-pencil-paintbrush::before { content: "\f618"; } +.fa-pencil-ruler::before { content: "\f5ae"; } +.fa-pencil-slash::before { content: "\e215"; } +.fa-pencil-square::before { content: "\f14b"; } +.fa-pennant::before { content: "\f456"; } +.fa-people::before { content: "\e216"; } +.fa-people-arrows::before { content: "\e068"; } +.fa-people-arrows-left-right::before { content: "\e068"; } +.fa-people-carry::before { content: "\f4ce"; } +.fa-people-carry-box::before { content: "\f4ce"; } +.fa-people-dress::before { content: "\e217"; } +.fa-people-dress-simple::before { content: "\e218"; } +.fa-people-group::before { content: "\e533"; } +.fa-people-line::before { content: "\e534"; } +.fa-people-pants::before { content: "\e219"; } +.fa-people-pants-simple::before { content: "\e21a"; } +.fa-people-pulling::before { content: "\e535"; } +.fa-people-robbery::before { content: "\e536"; } +.fa-people-roof::before { content: "\e537"; } +.fa-people-simple::before { content: "\e21b"; } +.fa-pepper::before { content: "\e432"; } +.fa-pepper-hot::before { content: "\f816"; } +.fa-percent::before { content: "\25"; } +.fa-percentage::before { content: "\25"; } +.fa-period::before { content: "\2e"; } +.fa-person::before { content: "\f183"; } +.fa-person-arrow-down-to-line::before { content: "\e538"; } +.fa-person-arrow-up-from-line::before { content: "\e539"; } +.fa-person-biking::before { content: "\f84a"; } +.fa-person-biking-mountain::before { content: "\f84b"; } +.fa-person-booth::before { content: "\f756"; } +.fa-person-breastfeeding::before { content: "\e53a"; } +.fa-person-burst::before { content: "\e53b"; } +.fa-person-cane::before { content: "\e53c"; } +.fa-person-carry::before { content: "\f4cf"; } +.fa-person-carry-box::before { content: "\f4cf"; } +.fa-person-chalkboard::before { content: "\e53d"; } +.fa-person-circle-check::before { content: "\e53e"; } +.fa-person-circle-exclamation::before { content: "\e53f"; } +.fa-person-circle-minus::before { content: "\e540"; } +.fa-person-circle-plus::before { content: "\e541"; } +.fa-person-circle-question::before { content: "\e542"; } +.fa-person-circle-xmark::before { content: "\e543"; } +.fa-person-digging::before { content: "\f85e"; } +.fa-person-dolly::before { content: "\f4d0"; } +.fa-person-dolly-empty::before { content: "\f4d1"; } +.fa-person-dots-from-line::before { content: "\f470"; } +.fa-person-dress::before { content: "\f182"; } +.fa-person-dress-burst::before { content: "\e544"; } +.fa-person-dress-fairy::before { content: "\e607"; } +.fa-person-dress-simple::before { content: "\e21c"; } +.fa-person-drowning::before { content: "\e545"; } +.fa-person-fairy::before { content: "\e608"; } +.fa-person-falling::before { content: "\e546"; } +.fa-person-falling-burst::before { content: "\e547"; } +.fa-person-from-portal::before { content: "\e023"; } +.fa-person-half-dress::before { content: "\e548"; } +.fa-person-harassing::before { content: "\e549"; } +.fa-person-hiking::before { content: "\f6ec"; } +.fa-person-military-pointing::before { content: "\e54a"; } +.fa-person-military-rifle::before { content: "\e54b"; } +.fa-person-military-to-person::before { content: "\e54c"; } +.fa-person-pinball::before { content: "\e21d"; } +.fa-person-praying::before { content: "\f683"; } +.fa-person-pregnant::before { content: "\e31e"; } +.fa-person-rays::before { content: "\e54d"; } +.fa-person-rifle::before { content: "\e54e"; } +.fa-person-running::before { content: "\f70c"; } +.fa-person-running-fast::before { content: "\e5ff"; } +.fa-person-seat::before { content: "\e21e"; } +.fa-person-seat-reclined::before { content: "\e21f"; } +.fa-person-shelter::before { content: "\e54f"; } +.fa-person-sign::before { content: "\f757"; } +.fa-person-simple::before { content: "\e220"; } +.fa-person-skating::before { content: "\f7c5"; } +.fa-person-ski-jumping::before { content: "\f7c7"; } +.fa-person-ski-lift::before { content: "\f7c8"; } +.fa-person-skiing::before { content: "\f7c9"; } +.fa-person-skiing-nordic::before { content: "\f7ca"; } +.fa-person-sledding::before { content: "\f7cb"; } +.fa-person-snowboarding::before { content: "\f7ce"; } +.fa-person-snowmobiling::before { content: "\f7d1"; } +.fa-person-swimming::before { content: "\f5c4"; } +.fa-person-through-window::before { content: "\e5a9"; } +.fa-person-to-door::before { content: "\e433"; } +.fa-person-to-portal::before { content: "\e022"; } +.fa-person-walking::before { content: "\f554"; } +.fa-person-walking-arrow-loop-left::before { content: "\e551"; } +.fa-person-walking-arrow-right::before { content: "\e552"; } +.fa-person-walking-dashed-line-arrow-right::before { content: "\e553"; } +.fa-person-walking-luggage::before { content: "\e554"; } +.fa-person-walking-with-cane::before { content: "\f29d"; } +.fa-peseta-sign::before { content: "\e221"; } +.fa-peso-sign::before { content: "\e222"; } +.fa-phone::before { content: "\f095"; } +.fa-phone-alt::before { content: "\f879"; } +.fa-phone-arrow-down::before { content: "\e223"; } +.fa-phone-arrow-down-left::before { content: "\e223"; } +.fa-phone-arrow-right::before { content: "\e5be"; } +.fa-phone-arrow-up::before { content: "\e224"; } +.fa-phone-arrow-up-right::before { content: "\e224"; } +.fa-phone-circle::before { content: "\e11b"; } +.fa-phone-circle-alt::before { content: "\e11c"; } +.fa-phone-circle-down::before { content: "\e11d"; } +.fa-phone-flip::before { content: "\f879"; } +.fa-phone-hangup::before { content: "\e225"; } +.fa-phone-incoming::before { content: "\e223"; } +.fa-phone-intercom::before { content: "\e434"; } +.fa-phone-laptop::before { content: "\f87a"; } +.fa-phone-missed::before { content: "\e226"; } +.fa-phone-office::before { content: "\f67d"; } +.fa-phone-outgoing::before { content: "\e224"; } +.fa-phone-plus::before { content: "\f4d2"; } +.fa-phone-rotary::before { content: "\f8d3"; } +.fa-phone-slash::before { content: "\f3dd"; } +.fa-phone-square::before { content: "\f098"; } +.fa-phone-square-alt::before { content: "\f87b"; } +.fa-phone-square-down::before { content: "\e27a"; } +.fa-phone-volume::before { content: "\f2a0"; } +.fa-phone-xmark::before { content: "\e227"; } +.fa-photo-film::before { content: "\f87c"; } +.fa-photo-film-music::before { content: "\e228"; } +.fa-photo-video::before { content: "\f87c"; } +.fa-pi::before { content: "\f67e"; } +.fa-piano::before { content: "\f8d4"; } +.fa-piano-keyboard::before { content: "\f8d5"; } +.fa-pickaxe::before { content: "\e5bf"; } +.fa-pickleball::before { content: "\e435"; } +.fa-pie::before { content: "\f705"; } +.fa-pie-chart::before { content: "\f200"; } +.fa-pig::before { content: "\f706"; } +.fa-piggy-bank::before { content: "\f4d3"; } +.fa-pills::before { content: "\f484"; } +.fa-pinata::before { content: "\e3c3"; } +.fa-pinball::before { content: "\e229"; } +.fa-pineapple::before { content: "\e31f"; } +.fa-ping-pong-paddle-ball::before { content: "\f45d"; } +.fa-pipe::before { content: "\7c"; } +.fa-pipe-circle-check::before { content: "\e436"; } +.fa-pipe-collar::before { content: "\e437"; } +.fa-pipe-section::before { content: "\e438"; } +.fa-pipe-smoking::before { content: "\e3c4"; } +.fa-pipe-valve::before { content: "\e439"; } +.fa-pizza::before { content: "\f817"; } +.fa-pizza-slice::before { content: "\f818"; } +.fa-place-of-worship::before { content: "\f67f"; } +.fa-plane::before { content: "\f072"; } +.fa-plane-alt::before { content: "\f3de"; } +.fa-plane-arrival::before { content: "\f5af"; } +.fa-plane-circle-check::before { content: "\e555"; } +.fa-plane-circle-exclamation::before { content: "\e556"; } +.fa-plane-circle-xmark::before { content: "\e557"; } +.fa-plane-departure::before { content: "\f5b0"; } +.fa-plane-engines::before { content: "\f3de"; } +.fa-plane-lock::before { content: "\e558"; } +.fa-plane-prop::before { content: "\e22b"; } +.fa-plane-slash::before { content: "\e069"; } +.fa-plane-tail::before { content: "\e22c"; } +.fa-plane-up::before { content: "\e22d"; } +.fa-plane-up-slash::before { content: "\e22e"; } +.fa-planet-moon::before { content: "\e01f"; } +.fa-planet-ringed::before { content: "\e020"; } +.fa-plant-wilt::before { content: "\e5aa"; } +.fa-plate-utensils::before { content: "\e43b"; } +.fa-plate-wheat::before { content: "\e55a"; } +.fa-play::before { content: "\f04b"; } +.fa-play-circle::before { content: "\f144"; } +.fa-play-pause::before { content: "\e22f"; } +.fa-plug::before { content: "\f1e6"; } +.fa-plug-circle-bolt::before { content: "\e55b"; } +.fa-plug-circle-check::before { content: "\e55c"; } +.fa-plug-circle-exclamation::before { content: "\e55d"; } +.fa-plug-circle-minus::before { content: "\e55e"; } +.fa-plug-circle-plus::before { content: "\e55f"; } +.fa-plug-circle-xmark::before { content: "\e560"; } +.fa-plus::before { content: "\2b"; } +.fa-plus-circle::before { content: "\f055"; } +.fa-plus-hexagon::before { content: "\f300"; } +.fa-plus-large::before { content: "\e59e"; } +.fa-plus-minus::before { content: "\e43c"; } +.fa-plus-octagon::before { content: "\f301"; } +.fa-plus-square::before { content: "\f0fe"; } +.fa-podcast::before { content: "\f2ce"; } +.fa-podium::before { content: "\f680"; } +.fa-podium-star::before { content: "\f758"; } +.fa-police-box::before { content: "\e021"; } +.fa-poll::before { content: "\f681"; } +.fa-poll-h::before { content: "\f682"; } +.fa-poll-people::before { content: "\f759"; } +.fa-pompebled::before { content: "\e43d"; } +.fa-poo::before { content: "\f2fe"; } +.fa-poo-bolt::before { content: "\f75a"; } +.fa-poo-storm::before { content: "\f75a"; } +.fa-pool-8-ball::before { content: "\e3c5"; } +.fa-poop::before { content: "\f619"; } +.fa-popcorn::before { content: "\f819"; } +.fa-popsicle::before { content: "\e43e"; } +.fa-portal-enter::before { content: "\e022"; } +.fa-portal-exit::before { content: "\e023"; } +.fa-portrait::before { content: "\f3e0"; } +.fa-pot-food::before { content: "\e43f"; } +.fa-potato::before { content: "\e440"; } +.fa-pound-sign::before { content: "\f154"; } +.fa-power-off::before { content: "\f011"; } +.fa-pray::before { content: "\f683"; } +.fa-praying-hands::before { content: "\f684"; } +.fa-prescription::before { content: "\f5b1"; } +.fa-prescription-bottle::before { content: "\f485"; } +.fa-prescription-bottle-alt::before { content: "\f486"; } +.fa-prescription-bottle-medical::before { content: "\f486"; } +.fa-prescription-bottle-pill::before { content: "\e5c0"; } +.fa-presentation::before { content: "\f685"; } +.fa-presentation-screen::before { content: "\f685"; } +.fa-pretzel::before { content: "\e441"; } +.fa-print::before { content: "\f02f"; } +.fa-print-magnifying-glass::before { content: "\f81a"; } +.fa-print-search::before { content: "\f81a"; } +.fa-print-slash::before { content: "\f686"; } +.fa-pro::before { content: "\e235"; } +.fa-procedures::before { content: "\f487"; } +.fa-project-diagram::before { content: "\f542"; } +.fa-projector::before { content: "\f8d6"; } +.fa-pump::before { content: "\e442"; } +.fa-pump-medical::before { content: "\e06a"; } +.fa-pump-soap::before { content: "\e06b"; } +.fa-pumpkin::before { content: "\f707"; } +.fa-puzzle::before { content: "\e443"; } +.fa-puzzle-piece::before { content: "\f12e"; } +.fa-puzzle-piece-alt::before { content: "\e231"; } +.fa-puzzle-piece-simple::before { content: "\e231"; } +.fa-q::before { content: "\51"; } +.fa-qrcode::before { content: "\f029"; } +.fa-question::before { content: "\3f"; } +.fa-question-circle::before { content: "\f059"; } +.fa-question-square::before { content: "\f2fd"; } +.fa-quidditch::before { content: "\f458"; } +.fa-quidditch-broom-ball::before { content: "\f458"; } +.fa-quote-left::before { content: "\f10d"; } +.fa-quote-left-alt::before { content: "\f10d"; } +.fa-quote-right::before { content: "\f10e"; } +.fa-quote-right-alt::before { content: "\f10e"; } +.fa-quotes::before { content: "\e234"; } +.fa-quran::before { content: "\f687"; } +.fa-r::before { content: "\52"; } +.fa-rabbit::before { content: "\f708"; } +.fa-rabbit-fast::before { content: "\f709"; } +.fa-rabbit-running::before { content: "\f709"; } +.fa-raccoon::before { content: "\e613"; } +.fa-racquet::before { content: "\f45a"; } +.fa-radar::before { content: "\e024"; } +.fa-radiation::before { content: "\f7b9"; } +.fa-radiation-alt::before { content: "\f7ba"; } +.fa-radio::before { content: "\f8d7"; } +.fa-radio-alt::before { content: "\f8d8"; } +.fa-radio-tuner::before { content: "\f8d8"; } +.fa-rainbow::before { content: "\f75b"; } +.fa-raindrops::before { content: "\f75c"; } +.fa-ram::before { content: "\f70a"; } +.fa-ramp-loading::before { content: "\f4d4"; } +.fa-random::before { content: "\f074"; } +.fa-ranking-star::before { content: "\e561"; } +.fa-raygun::before { content: "\e025"; } +.fa-receipt::before { content: "\f543"; } +.fa-record-vinyl::before { content: "\f8d9"; } +.fa-rectangle::before { content: "\f2fa"; } +.fa-rectangle-ad::before { content: "\f641"; } +.fa-rectangle-barcode::before { content: "\f463"; } +.fa-rectangle-code::before { content: "\e322"; } +.fa-rectangle-hd::before { content: "\e1ae"; } +.fa-rectangle-history::before { content: "\e4a2"; } +.fa-rectangle-history-circle-plus::before { content: "\e4a3"; } +.fa-rectangle-history-circle-user::before { content: "\e4a4"; } +.fa-rectangle-landscape::before { content: "\f2fa"; } +.fa-rectangle-list::before { content: "\f022"; } +.fa-rectangle-portrait::before { content: "\f2fb"; } +.fa-rectangle-pro::before { content: "\e235"; } +.fa-rectangle-sd::before { content: "\e28a"; } +.fa-rectangle-terminal::before { content: "\e236"; } +.fa-rectangle-times::before { content: "\f410"; } +.fa-rectangle-vertical::before { content: "\f2fb"; } +.fa-rectangle-vertical-history::before { content: "\e237"; } +.fa-rectangle-wide::before { content: "\f2fc"; } +.fa-rectangle-xmark::before { content: "\f410"; } +.fa-rectangles-mixed::before { content: "\e323"; } +.fa-recycle::before { content: "\f1b8"; } +.fa-redo::before { content: "\f01e"; } +.fa-redo-alt::before { content: "\f2f9"; } +.fa-reel::before { content: "\e238"; } +.fa-reflect-both::before { content: "\e66f"; } +.fa-reflect-horizontal::before { content: "\e664"; } +.fa-reflect-vertical::before { content: "\e665"; } +.fa-refresh::before { content: "\f021"; } +.fa-refrigerator::before { content: "\e026"; } +.fa-registered::before { content: "\f25d"; } +.fa-remove::before { content: "\f00d"; } +.fa-remove-format::before { content: "\f87d"; } +.fa-reorder::before { content: "\f550"; } +.fa-repeat::before { content: "\f363"; } +.fa-repeat-1::before { content: "\f365"; } +.fa-repeat-1-alt::before { content: "\f366"; } +.fa-repeat-alt::before { content: "\f364"; } +.fa-reply::before { content: "\f3e5"; } +.fa-reply-all::before { content: "\f122"; } +.fa-reply-clock::before { content: "\e239"; } +.fa-reply-time::before { content: "\e239"; } +.fa-republican::before { content: "\f75e"; } +.fa-restroom::before { content: "\f7bd"; } +.fa-restroom-simple::before { content: "\e23a"; } +.fa-retweet::before { content: "\f079"; } +.fa-retweet-alt::before { content: "\f361"; } +.fa-rhombus::before { content: "\e23b"; } +.fa-ribbon::before { content: "\f4d6"; } +.fa-right::before { content: "\f356"; } +.fa-right-from-bracket::before { content: "\f2f5"; } +.fa-right-from-line::before { content: "\f347"; } +.fa-right-left::before { content: "\f362"; } +.fa-right-left-large::before { content: "\e5e1"; } +.fa-right-long::before { content: "\f30b"; } +.fa-right-long-to-line::before { content: "\e444"; } +.fa-right-to-bracket::before { content: "\f2f6"; } +.fa-right-to-line::before { content: "\f34c"; } +.fa-ring::before { content: "\f70b"; } +.fa-ring-diamond::before { content: "\e5ab"; } +.fa-rings-wedding::before { content: "\f81b"; } +.fa-rmb::before { content: "\f157"; } +.fa-road::before { content: "\f018"; } +.fa-road-barrier::before { content: "\e562"; } +.fa-road-bridge::before { content: "\e563"; } +.fa-road-circle-check::before { content: "\e564"; } +.fa-road-circle-exclamation::before { content: "\e565"; } +.fa-road-circle-xmark::before { content: "\e566"; } +.fa-road-lock::before { content: "\e567"; } +.fa-road-spikes::before { content: "\e568"; } +.fa-robot::before { content: "\f544"; } +.fa-robot-astromech::before { content: "\e2d2"; } +.fa-rocket::before { content: "\f135"; } +.fa-rocket-launch::before { content: "\e027"; } +.fa-rod-asclepius::before { content: "\e579"; } +.fa-rod-snake::before { content: "\e579"; } +.fa-roller-coaster::before { content: "\e324"; } +.fa-rotate::before { content: "\f2f1"; } +.fa-rotate-back::before { content: "\f2ea"; } +.fa-rotate-backward::before { content: "\f2ea"; } +.fa-rotate-exclamation::before { content: "\e23c"; } +.fa-rotate-forward::before { content: "\f2f9"; } +.fa-rotate-left::before { content: "\f2ea"; } +.fa-rotate-reverse::before { content: "\e631"; } +.fa-rotate-right::before { content: "\f2f9"; } +.fa-rouble::before { content: "\f158"; } +.fa-route::before { content: "\f4d7"; } +.fa-route-highway::before { content: "\f61a"; } +.fa-route-interstate::before { content: "\f61b"; } +.fa-router::before { content: "\f8da"; } +.fa-rows::before { content: "\e292"; } +.fa-rss::before { content: "\f09e"; } +.fa-rss-square::before { content: "\f143"; } +.fa-rub::before { content: "\f158"; } +.fa-ruble::before { content: "\f158"; } +.fa-ruble-sign::before { content: "\f158"; } +.fa-rug::before { content: "\e569"; } +.fa-rugby-ball::before { content: "\e3c6"; } +.fa-ruler::before { content: "\f545"; } +.fa-ruler-combined::before { content: "\f546"; } +.fa-ruler-horizontal::before { content: "\f547"; } +.fa-ruler-triangle::before { content: "\f61c"; } +.fa-ruler-vertical::before { content: "\f548"; } +.fa-running::before { content: "\f70c"; } +.fa-rupee::before { content: "\f156"; } +.fa-rupee-sign::before { content: "\f156"; } +.fa-rupiah-sign::before { content: "\e23d"; } +.fa-rv::before { content: "\f7be"; } +.fa-s::before { content: "\53"; } +.fa-sack::before { content: "\f81c"; } +.fa-sack-dollar::before { content: "\f81d"; } +.fa-sack-xmark::before { content: "\e56a"; } +.fa-sad-cry::before { content: "\f5b3"; } +.fa-sad-tear::before { content: "\f5b4"; } +.fa-sailboat::before { content: "\e445"; } +.fa-salad::before { content: "\f81e"; } +.fa-salt-shaker::before { content: "\e446"; } +.fa-sandwich::before { content: "\f81f"; } +.fa-satellite::before { content: "\f7bf"; } +.fa-satellite-dish::before { content: "\f7c0"; } +.fa-sausage::before { content: "\f820"; } +.fa-save::before { content: "\f0c7"; } +.fa-save-circle-arrow-right::before { content: "\e180"; } +.fa-save-circle-xmark::before { content: "\e181"; } +.fa-save-times::before { content: "\e181"; } +.fa-sax-hot::before { content: "\f8db"; } +.fa-saxophone::before { content: "\f8dc"; } +.fa-saxophone-fire::before { content: "\f8db"; } +.fa-scale-balanced::before { content: "\f24e"; } +.fa-scale-unbalanced::before { content: "\f515"; } +.fa-scale-unbalanced-flip::before { content: "\f516"; } +.fa-scalpel::before { content: "\f61d"; } +.fa-scalpel-line-dashed::before { content: "\f61e"; } +.fa-scalpel-path::before { content: "\f61e"; } +.fa-scanner::before { content: "\f488"; } +.fa-scanner-gun::before { content: "\f488"; } +.fa-scanner-image::before { content: "\f8f3"; } +.fa-scanner-keyboard::before { content: "\f489"; } +.fa-scanner-touchscreen::before { content: "\f48a"; } +.fa-scarecrow::before { content: "\f70d"; } +.fa-scarf::before { content: "\f7c1"; } +.fa-school::before { content: "\f549"; } +.fa-school-circle-check::before { content: "\e56b"; } +.fa-school-circle-exclamation::before { content: "\e56c"; } +.fa-school-circle-xmark::before { content: "\e56d"; } +.fa-school-flag::before { content: "\e56e"; } +.fa-school-lock::before { content: "\e56f"; } +.fa-scissors::before { content: "\f0c4"; } +.fa-screen-users::before { content: "\f63d"; } +.fa-screencast::before { content: "\e23e"; } +.fa-screenshot::before { content: "\e0da"; } +.fa-screwdriver::before { content: "\f54a"; } +.fa-screwdriver-wrench::before { content: "\f7d9"; } +.fa-scribble::before { content: "\e23f"; } +.fa-scroll::before { content: "\f70e"; } +.fa-scroll-old::before { content: "\f70f"; } +.fa-scroll-ribbon::before { content: "\f5ea"; } +.fa-scroll-torah::before { content: "\f6a0"; } +.fa-scrubber::before { content: "\f2f8"; } +.fa-scythe::before { content: "\f710"; } +.fa-sd-card::before { content: "\f7c2"; } +.fa-sd-cards::before { content: "\e240"; } +.fa-seal::before { content: "\e241"; } +.fa-seal-exclamation::before { content: "\e242"; } +.fa-seal-question::before { content: "\e243"; } +.fa-search::before { content: "\f002"; } +.fa-search-dollar::before { content: "\f688"; } +.fa-search-location::before { content: "\f689"; } +.fa-search-minus::before { content: "\f010"; } +.fa-search-plus::before { content: "\f00e"; } +.fa-seat-airline::before { content: "\e244"; } +.fa-section::before { content: "\e447"; } +.fa-seedling::before { content: "\f4d8"; } +.fa-semicolon::before { content: "\3b"; } +.fa-send::before { content: "\e20a"; } +.fa-send-back::before { content: "\f87e"; } +.fa-send-backward::before { content: "\f87f"; } +.fa-sensor::before { content: "\e028"; } +.fa-sensor-alert::before { content: "\e029"; } +.fa-sensor-cloud::before { content: "\e02c"; } +.fa-sensor-fire::before { content: "\e02a"; } +.fa-sensor-on::before { content: "\e02b"; } +.fa-sensor-smoke::before { content: "\e02c"; } +.fa-sensor-triangle-exclamation::before { content: "\e029"; } +.fa-server::before { content: "\f233"; } +.fa-shapes::before { content: "\f61f"; } +.fa-share::before { content: "\f064"; } +.fa-share-all::before { content: "\f367"; } +.fa-share-alt::before { content: "\f1e0"; } +.fa-share-alt-square::before { content: "\f1e1"; } +.fa-share-from-square::before { content: "\f14d"; } +.fa-share-nodes::before { content: "\f1e0"; } +.fa-share-square::before { content: "\f14d"; } +.fa-sheep::before { content: "\f711"; } +.fa-sheet-plastic::before { content: "\e571"; } +.fa-shekel::before { content: "\f20b"; } +.fa-shekel-sign::before { content: "\f20b"; } +.fa-shelves::before { content: "\f480"; } +.fa-shelves-empty::before { content: "\e246"; } +.fa-sheqel::before { content: "\f20b"; } +.fa-sheqel-sign::before { content: "\f20b"; } +.fa-shield::before { content: "\f132"; } +.fa-shield-alt::before { content: "\f3ed"; } +.fa-shield-blank::before { content: "\f132"; } +.fa-shield-cat::before { content: "\e572"; } +.fa-shield-check::before { content: "\f2f7"; } +.fa-shield-cross::before { content: "\f712"; } +.fa-shield-dog::before { content: "\e573"; } +.fa-shield-exclamation::before { content: "\e247"; } +.fa-shield-halved::before { content: "\f3ed"; } +.fa-shield-heart::before { content: "\e574"; } +.fa-shield-keyhole::before { content: "\e248"; } +.fa-shield-minus::before { content: "\e249"; } +.fa-shield-plus::before { content: "\e24a"; } +.fa-shield-quartered::before { content: "\e575"; } +.fa-shield-slash::before { content: "\e24b"; } +.fa-shield-times::before { content: "\e24c"; } +.fa-shield-virus::before { content: "\e06c"; } +.fa-shield-xmark::before { content: "\e24c"; } +.fa-ship::before { content: "\f21a"; } +.fa-shipping-fast::before { content: "\f48b"; } +.fa-shipping-timed::before { content: "\f48c"; } +.fa-shirt::before { content: "\f553"; } +.fa-shirt-long-sleeve::before { content: "\e3c7"; } +.fa-shirt-running::before { content: "\e3c8"; } +.fa-shirt-tank-top::before { content: "\e3c9"; } +.fa-shish-kebab::before { content: "\f821"; } +.fa-shoe-prints::before { content: "\f54b"; } +.fa-shop::before { content: "\f54f"; } +.fa-shop-lock::before { content: "\e4a5"; } +.fa-shop-slash::before { content: "\e070"; } +.fa-shopping-bag::before { content: "\f290"; } +.fa-shopping-basket::before { content: "\f291"; } +.fa-shopping-basket-alt::before { content: "\e0af"; } +.fa-shopping-cart::before { content: "\f07a"; } +.fa-shortcake::before { content: "\e3e5"; } +.fa-shovel::before { content: "\f713"; } +.fa-shovel-snow::before { content: "\f7c3"; } +.fa-shower::before { content: "\f2cc"; } +.fa-shower-alt::before { content: "\e24d"; } +.fa-shower-down::before { content: "\e24d"; } +.fa-shredder::before { content: "\f68a"; } +.fa-shrimp::before { content: "\e448"; } +.fa-shuffle::before { content: "\f074"; } +.fa-shutters::before { content: "\e449"; } +.fa-shuttle-space::before { content: "\f197"; } +.fa-shuttle-van::before { content: "\f5b6"; } +.fa-shuttlecock::before { content: "\f45b"; } +.fa-sickle::before { content: "\f822"; } +.fa-sidebar::before { content: "\e24e"; } +.fa-sidebar-flip::before { content: "\e24f"; } +.fa-sigma::before { content: "\f68b"; } +.fa-sign::before { content: "\f4d9"; } +.fa-sign-hanging::before { content: "\f4d9"; } +.fa-sign-in::before { content: "\f090"; } +.fa-sign-in-alt::before { content: "\f2f6"; } +.fa-sign-language::before { content: "\f2a7"; } +.fa-sign-out::before { content: "\f08b"; } +.fa-sign-out-alt::before { content: "\f2f5"; } +.fa-sign-post::before { content: "\e624"; } +.fa-sign-posts::before { content: "\e625"; } +.fa-sign-posts-wrench::before { content: "\e626"; } +.fa-signal::before { content: "\f012"; } +.fa-signal-1::before { content: "\f68c"; } +.fa-signal-2::before { content: "\f68d"; } +.fa-signal-3::before { content: "\f68e"; } +.fa-signal-4::before { content: "\f68f"; } +.fa-signal-5::before { content: "\f012"; } +.fa-signal-alt::before { content: "\f690"; } +.fa-signal-alt-1::before { content: "\f691"; } +.fa-signal-alt-2::before { content: "\f692"; } +.fa-signal-alt-3::before { content: "\f693"; } +.fa-signal-alt-4::before { content: "\f690"; } +.fa-signal-alt-slash::before { content: "\f694"; } +.fa-signal-bars::before { content: "\f690"; } +.fa-signal-bars-fair::before { content: "\f692"; } +.fa-signal-bars-good::before { content: "\f693"; } +.fa-signal-bars-slash::before { content: "\f694"; } +.fa-signal-bars-strong::before { content: "\f690"; } +.fa-signal-bars-weak::before { content: "\f691"; } +.fa-signal-fair::before { content: "\f68d"; } +.fa-signal-good::before { content: "\f68e"; } +.fa-signal-perfect::before { content: "\f012"; } +.fa-signal-slash::before { content: "\f695"; } +.fa-signal-stream::before { content: "\f8dd"; } +.fa-signal-stream-slash::before { content: "\e250"; } +.fa-signal-strong::before { content: "\f68f"; } +.fa-signal-weak::before { content: "\f68c"; } +.fa-signature::before { content: "\f5b7"; } +.fa-signature-lock::before { content: "\e3ca"; } +.fa-signature-slash::before { content: "\e3cb"; } +.fa-signing::before { content: "\f2a7"; } +.fa-signs-post::before { content: "\f277"; } +.fa-sim-card::before { content: "\f7c4"; } +.fa-sim-cards::before { content: "\e251"; } +.fa-sink::before { content: "\e06d"; } +.fa-siren::before { content: "\e02d"; } +.fa-siren-on::before { content: "\e02e"; } +.fa-sitemap::before { content: "\f0e8"; } +.fa-skating::before { content: "\f7c5"; } +.fa-skeleton::before { content: "\f620"; } +.fa-skeleton-ribs::before { content: "\e5cb"; } +.fa-ski-boot::before { content: "\e3cc"; } +.fa-ski-boot-ski::before { content: "\e3cd"; } +.fa-ski-jump::before { content: "\f7c7"; } +.fa-ski-lift::before { content: "\f7c8"; } +.fa-skiing::before { content: "\f7c9"; } +.fa-skiing-nordic::before { content: "\f7ca"; } +.fa-skull::before { content: "\f54c"; } +.fa-skull-cow::before { content: "\f8de"; } +.fa-skull-crossbones::before { content: "\f714"; } +.fa-slash::before { content: "\f715"; } +.fa-slash-back::before { content: "\5c"; } +.fa-slash-forward::before { content: "\2f"; } +.fa-sledding::before { content: "\f7cb"; } +.fa-sleigh::before { content: "\f7cc"; } +.fa-slider::before { content: "\e252"; } +.fa-sliders::before { content: "\f1de"; } +.fa-sliders-h::before { content: "\f1de"; } +.fa-sliders-h-square::before { content: "\f3f0"; } +.fa-sliders-simple::before { content: "\e253"; } +.fa-sliders-up::before { content: "\f3f1"; } +.fa-sliders-v::before { content: "\f3f1"; } +.fa-sliders-v-square::before { content: "\f3f2"; } +.fa-slot-machine::before { content: "\e3ce"; } +.fa-smile::before { content: "\f118"; } +.fa-smile-beam::before { content: "\f5b8"; } +.fa-smile-plus::before { content: "\f5b9"; } +.fa-smile-wink::before { content: "\f4da"; } +.fa-smog::before { content: "\f75f"; } +.fa-smoke::before { content: "\f760"; } +.fa-smoking::before { content: "\f48d"; } +.fa-smoking-ban::before { content: "\f54d"; } +.fa-sms::before { content: "\f7cd"; } +.fa-snake::before { content: "\f716"; } +.fa-snooze::before { content: "\f880"; } +.fa-snow-blowing::before { content: "\f761"; } +.fa-snowboarding::before { content: "\f7ce"; } +.fa-snowflake::before { content: "\f2dc"; } +.fa-snowflake-droplets::before { content: "\e5c1"; } +.fa-snowflakes::before { content: "\f7cf"; } +.fa-snowman::before { content: "\f7d0"; } +.fa-snowman-head::before { content: "\f79b"; } +.fa-snowmobile::before { content: "\f7d1"; } +.fa-snowplow::before { content: "\f7d2"; } +.fa-soap::before { content: "\e06e"; } +.fa-soccer-ball::before { content: "\f1e3"; } +.fa-socks::before { content: "\f696"; } +.fa-soft-serve::before { content: "\e400"; } +.fa-solar-panel::before { content: "\f5ba"; } +.fa-solar-system::before { content: "\e02f"; } +.fa-sort::before { content: "\f0dc"; } +.fa-sort-alpha-asc::before { content: "\f15d"; } +.fa-sort-alpha-desc::before { content: "\f881"; } +.fa-sort-alpha-down::before { content: "\f15d"; } +.fa-sort-alpha-down-alt::before { content: "\f881"; } +.fa-sort-alpha-up::before { content: "\f15e"; } +.fa-sort-alpha-up-alt::before { content: "\f882"; } +.fa-sort-alt::before { content: "\f883"; } +.fa-sort-amount-asc::before { content: "\f160"; } +.fa-sort-amount-desc::before { content: "\f884"; } +.fa-sort-amount-down::before { content: "\f160"; } +.fa-sort-amount-down-alt::before { content: "\f884"; } +.fa-sort-amount-up::before { content: "\f161"; } +.fa-sort-amount-up-alt::before { content: "\f885"; } +.fa-sort-asc::before { content: "\f0de"; } +.fa-sort-circle::before { content: "\e030"; } +.fa-sort-circle-down::before { content: "\e031"; } +.fa-sort-circle-up::before { content: "\e032"; } +.fa-sort-desc::before { content: "\f0dd"; } +.fa-sort-down::before { content: "\f0dd"; } +.fa-sort-numeric-asc::before { content: "\f162"; } +.fa-sort-numeric-desc::before { content: "\f886"; } +.fa-sort-numeric-down::before { content: "\f162"; } +.fa-sort-numeric-down-alt::before { content: "\f886"; } +.fa-sort-numeric-up::before { content: "\f163"; } +.fa-sort-numeric-up-alt::before { content: "\f887"; } +.fa-sort-shapes-down::before { content: "\f888"; } +.fa-sort-shapes-down-alt::before { content: "\f889"; } +.fa-sort-shapes-up::before { content: "\f88a"; } +.fa-sort-shapes-up-alt::before { content: "\f88b"; } +.fa-sort-size-down::before { content: "\f88c"; } +.fa-sort-size-down-alt::before { content: "\f88d"; } +.fa-sort-size-up::before { content: "\f88e"; } +.fa-sort-size-up-alt::before { content: "\f88f"; } +.fa-sort-up::before { content: "\f0de"; } +.fa-sort-up-down::before { content: "\e099"; } +.fa-soup::before { content: "\f823"; } +.fa-spa::before { content: "\f5bb"; } +.fa-space-shuttle::before { content: "\f197"; } +.fa-space-station-moon::before { content: "\e033"; } +.fa-space-station-moon-alt::before { content: "\e034"; } +.fa-space-station-moon-construction::before { content: "\e034"; } +.fa-spade::before { content: "\f2f4"; } +.fa-spaghetti-monster-flying::before { content: "\f67b"; } +.fa-sparkle::before { content: "\e5d6"; } +.fa-sparkles::before { content: "\f890"; } +.fa-speaker::before { content: "\f8df"; } +.fa-speakers::before { content: "\f8e0"; } +.fa-spell-check::before { content: "\f891"; } +.fa-spider::before { content: "\f717"; } +.fa-spider-black-widow::before { content: "\f718"; } +.fa-spider-web::before { content: "\f719"; } +.fa-spinner::before { content: "\f110"; } +.fa-spinner-scale::before { content: "\e62a"; } +.fa-spinner-third::before { content: "\f3f4"; } +.fa-split::before { content: "\e254"; } +.fa-splotch::before { content: "\f5bc"; } +.fa-spoon::before { content: "\f2e5"; } +.fa-sportsball::before { content: "\e44b"; } +.fa-spray-can::before { content: "\f5bd"; } +.fa-spray-can-sparkles::before { content: "\f5d0"; } +.fa-sprinkler::before { content: "\e035"; } +.fa-sprinkler-ceiling::before { content: "\e44c"; } +.fa-sprout::before { content: "\f4d8"; } +.fa-square::before { content: "\f0c8"; } +.fa-square-0::before { content: "\e255"; } +.fa-square-1::before { content: "\e256"; } +.fa-square-2::before { content: "\e257"; } +.fa-square-3::before { content: "\e258"; } +.fa-square-4::before { content: "\e259"; } +.fa-square-5::before { content: "\e25a"; } +.fa-square-6::before { content: "\e25b"; } +.fa-square-7::before { content: "\e25c"; } +.fa-square-8::before { content: "\e25d"; } +.fa-square-9::before { content: "\e25e"; } +.fa-square-a::before { content: "\e25f"; } +.fa-square-a-lock::before { content: "\e44d"; } +.fa-square-ampersand::before { content: "\e260"; } +.fa-square-arrow-down::before { content: "\f339"; } +.fa-square-arrow-down-left::before { content: "\e261"; } +.fa-square-arrow-down-right::before { content: "\e262"; } +.fa-square-arrow-left::before { content: "\f33a"; } +.fa-square-arrow-right::before { content: "\f33b"; } +.fa-square-arrow-up::before { content: "\f33c"; } +.fa-square-arrow-up-left::before { content: "\e263"; } +.fa-square-arrow-up-right::before { content: "\f14c"; } +.fa-square-b::before { content: "\e264"; } +.fa-square-bolt::before { content: "\e265"; } +.fa-square-c::before { content: "\e266"; } +.fa-square-caret-down::before { content: "\f150"; } +.fa-square-caret-left::before { content: "\f191"; } +.fa-square-caret-right::before { content: "\f152"; } +.fa-square-caret-up::before { content: "\f151"; } +.fa-square-check::before { content: "\f14a"; } +.fa-square-chevron-down::before { content: "\f329"; } +.fa-square-chevron-left::before { content: "\f32a"; } +.fa-square-chevron-right::before { content: "\f32b"; } +.fa-square-chevron-up::before { content: "\f32c"; } +.fa-square-code::before { content: "\e267"; } +.fa-square-d::before { content: "\e268"; } +.fa-square-dashed::before { content: "\e269"; } +.fa-square-dashed-circle-plus::before { content: "\e5c2"; } +.fa-square-divide::before { content: "\e26a"; } +.fa-square-dollar::before { content: "\f2e9"; } +.fa-square-down::before { content: "\f350"; } +.fa-square-down-left::before { content: "\e26b"; } +.fa-square-down-right::before { content: "\e26c"; } +.fa-square-e::before { content: "\e26d"; } +.fa-square-ellipsis::before { content: "\e26e"; } +.fa-square-ellipsis-vertical::before { content: "\e26f"; } +.fa-square-envelope::before { content: "\f199"; } +.fa-square-exclamation::before { content: "\f321"; } +.fa-square-f::before { content: "\e270"; } +.fa-square-fragile::before { content: "\f49b"; } +.fa-square-full::before { content: "\f45c"; } +.fa-square-g::before { content: "\e271"; } +.fa-square-h::before { content: "\f0fd"; } +.fa-square-heart::before { content: "\f4c8"; } +.fa-square-i::before { content: "\e272"; } +.fa-square-info::before { content: "\f30f"; } +.fa-square-j::before { content: "\e273"; } +.fa-square-k::before { content: "\e274"; } +.fa-square-kanban::before { content: "\e488"; } +.fa-square-l::before { content: "\e275"; } +.fa-square-left::before { content: "\f351"; } +.fa-square-list::before { content: "\e489"; } +.fa-square-m::before { content: "\e276"; } +.fa-square-minus::before { content: "\f146"; } +.fa-square-n::before { content: "\e277"; } +.fa-square-nfi::before { content: "\e576"; } +.fa-square-o::before { content: "\e278"; } +.fa-square-p::before { content: "\e279"; } +.fa-square-parking::before { content: "\f540"; } +.fa-square-parking-slash::before { content: "\f617"; } +.fa-square-pen::before { content: "\f14b"; } +.fa-square-person-confined::before { content: "\e577"; } +.fa-square-phone::before { content: "\f098"; } +.fa-square-phone-flip::before { content: "\f87b"; } +.fa-square-phone-hangup::before { content: "\e27a"; } +.fa-square-plus::before { content: "\f0fe"; } +.fa-square-poll-horizontal::before { content: "\f682"; } +.fa-square-poll-vertical::before { content: "\f681"; } +.fa-square-q::before { content: "\e27b"; } +.fa-square-quarters::before { content: "\e44e"; } +.fa-square-question::before { content: "\f2fd"; } +.fa-square-quote::before { content: "\e329"; } +.fa-square-r::before { content: "\e27c"; } +.fa-square-right::before { content: "\f352"; } +.fa-square-ring::before { content: "\e44f"; } +.fa-square-root::before { content: "\f697"; } +.fa-square-root-alt::before { content: "\f698"; } +.fa-square-root-variable::before { content: "\f698"; } +.fa-square-rss::before { content: "\f143"; } +.fa-square-s::before { content: "\e27d"; } +.fa-square-share-nodes::before { content: "\f1e1"; } +.fa-square-sliders::before { content: "\f3f0"; } +.fa-square-sliders-vertical::before { content: "\f3f2"; } +.fa-square-small::before { content: "\e27e"; } +.fa-square-star::before { content: "\e27f"; } +.fa-square-t::before { content: "\e280"; } +.fa-square-terminal::before { content: "\e32a"; } +.fa-square-this-way-up::before { content: "\f49f"; } +.fa-square-u::before { content: "\e281"; } +.fa-square-up::before { content: "\f353"; } +.fa-square-up-left::before { content: "\e282"; } +.fa-square-up-right::before { content: "\f360"; } +.fa-square-user::before { content: "\e283"; } +.fa-square-v::before { content: "\e284"; } +.fa-square-virus::before { content: "\e578"; } +.fa-square-w::before { content: "\e285"; } +.fa-square-wine-glass-crack::before { content: "\f49b"; } +.fa-square-x::before { content: "\e286"; } +.fa-square-xmark::before { content: "\f2d3"; } +.fa-square-y::before { content: "\e287"; } +.fa-square-z::before { content: "\e288"; } +.fa-squid::before { content: "\e450"; } +.fa-squirrel::before { content: "\f71a"; } +.fa-staff::before { content: "\f71b"; } +.fa-staff-aesculapius::before { content: "\e579"; } +.fa-staff-snake::before { content: "\e579"; } +.fa-stairs::before { content: "\e289"; } +.fa-stamp::before { content: "\f5bf"; } +.fa-standard-definition::before { content: "\e28a"; } +.fa-stapler::before { content: "\e5af"; } +.fa-star::before { content: "\f005"; } +.fa-star-and-crescent::before { content: "\f699"; } +.fa-star-christmas::before { content: "\f7d4"; } +.fa-star-circle::before { content: "\e123"; } +.fa-star-exclamation::before { content: "\f2f3"; } +.fa-star-half::before { content: "\f089"; } +.fa-star-half-alt::before { content: "\f5c0"; } +.fa-star-half-stroke::before { content: "\f5c0"; } +.fa-star-of-david::before { content: "\f69a"; } +.fa-star-of-life::before { content: "\f621"; } +.fa-star-sharp::before { content: "\e28b"; } +.fa-star-sharp-half::before { content: "\e28c"; } +.fa-star-sharp-half-alt::before { content: "\e28d"; } +.fa-star-sharp-half-stroke::before { content: "\e28d"; } +.fa-star-shooting::before { content: "\e036"; } +.fa-starfighter::before { content: "\e037"; } +.fa-starfighter-alt::before { content: "\e038"; } +.fa-starfighter-alt-advanced::before { content: "\e28e"; } +.fa-starfighter-twin-ion-engine::before { content: "\e038"; } +.fa-starfighter-twin-ion-engine-advanced::before { content: "\e28e"; } +.fa-stars::before { content: "\f762"; } +.fa-starship::before { content: "\e039"; } +.fa-starship-freighter::before { content: "\e03a"; } +.fa-steak::before { content: "\f824"; } +.fa-steering-wheel::before { content: "\f622"; } +.fa-step-backward::before { content: "\f048"; } +.fa-step-forward::before { content: "\f051"; } +.fa-sterling-sign::before { content: "\f154"; } +.fa-stethoscope::before { content: "\f0f1"; } +.fa-sticky-note::before { content: "\f249"; } +.fa-stocking::before { content: "\f7d5"; } +.fa-stomach::before { content: "\f623"; } +.fa-stop::before { content: "\f04d"; } +.fa-stop-circle::before { content: "\f28d"; } +.fa-stopwatch::before { content: "\f2f2"; } +.fa-stopwatch-20::before { content: "\e06f"; } +.fa-store::before { content: "\f54e"; } +.fa-store-alt::before { content: "\f54f"; } +.fa-store-alt-slash::before { content: "\e070"; } +.fa-store-lock::before { content: "\e4a6"; } +.fa-store-slash::before { content: "\e071"; } +.fa-strawberry::before { content: "\e32b"; } +.fa-stream::before { content: "\f550"; } +.fa-street-view::before { content: "\f21d"; } +.fa-stretcher::before { content: "\f825"; } +.fa-strikethrough::before { content: "\f0cc"; } +.fa-stroopwafel::before { content: "\f551"; } +.fa-subscript::before { content: "\f12c"; } +.fa-subtitles::before { content: "\e60f"; } +.fa-subtitles-slash::before { content: "\e610"; } +.fa-subtract::before { content: "\f068"; } +.fa-subway::before { content: "\f239"; } +.fa-subway-tunnel::before { content: "\e2a3"; } +.fa-suitcase::before { content: "\f0f2"; } +.fa-suitcase-medical::before { content: "\f0fa"; } +.fa-suitcase-rolling::before { content: "\f5c1"; } +.fa-sun::before { content: "\f185"; } +.fa-sun-alt::before { content: "\e28f"; } +.fa-sun-bright::before { content: "\e28f"; } +.fa-sun-cloud::before { content: "\f763"; } +.fa-sun-dust::before { content: "\f764"; } +.fa-sun-haze::before { content: "\f765"; } +.fa-sun-plant-wilt::before { content: "\e57a"; } +.fa-sunglasses::before { content: "\f892"; } +.fa-sunrise::before { content: "\f766"; } +.fa-sunset::before { content: "\f767"; } +.fa-superscript::before { content: "\f12b"; } +.fa-surprise::before { content: "\f5c2"; } +.fa-sushi::before { content: "\e48a"; } +.fa-sushi-roll::before { content: "\e48b"; } +.fa-swap::before { content: "\e609"; } +.fa-swap-arrows::before { content: "\e60a"; } +.fa-swatchbook::before { content: "\f5c3"; } +.fa-swimmer::before { content: "\f5c4"; } +.fa-swimming-pool::before { content: "\f5c5"; } +.fa-sword::before { content: "\f71c"; } +.fa-sword-laser::before { content: "\e03b"; } +.fa-sword-laser-alt::before { content: "\e03c"; } +.fa-swords::before { content: "\f71d"; } +.fa-swords-laser::before { content: "\e03d"; } +.fa-symbols::before { content: "\f86e"; } +.fa-synagogue::before { content: "\f69b"; } +.fa-sync::before { content: "\f021"; } +.fa-sync-alt::before { content: "\f2f1"; } +.fa-syringe::before { content: "\f48e"; } +.fa-t::before { content: "\54"; } +.fa-t-rex::before { content: "\e629"; } +.fa-t-shirt::before { content: "\f553"; } +.fa-table::before { content: "\f0ce"; } +.fa-table-cells::before { content: "\f00a"; } +.fa-table-cells-column-lock::before { content: "\e678"; } +.fa-table-cells-column-unlock::before { content: "\e690"; } +.fa-table-cells-large::before { content: "\f009"; } +.fa-table-cells-lock::before { content: "\e679"; } +.fa-table-cells-row-lock::before { content: "\e67a"; } +.fa-table-cells-row-unlock::before { content: "\e691"; } +.fa-table-cells-unlock::before { content: "\e692"; } +.fa-table-columns::before { content: "\f0db"; } +.fa-table-layout::before { content: "\e290"; } +.fa-table-list::before { content: "\f00b"; } +.fa-table-picnic::before { content: "\e32d"; } +.fa-table-pivot::before { content: "\e291"; } +.fa-table-rows::before { content: "\e292"; } +.fa-table-tennis::before { content: "\f45d"; } +.fa-table-tennis-paddle-ball::before { content: "\f45d"; } +.fa-table-tree::before { content: "\e293"; } +.fa-tablet::before { content: "\f3fb"; } +.fa-tablet-alt::before { content: "\f3fa"; } +.fa-tablet-android::before { content: "\f3fb"; } +.fa-tablet-android-alt::before { content: "\f3fc"; } +.fa-tablet-button::before { content: "\f10a"; } +.fa-tablet-rugged::before { content: "\f48f"; } +.fa-tablet-screen::before { content: "\f3fc"; } +.fa-tablet-screen-button::before { content: "\f3fa"; } +.fa-tablets::before { content: "\f490"; } +.fa-tachograph-digital::before { content: "\f566"; } +.fa-tachometer::before { content: "\f62a"; } +.fa-tachometer-alt::before { content: "\f625"; } +.fa-tachometer-alt-average::before { content: "\f624"; } +.fa-tachometer-alt-fast::before { content: "\f625"; } +.fa-tachometer-alt-fastest::before { content: "\f626"; } +.fa-tachometer-alt-slow::before { content: "\f627"; } +.fa-tachometer-alt-slowest::before { content: "\f628"; } +.fa-tachometer-average::before { content: "\f629"; } +.fa-tachometer-fast::before { content: "\f62a"; } +.fa-tachometer-fastest::before { content: "\f62b"; } +.fa-tachometer-slow::before { content: "\f62c"; } +.fa-tachometer-slowest::before { content: "\f62d"; } +.fa-taco::before { content: "\f826"; } +.fa-tag::before { content: "\f02b"; } +.fa-tags::before { content: "\f02c"; } +.fa-tally::before { content: "\f69c"; } +.fa-tally-1::before { content: "\e294"; } +.fa-tally-2::before { content: "\e295"; } +.fa-tally-3::before { content: "\e296"; } +.fa-tally-4::before { content: "\e297"; } +.fa-tally-5::before { content: "\f69c"; } +.fa-tamale::before { content: "\e451"; } +.fa-tanakh::before { content: "\f827"; } +.fa-tank-water::before { content: "\e452"; } +.fa-tape::before { content: "\f4db"; } +.fa-tarp::before { content: "\e57b"; } +.fa-tarp-droplet::before { content: "\e57c"; } +.fa-tasks::before { content: "\f0ae"; } +.fa-tasks-alt::before { content: "\f828"; } +.fa-taxi::before { content: "\f1ba"; } +.fa-taxi-bus::before { content: "\e298"; } +.fa-teddy-bear::before { content: "\e3cf"; } +.fa-teeth::before { content: "\f62e"; } +.fa-teeth-open::before { content: "\f62f"; } +.fa-telescope::before { content: "\e03e"; } +.fa-teletype::before { content: "\f1e4"; } +.fa-teletype-answer::before { content: "\e2b9"; } +.fa-television::before { content: "\f26c"; } +.fa-temperature-0::before { content: "\f2cb"; } +.fa-temperature-1::before { content: "\f2ca"; } +.fa-temperature-2::before { content: "\f2c9"; } +.fa-temperature-3::before { content: "\f2c8"; } +.fa-temperature-4::before { content: "\f2c7"; } +.fa-temperature-arrow-down::before { content: "\e03f"; } +.fa-temperature-arrow-up::before { content: "\e040"; } +.fa-temperature-down::before { content: "\e03f"; } +.fa-temperature-empty::before { content: "\f2cb"; } +.fa-temperature-frigid::before { content: "\f768"; } +.fa-temperature-full::before { content: "\f2c7"; } +.fa-temperature-half::before { content: "\f2c9"; } +.fa-temperature-high::before { content: "\f769"; } +.fa-temperature-hot::before { content: "\f76a"; } +.fa-temperature-list::before { content: "\e299"; } +.fa-temperature-low::before { content: "\f76b"; } +.fa-temperature-quarter::before { content: "\f2ca"; } +.fa-temperature-snow::before { content: "\f768"; } +.fa-temperature-sun::before { content: "\f76a"; } +.fa-temperature-three-quarters::before { content: "\f2c8"; } +.fa-temperature-up::before { content: "\e040"; } +.fa-tenge::before { content: "\f7d7"; } +.fa-tenge-sign::before { content: "\f7d7"; } +.fa-tennis-ball::before { content: "\f45e"; } +.fa-tent::before { content: "\e57d"; } +.fa-tent-arrow-down-to-line::before { content: "\e57e"; } +.fa-tent-arrow-left-right::before { content: "\e57f"; } +.fa-tent-arrow-turn-left::before { content: "\e580"; } +.fa-tent-arrows-down::before { content: "\e581"; } +.fa-tent-double-peak::before { content: "\e627"; } +.fa-tents::before { content: "\e582"; } +.fa-terminal::before { content: "\f120"; } +.fa-text::before { content: "\f893"; } +.fa-text-height::before { content: "\f034"; } +.fa-text-size::before { content: "\f894"; } +.fa-text-slash::before { content: "\f87d"; } +.fa-text-width::before { content: "\f035"; } +.fa-th::before { content: "\f00a"; } +.fa-th-large::before { content: "\f009"; } +.fa-th-list::before { content: "\f00b"; } +.fa-theater-masks::before { content: "\f630"; } +.fa-thermometer::before { content: "\f491"; } +.fa-thermometer-0::before { content: "\f2cb"; } +.fa-thermometer-1::before { content: "\f2ca"; } +.fa-thermometer-2::before { content: "\f2c9"; } +.fa-thermometer-3::before { content: "\f2c8"; } +.fa-thermometer-4::before { content: "\f2c7"; } +.fa-thermometer-empty::before { content: "\f2cb"; } +.fa-thermometer-full::before { content: "\f2c7"; } +.fa-thermometer-half::before { content: "\f2c9"; } +.fa-thermometer-quarter::before { content: "\f2ca"; } +.fa-thermometer-three-quarters::before { content: "\f2c8"; } +.fa-theta::before { content: "\f69e"; } +.fa-thought-bubble::before { content: "\e32e"; } +.fa-thumb-tack::before { content: "\f08d"; } +.fa-thumb-tack-slash::before { content: "\e68f"; } +.fa-thumbs-down::before { content: "\f165"; } +.fa-thumbs-up::before { content: "\f164"; } +.fa-thumbtack::before { content: "\f08d"; } +.fa-thumbtack-slash::before { content: "\e68f"; } +.fa-thunderstorm::before { content: "\f76c"; } +.fa-thunderstorm-moon::before { content: "\f76d"; } +.fa-thunderstorm-sun::before { content: "\f76e"; } +.fa-tick::before { content: "\e32f"; } +.fa-ticket::before { content: "\f145"; } +.fa-ticket-airline::before { content: "\e29a"; } +.fa-ticket-alt::before { content: "\f3ff"; } +.fa-ticket-perforated::before { content: "\e63e"; } +.fa-ticket-perforated-plane::before { content: "\e29a"; } +.fa-ticket-plane::before { content: "\e29a"; } +.fa-ticket-simple::before { content: "\f3ff"; } +.fa-tickets::before { content: "\e658"; } +.fa-tickets-airline::before { content: "\e29b"; } +.fa-tickets-perforated::before { content: "\e63f"; } +.fa-tickets-perforated-plane::before { content: "\e29b"; } +.fa-tickets-plane::before { content: "\e29b"; } +.fa-tickets-simple::before { content: "\e659"; } +.fa-tilde::before { content: "\7e"; } +.fa-timeline::before { content: "\e29c"; } +.fa-timeline-arrow::before { content: "\e29d"; } +.fa-timer::before { content: "\e29e"; } +.fa-times::before { content: "\f00d"; } +.fa-times-circle::before { content: "\f057"; } +.fa-times-hexagon::before { content: "\f2ee"; } +.fa-times-octagon::before { content: "\f2f0"; } +.fa-times-rectangle::before { content: "\f410"; } +.fa-times-square::before { content: "\f2d3"; } +.fa-times-to-slot::before { content: "\f771"; } +.fa-tint::before { content: "\f043"; } +.fa-tint-slash::before { content: "\f5c7"; } +.fa-tire::before { content: "\f631"; } +.fa-tire-flat::before { content: "\f632"; } +.fa-tire-pressure-warning::before { content: "\f633"; } +.fa-tire-rugged::before { content: "\f634"; } +.fa-tired::before { content: "\f5c8"; } +.fa-toggle-large-off::before { content: "\e5b0"; } +.fa-toggle-large-on::before { content: "\e5b1"; } +.fa-toggle-off::before { content: "\f204"; } +.fa-toggle-on::before { content: "\f205"; } +.fa-toilet::before { content: "\f7d8"; } +.fa-toilet-paper::before { content: "\f71e"; } +.fa-toilet-paper-alt::before { content: "\f71f"; } +.fa-toilet-paper-blank::before { content: "\f71f"; } +.fa-toilet-paper-blank-under::before { content: "\e29f"; } +.fa-toilet-paper-check::before { content: "\e5b2"; } +.fa-toilet-paper-reverse::before { content: "\e2a0"; } +.fa-toilet-paper-reverse-alt::before { content: "\e29f"; } +.fa-toilet-paper-reverse-slash::before { content: "\e2a1"; } +.fa-toilet-paper-slash::before { content: "\e072"; } +.fa-toilet-paper-under::before { content: "\e2a0"; } +.fa-toilet-paper-under-slash::before { content: "\e2a1"; } +.fa-toilet-paper-xmark::before { content: "\e5b3"; } +.fa-toilet-portable::before { content: "\e583"; } +.fa-toilets-portable::before { content: "\e584"; } +.fa-tomato::before { content: "\e330"; } +.fa-tombstone::before { content: "\f720"; } +.fa-tombstone-alt::before { content: "\f721"; } +.fa-tombstone-blank::before { content: "\f721"; } +.fa-toolbox::before { content: "\f552"; } +.fa-tools::before { content: "\f7d9"; } +.fa-tooth::before { content: "\f5c9"; } +.fa-toothbrush::before { content: "\f635"; } +.fa-torah::before { content: "\f6a0"; } +.fa-torii-gate::before { content: "\f6a1"; } +.fa-tornado::before { content: "\f76f"; } +.fa-tower-broadcast::before { content: "\f519"; } +.fa-tower-cell::before { content: "\e585"; } +.fa-tower-control::before { content: "\e2a2"; } +.fa-tower-observation::before { content: "\e586"; } +.fa-tractor::before { content: "\f722"; } +.fa-trademark::before { content: "\f25c"; } +.fa-traffic-cone::before { content: "\f636"; } +.fa-traffic-light::before { content: "\f637"; } +.fa-traffic-light-go::before { content: "\f638"; } +.fa-traffic-light-slow::before { content: "\f639"; } +.fa-traffic-light-stop::before { content: "\f63a"; } +.fa-trailer::before { content: "\e041"; } +.fa-train::before { content: "\f238"; } +.fa-train-subway::before { content: "\f239"; } +.fa-train-subway-tunnel::before { content: "\e2a3"; } +.fa-train-track::before { content: "\e453"; } +.fa-train-tram::before { content: "\e5b4"; } +.fa-train-tunnel::before { content: "\e454"; } +.fa-tram::before { content: "\f7da"; } +.fa-transformer-bolt::before { content: "\e2a4"; } +.fa-transgender::before { content: "\f225"; } +.fa-transgender-alt::before { content: "\f225"; } +.fa-transporter::before { content: "\e042"; } +.fa-transporter-1::before { content: "\e043"; } +.fa-transporter-2::before { content: "\e044"; } +.fa-transporter-3::before { content: "\e045"; } +.fa-transporter-4::before { content: "\e2a5"; } +.fa-transporter-5::before { content: "\e2a6"; } +.fa-transporter-6::before { content: "\e2a7"; } +.fa-transporter-7::before { content: "\e2a8"; } +.fa-transporter-empty::before { content: "\e046"; } +.fa-trash::before { content: "\f1f8"; } +.fa-trash-alt::before { content: "\f2ed"; } +.fa-trash-alt-slash::before { content: "\e2ad"; } +.fa-trash-arrow-turn-left::before { content: "\f895"; } +.fa-trash-arrow-up::before { content: "\f829"; } +.fa-trash-can::before { content: "\f2ed"; } +.fa-trash-can-arrow-turn-left::before { content: "\f896"; } +.fa-trash-can-arrow-up::before { content: "\f82a"; } +.fa-trash-can-check::before { content: "\e2a9"; } +.fa-trash-can-clock::before { content: "\e2aa"; } +.fa-trash-can-list::before { content: "\e2ab"; } +.fa-trash-can-plus::before { content: "\e2ac"; } +.fa-trash-can-slash::before { content: "\e2ad"; } +.fa-trash-can-undo::before { content: "\f896"; } +.fa-trash-can-xmark::before { content: "\e2ae"; } +.fa-trash-check::before { content: "\e2af"; } +.fa-trash-circle::before { content: "\e126"; } +.fa-trash-clock::before { content: "\e2b0"; } +.fa-trash-list::before { content: "\e2b1"; } +.fa-trash-plus::before { content: "\e2b2"; } +.fa-trash-restore::before { content: "\f829"; } +.fa-trash-restore-alt::before { content: "\f82a"; } +.fa-trash-slash::before { content: "\e2b3"; } +.fa-trash-undo::before { content: "\f895"; } +.fa-trash-undo-alt::before { content: "\f896"; } +.fa-trash-xmark::before { content: "\e2b4"; } +.fa-treasure-chest::before { content: "\f723"; } +.fa-tree::before { content: "\f1bb"; } +.fa-tree-alt::before { content: "\f400"; } +.fa-tree-christmas::before { content: "\f7db"; } +.fa-tree-city::before { content: "\e587"; } +.fa-tree-deciduous::before { content: "\f400"; } +.fa-tree-decorated::before { content: "\f7dc"; } +.fa-tree-large::before { content: "\f7dd"; } +.fa-tree-palm::before { content: "\f82b"; } +.fa-trees::before { content: "\f724"; } +.fa-trian-balbot::before { content: "\e45c"; } +.fa-triangle::before { content: "\f2ec"; } +.fa-triangle-circle-square::before { content: "\f61f"; } +.fa-triangle-exclamation::before { content: "\f071"; } +.fa-triangle-instrument::before { content: "\f8e2"; } +.fa-triangle-music::before { content: "\f8e2"; } +.fa-triangle-person-digging::before { content: "\f85d"; } +.fa-tricycle::before { content: "\e5c3"; } +.fa-tricycle-adult::before { content: "\e5c4"; } +.fa-trillium::before { content: "\e588"; } +.fa-trophy::before { content: "\f091"; } +.fa-trophy-alt::before { content: "\f2eb"; } +.fa-trophy-star::before { content: "\f2eb"; } +.fa-trowel::before { content: "\e589"; } +.fa-trowel-bricks::before { content: "\e58a"; } +.fa-truck::before { content: "\f0d1"; } +.fa-truck-arrow-right::before { content: "\e58b"; } +.fa-truck-bolt::before { content: "\e3d0"; } +.fa-truck-clock::before { content: "\f48c"; } +.fa-truck-container::before { content: "\f4dc"; } +.fa-truck-container-empty::before { content: "\e2b5"; } +.fa-truck-couch::before { content: "\f4dd"; } +.fa-truck-droplet::before { content: "\e58c"; } +.fa-truck-fast::before { content: "\f48b"; } +.fa-truck-field::before { content: "\e58d"; } +.fa-truck-field-un::before { content: "\e58e"; } +.fa-truck-fire::before { content: "\e65a"; } +.fa-truck-flatbed::before { content: "\e2b6"; } +.fa-truck-front::before { content: "\e2b7"; } +.fa-truck-ladder::before { content: "\e657"; } +.fa-truck-loading::before { content: "\f4de"; } +.fa-truck-medical::before { content: "\f0f9"; } +.fa-truck-monster::before { content: "\f63b"; } +.fa-truck-moving::before { content: "\f4df"; } +.fa-truck-pickup::before { content: "\f63c"; } +.fa-truck-plane::before { content: "\e58f"; } +.fa-truck-plow::before { content: "\f7de"; } +.fa-truck-ramp::before { content: "\f4e0"; } +.fa-truck-ramp-box::before { content: "\f4de"; } +.fa-truck-ramp-couch::before { content: "\f4dd"; } +.fa-truck-tow::before { content: "\e2b8"; } +.fa-truck-utensils::before { content: "\e628"; } +.fa-trumpet::before { content: "\f8e3"; } +.fa-try::before { content: "\e2bb"; } +.fa-tshirt::before { content: "\f553"; } +.fa-tty::before { content: "\f1e4"; } +.fa-tty-answer::before { content: "\e2b9"; } +.fa-tugrik-sign::before { content: "\e2ba"; } +.fa-turkey::before { content: "\f725"; } +.fa-turkish-lira::before { content: "\e2bb"; } +.fa-turkish-lira-sign::before { content: "\e2bb"; } +.fa-turn-down::before { content: "\f3be"; } +.fa-turn-down-left::before { content: "\e331"; } +.fa-turn-down-right::before { content: "\e455"; } +.fa-turn-left::before { content: "\e636"; } +.fa-turn-left-down::before { content: "\e637"; } +.fa-turn-left-up::before { content: "\e638"; } +.fa-turn-right::before { content: "\e639"; } +.fa-turn-up::before { content: "\f3bf"; } +.fa-turntable::before { content: "\f8e4"; } +.fa-turtle::before { content: "\f726"; } +.fa-tv::before { content: "\f26c"; } +.fa-tv-alt::before { content: "\f26c"; } +.fa-tv-music::before { content: "\f8e6"; } +.fa-tv-retro::before { content: "\f401"; } +.fa-typewriter::before { content: "\f8e7"; } +.fa-u::before { content: "\55"; } +.fa-ufo::before { content: "\e047"; } +.fa-ufo-beam::before { content: "\e048"; } +.fa-umbrella::before { content: "\f0e9"; } +.fa-umbrella-alt::before { content: "\e2bc"; } +.fa-umbrella-beach::before { content: "\f5ca"; } +.fa-umbrella-simple::before { content: "\e2bc"; } +.fa-underline::before { content: "\f0cd"; } +.fa-undo::before { content: "\f0e2"; } +.fa-undo-alt::before { content: "\f2ea"; } +.fa-unicorn::before { content: "\f727"; } +.fa-uniform-martial-arts::before { content: "\e3d1"; } +.fa-union::before { content: "\f6a2"; } +.fa-universal-access::before { content: "\f29a"; } +.fa-university::before { content: "\f19c"; } +.fa-unlink::before { content: "\f127"; } +.fa-unlock::before { content: "\f09c"; } +.fa-unlock-alt::before { content: "\f13e"; } +.fa-unlock-keyhole::before { content: "\f13e"; } +.fa-unsorted::before { content: "\f0dc"; } +.fa-up::before { content: "\f357"; } +.fa-up-down::before { content: "\f338"; } +.fa-up-down-left-right::before { content: "\f0b2"; } +.fa-up-from-bracket::before { content: "\e590"; } +.fa-up-from-dotted-line::before { content: "\e456"; } +.fa-up-from-line::before { content: "\f346"; } +.fa-up-left::before { content: "\e2bd"; } +.fa-up-long::before { content: "\f30c"; } +.fa-up-right::before { content: "\e2be"; } +.fa-up-right-and-down-left-from-center::before { content: "\f424"; } +.fa-up-right-from-square::before { content: "\f35d"; } +.fa-up-to-bracket::before { content: "\e66e"; } +.fa-up-to-dotted-line::before { content: "\e457"; } +.fa-up-to-line::before { content: "\f34d"; } +.fa-upload::before { content: "\f093"; } +.fa-usb-drive::before { content: "\f8e9"; } +.fa-usd::before { content: "\24"; } +.fa-usd-circle::before { content: "\f2e8"; } +.fa-usd-square::before { content: "\f2e9"; } +.fa-user::before { content: "\f007"; } +.fa-user-alien::before { content: "\e04a"; } +.fa-user-alt::before { content: "\f406"; } +.fa-user-alt-slash::before { content: "\f4fa"; } +.fa-user-astronaut::before { content: "\f4fb"; } +.fa-user-beard-bolt::before { content: "\e689"; } +.fa-user-bounty-hunter::before { content: "\e2bf"; } +.fa-user-chart::before { content: "\f6a3"; } +.fa-user-check::before { content: "\f4fc"; } +.fa-user-chef::before { content: "\e3d2"; } +.fa-user-circle::before { content: "\f2bd"; } +.fa-user-clock::before { content: "\f4fd"; } +.fa-user-cog::before { content: "\f4fe"; } +.fa-user-construction::before { content: "\f82c"; } +.fa-user-cowboy::before { content: "\f8ea"; } +.fa-user-crown::before { content: "\f6a4"; } +.fa-user-doctor::before { content: "\f0f0"; } +.fa-user-doctor-hair::before { content: "\e458"; } +.fa-user-doctor-hair-long::before { content: "\e459"; } +.fa-user-doctor-message::before { content: "\f82e"; } +.fa-user-edit::before { content: "\f4ff"; } +.fa-user-friends::before { content: "\f500"; } +.fa-user-gear::before { content: "\f4fe"; } +.fa-user-graduate::before { content: "\f501"; } +.fa-user-group::before { content: "\f500"; } +.fa-user-group-crown::before { content: "\f6a5"; } +.fa-user-group-simple::before { content: "\e603"; } +.fa-user-hair::before { content: "\e45a"; } +.fa-user-hair-buns::before { content: "\e3d3"; } +.fa-user-hair-long::before { content: "\e45b"; } +.fa-user-hair-mullet::before { content: "\e45c"; } +.fa-user-hard-hat::before { content: "\f82c"; } +.fa-user-headset::before { content: "\f82d"; } +.fa-user-helmet-safety::before { content: "\f82c"; } +.fa-user-hoodie::before { content: "\e68a"; } +.fa-user-injured::before { content: "\f728"; } +.fa-user-large::before { content: "\f406"; } +.fa-user-large-slash::before { content: "\f4fa"; } +.fa-user-lock::before { content: "\f502"; } +.fa-user-magnifying-glass::before { content: "\e5c5"; } +.fa-user-md::before { content: "\f0f0"; } +.fa-user-md-chat::before { content: "\f82e"; } +.fa-user-minus::before { content: "\f503"; } +.fa-user-music::before { content: "\f8eb"; } +.fa-user-ninja::before { content: "\f504"; } +.fa-user-nurse::before { content: "\f82f"; } +.fa-user-nurse-hair::before { content: "\e45d"; } +.fa-user-nurse-hair-long::before { content: "\e45e"; } +.fa-user-pen::before { content: "\f4ff"; } +.fa-user-pilot::before { content: "\e2c0"; } +.fa-user-pilot-tie::before { content: "\e2c1"; } +.fa-user-plus::before { content: "\f234"; } +.fa-user-police::before { content: "\e333"; } +.fa-user-police-tie::before { content: "\e334"; } +.fa-user-robot::before { content: "\e04b"; } +.fa-user-robot-xmarks::before { content: "\e4a7"; } +.fa-user-secret::before { content: "\f21b"; } +.fa-user-shakespeare::before { content: "\e2c2"; } +.fa-user-shield::before { content: "\f505"; } +.fa-user-slash::before { content: "\f506"; } +.fa-user-tag::before { content: "\f507"; } +.fa-user-tie::before { content: "\f508"; } +.fa-user-tie-hair::before { content: "\e45f"; } +.fa-user-tie-hair-long::before { content: "\e460"; } +.fa-user-times::before { content: "\f235"; } +.fa-user-unlock::before { content: "\e058"; } +.fa-user-visor::before { content: "\e04c"; } +.fa-user-vneck::before { content: "\e461"; } +.fa-user-vneck-hair::before { content: "\e462"; } +.fa-user-vneck-hair-long::before { content: "\e463"; } +.fa-user-xmark::before { content: "\f235"; } +.fa-users::before { content: "\f0c0"; } +.fa-users-between-lines::before { content: "\e591"; } +.fa-users-class::before { content: "\f63d"; } +.fa-users-cog::before { content: "\f509"; } +.fa-users-crown::before { content: "\f6a5"; } +.fa-users-gear::before { content: "\f509"; } +.fa-users-line::before { content: "\e592"; } +.fa-users-medical::before { content: "\f830"; } +.fa-users-rays::before { content: "\e593"; } +.fa-users-rectangle::before { content: "\e594"; } +.fa-users-slash::before { content: "\e073"; } +.fa-users-viewfinder::before { content: "\e595"; } +.fa-utensil-fork::before { content: "\f2e3"; } +.fa-utensil-knife::before { content: "\f2e4"; } +.fa-utensil-spoon::before { content: "\f2e5"; } +.fa-utensils::before { content: "\f2e7"; } +.fa-utensils-alt::before { content: "\f2e6"; } +.fa-utensils-slash::before { content: "\e464"; } +.fa-utility-pole::before { content: "\e2c3"; } +.fa-utility-pole-double::before { content: "\e2c4"; } +.fa-v::before { content: "\56"; } +.fa-vacuum::before { content: "\e04d"; } +.fa-vacuum-robot::before { content: "\e04e"; } +.fa-value-absolute::before { content: "\f6a6"; } +.fa-van-shuttle::before { content: "\f5b6"; } +.fa-vault::before { content: "\e2c5"; } +.fa-vcard::before { content: "\f2bb"; } +.fa-vector-circle::before { content: "\e2c6"; } +.fa-vector-polygon::before { content: "\e2c7"; } +.fa-vector-square::before { content: "\f5cb"; } +.fa-vent-damper::before { content: "\e465"; } +.fa-venus::before { content: "\f221"; } +.fa-venus-double::before { content: "\f226"; } +.fa-venus-mars::before { content: "\f228"; } +.fa-vest::before { content: "\e085"; } +.fa-vest-patches::before { content: "\e086"; } +.fa-vhs::before { content: "\f8ec"; } +.fa-vial::before { content: "\f492"; } +.fa-vial-circle-check::before { content: "\e596"; } +.fa-vial-virus::before { content: "\e597"; } +.fa-vials::before { content: "\f493"; } +.fa-video::before { content: "\f03d"; } +.fa-video-arrow-down-left::before { content: "\e2c8"; } +.fa-video-arrow-up-right::before { content: "\e2c9"; } +.fa-video-camera::before { content: "\f03d"; } +.fa-video-circle::before { content: "\e12b"; } +.fa-video-handheld::before { content: "\f8a8"; } +.fa-video-plus::before { content: "\f4e1"; } +.fa-video-slash::before { content: "\f4e2"; } +.fa-vihara::before { content: "\f6a7"; } +.fa-violin::before { content: "\f8ed"; } +.fa-virus::before { content: "\e074"; } +.fa-virus-covid::before { content: "\e4a8"; } +.fa-virus-covid-slash::before { content: "\e4a9"; } +.fa-virus-slash::before { content: "\e075"; } +.fa-viruses::before { content: "\e076"; } +.fa-voicemail::before { content: "\f897"; } +.fa-volcano::before { content: "\f770"; } +.fa-volleyball::before { content: "\f45f"; } +.fa-volleyball-ball::before { content: "\f45f"; } +.fa-volume::before { content: "\f6a8"; } +.fa-volume-control-phone::before { content: "\f2a0"; } +.fa-volume-down::before { content: "\f027"; } +.fa-volume-high::before { content: "\f028"; } +.fa-volume-low::before { content: "\f027"; } +.fa-volume-medium::before { content: "\f6a8"; } +.fa-volume-mute::before { content: "\f6a9"; } +.fa-volume-off::before { content: "\f026"; } +.fa-volume-slash::before { content: "\f2e2"; } +.fa-volume-times::before { content: "\f6a9"; } +.fa-volume-up::before { content: "\f028"; } +.fa-volume-xmark::before { content: "\f6a9"; } +.fa-vote-nay::before { content: "\f771"; } +.fa-vote-yea::before { content: "\f772"; } +.fa-vr-cardboard::before { content: "\f729"; } +.fa-w::before { content: "\57"; } +.fa-waffle::before { content: "\e466"; } +.fa-wagon-covered::before { content: "\f8ee"; } +.fa-walker::before { content: "\f831"; } +.fa-walkie-talkie::before { content: "\f8ef"; } +.fa-walking::before { content: "\f554"; } +.fa-wall-brick::before { content: "\e3db"; } +.fa-wallet::before { content: "\f555"; } +.fa-wand::before { content: "\f72a"; } +.fa-wand-magic::before { content: "\f0d0"; } +.fa-wand-magic-sparkles::before { content: "\e2ca"; } +.fa-wand-sparkles::before { content: "\f72b"; } +.fa-warehouse::before { content: "\f494"; } +.fa-warehouse-alt::before { content: "\f495"; } +.fa-warehouse-full::before { content: "\f495"; } +.fa-warning::before { content: "\f071"; } +.fa-washer::before { content: "\f898"; } +.fa-washing-machine::before { content: "\f898"; } +.fa-watch::before { content: "\f2e1"; } +.fa-watch-apple::before { content: "\e2cb"; } +.fa-watch-calculator::before { content: "\f8f0"; } +.fa-watch-fitness::before { content: "\f63e"; } +.fa-watch-smart::before { content: "\e2cc"; } +.fa-water::before { content: "\f773"; } +.fa-water-arrow-down::before { content: "\f774"; } +.fa-water-arrow-up::before { content: "\f775"; } +.fa-water-ladder::before { content: "\f5c5"; } +.fa-water-lower::before { content: "\f774"; } +.fa-water-rise::before { content: "\f775"; } +.fa-watermelon-slice::before { content: "\e337"; } +.fa-wave::before { content: "\e65b"; } +.fa-wave-pulse::before { content: "\f5f8"; } +.fa-wave-sine::before { content: "\f899"; } +.fa-wave-square::before { content: "\f83e"; } +.fa-wave-triangle::before { content: "\f89a"; } +.fa-waveform::before { content: "\f8f1"; } +.fa-waveform-circle::before { content: "\e12d"; } +.fa-waveform-lines::before { content: "\f8f2"; } +.fa-waveform-path::before { content: "\f8f2"; } +.fa-waves-sine::before { content: "\e65d"; } +.fa-web-awesome::before { content: "\e682"; } +.fa-webcam::before { content: "\f832"; } +.fa-webcam-slash::before { content: "\f833"; } +.fa-webhook::before { content: "\e5d5"; } +.fa-weight::before { content: "\f496"; } +.fa-weight-hanging::before { content: "\f5cd"; } +.fa-weight-scale::before { content: "\f496"; } +.fa-whale::before { content: "\f72c"; } +.fa-wheat::before { content: "\f72d"; } +.fa-wheat-alt::before { content: "\e2cd"; } +.fa-wheat-awn::before { content: "\e2cd"; } +.fa-wheat-awn-circle-exclamation::before { content: "\e598"; } +.fa-wheat-awn-slash::before { content: "\e338"; } +.fa-wheat-slash::before { content: "\e339"; } +.fa-wheelchair::before { content: "\f193"; } +.fa-wheelchair-alt::before { content: "\e2ce"; } +.fa-wheelchair-move::before { content: "\e2ce"; } +.fa-whiskey-glass::before { content: "\f7a0"; } +.fa-whiskey-glass-ice::before { content: "\f7a1"; } +.fa-whistle::before { content: "\f460"; } +.fa-wifi::before { content: "\f1eb"; } +.fa-wifi-1::before { content: "\f6aa"; } +.fa-wifi-2::before { content: "\f6ab"; } +.fa-wifi-3::before { content: "\f1eb"; } +.fa-wifi-exclamation::before { content: "\e2cf"; } +.fa-wifi-fair::before { content: "\f6ab"; } +.fa-wifi-slash::before { content: "\f6ac"; } +.fa-wifi-strong::before { content: "\f1eb"; } +.fa-wifi-weak::before { content: "\f6aa"; } +.fa-wind::before { content: "\f72e"; } +.fa-wind-circle-exclamation::before { content: "\f776"; } +.fa-wind-turbine::before { content: "\f89b"; } +.fa-wind-warning::before { content: "\f776"; } +.fa-window::before { content: "\f40e"; } +.fa-window-alt::before { content: "\f40f"; } +.fa-window-close::before { content: "\f410"; } +.fa-window-flip::before { content: "\f40f"; } +.fa-window-frame::before { content: "\e04f"; } +.fa-window-frame-open::before { content: "\e050"; } +.fa-window-maximize::before { content: "\f2d0"; } +.fa-window-minimize::before { content: "\f2d1"; } +.fa-window-restore::before { content: "\f2d2"; } +.fa-windsock::before { content: "\f777"; } +.fa-wine-bottle::before { content: "\f72f"; } +.fa-wine-glass::before { content: "\f4e3"; } +.fa-wine-glass-alt::before { content: "\f5ce"; } +.fa-wine-glass-crack::before { content: "\f4bb"; } +.fa-wine-glass-empty::before { content: "\f5ce"; } +.fa-won::before { content: "\f159"; } +.fa-won-sign::before { content: "\f159"; } +.fa-worm::before { content: "\e599"; } +.fa-wreath::before { content: "\f7e2"; } +.fa-wreath-laurel::before { content: "\e5d2"; } +.fa-wrench::before { content: "\f0ad"; } +.fa-wrench-simple::before { content: "\e2d1"; } +.fa-x::before { content: "\58"; } +.fa-x-ray::before { content: "\f497"; } +.fa-xmark::before { content: "\f00d"; } +.fa-xmark-circle::before { content: "\f057"; } +.fa-xmark-hexagon::before { content: "\f2ee"; } +.fa-xmark-large::before { content: "\e59b"; } +.fa-xmark-octagon::before { content: "\f2f0"; } +.fa-xmark-square::before { content: "\f2d3"; } +.fa-xmark-to-slot::before { content: "\f771"; } +.fa-xmarks-lines::before { content: "\e59a"; } +.fa-y::before { content: "\59"; } +.fa-yen::before { content: "\f157"; } +.fa-yen-sign::before { content: "\f157"; } +.fa-yin-yang::before { content: "\f6ad"; } +.fa-z::before { content: "\5a"; } +.fa-zap::before { content: "\f0e7"; } +.fa-zzz::before { content: "\f880"; } + +.sr-only, +.fa-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + +.sr-only-focusable:not(:focus), +.fa-sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } diff --git a/codewithrockstar.com/assets/fontawesome/css/fontawesome.min.css b/codewithrockstar.com/assets/fontawesome/css/fontawesome.min.css new file mode 100644 index 00000000..8de8cc65 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/fontawesome.min.css @@ -0,0 +1 @@ +@charset "utf-8";.fa{font-family:var(--fa-style-family,"Font Awesome 6 Pro");font-weight:var(--fa-style,900)}.fa-solid,.fa-regular,.fa-brands,.fas,.far,.fab,.fal,.fat,.fad,.fass,.fasr,.fasl,.fast,.fasds,.fa-light,.fa-thin,.fa-duotone,.fa-sharp,.fa-sharp-duotone,.fa-sharp-solid,.fa-classic,.fa{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-variant:normal;text-rendering:auto;font-style:normal;line-height:1}.fas,.far,.fal,.fat,.fa-solid,.fa-regular,.fa-light,.fa-thin,.fa-classic{font-family:"Font Awesome 6 Pro"}.fab,.fa-brands{font-family:"Font Awesome 6 Brands"}.fad,.fa-classic.fa-duotone,.fa-duotone{font-family:"Font Awesome 6 Duotone"}.fasds,.fa-sharp-duotone{font-family:"Font Awesome 6 Sharp Duotone";font-weight:900}.fass,.fasr,.fasl,.fast,.fa-sharp{font-family:"Font Awesome 6 Sharp"}.fass,.fa-sharp{font-weight:900}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{vertical-align:.225em;font-size:.625em;line-height:.1em}.fa-xs{vertical-align:.125em;font-size:.75em;line-height:.08333em}.fa-sm{vertical-align:.05357em;font-size:.875em;line-height:.07143em}.fa-lg{vertical-align:-.075em;font-size:1.25em;line-height:.05em}.fa-xl{vertical-align:-.125em;font-size:1.5em;line-height:.04167em}.fa-2xl{vertical-align:-.1875em;font-size:2em;line-height:.03125em}.fa-fw{text-align:center;width:1.25em}.fa-ul{margin-left:var(--fa-li-margin,2.5em);padding-left:0;list-style-type:none}.fa-ul>li{position:relative}.fa-li{left:calc(-1*var(--fa-li-width,2em));text-align:center;width:var(--fa-li-width,2em);line-height:inherit;position:absolute}.fa-border{border-color:var(--fa-border-color,#eee);border-radius:var(--fa-border-radius,.1em);border-style:var(--fa-border-style,solid);border-width:var(--fa-border-width,.08em);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-bounce,.fa-fade,.fa-beat-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-transition-duration:0s;transition-duration:0s;-webkit-transition-delay:0s;transition-delay:0s;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-delay:-1ms;animation-delay:-1ms}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0)}57%{-webkit-transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}to{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@keyframes fa-bounce{0%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9))translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1))translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95))translateY(0)}57%{-webkit-transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1,1)translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}to{-webkit-transform:matrix(1,0,0,1,0,0);transform:matrix(1,0,0,1,0,0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0);transform:rotate(0)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0);transform:rotate(0)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,0));transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{vertical-align:middle;width:2.5em;height:2em;line-height:2em;display:inline-block;position:relative}.fa-stack-1x,.fa-stack-2x{text-align:center;z-index:var(--fa-stack-z-index,auto);width:100%;position:absolute;left:0}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-0:before{content:"0"}.fa-00:before{content:""}.fa-1:before{content:"1"}.fa-100:before{content:""}.fa-2:before{content:"2"}.fa-3:before{content:"3"}.fa-360-degrees:before{content:""}.fa-4:before{content:"4"}.fa-5:before{content:"5"}.fa-6:before{content:"6"}.fa-7:before{content:"7"}.fa-8:before{content:"8"}.fa-9:before{content:"9"}.fa-a:before{content:"A"}.fa-abacus:before{content:""}.fa-accent-grave:before{content:"`"}.fa-acorn:before{content:""}.fa-ad:before{content:""}.fa-add:before{content:"+"}.fa-address-book:before{content:""}.fa-address-card:before{content:""}.fa-adjust:before{content:""}.fa-air-conditioner:before{content:""}.fa-air-freshener:before{content:""}.fa-airplay:before{content:""}.fa-alarm-clock:before{content:""}.fa-alarm-exclamation:before{content:""}.fa-alarm-plus:before{content:""}.fa-alarm-snooze:before{content:""}.fa-album:before{content:""}.fa-album-circle-plus:before{content:""}.fa-album-circle-user:before{content:""}.fa-album-collection:before{content:""}.fa-album-collection-circle-plus:before{content:""}.fa-album-collection-circle-user:before{content:""}.fa-alicorn:before{content:""}.fa-alien:before{content:""}.fa-alien-8bit:before,.fa-alien-monster:before{content:""}.fa-align-center:before{content:""}.fa-align-justify:before{content:""}.fa-align-left:before{content:""}.fa-align-right:before{content:""}.fa-align-slash:before{content:""}.fa-allergies:before{content:""}.fa-alt:before{content:""}.fa-ambulance:before{content:""}.fa-american-sign-language-interpreting:before{content:""}.fa-amp-guitar:before{content:""}.fa-ampersand:before{content:"&"}.fa-analytics:before{content:""}.fa-anchor:before{content:""}.fa-anchor-circle-check:before{content:""}.fa-anchor-circle-exclamation:before{content:""}.fa-anchor-circle-xmark:before{content:""}.fa-anchor-lock:before{content:""}.fa-angel:before{content:""}.fa-angle:before{content:""}.fa-angle-90:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angles-down:before{content:""}.fa-angles-left:before{content:""}.fa-angles-right:before{content:""}.fa-angles-up:before{content:""}.fa-angles-up-down:before{content:""}.fa-angry:before{content:""}.fa-ankh:before{content:""}.fa-ant:before{content:""}.fa-apartment:before{content:""}.fa-aperture:before{content:""}.fa-apostrophe:before{content:"'"}.fa-apple-alt:before{content:""}.fa-apple-core:before{content:""}.fa-apple-crate:before{content:""}.fa-apple-whole:before{content:""}.fa-archive:before{content:""}.fa-archway:before{content:""}.fa-area-chart:before{content:""}.fa-arrow-alt-circle-down:before{content:""}.fa-arrow-alt-circle-left:before{content:""}.fa-arrow-alt-circle-right:before{content:""}.fa-arrow-alt-circle-up:before{content:""}.fa-arrow-alt-down:before{content:""}.fa-arrow-alt-from-bottom:before{content:""}.fa-arrow-alt-from-left:before{content:""}.fa-arrow-alt-from-right:before{content:""}.fa-arrow-alt-from-top:before{content:""}.fa-arrow-alt-left:before{content:""}.fa-arrow-alt-right:before{content:""}.fa-arrow-alt-square-down:before{content:""}.fa-arrow-alt-square-left:before{content:""}.fa-arrow-alt-square-right:before{content:""}.fa-arrow-alt-square-up:before{content:""}.fa-arrow-alt-to-bottom:before{content:""}.fa-arrow-alt-to-left:before{content:""}.fa-arrow-alt-to-right:before{content:""}.fa-arrow-alt-to-top:before{content:""}.fa-arrow-alt-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-down:before{content:""}.fa-arrow-down-1-9:before{content:""}.fa-arrow-down-9-1:before{content:""}.fa-arrow-down-a-z:before{content:""}.fa-arrow-down-arrow-up:before{content:""}.fa-arrow-down-big-small:before{content:""}.fa-arrow-down-from-arc:before{content:""}.fa-arrow-down-from-bracket:before{content:""}.fa-arrow-down-from-dotted-line:before{content:""}.fa-arrow-down-from-line:before{content:""}.fa-arrow-down-left:before{content:""}.fa-arrow-down-left-and-arrow-up-right-to-center:before{content:""}.fa-arrow-down-long:before{content:""}.fa-arrow-down-right:before{content:""}.fa-arrow-down-short-wide:before{content:""}.fa-arrow-down-small-big:before{content:""}.fa-arrow-down-square-triangle:before{content:""}.fa-arrow-down-to-arc:before{content:""}.fa-arrow-down-to-bracket:before{content:""}.fa-arrow-down-to-dotted-line:before{content:""}.fa-arrow-down-to-line:before{content:""}.fa-arrow-down-to-square:before{content:""}.fa-arrow-down-triangle-square:before{content:""}.fa-arrow-down-up-across-line:before{content:""}.fa-arrow-down-up-lock:before{content:""}.fa-arrow-down-wide-short:before{content:""}.fa-arrow-down-z-a:before{content:""}.fa-arrow-from-bottom:before{content:""}.fa-arrow-from-left:before{content:""}.fa-arrow-from-right:before{content:""}.fa-arrow-from-top:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-left-from-arc:before{content:""}.fa-arrow-left-from-bracket:before{content:""}.fa-arrow-left-from-line:before{content:""}.fa-arrow-left-long:before{content:""}.fa-arrow-left-long-to-line:before{content:""}.fa-arrow-left-rotate:before{content:""}.fa-arrow-left-to-arc:before{content:""}.fa-arrow-left-to-bracket:before{content:""}.fa-arrow-left-to-line:before{content:""}.fa-arrow-pointer:before{content:""}.fa-arrow-progress:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-right-arrow-left:before{content:""}.fa-arrow-right-from-arc:before{content:""}.fa-arrow-right-from-bracket:before{content:""}.fa-arrow-right-from-file:before{content:""}.fa-arrow-right-from-line:before{content:""}.fa-arrow-right-long:before{content:""}.fa-arrow-right-long-to-line:before{content:""}.fa-arrow-right-rotate:before{content:""}.fa-arrow-right-to-arc:before{content:""}.fa-arrow-right-to-bracket:before{content:""}.fa-arrow-right-to-city:before{content:""}.fa-arrow-right-to-file:before{content:""}.fa-arrow-right-to-line:before{content:""}.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before{content:""}.fa-arrow-rotate-forward:before{content:""}.fa-arrow-rotate-left:before{content:""}.fa-arrow-rotate-right:before{content:""}.fa-arrow-square-down:before{content:""}.fa-arrow-square-left:before{content:""}.fa-arrow-square-right:before{content:""}.fa-arrow-square-up:before{content:""}.fa-arrow-to-bottom:before{content:""}.fa-arrow-to-left:before{content:""}.fa-arrow-to-right:before{content:""}.fa-arrow-to-top:before{content:""}.fa-arrow-trend-down:before{content:""}.fa-arrow-trend-up:before{content:""}.fa-arrow-turn-down:before{content:""}.fa-arrow-turn-down-left:before{content:""}.fa-arrow-turn-down-right:before{content:""}.fa-arrow-turn-left:before{content:""}.fa-arrow-turn-left-down:before{content:""}.fa-arrow-turn-left-up:before{content:""}.fa-arrow-turn-right:before{content:""}.fa-arrow-turn-up:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-up-1-9:before{content:""}.fa-arrow-up-9-1:before{content:""}.fa-arrow-up-a-z:before{content:""}.fa-arrow-up-arrow-down:before{content:""}.fa-arrow-up-big-small:before{content:""}.fa-arrow-up-from-arc:before{content:""}.fa-arrow-up-from-bracket:before{content:""}.fa-arrow-up-from-dotted-line:before{content:""}.fa-arrow-up-from-ground-water:before{content:""}.fa-arrow-up-from-line:before{content:""}.fa-arrow-up-from-square:before{content:""}.fa-arrow-up-from-water-pump:before{content:""}.fa-arrow-up-left:before{content:""}.fa-arrow-up-left-from-circle:before{content:""}.fa-arrow-up-long:before{content:""}.fa-arrow-up-right:before{content:""}.fa-arrow-up-right-and-arrow-down-left-from-center:before{content:""}.fa-arrow-up-right-dots:before{content:""}.fa-arrow-up-right-from-square:before{content:""}.fa-arrow-up-short-wide:before{content:""}.fa-arrow-up-small-big:before{content:""}.fa-arrow-up-square-triangle:before{content:""}.fa-arrow-up-to-arc:before{content:""}.fa-arrow-up-to-bracket:before{content:""}.fa-arrow-up-to-dotted-line:before{content:""}.fa-arrow-up-to-line:before{content:""}.fa-arrow-up-triangle-square:before{content:""}.fa-arrow-up-wide-short:before{content:""}.fa-arrow-up-z-a:before{content:""}.fa-arrows:before{content:""}.fa-arrows-alt:before{content:""}.fa-arrows-alt-h:before{content:""}.fa-arrows-alt-v:before{content:""}.fa-arrows-cross:before{content:""}.fa-arrows-down-to-line:before{content:""}.fa-arrows-down-to-people:before{content:""}.fa-arrows-from-dotted-line:before{content:""}.fa-arrows-from-line:before{content:""}.fa-arrows-h:before,.fa-arrows-left-right:before{content:""}.fa-arrows-left-right-to-line:before{content:""}.fa-arrows-maximize:before{content:""}.fa-arrows-minimize:before{content:""}.fa-arrows-repeat:before{content:""}.fa-arrows-repeat-1:before{content:""}.fa-arrows-retweet:before{content:""}.fa-arrows-rotate:before{content:""}.fa-arrows-rotate-reverse:before{content:""}.fa-arrows-spin:before{content:""}.fa-arrows-split-up-and-left:before{content:""}.fa-arrows-to-circle:before{content:""}.fa-arrows-to-dot:before{content:""}.fa-arrows-to-dotted-line:before{content:""}.fa-arrows-to-eye:before{content:""}.fa-arrows-to-line:before{content:""}.fa-arrows-turn-right:before{content:""}.fa-arrows-turn-to-dots:before{content:""}.fa-arrows-up-down:before{content:""}.fa-arrows-up-down-left-right:before{content:""}.fa-arrows-up-to-line:before{content:""}.fa-arrows-v:before{content:""}.fa-asl-interpreting:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asterisk:before{content:"*"}.fa-at:before{content:"@"}.fa-atlas:before{content:""}.fa-atom:before{content:""}.fa-atom-alt:before,.fa-atom-simple:before{content:""}.fa-audio-description:before{content:""}.fa-audio-description-slash:before{content:""}.fa-austral-sign:before{content:""}.fa-automobile:before{content:""}.fa-avocado:before{content:""}.fa-award:before{content:""}.fa-award-simple:before{content:""}.fa-axe:before{content:""}.fa-axe-battle:before{content:""}.fa-b:before{content:"B"}.fa-baby:before{content:""}.fa-baby-carriage:before{content:""}.fa-backpack:before{content:""}.fa-backspace:before{content:""}.fa-backward:before{content:""}.fa-backward-fast:before{content:""}.fa-backward-step:before{content:""}.fa-bacon:before{content:""}.fa-bacteria:before{content:""}.fa-bacterium:before{content:""}.fa-badge:before{content:""}.fa-badge-check:before{content:""}.fa-badge-dollar:before{content:""}.fa-badge-percent:before{content:""}.fa-badge-sheriff:before{content:""}.fa-badger-honey:before{content:""}.fa-badminton:before{content:""}.fa-bag-seedling:before{content:""}.fa-bag-shopping:before{content:""}.fa-bag-shopping-minus:before{content:""}.fa-bag-shopping-plus:before{content:""}.fa-bagel:before{content:""}.fa-bags-shopping:before{content:""}.fa-baguette:before{content:""}.fa-bahai:before{content:""}.fa-baht-sign:before{content:""}.fa-balance-scale:before{content:""}.fa-balance-scale-left:before{content:""}.fa-balance-scale-right:before{content:""}.fa-ball-pile:before{content:""}.fa-balloon:before{content:""}.fa-balloons:before{content:""}.fa-ballot:before{content:""}.fa-ballot-check:before{content:""}.fa-ban:before{content:""}.fa-ban-bug:before{content:""}.fa-ban-parking:before{content:""}.fa-ban-smoking:before{content:""}.fa-banana:before{content:""}.fa-band-aid:before,.fa-bandage:before{content:""}.fa-bangladeshi-taka-sign:before{content:""}.fa-banjo:before{content:""}.fa-bank:before{content:""}.fa-bar-chart:before{content:""}.fa-barcode:before{content:""}.fa-barcode-alt:before{content:""}.fa-barcode-read:before{content:""}.fa-barcode-scan:before{content:""}.fa-barn-silo:before{content:""}.fa-bars:before{content:""}.fa-bars-filter:before{content:""}.fa-bars-progress:before{content:""}.fa-bars-sort:before{content:""}.fa-bars-staggered:before{content:""}.fa-baseball:before,.fa-baseball-ball:before{content:""}.fa-baseball-bat-ball:before{content:""}.fa-basket-shopping:before{content:""}.fa-basket-shopping-minus:before{content:""}.fa-basket-shopping-plus:before{content:""}.fa-basket-shopping-simple:before{content:""}.fa-basketball:before,.fa-basketball-ball:before{content:""}.fa-basketball-hoop:before{content:""}.fa-bat:before{content:""}.fa-bath:before,.fa-bathtub:before{content:""}.fa-battery:before{content:""}.fa-battery-0:before{content:""}.fa-battery-1:before{content:""}.fa-battery-2:before{content:""}.fa-battery-3:before{content:""}.fa-battery-4:before{content:""}.fa-battery-5:before{content:""}.fa-battery-bolt:before{content:""}.fa-battery-car:before{content:""}.fa-battery-empty:before{content:""}.fa-battery-exclamation:before{content:""}.fa-battery-full:before{content:""}.fa-battery-half:before{content:""}.fa-battery-low:before{content:""}.fa-battery-quarter:before{content:""}.fa-battery-slash:before{content:""}.fa-battery-three-quarters:before{content:""}.fa-bed:before{content:""}.fa-bed-alt:before{content:""}.fa-bed-bunk:before{content:""}.fa-bed-empty:before{content:""}.fa-bed-front:before{content:""}.fa-bed-pulse:before{content:""}.fa-bee:before{content:""}.fa-beer:before{content:""}.fa-beer-foam:before,.fa-beer-mug:before{content:""}.fa-beer-mug-empty:before{content:""}.fa-bell:before{content:""}.fa-bell-concierge:before{content:""}.fa-bell-exclamation:before{content:""}.fa-bell-on:before{content:""}.fa-bell-plus:before{content:""}.fa-bell-ring:before{content:""}.fa-bell-school:before{content:""}.fa-bell-school-slash:before{content:""}.fa-bell-slash:before{content:""}.fa-bells:before{content:""}.fa-bench-tree:before{content:""}.fa-betamax:before{content:""}.fa-bezier-curve:before{content:""}.fa-bible:before{content:""}.fa-bicycle:before{content:""}.fa-biking:before{content:""}.fa-biking-mountain:before{content:""}.fa-billboard:before{content:""}.fa-bin-bottles:before{content:""}.fa-bin-bottles-recycle:before{content:""}.fa-bin-recycle:before{content:""}.fa-binary:before{content:""}.fa-binary-circle-check:before{content:""}.fa-binary-lock:before{content:""}.fa-binary-slash:before{content:""}.fa-binoculars:before{content:""}.fa-biohazard:before{content:""}.fa-bird:before{content:""}.fa-birthday-cake:before{content:""}.fa-bitcoin-sign:before{content:""}.fa-blackboard:before{content:""}.fa-blanket:before{content:""}.fa-blanket-fire:before{content:""}.fa-blender:before{content:""}.fa-blender-phone:before{content:""}.fa-blind:before{content:""}.fa-blinds:before{content:""}.fa-blinds-open:before{content:""}.fa-blinds-raised:before{content:""}.fa-block:before{content:""}.fa-block-brick:before{content:""}.fa-block-brick-fire:before{content:""}.fa-block-question:before{content:""}.fa-block-quote:before{content:""}.fa-blog:before{content:""}.fa-blueberries:before{content:""}.fa-bluetooth:before{content:""}.fa-bold:before{content:""}.fa-bolt:before{content:""}.fa-bolt-auto:before{content:""}.fa-bolt-lightning:before{content:""}.fa-bolt-slash:before{content:""}.fa-bomb:before{content:""}.fa-bone:before{content:""}.fa-bone-break:before{content:""}.fa-bong:before{content:""}.fa-book:before{content:""}.fa-book-alt:before{content:""}.fa-book-arrow-right:before{content:""}.fa-book-arrow-up:before{content:""}.fa-book-atlas:before{content:""}.fa-book-bible:before{content:""}.fa-book-blank:before{content:""}.fa-book-bookmark:before{content:""}.fa-book-circle:before{content:""}.fa-book-circle-arrow-right:before{content:""}.fa-book-circle-arrow-up:before{content:""}.fa-book-copy:before{content:""}.fa-book-dead:before{content:""}.fa-book-font:before{content:""}.fa-book-heart:before{content:""}.fa-book-journal-whills:before{content:""}.fa-book-law:before{content:""}.fa-book-medical:before{content:""}.fa-book-open:before{content:""}.fa-book-open-alt:before,.fa-book-open-cover:before{content:""}.fa-book-open-reader:before{content:""}.fa-book-quran:before{content:""}.fa-book-reader:before{content:""}.fa-book-section:before{content:""}.fa-book-skull:before{content:""}.fa-book-sparkles:before,.fa-book-spells:before{content:""}.fa-book-tanakh:before{content:""}.fa-book-user:before{content:""}.fa-bookmark:before{content:""}.fa-bookmark-circle:before{content:""}.fa-bookmark-slash:before{content:""}.fa-books:before{content:""}.fa-books-medical:before{content:""}.fa-boombox:before{content:""}.fa-boot:before{content:""}.fa-boot-heeled:before{content:""}.fa-booth-curtain:before{content:""}.fa-border-all:before{content:""}.fa-border-bottom:before{content:""}.fa-border-bottom-right:before{content:""}.fa-border-center-h:before{content:""}.fa-border-center-v:before{content:""}.fa-border-inner:before{content:""}.fa-border-left:before{content:""}.fa-border-none:before{content:""}.fa-border-outer:before{content:""}.fa-border-right:before{content:""}.fa-border-style:before{content:""}.fa-border-style-alt:before{content:""}.fa-border-top:before{content:""}.fa-border-top-left:before{content:""}.fa-bore-hole:before{content:""}.fa-bottle-baby:before{content:""}.fa-bottle-droplet:before{content:""}.fa-bottle-water:before{content:""}.fa-bow-arrow:before{content:""}.fa-bowl-chopsticks:before{content:""}.fa-bowl-chopsticks-noodles:before{content:""}.fa-bowl-food:before{content:""}.fa-bowl-hot:before{content:""}.fa-bowl-rice:before{content:""}.fa-bowl-salad:before{content:""}.fa-bowl-scoop:before{content:""}.fa-bowl-scoops:before{content:""}.fa-bowl-shaved-ice:before{content:""}.fa-bowl-soft-serve:before{content:""}.fa-bowl-spoon:before{content:""}.fa-bowling-ball:before{content:""}.fa-bowling-ball-pin:before{content:""}.fa-bowling-pins:before{content:""}.fa-box:before{content:""}.fa-box-alt:before{content:""}.fa-box-archive:before{content:""}.fa-box-ballot:before{content:""}.fa-box-check:before{content:""}.fa-box-circle-check:before{content:""}.fa-box-dollar:before{content:""}.fa-box-fragile:before{content:""}.fa-box-full:before{content:""}.fa-box-heart:before{content:""}.fa-box-open:before{content:""}.fa-box-open-full:before{content:""}.fa-box-taped:before{content:""}.fa-box-tissue:before{content:""}.fa-box-up:before{content:""}.fa-box-usd:before{content:""}.fa-boxes:before,.fa-boxes-alt:before{content:""}.fa-boxes-packing:before{content:""}.fa-boxes-stacked:before{content:""}.fa-boxing-glove:before{content:""}.fa-bracket:before{content:"["}.fa-bracket-curly:before,.fa-bracket-curly-left:before{content:"{"}.fa-bracket-curly-right:before{content:"}"}.fa-bracket-left:before{content:"["}.fa-bracket-round:before{content:"("}.fa-bracket-round-right:before{content:")"}.fa-bracket-square:before{content:"["}.fa-bracket-square-right:before{content:"]"}.fa-brackets:before{content:""}.fa-brackets-curly:before{content:""}.fa-brackets-round:before{content:""}.fa-brackets-square:before{content:""}.fa-braille:before{content:""}.fa-brain:before{content:""}.fa-brain-arrow-curved-right:before{content:""}.fa-brain-circuit:before{content:""}.fa-brake-warning:before{content:""}.fa-brazilian-real-sign:before{content:""}.fa-bread-loaf:before{content:""}.fa-bread-slice:before{content:""}.fa-bread-slice-butter:before{content:""}.fa-bridge:before{content:""}.fa-bridge-circle-check:before{content:""}.fa-bridge-circle-exclamation:before{content:""}.fa-bridge-circle-xmark:before{content:""}.fa-bridge-lock:before{content:""}.fa-bridge-suspension:before{content:""}.fa-bridge-water:before{content:""}.fa-briefcase:before{content:""}.fa-briefcase-arrow-right:before{content:""}.fa-briefcase-blank:before{content:""}.fa-briefcase-clock:before{content:""}.fa-briefcase-medical:before{content:""}.fa-brightness:before{content:""}.fa-brightness-low:before{content:""}.fa-bring-forward:before{content:""}.fa-bring-front:before{content:""}.fa-broadcast-tower:before{content:""}.fa-broccoli:before{content:""}.fa-broom:before{content:""}.fa-broom-ball:before{content:""}.fa-broom-wide:before{content:""}.fa-browser:before{content:""}.fa-browsers:before{content:""}.fa-brush:before{content:""}.fa-bucket:before{content:""}.fa-bug:before{content:""}.fa-bug-slash:before{content:""}.fa-bugs:before{content:""}.fa-building:before{content:""}.fa-building-circle-arrow-right:before{content:""}.fa-building-circle-check:before{content:""}.fa-building-circle-exclamation:before{content:""}.fa-building-circle-xmark:before{content:""}.fa-building-columns:before{content:""}.fa-building-flag:before{content:""}.fa-building-lock:before{content:""}.fa-building-magnifying-glass:before{content:""}.fa-building-memo:before{content:""}.fa-building-ngo:before{content:""}.fa-building-shield:before{content:""}.fa-building-un:before{content:""}.fa-building-user:before{content:""}.fa-building-wheat:before{content:""}.fa-buildings:before{content:""}.fa-bulldozer:before{content:""}.fa-bullhorn:before{content:""}.fa-bullseye:before{content:""}.fa-bullseye-arrow:before{content:""}.fa-bullseye-pointer:before{content:""}.fa-buoy:before{content:""}.fa-buoy-mooring:before{content:""}.fa-burger:before{content:""}.fa-burger-cheese:before{content:""}.fa-burger-fries:before{content:""}.fa-burger-glass:before{content:""}.fa-burger-lettuce:before{content:""}.fa-burger-soda:before{content:""}.fa-burn:before{content:""}.fa-burrito:before{content:""}.fa-burst:before{content:""}.fa-bus:before{content:""}.fa-bus-alt:before{content:""}.fa-bus-school:before{content:""}.fa-bus-simple:before{content:""}.fa-business-front:before{content:""}.fa-business-time:before{content:""}.fa-butter:before{content:""}.fa-c:before{content:"C"}.fa-cab:before{content:""}.fa-cabin:before{content:""}.fa-cabinet-filing:before{content:""}.fa-cable-car:before{content:""}.fa-cactus:before{content:""}.fa-caduceus:before{content:""}.fa-cake:before,.fa-cake-candles:before{content:""}.fa-cake-slice:before{content:""}.fa-calculator:before{content:""}.fa-calculator-alt:before,.fa-calculator-simple:before{content:""}.fa-calendar:before{content:""}.fa-calendar-alt:before{content:""}.fa-calendar-arrow-down:before{content:""}.fa-calendar-arrow-up:before{content:""}.fa-calendar-check:before{content:""}.fa-calendar-circle:before{content:""}.fa-calendar-circle-exclamation:before{content:""}.fa-calendar-circle-minus:before{content:""}.fa-calendar-circle-plus:before{content:""}.fa-calendar-circle-user:before{content:""}.fa-calendar-clock:before{content:""}.fa-calendar-day:before{content:""}.fa-calendar-days:before{content:""}.fa-calendar-download:before{content:""}.fa-calendar-edit:before{content:""}.fa-calendar-exclamation:before{content:""}.fa-calendar-heart:before{content:""}.fa-calendar-image:before{content:""}.fa-calendar-lines:before{content:""}.fa-calendar-lines-pen:before{content:""}.fa-calendar-minus:before{content:""}.fa-calendar-note:before{content:""}.fa-calendar-pen:before{content:""}.fa-calendar-plus:before{content:""}.fa-calendar-range:before{content:""}.fa-calendar-star:before{content:""}.fa-calendar-time:before{content:""}.fa-calendar-times:before{content:""}.fa-calendar-upload:before{content:""}.fa-calendar-users:before{content:""}.fa-calendar-week:before{content:""}.fa-calendar-xmark:before{content:""}.fa-calendars:before{content:""}.fa-camcorder:before{content:""}.fa-camera:before,.fa-camera-alt:before{content:""}.fa-camera-cctv:before{content:""}.fa-camera-circle:before{content:""}.fa-camera-home:before{content:""}.fa-camera-movie:before{content:""}.fa-camera-polaroid:before{content:""}.fa-camera-retro:before{content:""}.fa-camera-rotate:before{content:""}.fa-camera-security:before{content:""}.fa-camera-slash:before{content:""}.fa-camera-viewfinder:before{content:""}.fa-camera-web:before{content:""}.fa-camera-web-slash:before{content:""}.fa-campfire:before{content:""}.fa-campground:before{content:""}.fa-can-food:before{content:""}.fa-cancel:before{content:""}.fa-candle-holder:before{content:""}.fa-candy:before{content:""}.fa-candy-bar:before{content:""}.fa-candy-cane:before{content:""}.fa-candy-corn:before{content:""}.fa-cannabis:before{content:""}.fa-cannon:before{content:""}.fa-capsules:before{content:""}.fa-car:before{content:""}.fa-car-alt:before{content:""}.fa-car-battery:before{content:""}.fa-car-bolt:before{content:""}.fa-car-building:before{content:""}.fa-car-bump:before{content:""}.fa-car-burst:before{content:""}.fa-car-bus:before{content:""}.fa-car-circle-bolt:before{content:""}.fa-car-crash:before{content:""}.fa-car-garage:before{content:""}.fa-car-mechanic:before{content:""}.fa-car-mirrors:before{content:""}.fa-car-on:before{content:""}.fa-car-rear:before{content:""}.fa-car-side:before{content:""}.fa-car-side-bolt:before{content:""}.fa-car-tilt:before{content:""}.fa-car-tunnel:before{content:""}.fa-car-wash:before{content:""}.fa-car-wrench:before{content:""}.fa-caravan:before{content:""}.fa-caravan-alt:before,.fa-caravan-simple:before{content:""}.fa-card-club:before{content:""}.fa-card-diamond:before{content:""}.fa-card-heart:before{content:""}.fa-card-spade:before{content:""}.fa-cards:before{content:""}.fa-cards-blank:before{content:""}.fa-caret-circle-down:before{content:""}.fa-caret-circle-left:before{content:""}.fa-caret-circle-right:before{content:""}.fa-caret-circle-up:before{content:""}.fa-caret-down:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-caret-square-down:before{content:""}.fa-caret-square-left:before{content:""}.fa-caret-square-right:before{content:""}.fa-caret-square-up:before{content:""}.fa-caret-up:before{content:""}.fa-carriage-baby:before{content:""}.fa-carrot:before{content:""}.fa-cars:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-cart-arrow-up:before{content:""}.fa-cart-circle-arrow-down:before{content:""}.fa-cart-circle-arrow-up:before{content:""}.fa-cart-circle-check:before{content:""}.fa-cart-circle-exclamation:before{content:""}.fa-cart-circle-plus:before{content:""}.fa-cart-circle-xmark:before{content:""}.fa-cart-flatbed:before{content:""}.fa-cart-flatbed-boxes:before{content:""}.fa-cart-flatbed-empty:before{content:""}.fa-cart-flatbed-suitcase:before{content:""}.fa-cart-minus:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-shopping:before{content:""}.fa-cart-shopping-fast:before{content:""}.fa-cart-xmark:before{content:""}.fa-cash-register:before{content:""}.fa-cassette-betamax:before{content:""}.fa-cassette-tape:before{content:""}.fa-cassette-vhs:before{content:""}.fa-castle:before{content:""}.fa-cat:before{content:""}.fa-cat-space:before{content:""}.fa-cauldron:before{content:""}.fa-cctv:before{content:""}.fa-cedi-sign:before{content:""}.fa-cent-sign:before{content:""}.fa-certificate:before{content:""}.fa-chain:before{content:""}.fa-chain-broken:before{content:""}.fa-chain-horizontal:before{content:""}.fa-chain-horizontal-slash:before{content:""}.fa-chain-slash:before{content:""}.fa-chair:before{content:""}.fa-chair-office:before{content:""}.fa-chalkboard:before{content:""}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:""}.fa-champagne-glass:before{content:""}.fa-champagne-glasses:before{content:""}.fa-charging-station:before{content:""}.fa-chart-area:before{content:""}.fa-chart-bar:before{content:""}.fa-chart-bullet:before{content:""}.fa-chart-candlestick:before{content:""}.fa-chart-column:before{content:""}.fa-chart-gantt:before{content:""}.fa-chart-kanban:before{content:""}.fa-chart-line:before{content:""}.fa-chart-line-down:before{content:""}.fa-chart-line-up:before{content:""}.fa-chart-line-up-down:before{content:""}.fa-chart-mixed:before{content:""}.fa-chart-mixed-up-circle-currency:before{content:""}.fa-chart-mixed-up-circle-dollar:before{content:""}.fa-chart-network:before{content:""}.fa-chart-pie:before{content:""}.fa-chart-pie-alt:before,.fa-chart-pie-simple:before{content:""}.fa-chart-pie-simple-circle-currency:before{content:""}.fa-chart-pie-simple-circle-dollar:before{content:""}.fa-chart-pyramid:before{content:""}.fa-chart-radar:before{content:""}.fa-chart-scatter:before{content:""}.fa-chart-scatter-3d:before{content:""}.fa-chart-scatter-bubble:before{content:""}.fa-chart-simple:before{content:""}.fa-chart-simple-horizontal:before{content:""}.fa-chart-tree-map:before{content:""}.fa-chart-user:before{content:""}.fa-chart-waterfall:before{content:""}.fa-check:before{content:""}.fa-check-circle:before{content:""}.fa-check-double:before{content:""}.fa-check-square:before{content:""}.fa-check-to-slot:before{content:""}.fa-cheese:before{content:""}.fa-cheese-swiss:before{content:""}.fa-cheeseburger:before{content:""}.fa-cherries:before{content:""}.fa-chess:before{content:""}.fa-chess-bishop:before{content:""}.fa-chess-bishop-alt:before,.fa-chess-bishop-piece:before{content:""}.fa-chess-board:before{content:""}.fa-chess-clock:before{content:""}.fa-chess-clock-alt:before,.fa-chess-clock-flip:before{content:""}.fa-chess-king:before{content:""}.fa-chess-king-alt:before,.fa-chess-king-piece:before{content:""}.fa-chess-knight:before{content:""}.fa-chess-knight-alt:before,.fa-chess-knight-piece:before{content:""}.fa-chess-pawn:before{content:""}.fa-chess-pawn-alt:before,.fa-chess-pawn-piece:before{content:""}.fa-chess-queen:before{content:""}.fa-chess-queen-alt:before,.fa-chess-queen-piece:before{content:""}.fa-chess-rook:before{content:""}.fa-chess-rook-alt:before,.fa-chess-rook-piece:before{content:""}.fa-chestnut:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-double-down:before{content:""}.fa-chevron-double-left:before{content:""}.fa-chevron-double-right:before{content:""}.fa-chevron-double-up:before{content:""}.fa-chevron-down:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-chevron-square-down:before{content:""}.fa-chevron-square-left:before{content:""}.fa-chevron-square-right:before{content:""}.fa-chevron-square-up:before{content:""}.fa-chevron-up:before{content:""}.fa-chevrons-down:before{content:""}.fa-chevrons-left:before{content:""}.fa-chevrons-right:before{content:""}.fa-chevrons-up:before{content:""}.fa-chf-sign:before{content:""}.fa-child:before{content:""}.fa-child-combatant:before{content:""}.fa-child-dress:before{content:""}.fa-child-reaching:before{content:""}.fa-child-rifle:before{content:""}.fa-children:before{content:""}.fa-chimney:before{content:""}.fa-chocolate-bar:before{content:""}.fa-chopsticks:before{content:""}.fa-church:before{content:""}.fa-circle:before{content:""}.fa-circle-0:before{content:""}.fa-circle-1:before{content:""}.fa-circle-2:before{content:""}.fa-circle-3:before{content:""}.fa-circle-4:before{content:""}.fa-circle-5:before{content:""}.fa-circle-6:before{content:""}.fa-circle-7:before{content:""}.fa-circle-8:before{content:""}.fa-circle-9:before{content:""}.fa-circle-a:before{content:""}.fa-circle-ampersand:before{content:""}.fa-circle-arrow-down:before{content:""}.fa-circle-arrow-down-left:before{content:""}.fa-circle-arrow-down-right:before{content:""}.fa-circle-arrow-left:before{content:""}.fa-circle-arrow-right:before{content:""}.fa-circle-arrow-up:before{content:""}.fa-circle-arrow-up-left:before{content:""}.fa-circle-arrow-up-right:before{content:""}.fa-circle-b:before{content:""}.fa-circle-bolt:before{content:""}.fa-circle-book-open:before{content:""}.fa-circle-bookmark:before{content:""}.fa-circle-c:before{content:""}.fa-circle-calendar:before{content:""}.fa-circle-camera:before{content:""}.fa-circle-caret-down:before{content:""}.fa-circle-caret-left:before{content:""}.fa-circle-caret-right:before{content:""}.fa-circle-caret-up:before{content:""}.fa-circle-check:before{content:""}.fa-circle-chevron-down:before{content:""}.fa-circle-chevron-left:before{content:""}.fa-circle-chevron-right:before{content:""}.fa-circle-chevron-up:before{content:""}.fa-circle-d:before{content:""}.fa-circle-dashed:before{content:""}.fa-circle-divide:before{content:""}.fa-circle-dollar:before{content:""}.fa-circle-dollar-to-slot:before{content:""}.fa-circle-dot:before{content:""}.fa-circle-down:before{content:""}.fa-circle-down-left:before{content:""}.fa-circle-down-right:before{content:""}.fa-circle-e:before{content:""}.fa-circle-ellipsis:before{content:""}.fa-circle-ellipsis-vertical:before{content:""}.fa-circle-envelope:before{content:""}.fa-circle-euro:before{content:""}.fa-circle-exclamation:before{content:""}.fa-circle-exclamation-check:before{content:""}.fa-circle-f:before{content:""}.fa-circle-g:before{content:""}.fa-circle-gf:before{content:""}.fa-circle-h:before{content:""}.fa-circle-half:before{content:""}.fa-circle-half-stroke:before{content:""}.fa-circle-heart:before{content:""}.fa-circle-i:before{content:""}.fa-circle-info:before{content:""}.fa-circle-j:before{content:""}.fa-circle-k:before{content:""}.fa-circle-l:before{content:""}.fa-circle-left:before{content:""}.fa-circle-location-arrow:before{content:""}.fa-circle-m:before{content:""}.fa-circle-microphone:before{content:""}.fa-circle-microphone-lines:before{content:""}.fa-circle-minus:before{content:""}.fa-circle-n:before{content:""}.fa-circle-nodes:before{content:""}.fa-circle-notch:before{content:""}.fa-circle-o:before{content:""}.fa-circle-p:before{content:""}.fa-circle-parking:before{content:""}.fa-circle-pause:before{content:""}.fa-circle-phone:before{content:""}.fa-circle-phone-flip:before{content:""}.fa-circle-phone-hangup:before{content:""}.fa-circle-play:before{content:""}.fa-circle-plus:before{content:""}.fa-circle-q:before{content:""}.fa-circle-quarter:before{content:""}.fa-circle-quarter-stroke:before{content:""}.fa-circle-quarters:before{content:""}.fa-circle-question:before{content:""}.fa-circle-r:before{content:""}.fa-circle-radiation:before{content:""}.fa-circle-right:before{content:""}.fa-circle-s:before{content:""}.fa-circle-small:before{content:""}.fa-circle-sort:before{content:""}.fa-circle-sort-down:before{content:""}.fa-circle-sort-up:before{content:""}.fa-circle-star:before{content:""}.fa-circle-sterling:before{content:""}.fa-circle-stop:before{content:""}.fa-circle-t:before{content:""}.fa-circle-three-quarters:before{content:""}.fa-circle-three-quarters-stroke:before{content:""}.fa-circle-trash:before{content:""}.fa-circle-u:before{content:""}.fa-circle-up:before{content:""}.fa-circle-up-left:before{content:""}.fa-circle-up-right:before{content:""}.fa-circle-user:before{content:""}.fa-circle-v:before{content:""}.fa-circle-video:before{content:""}.fa-circle-w:before{content:""}.fa-circle-waveform-lines:before{content:""}.fa-circle-wifi:before{content:""}.fa-circle-wifi-circle-wifi:before,.fa-circle-wifi-group:before{content:""}.fa-circle-x:before{content:""}.fa-circle-xmark:before{content:""}.fa-circle-y:before{content:""}.fa-circle-yen:before{content:""}.fa-circle-z:before{content:""}.fa-circles-overlap:before{content:""}.fa-citrus:before{content:""}.fa-citrus-slice:before{content:""}.fa-city:before{content:""}.fa-clapperboard:before{content:""}.fa-clapperboard-play:before{content:""}.fa-clarinet:before{content:""}.fa-claw-marks:before{content:""}.fa-clinic-medical:before{content:""}.fa-clipboard:before{content:""}.fa-clipboard-check:before{content:""}.fa-clipboard-list:before{content:""}.fa-clipboard-list-check:before{content:""}.fa-clipboard-medical:before{content:""}.fa-clipboard-prescription:before{content:""}.fa-clipboard-question:before{content:""}.fa-clipboard-user:before{content:""}.fa-clock:before{content:""}.fa-clock-desk:before{content:""}.fa-clock-eight:before{content:""}.fa-clock-eight-thirty:before{content:""}.fa-clock-eleven:before{content:""}.fa-clock-eleven-thirty:before{content:""}.fa-clock-five:before{content:""}.fa-clock-five-thirty:before{content:""}.fa-clock-four:before{content:""}.fa-clock-four-thirty:before{content:""}.fa-clock-nine:before{content:""}.fa-clock-nine-thirty:before{content:""}.fa-clock-one:before{content:""}.fa-clock-one-thirty:before{content:""}.fa-clock-rotate-left:before{content:""}.fa-clock-seven:before{content:""}.fa-clock-seven-thirty:before{content:""}.fa-clock-six:before{content:""}.fa-clock-six-thirty:before{content:""}.fa-clock-ten:before{content:""}.fa-clock-ten-thirty:before{content:""}.fa-clock-three:before{content:""}.fa-clock-three-thirty:before{content:""}.fa-clock-twelve:before{content:""}.fa-clock-twelve-thirty:before{content:""}.fa-clock-two:before{content:""}.fa-clock-two-thirty:before{content:""}.fa-clone:before{content:""}.fa-close:before{content:""}.fa-closed-captioning:before{content:""}.fa-closed-captioning-slash:before{content:""}.fa-clothes-hanger:before{content:""}.fa-cloud:before{content:""}.fa-cloud-arrow-down:before{content:""}.fa-cloud-arrow-up:before{content:""}.fa-cloud-binary:before{content:""}.fa-cloud-bolt:before{content:""}.fa-cloud-bolt-moon:before{content:""}.fa-cloud-bolt-sun:before{content:""}.fa-cloud-check:before{content:""}.fa-cloud-download:before,.fa-cloud-download-alt:before{content:""}.fa-cloud-drizzle:before{content:""}.fa-cloud-exclamation:before{content:""}.fa-cloud-fog:before{content:""}.fa-cloud-hail:before{content:""}.fa-cloud-hail-mixed:before{content:""}.fa-cloud-meatball:before{content:""}.fa-cloud-minus:before{content:""}.fa-cloud-moon:before{content:""}.fa-cloud-moon-rain:before{content:""}.fa-cloud-music:before{content:""}.fa-cloud-plus:before{content:""}.fa-cloud-question:before{content:""}.fa-cloud-rain:before{content:""}.fa-cloud-rainbow:before{content:""}.fa-cloud-showers:before{content:""}.fa-cloud-showers-heavy:before{content:""}.fa-cloud-showers-water:before{content:""}.fa-cloud-slash:before{content:""}.fa-cloud-sleet:before{content:""}.fa-cloud-snow:before{content:""}.fa-cloud-sun:before{content:""}.fa-cloud-sun-rain:before{content:""}.fa-cloud-upload:before,.fa-cloud-upload-alt:before{content:""}.fa-cloud-word:before{content:""}.fa-cloud-xmark:before{content:""}.fa-clouds:before{content:""}.fa-clouds-moon:before{content:""}.fa-clouds-sun:before{content:""}.fa-clover:before{content:""}.fa-club:before{content:""}.fa-cny:before{content:""}.fa-cocktail:before{content:""}.fa-coconut:before{content:""}.fa-code:before{content:""}.fa-code-branch:before{content:""}.fa-code-commit:before{content:""}.fa-code-compare:before{content:""}.fa-code-fork:before{content:""}.fa-code-merge:before{content:""}.fa-code-pull-request:before{content:""}.fa-code-pull-request-closed:before{content:""}.fa-code-pull-request-draft:before{content:""}.fa-code-simple:before{content:""}.fa-coffee:before{content:""}.fa-coffee-bean:before{content:""}.fa-coffee-beans:before{content:""}.fa-coffee-pot:before{content:""}.fa-coffee-togo:before{content:""}.fa-coffin:before{content:""}.fa-coffin-cross:before{content:""}.fa-cog:before{content:""}.fa-cogs:before{content:""}.fa-coin:before{content:""}.fa-coin-blank:before{content:""}.fa-coin-front:before{content:""}.fa-coin-vertical:before{content:""}.fa-coins:before{content:""}.fa-colon:before{content:":"}.fa-colon-sign:before{content:""}.fa-columns:before{content:""}.fa-columns-3:before{content:""}.fa-comet:before{content:""}.fa-comma:before{content:","}.fa-command:before{content:""}.fa-comment:before{content:""}.fa-comment-alt:before{content:""}.fa-comment-alt-arrow-down:before{content:""}.fa-comment-alt-arrow-up:before{content:""}.fa-comment-alt-captions:before{content:""}.fa-comment-alt-check:before{content:""}.fa-comment-alt-dollar:before{content:""}.fa-comment-alt-dots:before{content:""}.fa-comment-alt-edit:before{content:""}.fa-comment-alt-exclamation:before{content:""}.fa-comment-alt-image:before{content:""}.fa-comment-alt-lines:before{content:""}.fa-comment-alt-medical:before{content:""}.fa-comment-alt-minus:before{content:""}.fa-comment-alt-music:before{content:""}.fa-comment-alt-plus:before{content:""}.fa-comment-alt-quote:before{content:""}.fa-comment-alt-slash:before{content:""}.fa-comment-alt-smile:before{content:""}.fa-comment-alt-text:before{content:""}.fa-comment-alt-times:before{content:""}.fa-comment-arrow-down:before{content:""}.fa-comment-arrow-up:before{content:""}.fa-comment-arrow-up-right:before{content:""}.fa-comment-captions:before{content:""}.fa-comment-check:before{content:""}.fa-comment-code:before{content:""}.fa-comment-dollar:before{content:""}.fa-comment-dots:before{content:""}.fa-comment-edit:before{content:""}.fa-comment-exclamation:before{content:""}.fa-comment-heart:before{content:""}.fa-comment-image:before{content:""}.fa-comment-lines:before{content:""}.fa-comment-medical:before{content:""}.fa-comment-middle:before{content:""}.fa-comment-middle-alt:before{content:""}.fa-comment-middle-top:before{content:""}.fa-comment-middle-top-alt:before{content:""}.fa-comment-minus:before{content:""}.fa-comment-music:before{content:""}.fa-comment-pen:before{content:""}.fa-comment-plus:before{content:""}.fa-comment-question:before{content:""}.fa-comment-quote:before{content:""}.fa-comment-slash:before{content:""}.fa-comment-smile:before{content:""}.fa-comment-sms:before{content:""}.fa-comment-text:before{content:""}.fa-comment-times:before,.fa-comment-xmark:before{content:""}.fa-commenting:before{content:""}.fa-comments:before{content:""}.fa-comments-alt:before{content:""}.fa-comments-alt-dollar:before{content:""}.fa-comments-dollar:before{content:""}.fa-comments-question:before{content:""}.fa-comments-question-check:before{content:""}.fa-compact-disc:before{content:""}.fa-compass:before{content:""}.fa-compass-drafting:before{content:""}.fa-compass-slash:before{content:""}.fa-compress:before{content:""}.fa-compress-alt:before{content:""}.fa-compress-arrows:before{content:""}.fa-compress-arrows-alt:before{content:""}.fa-compress-wide:before{content:""}.fa-computer:before{content:""}.fa-computer-classic:before{content:""}.fa-computer-mouse:before{content:""}.fa-computer-mouse-scrollwheel:before{content:""}.fa-computer-speaker:before{content:""}.fa-concierge-bell:before{content:""}.fa-construction:before{content:""}.fa-contact-book:before{content:""}.fa-contact-card:before{content:""}.fa-container-storage:before{content:""}.fa-conveyor-belt:before{content:""}.fa-conveyor-belt-alt:before{content:""}.fa-conveyor-belt-arm:before{content:""}.fa-conveyor-belt-boxes:before{content:""}.fa-conveyor-belt-empty:before{content:""}.fa-cookie:before{content:""}.fa-cookie-bite:before{content:""}.fa-copy:before{content:""}.fa-copyright:before{content:""}.fa-corn:before{content:""}.fa-corner:before{content:""}.fa-couch:before{content:""}.fa-couch-small:before{content:""}.fa-court-sport:before{content:""}.fa-cow:before{content:""}.fa-cowbell:before{content:""}.fa-cowbell-circle-plus:before,.fa-cowbell-more:before{content:""}.fa-crab:before{content:""}.fa-crate-apple:before{content:""}.fa-crate-empty:before{content:""}.fa-credit-card:before,.fa-credit-card-alt:before{content:""}.fa-credit-card-blank:before{content:""}.fa-credit-card-front:before{content:""}.fa-creemee:before{content:""}.fa-cricket:before,.fa-cricket-bat-ball:before{content:""}.fa-croissant:before{content:""}.fa-crop:before{content:""}.fa-crop-alt:before,.fa-crop-simple:before{content:""}.fa-cross:before{content:""}.fa-crosshairs:before{content:""}.fa-crosshairs-simple:before{content:""}.fa-crow:before{content:""}.fa-crown:before{content:""}.fa-crutch:before{content:""}.fa-crutches:before{content:""}.fa-cruzeiro-sign:before{content:""}.fa-crystal-ball:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-cubes-stacked:before{content:""}.fa-cucumber:before{content:""}.fa-cup-straw:before{content:""}.fa-cup-straw-swoosh:before{content:""}.fa-cup-togo:before{content:""}.fa-cupcake:before{content:""}.fa-curling:before,.fa-curling-stone:before{content:""}.fa-custard:before{content:""}.fa-cut:before{content:""}.fa-cutlery:before{content:""}.fa-d:before{content:"D"}.fa-dagger:before{content:""}.fa-dash:before{content:""}.fa-dashboard:before{content:""}.fa-database:before{content:""}.fa-deaf:before,.fa-deafness:before{content:""}.fa-debug:before{content:""}.fa-dedent:before{content:""}.fa-deer:before{content:""}.fa-deer-rudolph:before{content:""}.fa-delete-left:before{content:""}.fa-delete-right:before{content:""}.fa-democrat:before{content:""}.fa-desktop:before,.fa-desktop-alt:before{content:""}.fa-desktop-arrow-down:before{content:""}.fa-desktop-code:before{content:""}.fa-desktop-medical:before{content:""}.fa-desktop-slash:before{content:""}.fa-dewpoint:before{content:""}.fa-dharmachakra:before{content:""}.fa-diagnoses:before{content:""}.fa-diagram-cells:before{content:""}.fa-diagram-lean-canvas:before{content:""}.fa-diagram-nested:before{content:""}.fa-diagram-next:before{content:""}.fa-diagram-predecessor:before{content:""}.fa-diagram-previous:before{content:""}.fa-diagram-project:before{content:""}.fa-diagram-sankey:before{content:""}.fa-diagram-subtask:before{content:""}.fa-diagram-successor:before{content:""}.fa-diagram-venn:before{content:""}.fa-dial:before{content:""}.fa-dial-high:before{content:""}.fa-dial-low:before{content:""}.fa-dial-max:before{content:""}.fa-dial-med:before{content:""}.fa-dial-med-high:before{content:""}.fa-dial-med-low:before{content:""}.fa-dial-min:before{content:""}.fa-dial-off:before{content:""}.fa-diamond:before{content:""}.fa-diamond-exclamation:before{content:""}.fa-diamond-half:before{content:""}.fa-diamond-half-stroke:before{content:""}.fa-diamond-turn-right:before{content:""}.fa-diamonds-4:before{content:""}.fa-dice:before{content:""}.fa-dice-d10:before{content:""}.fa-dice-d12:before{content:""}.fa-dice-d20:before{content:""}.fa-dice-d4:before{content:""}.fa-dice-d6:before{content:""}.fa-dice-d8:before{content:""}.fa-dice-five:before{content:""}.fa-dice-four:before{content:""}.fa-dice-one:before{content:""}.fa-dice-six:before{content:""}.fa-dice-three:before{content:""}.fa-dice-two:before{content:""}.fa-digging:before{content:""}.fa-digital-tachograph:before{content:""}.fa-dinosaur:before{content:""}.fa-diploma:before{content:""}.fa-directions:before{content:""}.fa-disc-drive:before{content:""}.fa-disease:before{content:""}.fa-display:before{content:""}.fa-display-arrow-down:before{content:""}.fa-display-chart-up:before{content:""}.fa-display-chart-up-circle-currency:before{content:""}.fa-display-chart-up-circle-dollar:before{content:""}.fa-display-code:before{content:""}.fa-display-medical:before{content:""}.fa-display-slash:before{content:""}.fa-distribute-spacing-horizontal:before{content:""}.fa-distribute-spacing-vertical:before{content:""}.fa-ditto:before{content:"\""}.fa-divide:before{content:""}.fa-dizzy:before{content:""}.fa-dna:before{content:""}.fa-do-not-enter:before{content:""}.fa-dog:before{content:""}.fa-dog-leashed:before{content:""}.fa-dollar:before{content:"$"}.fa-dollar-circle:before{content:""}.fa-dollar-sign:before{content:"$"}.fa-dollar-square:before{content:""}.fa-dolly:before,.fa-dolly-box:before{content:""}.fa-dolly-empty:before{content:""}.fa-dolly-flatbed:before{content:""}.fa-dolly-flatbed-alt:before{content:""}.fa-dolly-flatbed-empty:before{content:""}.fa-dolphin:before{content:""}.fa-donate:before{content:""}.fa-dong-sign:before{content:""}.fa-donut:before{content:""}.fa-door-closed:before{content:""}.fa-door-open:before{content:""}.fa-dot-circle:before{content:""}.fa-doughnut:before{content:""}.fa-dove:before{content:""}.fa-down:before{content:""}.fa-down-from-bracket:before{content:""}.fa-down-from-dotted-line:before{content:""}.fa-down-from-line:before{content:""}.fa-down-left:before{content:""}.fa-down-left-and-up-right-to-center:before{content:""}.fa-down-long:before{content:""}.fa-down-right:before{content:""}.fa-down-to-bracket:before{content:""}.fa-down-to-dotted-line:before{content:""}.fa-down-to-line:before{content:""}.fa-download:before{content:""}.fa-drafting-compass:before{content:""}.fa-dragon:before{content:""}.fa-draw-circle:before{content:""}.fa-draw-polygon:before{content:""}.fa-draw-square:before{content:""}.fa-dreidel:before{content:""}.fa-drivers-license:before{content:""}.fa-drone:before{content:""}.fa-drone-alt:before,.fa-drone-front:before{content:""}.fa-droplet:before{content:""}.fa-droplet-degree:before{content:""}.fa-droplet-percent:before{content:""}.fa-droplet-slash:before{content:""}.fa-drum:before{content:""}.fa-drum-steelpan:before{content:""}.fa-drumstick:before{content:""}.fa-drumstick-bite:before{content:""}.fa-dryer:before{content:""}.fa-dryer-alt:before,.fa-dryer-heat:before{content:""}.fa-duck:before{content:""}.fa-dumbbell:before{content:""}.fa-dumpster:before{content:""}.fa-dumpster-fire:before{content:""}.fa-dungeon:before{content:""}.fa-e:before{content:"E"}.fa-ear:before{content:""}.fa-ear-deaf:before{content:""}.fa-ear-listen:before{content:""}.fa-ear-muffs:before{content:""}.fa-earth:before{content:""}.fa-earth-africa:before{content:""}.fa-earth-america:before,.fa-earth-americas:before{content:""}.fa-earth-asia:before{content:""}.fa-earth-europe:before{content:""}.fa-earth-oceania:before{content:""}.fa-eclipse:before{content:""}.fa-eclipse-alt:before{content:""}.fa-edit:before{content:""}.fa-egg:before{content:""}.fa-egg-fried:before{content:""}.fa-eggplant:before{content:""}.fa-eject:before{content:""}.fa-elephant:before{content:""}.fa-elevator:before{content:""}.fa-ellipsis:before,.fa-ellipsis-h:before{content:""}.fa-ellipsis-h-alt:before,.fa-ellipsis-stroke:before{content:""}.fa-ellipsis-stroke-vertical:before{content:""}.fa-ellipsis-v:before{content:""}.fa-ellipsis-v-alt:before{content:""}.fa-ellipsis-vertical:before{content:""}.fa-empty-set:before{content:""}.fa-engine:before{content:""}.fa-engine-exclamation:before,.fa-engine-warning:before{content:""}.fa-envelope:before{content:""}.fa-envelope-badge:before{content:""}.fa-envelope-circle:before{content:""}.fa-envelope-circle-check:before{content:""}.fa-envelope-dot:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-dollar:before{content:""}.fa-envelope-open-text:before{content:""}.fa-envelope-square:before{content:""}.fa-envelopes:before{content:""}.fa-envelopes-bulk:before{content:""}.fa-equals:before{content:"="}.fa-eraser:before{content:""}.fa-escalator:before{content:""}.fa-ethernet:before{content:""}.fa-eur:before,.fa-euro:before,.fa-euro-sign:before{content:""}.fa-excavator:before{content:""}.fa-exchange:before{content:""}.fa-exchange-alt:before{content:""}.fa-exclamation:before{content:"!"}.fa-exclamation-circle:before{content:""}.fa-exclamation-square:before{content:""}.fa-exclamation-triangle:before{content:""}.fa-expand:before{content:""}.fa-expand-alt:before{content:""}.fa-expand-arrows:before{content:""}.fa-expand-arrows-alt:before{content:""}.fa-expand-wide:before{content:""}.fa-exploding-head:before{content:""}.fa-explosion:before{content:""}.fa-external-link:before{content:""}.fa-external-link-alt:before{content:""}.fa-external-link-square:before{content:""}.fa-external-link-square-alt:before{content:""}.fa-eye:before{content:""}.fa-eye-dropper:before,.fa-eye-dropper-empty:before{content:""}.fa-eye-dropper-full:before{content:""}.fa-eye-dropper-half:before{content:""}.fa-eye-evil:before{content:""}.fa-eye-low-vision:before{content:""}.fa-eye-slash:before{content:""}.fa-eyedropper:before{content:""}.fa-eyes:before{content:""}.fa-f:before{content:"F"}.fa-face-angry:before{content:""}.fa-face-angry-horns:before{content:""}.fa-face-anguished:before{content:""}.fa-face-anxious-sweat:before{content:""}.fa-face-astonished:before{content:""}.fa-face-awesome:before{content:""}.fa-face-beam-hand-over-mouth:before{content:""}.fa-face-clouds:before{content:""}.fa-face-confounded:before{content:""}.fa-face-confused:before{content:""}.fa-face-cowboy-hat:before{content:""}.fa-face-diagonal-mouth:before{content:""}.fa-face-disappointed:before{content:""}.fa-face-disguise:before{content:""}.fa-face-dizzy:before{content:""}.fa-face-dotted:before{content:""}.fa-face-downcast-sweat:before{content:""}.fa-face-drooling:before{content:""}.fa-face-exhaling:before{content:""}.fa-face-explode:before{content:""}.fa-face-expressionless:before{content:""}.fa-face-eyes-xmarks:before{content:""}.fa-face-fearful:before{content:""}.fa-face-flushed:before{content:""}.fa-face-frown:before{content:""}.fa-face-frown-open:before{content:""}.fa-face-frown-slight:before{content:""}.fa-face-glasses:before{content:""}.fa-face-grimace:before{content:""}.fa-face-grin:before{content:""}.fa-face-grin-beam:before{content:""}.fa-face-grin-beam-sweat:before{content:""}.fa-face-grin-hearts:before{content:""}.fa-face-grin-squint:before{content:""}.fa-face-grin-squint-tears:before{content:""}.fa-face-grin-stars:before{content:""}.fa-face-grin-tears:before{content:""}.fa-face-grin-tongue:before{content:""}.fa-face-grin-tongue-squint:before{content:""}.fa-face-grin-tongue-wink:before{content:""}.fa-face-grin-wide:before{content:""}.fa-face-grin-wink:before{content:""}.fa-face-hand-over-mouth:before{content:""}.fa-face-hand-peeking:before{content:""}.fa-face-hand-yawn:before{content:""}.fa-face-head-bandage:before{content:""}.fa-face-holding-back-tears:before{content:""}.fa-face-hushed:before{content:""}.fa-face-icicles:before{content:""}.fa-face-kiss:before{content:""}.fa-face-kiss-beam:before{content:""}.fa-face-kiss-closed-eyes:before{content:""}.fa-face-kiss-wink-heart:before{content:""}.fa-face-laugh:before{content:""}.fa-face-laugh-beam:before{content:""}.fa-face-laugh-squint:before{content:""}.fa-face-laugh-wink:before{content:""}.fa-face-lying:before{content:""}.fa-face-mask:before{content:""}.fa-face-meh:before{content:""}.fa-face-meh-blank:before{content:""}.fa-face-melting:before{content:""}.fa-face-monocle:before{content:""}.fa-face-nauseated:before{content:""}.fa-face-nose-steam:before{content:""}.fa-face-party:before{content:""}.fa-face-pensive:before{content:""}.fa-face-persevering:before{content:""}.fa-face-pleading:before{content:""}.fa-face-pouting:before{content:""}.fa-face-raised-eyebrow:before{content:""}.fa-face-relieved:before{content:""}.fa-face-rolling-eyes:before{content:""}.fa-face-sad-cry:before{content:""}.fa-face-sad-sweat:before{content:""}.fa-face-sad-tear:before{content:""}.fa-face-saluting:before{content:""}.fa-face-scream:before{content:""}.fa-face-shush:before{content:""}.fa-face-sleeping:before{content:""}.fa-face-sleepy:before{content:""}.fa-face-smile:before{content:""}.fa-face-smile-beam:before{content:""}.fa-face-smile-halo:before{content:""}.fa-face-smile-hearts:before{content:""}.fa-face-smile-horns:before{content:""}.fa-face-smile-plus:before{content:""}.fa-face-smile-relaxed:before{content:""}.fa-face-smile-tear:before{content:""}.fa-face-smile-tongue:before{content:""}.fa-face-smile-upside-down:before{content:""}.fa-face-smile-wink:before{content:""}.fa-face-smiling-hands:before{content:""}.fa-face-smirking:before{content:""}.fa-face-spiral-eyes:before{content:""}.fa-face-sunglasses:before{content:""}.fa-face-surprise:before{content:""}.fa-face-swear:before{content:""}.fa-face-thermometer:before{content:""}.fa-face-thinking:before{content:""}.fa-face-tired:before{content:""}.fa-face-tissue:before{content:""}.fa-face-tongue-money:before{content:""}.fa-face-tongue-sweat:before{content:""}.fa-face-unamused:before{content:""}.fa-face-viewfinder:before{content:""}.fa-face-vomit:before{content:""}.fa-face-weary:before{content:""}.fa-face-woozy:before{content:""}.fa-face-worried:before{content:""}.fa-face-zany:before{content:""}.fa-face-zipper:before{content:""}.fa-falafel:before{content:""}.fa-family:before{content:""}.fa-family-dress:before{content:""}.fa-family-pants:before{content:""}.fa-fan:before{content:""}.fa-fan-table:before{content:""}.fa-farm:before{content:""}.fa-fast-backward:before{content:""}.fa-fast-forward:before{content:""}.fa-faucet:before{content:""}.fa-faucet-drip:before{content:""}.fa-fax:before{content:""}.fa-feather:before{content:""}.fa-feather-alt:before,.fa-feather-pointed:before{content:""}.fa-feed:before{content:""}.fa-female:before{content:""}.fa-fence:before{content:""}.fa-ferris-wheel:before{content:""}.fa-ferry:before{content:""}.fa-field-hockey:before,.fa-field-hockey-stick-ball:before{content:""}.fa-fighter-jet:before{content:""}.fa-file:before{content:""}.fa-file-alt:before{content:""}.fa-file-archive:before{content:""}.fa-file-arrow-down:before{content:""}.fa-file-arrow-up:before{content:""}.fa-file-audio:before{content:""}.fa-file-award:before{content:""}.fa-file-binary:before{content:""}.fa-file-cad:before{content:""}.fa-file-caret-down:before{content:""}.fa-file-caret-up:before{content:""}.fa-file-certificate:before{content:""}.fa-file-chart-column:before,.fa-file-chart-line:before{content:""}.fa-file-chart-pie:before{content:""}.fa-file-check:before{content:""}.fa-file-circle-check:before{content:""}.fa-file-circle-exclamation:before{content:""}.fa-file-circle-info:before{content:""}.fa-file-circle-minus:before{content:""}.fa-file-circle-plus:before{content:""}.fa-file-circle-question:before{content:""}.fa-file-circle-xmark:before{content:""}.fa-file-clipboard:before{content:""}.fa-file-code:before{content:""}.fa-file-contract:before{content:""}.fa-file-csv:before{content:""}.fa-file-dashed-line:before{content:""}.fa-file-doc:before{content:""}.fa-file-download:before{content:""}.fa-file-edit:before{content:""}.fa-file-eps:before{content:""}.fa-file-excel:before{content:""}.fa-file-exclamation:before{content:""}.fa-file-export:before{content:""}.fa-file-gif:before{content:""}.fa-file-heart:before{content:""}.fa-file-image:before{content:""}.fa-file-import:before{content:""}.fa-file-invoice:before{content:""}.fa-file-invoice-dollar:before{content:""}.fa-file-jpg:before{content:""}.fa-file-lines:before{content:""}.fa-file-lock:before{content:""}.fa-file-magnifying-glass:before{content:""}.fa-file-medical:before{content:""}.fa-file-medical-alt:before{content:""}.fa-file-minus:before{content:""}.fa-file-mov:before{content:""}.fa-file-mp3:before{content:""}.fa-file-mp4:before{content:""}.fa-file-music:before{content:""}.fa-file-pdf:before{content:""}.fa-file-pen:before{content:""}.fa-file-plus:before{content:""}.fa-file-plus-minus:before{content:""}.fa-file-png:before{content:""}.fa-file-powerpoint:before{content:""}.fa-file-ppt:before{content:""}.fa-file-prescription:before{content:""}.fa-file-search:before{content:""}.fa-file-shield:before{content:""}.fa-file-signature:before{content:""}.fa-file-slash:before{content:""}.fa-file-spreadsheet:before{content:""}.fa-file-svg:before{content:""}.fa-file-text:before{content:""}.fa-file-times:before{content:""}.fa-file-upload:before{content:""}.fa-file-user:before{content:""}.fa-file-vector:before{content:""}.fa-file-video:before{content:""}.fa-file-waveform:before{content:""}.fa-file-word:before{content:""}.fa-file-xls:before{content:""}.fa-file-xmark:before{content:""}.fa-file-xml:before{content:""}.fa-file-zip:before{content:""}.fa-file-zipper:before{content:""}.fa-files:before{content:""}.fa-files-medical:before{content:""}.fa-fill:before{content:""}.fa-fill-drip:before{content:""}.fa-film:before{content:""}.fa-film-alt:before{content:""}.fa-film-canister:before,.fa-film-cannister:before{content:""}.fa-film-simple:before{content:""}.fa-film-slash:before{content:""}.fa-films:before{content:""}.fa-filter:before{content:""}.fa-filter-circle-dollar:before{content:""}.fa-filter-circle-xmark:before{content:""}.fa-filter-list:before{content:""}.fa-filter-slash:before{content:""}.fa-filters:before{content:""}.fa-fingerprint:before{content:""}.fa-fire:before{content:""}.fa-fire-alt:before{content:""}.fa-fire-burner:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-fire-flame:before{content:""}.fa-fire-flame-curved:before{content:""}.fa-fire-flame-simple:before{content:""}.fa-fire-hydrant:before{content:""}.fa-fire-smoke:before{content:""}.fa-fireplace:before{content:""}.fa-firewall:before{content:""}.fa-first-aid:before{content:""}.fa-fish:before{content:""}.fa-fish-bones:before{content:""}.fa-fish-cooked:before{content:""}.fa-fish-fins:before{content:""}.fa-fishing-rod:before{content:""}.fa-fist-raised:before{content:""}.fa-flag:before{content:""}.fa-flag-alt:before{content:""}.fa-flag-checkered:before{content:""}.fa-flag-pennant:before{content:""}.fa-flag-swallowtail:before{content:""}.fa-flag-usa:before{content:""}.fa-flame:before{content:""}.fa-flashlight:before{content:""}.fa-flask:before{content:""}.fa-flask-gear:before{content:""}.fa-flask-poison:before{content:""}.fa-flask-potion:before{content:""}.fa-flask-round-poison:before{content:""}.fa-flask-round-potion:before{content:""}.fa-flask-vial:before{content:""}.fa-flatbread:before{content:""}.fa-flatbread-stuffed:before{content:""}.fa-floppy-disk:before{content:""}.fa-floppy-disk-circle-arrow-right:before{content:""}.fa-floppy-disk-circle-xmark:before{content:""}.fa-floppy-disk-pen:before{content:""}.fa-floppy-disk-times:before{content:""}.fa-floppy-disks:before{content:""}.fa-florin-sign:before{content:""}.fa-flower:before{content:""}.fa-flower-daffodil:before{content:""}.fa-flower-tulip:before{content:""}.fa-flushed:before{content:""}.fa-flute:before{content:""}.fa-flux-capacitor:before{content:""}.fa-flying-disc:before{content:""}.fa-fog:before{content:""}.fa-folder:before{content:""}.fa-folder-arrow-down:before{content:""}.fa-folder-arrow-up:before{content:""}.fa-folder-blank:before{content:""}.fa-folder-bookmark:before{content:""}.fa-folder-check:before{content:""}.fa-folder-closed:before{content:""}.fa-folder-cog:before{content:""}.fa-folder-download:before{content:""}.fa-folder-gear:before{content:""}.fa-folder-grid:before{content:""}.fa-folder-heart:before{content:""}.fa-folder-image:before{content:""}.fa-folder-magnifying-glass:before{content:""}.fa-folder-medical:before{content:""}.fa-folder-minus:before{content:""}.fa-folder-music:before{content:""}.fa-folder-open:before{content:""}.fa-folder-plus:before{content:""}.fa-folder-search:before{content:""}.fa-folder-times:before{content:""}.fa-folder-tree:before{content:""}.fa-folder-upload:before{content:""}.fa-folder-user:before{content:""}.fa-folder-xmark:before{content:""}.fa-folders:before{content:""}.fa-fondue-pot:before{content:""}.fa-font:before{content:""}.fa-font-awesome:before,.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before{content:""}.fa-font-case:before{content:""}.fa-football:before,.fa-football-ball:before{content:""}.fa-football-helmet:before{content:""}.fa-fork:before{content:""}.fa-fork-knife:before{content:""}.fa-forklift:before{content:""}.fa-fort:before{content:""}.fa-forward:before{content:""}.fa-forward-fast:before{content:""}.fa-forward-step:before{content:""}.fa-fragile:before{content:""}.fa-frame:before{content:""}.fa-franc-sign:before{content:""}.fa-french-fries:before{content:""}.fa-frog:before{content:""}.fa-frosty-head:before{content:""}.fa-frown:before{content:""}.fa-frown-open:before{content:""}.fa-function:before{content:""}.fa-funnel-dollar:before{content:""}.fa-futbol:before,.fa-futbol-ball:before{content:""}.fa-g:before{content:"G"}.fa-galaxy:before{content:""}.fa-gallery-thumbnails:before{content:""}.fa-game-board:before{content:""}.fa-game-board-alt:before,.fa-game-board-simple:before{content:""}.fa-game-console-handheld:before{content:""}.fa-game-console-handheld-crank:before{content:""}.fa-gamepad:before{content:""}.fa-gamepad-alt:before,.fa-gamepad-modern:before{content:""}.fa-garage:before{content:""}.fa-garage-car:before{content:""}.fa-garage-open:before{content:""}.fa-garlic:before{content:""}.fa-gas-pump:before{content:""}.fa-gas-pump-slash:before{content:""}.fa-gauge:before{content:""}.fa-gauge-circle-bolt:before{content:""}.fa-gauge-circle-minus:before{content:""}.fa-gauge-circle-plus:before{content:""}.fa-gauge-high:before{content:""}.fa-gauge-low:before{content:""}.fa-gauge-max:before{content:""}.fa-gauge-med:before{content:""}.fa-gauge-min:before{content:""}.fa-gauge-simple:before{content:""}.fa-gauge-simple-high:before{content:""}.fa-gauge-simple-low:before{content:""}.fa-gauge-simple-max:before{content:""}.fa-gauge-simple-med:before{content:""}.fa-gauge-simple-min:before{content:""}.fa-gave-dandy:before{content:""}.fa-gavel:before{content:""}.fa-gbp:before{content:""}.fa-gear:before{content:""}.fa-gear-code:before{content:""}.fa-gear-complex:before{content:""}.fa-gear-complex-code:before{content:""}.fa-gears:before{content:""}.fa-gem:before{content:""}.fa-genderless:before{content:""}.fa-ghost:before{content:""}.fa-gif:before{content:""}.fa-gift:before{content:""}.fa-gift-card:before{content:""}.fa-gifts:before{content:""}.fa-gingerbread-man:before{content:""}.fa-glass:before{content:""}.fa-glass-champagne:before{content:""}.fa-glass-cheers:before{content:""}.fa-glass-citrus:before{content:""}.fa-glass-empty:before{content:""}.fa-glass-half:before,.fa-glass-half-empty:before,.fa-glass-half-full:before{content:""}.fa-glass-martini:before{content:""}.fa-glass-martini-alt:before{content:""}.fa-glass-water:before{content:""}.fa-glass-water-droplet:before{content:""}.fa-glass-whiskey:before{content:""}.fa-glass-whiskey-rocks:before{content:""}.fa-glasses:before{content:""}.fa-glasses-alt:before,.fa-glasses-round:before{content:""}.fa-globe:before{content:""}.fa-globe-africa:before{content:""}.fa-globe-americas:before{content:""}.fa-globe-asia:before{content:""}.fa-globe-europe:before{content:""}.fa-globe-oceania:before{content:""}.fa-globe-pointer:before{content:""}.fa-globe-snow:before{content:""}.fa-globe-stand:before{content:""}.fa-globe-wifi:before{content:""}.fa-glove-boxing:before{content:""}.fa-goal-net:before{content:""}.fa-golf-ball:before,.fa-golf-ball-tee:before{content:""}.fa-golf-club:before{content:""}.fa-golf-flag-hole:before{content:""}.fa-gopuram:before{content:""}.fa-graduation-cap:before{content:""}.fa-gramophone:before{content:""}.fa-grapes:before{content:""}.fa-grate:before{content:""}.fa-grate-droplet:before{content:""}.fa-greater-than:before{content:">"}.fa-greater-than-equal:before{content:""}.fa-grid:before{content:""}.fa-grid-2:before{content:""}.fa-grid-2-plus:before{content:""}.fa-grid-3:before{content:""}.fa-grid-4:before{content:""}.fa-grid-5:before{content:""}.fa-grid-dividers:before{content:""}.fa-grid-horizontal:before{content:""}.fa-grid-round:before{content:""}.fa-grid-round-2:before{content:""}.fa-grid-round-2-plus:before{content:""}.fa-grid-round-4:before{content:""}.fa-grid-round-5:before{content:""}.fa-grill:before{content:""}.fa-grill-fire:before{content:""}.fa-grill-hot:before{content:""}.fa-grimace:before{content:""}.fa-grin:before{content:""}.fa-grin-alt:before{content:""}.fa-grin-beam:before{content:""}.fa-grin-beam-sweat:before{content:""}.fa-grin-hearts:before{content:""}.fa-grin-squint:before{content:""}.fa-grin-squint-tears:before{content:""}.fa-grin-stars:before{content:""}.fa-grin-tears:before{content:""}.fa-grin-tongue:before{content:""}.fa-grin-tongue-squint:before{content:""}.fa-grin-tongue-wink:before{content:""}.fa-grin-wink:before{content:""}.fa-grip:before{content:""}.fa-grip-dots:before{content:""}.fa-grip-dots-vertical:before{content:""}.fa-grip-horizontal:before{content:""}.fa-grip-lines:before{content:""}.fa-grip-lines-vertical:before{content:""}.fa-grip-vertical:before{content:""}.fa-group-arrows-rotate:before{content:""}.fa-guarani-sign:before{content:""}.fa-guitar:before{content:""}.fa-guitar-electric:before{content:""}.fa-guitars:before{content:""}.fa-gun:before{content:""}.fa-gun-slash:before{content:""}.fa-gun-squirt:before{content:""}.fa-h:before{content:"H"}.fa-h-square:before{content:""}.fa-h1:before{content:""}.fa-h2:before{content:""}.fa-h3:before{content:""}.fa-h4:before{content:""}.fa-h5:before{content:""}.fa-h6:before{content:""}.fa-hamburger:before{content:""}.fa-hammer:before{content:""}.fa-hammer-brush:before{content:""}.fa-hammer-crash:before{content:""}.fa-hammer-war:before{content:""}.fa-hamsa:before{content:""}.fa-hand:before{content:""}.fa-hand-back-fist:before{content:""}.fa-hand-back-point-down:before{content:""}.fa-hand-back-point-left:before{content:""}.fa-hand-back-point-ribbon:before{content:""}.fa-hand-back-point-right:before{content:""}.fa-hand-back-point-up:before{content:""}.fa-hand-dots:before{content:""}.fa-hand-fingers-crossed:before{content:""}.fa-hand-fist:before{content:""}.fa-hand-heart:before{content:""}.fa-hand-holding:before{content:""}.fa-hand-holding-box:before{content:""}.fa-hand-holding-circle-dollar:before{content:""}.fa-hand-holding-dollar:before{content:""}.fa-hand-holding-droplet:before{content:""}.fa-hand-holding-hand:before{content:""}.fa-hand-holding-heart:before{content:""}.fa-hand-holding-magic:before{content:""}.fa-hand-holding-medical:before{content:""}.fa-hand-holding-seedling:before{content:""}.fa-hand-holding-skull:before{content:""}.fa-hand-holding-usd:before{content:""}.fa-hand-holding-water:before{content:""}.fa-hand-horns:before{content:""}.fa-hand-lizard:before{content:""}.fa-hand-love:before{content:""}.fa-hand-middle-finger:before{content:""}.fa-hand-paper:before{content:""}.fa-hand-peace:before{content:""}.fa-hand-point-down:before{content:""}.fa-hand-point-left:before{content:""}.fa-hand-point-ribbon:before{content:""}.fa-hand-point-right:before{content:""}.fa-hand-point-up:before{content:""}.fa-hand-pointer:before{content:""}.fa-hand-receiving:before{content:""}.fa-hand-rock:before{content:""}.fa-hand-scissors:before{content:""}.fa-hand-sparkles:before{content:""}.fa-hand-spock:before{content:""}.fa-hand-wave:before{content:""}.fa-handcuffs:before{content:""}.fa-hands:before{content:""}.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:""}.fa-hands-bound:before{content:""}.fa-hands-bubbles:before{content:""}.fa-hands-clapping:before{content:""}.fa-hands-heart:before{content:""}.fa-hands-helping:before{content:""}.fa-hands-holding:before{content:""}.fa-hands-holding-child:before{content:""}.fa-hands-holding-circle:before{content:""}.fa-hands-holding-diamond:before{content:""}.fa-hands-holding-dollar:before{content:""}.fa-hands-holding-heart:before{content:""}.fa-hands-praying:before{content:""}.fa-hands-usd:before{content:""}.fa-hands-wash:before{content:""}.fa-handshake:before{content:""}.fa-handshake-alt:before{content:""}.fa-handshake-alt-slash:before{content:""}.fa-handshake-angle:before{content:""}.fa-handshake-simple:before{content:""}.fa-handshake-simple-slash:before{content:""}.fa-handshake-slash:before{content:""}.fa-hanukiah:before{content:""}.fa-hard-drive:before{content:""}.fa-hard-hat:before{content:""}.fa-hard-of-hearing:before{content:""}.fa-hashtag:before{content:"#"}.fa-hashtag-lock:before{content:""}.fa-hat-beach:before{content:""}.fa-hat-chef:before{content:""}.fa-hat-cowboy:before{content:""}.fa-hat-cowboy-side:before{content:""}.fa-hat-hard:before{content:""}.fa-hat-santa:before{content:""}.fa-hat-winter:before{content:""}.fa-hat-witch:before{content:""}.fa-hat-wizard:before{content:""}.fa-haykal:before{content:""}.fa-hdd:before{content:""}.fa-head-side:before{content:""}.fa-head-side-brain:before{content:""}.fa-head-side-cough:before{content:""}.fa-head-side-cough-slash:before{content:""}.fa-head-side-gear:before{content:""}.fa-head-side-goggles:before{content:""}.fa-head-side-headphones:before{content:""}.fa-head-side-heart:before{content:""}.fa-head-side-mask:before{content:""}.fa-head-side-medical:before{content:""}.fa-head-side-virus:before{content:""}.fa-head-vr:before{content:""}.fa-header:before,.fa-heading:before{content:""}.fa-headphones:before{content:""}.fa-headphones-alt:before,.fa-headphones-simple:before{content:""}.fa-headset:before{content:""}.fa-heart:before{content:""}.fa-heart-broken:before{content:""}.fa-heart-circle:before{content:""}.fa-heart-circle-bolt:before{content:""}.fa-heart-circle-check:before{content:""}.fa-heart-circle-exclamation:before{content:""}.fa-heart-circle-minus:before{content:""}.fa-heart-circle-plus:before{content:""}.fa-heart-circle-xmark:before{content:""}.fa-heart-crack:before{content:""}.fa-heart-half:before{content:""}.fa-heart-half-alt:before,.fa-heart-half-stroke:before{content:""}.fa-heart-music-camera-bolt:before{content:""}.fa-heart-pulse:before{content:""}.fa-heart-rate:before{content:""}.fa-heart-square:before{content:""}.fa-heartbeat:before{content:""}.fa-heat:before{content:""}.fa-helicopter:before{content:""}.fa-helicopter-symbol:before{content:""}.fa-helmet-battle:before{content:""}.fa-helmet-safety:before{content:""}.fa-helmet-un:before{content:""}.fa-hexagon:before{content:""}.fa-hexagon-check:before{content:""}.fa-hexagon-divide:before{content:""}.fa-hexagon-exclamation:before{content:""}.fa-hexagon-image:before{content:""}.fa-hexagon-minus:before{content:""}.fa-hexagon-plus:before{content:""}.fa-hexagon-vertical-nft:before{content:""}.fa-hexagon-vertical-nft-slanted:before{content:""}.fa-hexagon-xmark:before{content:""}.fa-high-definition:before{content:""}.fa-highlighter:before{content:""}.fa-highlighter-line:before{content:""}.fa-hiking:before{content:""}.fa-hill-avalanche:before{content:""}.fa-hill-rockslide:before{content:""}.fa-hippo:before{content:""}.fa-history:before{content:""}.fa-hockey-mask:before{content:""}.fa-hockey-puck:before{content:""}.fa-hockey-stick-puck:before{content:""}.fa-hockey-sticks:before{content:""}.fa-holly-berry:before{content:""}.fa-home:before,.fa-home-alt:before{content:""}.fa-home-blank:before{content:""}.fa-home-heart:before{content:""}.fa-home-lg:before{content:""}.fa-home-lg-alt:before{content:""}.fa-home-user:before{content:""}.fa-honey-pot:before{content:""}.fa-hood-cloak:before{content:""}.fa-horizontal-rule:before{content:""}.fa-horse:before{content:""}.fa-horse-head:before{content:""}.fa-horse-saddle:before{content:""}.fa-hose:before{content:""}.fa-hose-reel:before{content:""}.fa-hospital:before,.fa-hospital-alt:before{content:""}.fa-hospital-symbol:before{content:""}.fa-hospital-user:before{content:""}.fa-hospital-wide:before{content:""}.fa-hospitals:before{content:""}.fa-hot-tub:before,.fa-hot-tub-person:before{content:""}.fa-hotdog:before{content:""}.fa-hotel:before{content:""}.fa-hourglass:before{content:""}.fa-hourglass-1:before{content:""}.fa-hourglass-2:before{content:""}.fa-hourglass-3:before{content:""}.fa-hourglass-clock:before{content:""}.fa-hourglass-empty:before{content:""}.fa-hourglass-end:before{content:""}.fa-hourglass-half:before{content:""}.fa-hourglass-start:before{content:""}.fa-house:before{content:""}.fa-house-blank:before{content:""}.fa-house-building:before{content:""}.fa-house-chimney:before{content:""}.fa-house-chimney-blank:before{content:""}.fa-house-chimney-crack:before{content:""}.fa-house-chimney-heart:before{content:""}.fa-house-chimney-medical:before{content:""}.fa-house-chimney-user:before{content:""}.fa-house-chimney-window:before{content:""}.fa-house-circle-check:before{content:""}.fa-house-circle-exclamation:before{content:""}.fa-house-circle-xmark:before{content:""}.fa-house-crack:before{content:""}.fa-house-damage:before{content:""}.fa-house-day:before{content:""}.fa-house-fire:before{content:""}.fa-house-flag:before{content:""}.fa-house-flood:before{content:""}.fa-house-flood-water:before{content:""}.fa-house-flood-water-circle-arrow-right:before{content:""}.fa-house-heart:before{content:""}.fa-house-laptop:before{content:""}.fa-house-leave:before{content:""}.fa-house-lock:before{content:""}.fa-house-medical:before{content:""}.fa-house-medical-circle-check:before{content:""}.fa-house-medical-circle-exclamation:before{content:""}.fa-house-medical-circle-xmark:before{content:""}.fa-house-medical-flag:before{content:""}.fa-house-night:before{content:""}.fa-house-person-arrive:before{content:""}.fa-house-person-depart:before,.fa-house-person-leave:before{content:""}.fa-house-person-return:before,.fa-house-return:before{content:""}.fa-house-signal:before{content:""}.fa-house-tree:before{content:""}.fa-house-tsunami:before{content:""}.fa-house-turret:before{content:""}.fa-house-user:before{content:""}.fa-house-water:before{content:""}.fa-house-window:before{content:""}.fa-hryvnia:before,.fa-hryvnia-sign:before{content:""}.fa-humidity:before{content:""}.fa-hundred-points:before{content:""}.fa-hurricane:before{content:""}.fa-hydra:before{content:""}.fa-hyphen:before{content:"-"}.fa-i:before{content:"I"}.fa-i-cursor:before{content:""}.fa-ice-cream:before{content:""}.fa-ice-skate:before{content:""}.fa-icicles:before{content:""}.fa-icons:before{content:""}.fa-icons-alt:before{content:""}.fa-id-badge:before{content:""}.fa-id-card:before{content:""}.fa-id-card-alt:before,.fa-id-card-clip:before{content:""}.fa-igloo:before{content:""}.fa-ils:before{content:""}.fa-image:before{content:""}.fa-image-landscape:before{content:""}.fa-image-polaroid:before{content:""}.fa-image-polaroid-user:before{content:""}.fa-image-portrait:before{content:""}.fa-image-slash:before{content:""}.fa-image-user:before{content:""}.fa-images:before{content:""}.fa-images-user:before{content:""}.fa-inbox:before{content:""}.fa-inbox-arrow-down:before{content:""}.fa-inbox-arrow-up:before{content:""}.fa-inbox-full:before{content:""}.fa-inbox-in:before{content:""}.fa-inbox-out:before{content:""}.fa-inboxes:before{content:""}.fa-indent:before{content:""}.fa-indian-rupee:before,.fa-indian-rupee-sign:before{content:""}.fa-industry:before{content:""}.fa-industry-alt:before,.fa-industry-windows:before{content:""}.fa-infinity:before{content:""}.fa-info:before{content:""}.fa-info-circle:before{content:""}.fa-info-square:before{content:""}.fa-inhaler:before{content:""}.fa-input-numeric:before{content:""}.fa-input-pipe:before{content:""}.fa-input-text:before{content:""}.fa-inr:before{content:""}.fa-institution:before{content:""}.fa-integral:before{content:""}.fa-interrobang:before{content:""}.fa-intersection:before{content:""}.fa-inventory:before{content:""}.fa-island-tree-palm:before,.fa-island-tropical:before{content:""}.fa-italic:before{content:""}.fa-j:before{content:"J"}.fa-jack-o-lantern:before{content:""}.fa-jar:before{content:""}.fa-jar-wheat:before{content:""}.fa-jedi:before{content:""}.fa-jet-fighter:before{content:""}.fa-jet-fighter-up:before{content:""}.fa-joint:before{content:""}.fa-journal-whills:before{content:""}.fa-joystick:before{content:""}.fa-jpy:before{content:""}.fa-jug:before{content:""}.fa-jug-bottle:before{content:""}.fa-jug-detergent:before{content:""}.fa-k:before{content:"K"}.fa-kaaba:before{content:""}.fa-kazoo:before{content:""}.fa-kerning:before{content:""}.fa-key:before{content:""}.fa-key-skeleton:before{content:""}.fa-key-skeleton-left-right:before{content:""}.fa-keyboard:before{content:""}.fa-keyboard-brightness:before{content:""}.fa-keyboard-brightness-low:before{content:""}.fa-keyboard-down:before{content:""}.fa-keyboard-left:before{content:""}.fa-keynote:before{content:""}.fa-khanda:before{content:""}.fa-kidneys:before{content:""}.fa-kip-sign:before{content:""}.fa-kiss:before{content:""}.fa-kiss-beam:before{content:""}.fa-kiss-wink-heart:before{content:""}.fa-kit-medical:before{content:""}.fa-kitchen-set:before{content:""}.fa-kite:before{content:""}.fa-kiwi-bird:before{content:""}.fa-kiwi-fruit:before{content:""}.fa-knife:before{content:""}.fa-knife-kitchen:before{content:""}.fa-krw:before{content:""}.fa-l:before{content:"L"}.fa-lacrosse-stick:before{content:""}.fa-lacrosse-stick-ball:before{content:""}.fa-ladder-water:before{content:""}.fa-lambda:before{content:""}.fa-lamp:before{content:""}.fa-lamp-desk:before{content:""}.fa-lamp-floor:before{content:""}.fa-lamp-street:before{content:""}.fa-land-mine-on:before{content:""}.fa-landmark:before{content:""}.fa-landmark-alt:before,.fa-landmark-dome:before{content:""}.fa-landmark-flag:before{content:""}.fa-landmark-magnifying-glass:before{content:""}.fa-landscape:before{content:""}.fa-language:before{content:""}.fa-laptop:before{content:""}.fa-laptop-arrow-down:before{content:""}.fa-laptop-binary:before{content:""}.fa-laptop-code:before{content:""}.fa-laptop-file:before{content:""}.fa-laptop-house:before{content:""}.fa-laptop-medical:before{content:""}.fa-laptop-mobile:before{content:""}.fa-laptop-slash:before{content:""}.fa-lari-sign:before{content:""}.fa-lasso:before{content:""}.fa-lasso-sparkles:before{content:""}.fa-laugh:before{content:""}.fa-laugh-beam:before{content:""}.fa-laugh-squint:before{content:""}.fa-laugh-wink:before{content:""}.fa-layer-group:before{content:""}.fa-layer-group-minus:before{content:""}.fa-layer-group-plus:before{content:""}.fa-layer-minus:before{content:""}.fa-layer-plus:before{content:""}.fa-leaf:before{content:""}.fa-leaf-heart:before{content:""}.fa-leaf-maple:before{content:""}.fa-leaf-oak:before{content:""}.fa-leafy-green:before{content:""}.fa-left:before{content:""}.fa-left-from-bracket:before{content:""}.fa-left-from-line:before{content:""}.fa-left-long:before{content:""}.fa-left-long-to-line:before{content:""}.fa-left-right:before{content:""}.fa-left-to-bracket:before{content:""}.fa-left-to-line:before{content:""}.fa-legal:before{content:""}.fa-lemon:before{content:""}.fa-less-than:before{content:"<"}.fa-less-than-equal:before{content:""}.fa-level-down:before{content:""}.fa-level-down-alt:before{content:""}.fa-level-up:before{content:""}.fa-level-up-alt:before{content:""}.fa-life-ring:before{content:""}.fa-light-ceiling:before{content:""}.fa-light-emergency:before{content:""}.fa-light-emergency-on:before{content:""}.fa-light-switch:before{content:""}.fa-light-switch-off:before{content:""}.fa-light-switch-on:before{content:""}.fa-lightbulb:before{content:""}.fa-lightbulb-cfl:before{content:""}.fa-lightbulb-cfl-on:before{content:""}.fa-lightbulb-dollar:before{content:""}.fa-lightbulb-exclamation:before{content:""}.fa-lightbulb-exclamation-on:before{content:""}.fa-lightbulb-gear:before{content:""}.fa-lightbulb-message:before{content:""}.fa-lightbulb-on:before{content:""}.fa-lightbulb-slash:before{content:""}.fa-lighthouse:before{content:""}.fa-lights-holiday:before{content:""}.fa-line-chart:before{content:""}.fa-line-columns:before{content:""}.fa-line-height:before{content:""}.fa-lines-leaning:before{content:""}.fa-link:before{content:""}.fa-link-horizontal:before{content:""}.fa-link-horizontal-slash:before{content:""}.fa-link-simple:before{content:""}.fa-link-simple-slash:before{content:""}.fa-link-slash:before{content:""}.fa-lips:before{content:""}.fa-lira-sign:before{content:""}.fa-list:before{content:""}.fa-list-1-2:before{content:""}.fa-list-alt:before{content:""}.fa-list-check:before{content:""}.fa-list-dots:before{content:""}.fa-list-dropdown:before{content:""}.fa-list-music:before{content:""}.fa-list-numeric:before,.fa-list-ol:before{content:""}.fa-list-radio:before{content:""}.fa-list-squares:before{content:""}.fa-list-timeline:before{content:""}.fa-list-tree:before{content:""}.fa-list-ul:before{content:""}.fa-litecoin-sign:before{content:""}.fa-loader:before{content:""}.fa-lobster:before{content:""}.fa-location:before{content:""}.fa-location-arrow:before{content:""}.fa-location-arrow-up:before{content:""}.fa-location-check:before{content:""}.fa-location-circle:before{content:""}.fa-location-crosshairs:before{content:""}.fa-location-crosshairs-slash:before{content:""}.fa-location-dot:before{content:""}.fa-location-dot-slash:before{content:""}.fa-location-exclamation:before{content:""}.fa-location-minus:before{content:""}.fa-location-pen:before{content:""}.fa-location-pin:before{content:""}.fa-location-pin-lock:before{content:""}.fa-location-pin-slash:before{content:""}.fa-location-plus:before{content:""}.fa-location-question:before{content:""}.fa-location-slash:before{content:""}.fa-location-smile:before{content:""}.fa-location-xmark:before{content:""}.fa-lock:before{content:""}.fa-lock-a:before{content:""}.fa-lock-alt:before{content:""}.fa-lock-hashtag:before{content:""}.fa-lock-keyhole:before{content:""}.fa-lock-keyhole-open:before{content:""}.fa-lock-open:before{content:""}.fa-lock-open-alt:before{content:""}.fa-locust:before{content:""}.fa-lollipop:before,.fa-lollypop:before{content:""}.fa-long-arrow-alt-down:before{content:""}.fa-long-arrow-alt-left:before{content:""}.fa-long-arrow-alt-right:before{content:""}.fa-long-arrow-alt-up:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-long-arrow-up:before{content:""}.fa-loveseat:before{content:""}.fa-low-vision:before{content:""}.fa-luchador:before,.fa-luchador-mask:before{content:""}.fa-luggage-cart:before{content:""}.fa-lungs:before{content:""}.fa-lungs-virus:before{content:""}.fa-m:before{content:"M"}.fa-mace:before{content:""}.fa-magic:before{content:""}.fa-magic-wand-sparkles:before{content:""}.fa-magnet:before{content:""}.fa-magnifying-glass:before{content:""}.fa-magnifying-glass-arrow-right:before{content:""}.fa-magnifying-glass-arrows-rotate:before{content:""}.fa-magnifying-glass-chart:before{content:""}.fa-magnifying-glass-dollar:before{content:""}.fa-magnifying-glass-location:before{content:""}.fa-magnifying-glass-minus:before{content:""}.fa-magnifying-glass-music:before{content:""}.fa-magnifying-glass-play:before{content:""}.fa-magnifying-glass-plus:before{content:""}.fa-magnifying-glass-waveform:before{content:""}.fa-mail-bulk:before{content:""}.fa-mail-forward:before{content:""}.fa-mail-reply:before{content:""}.fa-mail-reply-all:before{content:""}.fa-mailbox:before{content:""}.fa-mailbox-flag-up:before{content:""}.fa-maki-roll:before,.fa-makizushi:before{content:""}.fa-male:before{content:""}.fa-manat-sign:before{content:""}.fa-mandolin:before{content:""}.fa-mango:before{content:""}.fa-manhole:before{content:""}.fa-map:before{content:""}.fa-map-location:before{content:""}.fa-map-location-dot:before{content:""}.fa-map-marked:before{content:""}.fa-map-marked-alt:before{content:""}.fa-map-marker:before{content:""}.fa-map-marker-alt:before{content:""}.fa-map-marker-alt-slash:before{content:""}.fa-map-marker-check:before{content:""}.fa-map-marker-edit:before{content:""}.fa-map-marker-exclamation:before{content:""}.fa-map-marker-minus:before{content:""}.fa-map-marker-plus:before{content:""}.fa-map-marker-question:before{content:""}.fa-map-marker-slash:before{content:""}.fa-map-marker-smile:before{content:""}.fa-map-marker-times:before,.fa-map-marker-xmark:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-marker:before{content:""}.fa-mars:before{content:""}.fa-mars-and-venus:before{content:""}.fa-mars-and-venus-burst:before{content:""}.fa-mars-double:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:""}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:""}.fa-martini-glass:before{content:""}.fa-martini-glass-citrus:before{content:""}.fa-martini-glass-empty:before{content:""}.fa-mask:before{content:""}.fa-mask-face:before{content:""}.fa-mask-luchador:before{content:""}.fa-mask-snorkel:before{content:""}.fa-mask-ventilator:before{content:""}.fa-masks-theater:before{content:""}.fa-mattress-pillow:before{content:""}.fa-maximize:before{content:""}.fa-meat:before{content:""}.fa-medal:before{content:""}.fa-medkit:before{content:""}.fa-megaphone:before{content:""}.fa-meh:before{content:""}.fa-meh-blank:before{content:""}.fa-meh-rolling-eyes:before{content:""}.fa-melon:before{content:""}.fa-melon-slice:before{content:""}.fa-memo:before{content:""}.fa-memo-circle-check:before{content:""}.fa-memo-circle-info:before{content:""}.fa-memo-pad:before{content:""}.fa-memory:before{content:""}.fa-menorah:before{content:""}.fa-mercury:before{content:""}.fa-merge:before{content:""}.fa-message:before{content:""}.fa-message-arrow-down:before{content:""}.fa-message-arrow-up:before{content:""}.fa-message-arrow-up-right:before{content:""}.fa-message-bot:before{content:""}.fa-message-captions:before{content:""}.fa-message-check:before{content:""}.fa-message-code:before{content:""}.fa-message-dollar:before{content:""}.fa-message-dots:before{content:""}.fa-message-edit:before{content:""}.fa-message-exclamation:before{content:""}.fa-message-heart:before{content:""}.fa-message-image:before{content:""}.fa-message-lines:before{content:""}.fa-message-medical:before{content:""}.fa-message-middle:before{content:""}.fa-message-middle-top:before{content:""}.fa-message-minus:before{content:""}.fa-message-music:before{content:""}.fa-message-pen:before{content:""}.fa-message-plus:before{content:""}.fa-message-question:before{content:""}.fa-message-quote:before{content:""}.fa-message-slash:before{content:""}.fa-message-smile:before{content:""}.fa-message-sms:before{content:""}.fa-message-text:before{content:""}.fa-message-times:before,.fa-message-xmark:before{content:""}.fa-messages:before{content:""}.fa-messages-dollar:before{content:""}.fa-messages-question:before{content:""}.fa-messaging:before{content:""}.fa-meteor:before{content:""}.fa-meter:before{content:""}.fa-meter-bolt:before{content:""}.fa-meter-droplet:before{content:""}.fa-meter-fire:before{content:""}.fa-microchip:before{content:""}.fa-microchip-ai:before{content:""}.fa-microphone:before{content:""}.fa-microphone-alt:before{content:""}.fa-microphone-alt-slash:before{content:""}.fa-microphone-circle:before{content:""}.fa-microphone-circle-alt:before{content:""}.fa-microphone-lines:before{content:""}.fa-microphone-lines-slash:before{content:""}.fa-microphone-slash:before{content:""}.fa-microphone-stand:before{content:""}.fa-microscope:before{content:""}.fa-microwave:before{content:""}.fa-mill-sign:before{content:""}.fa-mind-share:before{content:""}.fa-minimize:before{content:""}.fa-minus:before{content:""}.fa-minus-circle:before{content:""}.fa-minus-hexagon:before{content:""}.fa-minus-large:before{content:""}.fa-minus-octagon:before{content:""}.fa-minus-square:before{content:""}.fa-mistletoe:before{content:""}.fa-mitten:before{content:""}.fa-mobile:before{content:""}.fa-mobile-alt:before{content:""}.fa-mobile-android:before{content:""}.fa-mobile-android-alt:before{content:""}.fa-mobile-button:before{content:""}.fa-mobile-iphone:before,.fa-mobile-notch:before{content:""}.fa-mobile-phone:before{content:""}.fa-mobile-retro:before{content:""}.fa-mobile-screen:before{content:""}.fa-mobile-screen-button:before{content:""}.fa-mobile-signal:before{content:""}.fa-mobile-signal-out:before{content:""}.fa-money-bill:before{content:""}.fa-money-bill-1:before{content:""}.fa-money-bill-1-wave:before{content:""}.fa-money-bill-alt:before{content:""}.fa-money-bill-simple:before{content:""}.fa-money-bill-simple-wave:before{content:""}.fa-money-bill-transfer:before{content:""}.fa-money-bill-trend-up:before{content:""}.fa-money-bill-wave:before{content:""}.fa-money-bill-wave-alt:before{content:""}.fa-money-bill-wheat:before{content:""}.fa-money-bills:before{content:""}.fa-money-bills-alt:before,.fa-money-bills-simple:before{content:""}.fa-money-check:before{content:""}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:""}.fa-money-check-dollar-pen:before{content:""}.fa-money-check-edit:before{content:""}.fa-money-check-edit-alt:before{content:""}.fa-money-check-pen:before{content:""}.fa-money-from-bracket:before{content:""}.fa-money-simple-from-bracket:before{content:""}.fa-monitor-heart-rate:before,.fa-monitor-waveform:before{content:""}.fa-monkey:before{content:""}.fa-monument:before{content:""}.fa-moon:before{content:""}.fa-moon-cloud:before{content:""}.fa-moon-over-sun:before{content:""}.fa-moon-stars:before{content:""}.fa-moped:before{content:""}.fa-mortar-board:before{content:""}.fa-mortar-pestle:before{content:""}.fa-mosque:before{content:""}.fa-mosquito:before{content:""}.fa-mosquito-net:before{content:""}.fa-motorcycle:before{content:""}.fa-mound:before{content:""}.fa-mountain:before{content:""}.fa-mountain-city:before{content:""}.fa-mountain-sun:before{content:""}.fa-mountains:before{content:""}.fa-mouse:before{content:""}.fa-mouse-alt:before{content:""}.fa-mouse-field:before{content:""}.fa-mouse-pointer:before{content:""}.fa-mp3-player:before{content:""}.fa-mug:before{content:""}.fa-mug-hot:before{content:""}.fa-mug-marshmallows:before{content:""}.fa-mug-saucer:before{content:""}.fa-mug-tea:before{content:""}.fa-mug-tea-saucer:before{content:""}.fa-multiply:before{content:""}.fa-museum:before{content:""}.fa-mushroom:before{content:""}.fa-music:before{content:""}.fa-music-alt:before{content:""}.fa-music-alt-slash:before{content:""}.fa-music-magnifying-glass:before{content:""}.fa-music-note:before{content:""}.fa-music-note-slash:before{content:""}.fa-music-slash:before{content:""}.fa-mustache:before{content:""}.fa-n:before{content:"N"}.fa-naira-sign:before{content:""}.fa-narwhal:before{content:""}.fa-navicon:before{content:""}.fa-nesting-dolls:before{content:""}.fa-network-wired:before{content:""}.fa-neuter:before{content:""}.fa-newspaper:before{content:""}.fa-nfc:before{content:""}.fa-nfc-lock:before{content:""}.fa-nfc-magnifying-glass:before{content:""}.fa-nfc-pen:before{content:""}.fa-nfc-signal:before{content:""}.fa-nfc-slash:before{content:""}.fa-nfc-symbol:before{content:""}.fa-nfc-trash:before{content:""}.fa-nigiri:before{content:""}.fa-nose:before{content:""}.fa-not-equal:before{content:""}.fa-notdef:before{content:""}.fa-note:before{content:""}.fa-note-medical:before{content:""}.fa-note-sticky:before{content:""}.fa-notebook:before{content:""}.fa-notes:before{content:""}.fa-notes-medical:before{content:""}.fa-o:before{content:"O"}.fa-object-exclude:before{content:""}.fa-object-group:before{content:""}.fa-object-intersect:before{content:""}.fa-object-subtract:before{content:""}.fa-object-ungroup:before{content:""}.fa-object-union:before{content:""}.fa-objects-align-bottom:before{content:""}.fa-objects-align-center-horizontal:before{content:""}.fa-objects-align-center-vertical:before{content:""}.fa-objects-align-left:before{content:""}.fa-objects-align-right:before{content:""}.fa-objects-align-top:before{content:""}.fa-objects-column:before{content:""}.fa-octagon:before{content:""}.fa-octagon-check:before{content:""}.fa-octagon-divide:before{content:""}.fa-octagon-exclamation:before{content:""}.fa-octagon-minus:before{content:""}.fa-octagon-plus:before{content:""}.fa-octagon-xmark:before{content:""}.fa-octopus:before{content:""}.fa-oil-can:before{content:""}.fa-oil-can-drip:before{content:""}.fa-oil-temp:before,.fa-oil-temperature:before{content:""}.fa-oil-well:before{content:""}.fa-olive:before{content:""}.fa-olive-branch:before{content:""}.fa-om:before{content:""}.fa-omega:before{content:""}.fa-onion:before{content:""}.fa-option:before{content:""}.fa-ornament:before{content:""}.fa-otter:before{content:""}.fa-outdent:before{content:""}.fa-outlet:before{content:""}.fa-oven:before{content:""}.fa-overline:before{content:""}.fa-p:before{content:"P"}.fa-page:before{content:""}.fa-page-break:before{content:""}.fa-page-caret-down:before{content:""}.fa-page-caret-up:before{content:""}.fa-pager:before{content:""}.fa-paint-brush:before{content:""}.fa-paint-brush-alt:before,.fa-paint-brush-fine:before{content:""}.fa-paint-roller:before{content:""}.fa-paintbrush:before{content:""}.fa-paintbrush-alt:before,.fa-paintbrush-fine:before{content:""}.fa-paintbrush-pencil:before{content:""}.fa-palette:before{content:""}.fa-palette-boxes:before{content:""}.fa-pallet:before{content:""}.fa-pallet-alt:before{content:""}.fa-pallet-box:before{content:""}.fa-pallet-boxes:before{content:""}.fa-pan-food:before{content:""}.fa-pan-frying:before{content:""}.fa-pancakes:before{content:""}.fa-panel-ews:before{content:""}.fa-panel-fire:before{content:""}.fa-panorama:before{content:""}.fa-paper-plane:before{content:""}.fa-paper-plane-alt:before,.fa-paper-plane-top:before{content:""}.fa-paperclip:before{content:""}.fa-paperclip-vertical:before{content:""}.fa-parachute-box:before{content:""}.fa-paragraph:before{content:""}.fa-paragraph-left:before,.fa-paragraph-rtl:before{content:""}.fa-parentheses:before{content:""}.fa-parenthesis:before{content:"("}.fa-parking:before{content:""}.fa-parking-circle:before{content:""}.fa-parking-circle-slash:before{content:""}.fa-parking-slash:before{content:""}.fa-party-back:before{content:""}.fa-party-bell:before{content:""}.fa-party-horn:before{content:""}.fa-passport:before{content:""}.fa-pastafarianism:before{content:""}.fa-paste:before{content:""}.fa-pause:before{content:""}.fa-pause-circle:before{content:""}.fa-paw:before{content:""}.fa-paw-alt:before{content:""}.fa-paw-claws:before{content:""}.fa-paw-simple:before{content:""}.fa-peace:before{content:""}.fa-peach:before{content:""}.fa-peanut:before{content:""}.fa-peanuts:before{content:""}.fa-peapod:before{content:""}.fa-pear:before{content:""}.fa-pedestal:before{content:""}.fa-pegasus:before{content:""}.fa-pen:before{content:""}.fa-pen-alt:before{content:""}.fa-pen-alt-slash:before{content:""}.fa-pen-circle:before{content:""}.fa-pen-clip:before{content:""}.fa-pen-clip-slash:before{content:""}.fa-pen-fancy:before{content:""}.fa-pen-fancy-slash:before{content:""}.fa-pen-field:before{content:""}.fa-pen-line:before{content:""}.fa-pen-nib:before{content:""}.fa-pen-nib-slash:before{content:""}.fa-pen-paintbrush:before{content:""}.fa-pen-ruler:before{content:""}.fa-pen-slash:before{content:""}.fa-pen-square:before{content:""}.fa-pen-swirl:before{content:""}.fa-pen-to-square:before{content:""}.fa-pencil:before,.fa-pencil-alt:before{content:""}.fa-pencil-mechanical:before{content:""}.fa-pencil-paintbrush:before{content:""}.fa-pencil-ruler:before{content:""}.fa-pencil-slash:before{content:""}.fa-pencil-square:before{content:""}.fa-pennant:before{content:""}.fa-people:before{content:""}.fa-people-arrows:before,.fa-people-arrows-left-right:before{content:""}.fa-people-carry:before,.fa-people-carry-box:before{content:""}.fa-people-dress:before{content:""}.fa-people-dress-simple:before{content:""}.fa-people-group:before{content:""}.fa-people-line:before{content:""}.fa-people-pants:before{content:""}.fa-people-pants-simple:before{content:""}.fa-people-pulling:before{content:""}.fa-people-robbery:before{content:""}.fa-people-roof:before{content:""}.fa-people-simple:before{content:""}.fa-pepper:before{content:""}.fa-pepper-hot:before{content:""}.fa-percent:before,.fa-percentage:before{content:"%"}.fa-period:before{content:"."}.fa-person:before{content:""}.fa-person-arrow-down-to-line:before{content:""}.fa-person-arrow-up-from-line:before{content:""}.fa-person-biking:before{content:""}.fa-person-biking-mountain:before{content:""}.fa-person-booth:before{content:""}.fa-person-breastfeeding:before{content:""}.fa-person-burst:before{content:""}.fa-person-cane:before{content:""}.fa-person-carry:before,.fa-person-carry-box:before{content:""}.fa-person-chalkboard:before{content:""}.fa-person-circle-check:before{content:""}.fa-person-circle-exclamation:before{content:""}.fa-person-circle-minus:before{content:""}.fa-person-circle-plus:before{content:""}.fa-person-circle-question:before{content:""}.fa-person-circle-xmark:before{content:""}.fa-person-digging:before{content:""}.fa-person-dolly:before{content:""}.fa-person-dolly-empty:before{content:""}.fa-person-dots-from-line:before{content:""}.fa-person-dress:before{content:""}.fa-person-dress-burst:before{content:""}.fa-person-dress-fairy:before{content:""}.fa-person-dress-simple:before{content:""}.fa-person-drowning:before{content:""}.fa-person-fairy:before{content:""}.fa-person-falling:before{content:""}.fa-person-falling-burst:before{content:""}.fa-person-from-portal:before{content:""}.fa-person-half-dress:before{content:""}.fa-person-harassing:before{content:""}.fa-person-hiking:before{content:""}.fa-person-military-pointing:before{content:""}.fa-person-military-rifle:before{content:""}.fa-person-military-to-person:before{content:""}.fa-person-pinball:before{content:""}.fa-person-praying:before{content:""}.fa-person-pregnant:before{content:""}.fa-person-rays:before{content:""}.fa-person-rifle:before{content:""}.fa-person-running:before{content:""}.fa-person-running-fast:before{content:""}.fa-person-seat:before{content:""}.fa-person-seat-reclined:before{content:""}.fa-person-shelter:before{content:""}.fa-person-sign:before{content:""}.fa-person-simple:before{content:""}.fa-person-skating:before{content:""}.fa-person-ski-jumping:before{content:""}.fa-person-ski-lift:before{content:""}.fa-person-skiing:before{content:""}.fa-person-skiing-nordic:before{content:""}.fa-person-sledding:before{content:""}.fa-person-snowboarding:before{content:""}.fa-person-snowmobiling:before{content:""}.fa-person-swimming:before{content:""}.fa-person-through-window:before{content:""}.fa-person-to-door:before{content:""}.fa-person-to-portal:before{content:""}.fa-person-walking:before{content:""}.fa-person-walking-arrow-loop-left:before{content:""}.fa-person-walking-arrow-right:before{content:""}.fa-person-walking-dashed-line-arrow-right:before{content:""}.fa-person-walking-luggage:before{content:""}.fa-person-walking-with-cane:before{content:""}.fa-peseta-sign:before{content:""}.fa-peso-sign:before{content:""}.fa-phone:before{content:""}.fa-phone-alt:before{content:""}.fa-phone-arrow-down:before,.fa-phone-arrow-down-left:before{content:""}.fa-phone-arrow-right:before{content:""}.fa-phone-arrow-up:before,.fa-phone-arrow-up-right:before{content:""}.fa-phone-circle:before{content:""}.fa-phone-circle-alt:before{content:""}.fa-phone-circle-down:before{content:""}.fa-phone-flip:before{content:""}.fa-phone-hangup:before{content:""}.fa-phone-incoming:before{content:""}.fa-phone-intercom:before{content:""}.fa-phone-laptop:before{content:""}.fa-phone-missed:before{content:""}.fa-phone-office:before{content:""}.fa-phone-outgoing:before{content:""}.fa-phone-plus:before{content:""}.fa-phone-rotary:before{content:""}.fa-phone-slash:before{content:""}.fa-phone-square:before{content:""}.fa-phone-square-alt:before{content:""}.fa-phone-square-down:before{content:""}.fa-phone-volume:before{content:""}.fa-phone-xmark:before{content:""}.fa-photo-film:before{content:""}.fa-photo-film-music:before{content:""}.fa-photo-video:before{content:""}.fa-pi:before{content:""}.fa-piano:before{content:""}.fa-piano-keyboard:before{content:""}.fa-pickaxe:before{content:""}.fa-pickleball:before{content:""}.fa-pie:before{content:""}.fa-pie-chart:before{content:""}.fa-pig:before{content:""}.fa-piggy-bank:before{content:""}.fa-pills:before{content:""}.fa-pinata:before{content:""}.fa-pinball:before{content:""}.fa-pineapple:before{content:""}.fa-ping-pong-paddle-ball:before{content:""}.fa-pipe:before{content:"|"}.fa-pipe-circle-check:before{content:""}.fa-pipe-collar:before{content:""}.fa-pipe-section:before{content:""}.fa-pipe-smoking:before{content:""}.fa-pipe-valve:before{content:""}.fa-pizza:before{content:""}.fa-pizza-slice:before{content:""}.fa-place-of-worship:before{content:""}.fa-plane:before{content:""}.fa-plane-alt:before{content:""}.fa-plane-arrival:before{content:""}.fa-plane-circle-check:before{content:""}.fa-plane-circle-exclamation:before{content:""}.fa-plane-circle-xmark:before{content:""}.fa-plane-departure:before{content:""}.fa-plane-engines:before{content:""}.fa-plane-lock:before{content:""}.fa-plane-prop:before{content:""}.fa-plane-slash:before{content:""}.fa-plane-tail:before{content:""}.fa-plane-up:before{content:""}.fa-plane-up-slash:before{content:""}.fa-planet-moon:before{content:""}.fa-planet-ringed:before{content:""}.fa-plant-wilt:before{content:""}.fa-plate-utensils:before{content:""}.fa-plate-wheat:before{content:""}.fa-play:before{content:""}.fa-play-circle:before{content:""}.fa-play-pause:before{content:""}.fa-plug:before{content:""}.fa-plug-circle-bolt:before{content:""}.fa-plug-circle-check:before{content:""}.fa-plug-circle-exclamation:before{content:""}.fa-plug-circle-minus:before{content:""}.fa-plug-circle-plus:before{content:""}.fa-plug-circle-xmark:before{content:""}.fa-plus:before{content:"+"}.fa-plus-circle:before{content:""}.fa-plus-hexagon:before{content:""}.fa-plus-large:before{content:""}.fa-plus-minus:before{content:""}.fa-plus-octagon:before{content:""}.fa-plus-square:before{content:""}.fa-podcast:before{content:""}.fa-podium:before{content:""}.fa-podium-star:before{content:""}.fa-police-box:before{content:""}.fa-poll:before{content:""}.fa-poll-h:before{content:""}.fa-poll-people:before{content:""}.fa-pompebled:before{content:""}.fa-poo:before{content:""}.fa-poo-bolt:before,.fa-poo-storm:before{content:""}.fa-pool-8-ball:before{content:""}.fa-poop:before{content:""}.fa-popcorn:before{content:""}.fa-popsicle:before{content:""}.fa-portal-enter:before{content:""}.fa-portal-exit:before{content:""}.fa-portrait:before{content:""}.fa-pot-food:before{content:""}.fa-potato:before{content:""}.fa-pound-sign:before{content:""}.fa-power-off:before{content:""}.fa-pray:before{content:""}.fa-praying-hands:before{content:""}.fa-prescription:before{content:""}.fa-prescription-bottle:before{content:""}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:""}.fa-prescription-bottle-pill:before{content:""}.fa-presentation:before,.fa-presentation-screen:before{content:""}.fa-pretzel:before{content:""}.fa-print:before{content:""}.fa-print-magnifying-glass:before,.fa-print-search:before{content:""}.fa-print-slash:before{content:""}.fa-pro:before{content:""}.fa-procedures:before{content:""}.fa-project-diagram:before{content:""}.fa-projector:before{content:""}.fa-pump:before{content:""}.fa-pump-medical:before{content:""}.fa-pump-soap:before{content:""}.fa-pumpkin:before{content:""}.fa-puzzle:before{content:""}.fa-puzzle-piece:before{content:""}.fa-puzzle-piece-alt:before,.fa-puzzle-piece-simple:before{content:""}.fa-q:before{content:"Q"}.fa-qrcode:before{content:""}.fa-question:before{content:"?"}.fa-question-circle:before{content:""}.fa-question-square:before{content:""}.fa-quidditch:before,.fa-quidditch-broom-ball:before{content:""}.fa-quote-left:before,.fa-quote-left-alt:before{content:""}.fa-quote-right:before,.fa-quote-right-alt:before{content:""}.fa-quotes:before{content:""}.fa-quran:before{content:""}.fa-r:before{content:"R"}.fa-rabbit:before{content:""}.fa-rabbit-fast:before,.fa-rabbit-running:before{content:""}.fa-raccoon:before{content:""}.fa-racquet:before{content:""}.fa-radar:before{content:""}.fa-radiation:before{content:""}.fa-radiation-alt:before{content:""}.fa-radio:before{content:""}.fa-radio-alt:before,.fa-radio-tuner:before{content:""}.fa-rainbow:before{content:""}.fa-raindrops:before{content:""}.fa-ram:before{content:""}.fa-ramp-loading:before{content:""}.fa-random:before{content:""}.fa-ranking-star:before{content:""}.fa-raygun:before{content:""}.fa-receipt:before{content:""}.fa-record-vinyl:before{content:""}.fa-rectangle:before{content:""}.fa-rectangle-ad:before{content:""}.fa-rectangle-barcode:before{content:""}.fa-rectangle-code:before{content:""}.fa-rectangle-hd:before{content:""}.fa-rectangle-history:before{content:""}.fa-rectangle-history-circle-plus:before{content:""}.fa-rectangle-history-circle-user:before{content:""}.fa-rectangle-landscape:before{content:""}.fa-rectangle-list:before{content:""}.fa-rectangle-portrait:before{content:""}.fa-rectangle-pro:before{content:""}.fa-rectangle-sd:before{content:""}.fa-rectangle-terminal:before{content:""}.fa-rectangle-times:before{content:""}.fa-rectangle-vertical:before{content:""}.fa-rectangle-vertical-history:before{content:""}.fa-rectangle-wide:before{content:""}.fa-rectangle-xmark:before{content:""}.fa-rectangles-mixed:before{content:""}.fa-recycle:before{content:""}.fa-redo:before{content:""}.fa-redo-alt:before{content:""}.fa-reel:before{content:""}.fa-reflect-both:before{content:""}.fa-reflect-horizontal:before{content:""}.fa-reflect-vertical:before{content:""}.fa-refresh:before{content:""}.fa-refrigerator:before{content:""}.fa-registered:before{content:""}.fa-remove:before{content:""}.fa-remove-format:before{content:""}.fa-reorder:before{content:""}.fa-repeat:before{content:""}.fa-repeat-1:before{content:""}.fa-repeat-1-alt:before{content:""}.fa-repeat-alt:before{content:""}.fa-reply:before{content:""}.fa-reply-all:before{content:""}.fa-reply-clock:before,.fa-reply-time:before{content:""}.fa-republican:before{content:""}.fa-restroom:before{content:""}.fa-restroom-simple:before{content:""}.fa-retweet:before{content:""}.fa-retweet-alt:before{content:""}.fa-rhombus:before{content:""}.fa-ribbon:before{content:""}.fa-right:before{content:""}.fa-right-from-bracket:before{content:""}.fa-right-from-line:before{content:""}.fa-right-left:before{content:""}.fa-right-left-large:before{content:""}.fa-right-long:before{content:""}.fa-right-long-to-line:before{content:""}.fa-right-to-bracket:before{content:""}.fa-right-to-line:before{content:""}.fa-ring:before{content:""}.fa-ring-diamond:before{content:""}.fa-rings-wedding:before{content:""}.fa-rmb:before{content:""}.fa-road:before{content:""}.fa-road-barrier:before{content:""}.fa-road-bridge:before{content:""}.fa-road-circle-check:before{content:""}.fa-road-circle-exclamation:before{content:""}.fa-road-circle-xmark:before{content:""}.fa-road-lock:before{content:""}.fa-road-spikes:before{content:""}.fa-robot:before{content:""}.fa-robot-astromech:before{content:""}.fa-rocket:before{content:""}.fa-rocket-launch:before{content:""}.fa-rod-asclepius:before,.fa-rod-snake:before{content:""}.fa-roller-coaster:before{content:""}.fa-rotate:before{content:""}.fa-rotate-back:before,.fa-rotate-backward:before{content:""}.fa-rotate-exclamation:before{content:""}.fa-rotate-forward:before{content:""}.fa-rotate-left:before{content:""}.fa-rotate-reverse:before{content:""}.fa-rotate-right:before{content:""}.fa-rouble:before{content:""}.fa-route:before{content:""}.fa-route-highway:before{content:""}.fa-route-interstate:before{content:""}.fa-router:before{content:""}.fa-rows:before{content:""}.fa-rss:before{content:""}.fa-rss-square:before{content:""}.fa-rub:before,.fa-ruble:before,.fa-ruble-sign:before{content:""}.fa-rug:before{content:""}.fa-rugby-ball:before{content:""}.fa-ruler:before{content:""}.fa-ruler-combined:before{content:""}.fa-ruler-horizontal:before{content:""}.fa-ruler-triangle:before{content:""}.fa-ruler-vertical:before{content:""}.fa-running:before{content:""}.fa-rupee:before,.fa-rupee-sign:before{content:""}.fa-rupiah-sign:before{content:""}.fa-rv:before{content:""}.fa-s:before{content:"S"}.fa-sack:before{content:""}.fa-sack-dollar:before{content:""}.fa-sack-xmark:before{content:""}.fa-sad-cry:before{content:""}.fa-sad-tear:before{content:""}.fa-sailboat:before{content:""}.fa-salad:before{content:""}.fa-salt-shaker:before{content:""}.fa-sandwich:before{content:""}.fa-satellite:before{content:""}.fa-satellite-dish:before{content:""}.fa-sausage:before{content:""}.fa-save:before{content:""}.fa-save-circle-arrow-right:before{content:""}.fa-save-circle-xmark:before,.fa-save-times:before{content:""}.fa-sax-hot:before{content:""}.fa-saxophone:before{content:""}.fa-saxophone-fire:before{content:""}.fa-scale-balanced:before{content:""}.fa-scale-unbalanced:before{content:""}.fa-scale-unbalanced-flip:before{content:""}.fa-scalpel:before{content:""}.fa-scalpel-line-dashed:before,.fa-scalpel-path:before{content:""}.fa-scanner:before,.fa-scanner-gun:before{content:""}.fa-scanner-image:before{content:""}.fa-scanner-keyboard:before{content:""}.fa-scanner-touchscreen:before{content:""}.fa-scarecrow:before{content:""}.fa-scarf:before{content:""}.fa-school:before{content:""}.fa-school-circle-check:before{content:""}.fa-school-circle-exclamation:before{content:""}.fa-school-circle-xmark:before{content:""}.fa-school-flag:before{content:""}.fa-school-lock:before{content:""}.fa-scissors:before{content:""}.fa-screen-users:before{content:""}.fa-screencast:before{content:""}.fa-screenshot:before{content:""}.fa-screwdriver:before{content:""}.fa-screwdriver-wrench:before{content:""}.fa-scribble:before{content:""}.fa-scroll:before{content:""}.fa-scroll-old:before{content:""}.fa-scroll-ribbon:before{content:""}.fa-scroll-torah:before{content:""}.fa-scrubber:before{content:""}.fa-scythe:before{content:""}.fa-sd-card:before{content:""}.fa-sd-cards:before{content:""}.fa-seal:before{content:""}.fa-seal-exclamation:before{content:""}.fa-seal-question:before{content:""}.fa-search:before{content:""}.fa-search-dollar:before{content:""}.fa-search-location:before{content:""}.fa-search-minus:before{content:""}.fa-search-plus:before{content:""}.fa-seat-airline:before{content:""}.fa-section:before{content:""}.fa-seedling:before{content:""}.fa-semicolon:before{content:";"}.fa-send:before{content:""}.fa-send-back:before{content:""}.fa-send-backward:before{content:""}.fa-sensor:before{content:""}.fa-sensor-alert:before{content:""}.fa-sensor-cloud:before{content:""}.fa-sensor-fire:before{content:""}.fa-sensor-on:before{content:""}.fa-sensor-smoke:before{content:""}.fa-sensor-triangle-exclamation:before{content:""}.fa-server:before{content:""}.fa-shapes:before{content:""}.fa-share:before{content:""}.fa-share-all:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-share-from-square:before{content:""}.fa-share-nodes:before{content:""}.fa-share-square:before{content:""}.fa-sheep:before{content:""}.fa-sheet-plastic:before{content:""}.fa-shekel:before,.fa-shekel-sign:before{content:""}.fa-shelves:before{content:""}.fa-shelves-empty:before{content:""}.fa-sheqel:before,.fa-sheqel-sign:before{content:""}.fa-shield:before{content:""}.fa-shield-alt:before{content:""}.fa-shield-blank:before{content:""}.fa-shield-cat:before{content:""}.fa-shield-check:before{content:""}.fa-shield-cross:before{content:""}.fa-shield-dog:before{content:""}.fa-shield-exclamation:before{content:""}.fa-shield-halved:before{content:""}.fa-shield-heart:before{content:""}.fa-shield-keyhole:before{content:""}.fa-shield-minus:before{content:""}.fa-shield-plus:before{content:""}.fa-shield-quartered:before{content:""}.fa-shield-slash:before{content:""}.fa-shield-times:before{content:""}.fa-shield-virus:before{content:""}.fa-shield-xmark:before{content:""}.fa-ship:before{content:""}.fa-shipping-fast:before{content:""}.fa-shipping-timed:before{content:""}.fa-shirt:before{content:""}.fa-shirt-long-sleeve:before{content:""}.fa-shirt-running:before{content:""}.fa-shirt-tank-top:before{content:""}.fa-shish-kebab:before{content:""}.fa-shoe-prints:before{content:""}.fa-shop:before{content:""}.fa-shop-lock:before{content:""}.fa-shop-slash:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-shopping-basket-alt:before{content:""}.fa-shopping-cart:before{content:""}.fa-shortcake:before{content:""}.fa-shovel:before{content:""}.fa-shovel-snow:before{content:""}.fa-shower:before{content:""}.fa-shower-alt:before,.fa-shower-down:before{content:""}.fa-shredder:before{content:""}.fa-shrimp:before{content:""}.fa-shuffle:before{content:""}.fa-shutters:before{content:""}.fa-shuttle-space:before{content:""}.fa-shuttle-van:before{content:""}.fa-shuttlecock:before{content:""}.fa-sickle:before{content:""}.fa-sidebar:before{content:""}.fa-sidebar-flip:before{content:""}.fa-sigma:before{content:""}.fa-sign:before,.fa-sign-hanging:before{content:""}.fa-sign-in:before{content:""}.fa-sign-in-alt:before{content:""}.fa-sign-language:before{content:""}.fa-sign-out:before{content:""}.fa-sign-out-alt:before{content:""}.fa-sign-post:before{content:""}.fa-sign-posts:before{content:""}.fa-sign-posts-wrench:before{content:""}.fa-signal:before{content:""}.fa-signal-1:before{content:""}.fa-signal-2:before{content:""}.fa-signal-3:before{content:""}.fa-signal-4:before{content:""}.fa-signal-5:before{content:""}.fa-signal-alt:before{content:""}.fa-signal-alt-1:before{content:""}.fa-signal-alt-2:before{content:""}.fa-signal-alt-3:before{content:""}.fa-signal-alt-4:before{content:""}.fa-signal-alt-slash:before{content:""}.fa-signal-bars:before{content:""}.fa-signal-bars-fair:before{content:""}.fa-signal-bars-good:before{content:""}.fa-signal-bars-slash:before{content:""}.fa-signal-bars-strong:before{content:""}.fa-signal-bars-weak:before{content:""}.fa-signal-fair:before{content:""}.fa-signal-good:before{content:""}.fa-signal-perfect:before{content:""}.fa-signal-slash:before{content:""}.fa-signal-stream:before{content:""}.fa-signal-stream-slash:before{content:""}.fa-signal-strong:before{content:""}.fa-signal-weak:before{content:""}.fa-signature:before{content:""}.fa-signature-lock:before{content:""}.fa-signature-slash:before{content:""}.fa-signing:before{content:""}.fa-signs-post:before{content:""}.fa-sim-card:before{content:""}.fa-sim-cards:before{content:""}.fa-sink:before{content:""}.fa-siren:before{content:""}.fa-siren-on:before{content:""}.fa-sitemap:before{content:""}.fa-skating:before{content:""}.fa-skeleton:before{content:""}.fa-skeleton-ribs:before{content:""}.fa-ski-boot:before{content:""}.fa-ski-boot-ski:before{content:""}.fa-ski-jump:before{content:""}.fa-ski-lift:before{content:""}.fa-skiing:before{content:""}.fa-skiing-nordic:before{content:""}.fa-skull:before{content:""}.fa-skull-cow:before{content:""}.fa-skull-crossbones:before{content:""}.fa-slash:before{content:""}.fa-slash-back:before{content:"\\"}.fa-slash-forward:before{content:"/"}.fa-sledding:before{content:""}.fa-sleigh:before{content:""}.fa-slider:before{content:""}.fa-sliders:before,.fa-sliders-h:before{content:""}.fa-sliders-h-square:before{content:""}.fa-sliders-simple:before{content:""}.fa-sliders-up:before,.fa-sliders-v:before{content:""}.fa-sliders-v-square:before{content:""}.fa-slot-machine:before{content:""}.fa-smile:before{content:""}.fa-smile-beam:before{content:""}.fa-smile-plus:before{content:""}.fa-smile-wink:before{content:""}.fa-smog:before{content:""}.fa-smoke:before{content:""}.fa-smoking:before{content:""}.fa-smoking-ban:before{content:""}.fa-sms:before{content:""}.fa-snake:before{content:""}.fa-snooze:before{content:""}.fa-snow-blowing:before{content:""}.fa-snowboarding:before{content:""}.fa-snowflake:before{content:""}.fa-snowflake-droplets:before{content:""}.fa-snowflakes:before{content:""}.fa-snowman:before{content:""}.fa-snowman-head:before{content:""}.fa-snowmobile:before{content:""}.fa-snowplow:before{content:""}.fa-soap:before{content:""}.fa-soccer-ball:before{content:""}.fa-socks:before{content:""}.fa-soft-serve:before{content:""}.fa-solar-panel:before{content:""}.fa-solar-system:before{content:""}.fa-sort:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-alpha-down:before{content:""}.fa-sort-alpha-down-alt:before{content:""}.fa-sort-alpha-up:before{content:""}.fa-sort-alpha-up-alt:before{content:""}.fa-sort-alt:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-amount-down:before{content:""}.fa-sort-amount-down-alt:before{content:""}.fa-sort-amount-up:before{content:""}.fa-sort-amount-up-alt:before{content:""}.fa-sort-asc:before{content:""}.fa-sort-circle:before{content:""}.fa-sort-circle-down:before{content:""}.fa-sort-circle-up:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-sort-numeric-down:before{content:""}.fa-sort-numeric-down-alt:before{content:""}.fa-sort-numeric-up:before{content:""}.fa-sort-numeric-up-alt:before{content:""}.fa-sort-shapes-down:before{content:""}.fa-sort-shapes-down-alt:before{content:""}.fa-sort-shapes-up:before{content:""}.fa-sort-shapes-up-alt:before{content:""}.fa-sort-size-down:before{content:""}.fa-sort-size-down-alt:before{content:""}.fa-sort-size-up:before{content:""}.fa-sort-size-up-alt:before{content:""}.fa-sort-up:before{content:""}.fa-sort-up-down:before{content:""}.fa-soup:before{content:""}.fa-spa:before{content:""}.fa-space-shuttle:before{content:""}.fa-space-station-moon:before{content:""}.fa-space-station-moon-alt:before,.fa-space-station-moon-construction:before{content:""}.fa-spade:before{content:""}.fa-spaghetti-monster-flying:before{content:""}.fa-sparkle:before{content:""}.fa-sparkles:before{content:""}.fa-speaker:before{content:""}.fa-speakers:before{content:""}.fa-spell-check:before{content:""}.fa-spider:before{content:""}.fa-spider-black-widow:before{content:""}.fa-spider-web:before{content:""}.fa-spinner:before{content:""}.fa-spinner-scale:before{content:""}.fa-spinner-third:before{content:""}.fa-split:before{content:""}.fa-splotch:before{content:""}.fa-spoon:before{content:""}.fa-sportsball:before{content:""}.fa-spray-can:before{content:""}.fa-spray-can-sparkles:before{content:""}.fa-sprinkler:before{content:""}.fa-sprinkler-ceiling:before{content:""}.fa-sprout:before{content:""}.fa-square:before{content:""}.fa-square-0:before{content:""}.fa-square-1:before{content:""}.fa-square-2:before{content:""}.fa-square-3:before{content:""}.fa-square-4:before{content:""}.fa-square-5:before{content:""}.fa-square-6:before{content:""}.fa-square-7:before{content:""}.fa-square-8:before{content:""}.fa-square-9:before{content:""}.fa-square-a:before{content:""}.fa-square-a-lock:before{content:""}.fa-square-ampersand:before{content:""}.fa-square-arrow-down:before{content:""}.fa-square-arrow-down-left:before{content:""}.fa-square-arrow-down-right:before{content:""}.fa-square-arrow-left:before{content:""}.fa-square-arrow-right:before{content:""}.fa-square-arrow-up:before{content:""}.fa-square-arrow-up-left:before{content:""}.fa-square-arrow-up-right:before{content:""}.fa-square-b:before{content:""}.fa-square-bolt:before{content:""}.fa-square-c:before{content:""}.fa-square-caret-down:before{content:""}.fa-square-caret-left:before{content:""}.fa-square-caret-right:before{content:""}.fa-square-caret-up:before{content:""}.fa-square-check:before{content:""}.fa-square-chevron-down:before{content:""}.fa-square-chevron-left:before{content:""}.fa-square-chevron-right:before{content:""}.fa-square-chevron-up:before{content:""}.fa-square-code:before{content:""}.fa-square-d:before{content:""}.fa-square-dashed:before{content:""}.fa-square-dashed-circle-plus:before{content:""}.fa-square-divide:before{content:""}.fa-square-dollar:before{content:""}.fa-square-down:before{content:""}.fa-square-down-left:before{content:""}.fa-square-down-right:before{content:""}.fa-square-e:before{content:""}.fa-square-ellipsis:before{content:""}.fa-square-ellipsis-vertical:before{content:""}.fa-square-envelope:before{content:""}.fa-square-exclamation:before{content:""}.fa-square-f:before{content:""}.fa-square-fragile:before{content:""}.fa-square-full:before{content:""}.fa-square-g:before{content:""}.fa-square-h:before{content:""}.fa-square-heart:before{content:""}.fa-square-i:before{content:""}.fa-square-info:before{content:""}.fa-square-j:before{content:""}.fa-square-k:before{content:""}.fa-square-kanban:before{content:""}.fa-square-l:before{content:""}.fa-square-left:before{content:""}.fa-square-list:before{content:""}.fa-square-m:before{content:""}.fa-square-minus:before{content:""}.fa-square-n:before{content:""}.fa-square-nfi:before{content:""}.fa-square-o:before{content:""}.fa-square-p:before{content:""}.fa-square-parking:before{content:""}.fa-square-parking-slash:before{content:""}.fa-square-pen:before{content:""}.fa-square-person-confined:before{content:""}.fa-square-phone:before{content:""}.fa-square-phone-flip:before{content:""}.fa-square-phone-hangup:before{content:""}.fa-square-plus:before{content:""}.fa-square-poll-horizontal:before{content:""}.fa-square-poll-vertical:before{content:""}.fa-square-q:before{content:""}.fa-square-quarters:before{content:""}.fa-square-question:before{content:""}.fa-square-quote:before{content:""}.fa-square-r:before{content:""}.fa-square-right:before{content:""}.fa-square-ring:before{content:""}.fa-square-root:before{content:""}.fa-square-root-alt:before,.fa-square-root-variable:before{content:""}.fa-square-rss:before{content:""}.fa-square-s:before{content:""}.fa-square-share-nodes:before{content:""}.fa-square-sliders:before{content:""}.fa-square-sliders-vertical:before{content:""}.fa-square-small:before{content:""}.fa-square-star:before{content:""}.fa-square-t:before{content:""}.fa-square-terminal:before{content:""}.fa-square-this-way-up:before{content:""}.fa-square-u:before{content:""}.fa-square-up:before{content:""}.fa-square-up-left:before{content:""}.fa-square-up-right:before{content:""}.fa-square-user:before{content:""}.fa-square-v:before{content:""}.fa-square-virus:before{content:""}.fa-square-w:before{content:""}.fa-square-wine-glass-crack:before{content:""}.fa-square-x:before{content:""}.fa-square-xmark:before{content:""}.fa-square-y:before{content:""}.fa-square-z:before{content:""}.fa-squid:before{content:""}.fa-squirrel:before{content:""}.fa-staff:before{content:""}.fa-staff-aesculapius:before,.fa-staff-snake:before{content:""}.fa-stairs:before{content:""}.fa-stamp:before{content:""}.fa-standard-definition:before{content:""}.fa-stapler:before{content:""}.fa-star:before{content:""}.fa-star-and-crescent:before{content:""}.fa-star-christmas:before{content:""}.fa-star-circle:before{content:""}.fa-star-exclamation:before{content:""}.fa-star-half:before{content:""}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:""}.fa-star-of-david:before{content:""}.fa-star-of-life:before{content:""}.fa-star-sharp:before{content:""}.fa-star-sharp-half:before{content:""}.fa-star-sharp-half-alt:before,.fa-star-sharp-half-stroke:before{content:""}.fa-star-shooting:before{content:""}.fa-starfighter:before{content:""}.fa-starfighter-alt:before{content:""}.fa-starfighter-alt-advanced:before{content:""}.fa-starfighter-twin-ion-engine:before{content:""}.fa-starfighter-twin-ion-engine-advanced:before{content:""}.fa-stars:before{content:""}.fa-starship:before{content:""}.fa-starship-freighter:before{content:""}.fa-steak:before{content:""}.fa-steering-wheel:before{content:""}.fa-step-backward:before{content:""}.fa-step-forward:before{content:""}.fa-sterling-sign:before{content:""}.fa-stethoscope:before{content:""}.fa-sticky-note:before{content:""}.fa-stocking:before{content:""}.fa-stomach:before{content:""}.fa-stop:before{content:""}.fa-stop-circle:before{content:""}.fa-stopwatch:before{content:""}.fa-stopwatch-20:before{content:""}.fa-store:before{content:""}.fa-store-alt:before{content:""}.fa-store-alt-slash:before{content:""}.fa-store-lock:before{content:""}.fa-store-slash:before{content:""}.fa-strawberry:before{content:""}.fa-stream:before{content:""}.fa-street-view:before{content:""}.fa-stretcher:before{content:""}.fa-strikethrough:before{content:""}.fa-stroopwafel:before{content:""}.fa-subscript:before{content:""}.fa-subtitles:before{content:""}.fa-subtitles-slash:before{content:""}.fa-subtract:before{content:""}.fa-subway:before{content:""}.fa-subway-tunnel:before{content:""}.fa-suitcase:before{content:""}.fa-suitcase-medical:before{content:""}.fa-suitcase-rolling:before{content:""}.fa-sun:before{content:""}.fa-sun-alt:before,.fa-sun-bright:before{content:""}.fa-sun-cloud:before{content:""}.fa-sun-dust:before{content:""}.fa-sun-haze:before{content:""}.fa-sun-plant-wilt:before{content:""}.fa-sunglasses:before{content:""}.fa-sunrise:before{content:""}.fa-sunset:before{content:""}.fa-superscript:before{content:""}.fa-surprise:before{content:""}.fa-sushi:before{content:""}.fa-sushi-roll:before{content:""}.fa-swap:before{content:""}.fa-swap-arrows:before{content:""}.fa-swatchbook:before{content:""}.fa-swimmer:before{content:""}.fa-swimming-pool:before{content:""}.fa-sword:before{content:""}.fa-sword-laser:before{content:""}.fa-sword-laser-alt:before{content:""}.fa-swords:before{content:""}.fa-swords-laser:before{content:""}.fa-symbols:before{content:""}.fa-synagogue:before{content:""}.fa-sync:before{content:""}.fa-sync-alt:before{content:""}.fa-syringe:before{content:""}.fa-t:before{content:"T"}.fa-t-rex:before{content:""}.fa-t-shirt:before{content:""}.fa-table:before{content:""}.fa-table-cells:before{content:""}.fa-table-cells-column-lock:before{content:""}.fa-table-cells-column-unlock:before{content:""}.fa-table-cells-large:before{content:""}.fa-table-cells-lock:before{content:""}.fa-table-cells-row-lock:before{content:""}.fa-table-cells-row-unlock:before{content:""}.fa-table-cells-unlock:before{content:""}.fa-table-columns:before{content:""}.fa-table-layout:before{content:""}.fa-table-list:before{content:""}.fa-table-picnic:before{content:""}.fa-table-pivot:before{content:""}.fa-table-rows:before{content:""}.fa-table-tennis:before,.fa-table-tennis-paddle-ball:before{content:""}.fa-table-tree:before{content:""}.fa-tablet:before{content:""}.fa-tablet-alt:before{content:""}.fa-tablet-android:before{content:""}.fa-tablet-android-alt:before{content:""}.fa-tablet-button:before{content:""}.fa-tablet-rugged:before{content:""}.fa-tablet-screen:before{content:""}.fa-tablet-screen-button:before{content:""}.fa-tablets:before{content:""}.fa-tachograph-digital:before{content:""}.fa-tachometer:before{content:""}.fa-tachometer-alt:before{content:""}.fa-tachometer-alt-average:before{content:""}.fa-tachometer-alt-fast:before{content:""}.fa-tachometer-alt-fastest:before{content:""}.fa-tachometer-alt-slow:before{content:""}.fa-tachometer-alt-slowest:before{content:""}.fa-tachometer-average:before{content:""}.fa-tachometer-fast:before{content:""}.fa-tachometer-fastest:before{content:""}.fa-tachometer-slow:before{content:""}.fa-tachometer-slowest:before{content:""}.fa-taco:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-tally:before{content:""}.fa-tally-1:before{content:""}.fa-tally-2:before{content:""}.fa-tally-3:before{content:""}.fa-tally-4:before{content:""}.fa-tally-5:before{content:""}.fa-tamale:before{content:""}.fa-tanakh:before{content:""}.fa-tank-water:before{content:""}.fa-tape:before{content:""}.fa-tarp:before{content:""}.fa-tarp-droplet:before{content:""}.fa-tasks:before{content:""}.fa-tasks-alt:before{content:""}.fa-taxi:before{content:""}.fa-taxi-bus:before{content:""}.fa-teddy-bear:before{content:""}.fa-teeth:before{content:""}.fa-teeth-open:before{content:""}.fa-telescope:before{content:""}.fa-teletype:before{content:""}.fa-teletype-answer:before{content:""}.fa-television:before{content:""}.fa-temperature-0:before{content:""}.fa-temperature-1:before{content:""}.fa-temperature-2:before{content:""}.fa-temperature-3:before{content:""}.fa-temperature-4:before{content:""}.fa-temperature-arrow-down:before{content:""}.fa-temperature-arrow-up:before{content:""}.fa-temperature-down:before{content:""}.fa-temperature-empty:before{content:""}.fa-temperature-frigid:before{content:""}.fa-temperature-full:before{content:""}.fa-temperature-half:before{content:""}.fa-temperature-high:before{content:""}.fa-temperature-hot:before{content:""}.fa-temperature-list:before{content:""}.fa-temperature-low:before{content:""}.fa-temperature-quarter:before{content:""}.fa-temperature-snow:before{content:""}.fa-temperature-sun:before{content:""}.fa-temperature-three-quarters:before{content:""}.fa-temperature-up:before{content:""}.fa-tenge:before,.fa-tenge-sign:before{content:""}.fa-tennis-ball:before{content:""}.fa-tent:before{content:""}.fa-tent-arrow-down-to-line:before{content:""}.fa-tent-arrow-left-right:before{content:""}.fa-tent-arrow-turn-left:before{content:""}.fa-tent-arrows-down:before{content:""}.fa-tent-double-peak:before{content:""}.fa-tents:before{content:""}.fa-terminal:before{content:""}.fa-text:before{content:""}.fa-text-height:before{content:""}.fa-text-size:before{content:""}.fa-text-slash:before{content:""}.fa-text-width:before{content:""}.fa-th:before{content:""}.fa-th-large:before{content:""}.fa-th-list:before{content:""}.fa-theater-masks:before{content:""}.fa-thermometer:before{content:""}.fa-thermometer-0:before{content:""}.fa-thermometer-1:before{content:""}.fa-thermometer-2:before{content:""}.fa-thermometer-3:before{content:""}.fa-thermometer-4:before{content:""}.fa-thermometer-empty:before{content:""}.fa-thermometer-full:before{content:""}.fa-thermometer-half:before{content:""}.fa-thermometer-quarter:before{content:""}.fa-thermometer-three-quarters:before{content:""}.fa-theta:before{content:""}.fa-thought-bubble:before{content:""}.fa-thumb-tack:before{content:""}.fa-thumb-tack-slash:before{content:""}.fa-thumbs-down:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbtack:before{content:""}.fa-thumbtack-slash:before{content:""}.fa-thunderstorm:before{content:""}.fa-thunderstorm-moon:before{content:""}.fa-thunderstorm-sun:before{content:""}.fa-tick:before{content:""}.fa-ticket:before{content:""}.fa-ticket-airline:before{content:""}.fa-ticket-alt:before{content:""}.fa-ticket-perforated:before{content:""}.fa-ticket-perforated-plane:before,.fa-ticket-plane:before{content:""}.fa-ticket-simple:before{content:""}.fa-tickets:before{content:""}.fa-tickets-airline:before{content:""}.fa-tickets-perforated:before{content:""}.fa-tickets-perforated-plane:before,.fa-tickets-plane:before{content:""}.fa-tickets-simple:before{content:""}.fa-tilde:before{content:"~"}.fa-timeline:before{content:""}.fa-timeline-arrow:before{content:""}.fa-timer:before{content:""}.fa-times:before{content:""}.fa-times-circle:before{content:""}.fa-times-hexagon:before{content:""}.fa-times-octagon:before{content:""}.fa-times-rectangle:before{content:""}.fa-times-square:before{content:""}.fa-times-to-slot:before{content:""}.fa-tint:before{content:""}.fa-tint-slash:before{content:""}.fa-tire:before{content:""}.fa-tire-flat:before{content:""}.fa-tire-pressure-warning:before{content:""}.fa-tire-rugged:before{content:""}.fa-tired:before{content:""}.fa-toggle-large-off:before{content:""}.fa-toggle-large-on:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-toilet:before{content:""}.fa-toilet-paper:before{content:""}.fa-toilet-paper-alt:before,.fa-toilet-paper-blank:before{content:""}.fa-toilet-paper-blank-under:before{content:""}.fa-toilet-paper-check:before{content:""}.fa-toilet-paper-reverse:before{content:""}.fa-toilet-paper-reverse-alt:before{content:""}.fa-toilet-paper-reverse-slash:before{content:""}.fa-toilet-paper-slash:before{content:""}.fa-toilet-paper-under:before{content:""}.fa-toilet-paper-under-slash:before{content:""}.fa-toilet-paper-xmark:before{content:""}.fa-toilet-portable:before{content:""}.fa-toilets-portable:before{content:""}.fa-tomato:before{content:""}.fa-tombstone:before{content:""}.fa-tombstone-alt:before,.fa-tombstone-blank:before{content:""}.fa-toolbox:before{content:""}.fa-tools:before{content:""}.fa-tooth:before{content:""}.fa-toothbrush:before{content:""}.fa-torah:before{content:""}.fa-torii-gate:before{content:""}.fa-tornado:before{content:""}.fa-tower-broadcast:before{content:""}.fa-tower-cell:before{content:""}.fa-tower-control:before{content:""}.fa-tower-observation:before{content:""}.fa-tractor:before{content:""}.fa-trademark:before{content:""}.fa-traffic-cone:before{content:""}.fa-traffic-light:before{content:""}.fa-traffic-light-go:before{content:""}.fa-traffic-light-slow:before{content:""}.fa-traffic-light-stop:before{content:""}.fa-trailer:before{content:""}.fa-train:before{content:""}.fa-train-subway:before{content:""}.fa-train-subway-tunnel:before{content:""}.fa-train-track:before{content:""}.fa-train-tram:before{content:""}.fa-train-tunnel:before{content:""}.fa-tram:before{content:""}.fa-transformer-bolt:before{content:""}.fa-transgender:before,.fa-transgender-alt:before{content:""}.fa-transporter:before{content:""}.fa-transporter-1:before{content:""}.fa-transporter-2:before{content:""}.fa-transporter-3:before{content:""}.fa-transporter-4:before{content:""}.fa-transporter-5:before{content:""}.fa-transporter-6:before{content:""}.fa-transporter-7:before{content:""}.fa-transporter-empty:before{content:""}.fa-trash:before{content:""}.fa-trash-alt:before{content:""}.fa-trash-alt-slash:before{content:""}.fa-trash-arrow-turn-left:before{content:""}.fa-trash-arrow-up:before{content:""}.fa-trash-can:before{content:""}.fa-trash-can-arrow-turn-left:before{content:""}.fa-trash-can-arrow-up:before{content:""}.fa-trash-can-check:before{content:""}.fa-trash-can-clock:before{content:""}.fa-trash-can-list:before{content:""}.fa-trash-can-plus:before{content:""}.fa-trash-can-slash:before{content:""}.fa-trash-can-undo:before{content:""}.fa-trash-can-xmark:before{content:""}.fa-trash-check:before{content:""}.fa-trash-circle:before{content:""}.fa-trash-clock:before{content:""}.fa-trash-list:before{content:""}.fa-trash-plus:before{content:""}.fa-trash-restore:before{content:""}.fa-trash-restore-alt:before{content:""}.fa-trash-slash:before{content:""}.fa-trash-undo:before{content:""}.fa-trash-undo-alt:before{content:""}.fa-trash-xmark:before{content:""}.fa-treasure-chest:before{content:""}.fa-tree:before{content:""}.fa-tree-alt:before{content:""}.fa-tree-christmas:before{content:""}.fa-tree-city:before{content:""}.fa-tree-deciduous:before{content:""}.fa-tree-decorated:before{content:""}.fa-tree-large:before{content:""}.fa-tree-palm:before{content:""}.fa-trees:before{content:""}.fa-trian-balbot:before{content:""}.fa-triangle:before{content:""}.fa-triangle-circle-square:before{content:""}.fa-triangle-exclamation:before{content:""}.fa-triangle-instrument:before,.fa-triangle-music:before{content:""}.fa-triangle-person-digging:before{content:""}.fa-tricycle:before{content:""}.fa-tricycle-adult:before{content:""}.fa-trillium:before{content:""}.fa-trophy:before{content:""}.fa-trophy-alt:before,.fa-trophy-star:before{content:""}.fa-trowel:before{content:""}.fa-trowel-bricks:before{content:""}.fa-truck:before{content:""}.fa-truck-arrow-right:before{content:""}.fa-truck-bolt:before{content:""}.fa-truck-clock:before{content:""}.fa-truck-container:before{content:""}.fa-truck-container-empty:before{content:""}.fa-truck-couch:before{content:""}.fa-truck-droplet:before{content:""}.fa-truck-fast:before{content:""}.fa-truck-field:before{content:""}.fa-truck-field-un:before{content:""}.fa-truck-fire:before{content:""}.fa-truck-flatbed:before{content:""}.fa-truck-front:before{content:""}.fa-truck-ladder:before{content:""}.fa-truck-loading:before{content:""}.fa-truck-medical:before{content:""}.fa-truck-monster:before{content:""}.fa-truck-moving:before{content:""}.fa-truck-pickup:before{content:""}.fa-truck-plane:before{content:""}.fa-truck-plow:before{content:""}.fa-truck-ramp:before{content:""}.fa-truck-ramp-box:before{content:""}.fa-truck-ramp-couch:before{content:""}.fa-truck-tow:before{content:""}.fa-truck-utensils:before{content:""}.fa-trumpet:before{content:""}.fa-try:before{content:""}.fa-tshirt:before{content:""}.fa-tty:before{content:""}.fa-tty-answer:before{content:""}.fa-tugrik-sign:before{content:""}.fa-turkey:before{content:""}.fa-turkish-lira:before,.fa-turkish-lira-sign:before{content:""}.fa-turn-down:before{content:""}.fa-turn-down-left:before{content:""}.fa-turn-down-right:before{content:""}.fa-turn-left:before{content:""}.fa-turn-left-down:before{content:""}.fa-turn-left-up:before{content:""}.fa-turn-right:before{content:""}.fa-turn-up:before{content:""}.fa-turntable:before{content:""}.fa-turtle:before{content:""}.fa-tv:before,.fa-tv-alt:before{content:""}.fa-tv-music:before{content:""}.fa-tv-retro:before{content:""}.fa-typewriter:before{content:""}.fa-u:before{content:"U"}.fa-ufo:before{content:""}.fa-ufo-beam:before{content:""}.fa-umbrella:before{content:""}.fa-umbrella-alt:before{content:""}.fa-umbrella-beach:before{content:""}.fa-umbrella-simple:before{content:""}.fa-underline:before{content:""}.fa-undo:before{content:""}.fa-undo-alt:before{content:""}.fa-unicorn:before{content:""}.fa-uniform-martial-arts:before{content:""}.fa-union:before{content:""}.fa-universal-access:before{content:""}.fa-university:before{content:""}.fa-unlink:before{content:""}.fa-unlock:before{content:""}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:""}.fa-unsorted:before{content:""}.fa-up:before{content:""}.fa-up-down:before{content:""}.fa-up-down-left-right:before{content:""}.fa-up-from-bracket:before{content:""}.fa-up-from-dotted-line:before{content:""}.fa-up-from-line:before{content:""}.fa-up-left:before{content:""}.fa-up-long:before{content:""}.fa-up-right:before{content:""}.fa-up-right-and-down-left-from-center:before{content:""}.fa-up-right-from-square:before{content:""}.fa-up-to-bracket:before{content:""}.fa-up-to-dotted-line:before{content:""}.fa-up-to-line:before{content:""}.fa-upload:before{content:""}.fa-usb-drive:before{content:""}.fa-usd:before{content:"$"}.fa-usd-circle:before{content:""}.fa-usd-square:before{content:""}.fa-user:before{content:""}.fa-user-alien:before{content:""}.fa-user-alt:before{content:""}.fa-user-alt-slash:before{content:""}.fa-user-astronaut:before{content:""}.fa-user-beard-bolt:before{content:""}.fa-user-bounty-hunter:before{content:""}.fa-user-chart:before{content:""}.fa-user-check:before{content:""}.fa-user-chef:before{content:""}.fa-user-circle:before{content:""}.fa-user-clock:before{content:""}.fa-user-cog:before{content:""}.fa-user-construction:before{content:""}.fa-user-cowboy:before{content:""}.fa-user-crown:before{content:""}.fa-user-doctor:before{content:""}.fa-user-doctor-hair:before{content:""}.fa-user-doctor-hair-long:before{content:""}.fa-user-doctor-message:before{content:""}.fa-user-edit:before{content:""}.fa-user-friends:before{content:""}.fa-user-gear:before{content:""}.fa-user-graduate:before{content:""}.fa-user-group:before{content:""}.fa-user-group-crown:before{content:""}.fa-user-group-simple:before{content:""}.fa-user-hair:before{content:""}.fa-user-hair-buns:before{content:""}.fa-user-hair-long:before{content:""}.fa-user-hair-mullet:before{content:""}.fa-user-hard-hat:before{content:""}.fa-user-headset:before{content:""}.fa-user-helmet-safety:before{content:""}.fa-user-hoodie:before{content:""}.fa-user-injured:before{content:""}.fa-user-large:before{content:""}.fa-user-large-slash:before{content:""}.fa-user-lock:before{content:""}.fa-user-magnifying-glass:before{content:""}.fa-user-md:before{content:""}.fa-user-md-chat:before{content:""}.fa-user-minus:before{content:""}.fa-user-music:before{content:""}.fa-user-ninja:before{content:""}.fa-user-nurse:before{content:""}.fa-user-nurse-hair:before{content:""}.fa-user-nurse-hair-long:before{content:""}.fa-user-pen:before{content:""}.fa-user-pilot:before{content:""}.fa-user-pilot-tie:before{content:""}.fa-user-plus:before{content:""}.fa-user-police:before{content:""}.fa-user-police-tie:before{content:""}.fa-user-robot:before{content:""}.fa-user-robot-xmarks:before{content:""}.fa-user-secret:before{content:""}.fa-user-shakespeare:before{content:""}.fa-user-shield:before{content:""}.fa-user-slash:before{content:""}.fa-user-tag:before{content:""}.fa-user-tie:before{content:""}.fa-user-tie-hair:before{content:""}.fa-user-tie-hair-long:before{content:""}.fa-user-times:before{content:""}.fa-user-unlock:before{content:""}.fa-user-visor:before{content:""}.fa-user-vneck:before{content:""}.fa-user-vneck-hair:before{content:""}.fa-user-vneck-hair-long:before{content:""}.fa-user-xmark:before{content:""}.fa-users:before{content:""}.fa-users-between-lines:before{content:""}.fa-users-class:before{content:""}.fa-users-cog:before{content:""}.fa-users-crown:before{content:""}.fa-users-gear:before{content:""}.fa-users-line:before{content:""}.fa-users-medical:before{content:""}.fa-users-rays:before{content:""}.fa-users-rectangle:before{content:""}.fa-users-slash:before{content:""}.fa-users-viewfinder:before{content:""}.fa-utensil-fork:before{content:""}.fa-utensil-knife:before{content:""}.fa-utensil-spoon:before{content:""}.fa-utensils:before{content:""}.fa-utensils-alt:before{content:""}.fa-utensils-slash:before{content:""}.fa-utility-pole:before{content:""}.fa-utility-pole-double:before{content:""}.fa-v:before{content:"V"}.fa-vacuum:before{content:""}.fa-vacuum-robot:before{content:""}.fa-value-absolute:before{content:""}.fa-van-shuttle:before{content:""}.fa-vault:before{content:""}.fa-vcard:before{content:""}.fa-vector-circle:before{content:""}.fa-vector-polygon:before{content:""}.fa-vector-square:before{content:""}.fa-vent-damper:before{content:""}.fa-venus:before{content:""}.fa-venus-double:before{content:""}.fa-venus-mars:before{content:""}.fa-vest:before{content:""}.fa-vest-patches:before{content:""}.fa-vhs:before{content:""}.fa-vial:before{content:""}.fa-vial-circle-check:before{content:""}.fa-vial-virus:before{content:""}.fa-vials:before{content:""}.fa-video:before{content:""}.fa-video-arrow-down-left:before{content:""}.fa-video-arrow-up-right:before{content:""}.fa-video-camera:before{content:""}.fa-video-circle:before{content:""}.fa-video-handheld:before{content:""}.fa-video-plus:before{content:""}.fa-video-slash:before{content:""}.fa-vihara:before{content:""}.fa-violin:before{content:""}.fa-virus:before{content:""}.fa-virus-covid:before{content:""}.fa-virus-covid-slash:before{content:""}.fa-virus-slash:before{content:""}.fa-viruses:before{content:""}.fa-voicemail:before{content:""}.fa-volcano:before{content:""}.fa-volleyball:before,.fa-volleyball-ball:before{content:""}.fa-volume:before{content:""}.fa-volume-control-phone:before{content:""}.fa-volume-down:before{content:""}.fa-volume-high:before{content:""}.fa-volume-low:before{content:""}.fa-volume-medium:before{content:""}.fa-volume-mute:before{content:""}.fa-volume-off:before{content:""}.fa-volume-slash:before{content:""}.fa-volume-times:before{content:""}.fa-volume-up:before{content:""}.fa-volume-xmark:before{content:""}.fa-vote-nay:before{content:""}.fa-vote-yea:before{content:""}.fa-vr-cardboard:before{content:""}.fa-w:before{content:"W"}.fa-waffle:before{content:""}.fa-wagon-covered:before{content:""}.fa-walker:before{content:""}.fa-walkie-talkie:before{content:""}.fa-walking:before{content:""}.fa-wall-brick:before{content:""}.fa-wallet:before{content:""}.fa-wand:before{content:""}.fa-wand-magic:before{content:""}.fa-wand-magic-sparkles:before{content:""}.fa-wand-sparkles:before{content:""}.fa-warehouse:before{content:""}.fa-warehouse-alt:before,.fa-warehouse-full:before{content:""}.fa-warning:before{content:""}.fa-washer:before,.fa-washing-machine:before{content:""}.fa-watch:before{content:""}.fa-watch-apple:before{content:""}.fa-watch-calculator:before{content:""}.fa-watch-fitness:before{content:""}.fa-watch-smart:before{content:""}.fa-water:before{content:""}.fa-water-arrow-down:before{content:""}.fa-water-arrow-up:before{content:""}.fa-water-ladder:before{content:""}.fa-water-lower:before{content:""}.fa-water-rise:before{content:""}.fa-watermelon-slice:before{content:""}.fa-wave:before{content:""}.fa-wave-pulse:before{content:""}.fa-wave-sine:before{content:""}.fa-wave-square:before{content:""}.fa-wave-triangle:before{content:""}.fa-waveform:before{content:""}.fa-waveform-circle:before{content:""}.fa-waveform-lines:before,.fa-waveform-path:before{content:""}.fa-waves-sine:before{content:""}.fa-web-awesome:before{content:""}.fa-webcam:before{content:""}.fa-webcam-slash:before{content:""}.fa-webhook:before{content:""}.fa-weight:before{content:""}.fa-weight-hanging:before{content:""}.fa-weight-scale:before{content:""}.fa-whale:before{content:""}.fa-wheat:before{content:""}.fa-wheat-alt:before,.fa-wheat-awn:before{content:""}.fa-wheat-awn-circle-exclamation:before{content:""}.fa-wheat-awn-slash:before{content:""}.fa-wheat-slash:before{content:""}.fa-wheelchair:before{content:""}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:""}.fa-whiskey-glass:before{content:""}.fa-whiskey-glass-ice:before{content:""}.fa-whistle:before{content:""}.fa-wifi:before{content:""}.fa-wifi-1:before{content:""}.fa-wifi-2:before{content:""}.fa-wifi-3:before{content:""}.fa-wifi-exclamation:before{content:""}.fa-wifi-fair:before{content:""}.fa-wifi-slash:before{content:""}.fa-wifi-strong:before{content:""}.fa-wifi-weak:before{content:""}.fa-wind:before{content:""}.fa-wind-circle-exclamation:before{content:""}.fa-wind-turbine:before{content:""}.fa-wind-warning:before{content:""}.fa-window:before{content:""}.fa-window-alt:before{content:""}.fa-window-close:before{content:""}.fa-window-flip:before{content:""}.fa-window-frame:before{content:""}.fa-window-frame-open:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-windsock:before{content:""}.fa-wine-bottle:before{content:""}.fa-wine-glass:before{content:""}.fa-wine-glass-alt:before{content:""}.fa-wine-glass-crack:before{content:""}.fa-wine-glass-empty:before{content:""}.fa-won:before,.fa-won-sign:before{content:""}.fa-worm:before{content:""}.fa-wreath:before{content:""}.fa-wreath-laurel:before{content:""}.fa-wrench:before{content:""}.fa-wrench-simple:before{content:""}.fa-x:before{content:"X"}.fa-x-ray:before{content:""}.fa-xmark:before{content:""}.fa-xmark-circle:before{content:""}.fa-xmark-hexagon:before{content:""}.fa-xmark-large:before{content:""}.fa-xmark-octagon:before{content:""}.fa-xmark-square:before{content:""}.fa-xmark-to-slot:before{content:""}.fa-xmarks-lines:before{content:""}.fa-y:before{content:"Y"}.fa-yen:before,.fa-yen-sign:before{content:""}.fa-yin-yang:before{content:""}.fa-z:before{content:"Z"}.fa-zap:before{content:""}.fa-zzz:before{content:""}.sr-only,.fa-sr-only,.sr-only-focusable:not(:focus),.fa-sr-only-focusable:not(:focus){clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/light.css b/codewithrockstar.com/assets/fontawesome/css/light.css new file mode 100644 index 00000000..707849f7 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/light.css @@ -0,0 +1,19 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Pro'; + --fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro'; } + +@font-face { + font-family: 'Font Awesome 6 Pro'; + font-style: normal; + font-weight: 300; + font-display: block; + src: url("../webfonts/fa-light-300.woff2") format("woff2"), url("../webfonts/fa-light-300.ttf") format("truetype"); } + +.fal, +.fa-light { + font-weight: 300; } diff --git a/codewithrockstar.com/assets/fontawesome/css/light.min.css b/codewithrockstar.com/assets/fontawesome/css/light.min.css new file mode 100644 index 00000000..dc13054a --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/light.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:300;font-display:block;src:url(../webfonts/fa-light-300.woff2) format("woff2"),url(../webfonts/fa-light-300.ttf) format("truetype")}.fa-light,.fal{font-weight:300} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/regular.css b/codewithrockstar.com/assets/fontawesome/css/regular.css new file mode 100644 index 00000000..46d33e78 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/regular.css @@ -0,0 +1,19 @@ +/*! + * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Free'; + --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; } + +@font-face { + font-family: 'Font Awesome 6 Free'; + font-style: normal; + font-weight: 400; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } + +.far, +.fa-regular { + font-weight: 400; } diff --git a/codewithrockstar.com/assets/fontawesome/css/regular.min.css b/codewithrockstar.com/assets/fontawesome/css/regular.min.css new file mode 100644 index 00000000..2b94e444 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/regular.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/solid.css b/codewithrockstar.com/assets/fontawesome/css/solid.css new file mode 100644 index 00000000..08f8703f --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/solid.css @@ -0,0 +1,19 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Pro'; + --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Pro'; } + +@font-face { + font-family: 'Font Awesome 6 Pro'; + font-style: normal; + font-weight: 900; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +.fas, +.fa-solid { + font-weight: 900; } diff --git a/codewithrockstar.com/assets/fontawesome/css/solid.min.css b/codewithrockstar.com/assets/fontawesome/css/solid.min.css new file mode 100644 index 00000000..038c823f --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/solid.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/svg-with-js.css b/codewithrockstar.com/assets/fontawesome/css/svg-with-js.css new file mode 100644 index 00000000..91e3c469 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/svg-with-js.css @@ -0,0 +1,459 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Pro'; + --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Pro'; + --fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro'; + --fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro'; + --fa-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone'; + --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; + --fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp'; + --fa-font-sharp-regular: normal 400 1em/1 'Font Awesome 6 Sharp'; + --fa-font-sharp-light: normal 300 1em/1 'Font Awesome 6 Sharp'; + --fa-font-sharp-thin: normal 100 1em/1 'Font Awesome 6 Sharp'; + --fa-font-sharp-duotone-solid: normal 900 1em/1 'Font Awesome 6 Sharp Duotone'; } + +svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa { + overflow: visible; + box-sizing: content-box; } + +.svg-inline--fa { + display: var(--fa-display, inline-block); + height: 1em; + overflow: visible; + vertical-align: -.125em; } + .svg-inline--fa.fa-2xs { + vertical-align: 0.1em; } + .svg-inline--fa.fa-xs { + vertical-align: 0em; } + .svg-inline--fa.fa-sm { + vertical-align: -0.07143em; } + .svg-inline--fa.fa-lg { + vertical-align: -0.2em; } + .svg-inline--fa.fa-xl { + vertical-align: -0.25em; } + .svg-inline--fa.fa-2xl { + vertical-align: -0.3125em; } + .svg-inline--fa.fa-pull-left { + margin-right: var(--fa-pull-margin, 0.3em); + width: auto; } + .svg-inline--fa.fa-pull-right { + margin-left: var(--fa-pull-margin, 0.3em); + width: auto; } + .svg-inline--fa.fa-li { + width: var(--fa-li-width, 2em); + top: 0.25em; } + .svg-inline--fa.fa-fw { + width: var(--fa-fw-width, 1.25em); } + +.fa-layers svg.svg-inline--fa { + bottom: 0; + left: 0; + margin: auto; + position: absolute; + right: 0; + top: 0; } + +.fa-layers-text, .fa-layers-counter { + display: inline-block; + position: absolute; + text-align: center; } + +.fa-layers { + display: inline-block; + height: 1em; + position: relative; + text-align: center; + vertical-align: -.125em; + width: 1em; } + .fa-layers svg.svg-inline--fa { + transform-origin: center center; } + +.fa-layers-text { + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + transform-origin: center center; } + +.fa-layers-counter { + background-color: var(--fa-counter-background-color, #ff253a); + border-radius: var(--fa-counter-border-radius, 1em); + box-sizing: border-box; + color: var(--fa-inverse, #fff); + line-height: var(--fa-counter-line-height, 1); + max-width: var(--fa-counter-max-width, 5em); + min-width: var(--fa-counter-min-width, 1.5em); + overflow: hidden; + padding: var(--fa-counter-padding, 0.25em 0.5em); + right: var(--fa-right, 0); + text-overflow: ellipsis; + top: var(--fa-top, 0); + transform: scale(var(--fa-counter-scale, 0.25)); + transform-origin: top right; } + +.fa-layers-bottom-right { + bottom: var(--fa-bottom, 0); + right: var(--fa-right, 0); + top: auto; + transform: scale(var(--fa-layers-scale, 0.25)); + transform-origin: bottom right; } + +.fa-layers-bottom-left { + bottom: var(--fa-bottom, 0); + left: var(--fa-left, 0); + right: auto; + top: auto; + transform: scale(var(--fa-layers-scale, 0.25)); + transform-origin: bottom left; } + +.fa-layers-top-right { + top: var(--fa-top, 0); + right: var(--fa-right, 0); + transform: scale(var(--fa-layers-scale, 0.25)); + transform-origin: top right; } + +.fa-layers-top-left { + left: var(--fa-left, 0); + right: auto; + top: var(--fa-top, 0); + transform: scale(var(--fa-layers-scale, 0.25)); + transform-origin: top left; } + +.fa-1x { + font-size: 1em; } + +.fa-2x { + font-size: 2em; } + +.fa-3x { + font-size: 3em; } + +.fa-4x { + font-size: 4em; } + +.fa-5x { + font-size: 5em; } + +.fa-6x { + font-size: 6em; } + +.fa-7x { + font-size: 7em; } + +.fa-8x { + font-size: 8em; } + +.fa-9x { + font-size: 9em; } + +.fa-10x { + font-size: 10em; } + +.fa-2xs { + font-size: 0.625em; + line-height: 0.1em; + vertical-align: 0.225em; } + +.fa-xs { + font-size: 0.75em; + line-height: 0.08333em; + vertical-align: 0.125em; } + +.fa-sm { + font-size: 0.875em; + line-height: 0.07143em; + vertical-align: 0.05357em; } + +.fa-lg { + font-size: 1.25em; + line-height: 0.05em; + vertical-align: -0.075em; } + +.fa-xl { + font-size: 1.5em; + line-height: 0.04167em; + vertical-align: -0.125em; } + +.fa-2xl { + font-size: 2em; + line-height: 0.03125em; + vertical-align: -0.1875em; } + +.fa-fw { + text-align: center; + width: 1.25em; } + +.fa-ul { + list-style-type: none; + margin-left: var(--fa-li-margin, 2.5em); + padding-left: 0; } + .fa-ul > li { + position: relative; } + +.fa-li { + left: calc(-1 * var(--fa-li-width, 2em)); + position: absolute; + text-align: center; + width: var(--fa-li-width, 2em); + line-height: inherit; } + +.fa-border { + border-color: var(--fa-border-color, #eee); + border-radius: var(--fa-border-radius, 0.1em); + border-style: var(--fa-border-style, solid); + border-width: var(--fa-border-width, 0.08em); + padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } + +.fa-pull-left { + float: left; + margin-right: var(--fa-pull-margin, 0.3em); } + +.fa-pull-right { + float: right; + margin-left: var(--fa-pull-margin, 0.3em); } + +.fa-beat { + animation-name: fa-beat; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-bounce { + animation-name: fa-bounce; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } + +.fa-fade { + animation-name: fa-fade; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-beat-fade { + animation-name: fa-beat-fade; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } + +.fa-flip { + animation-name: fa-flip; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, ease-in-out); } + +.fa-shake { + animation-name: fa-shake; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin { + animation-name: fa-spin; + animation-delay: var(--fa-animation-delay, 0s); + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 2s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, linear); } + +.fa-spin-reverse { + --fa-animation-direction: reverse; } + +.fa-pulse, +.fa-spin-pulse { + animation-name: fa-spin; + animation-direction: var(--fa-animation-direction, normal); + animation-duration: var(--fa-animation-duration, 1s); + animation-iteration-count: var(--fa-animation-iteration-count, infinite); + animation-timing-function: var(--fa-animation-timing, steps(8)); } + +@media (prefers-reduced-motion: reduce) { + .fa-beat, + .fa-bounce, + .fa-fade, + .fa-beat-fade, + .fa-flip, + .fa-pulse, + .fa-shake, + .fa-spin, + .fa-spin-pulse { + animation-delay: -1ms; + animation-duration: 1ms; + animation-iteration-count: 1; + transition-delay: 0s; + transition-duration: 0s; } } + +@keyframes fa-beat { + 0%, 90% { + transform: scale(1); } + 45% { + transform: scale(var(--fa-beat-scale, 1.25)); } } + +@keyframes fa-bounce { + 0% { + transform: scale(1, 1) translateY(0); } + 10% { + transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } + 30% { + transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } + 50% { + transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } + 57% { + transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } + 64% { + transform: scale(1, 1) translateY(0); } + 100% { + transform: scale(1, 1) translateY(0); } } + +@keyframes fa-fade { + 50% { + opacity: var(--fa-fade-opacity, 0.4); } } + +@keyframes fa-beat-fade { + 0%, 100% { + opacity: var(--fa-beat-fade-opacity, 0.4); + transform: scale(1); } + 50% { + opacity: 1; + transform: scale(var(--fa-beat-fade-scale, 1.125)); } } + +@keyframes fa-flip { + 50% { + transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } + +@keyframes fa-shake { + 0% { + transform: rotate(-15deg); } + 4% { + transform: rotate(15deg); } + 8%, 24% { + transform: rotate(-18deg); } + 12%, 28% { + transform: rotate(18deg); } + 16% { + transform: rotate(-22deg); } + 20% { + transform: rotate(22deg); } + 32% { + transform: rotate(-12deg); } + 36% { + transform: rotate(12deg); } + 40%, 100% { + transform: rotate(0deg); } } + +@keyframes fa-spin { + 0% { + transform: rotate(0deg); } + 100% { + transform: rotate(360deg); } } + +.fa-rotate-90 { + transform: rotate(90deg); } + +.fa-rotate-180 { + transform: rotate(180deg); } + +.fa-rotate-270 { + transform: rotate(270deg); } + +.fa-flip-horizontal { + transform: scale(-1, 1); } + +.fa-flip-vertical { + transform: scale(1, -1); } + +.fa-flip-both, +.fa-flip-horizontal.fa-flip-vertical { + transform: scale(-1, -1); } + +.fa-rotate-by { + transform: rotate(var(--fa-rotate-angle, 0)); } + +.fa-stack { + display: inline-block; + vertical-align: middle; + height: 2em; + position: relative; + width: 2.5em; } + +.fa-stack-1x, +.fa-stack-2x { + bottom: 0; + left: 0; + margin: auto; + position: absolute; + right: 0; + top: 0; + z-index: var(--fa-stack-z-index, auto); } + +.svg-inline--fa.fa-stack-1x { + height: 1em; + width: 1.25em; } + +.svg-inline--fa.fa-stack-2x { + height: 2em; + width: 2.5em; } + +.fa-inverse { + color: var(--fa-inverse, #fff); } + +.sr-only, +.fa-sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + +.sr-only-focusable:not(:focus), +.fa-sr-only-focusable:not(:focus) { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; } + +.svg-inline--fa .fa-primary { + fill: var(--fa-primary-color, currentColor); + opacity: var(--fa-primary-opacity, 1); } + +.svg-inline--fa .fa-secondary { + fill: var(--fa-secondary-color, currentColor); + opacity: var(--fa-secondary-opacity, 0.4); } + +.svg-inline--fa.fa-swap-opacity .fa-primary { + opacity: var(--fa-secondary-opacity, 0.4); } + +.svg-inline--fa.fa-swap-opacity .fa-secondary { + opacity: var(--fa-primary-opacity, 1); } + +.svg-inline--fa mask .fa-primary, +.svg-inline--fa mask .fa-secondary { + fill: black; } + +.fad.fa-inverse, +.fa-duotone.fa-inverse { + color: var(--fa-inverse, #fff); } diff --git a/codewithrockstar.com/assets/fontawesome/css/svg-with-js.min.css b/codewithrockstar.com/assets/fontawesome/css/svg-with-js.min.css new file mode 100644 index 00000000..9f7e4e32 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/svg-with-js.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Pro";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Pro";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro";--fa-font-duotone:normal 900 1em/1 "Font Awesome 6 Duotone";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands";--fa-font-sharp-solid:normal 900 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-regular:normal 400 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-light:normal 300 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-thin:normal 100 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-duotone-solid:normal 900 1em/1 "Font Awesome 6 Sharp Duotone"}svg:not(:host).svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible;box-sizing:initial}.svg-inline--fa{display:var(--fa-display,inline-block);height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-2xs{vertical-align:.1em}.svg-inline--fa.fa-xs{vertical-align:0}.svg-inline--fa.fa-sm{vertical-align:-.07143em}.svg-inline--fa.fa-lg{vertical-align:-.2em}.svg-inline--fa.fa-xl{vertical-align:-.25em}.svg-inline--fa.fa-2xl{vertical-align:-.3125em}.svg-inline--fa.fa-pull-left{margin-right:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-pull-right{margin-left:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-li{width:var(--fa-li-width,2em);top:.25em}.svg-inline--fa.fa-fw{width:var(--fa-fw-width,1.25em)}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{transform-origin:center center}.fa-layers-text{left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:center center}.fa-layers-counter{background-color:var(--fa-counter-background-color,#ff253a);border-radius:var(--fa-counter-border-radius,1em);box-sizing:border-box;color:var(--fa-inverse,#fff);line-height:var(--fa-counter-line-height,1);max-width:var(--fa-counter-max-width,5em);min-width:var(--fa-counter-min-width,1.5em);overflow:hidden;padding:var(--fa-counter-padding,.25em .5em);right:var(--fa-right,0);text-overflow:ellipsis;top:var(--fa-top,0);transform:scale(var(--fa-counter-scale,.25));transform-origin:top right}.fa-layers-bottom-right{bottom:var(--fa-bottom,0);right:var(--fa-right,0);top:auto;transform:scale(var(--fa-layers-scale,.25));transform-origin:bottom right}.fa-layers-bottom-left{bottom:var(--fa-bottom,0);left:var(--fa-left,0);right:auto;top:auto;transform:scale(var(--fa-layers-scale,.25));transform-origin:bottom left}.fa-layers-top-right{top:var(--fa-top,0);right:var(--fa-right,0);transform:scale(var(--fa-layers-scale,.25));transform-origin:top right}.fa-layers-top-left{left:var(--fa-left,0);right:auto;top:var(--fa-top,0);transform:scale(var(--fa-layers-scale,.25));transform-origin:top left}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;vertical-align:middle;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0;z-index:var(--fa-stack-z-index,auto)}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:var(--fa-inverse,#fff)}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor)}.svg-inline--fa .fa-secondary,.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000}.fa-duotone.fa-inverse,.fad.fa-inverse{color:var(--fa-inverse,#fff)} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/thin.css b/codewithrockstar.com/assets/fontawesome/css/thin.css new file mode 100644 index 00000000..620a16fb --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/thin.css @@ -0,0 +1,19 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:root, :host { + --fa-style-family-classic: 'Font Awesome 6 Pro'; + --fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro'; } + +@font-face { + font-family: 'Font Awesome 6 Pro'; + font-style: normal; + font-weight: 100; + font-display: block; + src: url("../webfonts/fa-thin-100.woff2") format("woff2"), url("../webfonts/fa-thin-100.ttf") format("truetype"); } + +.fat, +.fa-thin { + font-weight: 100; } diff --git a/codewithrockstar.com/assets/fontawesome/css/thin.min.css b/codewithrockstar.com/assets/fontawesome/css/thin.min.css new file mode 100644 index 00000000..329b1032 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/thin.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Pro 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Commercial License) + * Copyright 2024 Fonticons, Inc. + */ +:host,:root{--fa-style-family-classic:"Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro"}@font-face{font-family:"Font Awesome 6 Pro";font-style:normal;font-weight:100;font-display:block;src:url(../webfonts/fa-thin-100.woff2) format("woff2"),url(../webfonts/fa-thin-100.ttf) format("truetype")}.fa-thin,.fat{font-weight:100} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/v4-font-face.css b/codewithrockstar.com/assets/fontawesome/css/v4-font-face.css new file mode 100644 index 00000000..de049812 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/v4-font-face.css @@ -0,0 +1,26 @@ +/*! + * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); + unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; } + +@font-face { + font-family: 'FontAwesome'; + font-display: block; + src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); + unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; } diff --git a/codewithrockstar.com/assets/fontawesome/css/v4-font-face.min.css b/codewithrockstar.com/assets/fontawesome/css/v4-font-face.min.css new file mode 100644 index 00000000..fd452b25 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/v4-font-face.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/v4-shims.css b/codewithrockstar.com/assets/fontawesome/css/v4-shims.css new file mode 100644 index 00000000..239be56f --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/v4-shims.css @@ -0,0 +1,2194 @@ +/*! + * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa.fa-glass:before { + content: "\f000"; } + +.fa.fa-envelope-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-envelope-o:before { + content: "\f0e0"; } + +.fa.fa-star-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-o:before { + content: "\f005"; } + +.fa.fa-remove:before { + content: "\f00d"; } + +.fa.fa-close:before { + content: "\f00d"; } + +.fa.fa-gear:before { + content: "\f013"; } + +.fa.fa-trash-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-trash-o:before { + content: "\f2ed"; } + +.fa.fa-home:before { + content: "\f015"; } + +.fa.fa-file-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-o:before { + content: "\f15b"; } + +.fa.fa-clock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-clock-o:before { + content: "\f017"; } + +.fa.fa-arrow-circle-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-down:before { + content: "\f358"; } + +.fa.fa-arrow-circle-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-up:before { + content: "\f35b"; } + +.fa.fa-play-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-play-circle-o:before { + content: "\f144"; } + +.fa.fa-repeat:before { + content: "\f01e"; } + +.fa.fa-rotate-right:before { + content: "\f01e"; } + +.fa.fa-refresh:before { + content: "\f021"; } + +.fa.fa-list-alt { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-list-alt:before { + content: "\f022"; } + +.fa.fa-dedent:before { + content: "\f03b"; } + +.fa.fa-video-camera:before { + content: "\f03d"; } + +.fa.fa-picture-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-picture-o:before { + content: "\f03e"; } + +.fa.fa-photo { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-photo:before { + content: "\f03e"; } + +.fa.fa-image { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-image:before { + content: "\f03e"; } + +.fa.fa-map-marker:before { + content: "\f3c5"; } + +.fa.fa-pencil-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-pencil-square-o:before { + content: "\f044"; } + +.fa.fa-edit { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-edit:before { + content: "\f044"; } + +.fa.fa-share-square-o:before { + content: "\f14d"; } + +.fa.fa-check-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-check-square-o:before { + content: "\f14a"; } + +.fa.fa-arrows:before { + content: "\f0b2"; } + +.fa.fa-times-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-circle-o:before { + content: "\f057"; } + +.fa.fa-check-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-check-circle-o:before { + content: "\f058"; } + +.fa.fa-mail-forward:before { + content: "\f064"; } + +.fa.fa-expand:before { + content: "\f424"; } + +.fa.fa-compress:before { + content: "\f422"; } + +.fa.fa-eye { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-eye-slash { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-warning:before { + content: "\f071"; } + +.fa.fa-calendar:before { + content: "\f073"; } + +.fa.fa-arrows-v:before { + content: "\f338"; } + +.fa.fa-arrows-h:before { + content: "\f337"; } + +.fa.fa-bar-chart:before { + content: "\e0e3"; } + +.fa.fa-bar-chart-o:before { + content: "\e0e3"; } + +.fa.fa-twitter-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-twitter-square:before { + content: "\f081"; } + +.fa.fa-facebook-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-square:before { + content: "\f082"; } + +.fa.fa-gears:before { + content: "\f085"; } + +.fa.fa-thumbs-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-up:before { + content: "\f164"; } + +.fa.fa-thumbs-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-thumbs-o-down:before { + content: "\f165"; } + +.fa.fa-heart-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-heart-o:before { + content: "\f004"; } + +.fa.fa-sign-out:before { + content: "\f2f5"; } + +.fa.fa-linkedin-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linkedin-square:before { + content: "\f08c"; } + +.fa.fa-thumb-tack:before { + content: "\f08d"; } + +.fa.fa-external-link:before { + content: "\f35d"; } + +.fa.fa-sign-in:before { + content: "\f2f6"; } + +.fa.fa-github-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-github-square:before { + content: "\f092"; } + +.fa.fa-lemon-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-lemon-o:before { + content: "\f094"; } + +.fa.fa-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-square-o:before { + content: "\f0c8"; } + +.fa.fa-bookmark-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bookmark-o:before { + content: "\f02e"; } + +.fa.fa-twitter { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook:before { + content: "\f39e"; } + +.fa.fa-facebook-f { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-f:before { + content: "\f39e"; } + +.fa.fa-github { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-credit-card { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-feed:before { + content: "\f09e"; } + +.fa.fa-hdd-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hdd-o:before { + content: "\f0a0"; } + +.fa.fa-hand-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-right:before { + content: "\f0a4"; } + +.fa.fa-hand-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-left:before { + content: "\f0a5"; } + +.fa.fa-hand-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-up:before { + content: "\f0a6"; } + +.fa.fa-hand-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-o-down:before { + content: "\f0a7"; } + +.fa.fa-globe:before { + content: "\f57d"; } + +.fa.fa-tasks:before { + content: "\f828"; } + +.fa.fa-arrows-alt:before { + content: "\f31e"; } + +.fa.fa-group:before { + content: "\f0c0"; } + +.fa.fa-chain:before { + content: "\f0c1"; } + +.fa.fa-cut:before { + content: "\f0c4"; } + +.fa.fa-files-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-files-o:before { + content: "\f0c5"; } + +.fa.fa-floppy-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-floppy-o:before { + content: "\f0c7"; } + +.fa.fa-save { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-save:before { + content: "\f0c7"; } + +.fa.fa-navicon:before { + content: "\f0c9"; } + +.fa.fa-reorder:before { + content: "\f0c9"; } + +.fa.fa-magic:before { + content: "\e2ca"; } + +.fa.fa-pinterest { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pinterest-square:before { + content: "\f0d3"; } + +.fa.fa-google-plus-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-square:before { + content: "\f0d4"; } + +.fa.fa-google-plus { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus:before { + content: "\f0d5"; } + +.fa.fa-money:before { + content: "\f3d1"; } + +.fa.fa-unsorted:before { + content: "\f0dc"; } + +.fa.fa-sort-desc:before { + content: "\f0dd"; } + +.fa.fa-sort-asc:before { + content: "\f0de"; } + +.fa.fa-linkedin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linkedin:before { + content: "\f0e1"; } + +.fa.fa-rotate-left:before { + content: "\f0e2"; } + +.fa.fa-legal:before { + content: "\f0e3"; } + +.fa.fa-tachometer:before { + content: "\f625"; } + +.fa.fa-dashboard:before { + content: "\f625"; } + +.fa.fa-comment-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-comment-o:before { + content: "\f075"; } + +.fa.fa-comments-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-comments-o:before { + content: "\f086"; } + +.fa.fa-flash:before { + content: "\f0e7"; } + +.fa.fa-clipboard:before { + content: "\f0ea"; } + +.fa.fa-lightbulb-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-lightbulb-o:before { + content: "\f0eb"; } + +.fa.fa-exchange:before { + content: "\f362"; } + +.fa.fa-cloud-download:before { + content: "\f0ed"; } + +.fa.fa-cloud-upload:before { + content: "\f0ee"; } + +.fa.fa-bell-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bell-o:before { + content: "\f0f3"; } + +.fa.fa-cutlery:before { + content: "\f2e7"; } + +.fa.fa-file-text-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-text-o:before { + content: "\f15c"; } + +.fa.fa-building-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-building-o:before { + content: "\f1ad"; } + +.fa.fa-hospital-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hospital-o:before { + content: "\f0f8"; } + +.fa.fa-tablet:before { + content: "\f3fa"; } + +.fa.fa-mobile:before { + content: "\f3cd"; } + +.fa.fa-mobile-phone:before { + content: "\f3cd"; } + +.fa.fa-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-circle-o:before { + content: "\f111"; } + +.fa.fa-mail-reply:before { + content: "\f3e5"; } + +.fa.fa-github-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-folder-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-folder-o:before { + content: "\f07b"; } + +.fa.fa-folder-open-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-folder-open-o:before { + content: "\f07c"; } + +.fa.fa-smile-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-smile-o:before { + content: "\f118"; } + +.fa.fa-frown-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-frown-o:before { + content: "\f119"; } + +.fa.fa-meh-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-meh-o:before { + content: "\f11a"; } + +.fa.fa-keyboard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-keyboard-o:before { + content: "\f11c"; } + +.fa.fa-flag-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-flag-o:before { + content: "\f024"; } + +.fa.fa-mail-reply-all:before { + content: "\f122"; } + +.fa.fa-star-half-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-o:before { + content: "\f5c0"; } + +.fa.fa-star-half-empty { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-empty:before { + content: "\f5c0"; } + +.fa.fa-star-half-full { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-star-half-full:before { + content: "\f5c0"; } + +.fa.fa-code-fork:before { + content: "\f126"; } + +.fa.fa-chain-broken:before { + content: "\f127"; } + +.fa.fa-unlink:before { + content: "\f127"; } + +.fa.fa-calendar-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-o:before { + content: "\f133"; } + +.fa.fa-maxcdn { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-html5 { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-css3 { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-unlock-alt:before { + content: "\f09c"; } + +.fa.fa-minus-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-minus-square-o:before { + content: "\f146"; } + +.fa.fa-level-up:before { + content: "\f3bf"; } + +.fa.fa-level-down:before { + content: "\f3be"; } + +.fa.fa-pencil-square:before { + content: "\f14b"; } + +.fa.fa-external-link-square:before { + content: "\f360"; } + +.fa.fa-compass { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-down:before { + content: "\f150"; } + +.fa.fa-toggle-down { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-down:before { + content: "\f150"; } + +.fa.fa-caret-square-o-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-up:before { + content: "\f151"; } + +.fa.fa-toggle-up { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-up:before { + content: "\f151"; } + +.fa.fa-caret-square-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-right:before { + content: "\f152"; } + +.fa.fa-toggle-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-right:before { + content: "\f152"; } + +.fa.fa-eur:before { + content: "\f153"; } + +.fa.fa-euro:before { + content: "\f153"; } + +.fa.fa-gbp:before { + content: "\f154"; } + +.fa.fa-usd:before { + content: "\24"; } + +.fa.fa-dollar:before { + content: "\24"; } + +.fa.fa-inr:before { + content: "\e1bc"; } + +.fa.fa-rupee:before { + content: "\e1bc"; } + +.fa.fa-jpy:before { + content: "\f157"; } + +.fa.fa-cny:before { + content: "\f157"; } + +.fa.fa-rmb:before { + content: "\f157"; } + +.fa.fa-yen:before { + content: "\f157"; } + +.fa.fa-rub:before { + content: "\f158"; } + +.fa.fa-ruble:before { + content: "\f158"; } + +.fa.fa-rouble:before { + content: "\f158"; } + +.fa.fa-krw:before { + content: "\f159"; } + +.fa.fa-won:before { + content: "\f159"; } + +.fa.fa-btc { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitcoin:before { + content: "\f15a"; } + +.fa.fa-file-text:before { + content: "\f15c"; } + +.fa.fa-sort-alpha-asc:before { + content: "\f15d"; } + +.fa.fa-sort-alpha-desc:before { + content: "\f881"; } + +.fa.fa-sort-amount-asc:before { + content: "\f884"; } + +.fa.fa-sort-amount-desc:before { + content: "\f160"; } + +.fa.fa-sort-numeric-asc:before { + content: "\f162"; } + +.fa.fa-sort-numeric-desc:before { + content: "\f886"; } + +.fa.fa-youtube-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-youtube-square:before { + content: "\f431"; } + +.fa.fa-youtube { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-xing-square:before { + content: "\f169"; } + +.fa.fa-youtube-play { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-youtube-play:before { + content: "\f167"; } + +.fa.fa-dropbox { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stack-overflow { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-instagram { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-flickr { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-adn { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bitbucket-square:before { + content: "\f171"; } + +.fa.fa-tumblr { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-tumblr-square:before { + content: "\f174"; } + +.fa.fa-long-arrow-down:before { + content: "\f309"; } + +.fa.fa-long-arrow-up:before { + content: "\f30c"; } + +.fa.fa-long-arrow-left:before { + content: "\f30a"; } + +.fa.fa-long-arrow-right:before { + content: "\f30b"; } + +.fa.fa-apple { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-windows { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-android { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-linux { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-dribbble { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-skype { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-foursquare { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-trello { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gratipay { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gittip { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gittip:before { + content: "\f184"; } + +.fa.fa-sun-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sun-o:before { + content: "\f185"; } + +.fa.fa-moon-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-moon-o:before { + content: "\f186"; } + +.fa.fa-vk { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-weibo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-renren { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pagelines { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stack-exchange { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-right:before { + content: "\f35a"; } + +.fa.fa-arrow-circle-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-arrow-circle-o-left:before { + content: "\f359"; } + +.fa.fa-caret-square-o-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-caret-square-o-left:before { + content: "\f191"; } + +.fa.fa-toggle-left { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-toggle-left:before { + content: "\f191"; } + +.fa.fa-dot-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-dot-circle-o:before { + content: "\f192"; } + +.fa.fa-vimeo-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo-square:before { + content: "\f194"; } + +.fa.fa-try:before { + content: "\e2bb"; } + +.fa.fa-turkish-lira:before { + content: "\e2bb"; } + +.fa.fa-plus-square-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-plus-square-o:before { + content: "\f0fe"; } + +.fa.fa-slack { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wordpress { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-openid { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-institution:before { + content: "\f19c"; } + +.fa.fa-bank:before { + content: "\f19c"; } + +.fa.fa-mortar-board:before { + content: "\f19d"; } + +.fa.fa-yahoo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-square:before { + content: "\f1a2"; } + +.fa.fa-stumbleupon-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-stumbleupon { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-delicious { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-digg { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-pp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pied-piper-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-drupal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-joomla { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-behance-square:before { + content: "\f1b5"; } + +.fa.fa-steam { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-steam-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-steam-square:before { + content: "\f1b7"; } + +.fa.fa-automobile:before { + content: "\f1b9"; } + +.fa.fa-cab:before { + content: "\f1ba"; } + +.fa.fa-spotify { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-deviantart { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-soundcloud { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-file-pdf-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-pdf-o:before { + content: "\f1c1"; } + +.fa.fa-file-word-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-word-o:before { + content: "\f1c2"; } + +.fa.fa-file-excel-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-excel-o:before { + content: "\f1c3"; } + +.fa.fa-file-powerpoint-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-powerpoint-o:before { + content: "\f1c4"; } + +.fa.fa-file-image-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-image-o:before { + content: "\f1c5"; } + +.fa.fa-file-photo-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-photo-o:before { + content: "\f1c5"; } + +.fa.fa-file-picture-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-picture-o:before { + content: "\f1c5"; } + +.fa.fa-file-archive-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-archive-o:before { + content: "\f1c6"; } + +.fa.fa-file-zip-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-zip-o:before { + content: "\f1c6"; } + +.fa.fa-file-audio-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-audio-o:before { + content: "\f1c7"; } + +.fa.fa-file-sound-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-sound-o:before { + content: "\f1c7"; } + +.fa.fa-file-video-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-video-o:before { + content: "\f1c8"; } + +.fa.fa-file-movie-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-movie-o:before { + content: "\f1c8"; } + +.fa.fa-file-code-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-file-code-o:before { + content: "\f1c9"; } + +.fa.fa-vine { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-codepen { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-jsfiddle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-life-bouy:before { + content: "\f1cd"; } + +.fa.fa-life-buoy:before { + content: "\f1cd"; } + +.fa.fa-life-saver:before { + content: "\f1cd"; } + +.fa.fa-support:before { + content: "\f1cd"; } + +.fa.fa-circle-o-notch:before { + content: "\f1ce"; } + +.fa.fa-rebel { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ra { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ra:before { + content: "\f1d0"; } + +.fa.fa-resistance { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-resistance:before { + content: "\f1d0"; } + +.fa.fa-empire { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ge { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ge:before { + content: "\f1d1"; } + +.fa.fa-git-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-git-square:before { + content: "\f1d2"; } + +.fa.fa-git { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-hacker-news { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator-square:before { + content: "\f1d4"; } + +.fa.fa-yc-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc-square:before { + content: "\f1d4"; } + +.fa.fa-tencent-weibo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-qq { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-weixin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wechat { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wechat:before { + content: "\f1d7"; } + +.fa.fa-send:before { + content: "\f1d8"; } + +.fa.fa-paper-plane-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-paper-plane-o:before { + content: "\f1d8"; } + +.fa.fa-send-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-send-o:before { + content: "\f1d8"; } + +.fa.fa-circle-thin { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-circle-thin:before { + content: "\f111"; } + +.fa.fa-header:before { + content: "\f1dc"; } + +.fa.fa-futbol-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-futbol-o:before { + content: "\f1e3"; } + +.fa.fa-soccer-ball-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-soccer-ball-o:before { + content: "\f1e3"; } + +.fa.fa-slideshare { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-twitch { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yelp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-newspaper-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-newspaper-o:before { + content: "\f1ea"; } + +.fa.fa-paypal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-wallet { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-visa { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-mastercard { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-discover { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-amex { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-paypal { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-stripe { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bell-slash-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-bell-slash-o:before { + content: "\f1f6"; } + +.fa.fa-trash:before { + content: "\f2ed"; } + +.fa.fa-copyright { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-eyedropper:before { + content: "\f1fb"; } + +.fa.fa-area-chart:before { + content: "\f1fe"; } + +.fa.fa-pie-chart:before { + content: "\f200"; } + +.fa.fa-line-chart:before { + content: "\f201"; } + +.fa.fa-lastfm { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-lastfm-square:before { + content: "\f203"; } + +.fa.fa-ioxhost { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-angellist { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-cc:before { + content: "\f20a"; } + +.fa.fa-ils:before { + content: "\f20b"; } + +.fa.fa-shekel:before { + content: "\f20b"; } + +.fa.fa-sheqel:before { + content: "\f20b"; } + +.fa.fa-buysellads { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-connectdevelop { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-dashcube { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-forumbee { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-leanpub { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-sellsy { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-shirtsinbulk { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-simplybuilt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-skyatlas { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-diamond { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-diamond:before { + content: "\f3a5"; } + +.fa.fa-transgender:before { + content: "\f224"; } + +.fa.fa-intersex:before { + content: "\f224"; } + +.fa.fa-transgender-alt:before { + content: "\f225"; } + +.fa.fa-facebook-official { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-facebook-official:before { + content: "\f09a"; } + +.fa.fa-pinterest-p { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-whatsapp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-hotel:before { + content: "\f236"; } + +.fa.fa-viacoin { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-medium { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-y-combinator { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yc:before { + content: "\f23b"; } + +.fa.fa-optin-monster { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-opencart { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-expeditedssl { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-battery-4:before { + content: "\f240"; } + +.fa.fa-battery:before { + content: "\f240"; } + +.fa.fa-battery-3:before { + content: "\f241"; } + +.fa.fa-battery-2:before { + content: "\f242"; } + +.fa.fa-battery-1:before { + content: "\f243"; } + +.fa.fa-battery-0:before { + content: "\f244"; } + +.fa.fa-object-group { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-object-ungroup { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-sticky-note-o:before { + content: "\f249"; } + +.fa.fa-cc-jcb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-cc-diners-club { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-clone { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hourglass-o:before { + content: "\f254"; } + +.fa.fa-hourglass-1:before { + content: "\f251"; } + +.fa.fa-hourglass-2:before { + content: "\f252"; } + +.fa.fa-hourglass-3:before { + content: "\f253"; } + +.fa.fa-hand-rock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-rock-o:before { + content: "\f255"; } + +.fa.fa-hand-grab-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-grab-o:before { + content: "\f255"; } + +.fa.fa-hand-paper-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-paper-o:before { + content: "\f256"; } + +.fa.fa-hand-stop-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-stop-o:before { + content: "\f256"; } + +.fa.fa-hand-scissors-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-scissors-o:before { + content: "\f257"; } + +.fa.fa-hand-lizard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-lizard-o:before { + content: "\f258"; } + +.fa.fa-hand-spock-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-spock-o:before { + content: "\f259"; } + +.fa.fa-hand-pointer-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-pointer-o:before { + content: "\f25a"; } + +.fa.fa-hand-peace-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-hand-peace-o:before { + content: "\f25b"; } + +.fa.fa-registered { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-creative-commons { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gg { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gg-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-odnoklassniki-square:before { + content: "\f264"; } + +.fa.fa-get-pocket { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wikipedia-w { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-safari { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-chrome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-firefox { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-opera { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-internet-explorer { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-television:before { + content: "\f26c"; } + +.fa.fa-contao { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-500px { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-amazon { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-calendar-plus-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-plus-o:before { + content: "\f271"; } + +.fa.fa-calendar-minus-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-minus-o:before { + content: "\f272"; } + +.fa.fa-calendar-times-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-times-o:before { + content: "\f273"; } + +.fa.fa-calendar-check-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-calendar-check-o:before { + content: "\f274"; } + +.fa.fa-map-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-map-o:before { + content: "\f279"; } + +.fa.fa-commenting:before { + content: "\f4ad"; } + +.fa.fa-commenting-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-commenting-o:before { + content: "\f4ad"; } + +.fa.fa-houzz { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-vimeo:before { + content: "\f27d"; } + +.fa.fa-black-tie { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fonticons { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-reddit-alien { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-edge { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-credit-card-alt:before { + content: "\f09d"; } + +.fa.fa-codiepie { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-modx { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fort-awesome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-usb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-product-hunt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-mixcloud { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-scribd { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-pause-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-pause-circle-o:before { + content: "\f28b"; } + +.fa.fa-stop-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-stop-circle-o:before { + content: "\f28d"; } + +.fa.fa-bluetooth { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-bluetooth-b { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-gitlab { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpbeginner { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpforms { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-envira { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wheelchair-alt:before { + content: "\f368"; } + +.fa.fa-question-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-question-circle-o:before { + content: "\f059"; } + +.fa.fa-volume-control-phone:before { + content: "\f2a0"; } + +.fa.fa-asl-interpreting:before { + content: "\f2a3"; } + +.fa.fa-deafness:before { + content: "\f2a4"; } + +.fa.fa-hard-of-hearing:before { + content: "\f2a4"; } + +.fa.fa-glide { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-glide-g { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-signing:before { + content: "\f2a7"; } + +.fa.fa-viadeo { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-viadeo-square:before { + content: "\f2aa"; } + +.fa.fa-snapchat { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-ghost:before { + content: "\f2ab"; } + +.fa.fa-snapchat-square { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-snapchat-square:before { + content: "\f2ad"; } + +.fa.fa-pied-piper { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-first-order { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-yoast { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-themeisle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-official:before { + content: "\f2b3"; } + +.fa.fa-google-plus-circle { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-google-plus-circle:before { + content: "\f2b3"; } + +.fa.fa-font-awesome { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fa { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-fa:before { + content: "\f2b4"; } + +.fa.fa-handshake-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-handshake-o:before { + content: "\f2b5"; } + +.fa.fa-envelope-open-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-envelope-open-o:before { + content: "\f2b6"; } + +.fa.fa-linode { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-address-book-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-address-book-o:before { + content: "\f2b9"; } + +.fa.fa-vcard:before { + content: "\f2bb"; } + +.fa.fa-address-card-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-address-card-o:before { + content: "\f2bb"; } + +.fa.fa-vcard-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-vcard-o:before { + content: "\f2bb"; } + +.fa.fa-user-circle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-user-circle-o:before { + content: "\f2bd"; } + +.fa.fa-user-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-user-o:before { + content: "\f007"; } + +.fa.fa-id-badge { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-drivers-license:before { + content: "\f2c2"; } + +.fa.fa-id-card-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-id-card-o:before { + content: "\f2c2"; } + +.fa.fa-drivers-license-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-drivers-license-o:before { + content: "\f2c2"; } + +.fa.fa-quora { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-free-code-camp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-telegram { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-thermometer-4:before { + content: "\f2c7"; } + +.fa.fa-thermometer:before { + content: "\f2c7"; } + +.fa.fa-thermometer-3:before { + content: "\f2c8"; } + +.fa.fa-thermometer-2:before { + content: "\f2c9"; } + +.fa.fa-thermometer-1:before { + content: "\f2ca"; } + +.fa.fa-thermometer-0:before { + content: "\f2cb"; } + +.fa.fa-bathtub:before { + content: "\f2cd"; } + +.fa.fa-s15:before { + content: "\f2cd"; } + +.fa.fa-window-maximize { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-window-restore { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle:before { + content: "\f410"; } + +.fa.fa-window-close-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-window-close-o:before { + content: "\f410"; } + +.fa.fa-times-rectangle-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-times-rectangle-o:before { + content: "\f410"; } + +.fa.fa-bandcamp { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-grav { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-etsy { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-imdb { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-ravelry { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-eercast { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-eercast:before { + content: "\f2da"; } + +.fa.fa-snowflake-o { + font-family: 'Font Awesome 6 Free'; + font-weight: 400; } + +.fa.fa-snowflake-o:before { + content: "\f2dc"; } + +.fa.fa-superpowers { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-wpexplorer { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } + +.fa.fa-meetup { + font-family: 'Font Awesome 6 Brands'; + font-weight: 400; } diff --git a/codewithrockstar.com/assets/fontawesome/css/v4-shims.min.css b/codewithrockstar.com/assets/fontawesome/css/v4-shims.min.css new file mode 100644 index 00000000..80f2d7e2 --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/v4-shims.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa.fa-glass:before{content:"\f000"}.fa.fa-envelope-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-star-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-home:before{content:"\f015"}.fa.fa-file-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-list-alt:before{content:"\f022"}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-edit{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-edit:before{content:"\f044"}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-expand:before{content:"\f424"}.fa.fa-compress:before{content:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart-o:before,.fa.fa-bar-chart:before{content:"\e0e3"}.fa.fa-twitter-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-twitter-square:before{content:"\f081"}.fa.fa-facebook-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-square:before{content:"\f082"}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-github-square:before{content:"\f092"}.fa.fa-lemon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-globe:before{content:"\f57d"}.fa.fa-tasks:before{content:"\f828"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-cut:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-save{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-save:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-magic:before{content:"\e2ca"}.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pinterest-square:before{content:"\f0d3"}.fa.fa-google-plus-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-square:before{content:"\f0d4"}.fa.fa-google-plus{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f625"}.fa.fa-comment-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard:before{content:"\f0ea"}.fa.fa-lightbulb-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f0ed"}.fa.fa-cloud-upload:before{content:"\f0ee"}.fa.fa-bell-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f5c0"}.fa.fa-star-half-empty{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f5c0"}.fa.fa-star-half-full{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f5c0"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before,.fa.fa-unlink:before{content:"\f127"}.fa.fa-calendar-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-unlock-alt:before{content:"\f09c"}.fa.fa-minus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\24"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\e1bc"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f881"}.fa.fa-sort-amount-asc:before{content:"\f884"}.fa.fa-sort-amount-desc:before{content:"\f160"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f886"}.fa.fa-youtube-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-square:before{content:"\f431"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-xing-square:before{content:"\f169"}.fa.fa-youtube-play{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-tumblr-square:before{content:"\f174"}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo-square:before{content:"\f194"}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\e2bb"}.fa.fa-plus-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-google,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-yahoo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-reddit-square:before{content:"\f1a2"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-behance-square:before{content:"\f1b5"}.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-steam-square:before{content:"\f1b7"}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-life-bouy:before,.fa.fa-life-buoy:before,.fa.fa-life-saver:before,.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-git-square:before{content:"\f1d2"}.fa.fa-git,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-futbol-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-lastfm-square:before{content:"\f203"}.fa.fa-angellist,.fa.fa-ioxhost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before,.fa.fa-transgender:before{content:"\f224"}.fa.fa-transgender-alt:before{content:"\f225"}.fa.fa-facebook-official{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-clone{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-creative-commons,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-odnoklassniki-square:before{content:"\f264"}.fa.fa-chrome,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-internet-explorer,.fa.fa-opera,.fa.fa-safari,.fa.fa-wikipedia-w{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-viadeo,.fa.fa-viadeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-viadeo-square:before{content:"\f2aa"}.fa.fa-snapchat,.fa.fa-snapchat-ghost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-ghost:before{content:"\f2ab"}.fa.fa-snapchat-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-square:before{content:"\f2ad"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-themeisle,.fa.fa-yoast{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-meetup,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 6 Brands";font-weight:400} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/css/v5-font-face.css b/codewithrockstar.com/assets/fontawesome/css/v5-font-face.css new file mode 100644 index 00000000..b0c86e7c --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/v5-font-face.css @@ -0,0 +1,22 @@ +/*! + * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +@font-face { + font-family: 'Font Awesome 5 Brands'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 900; + src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } + +@font-face { + font-family: 'Font Awesome 5 Free'; + font-display: block; + font-weight: 400; + src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } diff --git a/codewithrockstar.com/assets/fontawesome/css/v5-font-face.min.css b/codewithrockstar.com/assets/fontawesome/css/v5-font-face.min.css new file mode 100644 index 00000000..78cc949a --- /dev/null +++ b/codewithrockstar.com/assets/fontawesome/css/v5-font-face.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome Free 6.6.0 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")} \ No newline at end of file diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-brands-400.ttf b/codewithrockstar.com/assets/fontawesome/webfonts/fa-brands-400.ttf new file mode 100644 index 00000000..ee671d86 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-brands-400.ttf differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-brands-400.woff2 b/codewithrockstar.com/assets/fontawesome/webfonts/fa-brands-400.woff2 new file mode 100644 index 00000000..c3369d13 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-brands-400.woff2 differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-light-300.ttf b/codewithrockstar.com/assets/fontawesome/webfonts/fa-light-300.ttf new file mode 100644 index 00000000..24f8f356 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-light-300.ttf differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-light-300.woff2 b/codewithrockstar.com/assets/fontawesome/webfonts/fa-light-300.woff2 new file mode 100644 index 00000000..b9b09be4 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-light-300.woff2 differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-regular-400.ttf b/codewithrockstar.com/assets/fontawesome/webfonts/fa-regular-400.ttf new file mode 100644 index 00000000..7f9b53c1 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-regular-400.ttf differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-regular-400.woff2 b/codewithrockstar.com/assets/fontawesome/webfonts/fa-regular-400.woff2 new file mode 100644 index 00000000..452b49c0 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-regular-400.woff2 differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-solid-900.ttf b/codewithrockstar.com/assets/fontawesome/webfonts/fa-solid-900.ttf new file mode 100644 index 00000000..ba94f575 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-solid-900.ttf differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-solid-900.woff2 b/codewithrockstar.com/assets/fontawesome/webfonts/fa-solid-900.woff2 new file mode 100644 index 00000000..0c2ce0bb Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-solid-900.woff2 differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-thin-100.ttf b/codewithrockstar.com/assets/fontawesome/webfonts/fa-thin-100.ttf new file mode 100644 index 00000000..9f239437 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-thin-100.ttf differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-thin-100.woff2 b/codewithrockstar.com/assets/fontawesome/webfonts/fa-thin-100.woff2 new file mode 100644 index 00000000..86003476 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-thin-100.woff2 differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-v4compatibility.ttf b/codewithrockstar.com/assets/fontawesome/webfonts/fa-v4compatibility.ttf new file mode 100644 index 00000000..577b7a00 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-v4compatibility.ttf differ diff --git a/codewithrockstar.com/assets/fontawesome/webfonts/fa-v4compatibility.woff2 b/codewithrockstar.com/assets/fontawesome/webfonts/fa-v4compatibility.woff2 new file mode 100644 index 00000000..73931680 Binary files /dev/null and b/codewithrockstar.com/assets/fontawesome/webfonts/fa-v4compatibility.woff2 differ diff --git a/codewithrockstar.com/assets/img/PNG/guitars-tile.png b/codewithrockstar.com/assets/img/PNG/guitars-tile.png new file mode 100644 index 00000000..221481b5 Binary files /dev/null and b/codewithrockstar.com/assets/img/PNG/guitars-tile.png differ diff --git a/codewithrockstar.com/assets/img/PNG/tile.html b/codewithrockstar.com/assets/img/PNG/tile.html new file mode 100644 index 00000000..59d34186 --- /dev/null +++ b/codewithrockstar.com/assets/img/PNG/tile.html @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/codewithrockstar.com/assets/img/SVG/guitars-tile.svg b/codewithrockstar.com/assets/img/SVG/guitars-tile.svg new file mode 100644 index 00000000..ede676a1 --- /dev/null +++ b/codewithrockstar.com/assets/img/SVG/guitars-tile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/codewithrockstar.com/assets/img/guitars-pattern.png b/codewithrockstar.com/assets/img/guitars-pattern.png new file mode 100644 index 00000000..d2ad5af7 Binary files /dev/null and b/codewithrockstar.com/assets/img/guitars-pattern.png differ diff --git a/codewithrockstar.com/assets/img/rockstar-logotype-no-tail.svg b/codewithrockstar.com/assets/img/rockstar-logotype-no-tail.svg new file mode 100644 index 00000000..602018cc --- /dev/null +++ b/codewithrockstar.com/assets/img/rockstar-logotype-no-tail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/codewithrockstar.com/assets/img/rockstar-logotype.svg b/codewithrockstar.com/assets/img/rockstar-logotype.svg new file mode 100644 index 00000000..bbf54df8 --- /dev/null +++ b/codewithrockstar.com/assets/img/rockstar-logotype.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/codewithrockstar.com/assets/img/teemill/480p/blue-kids-fit.webp b/codewithrockstar.com/assets/img/teemill/480p/blue-kids-fit.webp new file mode 100644 index 00000000..1e603ebb Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/480p/blue-kids-fit.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/480p/blue-logo.webp b/codewithrockstar.com/assets/img/teemill/480p/blue-logo.webp new file mode 100644 index 00000000..61da7fbf Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/480p/blue-logo.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/480p/blue-tailored.webp b/codewithrockstar.com/assets/img/teemill/480p/blue-tailored.webp new file mode 100644 index 00000000..27d95af3 Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/480p/blue-tailored.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/480p/red-basic-fit.webp b/codewithrockstar.com/assets/img/teemill/480p/red-basic-fit.webp new file mode 100644 index 00000000..8beb4680 Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/480p/red-basic-fit.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/480p/red-logo.webp b/codewithrockstar.com/assets/img/teemill/480p/red-logo.webp new file mode 100644 index 00000000..ce4bb23b Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/480p/red-logo.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/480p/red-on-press.webp b/codewithrockstar.com/assets/img/teemill/480p/red-on-press.webp new file mode 100644 index 00000000..8d3b2b89 Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/480p/red-on-press.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/blue-kids-fit.webp b/codewithrockstar.com/assets/img/teemill/blue-kids-fit.webp new file mode 100644 index 00000000..1e603ebb Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/blue-kids-fit.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/blue-logo.webp b/codewithrockstar.com/assets/img/teemill/blue-logo.webp new file mode 100644 index 00000000..61da7fbf Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/blue-logo.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/blue-tailored.webp b/codewithrockstar.com/assets/img/teemill/blue-tailored.webp new file mode 100644 index 00000000..27d95af3 Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/blue-tailored.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/red-basic-fit.webp b/codewithrockstar.com/assets/img/teemill/red-basic-fit.webp new file mode 100644 index 00000000..8beb4680 Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/red-basic-fit.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/red-logo.webp b/codewithrockstar.com/assets/img/teemill/red-logo.webp new file mode 100644 index 00000000..ce4bb23b Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/red-logo.webp differ diff --git a/codewithrockstar.com/assets/img/teemill/red-on-press.webp b/codewithrockstar.com/assets/img/teemill/red-on-press.webp new file mode 100644 index 00000000..8d3b2b89 Binary files /dev/null and b/codewithrockstar.com/assets/img/teemill/red-on-press.webp differ diff --git a/CODE_OF_CONDUCT.md b/codewithrockstar.com/code-of-conduct.md similarity index 67% rename from CODE_OF_CONDUCT.md rename to codewithrockstar.com/code-of-conduct.md index 242f8f69..cf7c89b8 100644 --- a/CODE_OF_CONDUCT.md +++ b/codewithrockstar.com/code-of-conduct.md @@ -1,14 +1,33 @@ -## Rockstar: Contributor Code of Conduct +--- +title: Code of Conduct +layout: main +nav_exclude: true +--- -### TL;DR +# Rockstar: Contributor Code of Conduct + +## TL;DR * Be excellent to each other. +* Party on. -### Our Pledge +## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. -### Our Standards +## A Note about Rockstar + +> Rockstar is a little different to most open source software projects. +> +>First: IT IS A JOKE. A joke with a formal specification and multiple implementations, but please remember - we're doing this for a laugh. Please don't spoil the fun. +> +> Rockstar is also directly influenced by rock and heavy metal music, which puts this project in an unusual position. Rock music itself is rife with 'sexualized language and imagery', 'derogatory comments', 'political attacks', and all sorts of behaviour and material which would be 'considered inappropriate in a professional setting'. +> +> This is not a licence to be deliberately provocative or offensive, and we won't tolerate harassment, bullying or personal attacks. But if you find the sort of themes and imagery used in rock and metal music offensive, or you work in an environment where these things could cause a problem, please be warned that this project might contain material you find objectionable. +> +> **Put another way: if you, your community, or your workplace has a problem with Mötley Crüe, Black Sabbath, Alice Cooper, Twisted Sister, or Judas Priest, then you are not going to enjoy it here. Thanks for stopping by, and have a lovely day.** + +## Our Standards Examples of behavior that contributes to creating a positive environment include: @@ -26,33 +45,26 @@ Examples of unacceptable behavior by participants include: * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting -### A Note about Rockstar - -Rockstar is a little different to most open source software projects. For starters, it's a joke. A joke with a formal specification and multiple implementations, but please remember - we're doing this for a laugh. Please don't spoil the fun. - -Rockstar is also directly influenced by rock and heavy metal music, which puts this project in an unusual position. Rock music itself is rife with 'sexualized language and imagery', 'derogatory comments', 'political attacks', and all sorts of behaviour and material which would be 'considered inappropriate in a professional setting'. - -This is not a licence to be deliberately provocative or offensive, and we won't tolerate harassment, bullying or personal attacks. But if you find the sort of themes and imagery used in rock and metal music offensive, or you work in an environment where these things could cause a problem, please be warned that this project might contain material you find objectionable. -### Our Responsibilities +## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. -### Scope +## Scope This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. -### Enforcement +## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [hello@codewithrockstar.com](mailto:hello@codewithrockstar.com). The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. -### Attribution +## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ +[version]: http://contributor-covenant.org/version/1/4/ \ No newline at end of file diff --git a/codewithrockstar.com/community.md b/codewithrockstar.com/community.md new file mode 100644 index 00000000..140b77c0 --- /dev/null +++ b/codewithrockstar.com/community.md @@ -0,0 +1,10 @@ +--- +title: Home +layout: main +nav_exclude: true +--- +# Rockstar Developers + +* Follow [@RockstarLang](https://twitter.com/rockstarlang) on Twitter +* [Rockstar Developers Discord](https://discord.gg/W5x52ZAKUh) +* [/r/RockstarDevs](https://www.reddit.com/r/RockstarDevs/) on Reddit diff --git a/codewithrockstar.com/docs/01-getting-started.md b/codewithrockstar.com/docs/01-getting-started.md new file mode 100644 index 00000000..7ec1f2e9 --- /dev/null +++ b/codewithrockstar.com/docs/01-getting-started.md @@ -0,0 +1,68 @@ +--- +title: Getting Started +layout: docs +nav_order: "1001" +summary: "The basics: scream, shout, whisper, comments, and how to put guitar chords in your Rockstar programs." +--- +## Tutorial + +If you're just getting started with Rockstar, the [Rockstar Tutorial](/tutorial) will +walk you through the basics and have you up and rocking in no time. + +## "Hello, World" + +"Hello World" in Rockstar looks like this: + +{% rockstar_include hello-world.rock %} + +Printing things isn't very rock‘n’roll, though. Rockers don't print, they `scream`, `shout`, `whisper` or maybe just `say` things, so these are all valid aliases for `print`: + +{% rockstar_include hello-world-aliases.rock %} + +`print` adds a newline to the end of the output. If you don't want this, use `write`: + +{% rockstar_include write-whisper.rock %} + +To read a line of input from `STDIN`, use the `listen` keyword. To read a line into a variable, use `listen to `: + +{% rockstar_include listen.rock %} + +Almost everything in Rockstar is case-insensitive, and most whitespace is ignored: + +{% rockstar_include hello-world-casing-and-whitespace.rock %} + +Rockstar statements end with a newline, or with any of the punctuation characters `.?!;` + +{% rockstar_include punctuated-statements.rock %} + +## Command line parameters + +If you're running Rockstar from the command line, you can pass parameters to your Rockstar program. Parameters beginning `-` or `--` are for the Rockstar interpreter itself: + +| Argument | Effect | +| ------------- | ----------------------------------------------------------- | +| `--version` | Display the Rockstar version number and exit. | + +All subsequent parameters will be passed to your Rockstar program, where you can access them in a global array called `arguments`, or its aliases `the outside` or `the world`: + +{% rockstar_include args.rock %} +## Comments + +The use of comments in Rockstar programs is strongly discouraged: this is rock’n’roll; it’s up to the audience to find their own meaning. If you absolutely insist on commenting your Rockstar programs, comments should be contained in parentheses `()`. Yes, this means you can’t use brackets in arithmetic expressions and may need to decompose complex expressions into multiple evaluations and assignments. + +{% rockstar_include comments.rock %} +### Line comments + +You can also use the `#` character to indicate a comment. Line comments last until the end of the line. + +> The only reason I did this is that one of you lot might actually be unhinged enough that you want to put a `#!/bin/rockstar` at the start of their Rockstar programs so you can run them straight from your terminal... and as much as that's a *terrible* idea, I'm not going to stop you. + +### ChordPro comments + +Since Rockstar programs are song lyrics, it stands to reason you might want to include the chords for your programs, so aspiring rockstar developers can play along at home, so Rockstar also allows comments to be surrounded by `{ }` and `[ ]` + +{% rockstar_include chordpro-comments.rock %} + +Running this program through the [ChordPro system](https://www.chordpro.org/) produces this: + +![ChordPro example](../images/chordpro-example.png) \ No newline at end of file diff --git a/codewithrockstar.com/docs/02-types-and-values.md b/codewithrockstar.com/docs/02-types-and-values.md new file mode 100644 index 00000000..1824cefc --- /dev/null +++ b/codewithrockstar.com/docs/02-types-and-values.md @@ -0,0 +1,48 @@ +--- +title: Types and Values +layout: docs +nav_order: "1002" +summary: "Meet Rockstar's type systems: numbers, strings, booleans, null, and mysterious." +--- +## Types + +Rockstar uses a similar type system to that defined by the [ECMAScript type system](http://www.ecma-international.org/ecma-262/5.1/#sec-8), except `undefined` doesn’t sound very rock’n’roll so we use `mysterious` instead. + +* **Number** - Numbers in Rockstar are fixed-precision , stored according to the [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) standard. _(An earlier version of this spec proposed that Rockstar used the [DEC64](http://www.dec64.com/) numeric type. This is a perfect example of something that seemed like a great idea after a couple of beers but turns out to be prohibitively difficult to implement…)_ +* **Boolean** - a logical entity having two values `true` and `false`. + - `right`, `yes` and `ok` are valid aliases for `true` + - `wrong`, `no` and `lies` are valid aliases for `false` +- **Function** - used for functions. +- **Null** - the null type. Evaluates as equal to zero and equal to false. The keywords `nothing`, `nowhere`, `nobody`, and `gone` are defined as aliases for `null` +- **Mysterious** - the value of any variable that hasn’t been assigned a value, denoted by the keyword `mysterious`. + +## Strings + +Rockstar strings are surrounded by double quotes. A string literal includes everything up to the closing quote, including newlines. To include a double quote in a string, use a pair of double quotes. Rockstar strings are stored internally as UTF-16, and support the full Unicode character set. + +The keywords `empty`, `silent`, and `silence` are aliases for the empty string (`""`) + +{% rockstar_include string-literals.rock %} +## Numbers + +**Number literals** are written as ordinary digits; decimals and negative numbers are supported: + +{% rockstar_include number-literals.rock %} + +A Rockstar number is a 128-bit fixed-precision decimal, between -79,228,162,514,264,337,593,543,950,335 and +79,228,162,514,264,337,593,543,950,335. + +You get 29 digits, a minus sign if you need it, and a a decimal point you can put anywhere you like: + +{% rockstar_include number-limits.rock %} + +Numbers with more than 29 digits will be rounded to 29 digits if they have a decimal part: + +{% rockstar_include number-29-digits.rock %} +## Booleans +Rockstar supports the Boolean literals `true` (aliases: `yes`, `ok`, `right`) and `false` (aliases: `no`, `wrong`, `lies`). +{% rockstar_include boolean-literals.rock %} +## Null + +Rockstar `null` represents an expression which has no meaningful value. Aliases for `null` are `nothing`, `nowhere`, `nobody` and `gone`: + +{% rockstar_include null-literals.rock %} \ No newline at end of file diff --git a/codewithrockstar.com/docs/03-variables.md b/codewithrockstar.com/docs/03-variables.md new file mode 100644 index 00000000..bd9f5376 --- /dev/null +++ b/codewithrockstar.com/docs/03-variables.md @@ -0,0 +1,110 @@ +--- +title: Variables +layout: docs +nav_order: "1002" +summary: Ever wished you could create a variable with a space in it? Welcome to Rockstar, friend. We got you. +--- +Rockstar variables are dynamically typed. There are three different ways to assign a variable in Rockstar. + +1. ` is `. Valid aliases for `is` are `are`, `am`, `was`, `were`, and the contractions `'s` and `'re` +2. `put into ` +3. `let be ` + +{% rockstar_include assignment.rock %} + +Rockstar variables are function scoped - see variable scope in the section on functions for more about how this work. +# Variable names in Rockstar + +Rockstar supports three different kinds of variable names. + +**Simple variables** can be any valid identifier that isn't a reserved keyword. A simple variable name must contain only letters, and cannot contain spaces. Note that Rockstar does not allow numbers or underscores in variable names - remember the golden rule of Rockstar syntax: if you can’t sing it, you can’t have it. Simple variables are case-insensitive. + +{% rockstar_include simple-variables.rock %} + +**Common variables** consist of one of the keywords `a`, `an`, `the`, `my`, `your` or `our` followed by whitespace and an identifier. The keyword is part of the variable name, so `a boy` is a different variable from `the boy`. Common variables are case-insensitive. + +> Common variables can include language keywords, so you can have variables called `your scream`, `my null`, `the silence`. + +{% rockstar_include common-variables.rock %} + +**Proper variables** are multi-word proper nouns: words which aren’t language keywords, each starting with an uppercase letter, separated by spaces. (Single-word variables are always simple variables.) Whilst some developers may use this feature to create variables with names like `Customer ID`, `Tax Rate` or `Distance In Kilometres`, we recommend you favour idiomatic variable names such as `Doctor Feelgood`, `Mister Crowley`, `Tom Sawyer`, and `Billie Jean`. +#### A note on case sensitivity in Rockstar + +Rockstar keywords and variable names are all case-insensitive, with the exception of proper variables. Proper variables are case-insensitive **apart from the first letter of each word, which must be a capital letter.** + +- `TIME`, `time`, `tIMe`, `TIMe` are all equivalent. Simple variables are case-insensitive. +- `MY HEART`, `my heart`, `My Heart` - are all equivalent; the keyword `my` triggers **common variable** behaviour +- `Tom Sawyer`, `TOM SAWYER`, `TOm SAWyer` - are all equivalent; the capital `S` on `Sawyer` triggers **proper variable** behaviour +- `DOCTOR feelgood` is not a valid Rockstar variable; the lowercase `f` on `feelgood` does not match any valid variable naming style and so the variable name is not valid. + +## Pronouns + +As well as referring to variables by name, you can refer to them using pronouns. The keywords `it`, `he`, `she`, `him`, `her`, `they`, `them`, `ze`, `hir`, `zie`, `zir`, `xe`, `xem`, `ve`, and `ver` refer to the current **pronoun subject**. + +The pronoun subject is updated when: + +* A variable is declared or assigned: + + `My heart is true. Say it` - `it` here refers to `my heart` +* A variable is the left-hand side of a comparison used as the condition in an `if`, `while` or `until` statement + + `If my heart is true, give it back, yeah` - `it` refers to `my heart` + +{% rockstar_include pronouns.rock %} + +> (Please don’t file issues pointing out that 80s rockers were a bunch of misogynists and gender-inclusive pronouns aren’t really idiomatic. You’re right, we know, and we’ve all learned a lot since then. Besides, [_Look What The Cat Dragged In_](https://en.wikipedia.org/wiki/Look_What_the_Cat_Dragged_In) was recorded by four cishet guys who spent more money on lipgloss and hairspray than they did on studio time, and it’s an absolute classic.) + +### The Thing About "Her" + +`her` is where Rockstar runs smack into one of the English language's most delightful idiosyncrasies, because the feminine third person pronoun and the feminine possessive are the **same word.** + +> Give him his guitar. +> Give them their horns. +> Give her her bass + +There is therefore a very specific restriction in the Rockstar grammar: you can't use `her` as a common variable prefix if the second part of the variable is a keyword. + +You can have variables called `the times`, `your lies`, `my right`, even though `times`, `lies` and `right` are language keywords, but you can't have `her times` or `her lies` because they'd create ambiguous expressions: + +``` +A girl is 123 +Her times are trying +Say her +Say her times 456 + +``` +## Poetic Literals + +One of Rockstar's unique features is the ability to initialise variables using song lyrics. +### Poetic Numbers + +A poetic number begins with the `like` or `so` keyword, followed by a series of words. The Rockstar parser takes the length of each word and interprets it as a decimal digit: + +{% rockstar_include poetic-numbers.rock %} + +Words of 10 or more letters are counted modulo 10, so you can use 10-letter words for `0`, 11 letters for `1` and 12 letters for `2`. Hyphens `-` are counted as letters, so `demon-haunted` is treated as a 12-letter word. Apostrophes are **not** counted, so `nothing` counts as 7 but `nothin'` counts as 6. A poetic number counts every word until the end of the current statement (indicated by a newline or punctuation `.!?;`) If you need a poetic number with a decimal point, use an ellipsis `...` or the Unicode equivalent U+2026 `…` as the decimal. + +{% rockstar_include poetic-numbers-2.rock %} +### Poetic strings +You can initialise string variables without quotes by using the `says` or `said` keyword. This will skip exactly one space character and then capture the rest of the line as a literal string. If the character immediately following the `says` keyword is not a space, it will be included in the string literal. + +{% rockstar_include poetic-strings.rock %} + +## Ninja Strings + +Ninja strings are another unique feature of Rockstar, designed to let you hide strings inside the lyrics of your Rockstar programs. Using the `rock` keyword - which we'll learn more about in the chapter on arrays - you can append characters to the end of a string by providing their Unicode code point - and, combined with the `like` keyword, you can provide that code point as a poetic number: + +{% rockstar_include ninja-strings.rock %} + +You can initialise a ninja string using the `hold` or `holds` keyword. The left-hand argument is the name of the variable you're initialised, the right-hand side is the poetic number containing the code point of the character: + +{% rockstar_include ninja-strings-fizzbuzz.rock %} + + + + + + + + + diff --git a/codewithrockstar.com/docs/04-arithmetic.md b/codewithrockstar.com/docs/04-arithmetic.md new file mode 100644 index 00000000..91b1f359 --- /dev/null +++ b/codewithrockstar.com/docs/04-arithmetic.md @@ -0,0 +1,65 @@ +--- +title: Arithmetic +layout: docs +nav_order: "1003" +summary: You want to add two numbers together? Boring. Go play with JavaScript. You want to divide a string by another string? Now we're talking. +--- +## Expressions + +Rockstar expressions are heavily inspired by JavaScript, in that they will almost always return *something* rather than failing. +### Basic Arithmetic + +Rockstar supports the standard infix arithmetic operators `+`, `-`, `*`, `/`, with several aliases for each operator so you can write lyrically pleasing expressions: + +| Operation | Operator | Aliases | +| -------------- | -------- | ------------------ | +| Addition | `+` | `with`, `plus` | +| Subtraction | `-` | `minus`, `without` | +| Multiplication | `*` | `times`, `of` | +| Division | `/` | `over`, `between` | + +{% rockstar_include lyrical-expressions.rock %} + +Operator precedence obeys the convention of multiplication, division, addition, subtraction. + +> Rockstar doesn't support parentheses in expressions. If the default operator precedence doesn't do what you need, you'll have to decompose your expression into multiple evaluations and assignments. + +{% rockstar_include basic-arithmetic.rock %} + +Here's how Rockstar operators are defined for various combinations of types. + +As a rough rule, operations involving numbers will return numbers. For arithmetic purposes, `true` is `1`, `null` and `false` are `0`. Operations involving strings will generally return strings. Any operation involving `mysterious` will always return `mysterious`. + +#### Addition + +Addition adds numbers and concatenates strings. + +{% rockstar_include addition-types.rock %} + +### Subtraction + +If both operands have a numeric value, subtraction is numeric. If either or both operands is a string, Rockstar will "subtract" strings by removing the the bit you're taking away (the *subtrahend*, if you want to get technical) from the bit you're taking it away from (the *minuend*). Most of the time, this has no effect and subtraction just returns the string representation of the left-hand argument, but hey -- you're the one trying to subtract strings here; let's not make out like I'm the one who has a problem. + +{% rockstar_include addition-types.rock %} +### Multiplication + +Rockstar lets you multiply strings. Multiplying by positive integers will repeat the string. Multiply by `-1` to reverse the string, multiplying by decimal fractions will extract substrings. You'll figure it out. + +{% rockstar_include multiplication-types.rock %} + +### Division + +You know where this is going now. Numbers divided by numbers give you numbers, and yes, you can divide strings. A string divided by 2 gives you the first half. A string divided by half will be repeated. A string divided by -1 will reverse. + +Dividing anything by a string will tell you how many times the second string occurs in the string representation of the first operand. Dividing `haystack / needle` will be zero if it didn't find `needle` in `haystack`, and positive if it found it. + +Or, y'know, you can just stick to dividing numbers. + +{% rockstar_include division-types.rock %} +### Compound Expressions + +Languages like C support shorthand expressions like `x++`, `x += 2`, and so on. + +The equivalent in Rockstar looks like this: + +{% rockstar_include compound-expressions.rock %} \ No newline at end of file diff --git a/codewithrockstar.com/docs/05-boolean-logic.md b/codewithrockstar.com/docs/05-boolean-logic.md new file mode 100644 index 00000000..b1ff7aa1 --- /dev/null +++ b/codewithrockstar.com/docs/05-boolean-logic.md @@ -0,0 +1,105 @@ +--- +title: Binary Logic +layout: docs +nav_order: "1003" +summary: Truth, truthiness, false, falseyness... and Rockstar is the only programming language in the world in which a variable can be totally non non non non NON heinous. +--- +## Truthiness + +Every possible value in Rockstar evaluates to either true or false -- this is known as **truthiness**. The only things in Rockstar which are **falsy** are: + +* `false` +* `null` +* `mysterious` +* the empty string `""` +* the number `0` + +Everything else is truthy, which means if you put in in a Boolean context (such as the condition of an `if` statement) it'll be 'true'. +### Unary Not + +Unary not in Rockstar uses the keywords `not` and `non-`: + +{% rockstar_include unary-not.rock %} + +### Binary Logic + +Rockstar supports binary logic expressions using the keywords `and`, `or`, and `nor`. + +{% rockstar_include basic-logic.rock %} + +`not` has the highest precedence, then `and`, then `or`, then `nor`: + +{% rockstar_include operator-precedence.rock %} + +### Binary Logic for Non-Boolean Types + +Binary logic applied to strings and numbers in Rockstar doesn't necessarily return a Boolean result: it returns whichever of the operands resolves the logical constraint of the expression:# + +{% rockstar_include binary-operands.rock %} + +The `and` and `or` operators in Rockstar will short-circuit: + +* `X or Y`: evaluate `X`. If the result is **truthy**, return it, otherwise evaluate `Y` and return that. + * **If `X` is truthy, `Y` is never evaluated.** +* `X and Y`: evaluate `X`. If the result is **falsy**, return it, otherwise evaluate `Y` and return that. + * **If `X` is falsy, `Y` is never evaluated.** + +In the following examples, short-circuiting means the division by zero is never evaluated: + +{% rockstar_include short-circuiting.rock %} + +## Equality and Comparison + +Equality in Rockstar uses the `is`, `was`, `are` and `were` keywords. Equality is determined as follows: + +* If one operand is a Boolean, compare it to the truthiness of the other operand: + * All non-zero numbers and non-empty strings are equal to `true` +* Otherwise, if one operand is a string, compare it with the string representation of the other argument + * +* Otherwise, the values of the two operands are compared. + +{% rockstar_include equality.rock %} + +### Inequality + +Inequality uses the `isn't` and `ain't` keywords. + +> Watch out for `is not`: `not` is the unary negation operator, so `a is not b` will work as expected when `b` is a Boolean, but when `b` is a number or a string, it'll compare `a` with the logical `not` of the truthiness of `b` + +{% rockstar_include inequality.rock %} + +### Identity +To compare values without performing any type coercion, use the `exactly` keyword, or its aliases `really`, `actually` or `totally`: + +{% rockstar_include identity.rock %} + +### Comparison + +Rockstar supports the following comparison operators: + +- `is higher/greater/bigger/stronger than` to denote ‘greater than’ +- `is lower/less/smaller/weaker than` to denote ‘less than’ +- `is as high/great/big/strong as` to denote ‘greater than or equal to’ +- `is as low/little/small/weak as` to denote ‘less than or equal to’ + +By default, comparison use type coercion: + +* If either operand is a string, it's compared to the string representation of the other value + * This means that `10 < "2"`, because `10` is coerced to the string `10`, which is alphanumerically less than the string `2` +* Otherwise, the numeric values of the operands are compared (`true` is `1`, `null` and `false` are 0) + +{% rockstar_include string-comparison.rock %} + + + + + + + + + + + + + + diff --git a/codewithrockstar.com/docs/06-expressions.md b/codewithrockstar.com/docs/06-expressions.md new file mode 100644 index 00000000..b752b40d --- /dev/null +++ b/codewithrockstar.com/docs/06-expressions.md @@ -0,0 +1,81 @@ +--- +title: Expression Lists +layout: docs +examples: /examples/06-expressions/ +nav_order: "1005" +summary: What's the difference between a variable list, an expression list, and a primary list? Do you care? We care. Not a lot, but we do. +--- +## Expression lists + +There are many places in Rockstar where you can provide a list in place of an expression... and if you can have a list of expressions, and an expression can be a list, things get all wibbly-wobbly and you can go all cross-eyed. + +{% rockstar_include expression-lists.rock %} + +Let's start with the easy one: a **variable list** + +Variable lists are used to declare the arguments to a function. **They can only contain variable names**, and variables must be separated by one of: + +* A comma `,` +* An ampersand `&` +* The keyword `and` +* The Oxford comma `, and` +* A *nacton* + +> **Nacton** *(n.)* The 'n' with which cheap advertising copywriters replace the word 'and' (as in 'fish 'n' chips', 'mix 'n' match', 'assault 'n' battery'), in the mistaken belief that this is in some way chummy or endearing. +> +> - "The Meaning of Liff", Douglas Adams & John Lloyd + +Rockstar supports both the **UK nacton** `'n'` (as in *fish 'n' chips*) and the **US nacton** `n'` (as in *Guns n' Roses*.) + +{% rockstar_include variable-lists.rock %} + +Then there's an **primary list**, used to provide arguments to a function. The elements in a primary list must be **primaries**, and you **can't separate a primary list with an Oxford comma** - if the parser sees `, and`, that means the primary list is finished and move on to the next thing. + +{% rockstar_include primary-lists.rock %} + +Rockstar grammar supports three different kinds of lists: + +* Expression lists +* Variable lists +* Primary lists + +Foo is 1 with 2 + 3, 4, 5 and 6, bar taking 7, 8 and 9, 10, "yeah" + +First, `8 and 9` cannot be a function argument (functions only accept primaries), so `bar taking 7` is an expression: + +Foo is 1 with 2 + 3, 4, 5 and 6, (bar taking 7), 8 and 9, 10, "yeah" + +Second, ` and ` (with no leading comma) is always the logical-and operator, and the right-hand operand in a logic expression can't be a list: + +Foo is 1 with 2 + 3, 4, (5 and 6), (bar taking 7), (8 and 9), 10, "yeah" + +So now we propagate the `+` operator to each adjacent pair of arguments + +Foo is 1 + 2 + 3 + 4 + (5 and 6) + (bar taking 7) + (8 and 9) + 10 + yeah + +So from the left: + +1 with (2 + 3, 4, ) + +The most restrictive is the **primary list**, used in compound arithmetic expressions: + +Elements in a primary list must be primary expressions. A **primary expression** in Rockstar is anything which yields a value without using any operators. Primaries are literal strings and numbers, variables, function calls, and language constants. + +Elements in a primary list are separated by one of: + +* Comma `,` +* Ampersand `&` +* A *nacton* + +Next, there are **expression lists**. An expression list supports the same separators as the primary list, but also supports the **Oxford comma** separator `, and ` Because you can't put an Oxford comma in a primary list, this means an expression list can contain expressions that themselves contain primary lists; the Oxford comma provides an unambiguous way to separate the sub-expressions. + +Expression lists are supported as arguments to compound expressions and when rocking arrays: + +{% rockstar_include expression-lists.rock %} + +Finally, there are **variable lists**, used to specify the arguments when defining a function. + +Because the elements in the list can **only** be variable names, a variable list supports all the separators used in primary and expression lists, and also the bareword ` and ` (with no commas or punctuation required). + + + diff --git a/codewithrockstar.com/docs/07-flow-control.md b/codewithrockstar.com/docs/07-flow-control.md new file mode 100644 index 00000000..dc3955ac --- /dev/null +++ b/codewithrockstar.com/docs/07-flow-control.md @@ -0,0 +1,118 @@ +--- +title: Flow Control +layout: docs +examples: /examples/07-flow-control/ +nav_order: "1006" +summary: If, else, otherwise, loops, until, while... and how to end a block, oooh, yeah, baby. +--- +## Conditionals: If / Else + +Consider this instruction: + +> Go to the store. If they have oranges, get a dozen, then get some bagels. + +If the store doesn't have oranges, should you still get bagels? + +C-style languages resolve this using braces and block syntax: + +```c +if (they have oranges) { + get a dozen +} +get some bagels +``` +compared with: +```c +if (they have oranges) { + get a dozen + get some bagels +} +``` + +Rockstar doesn't have curly braces, because you can't sing curly braces, so Rockstar has to use some syntactic tricks to resolve these kinds of ambiguities. + +If statements can be one-liners, or conditional blocks. +### One-line if + +One-line if statements don't create any block scope. However many `if` statements you stack on the same line, the final statement on the line either runs or it doesn't, and then you're done: + +{% rockstar_include if-else-oneliners.rock %} + +### Multiline conditionals + +Multiline conditionals are a little more complex, because they can create nested scopes. Here's an example which uses some very un-Rockstar indentation to keep track of scope: + +{% rockstar_include indented-if.rock %} + +If the condition or the `else` keyword is followed by a new line, it begins a new **block**. A block is a series of statements separated by statement separators (newlines or punctuation `.!?;`). The end of a block is denoted by: + +* An empty line (a line containing only whitespace and/or comments) +* The `end` keyword or any of its aliases `oh`, `yeah` or `baby` -- see below. +* The `else` or `otherwise` keywords implicitly end the current block and start the alternate block for the current `if`. + +The end of file (EOF) will implicitly close any open blocks. This isn't Lisp, folks. The parser knows what you mean. +## This is the end, oh yeah, baby + +Consider this example from a C-like language: +```c +if (x) { + if (y) { + if (z { + print "this might get printed" + } + } +} +print "this always gets printed" +``` + +Before the final line, we need to close three blocks, so we use three closing braces -- `} } }`. + +Languages like Python that use indentation to control scope don't have this problem: indenting creates a block, and if you drop a level of indentation, the block's over. + +Rock lyrics don't have curly braces, and they don't have indentation. To end a block, you can use the keyword `end`: + +{% rockstar_include oh-yeah-baby-minimalist.rock %} + +Singing `end end end` doesn't sound very rock'n'roll, so Rockstar also supports the aliases `oh`, `yeah` and `baby` - because it turns out you can get away with repeating that stuff almost *ad infinitum* and it just sounds like song lyrics. The Corrs' "So Young" opens with the line "yeah, yeah, yeah, yeah, yeah", Whitesnake's "The Deeper The Love" has a "baby baby baby", and if you throw in the odd "oh, yeah baby, yeah yeah yeah" you can close half-a-dozen nested blocks and nobody's going to notice except the Rockstar parser. + +{% rockstar_include oh-yeah-baby-idiomatic.rock %} +### Oooooh + +You can also close as many blocks as you need to by using Rockstar's `oooh` keyword. This closes one block for every letter `o` -- so `oh` closes one block, `ooh` closes two blocks, `oooh` closes three blocks, and so on. You can also combine `oooh` with other keywords, so that `oooh yeah baby` will close five blocks, and if there's a blank line immediately after it, that'll close a sixth block. + +{% rockstar_include ooooh.rock %} + +### Loops: While and Until + +Loops are denoted by the `while` and `until` keywords. + +{% rockstar_include while.rock %} + +{% rockstar_include until.rock %} + +Nested loops create block scope: as with `if` statements, you must end the block with a newline, `end`, `yeah`, `baby`, and you can end one or more blocks using the `oooh` syntax: + +{% rockstar_include nested-loops.rock %} + + To break out of a loop, use the `break` keyword. + +{% rockstar_include break.rock %} + +To skip the rest of the current loop and start the next iteration, use the `continue` keyword: + +{% rockstar_include continue.rock %} + +`break` and `continue` are **wildcard keywords** - everything between the keyword and the next end-of-statement is ignored, so the following are all equivalent: + +``` +break it down +break my heart +break on through to the other side +``` + +{% rockstar_include break-and-continue-wildcard.rock %} + + + + + diff --git a/codewithrockstar.com/docs/08-functions.md b/codewithrockstar.com/docs/08-functions.md new file mode 100644 index 00000000..e9436056 --- /dev/null +++ b/codewithrockstar.com/docs/08-functions.md @@ -0,0 +1,93 @@ +--- +title: Functions +layout: docs +examples: /examples/08-functions/ +nav_order: "1007" +summary: Like many of the fine rock'n'rollers who inspired it, Rockstar can't really be said to be functional - but it does have functions. +--- +Functions are declared with a variable name followed by the `takes` keyword (alias `wants`) and a list of arguments separated by one of the following: `and` `,` `&` `, and` `'n'` + +{% rockstar_include functions.rock %} + +Functions can be one-liners, usually written with the `giving` keyword: + +{% rockstar_include one-line-functions.rock %} + +Function bodies can also be a block. Functions in Rockstar specified by the `return` keyword and its aliases `giving`, `give`, `give back` and `send`. A return statement can be followed by the keyword `back` (which has no effect but can make code more lyrical). + +{% rockstar_include polly-wants-a-cracker.rock %} + +Functions are called using the ‘taking’ keyword and must have at least one argument. Multiple arguments are separated with one of the following: `,` `&` `, and` `'n'`. + +Function arguments must be primary expressions: + +{% rockstar_include function-calls-as-arguments.rock %} + +> The reason you can't use operators inside function arguments is that it makes it awkward to write recursive function calls. Consider this expression +> +> ``` +> result = foo taking 1 + foo taking 2 +> ``` +> ...is that `foo(1 + foo(2)`, or `foo(1 + foo(2))`? Without using parentheses to surround function arguments, the parser can't disambiguate between the two - and since there's no way we're putting parentheses in Rockstar, the only solution is to disallow operators in function arguments. + +This is also one of the few features where the language **grammar** is ambiguous, and what's produced by the parser doesn't necessarily match what's executed by the interpreter. The parser is greedy and it doesn't know anything about how many arguments a function takes (its *arity*), so this expression: + +```rockstar + FuncA taking FuncB taking 1, 2, FuncB taking 3, 4 + ``` + +will produce this parse tree: + +``` +function call: FuncA + function call: FuncB + 1 + 2 + function call: FuncB + 3 + 4 +``` + +Thing is, FuncB doesn't take three arguments - so rather than failing, the Rockstar interpreter only evaluates as many function arguments as the function is expecting, and any "leftover" expressions will be passed back to the outer function call, so what actually gets executed is: + +``` +call: FuncA +  args: +  1: call: FuncB: +     args: +     1: number: 1 +     2: number: 2 + 2: call: FuncB } +    args: } FuncB only expects two arguments, so +    1: number: 3 } the interpreter passes this one to the +    2: number: 4 } outermost function instead. +``` + +Functions can contain other functions, and because every function defines its own variable scope, nested functions can have the same names as the functions which enclose them. *(I have no idea why you would ever want to do this, but making it impossible would have been really difficult.)* + +```rockstar + {% rockstar_include nested-functions.rock %} + ``` + +To declare a function with no arguments, specify it `takes null` (or aliases `nothing`, `nowhere`, `nobody`). To call a function with no arguments, use the `call` keyword, or suffix the function name with an exclamation mark: + +```rockstar + {% rockstar_include functions-with-no-arguments.rock %} + ``` +### Variables, Closures and Function Scope +Rockstar uses the same scoping mechanism as JavaScript: + +* Variables are global unless you declare them with `let` +* Global variables aren't *really* global unless they're declared at the top level of your program. + +In this example, calling `My function` initialises two variables: + +```rockstar + {% rockstar_include function-scope.rock %} + ``` + +You can declare variables inside functions, functions can contain other functions, and declaring a function inside another function creates a *closure*, which captures the state of any variables that existed when the function was declared. + + + + diff --git a/codewithrockstar.com/docs/09-arrays.md b/codewithrockstar.com/docs/09-arrays.md new file mode 100644 index 00000000..da8a4447 --- /dev/null +++ b/codewithrockstar.com/docs/09-arrays.md @@ -0,0 +1,127 @@ +--- +title: Arrays and Collections +layout: docs +examples: /examples/09-arrays/ +nav_order: "1008" +summary: Whether it's a set list, the stack of 4x12 speaker cabinets, or the queue of eager fans waiting to get into the show, rock'n'roll is all about collections. Just no hashes until after the show, OK? +--- +## Arrays + +Rockstar supports JavaScript-style arrays. Arrays are zero-based, and dynamically allocated when values are assigned using numeric indexes. Array elements are initialised to `null`; passing an out-of-range index returns `mysterious`: + +{% rockstar_include basic-arrays.rock %} + +> Array indexers can be primary values or arithmetic expressions, but **you can't use a logical expression as an array indexer.** +> +> Consider `My array at 2 is 4` +> +> If not for this restriction, the parser would consume `2 is 4` as a comparison *("2 is 4 - true or false?")*, return `false`, try to set `My array at false` and then blow up 'cos there's nothing to put in it. + +Returning an array in a numeric context will return the current length of the array: + +{% rockstar_include array-length-as-scalar.rock %} + +> Under the hood, a Rockstar array actually contains two collections, known as the *list* and the *hash*. The list is an integer-indexed linear list of values; when you push, pop, rock and roll arrays, you're modifying the list. If you set elements whose key is not a non-negative integer, those elements are stored in the *hash*. + +Array indexes can be of any type, and you can mix key types within the same array. The array length only considers keys whose values are non-negative integers: + +{% rockstar_include non-integer-keys.rock %} + +Arrays in Rockstar are one-dimensional, but they can contain other arrays: + +{% rockstar_include non-integer-keys.rock %} + +You can use indexes to read characters from strings, and extract bits from numbers. You can also use indexers to modify individual characters in a string: + +{% rockstar_include indexers-for-scalar-types.rock %} + +Trying to assign an indexed value to an existing variable which is not an array will cause an error: + +{% rockstar_include invalid-assignment.rock %} + +### Looping over arrays + +To loop over the *list* elements of an array, use `for in ` If you also need the index of each element, use `for and in `: + +{% rockstar_include for-in.rock %} + +To loop over the *hash* elements of an array, use `for of ` - this will call the loop once for each element in the hash, setting *key* to the key of that element. If you need the element values as well, use `for and of `: + +{% rockstar_include for-of.rock %} + +This can lead to some slightly odd-sounding lyrics: + +``` +For star in the sky +Whisper star +Yeah +``` + +so you can use the `every` keyword, which will prepend `the ` to the variable names assigned inside the body of the loop: + +``` +For every star in the sky +Whisper the star +Yeah +``` +### Queue operations + +Rockstar arrays can also be created and manipulated by the queue operations `rock` and `roll`. `push` and `pop` are supported for Rockstar developers who are into 80s dance music. +#### Pushing elements onto an array + +To create a new empty array, `push` or `rock` the name of the array. To push an element onto the end of the array, `push `. + +{% rockstar_include rock-and-roll.rock %} + +You can rock list expressions, so you can push multiple elements onto the end of an array: + +{% rockstar_include rock-and-roll-tommy.rock %} + +If it makes for better lyrics, you can use the `with` keyword - `rock with `. Remember the `with` keyword is context-sensitive, so in this example: + +``` +Rock ints with 1, 2 with 3, 4, 5 + ^ ^ + | +-- this 'with' is the binary addition operator + | + +------------ this 'with' is part of the array push syntax + +(ints is now [ 1, 5, 4, 5 ]) +``` + +This syntax is very useful for initialising strings without using string literals - see below. It also means that the following is valid Rockstar: + +{% rockstar_include the-scorpions.rock %} +#### Popping elements from an array + +The `roll` keyword will remove the first element from an array and return the element that was removed. + +{% rockstar_include roll.rock %} +`roll` can be used in assignments: + +{% rockstar_include roll-assign.rock %} + +Rockstar also supports a special `roll x into y` syntax for removing the first element from an array and assigning it to a variable: + +{% rockstar_include roll-into.rock %} + +## Array Arithmetic + +As with strings, Rockstar tries hard to return *something* in every scenario, just in case one day somebody out there finds it useful. + +Adding arrays to numbers adds the *length* of the array (this is the same logic that kicks in when you test an array to see if there's anything left in it.) Adding anything else to an array will append it to the end of the array. + +{% rockstar_include adding-arrays.rock %} + +Subtracting arrays from arrays will return a new array, created by removing any elements in the second array from the elements of the first. + +* List elements are removed if the *value* is present +* Hash elements will be removed if they match both the key and the value. + + Subtracting any other value from an array returns a new array with any instances of the subtracted element removed. + +{% rockstar_include subtracting-arrays.rock %} + + + + diff --git a/codewithrockstar.com/docs/10-conversions.md b/codewithrockstar.com/docs/10-conversions.md new file mode 100644 index 00000000..4e3b6d7d --- /dev/null +++ b/codewithrockstar.com/docs/10-conversions.md @@ -0,0 +1,69 @@ +--- +title: Conversions and Mutations +layout: docs +examples: /examples/10-conversions/ +nav_order: "1009" +summary: "Every great entourage has a fixer: the person who sorts out those last few bits that weren't really anybody else's job. Conversions and mutations are Rockstar's fixers: if you need to parse strings into numbers, convert character codes, we got you." +--- +### Conversions and Mutations + +Most of Rockstar's built-in operations can either act in place, modifying the variable passed to them, or leave the result in a target variable and leave the source unmodified: + +* `Modify X` - acts in-place +* `Modify X into Y` - leave `X` intact, store the result into `Y` +* `Modify X with Z` - act in place, using optional parameter `Z` +* `Modify X into Y with Z` - modify `X` using `Z`, store the result in `y` + +### Splitting Strings + +To split a string in Rockstar, use the `cut` mutation, or aliases `split` and `shatter`. + +{% rockstar_include split-strings.rock %} + + +### Joining Arrays + +To join an array in Rockstar, use the `join` mutation, or the aliases `unite` or `gather`: + +{% rockstar_include join-arrays.rock %} + +### Type Conversions + +To convert any value to a string, add it to the empty string. + +{% rockstar_include join-arrays.rock %} + +The built-in `cast` function (aka `burn`) will parse strings into numbers, or convert a number into a Unicode character corresponding to the number's code point. + +{% rockstar_include cast.rock %} + +#### Arithmetic Rounding + +Rounding in Rockstar is performed by the `turn` keyword. `Turn up` will round up (i.e. towards positive infinity), to the nearest integer; `turn down` will round down (towards negative infinity) to the nearest integer, and `turn round` will round to the nearest integer. Bonnie Tyler enthusiasts will be pleased to note that Rockstar accepts `turn around` as a valid alias. + +Turn operations act in-place: they modify the variable directly, and will return the rounded value. + +``` +X is 1.2 +Turn up X +Shout X (will print 2) + +X is 1.2 +Turn down X +Shout X (will print 1) + +The radio's playing. The night has just begun. + (initialises the radio with 7.35345) +Turn up the radio +Say the radio (will print 8) +``` + +Rounding supports variable [pronouns](https://docs.codewithrockstar.com/docs#pronouns), so you can write phrases like: + +``` +My heart is on fire. Aflame with desire. +Turn it up. +Shout it. +``` + +which will print the value 25 (obviously). diff --git a/codewithrockstar.com/docs/99-rockstar-acid-test.md b/codewithrockstar.com/docs/99-rockstar-acid-test.md new file mode 100644 index 00000000..a53df997 --- /dev/null +++ b/codewithrockstar.com/docs/99-rockstar-acid-test.md @@ -0,0 +1,8 @@ +--- +title: Rockstar Acid Test +nav_order: "9999" +layout: docs +nav_exclude: true +--- + +{% rockstar_include acid-test.rock %} \ No newline at end of file diff --git a/codewithrockstar.com/docs/9999-codemirror-kitchen-sink.md b/codewithrockstar.com/docs/9999-codemirror-kitchen-sink.md new file mode 100644 index 00000000..1bc69931 --- /dev/null +++ b/codewithrockstar.com/docs/9999-codemirror-kitchen-sink.md @@ -0,0 +1,43 @@ +--- +title: CodeMirror Kitchen Sink +layout: docs +nav_order: "9999" +nav_exclude: true +--- + +The CodeMirror Syntax Highlighting Kitchen Sink: + +```kitchen-sink +Comment LineComment BlockComment +DocComment Name VariableName +TypeName TagName PropertyName +AttributeName ClassName LabelName +Namespace MacroName Literal +String DocString Character +AttributeValue Number Integer +Float Bool Regexp +Escape Color Url +Keyword Self Null +Atom Unit Modifier +OperatorKeyword ControlKeyword DefinitionKeyword +ModuleKeyword Operator DerefOperator +ArithmeticOperator LogicOperator BitwiseOperator +CompareOperator UpdateOperator DefinitionOperator +TypeOperator ControlOperator Punctuation +Separator Bracket AngleBracket +SquareBracket Paren Brace + +Heading Content ContentSeparator + +Heading1 Heading2 Heading3 +Heading4 Heading5 Heading6 + +List Quote Emphasis +Strong Link Monospace +Strikethrough Inserted Deleted +Changed Invalid Meta +DocumentMeta Annotation ProcessingInstruction + +Definition(tag) Constant(tag) Function(tag) +Standard(tag) Local(tag) Special(tag) +``` diff --git a/codewithrockstar.com/docs/index.md b/codewithrockstar.com/docs/index.md new file mode 100644 index 00000000..e1420899 --- /dev/null +++ b/codewithrockstar.com/docs/index.md @@ -0,0 +1,23 @@ +--- +title: Docs Home +layout: home +examples: /examples/01-getting-started/ +nav_exclude: false +nav_order: "0000" + +--- + +

Rockstar Docs

+ +

This is the official documentation for Rockstar v2.

+

Yes, the joke has documentation. If we didn't have docs, we wouldn't be able to make +a joke about how Tommy used to work on the docs.

+
    +{% assign contents = site.pages | where_exp:"item", "item.summary != nil" %} +{% for page in contents %} +
  • + {{ page.title }} +

    {{ page.summary }}

    +
  • +{% endfor %} +
diff --git a/codewithrockstar.com/favicon.ico b/codewithrockstar.com/favicon.ico new file mode 100644 index 00000000..7cba5fe4 Binary files /dev/null and b/codewithrockstar.com/favicon.ico differ diff --git a/codewithrockstar.com/gallery.md b/codewithrockstar.com/gallery.md new file mode 100644 index 00000000..d004f2de --- /dev/null +++ b/codewithrockstar.com/gallery.md @@ -0,0 +1,14 @@ +--- +title: Gallery +layout: home +nav_order: "1099" +nav_exclude: true + +--- +### Hello World + +{% rockstar_include hello-world.rock %} +### Mandelbrot Set + +{% rockstar_include mandelbrot.rock %} + diff --git a/codewithrockstar.com/grammars/rockstar.peg b/codewithrockstar.com/grammars/rockstar.peg new file mode 100644 index 00000000..1332058c --- /dev/null +++ b/codewithrockstar.com/grammars/rockstar.peg @@ -0,0 +1,649 @@ +@namespace Rockstar.Engine +@classname Parser +@using System.Globalization +@using System.Text.RegularExpressions +@using Rockstar.Engine.Statements +@using Rockstar.Engine.Expressions +@using Rockstar.Engine.Values +@trace true + +/* + +Notes on Rockstar grammar + +Rockstar has significant whitespace. Most operators, keywords, etc. *must* be separated by _. + +Rules beginning with _ include their own leading whitespace, so should +go immediately after the preceding expression. Rules ending with _ including their own trailing +whitespace. + +*/ + +@ignorecase true + +program + = EOS* head:block tail:program + { new Program(head).Concat(tail) } + / EOS* EOF + { new Program() } + // unexpected:("" [^ \t\r\n]+) + // #error{ $"Unexpected '{unexpected.Replace("\r", "\\r").Replace("\n", "\\n")}' at line {state.Line}, col {state.Column - unexpected.Length}" } + +block + = _? head:statement EOS tail:block + { new Block(head).Concat(tail) } + / _? stmt:statement + { new Block(stmt) } + +statement -memoize + = listen_stmt + / output_stmt + / function + / function_call + / call_stmt + / return_stmt + / break_stmt + / continue_stmt + / loop + / conditional + / declaration + / assignment + / enlistment + / increment + / decrement + / mutation + / rounding + / exit_statement + / !EOB e:expression &(EOS / EOF) { new ExpressionStatement(e) } + + +enlistment + = push _ e:expression _ into _ v:variable + { new Enlist(v, e) } + / push _ v:variable (_ with)? _ e:expression_list + { new Enlist(v, e) } + / push _ v:variable + { new Enlist(v) } + / d:delist _ into _ t:assignable + { new Assign(t, d) } + / d:delist + { new ExpressionStatement(d) } + +delist + = pop _ v:variable + { new Delist(v) } + +listen_stmt + = listen _ to _ v:variable + { new Listen(v) } + / listen + { new Listen() } + +return_stmt + = return (_ back)? _ e:expression (_ back)? + { new Return(e) } + +function + = name:variable _ takes _ null body:consequent + { new Assign(name, new Function(body)) } + / name:variable _ takes _ args:variable_list body:consequent + { new Assign(name, new Function(args, body)) } + +variable_list > + = head:variable _VLS_ tail:variable_list { head.Concat(tail) } + / arg:variable { new List { arg } } + +primary_list > + = head:primary _XLS_ tail:primary_list { head.Concat(tail) } + / head:primary _XLS_ tail:primary { new List { head, tail } } + +argument_list > + = head:primary _ALS_ tail:argument_list { head.Concat(tail) } + / head:primary { new List { head } } + +expression_list > + = head:expression _ALS_ tail:expression_list { head.Concat(tail) } + / expr:expression { new List { expr } } + +oxford_comma = ',' _ and +_nacton = (_ "n'" / _? "'n'") + +_VLS_ = _ and _ / _ALS_ +_ALS_ = oxford_comma _ / _XLS_ +_XLS_ = ','? _nacton _? + / (',' _? ('&' _?)?) + / _? '&' _? + / _? ',' _? + +break_stmt + = break w:wildcard + { new Break(w) } + +continue_stmt + = continue w:wildcard + { new Continue(w) } + +end_of_wildcard = (end / 'o'+ 'h' ) + +exit_statement + = exit { new Exit() } + +wildcard + = ignored:([^,.?!;\r\n]* ) { String.Join("", ignored.ToArray()) } + / ignored:((. !end_of_wildcard)* .) { String.Join("", ignored.ToArray()) } + +filler = (_ / [,?!.;])* +EOS = EOL / _? [.?!;:] +EOL = filler '\r'? '\n' +EOF = EOS* _? !. + +ooh = 'o' &('o'+ 'h') +eob_signal + = &(_? else) // lookahead - if the next bit starts with else, end the block + / ','? _? ooh + / ','? _? end filler + +EOB -memoize + = EOS* eob_signal + / EOL &EOL + / EOF + +consequent + // Yes, you SHOULD be able to put EOB at the end of the BLOCK definition and it'll work. + // IT DOESN'T. I have no idea why. It screws up break/continue wildcard parsing. + = ',' _ b:block EOB { b } + / EOS+ b:block EOB { b } + / ','? _ s:statement { new Block(s) } + +if_test + = if _ e:expression (_ then)? + { e } + +alternate + = _? else a:consequent { a } + / EOS+ else a:consequent { a } + +conditional + = e:if_test c:consequent a:alternate + { new Conditional(e, c, a) } + / e:if_test a:alternate + { new Conditional(e, new Block(), a ) } + / e:if_test c:consequent + { new Conditional(e, c) } + +loop + = while _ test:expression body:consequent + { new WhileLoop(test, body) } + / until _ test:expression body:consequent + { new UntilLoop(test,body) } + +output_stmt + = debug _ e:expression + { new Debug(e) } + / write _ e:expression + { new Output(e) } + / print _ e:expression + { new Output(e, Environment.NewLine) } + +assignable + = v:variable i:indexes + { v.AtIndex(i) } + / v:variable { v } + +declaration + = let _ v:assignable _ be op:_operator_ e:expression_list + { new Declare(v, new Binary(op, new Lookup(v), e)) } + / let _ v:assignable _ be _ e:expression + { new Declare(v, e) } + / let _ v:assignable + { new Declare(v) } + +assignment + = put _ e:expression _ into _ v:assignable + { new Assign(v, e) } + / v:assignable _ says_ s:poetic_string + { new Assign(v, s) } + / v:assignable _is op:_operator_ e:expression_list + { new Assign(v, new Binary(op, new Lookup(v), e)) } + / v:assignable _is _ now _ e:expression + { new Assign(v, e) } + // Legacy workaround to preserve compatibility with v1 poetic literal syntax + / v:assignable (_? '=' _? / _is _) p:v1_poetic_number + { new Assign(v, p) } + / v:assignable (_? '=' _? / _is _) e:expression + { new Assign(v, e) } + +_operator_ = + _plus_ / _minus_ / _times_ / _divide_ + +says_ = says ("" ' '? / !letter) + +poetic_string + = s:("" [^\r\n]+) &('\r'? '\n') + { new Strïng(s) } + +_is -memoize + = _is _ exactly + { Operator.IdenticalTo } + / ("'s" / "'re" / _ is) + { Operator.Equals } + +_isnt -memoize + = _isnt _ exactly + { Operator.NotIdenticalTo } + / (_is _ not / _ isnt) + { Operator.NotEquals } + +variable + = i:(his _ !keyword identifier) { new CommonVariable(i) } + / i:pronoun { new Pronoun(i) } + / i:proper_variable { new ProperVariable(i) } + / i:(the _ identifier) { new CommonVariable(i) } + / !keyword i:identifier { new SimpleVariable(i) } + +proper_variable = proper_noun (_ proper_noun)+ + +proper_noun = uppercase_letter '.' + / !keyword &uppercase_letter identifier + +identifier + = letter (letter / [0-9_])* + +letter = uppercase_letter / lowercase_letter + +uppercase_letter = c:. &{ Char.IsUpper(c,0) } +lowercase_letter = c:. &{ Char.IsLower(c,0) } + +expression + = boolean + / primary + +boolean = binary_or + +binary_or + = lhs:binary_nor _ or _ rhs:binary_or { new Binary(Operator.Or, lhs, rhs) } + / binary_nor + +binary_nor + = lhs:binary_and _ nor _ rhs:binary_nor { new Binary(Operator.Nor, lhs, rhs) } + / binary_and + +binary_and + = lhs:equality _ and _ rhs:binary_and { new Binary(Operator.And, lhs, rhs) } + / equality + +equality + = lhs:unary op:(_is / _isnt) _ rhs:equality { new Binary(op, lhs, rhs) } + / unary + +unary + = not_ u:unary { new Unary(Operator.Not, u) } + / comparison + +not_ + = (not _ / non _ / non '-' ) + +comparison + = lhs:addition op:comparator rhs:comparison { new Binary(op, lhs, rhs) } + / addition + +comparator + = (_? '>=' _? / _is _ as _ as_great _ as _) { Operator.MoreThanEqual } + / (_? '<=' _? / _is _ as _ as_small _ as _) { Operator.LessThanEqual } + / (_? '>' _? / _is _ (above / more _ than) _) { Operator.MoreThan } + / (_? '<' _? / _is _ (under / less _ than) _) { Operator.LessThan } + +numeric_expression + = addition + +addition -memoize + = lhs:addition op:(_plus_/_minus_) rhs:primary_list + { new Binary(op, lhs, rhs) } + / lhs:addition op:(_plus_/_minus_) rhs:product + { new Binary(op, lhs, rhs) } + / product + +product -memoize + = lhs:product op:(_divide_/_times_) rhs:primary_list + { new Binary(op, lhs, rhs) } + / lhs:product op:(_divide_/_times_) rhs:primary + { new Binary(op, lhs, rhs) } + / primary + +_plus_ = (_? '+' _? / _ plus _ ) { Operator.Plus } +_minus_ = (_? '-' _? / _ minus _ ) { Operator.Minus } +_times_ = (_? '*' _? / _ times _ ) { Operator.Times } +_divide_ = (_? '/' _? / _ divided_by _ ) { Operator.Divide } + +primary -memoize + = function_call + / delist + / constant + / string + / number + / lookup + // unexpected:("" [^ \t\r\n]+) + // #error{ $"Expected primary expression, found '{unexpected}' at line {state.Line}, col {state.Column - unexpected.Length}" } + +call_stmt + = call _ name:variable _ with _ args:argument_list _ into _ a:assignable + { new Assign(a, new FunctionCall(name, args)) } + / call _ name:variable _ with _ args:argument_list + { new FunctionCall(name, args) } + / call _ name:variable _ into _ a:assignable + { new Assign(a, new FunctionCall(name)) } + / call _ name:variable + { new FunctionCall(name) } + +function_call + = name:variable _ taking _ args:argument_list + { new FunctionCall(name, args) } + +lookup + = v:variable i:indexes + { new Lookup(v.AtIndex(i)) } + / v:variable + { new Lookup(v) } + +index + = _ at _ i:numeric_expression + { i } + +indexes > + = head:index tail:indexes + { head.Concat(tail) } + / head:index + { new List { head } } + + +increment + = build _ v:variable t:((_? ',')? _? up)+ + { new Increment(v, t.Count) } + +decrement + = knock _ v:variable t:((_? ',')? _? down)+ + { new Decrement(v, t.Count) } + +mutator + = split + { Operator.Split } + / cast + { Operator.Cast } + / join + { Operator.Join } + +mutation + = op:mutator _ s:expression _ into _ t:assignable _ using _ m:expression + { new Mutation(op, s, target: t, m) } + / op:mutator _ s:expression _ using _ m:expression _ into _ t:assignable + { new Mutation(op, s, target: t, modifier: m) } + / op:mutator _ s:expression _ into _ t:assignable + { new Mutation(op, s, target: t) } + / op:mutator _ s:assignable _ using _ m:expression + { new Mutation(op, s, target: s, modifier: m) } + / op:mutator _ s:assignable + { new Mutation(op, s, target: s) } + +rounding + = floor / ceil / math_round + +floor + = turn _ v:variable _ down + { new Rounding(v, Round.Down) } + / turn _ down _ v:variable + { new Rounding(v, Round.Down) } + +ceil + = turn _ v:variable _ up + { new Rounding(v, Round.Up) } + / turn _ up _ v:variable + { new Rounding(v, Round.Up) } + +math_round + = turn _ v:variable _ around + { new Rounding(v, Round.Nearest) } + / turn _ around _ v:variable + { new Rounding(v, Round.Nearest) } + + +constant + = null { Null.Instance } + / true { Booleän.True } + / false { Booleän.False } + / empty { Strïng.Empty } + / mysterious { Mysterious.Instance } + +number + = like _ n:poetic_number { n } + / d:digits&{ decimal.TryParse(d, out var _) } + { new Number(d) } + / d:digits + #error{ $"Number {d} is out of range" } +digits + = d:("" (('-' /'+')? [0-9]+ ("." [0-9]+)?) + / (('-' /'+')? "." [0-9]+)) + +poetic_number + = whole_part:poetic_digits _? separator:('...' / '…') _ fractional_part:poetic_digits + { new PoeticNumber (whole_part, separator, fractional_part) } + / digits:poetic_digits + { new PoeticNumber(digits) } + +// So... in Rockstar v1, you could say "desire is a lovestruck ladykiller" +// Which worked. But for v2, poetic numbers have to start with 'like' or 'so' +// So this is a workaround to preserve most existing usage but enable +// the new syntax, by retrofitting a rule that a poetic number using v1 +// syntax must start with a letter, and can't start with any keyword +// indicating an arithmetic or logical operator. +v1_digit_filter + = &letter !keywords_which_can_begin_an_expression + +v1_poetic_number + = _? &v1_digit_filter whole_part:poetic_digits _? separator:('.') _ fractional_part:poetic_digits + { new PoeticNumber (whole_part, separator, fractional_part) } + / _? &v1_digit_filter digits:poetic_digits + { new PoeticNumber(digits) } + +PDS = ("" _ / [0-9\',;:?!+_/] ) + +poetic_digits + = PDS* head:poetic_digit PDS+ tail:poetic_digits PDS* + { head + " " + tail } + / d:poetic_digit + { d } + +poetic_digit + = word:("" (letter / [\-'])+) + +string = s:quoted_string+ { new Strïng(String.Join("\"", s)) } +quoted_string + = '"' s:("" [^"]*) '"' { s } + +keywords_which_can_begin_an_expression + = plus / minus / times / divided_by + / like / and / or / nor / not / non + / null / true / false / empty / mysterious + +keyword + = keywords_which_can_begin_an_expression + / as + / as_great + / as_small + / back + / be + / build + / cast + / down + / else + / end + / false + / if + / into + / is + / isnt + / join + / knock + / less + / let + / listen + / more + / non + / not + / null + / or + / over + / print + / pronoun + / put + / return + / says + / split + / takes + / taking + / than + / the + / to + / until + / up + / while + +_ = "" (whitespace / comment)+ +whitespace = [ \t] + +comment + = line_comment + / chordpro_comment + / block_comment + +line_comment = '#' [^\n]* '\n' +chordpro_comment = '{' [^\}]* '}' / '[' [^\]]* ']' +start_comment = '(' +end_comment = ')' +not_comment = (!start_comment !end_comment .) +block_comment = start_comment (comment / not_comment)* end_comment + + + + +above = 'above' !letter / over +and = 'and' !letter +around = 'around' !letter / 'round' !letter +as = 'as' !letter +as_great = 'great' !letter / 'high' !letter / 'big' !letter / 'strong' !letter +as_small = 'less' !letter / 'low' !letter / 'small' !letter / 'weak' !letter +at = 'at' !letter +back = 'back' !letter +be = 'be' !letter +break = 'break' !letter +build = 'build' !letter +call = 'call' !letter +cast = 'cast' !letter / 'burn' !letter +continue = 'continue' !letter / 'take' !letter +debug = 'debug' !letter +divided_by = 'divided' _ 'by' !letter / 'between' !letter / over +down = 'down' !letter +else = 'else' !letter / 'otherwise' !letter +empty = 'empty' !letter / 'silent' !letter / 'silence' !letter +end = 'end' !letter / 'yeah' !letter / 'baby' !letter / 'oh' !letter +exit = 'exit' !letter +exactly = 'exactly' !letter / 'totally' !letter / 'really' !letter +false = "false" !letter / "lies" !letter / "no" !letter / "wrong"!letter +his = 'his' !letter / 'her' !letter +if = 'if' !letter / 'when' !letter +into = 'into' !letter / 'in' !letter +is = 'is' !letter / 'was' !letter / 'are' !letter / 'were' !letter / 'am' !letter +isnt = "isnt" !letter / "isn't" !letter / 'aint' !letter / "ain't" !letter / "wasn't" !letter / "wasnt" !letter / "aren't" !letter / "arent" !letter / "weren't" !letter / "werent" !letter +join = 'join' !letter / 'unite' !letter +knock = 'knock' !letter +less = 'less' !letter / 'lower' / 'smaller' !letter / 'weaker' !letter +let = 'let' !letter +like = 'like' !letter / 'so' !letter +listen = 'listen' !letter +minus = 'minus' !letter / 'without' !letter +more = 'greater' / 'higher' / 'bigger' / 'stronger' !letter / 'more' !letter +mysterious = 'mysterious' !letter +non = 'non' !letter +nor = 'nor' !letter +not = 'not' !letter +now = 'now' !letter +null = 'null' !letter / 'nothing' !letter / 'nowhere' !letter / 'nobody' !letter / 'gone'!letter +or = 'or' !letter +over = 'over' !letter +plus = 'plus' !letter / 'with' !letter +pop = 'roll' !letter / 'pop' !letter +print = "print" !letter / "shout" !letter / "say" !letter / "scream" !letter / "whisper" !letter +pronoun = 'they' !letter / 'them'!letter / 'she' !letter / 'him' !letter / 'her' !letter / 'hir' !letter / 'zie' !letter / 'zir' !letter / 'xem' !letter / 'ver'!letter / 'ze' !letter / 've' !letter / 'xe' !letter / 'it' !letter / 'he'!letter / 'you' !letter / 'me' !letter / 'i' !letter +push = 'rock' !letter / 'push' !letter +put = 'put' !letter +return = 'return' !letter / 'giving' !letter / 'give' !letter / 'send' !letter +says = 'say' !letter / 'says' !letter / 'said' !letter +split = 'cut' !letter / 'split' !letter / 'shatter' !letter +takes = 'takes' !letter / 'wants' !letter +taking = 'taking' !letter +than = 'than' !letter +the = 'an' !letter / 'a' !letter / 'the' !letter / 'my' !letter / 'your' !letter / 'our' !letter / 'their' !letter +then = 'then' !letter +times = 'times' !letter / 'of' !letter +to = 'to' !letter +true = "true" !letter / "yes" !letter / "ok" !letter / "right"!letter +turn = 'turn' !letter +under = 'under' !letter / 'below' !letter +until = 'until' !letter +up = 'up' !letter +using = 'using' !letter / 'with' !letter +while = 'while' !letter +with = 'with' !letter +write = 'write' !letter + + + +// argument +// = molecule +// +// molecule +// = molecular_boolean +// / primary +// +// molecular_boolean = molecular_binary_or +// +// molecular_binary_or +// = lhs:molecular_binary_nor _ or _ rhs:molecular_binary_or { new Binary(Operator.Or, lhs, rhs) } +// / molecular_binary_nor +// +// molecular_binary_nor +// = lhs:molecular_binary_and _ nor _ rhs:molecular_binary_nor { new Binary(Operator.Nor, lhs, rhs) } +// / molecular_binary_and +// +// molecular_binary_and +// = lhs:molecular_equality _ and _ rhs:molecular_binary_and { new Binary(Operator.And, lhs, rhs) } +// / molecular_equality +// +// molecular_equality +// = lhs:molecular_unary op:(_is / _isnt) _ rhs:molecular_equality { new Binary(op, lhs, rhs) } +// / molecular_unary +// +// molecular_unary +// = not_ u:molecular_unary { new Unary(Operator.Not, u) } +// / molecular_comparison +// +// molecular_comparison +// = lhs:molecular_addition op:comparator rhs:molecular_comparison { new Binary(op, lhs, rhs) } +// / molecular_addition +// +// molecular_addition -memoize +// = lhs:molecular_addition op:(_plus_/_minus_) rhs:molecular_product +// { new Binary(op, lhs, rhs) } +// / molecular_product +// +// molecular_product -memoize +// = lhs:molecular_product op:(_divide_/_times_) rhs:primary +// { new Binary(op, lhs, rhs) } +// / primary + +// molecule_list > +// = head:molecule _ALS_ tail:argument_list { head.Concat(tail) } +// / head:molecule { new List { head } } + +// binary_rhs > +// = primary_list +// / e:expression { new List { e } } diff --git a/codewithrockstar.com/images/chordpro-example.png b/codewithrockstar.com/images/chordpro-example.png new file mode 100644 index 00000000..7f49bbcf Binary files /dev/null and b/codewithrockstar.com/images/chordpro-example.png differ diff --git a/codewithrockstar.com/index.html b/codewithrockstar.com/index.html new file mode 100644 index 00000000..61918680 --- /dev/null +++ b/codewithrockstar.com/index.html @@ -0,0 +1,71 @@ +--- +title: Home +layout: page +nav_exclude: true +--- + +
+
+
+

Welcome to the Machine

+

+ Rockstar is a computer programming language based on + the lyrics to 1980s hard rock and power ballads.

+

No, really. That's what it is. It's not a joke. Well, + it is a joke, but it's a joke you can actually use + to write computer programs that are also rock songs. +

+

Curious? Check out the tutorial

+
+
+
The sky is cryin'
+My heart is nothing
+Until it's as high as the sky
+If it ain't nothing whisper it
+Build it up, baby
+Scream "Let's rock! 🤘🏽"
+
+
+
+ +
+
+
+
+
+

Start Me Up

+

Whether you're an experienced coder or a + guitar-slinging road warrior wondering what your songs really mean, we'll + have you rocking out in no time.

+
+

Get Started

+
+
+
+

I Want It All

+

You can run Rockstar right here on the web, or you can download a Rockstar + interpreter for Windows, Linux and macOS.

+
+

Download Rockstar

+
+
+
+
+
+

Show Me The Way

+

Online documentation for the Rockstar language, complete + with plentiful examples and lots of stupid jokes about hair metal.

+
+

Rockstar docs

+
+
+
+

Denim & Leather

+

Wear your Rockstar credentials right next to your heart with + shirts from our Teemill store.

+
+

Rockstar Merch

+
+
+
+
diff --git a/codewithrockstar.com/js/codemirror/editor.d.ts b/codewithrockstar.com/js/codemirror/editor.d.ts new file mode 100644 index 00000000..20143205 --- /dev/null +++ b/codewithrockstar.com/js/codemirror/editor.d.ts @@ -0,0 +1,2 @@ +declare const deepPurple: import("@codemirror/state").Extension; +export { deepPurple }; diff --git a/codewithrockstar.com/js/codemirror/editor.js b/codewithrockstar.com/js/codemirror/editor.js new file mode 100644 index 00000000..6fc8ab88 --- /dev/null +++ b/codewithrockstar.com/js/codemirror/editor.js @@ -0,0 +1 @@ +class t{lineAt(t){if(t<0||t>this.length)throw new RangeError(`Invalid position ${t} in document of length ${this.length}`);return this.lineInner(t,!1,1,0)}line(t){if(t<1||t>this.lines)throw new RangeError(`Invalid line number ${t} in ${this.lines}-line document`);return this.lineInner(t,!0,1,0)}replace(t,e,n){[t,e]=h(this,t,e);let s=[];return this.decompose(0,t,s,2),n.length&&n.decompose(0,n.length,s,3),this.decompose(e,this.length,s,1),i.from(s,this.length-(e-t)+n.length)}append(t){return this.replace(this.length,this.length,t)}slice(t,e=this.length){[t,e]=h(this,t,e);let n=[];return this.decompose(t,e,n,0),i.from(n,e-t)}eq(t){if(t==this)return!0;if(t.length!=this.length||t.lines!=this.lines)return!1;let e=this.scanIdentical(t,1),i=this.length-this.scanIdentical(t,-1),n=new r(this),s=new r(t);for(let t=e,r=e;;){if(n.next(t),s.next(t),t=0,n.lineBreak!=s.lineBreak||n.done!=s.done||n.value!=s.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(t=1){return new r(this,t)}iterRange(t,e=this.length){return new o(this,t,e)}iterLines(t,e){let i;if(null==t)i=this.iter();else{null==e&&(e=this.lines+1);let n=this.line(t).from;i=this.iterRange(n,Math.max(n,e==this.lines+1?this.length:e<=1?0:this.line(e-1).to))}return new l(i)}toString(){return this.sliceString(0)}toJSON(){let t=[];return this.flatten(t),t}constructor(){}static of(n){if(0==n.length)throw new RangeError("A document must have at least one line");return 1!=n.length||n[0]?n.length<=32?new e(n):i.from(e.split(n,[])):t.empty}}class e extends t{constructor(t,e=function(t){let e=-1;for(let i of t)e+=i.length+1;return e}(t)){super(),this.text=t,this.length=e}get lines(){return this.text.length}get children(){return null}lineInner(t,e,i,n){for(let s=0;;s++){let r=this.text[s],o=n+r.length;if((e?i:o)>=t)return new a(n,o,i,r);n=o+1,i++}}decompose(t,i,r,o){let l=t<=0&&i>=this.length?this:new e(s(this.text,t,i),Math.min(i,this.length)-Math.max(0,t));if(1&o){let t=r.pop(),i=n(l.text,t.text.slice(),0,l.length);if(i.length<=32)r.push(new e(i,t.length+l.length));else{let t=i.length>>1;r.push(new e(i.slice(0,t)),new e(i.slice(t)))}}else r.push(l)}replace(t,r,o){if(!(o instanceof e))return super.replace(t,r,o);[t,r]=h(this,t,r);let l=n(this.text,n(o.text,s(this.text,0,t)),r),a=this.length+o.length-(r-t);return l.length<=32?new e(l,a):i.from(e.split(l,[]),a)}sliceString(t,e=this.length,i="\n"){[t,e]=h(this,t,e);let n="";for(let s=0,r=0;s<=e&&rt&&r&&(n+=i),ts&&(n+=o.slice(Math.max(0,t-s),e-s)),s=l+1}return n}flatten(t){for(let e of this.text)t.push(e)}scanIdentical(){return 0}static split(t,i){let n=[],s=-1;for(let r of t)n.push(r),s+=r.length+1,32==n.length&&(i.push(new e(n,s)),n=[],s=-1);return s>-1&&i.push(new e(n,s)),i}}class i extends t{constructor(t,e){super(),this.children=t,this.length=e,this.lines=0;for(let e of t)this.lines+=e.lines}lineInner(t,e,i,n){for(let s=0;;s++){let r=this.children[s],o=n+r.length,l=i+r.lines-1;if((e?l:o)>=t)return r.lineInner(t,e,i,n);n=o+1,i=l+1}}decompose(t,e,i,n){for(let s=0,r=0;r<=e&&s=r){let s=n&((r<=t?1:0)|(l>=e?2:0));r>=t&&l<=e&&!s?i.push(o):o.decompose(t-r,e-r,i,s)}r=l+1}}replace(t,e,n){if([t,e]=h(this,t,e),n.lines=r&&e<=l){let a=o.replace(t-r,e-r,n),h=this.lines-o.lines+a.lines;if(a.lines>4&&a.lines>h>>6){let r=this.children.slice();return r[s]=a,new i(r,this.length-(e-t)+n.length)}return super.replace(r,l,a)}r=l+1}return super.replace(t,e,n)}sliceString(t,e=this.length,i="\n"){[t,e]=h(this,t,e);let n="";for(let s=0,r=0;st&&s&&(n+=i),tr&&(n+=o.sliceString(t-r,e-r,i)),r=l+1}return n}flatten(t){for(let e of this.children)e.flatten(t)}scanIdentical(t,e){if(!(t instanceof i))return 0;let n=0,[s,r,o,l]=e>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;s+=e,r+=e){if(s==o||r==l)return n;let i=this.children[s],a=t.children[r];if(i!=a)return n+i.scanIdentical(a,e);n+=i.length+1}}static from(t,n=t.reduce(((t,e)=>t+e.length+1),-1)){let s=0;for(let e of t)s+=e.lines;if(s<32){let i=[];for(let e of t)e.flatten(i);return new e(i,n)}let r=Math.max(32,s>>5),o=r<<1,l=r>>1,a=[],h=0,c=-1,u=[];function d(t){let n;if(t.lines>o&&t instanceof i)for(let e of t.children)d(e);else t.lines>l&&(h>l||!h)?(f(),a.push(t)):t instanceof e&&h&&(n=u[u.length-1])instanceof e&&t.lines+n.lines<=32?(h+=t.lines,c+=t.length+1,u[u.length-1]=new e(n.text.concat(t.text),n.length+1+t.length)):(h+t.lines>r&&f(),h+=t.lines,c+=t.length+1,u.push(t))}function f(){0!=h&&(a.push(1==u.length?u[0]:i.from(u,c)),c=-1,h=u.length=0)}for(let e of t)d(e);return f(),1==a.length?a[0]:new i(a,n)}}function n(t,e,i=0,n=1e9){for(let s=0,r=0,o=!0;r=i&&(a>n&&(l=l.slice(0,n-s)),s0?1:(t instanceof e?t.text.length:t.children.length)<<1]}nextInner(t,i){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,s=this.nodes[n],r=this.offsets[n],o=r>>1,l=s instanceof e?s.text.length:s.children.length;if(o==(i>0?l:0)){if(0==n)return this.done=!0,this.value="",this;i>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((1&r)==(i>0?0:1)){if(this.offsets[n]+=i,0==t)return this.lineBreak=!0,this.value="\n",this;t--}else if(s instanceof e){let e=s.text[o+(i<0?-1:0)];if(this.offsets[n]+=i,e.length>Math.max(0,t))return this.value=0==t?e:i>0?e.slice(t):e.slice(0,e.length-t),this;t-=e.length}else{let r=s.children[o+(i<0?-1:0)];t>r.length?(t-=r.length,this.offsets[n]+=i):(i<0&&this.offsets[n]--,this.nodes.push(r),this.offsets.push(i>0?1:(r instanceof e?r.text.length:r.children.length)<<1))}}}next(t=0){return t<0&&(this.nextInner(-t,-this.dir),t=this.value.length),this.nextInner(t,this.dir)}}class o{constructor(t,e,i){this.value="",this.done=!1,this.cursor=new r(t,e>i?-1:1),this.pos=e>i?t.length:0,this.from=Math.min(e,i),this.to=Math.max(e,i)}nextInner(t,e){if(e<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;t+=Math.max(0,e<0?this.pos-this.to:this.from-this.pos);let i=e<0?this.pos-this.from:this.to-this.pos;t>i&&(t=i),i-=t;let{value:n}=this.cursor.next(t);return this.pos+=(n.length+t)*e,this.value=n.length<=i?n:e<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(t=0){return t<0?t=Math.max(t,this.from-this.pos):t>0&&(t=Math.min(t,this.to-this.pos)),this.nextInner(t,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&""!=this.value}}class l{constructor(t){this.inner=t,this.afterBreak=!0,this.value="",this.done=!1}next(t=0){let{done:e,lineBreak:i,value:n}=this.inner.next(t);return e&&this.afterBreak?(this.value="",this.afterBreak=!1):e?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}}"undefined"!=typeof Symbol&&(t.prototype[Symbol.iterator]=function(){return this.iter()},r.prototype[Symbol.iterator]=o.prototype[Symbol.iterator]=l.prototype[Symbol.iterator]=function(){return this});class a{constructor(t,e,i,n){this.from=t,this.to=e,this.number=i,this.text=n}get length(){return this.to-this.from}}function h(t,e,i){return[e=Math.max(0,Math.min(t.length,e)),Math.max(e,Math.min(t.length,i))]}let c="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map((t=>t?parseInt(t,36):1));for(let t=1;tt)return c[e-1]<=t;return!1}function d(t){return t>=127462&&t<=127487}const f=8205;function p(t,e,i=!0,n=!0){return(i?g:m)(t,e,n)}function g(t,e,i){if(e==t.length)return e;e&&v(t.charCodeAt(e))&&w(t.charCodeAt(e-1))&&e--;let n=b(t,e);for(e+=x(n);e=0&&d(b(t,n));)i++,n-=2;if(i%2==0)break;e+=2}}}return e}function m(t,e,i){for(;e>0;){let n=g(t,e-2,i);if(n=56320&&t<57344}function w(t){return t>=55296&&t<56320}function b(t,e){let i=t.charCodeAt(e);if(!w(i)||e+1==t.length)return i;let n=t.charCodeAt(e+1);return v(n)?n-56320+(i-55296<<10)+65536:i}function y(t){return t<=65535?String.fromCharCode(t):(t-=65536,String.fromCharCode(55296+(t>>10),56320+(1023&t)))}function x(t){return t<65536?1:2}const k=/\r\n?|\n/;var P=function(t){return t[t.Simple=0]="Simple",t[t.TrackDel=1]="TrackDel",t[t.TrackBefore=2]="TrackBefore",t[t.TrackAfter=3]="TrackAfter",t}(P||(P={}));class S{constructor(t){this.sections=t}get length(){let t=0;for(let e=0;et)return s+(t-n);s+=o}else{if(i!=P.Simple&&a>=t&&(i==P.TrackDel&&nt||i==P.TrackBefore&&nt))return null;if(a>t||a==t&&e<0&&!o)return t==n||e<0?s:s+l;s+=l}n=a}if(t>n)throw new RangeError(`Position ${t} is out of range for changeset of length ${n}`);return s}touchesRange(t,e=t){for(let i=0,n=0;i=0&&n<=e&&s>=t)return!(ne)||"cover";n=s}return!1}toString(){let t="";for(let e=0;e=0?":"+n:"")}return t}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some((t=>"number"!=typeof t)))throw new RangeError("Invalid JSON representation of ChangeDesc");return new S(t)}static create(t){return new S(t)}}class O extends S{constructor(t,e){super(t),this.inserted=e}apply(t){if(this.length!=t.length)throw new RangeError("Applying change set to a document with the wrong length");return M(this,((e,i,n,s,r)=>t=t.replace(n,n+(i-e),r)),!1),t}mapDesc(t,e=!1){return T(this,t,e,!0)}invert(e){let i=this.sections.slice(),n=[];for(let s=0,r=0;s=0){i[s]=l,i[s+1]=o;let a=s>>1;for(;n.length0&&A(i,e,s.text),s.forward(t),o+=t}let a=t[r++];for(;o>1].toJSON()))}return t}static of(e,i,n){let s=[],r=[],o=0,l=null;function a(t=!1){if(!t&&!s.length)return;ol||e<0||l>i)throw new RangeError(`Invalid change range ${e} to ${l} (in doc of length ${i})`);let u=c?"string"==typeof c?t.of(c.split(n||k)):c:t.empty,d=u.length;if(e==l&&0==d)return;eo&&C(s,e-o,-1),C(s,l-e,d),A(r,s,u),o=l}}(e),a(!l),l}static empty(t){return new O(t?[t,-1]:[],[])}static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JSON representation of ChangeSet");let i=[],n=[];for(let s=0;se&&"string"!=typeof t)))throw new RangeError("Invalid JSON representation of ChangeSet");if(1==r.length)i.push(r[0],0);else{for(;n.length=0&&i<=0&&i==t[s+1]?t[s]+=e:0==e&&0==t[s]?t[s+1]+=i:n?(t[s]+=e,t[s+1]+=i):t.push(e,i)}function A(e,i,n){if(0==n.length)return;let s=i.length-2>>1;if(s>1])),!(n||l==e.sections.length||e.sections[l+1]<0);)a=e.sections[l++],h=e.sections[l++];i(r,c,o,u,d),r=c,o=u}}}function T(t,e,i,n=!1){let s=[],r=n?[]:null,o=new E(t),l=new E(e);for(let t=-1;;)if(-1==o.ins&&-1==l.ins){let t=Math.min(o.len,l.len);C(s,t,-1),o.forward(t),l.forward(t)}else if(l.ins>=0&&(o.ins<0||t==o.i||0==o.off&&(l.len=0&&t=0)){if(o.done&&l.done)return r?O.createSet(s,r):S.create(s);throw new Error("Mismatched change set lengths")}{let e=0,i=o.len;for(;i;)if(-1==l.ins){let t=Math.min(i,l.len);e+=t,i-=t,l.forward(t)}else{if(!(0==l.ins&&l.lene||o.ins>=0&&o.len>e)&&(t||n.length>i),r.forward2(e),o.forward(e)}}else C(n,0,o.ins,t),s&&A(s,n,o.text),o.next()}}class E{constructor(t){this.set=t,this.i=0,this.next()}next(){let{sections:t}=this.set;this.i>1;return i>=e.length?t.empty:e[i]}textBit(e){let{inserted:i}=this.set,n=this.i-2>>1;return n>=i.length&&!e?t.empty:i[n].slice(this.off,null==e?void 0:this.off+e)}forward(t){t==this.len?this.next():(this.len-=t,this.off+=t)}forward2(t){-1==this.ins?this.forward(t):t==this.ins?this.next():(this.ins-=t,this.off+=t)}}class R{constructor(t,e,i){this.from=t,this.to=e,this.flags=i}get anchor(){return 32&this.flags?this.to:this.from}get head(){return 32&this.flags?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return 8&this.flags?-1:16&this.flags?1:0}get bidiLevel(){let t=7&this.flags;return 7==t?null:t}get goalColumn(){let t=this.flags>>6;return 16777215==t?void 0:t}map(t,e=-1){let i,n;return this.empty?i=n=t.mapPos(this.from,e):(i=t.mapPos(this.from,1),n=t.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new R(i,n,this.flags)}extend(t,e=t){if(t<=this.anchor&&e>=this.anchor)return B.range(t,e);let i=Math.abs(t-this.anchor)>Math.abs(e-this.anchor)?t:e;return B.range(this.anchor,i)}eq(t,e=!1){return!(this.anchor!=t.anchor||this.head!=t.head||e&&this.empty&&this.assoc!=t.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(t){if(!t||"number"!=typeof t.anchor||"number"!=typeof t.head)throw new RangeError("Invalid JSON representation for SelectionRange");return B.range(t.anchor,t.head)}static create(t,e,i){return new R(t,e,i)}}class B{constructor(t,e){this.ranges=t,this.mainIndex=e}map(t,e=-1){return t.empty?this:B.create(this.ranges.map((i=>i.map(t,e))),this.mainIndex)}eq(t,e=!1){if(this.ranges.length!=t.ranges.length||this.mainIndex!=t.mainIndex)return!1;for(let i=0;it.toJSON())),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||"number"!=typeof t.main||t.main>=t.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new B(t.ranges.map((t=>R.fromJSON(t))),t.main)}static single(t,e=t){return new B([B.range(t,e)],0)}static create(t,e=0){if(0==t.length)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;nt?8:0)|s)}static normalized(t,e=0){let i=t[e];t.sort(((t,e)=>t.from-e.from)),e=t.indexOf(i);for(let i=1;in.head?B.range(o,r):B.range(r,o))}}return new B(t,e)}}function N(t,e){for(let i of t.ranges)if(i.to>e)throw new RangeError("Selection points outside of document")}let L=0;class I{constructor(t,e,i,n,s){this.combine=t,this.compareInput=e,this.compare=i,this.isStatic=n,this.id=L++,this.default=t([]),this.extensions="function"==typeof s?s(this):s}get reader(){return this}static define(t={}){return new I(t.combine||(t=>t),t.compareInput||((t,e)=>t===e),t.compare||(t.combine?(t,e)=>t===e:F),!!t.static,t.enables)}of(t){return new V([],this,0,t)}compute(t,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new V(t,this,1,e)}computeN(t,e){if(this.isStatic)throw new Error("Can't compute a static facet");return new V(t,this,2,e)}from(t,e){return e||(e=t=>t),this.compute([t],(i=>e(i.field(t))))}}function F(t,e){return t==e||t.length==e.length&&t.every(((t,i)=>t===e[i]))}class V{constructor(t,e,i,n){this.dependencies=t,this.facet=e,this.type=i,this.value=n,this.id=L++}dynamicSlot(t){var e;let i=this.value,n=this.facet.compareInput,s=this.id,r=t[s]>>1,o=2==this.type,l=!1,a=!1,h=[];for(let i of this.dependencies)"doc"==i?l=!0:"selection"==i?a=!0:1&(null!==(e=t[i.id])&&void 0!==e?e:1)||h.push(t[i.id]);return{create:t=>(t.values[r]=i(t),1),update(t,e){if(l&&e.docChanged||a&&(e.docChanged||e.selection)||H(t,h)){let e=i(t);if(o?!W(e,t.values[r],n):!n(e,t.values[r]))return t.values[r]=e,1}return 0},reconfigure:(t,e)=>{let l,a=e.config.address[s];if(null!=a){let s=et(e,a);if(this.dependencies.every((i=>i instanceof I?e.facet(i)===t.facet(i):!(i instanceof X)||e.field(i,!1)==t.field(i,!1)))||(o?W(l=i(t),s,n):n(l=i(t),s)))return t.values[r]=s,0}else l=i(t);return t.values[r]=l,1}}}}function W(t,e,i){if(t.length!=e.length)return!1;for(let n=0;nt[e.id])),s=i.map((t=>t.type)),r=n.filter((t=>!(1&t))),o=t[e.id]>>1;function l(t){let i=[];for(let e=0;et===e),t);return t.provide&&(e.provides=t.provide(e)),e}create(t){let e=t.facet(q).find((t=>t.field==this));return((null==e?void 0:e.create)||this.createF)(t)}slot(t){let e=t[this.id]>>1;return{create:t=>(t.values[e]=this.create(t),1),update:(t,i)=>{let n=t.values[e],s=this.updateF(n,i);return this.compareF(n,s)?0:(t.values[e]=s,1)},reconfigure:(t,i)=>null!=i.config.address[this.id]?(t.values[e]=i.field(this),0):(t.values[e]=this.create(t),1)}}init(t){return[this,q.of({field:this,create:t})]}get extension(){return this}}const U=4,Q=3,Y=2,$=1;function _(t){return e=>new K(e,t)}const j={highest:_(0),high:_($),default:_(Y),low:_(Q),lowest:_(U)};class K{constructor(t,e){this.inner=t,this.prec=e}}class G{of(t){return new Z(this,t)}reconfigure(t){return G.reconfigure.of({compartment:this,extension:t})}get(t){return t.config.compartments.get(this)}}class Z{constructor(t,e){this.compartment=t,this.inner=e}}class J{constructor(t,e,i,n,s,r){for(this.base=t,this.compartments=e,this.dynamicSlots=i,this.address=n,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(t,e,i){let n=[],s=Object.create(null),r=new Map;for(let i of function(t,e,i){let n=[[],[],[],[],[]],s=new Map;function r(t,o){let l=s.get(t);if(null!=l){if(l<=o)return;let e=n[l].indexOf(t);e>-1&&n[l].splice(e,1),t instanceof Z&&i.delete(t.compartment)}if(s.set(t,o),Array.isArray(t))for(let e of t)r(e,o);else if(t instanceof Z){if(i.has(t.compartment))throw new RangeError("Duplicate use of compartment in extensions");let n=e.get(t.compartment)||t.inner;i.set(t.compartment,n),r(n,o)}else if(t instanceof K)r(t.inner,t.prec);else if(t instanceof X)n[o].push(t),t.provides&&r(t.provides,o);else if(t instanceof V)n[o].push(t),t.facet.extensions&&r(t.facet.extensions,Y);else{let e=t.extension;if(!e)throw new Error(`Unrecognized extension value in extension set (${t}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);r(e,o)}}return r(t,Y),n.reduce(((t,e)=>t.concat(e)))}(t,e,r))i instanceof X?n.push(i):(s[i.facet.id]||(s[i.facet.id]=[])).push(i);let o=Object.create(null),l=[],a=[];for(let t of n)o[t.id]=a.length<<1,a.push((e=>t.slot(e)));let h=null==i?void 0:i.config.facets;for(let t in s){let e=s[t],n=e[0].facet,r=h&&h[t]||[];if(e.every((t=>0==t.type)))if(o[n.id]=l.length<<1|1,F(r,e))l.push(i.facet(n));else{let t=n.combine(e.map((t=>t.value)));l.push(i&&n.compare(t,i.facet(n))?i.facet(n):t)}else{for(let t of e)0==t.type?(o[t.id]=l.length<<1|1,l.push(t.value)):(o[t.id]=a.length<<1,a.push((e=>t.dynamicSlot(e))));o[n.id]=a.length<<1,a.push((t=>z(t,n,e)))}}let c=a.map((t=>t(o)));return new J(t,r,c,o,l,s)}}function tt(t,e){if(1&e)return 2;let i=e>>1,n=t.status[i];if(4==n)throw new Error("Cyclic dependency between fields and/or facets");if(2&n)return n;t.status[i]=4;let s=t.computeSlot(t,t.config.dynamicSlots[i]);return t.status[i]=2|s}function et(t,e){return 1&e?t.config.staticValues[e>>1]:t.values[e>>1]}const it=I.define(),nt=I.define({combine:t=>t.some((t=>t)),static:!0}),st=I.define({combine:t=>t.length?t[0]:void 0,static:!0}),rt=I.define(),ot=I.define(),lt=I.define(),at=I.define({combine:t=>!!t.length&&t[0]});class ht{constructor(t,e){this.type=t,this.value=e}static define(){return new ct}}class ct{of(t){return new ht(this,t)}}class ut{constructor(t){this.map=t}of(t){return new dt(this,t)}}class dt{constructor(t,e){this.type=t,this.value=e}map(t){let e=this.type.map(this.value,t);return void 0===e?void 0:e==this.value?this:new dt(this.type,e)}is(t){return this.type==t}static define(t={}){return new ut(t.map||(t=>t))}static mapEffects(t,e){if(!t.length)return t;let i=[];for(let n of t){let t=n.map(e);t&&i.push(t)}return i}}dt.reconfigure=dt.define(),dt.appendConfig=dt.define();class ft{constructor(t,e,i,n,s,r){this.startState=t,this.changes=e,this.selection=i,this.effects=n,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,i&&N(i,e.newLength),s.some((t=>t.type==ft.time))||(this.annotations=s.concat(ft.time.of(Date.now())))}static create(t,e,i,n,s,r){return new ft(t,e,i,n,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(t){for(let e of this.annotations)if(e.type==t)return e.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let e=this.annotation(ft.userEvent);return!(!e||!(e==t||e.length>t.length&&e.slice(0,t.length)==t&&"."==e[t.length]))}}function pt(t,e){let i=[];for(let n=0,s=0;;){let r,o;if(n=t[n]))r=t[n++],o=t[n++];else{if(!(s=0;s--){let r=i[s](t);r&&Object.keys(r).length&&(n=gt(n,mt(e,r,t.changes.newLength),!0))}return n==t?t:ft.create(e,t.changes,t.selection,n.effects,n.annotations,n.scrollIntoView)}(i?function(t){let e=t.startState,i=!0;for(let n of e.facet(rt)){let e=n(t);if(!1===e){i=!1;break}Array.isArray(e)&&(i=!0===i?e:pt(i,e))}if(!0!==i){let n,s;if(!1===i)s=t.changes.invertedDesc,n=O.empty(e.doc.length);else{let e=t.changes.filter(i);n=e.changes,s=e.filtered.mapDesc(e.changes).invertedDesc}t=ft.create(e,n,t.selection&&t.selection.map(s),dt.mapEffects(t.effects,s),t.annotations,t.scrollIntoView)}let n=e.facet(ot);for(let i=n.length-1;i>=0;i--){let s=n[i](t);t=s instanceof ft?s:Array.isArray(s)&&1==s.length&&s[0]instanceof ft?s[0]:vt(e,bt(s),!1)}return t}(s):s)}ft.time=ht.define(),ft.userEvent=ht.define(),ft.addToHistory=ht.define(),ft.remote=ht.define();const wt=[];function bt(t){return null==t?wt:Array.isArray(t)?t:[t]}var yt=function(t){return t[t.Word=0]="Word",t[t.Space=1]="Space",t[t.Other=2]="Other",t}(yt||(yt={}));const xt=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let kt;try{kt=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(t){}function Pt(t){return e=>{if(!/\S/.test(e))return yt.Space;if(function(t){if(kt)return kt.test(t);for(let e=0;e"€"&&(i.toUpperCase()!=i.toLowerCase()||xt.test(i)))return!0}return!1}(e))return yt.Word;for(let i=0;i-1)return yt.Word;return yt.Other}}class St{constructor(t,e,i,n,s,r){this.config=t,this.doc=e,this.selection=i,this.values=n,this.status=t.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let t=0;ts.set(e,t))),i=null),s.set(e.value.compartment,e.value.extension)):e.is(dt.reconfigure)?(i=null,n=e.value):e.is(dt.appendConfig)&&(i=null,n=bt(n).concat(e.value));if(i)e=t.startState.values.slice();else{i=J.resolve(n,s,this),e=new St(i,this.doc,this.selection,i.dynamicSlots.map((()=>null)),((t,e)=>e.reconfigure(t,this)),null).values}let r=t.startState.facet(nt)?t.newSelection:t.newSelection.asSingle();new St(i,t.newDoc,r,e,((e,i)=>i.update(e,t)),t)}replaceSelection(t){return"string"==typeof t&&(t=this.toText(t)),this.changeByRange((e=>({changes:{from:e.from,to:e.to,insert:t},range:B.cursor(e.from+t.length)})))}changeByRange(t){let e=this.selection,i=t(e.ranges[0]),n=this.changes(i.changes),s=[i.range],r=bt(i.effects);for(let i=1;is.spec.fromJSON(r,t))))}return St.create({doc:t.doc,selection:B.fromJSON(t.selection),extensions:e.extensions?n.concat([e.extensions]):n})}static create(e={}){let i=J.resolve(e.extensions||[],new Map),n=e.doc instanceof t?e.doc:t.of((e.doc||"").split(i.staticFacet(St.lineSeparator)||k)),s=e.selection?e.selection instanceof B?e.selection:B.single(e.selection.anchor,e.selection.head):B.single(0);return N(s,n.length),i.staticFacet(nt)||(s=s.asSingle()),new St(i,n,s,i.dynamicSlots.map((()=>null)),((t,e)=>e.create(t)),null)}get tabSize(){return this.facet(St.tabSize)}get lineBreak(){return this.facet(St.lineSeparator)||"\n"}get readOnly(){return this.facet(at)}phrase(t,...e){for(let e of this.facet(St.phrases))if(Object.prototype.hasOwnProperty.call(e,t)){t=e[t];break}return e.length&&(t=t.replace(/\$(\$|\d*)/g,((t,i)=>{if("$"==i)return"$";let n=+(i||1);return!n||n>e.length?t:e[n-1]}))),t}languageDataAt(t,e,i=-1){let n=[];for(let s of this.facet(it))for(let r of s(this,e,i))Object.prototype.hasOwnProperty.call(r,t)&&n.push(r[t]);return n}charCategorizer(t){return Pt(this.languageDataAt("wordChars",t).join(""))}wordAt(t){let{text:e,from:i,length:n}=this.doc.lineAt(t),s=this.charCategorizer(t),r=t-i,o=t-i;for(;r>0;){let t=p(e,r,!1);if(s(e.slice(t,r))!=yt.Word)break;r=t}for(;ot.length?t[0]:4}),St.lineSeparator=st,St.readOnly=at,St.phrases=I.define({compare(t,e){let i=Object.keys(t),n=Object.keys(e);return i.length==n.length&&i.every((i=>t[i]==e[i]))}}),St.languageData=it,St.changeFilter=rt,St.transactionFilter=ot,St.transactionExtender=lt,G.reconfigure=dt.define();class Ct{eq(t){return this==t}range(t,e=t){return At.create(t,e,this)}}Ct.prototype.startSide=Ct.prototype.endSide=0,Ct.prototype.point=!1,Ct.prototype.mapMode=P.TrackDel;let At=class t{constructor(t,e,i){this.from=t,this.to=e,this.value=i}static create(e,i,n){return new t(e,i,n)}};function Mt(t,e){return t.from-e.from||t.value.startSide-e.value.startSide}class Tt{constructor(t,e,i,n){this.from=t,this.to=e,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(t,e,i,n=0){let s=i?this.to:this.from;for(let r=n,o=s.length;;){if(r==o)return r;let n=r+o>>1,l=s[n]-t||(i?this.value[n].endSide:this.value[n].startSide)-e;if(n==r)return l>=0?r:o;l>=0?o=n:r=n+1}}between(t,e,i,n){for(let s=this.findIndex(e,-1e9,!0),r=this.findIndex(i,1e9,!1,s);sh||a==h&&c.startSide>0&&c.endSide<=0)continue;(h-a||c.endSide-c.startSide)<0||(r<0&&(r=a),c.point&&(o=Math.max(o,h-a)),i.push(c),n.push(a-r),s.push(h-r))}return{mapped:i.length?new Tt(n,s,i,o):null,pos:r}}}class Dt{constructor(t,e,i,n){this.chunkPos=t,this.chunk=e,this.nextLayer=i,this.maxPoint=n}static create(t,e,i,n){return new Dt(t,e,i,n)}get length(){let t=this.chunk.length-1;return t<0?0:Math.max(this.chunkEnd(t),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let t=this.nextLayer.size;for(let e of this.chunk)t+=e.value.length;return t}chunkEnd(t){return this.chunkPos[t]+this.chunk[t].length}update(t){let{add:e=[],sort:i=!1,filterFrom:n=0,filterTo:s=this.length}=t,r=t.filter;if(0==e.length&&!r)return this;if(i&&(e=e.slice().sort(Mt)),this.isEmpty)return e.length?Dt.of(e):this;let o=new Bt(this,null,-1).goto(0),l=0,a=[],h=new Et;for(;o.value||l=0){let t=e[l++];h.addInner(t.from,t.to,t.value)||a.push(t)}else 1==o.rangeIndex&&o.chunkIndexthis.chunkEnd(o.chunkIndex)||so.to||s=s&&t<=s+r.length&&!1===r.between(s,t-s,e-s,i))return}this.nextLayer.between(t,e,i)}}iter(t=0){return Nt.from([this]).goto(t)}get isEmpty(){return this.nextLayer==this}static iter(t,e=0){return Nt.from(t).goto(e)}static compare(t,e,i,n,s=-1){let r=t.filter((t=>t.maxPoint>0||!t.isEmpty&&t.maxPoint>=s)),o=e.filter((t=>t.maxPoint>0||!t.isEmpty&&t.maxPoint>=s)),l=Rt(r,o,i),a=new It(r,l,s),h=new It(o,l,s);i.iterGaps(((t,e,i)=>Ft(a,t,h,e,i,n))),i.empty&&0==i.length&&Ft(a,0,h,0,0,n)}static eq(t,e,i=0,n){null==n&&(n=999999999);let s=t.filter((t=>!t.isEmpty&&e.indexOf(t)<0)),r=e.filter((e=>!e.isEmpty&&t.indexOf(e)<0));if(s.length!=r.length)return!1;if(!s.length)return!0;let o=Rt(s,r),l=new It(s,o,0).goto(i),a=new It(r,o,0).goto(i);for(;;){if(l.to!=a.to||!Vt(l.active,a.active)||l.point&&(!a.point||!l.point.eq(a.point)))return!1;if(l.to>n)return!0;l.next(),a.next()}}static spans(t,e,i,n,s=-1){let r=new It(t,null,s).goto(e),o=e,l=r.openStart;for(;;){let t=Math.min(r.to,i);if(r.point){let i=r.activeForPoint(r.to),s=r.pointFromo&&(n.span(o,t,r.active,l),l=r.openEnd(t));if(r.to>i)return l+(r.point&&r.to>i?1:0);o=r.to,r.next()}}static of(t,e=!1){let i=new Et;for(let n of t instanceof At?[t]:e?function(t){if(t.length>1)for(let e=t[0],i=1;i0)return t.slice().sort(Mt);e=n}return t}(t):t)i.add(n.from,n.to,n.value);return i.finish()}static join(t){if(!t.length)return Dt.empty;let e=t[t.length-1];for(let i=t.length-2;i>=0;i--)for(let n=t[i];n!=Dt.empty;n=n.nextLayer)e=new Dt(n.chunkPos,n.chunk,e,Math.max(n.maxPoint,e.maxPoint));return e}}Dt.empty=new Dt([],[],null,-1),Dt.empty.nextLayer=Dt.empty;class Et{finishChunk(t){this.chunks.push(new Tt(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,t&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(t,e,i){this.addInner(t,e,i)||(this.nextLayer||(this.nextLayer=new Et)).add(t,e,i)}addInner(t,e,i){let n=t-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(t-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return!(n<0)&&(250==this.from.length&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=t),this.from.push(t-this.chunkStart),this.to.push(e-this.chunkStart),this.last=i,this.lastFrom=t,this.lastTo=e,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,e-t)),!0)}addChunk(t,e){if((t-this.lastTo||e.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,e.maxPoint),this.chunks.push(e),this.chunkPos.push(t);let i=e.value.length-1;return this.last=e.value[i],this.lastFrom=e.from[i]+t,this.lastTo=e.to[i]+t,!0}finish(){return this.finishInner(Dt.empty)}finishInner(t){if(this.from.length&&this.finishChunk(!1),0==this.chunks.length)return t;let e=Dt.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(t):t,this.setMaxPoint);return this.from=null,e}}function Rt(t,e,i){let n=new Map;for(let e of t)for(let t=0;t=this.minPoint)break}}}setRangeIndex(t){if(t==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new Bt(r,e,i,s));return 1==n.length?n[0]:new Nt(n)}get startSide(){return this.value?this.value.startSide:0}goto(t,e=-1e9){for(let i of this.heap)i.goto(t,e);for(let t=this.heap.length>>1;t>=0;t--)Lt(this.heap,t);return this.next(),this}forward(t,e){for(let i of this.heap)i.forward(t,e);for(let t=this.heap.length>>1;t>=0;t--)Lt(this.heap,t);(this.to-t||this.value.endSide-e)<0&&this.next()}next(){if(0==this.heap.length)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let t=this.heap[0];this.from=t.from,this.to=t.to,this.value=t.value,this.rank=t.rank,t.value&&t.next(),Lt(this.heap,0)}}}function Lt(t,e){for(let i=t[e];;){let n=1+(e<<1);if(n>=t.length)break;let s=t[n];if(n+1=0&&(s=t[n+1],n++),i.compare(s)<0)break;t[n]=i,t[e]=s,e=n}}class It{constructor(t,e,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Nt.from(t,e,i)}goto(t,e=-1e9){return this.cursor.goto(t,e),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=t,this.endSide=e,this.openStart=-1,this.next(),this}forward(t,e){for(;this.minActive>-1&&(this.activeTo[this.minActive]-t||this.active[this.minActive].endSide-e)<0;)this.removeActive(this.minActive);this.cursor.forward(t,e)}removeActive(t){Wt(this.active,t),Wt(this.activeTo,t),Wt(this.activeRank,t),this.minActive=zt(this.active,this.activeTo)}addActive(t){let e=0,{value:i,to:n,rank:s}=this.cursor;for(;e0;)e++;Ht(this.active,e,i),Ht(this.activeTo,e,n),Ht(this.activeRank,e,s),t&&Ht(t,e,this.cursor.from),this.minActive=zt(this.active,this.activeTo)}next(){let t=this.to,e=this.point;this.point=null;let i=this.openStart<0?[]:null;for(;;){let n=this.minActive;if(n>-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>t){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&Wt(i,n)}else{if(!this.cursor.value){this.to=this.endSide=1e9;break}if(this.cursor.from>t){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}{let t=this.cursor.value;if(t.point){if(!(e&&this.cursor.to==this.to&&this.cursor.from=0&&i[e]=0&&!(this.activeRank[i]t||this.activeTo[i]==t&&this.active[i].endSide>=this.point.endSide)&&e.push(this.active[i]);return e.reverse()}openEnd(t){let e=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>t;i--)e++;return e}}function Ft(t,e,i,n,s,r){t.goto(e),i.goto(n);let o=n+s,l=n,a=n-e;for(;;){let e=t.to+a-i.to||t.endSide-i.endSide,n=e<0?t.to+a:i.to,s=Math.min(n,o);if(t.point||i.point?t.point&&i.point&&(t.point==i.point||t.point.eq(i.point))&&Vt(t.activeForPoint(t.to),i.activeForPoint(i.to))||r.comparePoint(l,s,t.point,i.point):s>l&&!Vt(t.active,i.active)&&r.compareRange(l,s,t.active,i.active),n>o)break;l=n,e<=0&&t.next(),e>=0&&i.next()}}function Vt(t,e){if(t.length!=e.length)return!1;for(let i=0;i=e;i--)t[i+1]=t[i];t[e]=i}function zt(t,e){let i=-1,n=1e9;for(let s=0;s=e)return n;if(n==t.length)break;s+=9==t.charCodeAt(n)?i-s%i:1,n=p(t,n)}return!0===n?-1:t.length}const Ut="undefined"==typeof Symbol?"__ͼ":Symbol.for("ͼ"),Qt="undefined"==typeof Symbol?"__styleSet"+Math.floor(1e8*Math.random()):Symbol("styleSet"),Yt="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};class $t{constructor(t,e){this.rules=[];let{finish:i}=e||{};function n(t){return/^@/.test(t)?[t]:t.split(/,\s*/)}function s(t,e,r,o){let l=[],a=/^@(\w+)\b/.exec(t[0]),h=a&&"keyframes"==a[1];if(a&&null==e)return r.push(t[0]+";");for(let i in e){let o=e[i];if(/&/.test(i))s(i.split(/,\s*/).map((e=>t.map((t=>e.replace(/&/,t))))).reduce(((t,e)=>t.concat(e))),o,r);else if(o&&"object"==typeof o){if(!a)throw new RangeError("The value of a property ("+i+") should be a primitive value.");s(n(i),o,l,h)}else null!=o&&l.push(i.replace(/_.*/,"").replace(/[A-Z]/g,(t=>"-"+t.toLowerCase()))+": "+o+";")}(l.length||h)&&r.push((!i||a||o?t:t.map(i)).join(", ")+" {"+l.join(" ")+"}")}for(let e in t)s(n(e),t[e],this.rules)}getRules(){return this.rules.join("\n")}static newName(){let t=Yt[Ut]||1;return Yt[Ut]=t+1,"ͼ"+t.toString(36)}static mount(t,e,i){let n=t[Qt],s=i&&i.nonce;n?s&&n.setNonce(s):n=new jt(t,s),n.mount(Array.isArray(e)?e:[e],t)}}let _t=new Map;class jt{constructor(t,e){let i=t.ownerDocument||t,n=i.defaultView;if(!t.head&&t.adoptedStyleSheets&&n.CSSStyleSheet){let e=_t.get(i);if(e)return t[Qt]=e;this.sheet=new n.CSSStyleSheet,_t.set(i,this)}else this.styleTag=i.createElement("style"),e&&this.styleTag.setAttribute("nonce",e);this.modules=[],t[Qt]=this}mount(t,e){let i=this.sheet,n=0,s=0;for(let e=0;e-1&&(this.modules.splice(o,1),s--,o=-1),-1==o){if(this.modules.splice(s++,0,r),i)for(let t=0;t",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Zt="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),Jt="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),te=0;te<10;te++)Kt[48+te]=Kt[96+te]=String(te);for(te=1;te<=24;te++)Kt[te+111]="F"+te;for(te=65;te<=90;te++)Kt[te]=String.fromCharCode(te+32),Gt[te]=String.fromCharCode(te);for(var ee in Kt)Gt.hasOwnProperty(ee)||(Gt[ee]=Kt[ee]);function ie(t){let e;return e=11==t.nodeType?t.getSelection?t:t.ownerDocument:t,e.getSelection()}function ne(t,e){return!!e&&(t==e||t.contains(1!=e.nodeType?e.parentNode:e))}function se(t,e){if(!e.anchorNode)return!1;try{return ne(t,e.anchorNode)}catch(t){return!1}}function re(t){return 3==t.nodeType?we(t,0,t.nodeValue.length).getClientRects():1==t.nodeType?t.getClientRects():[]}function oe(t,e,i,n){return!!i&&(he(t,e,i,n,-1)||he(t,e,i,n,1))}function le(t){for(var e=0;;e++)if(!(t=t.previousSibling))return e}function ae(t){return 1==t.nodeType&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|H\d|SECTION|PRE)$/.test(t.nodeName)}function he(t,e,i,n,s){for(;;){if(t==i&&e==n)return!0;if(e==(s<0?0:ce(t))){if("DIV"==t.nodeName)return!1;let i=t.parentNode;if(!i||1!=i.nodeType)return!1;e=le(t)+(s<0?0:1),t=i}else{if(1!=t.nodeType)return!1;if(1==(t=t.childNodes[e+(s<0?-1:0)]).nodeType&&"false"==t.contentEditable)return!1;e=s<0?ce(t):0}}}function ce(t){return 3==t.nodeType?t.nodeValue.length:t.childNodes.length}function ue(t,e){let i=e?t.left:t.right;return{left:i,right:i,top:t.top,bottom:t.bottom}}function de(t){let e=t.visualViewport;return e?{left:0,right:e.width,top:0,bottom:e.height}:{left:0,right:t.innerWidth,top:0,bottom:t.innerHeight}}function fe(t,e){let i=e.width/t.offsetWidth,n=e.height/t.offsetHeight;return(i>.995&&i<1.005||!isFinite(i)||Math.abs(e.width-t.offsetWidth)<1)&&(i=1),(n>.995&&n<1.005||!isFinite(n)||Math.abs(e.height-t.offsetHeight)<1)&&(n=1),{scaleX:i,scaleY:n}}class pe{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(t){return this.anchorNode==t.anchorNode&&this.anchorOffset==t.anchorOffset&&this.focusNode==t.focusNode&&this.focusOffset==t.focusOffset}setRange(t){let{anchorNode:e,focusNode:i}=t;this.set(e,Math.min(t.anchorOffset,e?ce(e):0),i,Math.min(t.focusOffset,i?ce(i):0))}set(t,e,i,n){this.anchorNode=t,this.anchorOffset=e,this.focusNode=i,this.focusOffset=n}}let ge,me=null;function ve(t){if(t.setActive)return t.setActive();if(me)return t.focus(me);let e=[];for(let i=t;i&&(e.push(i,i.scrollTop,i.scrollLeft),i!=i.ownerDocument);i=i.parentNode);if(t.focus(null==me?{get preventScroll(){return me={preventScroll:!0},!0}}:void 0),!me){me=!1;for(let t=0;tMath.max(1,t.scrollHeight-t.clientHeight-4)}function ke(t,e){for(let i=t,n=e;;){if(3==i.nodeType&&n>0)return{node:i,offset:n};if(1==i.nodeType&&n>0){if("false"==i.contentEditable)return null;i=i.childNodes[n-1],n=ce(i)}else{if(!i.parentNode||ae(i))return null;n=le(i),i=i.parentNode}}}function Pe(t,e){for(let i=t,n=e;;){if(3==i.nodeType&&ne)return i.domBoundsAround(t,e,a);if(c>=t&&-1==n&&(n=l,s=a),a>e&&i.dom.parentNode==this.dom){r=l,o=h;break}h=c,a=c+i.breakAfter}return{from:s,to:o<0?i+this.length:o,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:r=0?this.children[r].dom:null}}markDirty(t=!1){this.flags|=2,this.markParentsDirty(t)}markParentsDirty(t){for(let e=this.parent;e;e=e.parent){if(t&&(e.flags|=2),1&e.flags)return;e.flags|=1,t=!1}}setParent(t){this.parent!=t&&(this.parent=t,7&this.flags&&this.markParentsDirty(!0))}setDOM(t){this.dom!=t&&(this.dom&&(this.dom.cmView=null),this.dom=t,t.cmView=this)}get rootView(){for(let t=this;;){let e=t.parent;if(!e)return t;t=e}}replaceChildren(t,e,i=Oe){this.markDirty();for(let n=t;nthis.pos||t==this.pos&&(e>0||0==this.i||this.children[this.i-1].breakAfter))return this.off=t-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}}function Te(t,e,i,n,s,r,o,l,a){let{children:h}=t,c=h.length?h[e]:null,u=r.length?r[r.length-1]:null,d=u?u.breakAfter:o;if(!(e==n&&c&&!o&&!d&&r.length<2&&c.merge(i,s,r.length?u:null,0==i,l,a))){if(n0&&(!o&&r.length&&c.merge(i,c.length,r[0],!1,l,0)?c.breakAfter=r.shift().breakAfter:(i2);var qe={mac:ze||/Mac/.test(Ee.platform),windows:/Win/.test(Ee.platform),linux:/Linux|X11/.test(Ee.platform),ie:Ie,ie_version:Ne?Re.documentMode||6:Le?+Le[1]:Be?+Be[1]:0,gecko:Fe,gecko_version:Fe?+(/Firefox\/(\d+)/.exec(Ee.userAgent)||[0,0])[1]:0,chrome:!!Ve,chrome_version:Ve?+Ve[1]:0,ios:ze,android:/Android\b/.test(Ee.userAgent),webkit:We,safari:He,webkit_version:We?+(/\bAppleWebKit\/(\d+)/.exec(Ee.userAgent)||[0,0])[1]:0,tabSize:null!=Re.documentElement.style.tabSize?"tab-size":"-moz-tab-size"};class Xe extends Ce{constructor(t){super(),this.text=t}get length(){return this.text.length}createDOM(t){this.setDOM(t||document.createTextNode(this.text))}sync(t,e){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(e&&e.node==this.dom&&(e.written=!0),this.dom.nodeValue=this.text)}reuseDOM(t){3==t.nodeType&&this.createDOM(t)}merge(t,e,i){return!(8&this.flags||i&&(!(i instanceof Xe)||this.length-(e-t)+i.length>256||8&i.flags))&&(this.text=this.text.slice(0,t)+(i?i.text:"")+this.text.slice(e),this.markDirty(),!0)}split(t){let e=new Xe(this.text.slice(t));return this.text=this.text.slice(0,t),this.markDirty(),e.flags|=8&this.flags,e}localPosFromDOM(t,e){return t==this.dom?e:e?this.text.length:0}domAtPos(t){return new Se(this.dom,t)}domBoundsAround(t,e,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(t,e){return function(t,e,i){let n=t.nodeValue.length;e>n&&(e=n);let s=e,r=e,o=0;0==e&&i<0||e==n&&i>=0?qe.chrome||qe.gecko||(e?(s--,o=1):r=0)?0:l.length-1];qe.safari&&!o&&0==a.width&&(a=Array.prototype.find.call(l,(t=>t.width))||a);return o?ue(a,o<0):a||null}(this.dom,t,e)}}class Ue extends Ce{constructor(t,e=[],i=0){super(),this.mark=t,this.children=e,this.length=i;for(let t of e)t.setParent(this)}setAttrs(t){if(ye(t),this.mark.class&&(t.className=this.mark.class),this.mark.attrs)for(let e in this.mark.attrs)t.setAttribute(e,this.mark.attrs[e]);return t}canReuseDOM(t){return super.canReuseDOM(t)&&!(8&(this.flags|t.flags))}reuseDOM(t){t.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(t),this.flags|=6)}sync(t,e){this.dom?4&this.flags&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(t,e)}merge(t,e,i,n,s,r){return(!i||!(!(i instanceof Ue&&i.mark.eq(this.mark))||t&&s<=0||et&&e.push(i=t&&(n=s),i=o,s++}let r=this.length-t;return this.length=t,n>-1&&(this.children.length=n,this.markDirty()),new Ue(this.mark,e,r)}domAtPos(t){return $e(this,t)}coordsAt(t,e){return je(this,t,e)}}class Qe extends Ce{static create(t,e,i){return new Qe(t,e,i)}constructor(t,e,i){super(),this.widget=t,this.length=e,this.side=i,this.prevWidget=null}split(t){let e=Qe.create(this.widget,this.length-t,this.side);return this.length-=t,e}sync(t){this.dom&&this.widget.updateDOM(this.dom,t)||(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(t)),this.widget.editable||(this.dom.contentEditable="false"))}getSide(){return this.side}merge(t,e,i,n,s,r){return!(i&&(!(i instanceof Qe&&this.widget.compare(i.widget))||t>0&&s<=0||e0)?Se.before(this.dom):Se.after(this.dom,t==this.length)}domBoundsAround(){return null}coordsAt(t,e){let i=this.widget.coordsAt(this.dom,t,e);if(i)return i;let n=this.dom.getClientRects(),s=null;if(!n.length)return null;let r=this.side?this.side<0:t>0;for(let e=r?n.length-1:0;s=n[e],!(t>0?0==e:e==n.length-1||s.top0?Se.before(this.dom):Se.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(t){return this.dom.getBoundingClientRect()}get overrideDOMText(){return t.empty}get isHidden(){return!0}}function $e(t,e){let i=t.dom,{children:n}=t,s=0;for(let t=0;st&&e0;t--){let e=n[t-1];if(e.dom.parentNode==i)return e.domAtPos(e.length)}for(let t=s;t0&&e instanceof Ue&&s.length&&(n=s[s.length-1])instanceof Ue&&n.mark.eq(e.mark)?_e(n,e.children[0],i-1):(s.push(e),e.setParent(t)),t.length+=e.length}function je(t,e,i){let n=null,s=-1,r=null,o=-1;!function t(e,l){for(let a=0,h=0;a=l&&(c.children.length?t(c,l-h):(!r||r.isHidden&&i>0)&&(u>l||h==u&&c.getSide()>0)?(r=c,o=l-h):(h-1?1:0)!=s.length-(i&&s.indexOf(i)>-1?1:0))return!1;for(let r of n)if(r!=i&&(-1==s.indexOf(r)||t[r]!==e[r]))return!1;return!0}function Je(t,e,i){let n=!1;if(e)for(let s in e)i&&s in i||(n=!0,"style"==s?t.style.cssText="":t.removeAttribute(s));if(i)for(let s in i)e&&e[s]==i[s]||(n=!0,"style"==s?t.style.cssText=i[s]:t.setAttribute(s,i[s]));return n}function ti(t){let e=Object.create(null);for(let i=0;i0?3e8:-4e8:e>0?1e8:-1e8,new oi(t,e,e,i,t.widget||null,!1)}static replace(t){let e,i,n=!!t.block;if(t.isBlockGap)e=-5e8,i=4e8;else{let{start:s,end:r}=li(t,n);e=(s?n?-3e8:-1:5e8)-1,i=1+(r?n?2e8:1:-6e8)}return new oi(t,e,i,n,t.widget||null,!0)}static line(t){return new ri(t)}static set(t,e=!1){return Dt.of(t,e)}hasHeight(){return!!this.widget&&this.widget.estimatedHeight>-1}}ni.none=Dt.empty;class si extends ni{constructor(t){let{start:e,end:i}=li(t);super(e?-1:5e8,i?1:-6e8,null,t),this.tagName=t.tagName||"span",this.class=t.class||"",this.attrs=t.attributes||null}eq(t){var e,i;return this==t||t instanceof si&&this.tagName==t.tagName&&(this.class||(null===(e=this.attrs)||void 0===e?void 0:e.class))==(t.class||(null===(i=t.attrs)||void 0===i?void 0:i.class))&&Ze(this.attrs,t.attrs,"class")}range(t,e=t){if(t>=e)throw new RangeError("Mark decorations may not be empty");return super.range(t,e)}}si.prototype.point=!1;class ri extends ni{constructor(t){super(-2e8,-2e8,null,t)}eq(t){return t instanceof ri&&this.spec.class==t.spec.class&&Ze(this.spec.attributes,t.spec.attributes)}range(t,e=t){if(e!=t)throw new RangeError("Line decoration ranges must be zero-length");return super.range(t,e)}}ri.prototype.mapMode=P.TrackBefore,ri.prototype.point=!0;class oi extends ni{constructor(t,e,i,n,s,r){super(e,i,s,t),this.block=n,this.isReplace=r,this.mapMode=n?e<=0?P.TrackBefore:P.TrackAfter:P.TrackDel}get type(){return this.startSide!=this.endSide?ii.WidgetRange:this.startSide<=0?ii.WidgetBefore:ii.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(t){return t instanceof oi&&(e=this.widget,i=t.widget,e==i||!!(e&&i&&e.compare(i)))&&this.block==t.block&&this.startSide==t.startSide&&this.endSide==t.endSide;var e,i}range(t,e=t){if(this.isReplace&&(t>e||t==e&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&e!=t)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(t,e)}}function li(t,e=!1){let{inclusiveStart:i,inclusiveEnd:n}=t;return null==i&&(i=t.inclusive),null==n&&(n=t.inclusive),{start:null!=i?i:e,end:null!=n?n:e}}function ai(t,e,i,n=0){let s=i.length-1;s>=0&&i[s]+n>=t?i[s]=Math.max(i[s],e):i.push(t,e)}oi.prototype.point=!0;class hi extends Ce{constructor(){super(...arguments),this.children=[],this.length=0,this.prevAttrs=void 0,this.attrs=null,this.breakAfter=0}merge(t,e,i,n,s,r){if(i){if(!(i instanceof hi))return!1;this.dom||i.transferDOM(this)}return n&&this.setDeco(i?i.attrs:null),De(this,t,e,i?i.children.slice():[],s,r),!0}split(t){let e=new hi;if(e.breakAfter=this.breakAfter,0==this.length)return e;let{i:i,off:n}=this.childPos(t);n&&(e.append(this.children[i].split(n),0),this.children[i].merge(n,this.children[i].length,null,!1,0,0),i++);for(let t=i;t0&&0==this.children[i-1].length;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=t,e}transferDOM(t){this.dom&&(this.markDirty(),t.setDOM(this.dom),t.prevAttrs=void 0===this.prevAttrs?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(t){Ze(this.attrs,t)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=t)}append(t,e){_e(this,t,e)}addLineDeco(t){let e=t.spec.attributes,i=t.spec.class;e&&(this.attrs=Ke(e,this.attrs||{})),i&&(this.attrs=Ke({class:i},this.attrs||{}))}domAtPos(t){return $e(this,t)}reuseDOM(t){"DIV"==t.nodeName&&(this.setDOM(t),this.flags|=6)}sync(t,e){var i;this.dom?4&this.flags&&(ye(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),void 0!==this.prevAttrs&&(Je(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(t,e);let n=this.dom.lastChild;for(;n&&Ce.get(n)instanceof Ue;)n=n.lastChild;if(!(n&&this.length&&("BR"==n.nodeName||0!=(null===(i=Ce.get(n))||void 0===i?void 0:i.isEditable)||qe.ios&&this.children.some((t=>t instanceof Xe))))){let t=document.createElement("BR");t.cmIgnore=!0,this.dom.appendChild(t)}}measureTextSize(){if(0==this.children.length||this.length>20)return null;let t,e=0;for(let i of this.children){if(!(i instanceof Xe)||/[^ -~]/.test(i.text))return null;let n=re(i.dom);if(1!=n.length)return null;e+=n[0].width,t=n[0].height}return e?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:e/this.length,textHeight:t}:null}coordsAt(t,e){let i=je(this,t,e);if(!this.children.length&&i&&this.parent){let{heightOracle:t}=this.parent.view.viewState,e=i.bottom-i.top;if(Math.abs(e-t.lineHeight)<2&&t.textHeight=e){if(s instanceof hi)return s;if(r>e)break}n=r+s.breakAfter}return null}}class ci extends Ce{constructor(t,e,i){super(),this.widget=t,this.length=e,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(t,e,i,n,s,r){return!(i&&(!(i instanceof ci&&this.widget.compare(i.widget))||t>0&&s<=0||e0)}}class ui extends ei{constructor(t){super(),this.height=t}toDOM(){let t=document.createElement("div");return t.className="cm-gap",this.updateDOM(t),t}eq(t){return t.height==this.height}updateDOM(t){return t.style.height=this.height+"px",!0}get editable(){return!0}get estimatedHeight(){return this.height}ignoreEvent(){return!1}}class di{constructor(t,e,i,n){this.doc=t,this.pos=e,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=t.iter(),this.skip=e}posCovered(){if(0==this.content.length)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let t=this.content[this.content.length-1];return!(t.breakAfter||t instanceof ci&&t.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new hi),this.atCursorPos=!0),this.curLine}flushBuffer(t=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(fi(new Ye(-1),t),t.length),this.pendingBuffer=0)}addBlockWidget(t){this.flushBuffer(),this.curLine=null,this.content.push(t)}finish(t){this.pendingBuffer&&t<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,this.posCovered()||t&&this.content.length&&this.content[this.content.length-1]instanceof ci||this.getLine()}buildText(t,e,i){for(;t>0;){if(this.textOff==this.text.length){let{value:e,lineBreak:i,done:n}=this.cursor.next(this.skip);if(this.skip=0,n)throw new Error("Ran out of text content when drawing inline views");if(i){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,t--;continue}this.text=e,this.textOff=0}let n=Math.min(this.text.length-this.textOff,t,512);this.flushBuffer(e.slice(e.length-i)),this.getLine().append(fi(new Xe(this.text.slice(this.textOff,this.textOff+n)),e),i),this.atCursorPos=!0,this.textOff+=n,t-=n,i=0}}span(t,e,i,n){this.buildText(e-t,i,n),this.pos=e,this.openStart<0&&(this.openStart=n)}point(t,e,i,n,s,r){if(this.disallowBlockEffectsFor[r]&&i instanceof oi){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(e>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let o=e-t;if(i instanceof oi)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new ci(i.widget||pi.block,o,i));else{let r=Qe.create(i.widget||pi.inline,o,o?0:i.startSide),l=this.atCursorPos&&!r.isEditable&&s<=n.length&&(t0),a=!r.isEditable&&(tn.length||i.startSide<=0),h=this.getLine();2!=this.pendingBuffer||l||r.isEditable||(this.pendingBuffer=0),this.flushBuffer(n),l&&(h.append(fi(new Ye(1),n),s),s=n.length+Math.max(0,s-n.length)),h.append(fi(r,n),s),this.atCursorPos=a,this.pendingBuffer=a?tn.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);o&&(this.textOff+o<=this.text.length?this.textOff+=o:(this.skip+=o-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=e),this.openStart<0&&(this.openStart=s)}static build(t,e,i,n,s){let r=new di(t,e,i,s);return r.openEnd=Dt.spans(n,e,i,r),r.openStart<0&&(r.openStart=r.openEnd),r.finish(r.openEnd),r}}function fi(t,e){for(let i of e)t=new Ue(i,[t],t.length);return t}class pi extends ei{constructor(t){super(),this.tag=t}eq(t){return t.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(t){return t.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}pi.inline=new pi("span"),pi.block=new pi("div");var gi=function(t){return t[t.LTR=0]="LTR",t[t.RTL=1]="RTL",t}(gi||(gi={}));const mi=gi.LTR,vi=gi.RTL;function wi(t){let e=[];for(let i=0;i=e){if(o.level==i)return r;(s<0||(0!=n?n<0?o.frome:t[s].level>o.level))&&(s=r)}}if(s<0)throw new RangeError("Index out of range");return s}}function Ci(t,e){if(t.length!=e.length)return!1;for(let i=0;ia&&o.push(new Oi(a,p.from,d)),Ti(t,p.direction==mi!=!(d%2)?n+1:n,s,p.inner,p.from,p.to,o),a=p.to}f=p.to}else{if(f==i||(e?Ai[f]!=l:Ai[f]==l))break;f++}u?Mi(t,a,f,n+1,s,u,o):ae;){let i=!0,c=!1;if(!h||a>r[h-1].to){let t=Ai[a-1];t!=l&&(i=!1,c=16==t)}let u=i||1!=l?null:[],d=i?n:n+1,f=a;t:for(;;)if(h&&f==r[h-1].to){if(c)break t;let p=r[--h];if(!i)for(let t=p.from,i=h;;){if(t==e)break t;if(!i||r[i-1].to!=t){if(Ai[t-1]==l)break t;break}t=r[--i].from}if(u)u.push(p);else{p.to=0;t-=3)if(ki[t+1]==-i){let e=ki[t+2],i=2&e?s:4&e?1&e?r:s:0;i&&(Ai[o]=Ai[ki[t]]=i),l=t;break}}else{if(189==ki.length)break;ki[l++]=o,ki[l++]=e,ki[l++]=a}else if(2==(n=Ai[o])||1==n){let t=n==s;a=t?0:1;for(let e=l-3;e>=0;e-=3){let i=ki[e+2];if(2&i)break;if(t)ki[e+2]|=2;else{if(4&i)break;ki[e+2]|=4}}}}}(t,s,r,n,l),function(t,e,i,n){for(let s=0,r=n;s<=i.length;s++){let o=s?i[s-1].to:t,l=sa;)e==r&&(e=i[--n].from,r=n?i[n-1].to:t),Ai[--e]=c;a=o}else r=o,a++}}}(s,r,n,l),Mi(t,s,r,e,i,n,o)}function Di(t){return[new Oi(0,t,0)]}let Ei="";function Ri(t,e,i,n,s){var r;let o=n.head-t.from,l=Oi.find(e,o,null!==(r=n.bidiLevel)&&void 0!==r?r:-1,n.assoc),a=e[l],h=a.side(s,i);if(o==h){let t=l+=s?1:-1;if(t<0||t>=e.length)return null;a=e[l=t],o=a.side(!s,i),h=a.side(s,i)}let c=p(t.text,o,a.forward(s,i));(ca.to)&&(c=h),Ei=t.text.slice(Math.min(o,c),Math.max(o,c));let u=l==(s?e.length-1:0)?null:e[l+(s?1:-1)];return u&&c==h&&u.level+(s?0:1)t.some((t=>t))}),qi=I.define({combine:t=>t.some((t=>t))}),Xi=I.define();class Ui{constructor(t,e="nearest",i="nearest",n=5,s=5,r=!1){this.range=t,this.y=e,this.x=i,this.yMargin=n,this.xMargin=s,this.isSnapshot=r}map(t){return t.empty?this:new Ui(this.range.map(t),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}clip(t){return this.range.to<=t.doc.length?this:new Ui(B.cursor(t.doc.length),this.y,this.x,this.yMargin,this.xMargin,this.isSnapshot)}}const Qi=dt.define({map:(t,e)=>t.map(e)}),Yi=dt.define();function $i(t,e,i){let n=t.facet(Fi);n.length?n[0](e):window.onerror?window.onerror(String(e),i,void 0,void 0,e):i?console.error(i+":",e):console.error(e)}const _i=I.define({combine:t=>!t.length||t[0]});let ji=0;const Ki=I.define();class Gi{constructor(t,e,i,n,s){this.id=t,this.create=e,this.domEventHandlers=i,this.domEventObservers=n,this.extension=s(this)}static define(t,e){const{eventHandlers:i,eventObservers:n,provide:s,decorations:r}=e||{};return new Gi(ji++,t,i,n,(t=>{let e=[Ki.of(t)];return r&&e.push(en.of((e=>{let i=e.plugin(t);return i?r(i):ni.none}))),s&&e.push(s(t)),e}))}static fromClass(t,e){return Gi.define((e=>new t(e)),e)}}class Zi{constructor(t){this.spec=t,this.mustUpdate=null,this.value=null}update(t){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(t)}catch(e){if($i(t.state,e,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(t){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(t)}catch(e){$i(t.state,e,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(t){var e;if(null===(e=this.value)||void 0===e?void 0:e.destroy)try{this.value.destroy()}catch(e){$i(t.state,e,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const Ji=I.define(),tn=I.define(),en=I.define(),nn=I.define(),sn=I.define(),rn=I.define();function on(t,e){let i=t.state.facet(rn);if(!i.length)return i;let n=i.map((e=>e instanceof Function?e(t):e)),s=[];return Dt.spans(n,e.from,e.to,{point(){},span(t,i,n,r){let o=t-e.from,l=i-e.from,a=s;for(let t=n.length-1;t>=0;t--,r--){let i,s=n[t].spec.bidiIsolate;if(null==s&&(s=Bi(e.text,o,l)),r>0&&a.length&&(i=a[a.length-1]).to==o&&i.direction==s)i.to=l,a=i.inner;else{let t={from:o,to:l,direction:s,inner:[]};a.push(t),a=t.inner}}}}),s}const ln=I.define();function an(t){let e=0,i=0,n=0,s=0;for(let r of t.state.facet(ln)){let o=r(t);o&&(null!=o.left&&(e=Math.max(e,o.left)),null!=o.right&&(i=Math.max(i,o.right)),null!=o.top&&(n=Math.max(n,o.top)),null!=o.bottom&&(s=Math.max(s,o.bottom)))}return{left:e,right:i,top:n,bottom:s}}const hn=I.define();class cn{constructor(t,e,i,n){this.fromA=t,this.toA=e,this.fromB=i,this.toB=n}join(t){return new cn(Math.min(this.fromA,t.fromA),Math.max(this.toA,t.toA),Math.min(this.fromB,t.fromB),Math.max(this.toB,t.toB))}addToSet(t){let e=t.length,i=this;for(;e>0;e--){let n=t[e-1];if(!(n.fromA>i.toA)){if(n.toAh)break;s+=2}if(!l)return i;new cn(l.fromA,l.toA,l.fromB,l.toB).addToSet(i),r=l.toA,o=l.toB}}}class un{constructor(t,e,i){this.view=t,this.state=e,this.transactions=i,this.flags=0,this.startState=t.state,this.changes=O.empty(this.startState.doc.length);for(let t of i)this.changes=this.changes.compose(t.changes);let n=[];this.changes.iterChangedRanges(((t,e,i,s)=>n.push(new cn(t,e,i,s)))),this.changedRanges=n}static create(t,e,i){return new un(t,e,i)}get viewportChanged(){return(4&this.flags)>0}get heightChanged(){return(2&this.flags)>0}get geometryChanged(){return this.docChanged||(10&this.flags)>0}get focusChanged(){return(1&this.flags)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some((t=>t.selection))}get empty(){return 0==this.flags&&0==this.transactions.length}}class dn extends Ce{get length(){return this.view.state.doc.length}constructor(t){super(),this.view=t,this.decorations=[],this.dynamicDecorationMap=[!1],this.domChanged=null,this.hasComposition=null,this.markedForComposition=new Set,this.editContextFormatting=ni.none,this.lastCompositionAfterCursor=!1,this.minWidth=0,this.minWidthFrom=0,this.minWidthTo=0,this.impreciseAnchor=null,this.impreciseHead=null,this.forceSelection=!1,this.lastUpdate=Date.now(),this.setDOM(t.contentDOM),this.children=[new hi],this.children[0].setParent(this),this.updateDeco(),this.updateInner([new cn(0,0,0,t.state.doc.length)],0,null)}update(t){var e;let i=t.changedRanges;this.minWidth>0&&i.length&&(i.every((({fromA:t,toA:e})=>ethis.minWidthTo))?(this.minWidthFrom=t.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=t.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0),this.updateEditContextFormatting(t);let n=-1;this.view.inputState.composing>=0&&!this.view.observer.editContext&&((null===(e=this.domChanged)||void 0===e?void 0:e.newSel)?n=this.domChanged.newSel.head:function(t,e){let i=!1;e&&t.iterChangedRanges(((t,n)=>{te.from&&(i=!0)}));return i}(t.changes,this.hasComposition)||t.selectionSet||(n=t.state.selection.main.head));let s=n>-1?function(t,e,i){let n=fn(t,i);if(!n)return null;let{node:s,from:r,to:o}=n,l=s.nodeValue;if(/[\n\r]/.test(l))return null;if(t.state.doc.sliceString(n.from,n.to)!=l)return null;let a=e.invertedDesc,h=new cn(a.mapPos(r),a.mapPos(o),r,o),c=[];for(let e=s.parentNode;;e=e.parentNode){let i=Ce.get(e);if(i instanceof Ue)c.push({node:e,deco:i.mark});else{if(i instanceof hi||"DIV"==e.nodeName&&e.parentNode==t.contentDOM)return{range:h,text:s,marks:c,line:e};if(e==t.contentDOM)return null;c.push({node:e,deco:new si({inclusive:!0,attributes:ti(e),tagName:e.tagName.toLowerCase()})})}}}(this.view,t.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:e,to:n}=this.hasComposition;i=new cn(e,n,t.changes.mapPos(e,-1),t.changes.mapPos(n,1)).addToSet(i.slice())}this.hasComposition=s?{from:s.range.fromB,to:s.range.toB}:null,(qe.ie||qe.chrome)&&!s&&t&&t.state.doc.lines!=t.startState.doc.lines&&(this.forceSelection=!0);let r=function(t,e,i){let n=new pn;return Dt.compare(t,e,i,n),n.changes}(this.decorations,this.updateDeco(),t.changes);return i=cn.extendWithRanges(i,r),!!(7&this.flags||0!=i.length)&&(this.updateInner(i,t.startState.doc.length,s),t.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(t,e,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(t,e,i);let{observer:n}=this.view;n.ignore((()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let t=qe.chrome||qe.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,t),this.flags&=-8,t&&(t.written||n.selectionRange.focusNode!=t.node)&&(this.forceSelection=!0),this.dom.style.height=""})),this.markedForComposition.forEach((t=>t.flags&=-9));let s=[];if(this.view.viewport.from||this.view.viewport.to=0?n[t]:null;if(!e)break;let r,o,l,a,{fromA:h,toA:c,fromB:u,toB:d}=e;if(i&&i.range.fromBu){let t=di.build(this.view.state.doc,u,i.range.fromB,this.decorations,this.dynamicDecorationMap),e=di.build(this.view.state.doc,i.range.toB,d,this.decorations,this.dynamicDecorationMap);o=t.breakAtStart,l=t.openStart,a=e.openEnd;let n=this.compositionView(i);e.breakAtStart?n.breakAfter=1:e.content.length&&n.merge(n.length,n.length,e.content[0],!1,e.openStart,0)&&(n.breakAfter=e.content[0].breakAfter,e.content.shift()),t.content.length&&n.merge(0,0,t.content[t.content.length-1],!0,0,t.openEnd)&&t.content.pop(),r=t.content.concat(n).concat(e.content)}else({content:r,breakAtStart:o,openStart:l,openEnd:a}=di.build(this.view.state.doc,u,d,this.decorations,this.dynamicDecorationMap));let{i:f,off:p}=s.findPos(c,1),{i:g,off:m}=s.findPos(h,-1);Te(this,g,m,f,p,r,o,l,a)}i&&this.fixCompositionDOM(i)}updateEditContextFormatting(t){this.editContextFormatting=this.editContextFormatting.map(t.changes);for(let e of t.transactions)for(let t of e.effects)t.is(Yi)&&(this.editContextFormatting=t.value)}compositionView(t){let e=new Xe(t.text.nodeValue);e.flags|=8;for(let{deco:i}of t.marks)e=new Ue(i,[e],e.length);let i=new hi;return i.append(e,0),i}fixCompositionDOM(t){let e=(t,e)=>{e.flags|=8|(e.children.some((t=>7&t.flags))?1:0),this.markedForComposition.add(e);let i=Ce.get(t);i&&i!=e&&(i.dom=null),e.setDOM(t)},i=this.childPos(t.range.fromB,1),n=this.children[i.i];e(t.line,n);for(let s=t.marks.length-1;s>=-1;s--)i=n.childPos(i.off,1),n=n.children[i.i],e(s>=0?t.marks[s].node:t.text,n)}updateSelection(t=!1,e=!1){!t&&this.view.observer.selectionRange.focusNode||this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,s=!n&&se(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||e||s))return;let r=this.forceSelection;this.forceSelection=!1;let o=this.view.state.selection.main,l=this.moveToLine(this.domAtPos(o.anchor)),a=o.empty?l:this.moveToLine(this.domAtPos(o.head));if(qe.gecko&&o.empty&&!this.hasComposition&&(1==(h=l).node.nodeType&&h.node.firstChild&&(0==h.offset||"false"==h.node.childNodes[h.offset-1].contentEditable)&&(h.offset==h.node.childNodes.length||"false"==h.node.childNodes[h.offset].contentEditable))){let t=document.createTextNode("");this.view.observer.ignore((()=>l.node.insertBefore(t,l.node.childNodes[l.offset]||null))),l=a=new Se(t,0),r=!0}var h;let c=this.view.observer.selectionRange;!r&&c.focusNode&&(oe(l.node,l.offset,c.anchorNode,c.anchorOffset)&&oe(a.node,a.offset,c.focusNode,c.focusOffset)||this.suppressWidgetCursorChange(c,o))||(this.view.observer.ignore((()=>{qe.android&&qe.chrome&&this.dom.contains(c.focusNode)&&function(t,e){for(let i=t;i&&i!=e;i=i.assignedSlot||i.parentNode)if(1==i.nodeType&&"false"==i.contentEditable)return!0;return!1}(c.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let t=ie(this.view.root);if(t)if(o.empty){if(qe.gecko){let t=(e=l.node,n=l.offset,1!=e.nodeType?0:(n&&"false"==e.childNodes[n-1].contentEditable?1:0)|(no.head&&([l,a]=[a,l]),e.setEnd(a.node,a.offset),e.setStart(l.node,l.offset),t.removeAllRanges(),t.addRange(e)}else;var e,n;s&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())})),this.view.observer.setSelectionRange(l,a)),this.impreciseAnchor=l.precise?null:new Se(c.anchorNode,c.anchorOffset),this.impreciseHead=a.precise?null:new Se(c.focusNode,c.focusOffset)}suppressWidgetCursorChange(t,e){return this.hasComposition&&e.empty&&oe(t.focusNode,t.focusOffset,t.anchorNode,t.anchorOffset)&&this.posFromDOM(t.focusNode,t.focusOffset)==e.head}enforceCursorAssoc(){if(this.hasComposition)return;let{view:t}=this,e=t.state.selection.main,i=ie(t.root),{anchorNode:n,anchorOffset:s}=t.observer.selectionRange;if(!(i&&e.empty&&e.assoc&&i.modify))return;let r=hi.find(this,e.head);if(!r)return;let o=r.posAtStart;if(e.head==o||e.head==o+r.length)return;let l=this.coordsAt(e.head,-1),a=this.coordsAt(e.head,1);if(!l||!a||l.bottom>a.top)return;let h=this.domAtPos(e.head+e.assoc);i.collapse(h.node,h.offset),i.modify("move",e.assoc<0?"forward":"backward","lineboundary"),t.observer.readSelectionRange();let c=t.observer.selectionRange;t.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=e.from&&i.collapse(n,s)}moveToLine(t){let e,i=this.dom;if(t.node!=i)return t;for(let n=t.offset;!e&&n=0;n--){let t=Ce.get(i.childNodes[n]);t instanceof hi&&(e=t.domAtPos(t.length))}return e?new Se(e.node,e.offset,!0):t}nearest(t){for(let e=t;e;){let t=Ce.get(e);if(t&&t.rootView==this)return t;e=e.parentNode}return null}posFromDOM(t,e){let i=this.nearest(t);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(t,e)+i.posAtStart}domAtPos(t){let{i:e,off:i}=this.childCursor().findPos(t,-1);for(;e=0;r--){let o=this.children[r],l=s-o.breakAfter,a=l-o.length;if(lt||o.covers(1))&&(!i||o instanceof hi&&!(i instanceof hi&&e>=0)))i=o,n=a;else if(i&&a==t&&l==t&&o instanceof ci&&Math.abs(e)<2){if(o.deco.startSide<0)break;r&&(i=null)}s=a}return i?i.coordsAt(t-n,e):null}coordsForChar(t){let{i:e,off:i}=this.childPos(t,1),n=this.children[e];if(!(n instanceof hi))return null;for(;n.children.length;){let{i:t,off:e}=n.childPos(i,1);for(;;t++){if(t==n.children.length)return null;if((n=n.children[t]).length)break}i=e}if(!(n instanceof Xe))return null;let s=p(n.text,i);if(s==i)return null;let r=we(n.dom,i,s).getClientRects();for(let t=0;tMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,o=-1,l=this.view.textDirection==gi.LTR;for(let t=0,a=0;an)break;if(t>=i){let i=h.dom.getBoundingClientRect();if(e.push(i.height),r){let e=h.dom.lastChild,n=e?re(e):[];if(n.length){let e=n[n.length-1],r=l?e.right-i.left:i.right-e.left;r>o&&(o=r,this.minWidth=s,this.minWidthFrom=t,this.minWidthTo=c)}}}t=c+h.breakAfter}return e}textDirectionAt(t){let{i:e}=this.childPos(t,1);return"rtl"==getComputedStyle(this.children[e].dom).direction?gi.RTL:gi.LTR}measureTextSize(){for(let t of this.children)if(t instanceof hi){let e=t.measureTextSize();if(e)return e}let t,e,i,n=document.createElement("div");return n.className="cm-line",n.style.width="99999px",n.style.position="absolute",n.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore((()=>{this.dom.appendChild(n);let s=re(n.firstChild)[0];t=n.getBoundingClientRect().height,e=s?s.width/27:7,i=s?s.height:t,n.remove()})),{lineHeight:t,charWidth:e,textHeight:i}}childCursor(t=this.length){let e=this.children.length;return e&&(t-=this.children[--e].length),new Me(this.children,t,e)}computeBlockGapDeco(){let t=[],e=this.view.viewState;for(let i=0,n=0;;n++){let s=n==e.viewports.length?null:e.viewports[n],r=s?s.from-1:this.length;if(r>i){let n=(e.lineBlockAt(r).bottom-e.lineBlockAt(i).top)/this.view.scaleY;t.push(ni.replace({widget:new ui(n),block:!0,inclusive:!0,isBlockGap:!0}).range(i,r))}if(!s)break;i=s.to+1}return ni.set(t)}updateDeco(){let t=1,e=this.view.state.facet(en).map((e=>(this.dynamicDecorationMap[t++]="function"==typeof e)?e(this.view):e)),i=!1,n=this.view.state.facet(nn).map(((t,e)=>{let n="function"==typeof t;return n&&(i=!0),n?t(this.view):t}));for(n.length&&(this.dynamicDecorationMap[t++]=i,e.push(Dt.join(n))),this.decorations=[this.editContextFormatting,...e,this.computeBlockGapDeco(),this.view.viewState.lineGapDeco];ti.anchor?-1:1);if(!n)return;!i.empty&&(e=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,e.left),top:Math.min(n.top,e.top),right:Math.max(n.right,e.right),bottom:Math.max(n.bottom,e.bottom)});let s=an(this.view),r={left:n.left-s.left,top:n.top-s.top,right:n.right+s.right,bottom:n.bottom+s.bottom},{offsetWidth:o,offsetHeight:l}=this.view.scrollDOM;!function(t,e,i,n,s,r,o,l){let a=t.ownerDocument,h=a.defaultView||window;for(let c=t,u=!1;c&&!u;)if(1==c.nodeType){let t,d=c==a.body,f=1,p=1;if(d)t=de(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(u=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let e=c.getBoundingClientRect();({scaleX:f,scaleY:p}=fe(c,e)),t={left:e.left,right:e.left+c.clientWidth*f,top:e.top,bottom:e.top+c.clientHeight*p}}let g=0,m=0;if("nearest"==s)e.top0&&e.bottom>t.bottom+m&&(m=e.bottom-t.bottom+m+o)):e.bottom>t.bottom&&(m=e.bottom-t.bottom+o,i<0&&e.top-m0&&e.right>t.right+g&&(g=e.right-t.right+g+r)):e.right>t.right&&(g=e.right-t.right+r,i<0&&e.leftt?e.left-t:Math.max(0,t-e.right)}function mn(t,e){return e.top>t?e.top-t:Math.max(0,t-e.bottom)}function vn(t,e){return t.tope.top+1}function wn(t,e){return et.bottom?{top:t.top,left:t.left,right:t.right,bottom:e}:t}function yn(t,e,i){let n,s,r,o,l,a,h,c,u=!1;for(let d=t.firstChild;d;d=d.nextSibling){let t=re(d);for(let f=0;fm||o==m&&r>g){n=d,s=p,r=g,o=m;let l=m?i0?f0)}0==g?i>p.bottom&&(!h||h.bottomp.top)&&(a=d,c=p):h&&vn(h,p)?h=bn(h,p.bottom):c&&vn(c,p)&&(c=wn(c,p.top))}}if(h&&h.bottom>=i?(n=l,s=h):c&&c.top<=i&&(n=a,s=c),!n)return{node:t,offset:0};let d=Math.max(s.left,Math.min(s.right,e));return 3==n.nodeType?xn(n,d,i):u&&"false"!=n.contentEditable?yn(n,d,i):{node:t,offset:Array.prototype.indexOf.call(t.childNodes,n)+(e>=(s.left+s.right)/2?1:0)}}function xn(t,e,i){let n=t.nodeValue.length,s=-1,r=1e9,o=0;for(let l=0;li?h.top-i:i-h.bottom)-1;if(h.left-1<=e&&h.right+1>=e&&c=(h.left+h.right)/2,n=i;if(qe.chrome||qe.gecko){we(t,l).getBoundingClientRect().left==h.right&&(n=!i)}if(c<=0)return{node:t,offset:l+(n?1:0)};s=l+(n?1:0),r=c}}}return{node:t,offset:s>-1?s:o>0?t.nodeValue.length:0}}function kn(t,e,i,n=-1){var s,r;let o,l=t.contentDOM.getBoundingClientRect(),a=l.top+t.viewState.paddingTop,{docHeight:h}=t.viewState,{x:c,y:u}=e,d=u-a;if(d<0)return 0;if(d>h)return t.state.doc.length;for(let e=t.viewState.heightOracle.textHeight/2,s=!1;o=t.elementAtHeight(d),o.type!=ii.Text;)for(;d=n>0?o.bottom+e:o.top-e,!(d>=0&&d<=h);){if(s)return i?null:0;s=!0,n=-n}u=a+d;let f=o.from;if(ft.viewport.to)return t.viewport.to==t.state.doc.length?t.state.doc.length:i?null:Pn(t,l,o,c,u);let p=t.dom.ownerDocument,g=t.root.elementFromPoint?t.root:p,m=g.elementFromPoint(c,u);m&&!t.contentDOM.contains(m)&&(m=null),m||(c=Math.max(l.left+1,Math.min(l.right-1,c)),m=g.elementFromPoint(c,u),m&&!t.contentDOM.contains(m)&&(m=null));let v,w=-1;if(m&&0!=(null===(s=t.docView.nearest(m))||void 0===s?void 0:s.isEditable))if(p.caretPositionFromPoint){let t=p.caretPositionFromPoint(c,u);t&&({offsetNode:v,offset:w}=t)}else if(p.caretRangeFromPoint){let e=p.caretRangeFromPoint(c,u);e&&(({startContainer:v,startOffset:w}=e),(!t.contentDOM.contains(v)||qe.safari&&function(t,e,i){let n;if(3!=t.nodeType||e!=(n=t.nodeValue.length))return!1;for(let e=t.nextSibling;e;e=e.nextSibling)if(1!=e.nodeType||"BR"!=e.nodeName)return!1;return we(t,n-1,n).getBoundingClientRect().left>i}(v,w,c)||qe.chrome&&function(t,e,i){if(0!=e)return!1;for(let e=t;;){let t=e.parentNode;if(!t||1!=t.nodeType||t.firstChild!=e)return!1;if(t.classList.contains("cm-line"))break;e=t}let n=1==t.nodeType?t.getBoundingClientRect():we(t,0,Math.max(t.nodeValue.length,1)).getBoundingClientRect();return i-n.left>5}(v,w,c))&&(v=void 0))}if(!v||!t.docView.dom.contains(v)){let e=hi.find(t.docView,f);if(!e)return d>o.top+o.height/2?o.to:o.from;({node:v,offset:w}=yn(e.dom,c,u))}let b=t.docView.nearest(v);if(!b)return null;if(b.isWidget&&1==(null===(r=b.dom)||void 0===r?void 0:r.nodeType)){let t=b.dom.getBoundingClientRect();return e.y1.5*t.defaultLineHeight){let e=t.viewState.heightOracle.textHeight;r+=Math.floor((s-i.top-.5*(t.defaultLineHeight-e))/e)*t.viewState.heightOracle.lineLength}let o=t.state.sliceDoc(i.from,i.to);return i.from+Xt(o,r,t.state.tabSize)}function Sn(t,e){let i=t.lineBlockAt(e);if(Array.isArray(i.type))for(let t of i.type)if(t.to>e||t.to==e&&(t.to==i.to||t.type==ii.Text))return t;return i}function On(t,e,i,n){let s=t.state.doc.lineAt(e.head),r=t.bidiSpans(s),o=t.textDirectionAt(s.from);for(let l=e,a=null;;){let e=Ri(s,r,o,l,i),h=Ei;if(!e){if(s.number==(i?t.state.doc.lines:1))return l;h="\n",s=t.state.doc.line(s.number+(i?1:-1)),r=t.bidiSpans(s),e=t.visualLineSide(s,!i)}if(a){if(!a(h))return l}else{if(!n)return e;a=n(h)}l=e}}function Cn(t,e,i){for(;;){let n=0;for(let s of t)s.between(e-1,e+1,((t,s,r)=>{if(e>t&&ee(t))),i.from,e.head>i.from?-1:1);return n==i.from?i:B.cursor(n,nt)&&this.lineBreak(),n=s}return this.findPointBefore(i,e),this}readTextNode(t){let e=t.nodeValue;for(let i of this.points)i.node==t&&(i.pos=this.text.length+Math.min(i.offset,e.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let s,r=-1,o=1;if(this.lineSeparator?(r=e.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(s=n.exec(e))&&(r=s.index,o=s[0].length),this.append(e.slice(i,r<0?e.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let e of this.points)e.node==t&&e.pos>this.text.length&&(e.pos-=o-1);i=r+o}}readNode(t){if(t.cmIgnore)return;let e=Ce.get(t),i=e&&e.overrideDOMText;if(null!=i){this.findPointInside(t,i.length);for(let t=i.iter();!t.next().done;)t.lineBreak?this.lineBreak():this.append(t.value)}else 3==t.nodeType?this.readTextNode(t):"BR"==t.nodeName?t.nextSibling&&this.lineBreak():1==t.nodeType&&this.readRange(t.firstChild,null)}findPointBefore(t,e){for(let i of this.points)i.node==t&&t.childNodes[i.offset]==e&&(i.pos=this.text.length)}findPointInside(t,e){for(let i of this.points)(3==t.nodeType?i.node==t:t.contains(i.node))&&(i.pos=this.text.length+(Dn(t,i.node,i.offset)?e:0))}}function Dn(t,e,i){for(;;){if(!e||i-1;let{impreciseHead:s,impreciseAnchor:r}=t.docView;if(t.state.readOnly&&e>-1)this.newSel=null;else if(e>-1&&(this.bounds=t.docView.domBoundsAround(e,i,0))){let e=s||r?[]:function(t){let e=[];if(t.root.activeElement!=t.contentDOM)return e;let{anchorNode:i,anchorOffset:n,focusNode:s,focusOffset:r}=t.observer.selectionRange;i&&(e.push(new En(i,n)),s==i&&r==n||e.push(new En(s,r)));return e}(t),i=new Tn(e,t.state);i.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=i.text,this.newSel=function(t,e){if(0==t.length)return null;let i=t[0].pos,n=2==t.length?t[1].pos:i;return i>-1&&n>-1?B.single(i+e,n+e):null}(e,this.bounds.from)}else{let e=t.observer.selectionRange,i=s&&s.node==e.focusNode&&s.offset==e.focusOffset||!ne(t.contentDOM,e.focusNode)?t.state.selection.main.head:t.docView.posFromDOM(e.focusNode,e.focusOffset),n=r&&r.node==e.anchorNode&&r.offset==e.anchorOffset||!ne(t.contentDOM,e.anchorNode)?t.state.selection.main.anchor:t.docView.posFromDOM(e.anchorNode,e.anchorOffset),o=t.viewport;if((qe.ios||qe.chrome)&&t.state.selection.main.empty&&i!=n&&(o.from>0||o.toDate.now()-100?e.inputState.lastKeyCode:-1;if(i.bounds){let{from:s,to:l}=i.bounds,a=r.from,h=null;(8===o||qe.android&&i.text.length0&&l>0&&t.charCodeAt(o-1)==e.charCodeAt(l-1);)o--,l--;if("end"==n){i-=o+Math.max(0,r-Math.min(o,l))-r}if(o=o?r-i:0,l=r+(l-o),o=r}else if(l=l?r-i:0,o=r+(o-l),l=r}return{from:r,toA:o,toB:l}}(e.state.doc.sliceString(s,l,Mn),i.text,a-s,h);c&&(qe.chrome&&13==o&&c.toB==c.from+2&&i.text.slice(c.from,c.toB)==Mn+Mn&&c.toB--,n={from:s+c.from,to:s+c.toA,insert:t.of(i.text.slice(c.from,c.toB).split(Mn))})}else s&&(!e.hasFocus&&e.state.facet(_i)||s.main.eq(r))&&(s=null);if(!n&&!s)return!1;if(!n&&i.typeOver&&!r.empty&&s&&s.main.empty?n={from:r.from,to:r.to,insert:e.state.doc.slice(r.from,r.to)}:n&&n.from>=r.from&&n.to<=r.to&&(n.from!=r.from||n.to!=r.to)&&r.to-r.from-(n.to-n.from)<=4?n={from:r.from,to:r.to,insert:e.state.doc.slice(r.from,n.from).append(n.insert).append(e.state.doc.slice(n.to,r.to))}:(qe.mac||qe.android)&&n&&n.from==n.to&&n.from==r.head-1&&/^\. ?$/.test(n.insert.toString())&&"off"==e.contentDOM.getAttribute("autocorrect")?(s&&2==n.insert.length&&(s=B.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:t.of([" "])}):qe.chrome&&n&&n.from==n.to&&n.from==r.head&&"\n "==n.insert.toString()&&e.lineWrapping&&(s&&(s=B.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:t.of([" "])}),n)return Nn(e,n,s,o);if(s&&!s.main.eq(r)){let t=!1,i="select";return e.inputState.lastSelectionTime>Date.now()-50&&("select"==e.inputState.lastSelectionOrigin&&(t=!0),i=e.inputState.lastSelectionOrigin),e.dispatch({selection:s,scrollIntoView:t,userEvent:i}),!0}return!1}function Nn(t,e,i,n=-1){if(qe.ios&&t.inputState.flushIOSKey(e))return!0;let s=t.state.selection.main;if(qe.android&&(e.to==s.to&&(e.from==s.from||e.from==s.from-1&&" "==t.state.sliceDoc(e.from,s.from))&&1==e.insert.length&&2==e.insert.lines&&be(t.contentDOM,"Enter",13)||(e.from==s.from-1&&e.to==s.to&&0==e.insert.length||8==n&&e.insert.lengths.head)&&be(t.contentDOM,"Backspace",8)||e.from==s.from&&e.to==s.to+1&&0==e.insert.length&&be(t.contentDOM,"Delete",46)))return!0;let r,o=e.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let l=()=>r||(r=function(t,e,i){let n,s=t.state,r=s.selection.main;if(e.from>=r.from&&e.to<=r.to&&e.to-e.from>=(r.to-r.from)/3&&(!i||i.main.empty&&i.main.from==e.from+e.insert.length)&&t.inputState.composing<0){let i=r.frome.to?s.sliceDoc(e.to,r.to):"";n=s.replaceSelection(t.state.toText(i+e.insert.sliceString(0,void 0,t.state.lineBreak)+o))}else{let o=s.changes(e),l=i&&i.main.to<=o.newLength?i.main:void 0;if(s.selection.ranges.length>1&&t.inputState.composing>=0&&e.to<=r.to&&e.to>=r.to-10){let a,h=t.state.sliceDoc(e.from,e.to),c=i&&fn(t,i.main.head);if(c){let t=e.insert.length-(e.to-e.from);a={from:c.from,to:c.to-t}}else a=t.state.doc.lineAt(r.head);let u=r.to-e.to,d=r.to-r.from;n=s.changeByRange((i=>{if(i.from==r.from&&i.to==r.to)return{changes:o,range:l||i.map(o)};let n=i.to-u,c=n-h.length;if(i.to-i.from!=d||t.state.sliceDoc(c,n)!=h||i.to>=a.from&&i.from<=a.to)return{range:i};let f=s.changes({from:c,to:n,insert:e.insert}),p=i.to-r.to;return{changes:f,range:l?B.range(Math.max(0,l.anchor+p),Math.max(0,l.head+p)):i.map(f)}}))}else n={changes:o,selection:l&&s.selection.replaceRange(l)}}let o="input.type";(t.composing||t.inputState.compositionPendingChange&&t.inputState.compositionEndedAt>Date.now()-50)&&(t.inputState.compositionPendingChange=!1,o+=".compose",t.inputState.compositionFirstChange&&(o+=".start",t.inputState.compositionFirstChange=!1));return s.update(n,{userEvent:o,scrollIntoView:!0})}(t,e,i));return t.state.facet(Wi).some((i=>i(t,e.from,e.to,o,l)))||t.dispatch(l()),!0}class Ln{setSelectionOrigin(t){this.lastSelectionOrigin=t,this.lastSelectionTime=Date.now()}constructor(t){this.view=t,this.lastKeyCode=0,this.lastKeyTime=0,this.lastTouchTime=0,this.lastFocusTime=0,this.lastScrollTop=0,this.lastScrollLeft=0,this.pendingIOSKey=void 0,this.tabFocusMode=-1,this.lastSelectionOrigin=null,this.lastSelectionTime=0,this.lastContextMenu=0,this.scrollHandlers=[],this.handlers=Object.create(null),this.composing=-1,this.compositionFirstChange=null,this.compositionEndedAt=0,this.compositionPendingKey=!1,this.compositionPendingChange=!1,this.mouseSelection=null,this.draggedContent=null,this.handleEvent=this.handleEvent.bind(this),this.notifiedFocused=t.hasFocus,qe.safari&&t.contentDOM.addEventListener("input",(()=>null)),qe.gecko&&function(t){ls.has(t)||(ls.add(t),t.addEventListener("copy",(()=>{})),t.addEventListener("cut",(()=>{})))}(t.contentDOM.ownerDocument)}handleEvent(t){(function(t,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;for(let i,n=e.target;n!=t.contentDOM;n=n.parentNode)if(!n||11==n.nodeType||(i=Ce.get(n))&&i.ignoreEvent(e))return!1;return!0})(this.view,t)&&!this.ignoreDuringComposition(t)&&("keydown"==t.type&&this.keydown(t)||this.runHandlers(t.type,t))}runHandlers(t,e){let i=this.handlers[t];if(i){for(let t of i.observers)t(this.view,e);for(let t of i.handlers){if(e.defaultPrevented)break;if(t(this.view,e)){e.preventDefault();break}}}}ensureHandlers(t){let e=Fn(t),i=this.handlers,n=this.view.contentDOM;for(let t in e)if("scroll"!=t){let s=!e[t].handlers.length,r=i[t];r&&s!=!r.handlers.length&&(n.removeEventListener(t,this.handleEvent),r=null),r||n.addEventListener(t,this.handleEvent,{passive:s})}for(let t in i)"scroll"==t||e[t]||n.removeEventListener(t,this.handleEvent);this.handlers=e}keydown(t){if(this.lastKeyCode=t.keyCode,this.lastKeyTime=Date.now(),9==t.keyCode&&this.tabFocusMode>-1&&(!this.tabFocusMode||Date.now()<=this.tabFocusMode))return!0;if(this.tabFocusMode>0&&27!=t.keyCode&&Hn.indexOf(t.keyCode)<0&&(this.tabFocusMode=-1),qe.android&&qe.chrome&&!t.synthetic&&(13==t.keyCode||8==t.keyCode))return this.view.observer.delayAndroidKey(t.key,t.keyCode),!0;let e;return!qe.ios||t.synthetic||t.altKey||t.metaKey||!((e=Vn.find((e=>e.keyCode==t.keyCode)))&&!t.ctrlKey||Wn.indexOf(t.key)>-1&&t.ctrlKey&&!t.shiftKey)?(229!=t.keyCode&&this.view.observer.forceFlush(),!1):(this.pendingIOSKey=e||t,setTimeout((()=>this.flushIOSKey()),250),!0)}flushIOSKey(t){let e=this.pendingIOSKey;return!!e&&(!("Enter"==e.key&&t&&t.from0||!!(qe.safari&&!qe.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100)&&(this.compositionPendingKey=!1,!0))}startMouseSelection(t){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=t}update(t){this.view.observer.update(t),this.mouseSelection&&this.mouseSelection.update(t),this.draggedContent&&t.docChanged&&(this.draggedContent=this.draggedContent.map(t.changes)),t.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function In(t,e){return(i,n)=>{try{return e.call(t,n,i)}catch(t){$i(i.state,t)}}}function Fn(t){let e=Object.create(null);function i(t){return e[t]||(e[t]={observers:[],handlers:[]})}for(let e of t){let t=e.spec;if(t&&t.domEventHandlers)for(let n in t.domEventHandlers){let s=t.domEventHandlers[n];s&&i(n).handlers.push(In(e.value,s))}if(t&&t.domEventObservers)for(let n in t.domEventObservers){let s=t.domEventObservers[n];s&&i(n).observers.push(In(e.value,s))}}for(let t in Xn)i(t).handlers.push(Xn[t]);for(let t in Un)i(t).observers.push(Un[t]);return e}const Vn=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],Wn="dthko",Hn=[16,17,18,20,91,92,224,225];function zn(t){return.7*Math.max(0,t)+8}class qn{constructor(t,e,i,n){this.view=t,this.startEvent=e,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=e,this.scrollParents=function(t){let e,i,n=t.ownerDocument;for(let s=t.parentNode;s&&!(s==n.body||e&&i);)if(1==s.nodeType)!i&&s.scrollHeight>s.clientHeight&&(i=s),!e&&s.scrollWidth>s.clientWidth&&(e=s),s=s.assignedSlot||s.parentNode;else{if(11!=s.nodeType)break;s=s.host}return{x:e,y:i}}(t.contentDOM),this.atoms=t.state.facet(sn).map((e=>e(t)));let s=t.contentDOM.ownerDocument;s.addEventListener("mousemove",this.move=this.move.bind(this)),s.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=e.shiftKey,this.multiple=t.state.facet(St.allowMultipleSelections)&&function(t,e){let i=t.state.facet(Ni);return i.length?i[0](e):qe.mac?e.metaKey:e.ctrlKey}(t,e),this.dragging=!(!function(t,e){let{main:i}=t.state.selection;if(i.empty)return!1;let n=ie(t.root);if(!n||0==n.rangeCount)return!0;let s=n.getRangeAt(0).getClientRects();for(let t=0;t=e.clientX&&i.top<=e.clientY&&i.bottom>=e.clientY)return!0}return!1}(t,e)||1!=es(e))&&null}start(t){!1===this.dragging&&this.select(t)}move(t){if(0==t.buttons)return this.destroy();if(this.dragging||null==this.dragging&&(e=this.startEvent,i=t,Math.max(Math.abs(e.clientX-i.clientX),Math.abs(e.clientY-i.clientY))<10))return;var e,i;this.select(this.lastEvent=t);let n=0,s=0,r=0,o=0,l=this.view.win.innerWidth,a=this.view.win.innerHeight;this.scrollParents.x&&({left:r,right:l}=this.scrollParents.x.getBoundingClientRect()),this.scrollParents.y&&({top:o,bottom:a}=this.scrollParents.y.getBoundingClientRect());let h=an(this.view);t.clientX-h.left<=r+6?n=-zn(r-t.clientX):t.clientX+h.right>=l-6&&(n=zn(t.clientX-l)),t.clientY-h.top<=o+6?s=-zn(o-t.clientY):t.clientY+h.bottom>=a-6&&(s=zn(t.clientY-a)),this.setScrollSpeed(n,s)}up(t){null==this.dragging&&this.select(this.lastEvent),this.dragging||t.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let t=this.view.contentDOM.ownerDocument;t.removeEventListener("mousemove",this.move),t.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=this.view.inputState.draggedContent=null}setScrollSpeed(t,e){this.scrollSpeed={x:t,y:e},t||e?this.scrolling<0&&(this.scrolling=setInterval((()=>this.scroll()),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){let{x:t,y:e}=this.scrollSpeed;t&&this.scrollParents.x&&(this.scrollParents.x.scrollLeft+=t,t=0),e&&this.scrollParents.y&&(this.scrollParents.y.scrollTop+=e,e=0),(t||e)&&this.view.win.scrollBy(t,e),!1===this.dragging&&this.select(this.lastEvent)}skipAtoms(t){let e=null;for(let i=0;it.isUserEvent("input.type")))?this.destroy():this.style.update(t)&&setTimeout((()=>this.select(this.lastEvent)),20)}}const Xn=Object.create(null),Un=Object.create(null),Qn=qe.ie&&qe.ie_version<15||qe.ios&&qe.webkit_version<604;function Yn(t,e){let i,{state:n}=t,s=1,r=n.toText(e),o=r.lines==n.selection.ranges.length;if(null!=ns&&n.selection.ranges.every((t=>t.empty))&&ns==r.toString()){let t=-1;i=n.changeByRange((i=>{let l=n.doc.lineAt(i.from);if(l.from==t)return{range:i};t=l.from;let a=n.toText((o?r.line(s++).text:e)+n.lineBreak);return{changes:{from:l.from,insert:a},range:B.cursor(i.from+a.length)}}))}else i=o?n.changeByRange((t=>{let e=r.line(s++);return{changes:{from:t.from,to:t.to,insert:e.text},range:B.cursor(t.from+e.length)}})):n.replaceSelection(r);t.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}function $n(t,e,i,n){if(1==n)return B.cursor(e,i);if(2==n)return function(t,e,i=1){let n=t.charCategorizer(e),s=t.doc.lineAt(e),r=e-s.from;if(0==s.length)return B.cursor(e);0==r?i=1:r==s.length&&(i=-1);let o=r,l=r;i<0?o=p(s.text,r,!1):l=p(s.text,r);let a=n(s.text.slice(o,l));for(;o>0;){let t=p(s.text,o,!1);if(n(s.text.slice(t,o))!=a)break;o=t}for(;l{t.inputState.lastScrollTop=t.scrollDOM.scrollTop,t.inputState.lastScrollLeft=t.scrollDOM.scrollLeft},Xn.keydown=(t,e)=>(t.inputState.setSelectionOrigin("select"),27==e.keyCode&&0!=t.inputState.tabFocusMode&&(t.inputState.tabFocusMode=Date.now()+2e3),!1),Un.touchstart=(t,e)=>{t.inputState.lastTouchTime=Date.now(),t.inputState.setSelectionOrigin("select.pointer")},Un.touchmove=t=>{t.inputState.setSelectionOrigin("select.pointer")},Xn.mousedown=(t,e)=>{if(t.observer.flush(),t.inputState.lastTouchTime>Date.now()-2e3)return!1;let i=null;for(let n of t.state.facet(Ii))if(i=n(t,e),i)break;if(i||0!=e.button||(i=function(t,e){let i=Kn(t,e),n=es(e),s=t.state.selection;return{update(t){t.docChanged&&(i.pos=t.changes.mapPos(i.pos),s=s.map(t.changes))},get(e,r,o){let l,a=Kn(t,e),h=$n(t,a.pos,a.bias,n);if(i.pos!=a.pos&&!r){let e=$n(t,i.pos,i.bias,n),s=Math.min(e.from,h.from),r=Math.max(e.to,h.to);h=s1&&(l=function(t,e){for(let i=0;i=e)return B.create(t.ranges.slice(0,i).concat(t.ranges.slice(i+1)),t.mainIndex==i?0:t.mainIndex-(t.mainIndex>i?1:0))}return null}(s,a.pos))?l:o?s.addRange(h):B.create([h])}}}(t,e)),i){let n=!t.hasFocus;t.inputState.startMouseSelection(new qn(t,e,i,n)),n&&t.observer.ignore((()=>{ve(t.contentDOM);let e=t.root.activeElement;e&&!e.contains(t.contentDOM)&&e.blur()}));let s=t.inputState.mouseSelection;if(s)return s.start(e),!1===s.dragging}return!1};let _n=(t,e,i)=>e>=i.top&&e<=i.bottom&&t>=i.left&&t<=i.right;function jn(t,e,i,n){let s=hi.find(t.docView,e);if(!s)return 1;let r=e-s.posAtStart;if(0==r)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&_n(i,n,o))return-1;let l=s.coordsAt(r,1);return l&&_n(i,n,l)?1:o&&o.bottom>=n?-1:1}function Kn(t,e){let i=t.posAtCoords({x:e.clientX,y:e.clientY},!1);return{pos:i,bias:jn(t,i,e.clientX,e.clientY)}}const Gn=qe.ie&&qe.ie_version<=11;let Zn=null,Jn=0,ts=0;function es(t){if(!Gn)return t.detail;let e=Zn,i=ts;return Zn=t,ts=Date.now(),Jn=!e||i>Date.now()-400&&Math.abs(e.clientX-t.clientX)<2&&Math.abs(e.clientY-t.clientY)<2?(Jn+1)%3:1}function is(t,e,i,n){if(!i)return;let s=t.posAtCoords({x:e.clientX,y:e.clientY},!1),{draggedContent:r}=t.inputState,o=n&&r&&function(t,e){let i=t.state.facet(Li);return i.length?i[0](e):qe.mac?!e.altKey:!e.ctrlKey}(t,e)?{from:r.from,to:r.to}:null,l={from:s,insert:i},a=t.state.changes(o?[o,l]:l);t.focus(),t.dispatch({changes:a,selection:{anchor:a.mapPos(s,-1),head:a.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"}),t.inputState.draggedContent=null}Xn.dragstart=(t,e)=>{let{selection:{main:i}}=t.state;if(e.target.draggable){let n=t.docView.nearest(e.target);if(n&&n.isWidget){let t=n.posAtStart,e=t+n.length;(t>=i.to||e<=i.from)&&(i=B.range(t,e))}}let{inputState:n}=t;return n.mouseSelection&&(n.mouseSelection.dragging=!0),n.draggedContent=i,e.dataTransfer&&(e.dataTransfer.setData("Text",t.state.sliceDoc(i.from,i.to)),e.dataTransfer.effectAllowed="copyMove"),!1},Xn.dragend=t=>(t.inputState.draggedContent=null,!1),Xn.drop=(t,e)=>{if(!e.dataTransfer)return!1;if(t.state.readOnly)return!0;let i=e.dataTransfer.files;if(i&&i.length){let n=Array(i.length),s=0,r=()=>{++s==i.length&&is(t,e,n.filter((t=>null!=t)).join(t.state.lineBreak),!1)};for(let t=0;t{/[\x00-\x08\x0e-\x1f]{2}/.test(e.result)||(n[t]=e.result),r()},e.readAsText(i[t])}return!0}{let i=e.dataTransfer.getData("Text");if(i)return is(t,e,i,!0),!0}return!1},Xn.paste=(t,e)=>{if(t.state.readOnly)return!0;t.observer.flush();let i=Qn?null:e.clipboardData;return i?(Yn(t,i.getData("text/plain")||i.getData("text/uri-list")),!0):(function(t){let e=t.dom.parentNode;if(!e)return;let i=e.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.focus(),setTimeout((()=>{t.focus(),i.remove(),Yn(t,i.value)}),50)}(t),!1)};let ns=null;Xn.copy=Xn.cut=(t,e)=>{let{text:i,ranges:n,linewise:s}=function(t){let e=[],i=[],n=!1;for(let n of t.selection.ranges)n.empty||(e.push(t.sliceDoc(n.from,n.to)),i.push(n));if(!e.length){let s=-1;for(let{from:n}of t.selection.ranges){let r=t.doc.lineAt(n);r.number>s&&(e.push(r.text),i.push({from:r.from,to:Math.min(t.doc.length,r.to+1)})),s=r.number}n=!0}return{text:e.join(t.lineBreak),ranges:i,linewise:n}}(t.state);if(!i&&!s)return!1;ns=s?i:null,"cut"!=e.type||t.state.readOnly||t.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let r=Qn?null:e.clipboardData;return r?(r.clearData(),r.setData("text/plain",i),!0):(function(t,e){let i=t.dom.parentNode;if(!i)return;let n=i.appendChild(document.createElement("textarea"));n.style.cssText="position: fixed; left: -10000px; top: 10px",n.value=e,n.focus(),n.selectionEnd=e.length,n.selectionStart=0,setTimeout((()=>{n.remove(),t.focus()}),50)}(t,i),!1)};const ss=ht.define();function rs(t,e){let i=[];for(let n of t.facet(Hi)){let s=n(t,e);s&&i.push(s)}return i?t.update({effects:i,annotations:ss.of(!0)}):null}function os(t){setTimeout((()=>{let e=t.hasFocus;if(e!=t.inputState.notifiedFocused){let i=rs(t.state,e);i?t.dispatch(i):t.update([])}}),10)}Un.focus=t=>{t.inputState.lastFocusTime=Date.now(),t.scrollDOM.scrollTop||!t.inputState.lastScrollTop&&!t.inputState.lastScrollLeft||(t.scrollDOM.scrollTop=t.inputState.lastScrollTop,t.scrollDOM.scrollLeft=t.inputState.lastScrollLeft),os(t)},Un.blur=t=>{t.observer.clearSelectionRange(),os(t)},Un.compositionstart=Un.compositionupdate=t=>{t.observer.editContext||(null==t.inputState.compositionFirstChange&&(t.inputState.compositionFirstChange=!0),t.inputState.composing<0&&(t.inputState.composing=0))},Un.compositionend=t=>{t.observer.editContext||(t.inputState.composing=-1,t.inputState.compositionEndedAt=Date.now(),t.inputState.compositionPendingKey=!0,t.inputState.compositionPendingChange=t.observer.pendingRecords().length>0,t.inputState.compositionFirstChange=null,qe.chrome&&qe.android?t.observer.flushSoon():t.inputState.compositionPendingChange?Promise.resolve().then((()=>t.observer.flush())):setTimeout((()=>{t.inputState.composing<0&&t.docView.hasComposition&&t.update([])}),50))},Un.contextmenu=t=>{t.inputState.lastContextMenu=Date.now()},Xn.beforeinput=(t,e)=>{var i,n;if("insertReplacementText"==e.inputType&&t.observer.editContext){let n=null===(i=e.dataTransfer)||void 0===i?void 0:i.getData("text/plain"),s=e.getTargetRanges();if(n&&s.length){let e=s[0],i=t.posAtDOM(e.startContainer,e.startOffset),r=t.posAtDOM(e.endContainer,e.endOffset);return Nn(t,{from:i,to:r,insert:t.state.toText(n)},null),!0}}let s;if(qe.chrome&&qe.android&&(s=Vn.find((t=>t.inputType==e.inputType)))&&(t.observer.delayAndroidKey(s.key,s.keyCode),"Backspace"==s.key||"Delete"==s.key)){let e=(null===(n=window.visualViewport)||void 0===n?void 0:n.height)||0;setTimeout((()=>{var i;((null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0)>e+10&&t.hasFocus&&(t.contentDOM.blur(),t.focus())}),100)}return qe.ios&&"deleteContentForward"==e.inputType&&t.observer.flushSoon(),qe.safari&&"insertText"==e.inputType&&t.inputState.composing>=0&&setTimeout((()=>Un.compositionend(t,e)),20),!1};const ls=new Set;const as=["pre-wrap","normal","pre-line","break-spaces"];let hs=!1;function cs(){hs=!1}class us{constructor(e){this.lineWrapping=e,this.doc=t.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30}heightForGap(t,e){let i=this.doc.lineAt(e).number-this.doc.lineAt(t).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((e-t-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(t){if(!this.lineWrapping)return this.lineHeight;return(1+Math.max(0,Math.ceil((t-this.lineLength)/(this.lineLength-5))))*this.lineHeight}setDoc(t){return this.doc=t,this}mustRefreshForWrapping(t){return as.indexOf(t)>-1!=this.lineWrapping}mustRefreshForHeights(t){let e=!1;for(let i=0;i-1,l=Math.round(e)!=Math.round(this.lineHeight)||this.lineWrapping!=o;if(this.lineWrapping=o,this.lineHeight=e,this.charWidth=i,this.textHeight=n,this.lineLength=s,l){this.heightSamples={};for(let t=0;t0}set outdated(t){this.flags=(t?2:0)|-3&this.flags}setHeight(t){this.height!=t&&(Math.abs(this.height-t)>gs&&(hs=!0),this.height=t)}replace(t,e,i){return ms.of(i)}decomposeLeft(t,e){e.push(this)}decomposeRight(t,e){e.push(this)}applyChanges(t,e,i,n){let s=this,r=i.doc;for(let o=n.length-1;o>=0;o--){let{fromA:l,toA:a,fromB:h,toB:c}=n[o],u=s.lineAt(l,ps.ByPosNoHeight,i.setDoc(e),0,0),d=u.to>=a?u:s.lineAt(a,ps.ByPosNoHeight,i,0,0);for(c+=d.to-a,a=d.to;o>0&&u.from<=n[o-1].toA;)l=n[o-1].fromA,h=n[o-1].fromB,o--,l2*s){let s=t[e-1];s.break?t.splice(--e,1,s.left,null,s.right):t.splice(--e,1,s.left,s.right),i+=1+s.break,n-=s.size}else{if(!(s>2*n))break;{let e=t[i];e.break?t.splice(i,1,e.left,null,e.right):t.splice(i,1,e.left,e.right),i+=2+e.break,s-=e.size}}else if(n=s&&r(this.blockAt(0,i,n,s))}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more&&this.setHeight(n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}}class bs extends ws{constructor(t,e){super(t,e,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(t,e,i,n){return new fs(n,this.length,i,this.height,this.breaks)}replace(t,e,i){let n=i[0];return 1==i.length&&(n instanceof bs||n instanceof ys&&4&n.flags)&&Math.abs(this.length-n.length)<10?(n instanceof ys?n=new bs(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):ms.of(i)}updateHeight(t,e=0,i=!1,n){return n&&n.from<=e&&n.more?this.setHeight(n.heights[n.index++]):(i||this.outdated)&&this.setHeight(Math.max(this.widgetHeight,t.heightForLine(this.length-this.collapsed))+this.breaks*t.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class ys extends ms{constructor(t){super(t,0)}heightMetrics(t,e){let i,n=t.doc.lineAt(e).number,s=t.doc.lineAt(e+this.length).number,r=s-n+1,o=0;if(t.lineWrapping){let e=Math.min(this.height,t.lineHeight*r);i=e/r,this.length>r+1&&(o=(this.height-e)/(this.length-r-1))}else i=this.height/r;return{firstLine:n,lastLine:s,perLine:i,perChar:o}}blockAt(t,e,i,n){let{firstLine:s,lastLine:r,perLine:o,perChar:l}=this.heightMetrics(e,n);if(e.lineWrapping){let s=n+(t0){let t=i[i.length-1];t instanceof ys?i[i.length-1]=new ys(t.length+n):i.push(null,new ys(n-1))}if(t>0){let e=i[0];e instanceof ys?i[0]=new ys(t+e.length):i.unshift(new ys(t-1),null)}return ms.of(i)}decomposeLeft(t,e){e.push(new ys(t-1),null)}decomposeRight(t,e){e.push(null,new ys(this.length-t-1))}updateHeight(t,e=0,i=!1,n){let s=e+this.length;if(n&&n.from<=e+this.length&&n.more){let i=[],r=Math.max(e,n.from),o=-1;for(n.from>e&&i.push(new ys(n.from-e-1).updateHeight(t,e));r<=s&&n.more;){let e=t.doc.lineAt(r).length;i.length&&i.push(null);let s=n.heights[n.index++];-1==o?o=s:Math.abs(s-o)>=gs&&(o=-2);let l=new bs(e,s);l.outdated=!1,i.push(l),r+=e+1}r<=s&&i.push(null,new ys(s-r).updateHeight(t,r));let l=ms.of(i);return(o<0||Math.abs(l.height-this.height)>=gs||Math.abs(o-this.heightMetrics(t,e).perLine)>=gs)&&(hs=!0),vs(this,l)}return(i||this.outdated)&&(this.setHeight(t.heightForGap(e,e+this.length)),this.outdated=!1),this}toString(){return`gap(${this.length})`}}class xs extends ms{constructor(t,e,i){super(t.length+e+i.length,t.height+i.height,e|(t.outdated||i.outdated?2:0)),this.left=t,this.right=i,this.size=t.size+i.size}get break(){return 1&this.flags}blockAt(t,e,i,n){let s=i+this.left.height;return to))return a;let h=e==ps.ByPosNoHeight?ps.ByPosNoHeight:ps.ByPos;return l?a.join(this.right.lineAt(o,h,i,r,o)):this.left.lineAt(o,h,i,n,s).join(a)}forEachLine(t,e,i,n,s,r){let o=n+this.left.height,l=s+this.left.length+this.break;if(this.break)t=l&&this.right.forEachLine(t,e,i,o,l,r);else{let a=this.lineAt(l,ps.ByPos,i,n,s);t=t&&a.from<=e&&r(a),e>a.to&&this.right.forEachLine(a.to+1,e,i,o,l,r)}}replace(t,e,i){let n=this.left.length+this.break;if(ethis.left.length)return this.balanced(this.left,this.right.replace(t-n,e-n,i));let s=[];t>0&&this.decomposeLeft(t,s);let r=s.length;for(let t of i)s.push(t);if(t>0&&ks(s,r-1),e=i&&e.push(null)),t>i&&this.right.decomposeLeft(t-i,e)}decomposeRight(t,e){let i=this.left.length,n=i+this.break;if(t>=n)return this.right.decomposeRight(t-n,e);t2*e.size||e.size>2*t.size?ms.of(this.break?[t,null,e]:[t,e]):(this.left=vs(this.left,t),this.right=vs(this.right,e),this.setHeight(t.height+e.height),this.outdated=t.outdated||e.outdated,this.size=t.size+e.size,this.length=t.length+this.break+e.length,this)}updateHeight(t,e=0,i=!1,n){let{left:s,right:r}=this,o=e+s.length+this.break,l=null;return n&&n.from<=e+s.length&&n.more?l=s=s.updateHeight(t,e,i,n):s.updateHeight(t,e,i),n&&n.from<=o+r.length&&n.more?l=r=r.updateHeight(t,o,i,n):r.updateHeight(t,o,i),l?this.balanced(s,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function ks(t,e){let i,n;null==t[e]&&(i=t[e-1])instanceof ys&&(n=t[e+1])instanceof ys&&t.splice(e-1,3,new ys(i.length+1+n.length))}class Ps{constructor(t,e){this.pos=t,this.oracle=e,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=t}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(t,e){if(this.lineStart>-1){let t=Math.min(e,this.lineEnd),i=this.nodes[this.nodes.length-1];i instanceof bs?i.length+=t-this.pos:(t>this.pos||!this.isCovered)&&this.nodes.push(new bs(t-this.pos,-1)),this.writtenTo=t,e>t&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=e}point(t,e,i){if(t=5)&&this.addLineDeco(n,s,r)}else e>t&&this.span(t,e);this.lineEnd>-1&&this.lineEnd-1)return;let{from:t,to:e}=this.oracle.doc.lineAt(this.pos);this.lineStart=t,this.lineEnd=e,this.writtenTot&&this.nodes.push(new bs(this.pos-t,-1)),this.writtenTo=this.pos}blankContent(t,e){let i=new ys(e-t);return this.oracle.doc.lineAt(t).to==e&&(i.flags|=4),i}ensureLine(){this.enterLine();let t=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(t instanceof bs)return t;let e=new bs(0,-1);return this.nodes.push(e),e}addBlock(t){this.enterLine();let e=t.deco;e&&e.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(t),this.writtenTo=this.pos=this.pos+t.length,e&&e.endSide>0&&(this.covering=t)}addLineDeco(t,e,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,t),n.breaks+=e,this.writtenTo=this.pos=this.pos+i}finish(t){let e=0==this.nodes.length?null:this.nodes[this.nodes.length-1];!(this.lineStart>-1)||e instanceof bs||this.isCovered?(this.writtenToi.clientHeight||i.scrollWidth>i.clientWidth)&&"visible"!=n.overflow){let n=i.getBoundingClientRect();r=Math.max(r,n.left),o=Math.min(o,n.right),l=Math.max(l,n.top),a=Math.min(e==t.parentNode?s.innerHeight:a,n.bottom)}e="absolute"==n.position||"fixed"==n.position?i.offsetParent:i.parentNode}else{if(11!=e.nodeType)break;e=e.host}return{left:r-i.left,right:Math.max(r,o)-i.left,top:l-(i.top+e),bottom:Math.max(l,a)-(i.top+e)}}function Cs(t,e){let i=t.getBoundingClientRect();return{left:0,right:i.right-i.left,top:e,bottom:i.bottom-(i.top+e)}}class As{constructor(t,e,i){this.from=t,this.to=e,this.size=i}static same(t,e){if(t.length!=e.length)return!1;for(let i=0;i"function"!=typeof t&&"cm-lineWrapping"==t.class));this.heightOracle=new us(i),this.stateDeco=e.facet(en).filter((t=>"function"!=typeof t)),this.heightMap=ms.empty().applyChanges(this.stateDeco,t.empty,this.heightOracle.setDoc(e.doc),[new cn(0,0,0,e.doc.length)]);for(let t=0;t<2&&(this.viewport=this.getViewport(0,null),this.updateForViewport());t++);this.updateViewportLines(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=ni.set(this.lineGaps.map((t=>t.draw(this,!1)))),this.computeVisibleRanges()}updateForViewport(){let t=[this.viewport],{main:e}=this.state.selection;for(let i=0;i<=1;i++){let n=i?e.head:e.anchor;if(!t.some((({from:t,to:e})=>n>=t&&n<=e))){let{from:e,to:i}=this.lineBlockAt(n);t.push(new Ds(e,i))}}return this.viewports=t.sort(((t,e)=>t.from-e.from)),this.updateScaler()}updateScaler(){let t=this.scaler;return this.scaler=this.heightMap.height<=7e6?Bs:new Ns(this.heightOracle,this.heightMap,this.viewports),t.eq(this.scaler)?0:2}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,(t=>{this.viewportLines.push(Ls(t,this.scaler))}))}update(t,e=null){this.state=t.state;let i=this.stateDeco;this.stateDeco=this.state.facet(en).filter((t=>"function"!=typeof t));let n=t.changedRanges,s=cn.extendWithRanges(n,function(t,e,i){let n=new Ss;return Dt.compare(t,e,i,n,0),n.changes}(i,this.stateDeco,t?t.changes:O.empty(this.state.doc.length))),r=this.heightMap.height,o=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);cs(),this.heightMap=this.heightMap.applyChanges(this.stateDeco,t.startState.doc,this.heightOracle.setDoc(this.state.doc),s),(this.heightMap.height!=r||hs)&&(t.flags|=2),o?(this.scrollAnchorPos=t.changes.mapPos(o.from,-1),this.scrollAnchorHeight=o.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let l=s.length?this.mapViewport(this.viewport,t.changes):this.viewport;(e&&(e.range.headl.to)||!this.viewportIsAppropriate(l))&&(l=this.getViewport(0,e));let a=l.from!=this.viewport.from||l.to!=this.viewport.to;this.viewport=l,t.flags|=this.updateForViewport(),(a||!t.changes.empty||2&t.flags)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,t.changes))),t.flags|=this.computeVisibleRanges(),e&&(this.scrollTarget=e),!this.mustEnforceCursorAssoc&&t.selectionSet&&t.view.lineWrapping&&t.state.selection.main.empty&&t.state.selection.main.assoc&&!t.state.facet(qi)&&(this.mustEnforceCursorAssoc=!0)}measure(e){let i=e.contentDOM,n=window.getComputedStyle(i),s=this.heightOracle,r=n.whiteSpace;this.defaultTextDirection="rtl"==n.direction?gi.RTL:gi.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),l=i.getBoundingClientRect(),a=o||this.mustMeasureContent||this.contentDOMHeight!=l.height;this.contentDOMHeight=l.height,this.mustMeasureContent=!1;let h=0,c=0;if(l.width&&l.height){let{scaleX:t,scaleY:e}=fe(i,l);(t>.005&&Math.abs(this.scaleX-t)>.005||e>.005&&Math.abs(this.scaleY-e)>.005)&&(this.scaleX=t,this.scaleY=e,h|=8,o=a=!0)}let u=(parseInt(n.paddingTop)||0)*this.scaleY,d=(parseInt(n.paddingBottom)||0)*this.scaleY;this.paddingTop==u&&this.paddingBottom==d||(this.paddingTop=u,this.paddingBottom=d,h|=10),this.editorWidth!=e.scrollDOM.clientWidth&&(s.lineWrapping&&(a=!0),this.editorWidth=e.scrollDOM.clientWidth,h|=8);let f=e.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=f&&(this.scrollAnchorHeight=-1,this.scrollTop=f),this.scrolledToBottom=xe(e.scrollDOM);let p=(this.printing?Cs:Os)(i,this.paddingTop),g=p.top-this.pixelViewport.top,m=p.bottom-this.pixelViewport.bottom;this.pixelViewport=p;let v=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(v!=this.inView&&(this.inView=v,v&&(a=!0)),!this.inView&&!this.scrollTarget)return 0;let w=l.width;if(this.contentDOMWidth==w&&this.editorHeight==e.scrollDOM.clientHeight||(this.contentDOMWidth=l.width,this.editorHeight=e.scrollDOM.clientHeight,h|=8),a){let i=e.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(i)&&(o=!0),o||s.lineWrapping&&Math.abs(w-this.contentDOMWidth)>s.charWidth){let{lineHeight:t,charWidth:n,textHeight:l}=e.docView.measureTextSize();o=t>0&&s.refresh(r,t,n,l,w/n,i),o&&(e.docView.minWidth=0,h|=8)}g>0&&m>0?c=Math.max(g,m):g<0&&m<0&&(c=Math.min(g,m)),cs();for(let n of this.viewports){let r=n.from==this.viewport.from?i:e.docView.measureVisibleLineHeights(n);this.heightMap=(o?ms.empty().applyChanges(this.stateDeco,t.empty,this.heightOracle,[new cn(0,0,0,e.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new ds(n.from,r))}hs&&(h|=2)}let b=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return b&&(2&h&&(h|=this.updateScaler()),this.viewport=this.getViewport(c,this.scrollTarget),h|=this.updateForViewport()),(2&h||b)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,e)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,e.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(t,e){let i=.5-Math.max(-.5,Math.min(.5,t/1e3/2)),n=this.heightMap,s=this.heightOracle,{visibleTop:r,visibleBottom:o}=this,l=new Ds(n.lineAt(r-1e3*i,ps.ByHeight,s,0,0).from,n.lineAt(o+1e3*(1-i),ps.ByHeight,s,0,0).to);if(e){let{head:t}=e.range;if(tl.to){let i,r=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),o=n.lineAt(t,ps.ByPos,s,0,0);i="center"==e.y?(o.top+o.bottom)/2-r/2:"start"==e.y||"nearest"==e.y&&t=o+Math.max(10,Math.min(i,250)))&&n>r-2e3&&s>1,r=n<<1;if(this.defaultTextDirection!=gi.LTR&&!i)return[];let o=[],l=(n,r,a,h)=>{if(r-nn&&tt.from>=a.from&&t.to<=a.to&&Math.abs(t.from-n)t.frome))));if(!d){if(rt.from<=r&&t.to>=r))){let t=e.moveToLineBoundary(B.cursor(r),!1,!0).head;t>n&&(r=t)}d=new As(n,r,this.gapSize(a,n,r,h))}o.push(d)},a=t=>{if(t.lengths&&(n.push({from:s,to:t}),r+=t-s),s=e}},20),st.from&&l(t.from,s,t,e),ot.draw(this,this.heightOracle.lineWrapping)))))}computeVisibleRanges(){let t=this.stateDeco;this.lineGaps.length&&(t=t.concat(this.lineGapDeco));let e=[];Dt.spans(t,this.viewport.from,this.viewport.to,{span(t,i){e.push({from:t,to:i})},point(){}},20);let i=e.length!=this.visibleRanges.length||this.visibleRanges.some(((t,i)=>t.from!=e[i].from||t.to!=e[i].to));return this.visibleRanges=e,i?4:0}lineBlockAt(t){return t>=this.viewport.from&&t<=this.viewport.to&&this.viewportLines.find((e=>e.from<=t&&e.to>=t))||Ls(this.heightMap.lineAt(t,ps.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(t){return t>=this.viewportLines[0].top&&t<=this.viewportLines[this.viewportLines.length-1].bottom&&this.viewportLines.find((e=>e.top<=t&&e.bottom>=t))||Ls(this.heightMap.lineAt(this.scaler.fromDOM(t),ps.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(t){let e=this.lineBlockAtHeight(t+8);return e.from>=this.viewport.from||this.viewportLines[0].top-t>200?e:this.viewportLines[0]}elementAtHeight(t){return Ls(this.heightMap.blockAt(this.scaler.fromDOM(t),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class Ds{constructor(t,e){this.from=t,this.to=e}}function Es({total:t,ranges:e},i){if(i<=0)return e[0].from;if(i>=1)return e[e.length-1].to;let n=Math.floor(t*i);for(let t=0;;t++){let{from:i,to:s}=e[t],r=s-i;if(n<=r)return i+n;n-=r}}function Rs(t,e){let i=0;for(let{from:n,to:s}of t.ranges){if(e<=s){i+=e-n;break}i+=s-n}return i/t.total}const Bs={toDOM:t=>t,fromDOM:t=>t,scale:1,eq(t){return t==this}};class Ns{constructor(t,e,i){let n=0,s=0,r=0;this.viewports=i.map((({from:i,to:s})=>{let r=e.lineAt(i,ps.ByPos,t,0,0).top,o=e.lineAt(s,ps.ByPos,t,0,0).bottom;return n+=o-r,{from:i,to:s,top:r,bottom:o,domTop:0,domBottom:0}})),this.scale=(7e6-n)/(e.height-n);for(let t of this.viewports)t.domTop=r+(t.top-s)*this.scale,r=t.domBottom=t.domTop+(t.bottom-t.top),s=t.bottom}toDOM(t){for(let e=0,i=0,n=0;;e++){let s=ee.from==t.viewports[i].from&&e.to==t.viewports[i].to)))}}function Ls(t,e){if(1==e.scale)return t;let i=e.toDOM(t.top),n=e.toDOM(t.bottom);return new fs(t.from,t.length,i,n-i,Array.isArray(t._content)?t._content.map((t=>Ls(t,e))):t._content)}const Is=I.define({combine:t=>t.join(" ")}),Fs=I.define({combine:t=>t.indexOf(!0)>-1}),Vs=$t.newName(),Ws=$t.newName(),Hs=$t.newName(),zs={"&light":"."+Ws,"&dark":"."+Hs};function qs(t,e,i){return new $t(e,{finish:e=>/&/.test(e)?e.replace(/&\w*/,(e=>{if("&"==e)return t;if(!i||!i[e])throw new RangeError(`Unsupported selector: ${e}`);return i[e]})):t+" "+e})}const Xs=qs("."+Vs,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0,overflowAnchor:"none"},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},".cm-iso":{unicodeBidi:"isolate"},".cm-announced":{position:"fixed",top:"-10000px"},"@media print":{".cm-announced":{display:"none"}},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0,zIndex:300},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:'url(\'data:image/svg+xml,\')',backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},zs),Us={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Qs=qe.ie&&qe.ie_version<=11;class Ys{constructor(t){this.view=t,this.active=!1,this.editContext=null,this.selectionRange=new pe,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.printQuery=null,this.parentCheck=-1,this.dom=t.contentDOM,this.observer=new MutationObserver((e=>{for(let t of e)this.queue.push(t);(qe.ie&&qe.ie_version<=11||qe.ios&&t.composing)&&e.some((t=>"childList"==t.type&&t.removedNodes.length||"characterData"==t.type&&t.oldValue.length>t.target.nodeValue.length))?this.flushSoon():this.flush()})),!window.EditContext||!1===t.constructor.EDIT_CONTEXT||qe.chrome&&qe.chrome_version<126||(this.editContext=new js(t),t.state.facet(_i)&&(t.contentDOM.editContext=this.editContext.editContext)),Qs&&(this.onCharData=t=>{this.queue.push({target:t.target,type:"characterData",oldValue:t.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),window.matchMedia&&(this.printQuery=window.matchMedia("print")),"function"==typeof ResizeObserver&&(this.resizeScroll=new ResizeObserver((()=>{var t;(null===(t=this.view.docView)||void 0===t?void 0:t.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),t.length>0&&t[t.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))}),{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver((t=>{t.length>0&&t[t.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))}),{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(t){this.view.inputState.runHandlers("scroll",t),this.intersecting&&this.view.measure()}onScroll(t){this.intersecting&&this.flush(!1),this.editContext&&this.view.requestMeasure(this.editContext.measureReq),this.onScrollChanged(t)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout((()=>{this.resizeTimeout=-1,this.view.requestMeasure()}),50))}onPrint(t){("change"!=t.type&&t.type||t.matches)&&(this.view.viewState.printing=!0,this.view.measure(),setTimeout((()=>{this.view.viewState.printing=!1,this.view.requestMeasure()}),500))}updateGaps(t){if(this.gapIntersection&&(t.length!=this.gaps.length||this.gaps.some(((e,i)=>e!=t[i])))){this.gapIntersection.disconnect();for(let e of t)this.gapIntersection.observe(e);this.gaps=t}}onSelectionChange(t){let e=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(_i)?i.root.activeElement!=this.dom:!se(i.dom,n))return;let s=n.anchorNode&&i.docView.nearest(n.anchorNode);s&&s.ignoreEvent(t)?e||(this.selectionChanged=!1):(qe.ie&&qe.ie_version<=11||qe.android&&qe.chrome)&&!i.state.selection.main.empty&&n.focusNode&&oe(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:t}=this,e=ie(t.root);if(!e)return!1;let i=qe.safari&&11==t.root.nodeType&&function(t){let e=t.activeElement;for(;e&&e.shadowRoot;)e=e.shadowRoot.activeElement;return e}(this.dom.ownerDocument)==this.dom&&function(t,e){if(e.getComposedRanges){let i=e.getComposedRanges(t.root)[0];if(i)return _s(t,i)}let i=null;function n(t){t.preventDefault(),t.stopImmediatePropagation(),i=t.getTargetRanges()[0]}return t.contentDOM.addEventListener("beforeinput",n,!0),t.dom.ownerDocument.execCommand("indent"),t.contentDOM.removeEventListener("beforeinput",n,!0),i?_s(t,i):null}(this.view,e)||e;if(!i||this.selectionRange.eq(i))return!1;let n=se(this.dom,i);return n&&!this.selectionChanged&&t.inputState.lastFocusTime>Date.now()-200&&t.inputState.lastTouchTime{let t=this.delayedAndroidKey;if(t){this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=t.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&t.force&&be(this.dom,t.key,t.keyCode)}};this.flushingAndroidKey=this.view.win.requestAnimationFrame(t)}this.delayedAndroidKey&&"Enter"!=t||(this.delayedAndroidKey={key:t,keyCode:e,force:this.lastChange{this.delayedFlush=-1,this.flush()})))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let t of this.observer.takeRecords())this.queue.push(t);return this.queue}processRecords(){let t=this.pendingRecords();t.length&&(this.queue=[]);let e=-1,i=-1,n=!1;for(let s of t){let t=this.readMutation(s);t&&(t.typeOver&&(n=!0),-1==e?({from:e,to:i}=t):(e=Math.min(t.from,e),i=Math.max(t.to,i)))}return{from:e,to:i,typeOver:n}}readChange(){let{from:t,to:e,typeOver:i}=this.processRecords(),n=this.selectionChanged&&se(this.dom,this.selectionRange);if(t<0&&!n)return null;t>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let s=new Rn(this.view,t,e,i);return this.view.docView.domChanged={newSel:s.newSel?s.newSel.main:null},s}flush(t=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;t&&this.readSelectionRange();let e=this.readChange();if(!e)return this.view.requestMeasure(),!1;let i=this.view.state,n=Bn(this.view,e);return this.view.state==i&&(e.domChanged||e.newSel&&!e.newSel.main.eq(this.view.state.selection.main))&&this.view.update([]),n}readMutation(t){let e=this.view.docView.nearest(t.target);if(!e||e.ignoreMutation(t))return null;if(e.markDirty("attributes"==t.type),"attributes"==t.type&&(e.flags|=4),"childList"==t.type){let i=$s(e,t.previousSibling||t.target.previousSibling,-1),n=$s(e,t.nextSibling||t.target.nextSibling,1);return{from:i?e.posAfter(i):e.posAtStart,to:n?e.posBefore(n):e.posAtEnd,typeOver:!1}}return"characterData"==t.type?{from:e.posAtStart,to:e.posAtEnd,typeOver:t.target.nodeValue==t.oldValue}:null}setWindow(t){t!=this.win&&(this.removeWindowListeners(this.win),this.win=t,this.addWindowListeners(this.win))}addWindowListeners(t){t.addEventListener("resize",this.onResize),this.printQuery?this.printQuery.addEventListener?this.printQuery.addEventListener("change",this.onPrint):this.printQuery.addListener(this.onPrint):t.addEventListener("beforeprint",this.onPrint),t.addEventListener("scroll",this.onScroll),t.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(t){t.removeEventListener("scroll",this.onScroll),t.removeEventListener("resize",this.onResize),this.printQuery?this.printQuery.removeEventListener?this.printQuery.removeEventListener("change",this.onPrint):this.printQuery.removeListener(this.onPrint):t.removeEventListener("beforeprint",this.onPrint),t.document.removeEventListener("selectionchange",this.onSelectionChange)}update(t){this.editContext&&(this.editContext.update(t),t.startState.facet(_i)!=t.state.facet(_i)&&(t.view.contentDOM.editContext=t.state.facet(_i)?this.editContext.editContext:null))}destroy(){var t,e,i;this.stop(),null===(t=this.intersection)||void 0===t||t.disconnect(),null===(e=this.gapIntersection)||void 0===e||e.disconnect(),null===(i=this.resizeScroll)||void 0===i||i.disconnect();for(let t of this.scrollTargets)t.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey),this.editContext&&(this.view.contentDOM.editContext=null,this.editContext.destroy())}}function $s(t,e,i){for(;e;){let n=Ce.get(e);if(n&&n.parent==t)return n;let s=e.parentNode;e=s!=t.dom?s:i>0?e.nextSibling:e.previousSibling}return null}function _s(t,e){let i=e.startContainer,n=e.startOffset,s=e.endContainer,r=e.endOffset,o=t.docView.domAtPos(t.state.selection.main.anchor);return oe(o.node,o.offset,s,r)&&([i,n,s,r]=[s,r,i,n]),{anchorNode:i,anchorOffset:n,focusNode:s,focusOffset:r}}class js{constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this.handlers=Object.create(null),this.resetRange(e.state);let i=this.editContext=new window.EditContext({text:e.state.doc.sliceString(this.from,this.to),selectionStart:this.toContextPos(Math.max(this.from,Math.min(this.to,e.state.selection.main.anchor))),selectionEnd:this.toContextPos(e.state.selection.main.head)});this.handlers.textupdate=i=>{let{anchor:n}=e.state.selection.main,s={from:this.toEditorPos(i.updateRangeStart),to:this.toEditorPos(i.updateRangeEnd),insert:t.of(i.text.split("\n"))};s.from==this.from&&nthis.to&&(s.to=n),(s.from!=s.to||s.insert.length)&&(this.pendingContextChange=s,e.state.readOnly||Nn(e,s,B.single(this.toEditorPos(i.selectionStart),this.toEditorPos(i.selectionEnd))),this.pendingContextChange&&(this.revertPending(e.state),this.setSelection(e.state)))},this.handlers.characterboundsupdate=t=>{let n=[],s=null;for(let i=this.toEditorPos(t.rangeStart),r=this.toEditorPos(t.rangeEnd);i{let i=[];for(let e of t.getTextFormats()){let t=e.underlineStyle,n=e.underlineThickness;if("None"!=t&&"None"!=n){let s=`text-decoration: underline ${"Dashed"==t?"dashed ":"Squiggle"==t?"wavy ":""}${"Thin"==n?1:2}px`;i.push(ni.mark({attributes:{style:s}}).range(this.toEditorPos(e.rangeStart),this.toEditorPos(e.rangeEnd)))}}e.dispatch({effects:Yi.of(ni.set(i))})},this.handlers.compositionstart=()=>{e.inputState.composing<0&&(e.inputState.composing=0,e.inputState.compositionFirstChange=!0)},this.handlers.compositionend=()=>{e.inputState.composing=-1,e.inputState.compositionFirstChange=null};for(let t in this.handlers)i.addEventListener(t,this.handlers[t]);this.measureReq={read:t=>{this.editContext.updateControlBounds(t.contentDOM.getBoundingClientRect());let e=ie(t.root);e&&e.rangeCount&&this.editContext.updateSelectionBounds(e.getRangeAt(0).getBoundingClientRect())}}}applyEdits(t){let e=0,i=!1,n=this.pendingContextChange;return t.changes.iterChanges(((s,r,o,l,a)=>{if(i)return;let h=a.length-(r-s);if(n&&r>=n.to){if(n.from==s&&n.to==r&&n.insert.eq(a))return n=this.pendingContextChange=null,e+=h,void(this.to+=h);n=null,this.revertPending(t.state)}if(s+=e,(r+=e)<=this.from)this.from+=h,this.to+=h;else if(sthis.to||this.to-this.from+a.length>3e4)return void(i=!0);this.editContext.updateText(this.toContextPos(s),this.toContextPos(r),a.toString()),this.to+=h}e+=h})),n&&!i&&this.revertPending(t.state),!i}update(t){let e=this.pendingContextChange;this.applyEdits(t)&&this.rangeIsValid(t.state)?(t.docChanged||t.selectionSet||e)&&this.setSelection(t.state):(this.pendingContextChange=null,this.resetRange(t.state),this.editContext.updateText(0,this.editContext.text.length,t.state.doc.sliceString(this.from,this.to)),this.setSelection(t.state)),(t.geometryChanged||t.docChanged||t.selectionSet)&&t.view.requestMeasure(this.measureReq)}resetRange(t){let{head:e}=t.selection.main;this.from=Math.max(0,e-1e4),this.to=Math.min(t.doc.length,e+1e4)}revertPending(t){let e=this.pendingContextChange;this.pendingContextChange=null,this.editContext.updateText(this.toContextPos(e.from),this.toContextPos(e.from+e.insert.length),t.doc.sliceString(e.from,e.to))}setSelection(t){let{main:e}=t.selection,i=this.toContextPos(Math.max(this.from,Math.min(this.to,e.anchor))),n=this.toContextPos(e.head);this.editContext.selectionStart==i&&this.editContext.selectionEnd==n||this.editContext.updateSelection(i,n)}rangeIsValid(t){let{head:e}=t.selection.main;return!(this.from>0&&e-this.from<500||this.to3e4)}toEditorPos(t){return t+this.from}toContextPos(t){return t-this.from}destroy(){for(let t in this.handlers)this.editContext.removeEventListener(t,this.handlers[t])}}class Ks{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(t={}){var e;this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.className="cm-announced",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM),t.parent&&t.parent.appendChild(this.dom);let{dispatch:i}=t;this.dispatchTransactions=t.dispatchTransactions||i&&(t=>t.forEach((t=>i(t,this))))||(t=>this.update(t)),this.dispatch=this.dispatch.bind(this),this._root=t.root||function(t){for(;t;){if(t&&(9==t.nodeType||11==t.nodeType&&t.host))return t;t=t.assignedSlot||t.parentNode}return null}(t.parent)||document,this.viewState=new Ts(t.state||St.create(t)),t.scrollTo&&t.scrollTo.is(Qi)&&(this.viewState.scrollTarget=t.scrollTo.value.clip(this.viewState.state)),this.plugins=this.state.facet(Ki).map((t=>new Zi(t)));for(let t of this.plugins)t.update(this);this.observer=new Ys(this),this.inputState=new Ln(this),this.inputState.ensureHandlers(this.plugins),this.docView=new dn(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),(null===(e=document.fonts)||void 0===e?void 0:e.ready)&&document.fonts.ready.then((()=>this.requestMeasure()))}dispatch(...t){let e=1==t.length&&t[0]instanceof ft?t:1==t.length&&Array.isArray(t[0])?t[0]:[this.state.update(...t)];this.dispatchTransactions(e,this)}update(t){if(0!=this.updateState)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let e,i=!1,n=!1,s=this.state;for(let e of t){if(e.startState!=s)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");s=e.state}if(this.destroyed)return void(this.viewState.state=s);let r=this.hasFocus,o=0,l=null;t.some((t=>t.annotation(ss)))?(this.inputState.notifiedFocused=r,o=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,l=rs(s,r),l||(o=1));let a=this.observer.delayedAndroidKey,h=null;if(a?(this.observer.clearDelayedAndroidKey(),h=this.observer.readChange(),(h&&!this.state.doc.eq(s.doc)||!this.state.selection.eq(s.selection))&&(h=null)):this.observer.clear(),s.facet(St.phrases)!=this.state.facet(St.phrases))return this.setState(s);e=un.create(this,s,t),e.flags|=o;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let e of t){if(c&&(c=c.map(e.changes)),e.scrollIntoView){let{main:t}=e.state.selection;c=new Ui(t.empty?t:B.cursor(t.head,t.head>t.anchor?-1:1))}for(let t of e.effects)t.is(Qi)&&(c=t.value.clip(this.state))}this.viewState.update(e,c),this.bidiCache=Js.update(this.bidiCache,e.changes),e.empty||(this.updatePlugins(e),this.inputState.update(e)),i=this.docView.update(e),this.state.facet(hn)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(t),this.docView.updateSelection(i,t.some((t=>t.isUserEvent("select.pointer"))))}finally{this.updateState=0}if(e.startState.facet(Is)!=e.state.facet(Is)&&(this.viewState.mustMeasureContent=!0),(i||n||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),i&&this.docViewUpdate(),!e.empty)for(let t of this.state.facet(Vi))try{t(e)}catch(t){$i(this.state,t,"update listener")}(l||h)&&Promise.resolve().then((()=>{l&&this.state==l.startState&&this.dispatch(l),h&&!Bn(this,h)&&a.force&&be(this.contentDOM,a.key,a.keyCode)}))}setState(t){if(0!=this.updateState)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed)return void(this.viewState.state=t);this.updateState=2;let e=this.hasFocus;try{for(let t of this.plugins)t.destroy(this);this.viewState=new Ts(t),this.plugins=t.facet(Ki).map((t=>new Zi(t))),this.pluginMap.clear();for(let t of this.plugins)t.update(this);this.docView.destroy(),this.docView=new dn(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}e&&this.focus(),this.requestMeasure()}updatePlugins(t){let e=t.startState.facet(Ki),i=t.state.facet(Ki);if(e!=i){let n=[];for(let s of i){let i=e.indexOf(s);if(i<0)n.push(new Zi(s));else{let e=this.plugins[i];e.mustUpdate=t,n.push(e)}}for(let e of this.plugins)e.mustUpdate!=t&&e.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let e of this.plugins)e.mustUpdate=t;for(let t=0;t-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey)return this.measureScheduled=-1,void this.requestMeasure();this.measureScheduled=0,t&&this.observer.forceFlush();let e=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:s,scrollAnchorHeight:r}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let t=0;;t++){if(r<0)if(xe(i))s=-1,r=this.viewState.heightMap.height;else{let t=this.viewState.scrollAnchorAt(n);s=t.from,r=t.top}this.updateState=1;let o=this.viewState.measure(this);if(!o&&!this.measureRequests.length&&null==this.viewState.scrollTarget)break;if(t>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let l=[];4&o||([this.measureRequests,l]=[l,this.measureRequests]);let a=l.map((t=>{try{return t.read(this)}catch(t){return $i(this.state,t),Zs}})),h=un.create(this,this.state,[]),c=!1;h.flags|=o,e?e.flags|=o:e=h,this.updateState=2,h.empty||(this.updatePlugins(h),this.inputState.update(h),this.updateAttrs(),c=this.docView.update(h),c&&this.docViewUpdate());for(let t=0;t1||t<-1){n+=t,i.scrollTop=n/this.scaleY,r=-1;continue}}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(e&&!e.empty)for(let t of this.state.facet(Vi))t(e)}get themeClasses(){return Vs+" "+(this.state.facet(Fs)?Hs:Ws)+" "+this.state.facet(Is)}updateAttrs(){let t=tr(this,Ji,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),e={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(_i)?"true":"false",class:"cm-content",style:`${qe.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(e["aria-readonly"]="true"),tr(this,tn,e);let i=this.observer.ignore((()=>{let i=Je(this.contentDOM,this.contentAttrs,e),n=Je(this.dom,this.editorAttrs,t);return i||n}));return this.editorAttrs=t,this.contentAttrs=e,i}showAnnouncements(t){let e=!0;for(let i of t)for(let t of i.effects)if(t.is(Ks.announce)){e&&(this.announceDOM.textContent=""),e=!1,this.announceDOM.appendChild(document.createElement("div")).textContent=t.value}}mountStyles(){this.styleModules=this.state.facet(hn);let t=this.state.facet(Ks.cspNonce);$t.mount(this.root,this.styleModules.concat(Xs).reverse(),t?{nonce:t}:void 0)}readMeasured(){if(2==this.updateState)throw new Error("Reading the editor layout isn't allowed during an update");0==this.updateState&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(t){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame((()=>this.measure()))),t){if(this.measureRequests.indexOf(t)>-1)return;if(null!=t.key)for(let e=0;ee.spec==t))||null),e&&e.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(t){return this.readMeasured(),this.viewState.elementAtHeight(t)}lineBlockAtHeight(t){return this.readMeasured(),this.viewState.lineBlockAtHeight(t)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(t){return this.viewState.lineBlockAt(t)}get contentHeight(){return this.viewState.contentHeight}moveByChar(t,e,i){return An(this,t,On(this,t,e,i))}moveByGroup(t,e){return An(this,t,On(this,t,e,(e=>function(t,e,i){let n=t.state.charCategorizer(e),s=n(i);return t=>{let e=n(t);return s==yt.Space&&(s=e),s==e}}(this,t.head,e))))}visualLineSide(t,e){let i=this.bidiSpans(t),n=this.textDirectionAt(t.from),s=i[e?i.length-1:0];return B.cursor(s.side(e,n)+t.from,s.forward(!e,n)?1:-1)}moveToLineBoundary(t,e,i=!0){return function(t,e,i,n){let s=Sn(t,e.head),r=n&&s.type==ii.Text&&(t.lineWrapping||s.widgetLineBreaks)?t.coordsAtPos(e.assoc<0&&e.head>s.from?e.head-1:e.head):null;if(r){let e=t.dom.getBoundingClientRect(),n=t.textDirectionAt(s.from),o=t.posAtCoords({x:i==(n==gi.LTR)?e.right-1:e.left+1,y:(r.top+r.bottom)/2});if(null!=o)return B.cursor(o,i?-1:1)}return B.cursor(i?s.to:s.from,i?-1:1)}(this,t,e,i)}moveVertically(t,e,i){return An(this,t,function(t,e,i,n){let s=e.head,r=i?1:-1;if(s==(i?t.state.doc.length:0))return B.cursor(s,e.assoc);let o,l=e.goalColumn,a=t.contentDOM.getBoundingClientRect(),h=t.coordsAtPos(s,e.assoc||-1),c=t.documentTop;if(h)null==l&&(l=h.left-a.left),o=r<0?h.top:h.bottom;else{let e=t.viewState.lineBlockAt(s);null==l&&(l=Math.min(a.right-a.left,t.defaultCharacterWidth*(s-e.from))),o=(r<0?e.top:e.bottom)+c}let u=a.left+l,d=null!=n?n:t.viewState.heightOracle.textHeight>>1;for(let e=0;;e+=10){let i=o+(d+e)*r,n=kn(t,{x:u,y:i},!1,r);if(ia.bottom||(r<0?ns)){let e=t.docView.coordsForChar(n),s=!e||i0)}coordsForChar(t){return this.readMeasured(),this.docView.coordsForChar(t)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(t){return!this.state.facet(zi)||tthis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(t))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(t){if(t.length>Gs)return Di(t.length);let e,i=this.textDirectionAt(t.from);for(let n of this.bidiCache)if(n.from==t.from&&n.dir==i&&(n.fresh||Ci(n.isolates,e=on(this,t))))return n.order;e||(e=on(this,t));let n=function(t,e,i){if(!t)return[new Oi(0,0,e==vi?1:0)];if(e==mi&&!i.length&&!Si.test(t))return Di(t.length);if(i.length)for(;t.length>Ai.length;)Ai[Ai.length]=256;let n=[],s=e==mi?0:1;return Ti(t,s,s,i,0,t.length,n),n}(t.text,i,e);return this.bidiCache.push(new Js(t.from,t.to,i,e,!0,n)),n}get hasFocus(){var t;return(this.dom.ownerDocument.hasFocus()||qe.safari&&(null===(t=this.inputState)||void 0===t?void 0:t.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore((()=>{ve(this.contentDOM),this.docView.updateSelection()}))}setRoot(t){this._root!=t&&(this._root=t,this.observer.setWindow((9==t.nodeType?t:t.ownerDocument).defaultView||window),this.mountStyles())}destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur();for(let t of this.plugins)t.destroy(this);this.plugins=[],this.inputState.destroy(),this.docView.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(t,e={}){return Qi.of(new Ui("number"==typeof t?B.cursor(t):t,e.y,e.x,e.yMargin,e.xMargin))}scrollSnapshot(){let{scrollTop:t,scrollLeft:e}=this.scrollDOM,i=this.viewState.scrollAnchorAt(t);return Qi.of(new Ui(B.cursor(i.from),"start","start",i.top-t,e,!0))}setTabFocusMode(t){null==t?this.inputState.tabFocusMode=this.inputState.tabFocusMode<0?0:-1:"boolean"==typeof t?this.inputState.tabFocusMode=t?0:-1:0!=this.inputState.tabFocusMode&&(this.inputState.tabFocusMode=Date.now()+t)}static domEventHandlers(t){return Gi.define((()=>({})),{eventHandlers:t})}static domEventObservers(t){return Gi.define((()=>({})),{eventObservers:t})}static theme(t,e){let i=$t.newName(),n=[Is.of(i),hn.of(qs(`.${i}`,t))];return e&&e.dark&&n.push(Fs.of(!0)),n}static baseTheme(t){return j.lowest(hn.of(qs("."+Vs,t,zs)))}static findFromDOM(t){var e;let i=t.querySelector(".cm-content"),n=i&&Ce.get(i)||Ce.get(t);return(null===(e=null==n?void 0:n.rootView)||void 0===e?void 0:e.view)||null}}Ks.styleModule=hn,Ks.inputHandler=Wi,Ks.scrollHandler=Xi,Ks.focusChangeEffect=Hi,Ks.perLineTextDirection=zi,Ks.exceptionSink=Fi,Ks.updateListener=Vi,Ks.editable=_i,Ks.mouseSelectionStyle=Ii,Ks.dragMovesSelection=Li,Ks.clickAddsSelectionRange=Ni,Ks.decorations=en,Ks.outerDecorations=nn,Ks.atomicRanges=sn,Ks.bidiIsolatedRanges=rn,Ks.scrollMargins=ln,Ks.darkTheme=Fs,Ks.cspNonce=I.define({combine:t=>t.length?t[0]:""}),Ks.contentAttributes=tn,Ks.editorAttributes=Ji,Ks.lineWrapping=Ks.contentAttributes.of({class:"cm-lineWrapping"}),Ks.announce=dt.define();const Gs=4096,Zs={};class Js{constructor(t,e,i,n,s,r){this.from=t,this.to=e,this.dir=i,this.isolates=n,this.fresh=s,this.order=r}static update(t,e){if(e.empty&&!t.some((t=>t.fresh)))return t;let i=[],n=t.length?t[t.length-1].dir:gi.LTR;for(let s=Math.max(0,t.length-10);s=0;s--){let e=n[s],r="function"==typeof e?e(t):e;r&&Ke(r,i)}return i}const er=qe.mac?"mac":qe.windows?"win":qe.linux?"linux":"key";function ir(t,e,i){return e.altKey&&(t="Alt-"+t),e.ctrlKey&&(t="Ctrl-"+t),e.metaKey&&(t="Meta-"+t),!1!==i&&e.shiftKey&&(t="Shift-"+t),t}const nr=j.default(Ks.domEventHandlers({keydown:(t,e)=>cr(or(e.state),t,e,"editor")})),sr=I.define({enables:nr}),rr=new WeakMap;function or(t){let e=t.facet(sr),i=rr.get(e);return i||rr.set(e,i=function(t,e=er){let i=Object.create(null),n=Object.create(null),s=(t,e)=>{let i=n[t];if(null==i)n[t]=e;else if(i!=e)throw new Error("Key binding "+t+" is used both as a regular binding and as a multi-stroke prefix")},r=(t,n,r,o,l)=>{var a,h;let c=i[t]||(i[t]=Object.create(null)),u=n.split(/ (?!$)/).map((t=>function(t,e){const i=t.split(/-(?!$)/);let n,s,r,o,l=i[i.length-1];"Space"==l&&(l=" ");for(let t=0;t{let n=lr={view:e,prefix:i,scope:t};return setTimeout((()=>{lr==n&&(lr=null)}),ar),!0}]})}let d=u.join(" ");s(d,!1);let f=c[d]||(c[d]={preventDefault:!1,stopPropagation:!1,run:(null===(h=null===(a=c._any)||void 0===a?void 0:a.run)||void 0===h?void 0:h.slice())||[]});r&&f.run.push(r),o&&(f.preventDefault=!0),l&&(f.stopPropagation=!0)};for(let n of t){let t=n.scope?n.scope.split(" "):["editor"];if(n.any)for(let e of t){let t=i[e]||(i[e]=Object.create(null));t._any||(t._any={preventDefault:!1,stopPropagation:!1,run:[]});let{any:s}=n;for(let e in t)t[e].run.push((t=>s(t,hr)))}let s=n[e]||n.key;if(s)for(let e of t)r(e,s,n.run,n.preventDefault,n.stopPropagation),n.shift&&r(e,"Shift-"+s,n.shift,n.preventDefault,n.stopPropagation)}return i}(e.reduce(((t,e)=>t.concat(e)),[]))),i}let lr=null;const ar=4e3;let hr=null;function cr(t,e,i,n){hr=e;let s=function(t){var e=!(Zt&&t.metaKey&&t.shiftKey&&!t.ctrlKey&&!t.altKey||Jt&&t.shiftKey&&t.key&&1==t.key.length||"Unidentified"==t.key)&&t.key||(t.shiftKey?Gt:Kt)[t.keyCode]||t.key||"Unidentified";return"Esc"==e&&(e="Escape"),"Del"==e&&(e="Delete"),"Left"==e&&(e="ArrowLeft"),"Up"==e&&(e="ArrowUp"),"Right"==e&&(e="ArrowRight"),"Down"==e&&(e="ArrowDown"),e}(e),r=x(b(s,0))==s.length&&" "!=s,o="",l=!1,a=!1,h=!1;lr&&lr.view==i&&lr.scope==n&&(o=lr.prefix+" ",Hn.indexOf(e.keyCode)<0&&(a=!0,lr=null));let c,u,d=new Set,f=t=>{if(t){for(let e of t.run)if(!d.has(e)&&(d.add(e),e(i)))return t.stopPropagation&&(h=!0),!0;t.preventDefault&&(t.stopPropagation&&(h=!0),a=!0)}return!1},p=t[n];return p&&(f(p[o+ir(s,e,!r)])?l=!0:r&&(e.altKey||e.metaKey||e.ctrlKey)&&!(qe.windows&&e.ctrlKey&&e.altKey)&&(c=Kt[e.keyCode])&&c!=s?(f(p[o+ir(c,e,!0)])||e.shiftKey&&(u=Gt[e.keyCode])!=s&&u!=c&&f(p[o+ir(u,e,!1)]))&&(l=!0):r&&e.shiftKey&&f(p[o+ir(s,e,!0)])&&(l=!0),!l&&f(p._any)&&(l=!0)),a&&(l=!0),l&&h&&e.stopPropagation(),hr=null,l}class ur{constructor(t,e,i,n,s){this.className=t,this.left=e,this.top=i,this.width=n,this.height=s}draw(){let t=document.createElement("div");return t.className=this.className,this.adjust(t),t}update(t,e){return e.className==this.className&&(this.adjust(t),!0)}adjust(t){t.style.left=this.left+"px",t.style.top=this.top+"px",null!=this.width&&(t.style.width=this.width+"px"),t.style.height=this.height+"px"}eq(t){return this.left==t.left&&this.top==t.top&&this.width==t.width&&this.height==t.height&&this.className==t.className}static forRange(t,e,i){if(i.empty){let n=t.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let s=dr(t);return[new ur(e,n.left-s.left,n.top-s.top,null,n.bottom-n.top)]}return function(t,e,i){if(i.to<=t.viewport.from||i.from>=t.viewport.to)return[];let n=Math.max(i.from,t.viewport.from),s=Math.min(i.to,t.viewport.to),r=t.textDirection==gi.LTR,o=t.contentDOM,l=o.getBoundingClientRect(),a=dr(t),h=o.querySelector(".cm-line"),c=h&&window.getComputedStyle(h),u=l.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),d=l.right-(c?parseInt(c.paddingRight):0),f=Sn(t,n),p=Sn(t,s),g=f.type==ii.Text?f:null,m=p.type==ii.Text?p:null;g&&(t.lineWrapping||f.widgetLineBreaks)&&(g=fr(t,n,1,g));m&&(t.lineWrapping||p.widgetLineBreaks)&&(m=fr(t,s,-1,m));if(g&&m&&g.from==m.from&&g.to==m.to)return w(b(i.from,i.to,g));{let e=g?b(i.from,null,g):y(f,!1),n=m?b(null,i.to,m):y(p,!0),s=[];return(g||f).to<(m||p).from-(g&&m?1:0)||f.widgetLineBreaks>1&&e.bottom+t.defaultLineHeight/2h&&n.from=r)break;l>s&&a(Math.max(t,s),null==e&&t<=h,Math.min(l,r),null==i&&l>=c,o.dir)}if(s=n.to+1,s>=r)break}return 0==l.length&&a(h,null==e,c,null==i,t.textDirection),{top:s,bottom:o,horizontal:l}}function y(t,e){let i=l.top+(e?t.top:t.bottom);return{top:i,bottom:i,horizontal:[]}}}(t,e,i)}}function dr(t){let e=t.scrollDOM.getBoundingClientRect();return{left:(t.textDirection==gi.LTR?e.left:e.right-t.scrollDOM.clientWidth*t.scaleX)-t.scrollDOM.scrollLeft*t.scaleX,top:e.top-t.scrollDOM.scrollTop*t.scaleY}}function fr(t,e,i,n){let s=t.coordsAtPos(e,2*i);if(!s)return n;let r=t.dom.getBoundingClientRect(),o=(s.top+s.bottom)/2,l=t.posAtCoords({x:r.left+1,y:o}),a=t.posAtCoords({x:r.right-1,y:o});return null==l||null==a?n:{from:Math.max(n.from,Math.min(l,a)),to:Math.min(n.to,Math.max(l,a))}}class pr{constructor(t,e){this.view=t,this.layer=e,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=t.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),e.above&&this.dom.classList.add("cm-layer-above"),e.class&&this.dom.classList.add(e.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(t.state),t.requestMeasure(this.measureReq),e.mount&&e.mount(this.dom,t)}update(t){t.startState.facet(gr)!=t.state.facet(gr)&&this.setOrder(t.state),(this.layer.update(t,this.dom)||t.geometryChanged)&&(this.scale(),t.view.requestMeasure(this.measureReq))}docViewUpdate(t){!1!==this.layer.updateOnDocViewUpdate&&t.requestMeasure(this.measureReq)}setOrder(t){let e=0,i=t.facet(gr);for(;e{return i=t,n=this.drawn[e],!(i.constructor==n.constructor&&i.eq(n));var i,n}))){let e=this.dom.firstChild,i=0;for(let n of t)n.update&&e&&n.constructor&&this.drawn[i].constructor&&n.update(e,this.drawn[i])?(e=e.nextSibling,i++):this.dom.insertBefore(n.draw(),e);for(;e;){let t=e.nextSibling;e.remove(),e=t}this.drawn=t}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const gr=I.define();function mr(t){return[Gi.define((e=>new pr(e,t))),gr.of(t)]}const vr=!qe.ios,wr=I.define({combine:t=>Ot(t,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(t,e)=>Math.min(t,e),drawRangeCursor:(t,e)=>t||e})});function br(t={}){return[wr.of(t),xr,Pr,Or,qi.of(!0)]}function yr(t){return t.startState.facet(wr)!=t.state.facet(wr)}const xr=mr({above:!0,markers(t){let{state:e}=t,i=e.facet(wr),n=[];for(let s of e.selection.ranges){let r=s==e.selection.main;if(s.empty?!r||vr:i.drawRangeCursor){let e=r?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",i=s.empty?s:B.cursor(s.head,s.head>s.anchor?-1:1);for(let s of ur.forRange(t,e,i))n.push(s)}}return n},update(t,e){t.transactions.some((t=>t.selection))&&(e.style.animationName="cm-blink"==e.style.animationName?"cm-blink2":"cm-blink");let i=yr(t);return i&&kr(t.state,e),t.docChanged||t.selectionSet||i},mount(t,e){kr(e.state,t)},class:"cm-cursorLayer"});function kr(t,e){e.style.animationDuration=t.facet(wr).cursorBlinkRate+"ms"}const Pr=mr({above:!1,markers:t=>t.state.selection.ranges.map((e=>e.empty?[]:ur.forRange(t,"cm-selectionBackground",e))).reduce(((t,e)=>t.concat(e))),update:(t,e)=>t.docChanged||t.selectionSet||t.viewportChanged||yr(t),class:"cm-selectionLayer"}),Sr={".cm-line":{"& ::selection, &::selection":{backgroundColor:"transparent !important"}},".cm-content":{"& :focus":{caretColor:"initial !important","&::selection, & ::selection":{backgroundColor:"Highlight !important"}}}};vr&&(Sr[".cm-line"].caretColor=Sr[".cm-content"].caretColor="transparent !important");const Or=j.highest(Ks.theme(Sr)),Cr=dt.define({map:(t,e)=>null==t?null:e.mapPos(t)}),Ar=X.define({create:()=>null,update:(t,e)=>(null!=t&&(t=e.changes.mapPos(t)),e.effects.reduce(((t,e)=>e.is(Cr)?e.value:t),t))}),Mr=Gi.fromClass(class{constructor(t){this.view=t,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(t){var e;let i=t.state.field(Ar);null==i?null!=this.cursor&&(null===(e=this.cursor)||void 0===e||e.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(t.startState.field(Ar)!=i||t.docChanged||t.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:t}=this,e=t.state.field(Ar),i=null!=e&&t.coordsAtPos(e);if(!i)return null;let n=t.scrollDOM.getBoundingClientRect();return{left:i.left-n.left+t.scrollDOM.scrollLeft*t.scaleX,top:i.top-n.top+t.scrollDOM.scrollTop*t.scaleY,height:i.bottom-i.top}}drawCursor(t){if(this.cursor){let{scaleX:e,scaleY:i}=this.view;t?(this.cursor.style.left=t.left/e+"px",this.cursor.style.top=t.top/i+"px",this.cursor.style.height=t.height/i+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(t){this.view.state.field(Ar)!=t&&this.view.dispatch({effects:Cr.of(t)})}},{eventObservers:{dragover(t){this.setDropPos(this.view.posAtCoords({x:t.clientX,y:t.clientY}))},dragleave(t){t.target!=this.view.contentDOM&&this.view.contentDOM.contains(t.relatedTarget)||this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function Tr(t,e,i,n,s){e.lastIndex=0;for(let r,o=t.iterRange(i,n),l=i;!o.next().done;l+=o.value.length)if(!o.lineBreak)for(;r=e.exec(o.value);)s(l+r.index,r)}class Dr{constructor(t){const{regexp:e,decoration:i,decorate:n,boundary:s,maxLength:r=1e3}=t;if(!e.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=e,n)this.addMatch=(t,e,i,s)=>n(s,i,i+t[0].length,t,e);else if("function"==typeof i)this.addMatch=(t,e,n,s)=>{let r=i(t,e,n);r&&s(n,n+t[0].length,r)};else{if(!i)throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.addMatch=(t,e,n,s)=>s(n,n+t[0].length,i)}this.boundary=s,this.maxLength=r}createDeco(t){let e=new Et,i=e.add.bind(e);for(let{from:e,to:n}of function(t,e){let i=t.visibleRanges;if(1==i.length&&i[0].from==t.viewport.from&&i[0].to==t.viewport.to)return i;let n=[];for(let{from:s,to:r}of i)s=Math.max(t.state.doc.lineAt(s).from,s-e),r=Math.min(t.state.doc.lineAt(r).to,r+e),n.length&&n[n.length-1].to>=s?n[n.length-1].to=r:n.push({from:s,to:r});return n}(t,this.maxLength))Tr(t.state.doc,this.regexp,e,n,((e,n)=>this.addMatch(n,t,e,i)));return e.finish()}updateDeco(t,e){let i=1e9,n=-1;return t.docChanged&&t.changes.iterChanges(((e,s,r,o)=>{o>t.view.viewport.from&&r1e3?this.createDeco(t.view):n>-1?this.updateRange(t.view,e.map(t.changes),i,n):e}updateRange(t,e,i,n){for(let s of t.visibleRanges){let r=Math.max(s.from,i),o=Math.min(s.to,n);if(o>r){let i=t.state.doc.lineAt(r),n=i.toi.from;r--)if(this.boundary.test(i.text[r-1-i.from])){l=r;break}for(;oc.push(i.range(t,e));if(i==n)for(this.regexp.lastIndex=l-i.from;(h=this.regexp.exec(i.text))&&h.indexthis.addMatch(i,t,e,u)));e=e.update({filterFrom:l,filterTo:a,filter:(t,e)=>ta,add:c})}}return e}}const Er=null!=/x/.unicode?"gu":"g",Rr=new RegExp("[\0-\b\n--Ÿ­؜​‎‏\u2028\u2029‭‮⁦⁧⁩\ufeff-]",Er),Br={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"};let Nr=null;const Lr=I.define({combine(t){let e=Ot(t,{render:null,specialChars:Rr,addSpecialChars:null});return(e.replaceTabs=!function(){var t;if(null==Nr&&"undefined"!=typeof document&&document.body){let e=document.body.style;Nr=null!=(null!==(t=e.tabSize)&&void 0!==t?t:e.MozTabSize)}return Nr||!1}())&&(e.specialChars=new RegExp("\t|"+e.specialChars.source,Er)),e.addSpecialChars&&(e.specialChars=new RegExp(e.specialChars.source+"|"+e.addSpecialChars.source,Er)),e}});function Ir(t={}){return[Lr.of(t),Fr||(Fr=Gi.fromClass(class{constructor(t){this.view=t,this.decorations=ni.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(t.state.facet(Lr)),this.decorations=this.decorator.createDeco(t)}makeDecorator(t){return new Dr({regexp:t.specialChars,decoration:(e,i,n)=>{let{doc:s}=i.state,r=b(e[0],0);if(9==r){let t=s.lineAt(n),e=i.state.tabSize,r=qt(t.text,e,n-t.from);return ni.replace({widget:new Wr((e-r%e)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[r]||(this.decorationCache[r]=ni.replace({widget:new Vr(t,r)}))},boundary:t.replaceTabs?void 0:/[^]/})}update(t){let e=t.state.facet(Lr);t.startState.facet(Lr)!=e?(this.decorator=this.makeDecorator(e),this.decorations=this.decorator.createDeco(t.view)):this.decorations=this.decorator.updateDeco(t,this.decorations)}},{decorations:t=>t.decorations}))]}let Fr=null;class Vr extends ei{constructor(t,e){super(),this.options=t,this.code=e}eq(t){return t.code==this.code}toDOM(t){let e=function(t){return t>=32?"•":10==t?"␤":String.fromCharCode(9216+t)}(this.code),i=t.state.phrase("Control character")+" "+(Br[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,e);if(n)return n;let s=document.createElement("span");return s.textContent=e,s.title=i,s.setAttribute("aria-label",i),s.className="cm-specialChar",s}ignoreEvent(){return!1}}class Wr extends ei{constructor(t){super(),this.width=t}eq(t){return t.width==this.width}toDOM(){let t=document.createElement("span");return t.textContent="\t",t.className="cm-tab",t.style.width=this.width+"px",t}ignoreEvent(){return!1}}const Hr=ni.line({class:"cm-activeLine"}),zr=Gi.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.docChanged||t.selectionSet)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=-1,i=[];for(let n of t.state.selection.ranges){let s=t.lineBlockAt(n.head);s.from>e&&(i.push(Hr.range(s.from)),e=s.from)}return ni.set(i)}},{decorations:t=>t.decorations}),qr=2e3;function Xr(t,e){let i=t.posAtCoords({x:e.clientX,y:e.clientY},!1),n=t.state.doc.lineAt(i),s=i-n.from,r=s>qr?-1:s==n.length?function(t,e){let i=t.coordsAtPos(t.viewport.from);return i?Math.round(Math.abs((i.left-e)/t.defaultCharacterWidth)):-1}(t,e.clientX):qt(n.text,t.state.tabSize,i-n.from);return{line:n.number,col:r,off:s}}function Ur(t,e){let i=Xr(t,e),n=t.state.selection;return i?{update(t){if(t.docChanged){let e=t.changes.mapPos(t.startState.doc.line(i.line).from),s=t.state.doc.lineAt(e);i={line:s.number,col:i.col,off:Math.min(i.off,s.length)},n=n.map(t.changes)}},get(e,s,r){let o=Xr(t,e);if(!o)return n;let l=function(t,e,i){let n=Math.min(e.line,i.line),s=Math.max(e.line,i.line),r=[];if(e.off>qr||i.off>qr||e.col<0||i.col<0){let o=Math.min(e.off,i.off),l=Math.max(e.off,i.off);for(let e=n;e<=s;e++){let i=t.doc.line(e);i.length<=l&&r.push(B.range(i.from+o,i.to+l))}}else{let o=Math.min(e.col,i.col),l=Math.max(e.col,i.col);for(let e=n;e<=s;e++){let i=t.doc.line(e),n=Xt(i.text,o,t.tabSize,!0);if(n<0)r.push(B.cursor(i.to));else{let e=Xt(i.text,l,t.tabSize);r.push(B.range(i.from+n,i.from+e))}}}return r}(t.state,i,o);return l.length?r?B.create(l.concat(n.ranges)):B.create(l):n}}:null}const Qr={Alt:[18,t=>!!t.altKey],Control:[17,t=>!!t.ctrlKey],Shift:[16,t=>!!t.shiftKey],Meta:[91,t=>!!t.metaKey]},Yr={style:"cursor: crosshair"};function $r(t={}){let[e,i]=Qr[t.key||"Alt"],n=Gi.fromClass(class{constructor(t){this.view=t,this.isDown=!1}set(t){this.isDown!=t&&(this.isDown=t,this.view.update([]))}},{eventObservers:{keydown(t){this.set(t.keyCode==e||i(t))},keyup(t){t.keyCode!=e&&i(t)||this.set(!1)},mousemove(t){this.set(i(t))}}});return[n,Ks.contentAttributes.of((t=>{var e;return(null===(e=t.plugin(n))||void 0===e?void 0:e.isDown)?Yr:null}))]}const _r="-10000px";class jr{constructor(t,e,i,n){this.facet=e,this.createTooltipView=i,this.removeTooltipView=n,this.input=t.state.facet(e),this.tooltips=this.input.filter((t=>t));let s=null;this.tooltipViews=this.tooltips.map((t=>s=i(t,s)))}update(t,e){var i;let n=t.state.facet(this.facet),s=n.filter((t=>t));if(n===this.input){for(let e of this.tooltipViews)e.update&&e.update(t);return!1}let r=[],o=e?[]:null;for(let i=0;ie[i]=t)),e.length=o.length),this.input=n,this.tooltips=s,this.tooltipViews=r,!0}}function Kr(t){let{win:e}=t;return{top:0,left:0,bottom:e.innerHeight,right:e.innerWidth}}const Gr=I.define({combine:t=>{var e,i,n;return{position:qe.ios?"absolute":(null===(e=t.find((t=>t.position)))||void 0===e?void 0:e.position)||"fixed",parent:(null===(i=t.find((t=>t.parent)))||void 0===i?void 0:i.parent)||null,tooltipSpace:(null===(n=t.find((t=>t.tooltipSpace)))||void 0===n?void 0:n.tooltipSpace)||Kr}}}),Zr=new WeakMap,Jr=Gi.fromClass(class{constructor(t){this.view=t,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let e=t.state.facet(Gr);this.position=e.position,this.parent=e.parent,this.classes=t.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.resizeObserver="function"==typeof ResizeObserver?new ResizeObserver((()=>this.measureSoon())):null,this.manager=new jr(t,io,((t,e)=>this.createTooltip(t,e)),(t=>{this.resizeObserver&&this.resizeObserver.unobserve(t.dom),t.dom.remove()})),this.above=this.manager.tooltips.map((t=>!!t.above)),this.intersectionObserver="function"==typeof IntersectionObserver?new IntersectionObserver((t=>{Date.now()>this.lastTransaction-50&&t.length>0&&t[t.length-1].intersectionRatio<1&&this.measureSoon()}),{threshold:[1]}):null,this.observeIntersection(),t.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let t of this.manager.tooltipViews)this.intersectionObserver.observe(t.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout((()=>{this.measureTimeout=-1,this.maybeMeasure()}),50))}update(t){t.transactions.length&&(this.lastTransaction=Date.now());let e=this.manager.update(t,this.above);e&&this.observeIntersection();let i=e||t.geometryChanged,n=t.state.facet(Gr);if(n.position!=this.position&&!this.madeAbsolute){this.position=n.position;for(let t of this.manager.tooltipViews)t.dom.style.position=this.position;i=!0}if(n.parent!=this.parent){this.parent&&this.container.remove(),this.parent=n.parent,this.createContainer();for(let t of this.manager.tooltipViews)this.container.appendChild(t.dom);i=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);i&&this.maybeMeasure()}createTooltip(t,e){let i=t.create(this.view),n=e?e.dom:null;if(i.dom.classList.add("cm-tooltip"),t.arrow&&!i.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let t=document.createElement("div");t.className="cm-tooltip-arrow",i.dom.appendChild(t)}return i.dom.style.position=this.position,i.dom.style.top=_r,i.dom.style.left="0px",this.container.insertBefore(i.dom,n),i.mount&&i.mount(this.view),this.resizeObserver&&this.resizeObserver.observe(i.dom),i}destroy(){var t,e,i;this.view.win.removeEventListener("resize",this.measureSoon);for(let e of this.manager.tooltipViews)e.dom.remove(),null===(t=e.destroy)||void 0===t||t.call(e);this.parent&&this.container.remove(),null===(e=this.resizeObserver)||void 0===e||e.disconnect(),null===(i=this.intersectionObserver)||void 0===i||i.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let t=this.view.dom.getBoundingClientRect(),e=1,i=1,n=!1;if("fixed"==this.position&&this.manager.tooltipViews.length){let{dom:t}=this.manager.tooltipViews[0];if(qe.gecko)n=t.offsetParent!=this.container.ownerDocument.body;else if(t.style.top==_r&&"0px"==t.style.left){let e=t.getBoundingClientRect();n=Math.abs(e.top+1e4)>1||Math.abs(e.left)>1}}if(n||"absolute"==this.position)if(this.parent){let t=this.parent.getBoundingClientRect();t.width&&t.height&&(e=t.width/this.parent.offsetWidth,i=t.height/this.parent.offsetHeight)}else({scaleX:e,scaleY:i}=this.view.viewState);return{editor:t,parent:this.parent?this.container.getBoundingClientRect():t,pos:this.manager.tooltips.map(((t,e)=>{let i=this.manager.tooltipViews[e];return i.getCoords?i.getCoords(t.pos):this.view.coordsAtPos(t.pos)})),size:this.manager.tooltipViews.map((({dom:t})=>t.getBoundingClientRect())),space:this.view.state.facet(Gr).tooltipSpace(this.view),scaleX:e,scaleY:i,makeAbsolute:n}}writeMeasure(t){var e;if(t.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let t of this.manager.tooltipViews)t.dom.style.position="absolute"}let{editor:i,space:n,scaleX:s,scaleY:r}=t,o=[];for(let l=0;l=Math.min(i.bottom,n.bottom)||u.rightMath.min(i.right,n.right)+.1){c.style.top=_r;continue}let f=a.arrow?h.dom.querySelector(".cm-tooltip-arrow"):null,p=f?7:0,g=d.right-d.left,m=null!==(e=Zr.get(h))&&void 0!==e?e:d.bottom-d.top,v=h.offset||eo,w=this.view.textDirection==gi.LTR,b=d.width>n.right-n.left?w?n.left:n.right-d.width:w?Math.max(n.left,Math.min(u.left-(f?14:0)+v.x,n.right-g)):Math.min(Math.max(n.left,u.left-g+(f?14:0)-v.x),n.right-g),y=this.above[l];!a.strictSide&&(y?u.top-(d.bottom-d.top)-v.yn.bottom)&&y==n.bottom-u.bottom>u.top-n.top&&(y=this.above[l]=!y);let x=(y?u.top-n.top:n.bottom-u.bottom)-p;if(xb&&t.topk&&(k=y?t.top-m-2-p:t.bottom+p+2);if("absolute"==this.position?(c.style.top=(k-t.parent.top)/r+"px",c.style.left=(b-t.parent.left)/s+"px"):(c.style.top=k/r+"px",c.style.left=b/s+"px"),f){let t=u.left+(w?v.x:-v.x)-(b+14-7);f.style.left=t/s+"px"}!0!==h.overlap&&o.push({left:b,top:k,right:P,bottom:k+m}),c.classList.toggle("cm-tooltip-above",y),c.classList.toggle("cm-tooltip-below",!y),h.positioned&&h.positioned(t.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let t of this.manager.tooltipViews)t.dom.style.top=_r}},{eventObservers:{scroll(){this.maybeMeasure()}}}),to=Ks.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),eo={x:0,y:0},io=I.define({enables:[Jr,to]}),no=I.define({combine:t=>t.reduce(((t,e)=>t.concat(e)),[])});class so{static create(t){return new so(t)}constructor(t){this.view=t,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new jr(t,no,((t,e)=>this.createHostedView(t,e)),(t=>t.dom.remove()))}createHostedView(t,e){let i=t.create(this.view);return i.dom.classList.add("cm-tooltip-section"),this.dom.insertBefore(i.dom,e?e.dom.nextSibling:this.dom.firstChild),this.mounted&&i.mount&&i.mount(this.view),i}mount(t){for(let e of this.manager.tooltipViews)e.mount&&e.mount(t);this.mounted=!0}positioned(t){for(let e of this.manager.tooltipViews)e.positioned&&e.positioned(t)}update(t){this.manager.update(t)}destroy(){var t;for(let e of this.manager.tooltipViews)null===(t=e.destroy)||void 0===t||t.call(e)}passProp(t){let e;for(let i of this.manager.tooltipViews){let n=i[t];if(void 0!==n)if(void 0===e)e=n;else if(e!==n)return}return e}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}}const ro=io.compute([no],(t=>{let e=t.facet(no);return 0===e.length?null:{pos:Math.min(...e.map((t=>t.pos))),end:Math.max(...e.map((t=>{var e;return null!==(e=t.end)&&void 0!==e?e:t.pos}))),create:so.create,above:e[0].above,arrow:e.some((t=>t.arrow))}}));class oo{constructor(t,e,i,n,s){this.view=t,this.source=e,this.field=i,this.setHover=n,this.hoverTime=s,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:t.dom,time:0},this.checkHover=this.checkHover.bind(this),t.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),t.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout((()=>this.startHover()),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let t=Date.now()-this.lastMove.time;ti.bottom||e.xi.right+t.defaultCharacterWidth)return;let r=t.bidiSpans(t.state.doc.lineAt(n)).find((t=>t.from<=n&&t.to>=n)),o=r&&r.dir==gi.RTL?-1:1;s=e.x{this.pending==e&&(this.pending=null,!i||Array.isArray(i)&&!i.length||t.dispatch({effects:this.setHover.of(Array.isArray(i)?i:[i])}))}),(e=>$i(t.state,e,"hover tooltip")))}else!r||Array.isArray(r)&&!r.length||t.dispatch({effects:this.setHover.of(Array.isArray(r)?r:[r])})}get tooltip(){let t=this.view.plugin(Jr),e=t?t.manager.tooltips.findIndex((t=>t.create==so.create)):-1;return e>-1?t.manager.tooltipViews[e]:null}mousemove(t){var e,i;this.lastMove={x:t.clientX,y:t.clientY,target:t.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let{active:n,tooltip:s}=this;if(n.length&&s&&!function(t,e){let i=t.getBoundingClientRect();return e.clientX>=i.left-lo&&e.clientX<=i.right+lo&&e.clientY>=i.top-lo&&e.clientY<=i.bottom+lo}(s.dom,t)||this.pending){let{pos:s}=n[0]||this.pending,r=null!==(i=null===(e=n[0])||void 0===e?void 0:e.end)&&void 0!==i?i:s;(s==r?this.view.posAtCoords(this.lastMove)==s:function(t,e,i,n,s){let r=t.scrollDOM.getBoundingClientRect(),o=t.documentTop+t.documentPadding.top+t.contentHeight;if(r.left>n||r.rights||Math.min(r.bottom,o)=e&&l<=i}(this.view,s,r,t.clientX,t.clientY))||(this.view.dispatch({effects:this.setHover.of([])}),this.pending=null)}}mouseleave(t){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{active:e}=this;if(e.length){let{tooltip:e}=this;e&&e.dom.contains(t.relatedTarget)?this.watchTooltipLeave(e.dom):this.view.dispatch({effects:this.setHover.of([])})}}watchTooltipLeave(t){let e=i=>{t.removeEventListener("mouseleave",e),this.active.length&&!this.view.dom.contains(i.relatedTarget)&&this.view.dispatch({effects:this.setHover.of([])})};t.addEventListener("mouseleave",e)}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}}const lo=4;function ao(t,e={}){let i=dt.define(),n=X.define({create:()=>[],update(t,n){if(t.length&&(e.hideOnChange&&(n.docChanged||n.selection)?t=[]:e.hideOn&&(t=t.filter((t=>!e.hideOn(n,t)))),n.docChanged)){let e=[];for(let i of t){let t=n.changes.mapPos(i.pos,-1,P.TrackDel);if(null!=t){let s=Object.assign(Object.create(null),i);s.pos=t,null!=s.end&&(s.end=n.changes.mapPos(s.end)),e.push(s)}}t=e}for(let e of n.effects)e.is(i)&&(t=e.value),e.is(co)&&(t=[]);return t},provide:t=>no.from(t)});return{active:n,extension:[n,Gi.define((s=>new oo(s,t,n,i,e.hoverTime||300))),ro]}}function ho(t,e){let i=t.plugin(Jr);if(!i)return null;let n=i.manager.tooltips.indexOf(e);return n<0?null:i.manager.tooltipViews[n]}const co=dt.define(),uo=I.define({combine(t){let e,i;for(let n of t)e=e||n.topContainer,i=i||n.bottomContainer;return{topContainer:e,bottomContainer:i}}});function fo(t,e){let i=t.plugin(po),n=i?i.specs.indexOf(e):-1;return n>-1?i.panels[n]:null}const po=Gi.fromClass(class{constructor(t){this.input=t.state.facet(vo),this.specs=this.input.filter((t=>t)),this.panels=this.specs.map((e=>e(t)));let e=t.state.facet(uo);this.top=new go(t,!0,e.topContainer),this.bottom=new go(t,!1,e.bottomContainer),this.top.sync(this.panels.filter((t=>t.top))),this.bottom.sync(this.panels.filter((t=>!t.top)));for(let t of this.panels)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}update(t){let e=t.state.facet(uo);this.top.container!=e.topContainer&&(this.top.sync([]),this.top=new go(t.view,!0,e.topContainer)),this.bottom.container!=e.bottomContainer&&(this.bottom.sync([]),this.bottom=new go(t.view,!1,e.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let i=t.state.facet(vo);if(i!=this.input){let e=i.filter((t=>t)),n=[],s=[],r=[],o=[];for(let i of e){let e,l=this.specs.indexOf(i);l<0?(e=i(t.view),o.push(e)):(e=this.panels[l],e.update&&e.update(t)),n.push(e),(e.top?s:r).push(e)}this.specs=e,this.panels=n,this.top.sync(s),this.bottom.sync(r);for(let t of o)t.dom.classList.add("cm-panel"),t.mount&&t.mount()}else for(let e of this.panels)e.update&&e.update(t)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:t=>Ks.scrollMargins.of((e=>{let i=e.plugin(t);return i&&{top:i.top.scrollMargin(),bottom:i.bottom.scrollMargin()}}))});class go{constructor(t,e,i){this.view=t,this.top=e,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(t){for(let e of this.panels)e.destroy&&t.indexOf(e)<0&&e.destroy();this.panels=t,this.syncDOM()}syncDOM(){if(0==this.panels.length)return void(this.dom&&(this.dom.remove(),this.dom=void 0));if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let t=this.container||this.view.dom;t.insertBefore(this.dom,this.top?t.firstChild:null)}let t=this.dom.firstChild;for(let e of this.panels)if(e.dom.parentNode==this.dom){for(;t!=e.dom;)t=mo(t);t=t.nextSibling}else this.dom.insertBefore(e.dom,t);for(;t;)t=mo(t)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(this.container&&this.classes!=this.view.themeClasses){for(let t of this.classes.split(" "))t&&this.container.classList.remove(t);for(let t of(this.classes=this.view.themeClasses).split(" "))t&&this.container.classList.add(t)}}}function mo(t){let e=t.nextSibling;return t.remove(),e}const vo=I.define({enables:po});class wo extends Ct{compare(t){return this==t||this.constructor==t.constructor&&this.eq(t)}eq(t){return!1}destroy(t){}}wo.prototype.elementClass="",wo.prototype.toDOM=void 0,wo.prototype.mapMode=P.TrackBefore,wo.prototype.startSide=wo.prototype.endSide=-1,wo.prototype.point=!0;const bo=I.define(),yo=I.define(),xo={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>Dt.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}},ko=I.define();function Po(t){return[Oo(),ko.of(Object.assign(Object.assign({},xo),t))]}const So=I.define({combine:t=>t.some((t=>t))});function Oo(t){return[Co]}const Co=Gi.fromClass(class{constructor(t){this.view=t,this.prevViewport=t.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=t.state.facet(ko).map((e=>new Do(t,e)));for(let t of this.gutters)this.dom.appendChild(t.dom);this.fixed=!t.state.facet(So),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),t.scrollDOM.insertBefore(this.dom,t.contentDOM)}update(t){if(this.updateGutters(t)){let e=this.prevViewport,i=t.view.viewport,n=Math.min(e.to,i.to)-Math.max(e.from,i.from);this.syncGutters(n<.8*(i.to-i.from))}t.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px"),this.view.state.facet(So)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=t.view.viewport}syncGutters(t){let e=this.dom.nextSibling;t&&this.dom.remove();let i=Dt.iter(this.view.state.facet(bo),this.view.viewport.from),n=[],s=this.gutters.map((t=>new To(t,this.view.viewport,-this.view.documentPadding.top)));for(let t of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(t.type)){let e=!0;for(let r of t.type)if(r.type==ii.Text&&e){Mo(i,n,r.from);for(let t of s)t.line(this.view,r,n);e=!1}else if(r.widget)for(let t of s)t.widget(this.view,r)}else if(t.type==ii.Text){Mo(i,n,t.from);for(let e of s)e.line(this.view,t,n)}else if(t.widget)for(let e of s)e.widget(this.view,t);for(let t of s)t.finish();t&&this.view.scrollDOM.insertBefore(this.dom,e)}updateGutters(t){let e=t.startState.facet(ko),i=t.state.facet(ko),n=t.docChanged||t.heightChanged||t.viewportChanged||!Dt.eq(t.startState.facet(bo),t.state.facet(bo),t.view.viewport.from,t.view.viewport.to);if(e==i)for(let e of this.gutters)e.update(t)&&(n=!0);else{n=!0;let s=[];for(let n of i){let i=e.indexOf(n);i<0?s.push(new Do(this.view,n)):(this.gutters[i].update(t),s.push(this.gutters[i]))}for(let t of this.gutters)t.dom.remove(),s.indexOf(t)<0&&t.destroy();for(let t of s)this.dom.appendChild(t.dom);this.gutters=s}return n}destroy(){for(let t of this.gutters)t.destroy();this.dom.remove()}},{provide:t=>Ks.scrollMargins.of((e=>{let i=e.plugin(t);return i&&0!=i.gutters.length&&i.fixed?e.textDirection==gi.LTR?{left:i.dom.offsetWidth*e.scaleX}:{right:i.dom.offsetWidth*e.scaleX}:null}))});function Ao(t){return Array.isArray(t)?t:[t]}function Mo(t,e,i){for(;t.value&&t.from<=i;)t.from==i&&e.push(t.value),t.next()}class To{constructor(t,e,i){this.gutter=t,this.height=i,this.i=0,this.cursor=Dt.iter(t.markers,e.from)}addElement(t,e,i){let{gutter:n}=this,s=(e.top-this.height)/t.scaleY,r=e.height/t.scaleY;if(this.i==n.elements.length){let e=new Eo(t,r,s,i);n.elements.push(e),n.dom.appendChild(e.dom)}else n.elements[this.i].update(t,r,s,i);this.height=e.bottom,this.i++}line(t,e,i){let n=[];Mo(this.cursor,n,e.from),i.length&&(n=n.concat(i));let s=this.gutter.config.lineMarker(t,e,n);s&&n.unshift(s);let r=this.gutter;(0!=n.length||r.config.renderEmptyElements)&&this.addElement(t,e,n)}widget(t,e){let i=this.gutter.config.widgetMarker(t,e.widget,e),n=i?[i]:null;for(let i of t.state.facet(yo)){let s=i(t,e.widget,e);s&&(n||(n=[])).push(s)}n&&this.addElement(t,e,n)}finish(){let t=this.gutter;for(;t.elements.length>this.i;){let e=t.elements.pop();t.dom.removeChild(e.dom),e.destroy()}}}class Do{constructor(t,e){this.view=t,this.config=e,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in e.domEventHandlers)this.dom.addEventListener(i,(n=>{let s,r=n.target;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let t=r.getBoundingClientRect();s=(t.top+t.bottom)/2}else s=n.clientY;let o=t.lineBlockAtHeight(s-t.documentTop);e.domEventHandlers[i](t,o,n)&&n.preventDefault()}));this.markers=Ao(e.markers(t)),e.initialSpacer&&(this.spacer=new Eo(t,0,0,[e.initialSpacer(t)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(t){let e=this.markers;if(this.markers=Ao(this.config.markers(t.view)),this.spacer&&this.config.updateSpacer){let e=this.config.updateSpacer(this.spacer.markers[0],t);e!=this.spacer.markers[0]&&this.spacer.update(t.view,0,0,[e])}let i=t.view.viewport;return!Dt.eq(this.markers,e,i.from,i.to)||!!this.config.lineMarkerChange&&this.config.lineMarkerChange(t)}destroy(){for(let t of this.elements)t.destroy()}}class Eo{constructor(t,e,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(t,e,i,n)}update(t,e,i,n){this.height!=e&&(this.height=e,this.dom.style.height=e+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),function(t,e){if(t.length!=e.length)return!1;for(let i=0;iOt(t,{formatNumber:String,domEventHandlers:{}},{domEventHandlers(t,e){let i=Object.assign({},t);for(let t in e){let n=i[t],s=e[t];i[t]=n?(t,e,i)=>n(t,e,i)||s(t,e,i):s}return i}})});class Lo extends wo{constructor(t){super(),this.number=t}eq(t){return this.number==t.number}toDOM(){return document.createTextNode(this.number)}}function Io(t,e){return t.state.facet(No).formatNumber(e,t.state)}const Fo=ko.compute([No],(t=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers:t=>t.state.facet(Ro),lineMarker:(t,e,i)=>i.some((t=>t.toDOM))?null:new Lo(Io(t,t.state.doc.lineAt(e.from).number)),widgetMarker:(t,e,i)=>{for(let n of t.state.facet(Bo)){let s=n(t,e,i);if(s)return s}return null},lineMarkerChange:t=>t.startState.facet(No)!=t.state.facet(No),initialSpacer:t=>new Lo(Io(t,Wo(t.state.doc.lines))),updateSpacer(t,e){let i=Io(e.view,Wo(e.view.state.doc.lines));return i==t.number?t:new Lo(i)},domEventHandlers:t.facet(No).domEventHandlers})));function Vo(t={}){return[No.of(t),Oo(),Fo]}function Wo(t){let e=9;for(;e{let e=[],i=-1;for(let n of t.selection.ranges){let s=t.doc.lineAt(n.head).from;s>i&&(i=s,e.push(Ho.range(s)))}return Dt.of(e)}));const qo=1024;let Xo=0;class Uo{constructor(t,e){this.from=t,this.to=e}}class Qo{constructor(t={}){this.id=Xo++,this.perNode=!!t.perNode,this.deserialize=t.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(t){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return"function"!=typeof t&&(t=_o.match(t)),e=>{let i=t(e);return void 0===i?null:[this,i]}}}Qo.closedBy=new Qo({deserialize:t=>t.split(" ")}),Qo.openedBy=new Qo({deserialize:t=>t.split(" ")}),Qo.group=new Qo({deserialize:t=>t.split(" ")}),Qo.isolate=new Qo({deserialize:t=>{if(t&&"rtl"!=t&&"ltr"!=t&&"auto"!=t)throw new RangeError("Invalid value for isolate: "+t);return t||"auto"}}),Qo.contextHash=new Qo({perNode:!0}),Qo.lookAhead=new Qo({perNode:!0}),Qo.mounted=new Qo({perNode:!0});class Yo{constructor(t,e,i){this.tree=t,this.overlay=e,this.parser=i}static get(t){return t&&t.props&&t.props[Qo.mounted.id]}}const $o=Object.create(null);class _o{constructor(t,e,i,n=0){this.name=t,this.props=e,this.id=i,this.flags=n}static define(t){let e=t.props&&t.props.length?Object.create(null):$o,i=(t.top?1:0)|(t.skipped?2:0)|(t.error?4:0)|(null==t.name?8:0),n=new _o(t.name||"",e,t.id,i);if(t.props)for(let i of t.props)if(Array.isArray(i)||(i=i(n)),i){if(i[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");e[i[0].id]=i[1]}return n}prop(t){return this.props[t.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(t){if("string"==typeof t){if(this.name==t)return!0;let e=this.prop(Qo.group);return!!e&&e.indexOf(t)>-1}return this.id==t}static match(t){let e=Object.create(null);for(let i in t)for(let n of i.split(" "))e[n]=t[i];return t=>{for(let i=t.prop(Qo.group),n=-1;n<(i?i.length:0);n++){let s=e[n<0?t.name:i[n]];if(s)return s}}}}_o.none=new _o("",Object.create(null),0,8);class jo{constructor(t){this.types=t;for(let e=0;e=e){let o=new rl(r.tree,r.overlay[0].from+t.from,-1,t);(s||(s=[n])).push(nl(o,e,i,!1))}}return s?cl(s):n}(this,t,e)}iterate(t){let{enter:e,leave:i,from:n=0,to:s=this.length}=t,r=t.mode||0,o=(r&Zo.IncludeAnonymous)>0;for(let t=this.cursor(r|Zo.IncludeAnonymous);;){let r=!1;if(t.from<=s&&t.to>=n&&(!o&&t.type.isAnonymous||!1!==e(t))){if(t.firstChild())continue;r=!0}for(;r&&i&&(o||!t.type.isAnonymous)&&i(t),!t.nextSibling();){if(!t.parent())return;r=!0}}}prop(t){return t.perNode?this.props?this.props[t.id]:void 0:this.type.prop(t)}get propValues(){let t=[];if(this.props)for(let e in this.props)t.push([+e,this.props[e]]);return t}balance(t={}){return this.children.length<=8?this:ml(_o.none,this.children,this.positions,0,this.children.length,0,this.length,((t,e,i)=>new Jo(this.type,t,e,i,this.propValues)),t.makeTree||((t,e,i)=>new Jo(_o.none,t,e,i)))}static build(t){return function(t){var e;let{buffer:i,nodeSet:n,maxBufferLength:s=qo,reused:r=[],minRepeatType:o=n.types.length}=t,l=Array.isArray(i)?new tl(i,i.length):i,a=n.types,h=0,c=0;function u(t,e,i,w,b,y){let{id:x,start:k,end:P,size:S}=l,O=c;for(;S<0;){if(l.next(),-1==S){let e=r[x];return i.push(e),void w.push(k-t)}if(-3==S)return void(h=x);if(-4==S)return void(c=x);throw new RangeError(`Unrecognized record size: ${S}`)}let C,A,M=a[x],T=k-t;if(P-k<=s&&(A=m(l.pos-e,b))){let e=new Uint16Array(A.size-A.skip),i=l.pos-A.size,s=e.length;for(;l.pos>i;)s=v(A.start,e,s);C=new el(e,P-A.start,n),T=A.start-t}else{let t=l.pos-S;l.next();let e=[],i=[],n=x>=o?x:-1,r=0,a=P;for(;l.pos>t;)n>=0&&l.id==n&&l.size>=0?(l.end<=a-s&&(p(e,i,k,r,l.end,a,n,O),r=e.length,a=l.end),l.next()):y>2500?d(k,t,e,i):u(k,t,e,i,n,y+1);if(n>=0&&r>0&&r-1&&r>0){let t=f(M);C=ml(M,e,i,0,e.length,0,P-k,t,t)}else C=g(M,e,i,P-k,O-P)}i.push(C),w.push(T)}function d(t,e,i,r){let o=[],a=0,h=-1;for(;l.pos>e;){let{id:t,start:e,end:i,size:n}=l;if(n>4)l.next();else{if(h>-1&&e=0;t-=3)e[i++]=o[t],e[i++]=o[t+1]-s,e[i++]=o[t+2]-s,e[i++]=i;i.push(new el(e,o[2]-s,n)),r.push(s-t)}}function f(t){return(e,i,n)=>{let s,r,o=0,l=e.length-1;if(l>=0&&(s=e[l])instanceof Jo){if(!l&&s.type==t&&s.length==n)return s;(r=s.prop(Qo.lookAhead))&&(o=i[l]+s.length+r)}return g(t,e,i,n,o)}}function p(t,e,i,s,r,o,l,a){let h=[],c=[];for(;t.length>s;)h.push(t.pop()),c.push(e.pop()+i-r);t.push(g(n.types[l],h,c,o-r,a-o)),e.push(r-i)}function g(t,e,i,n,s=0,r){if(h){let t=[Qo.contextHash,h];r=r?[t].concat(r):[t]}if(s>25){let t=[Qo.lookAhead,s];r=r?[t].concat(r):[t]}return new Jo(t,e,i,n,r)}function m(t,e){let i=l.fork(),n=0,r=0,a=0,h=i.end-s,c={size:0,start:0,skip:0};t:for(let s=i.pos-t;i.pos>s;){let t=i.size;if(i.id==e&&t>=0){c.size=n,c.start=r,c.skip=a,a+=4,n+=4,i.next();continue}let l=i.pos-t;if(t<0||l=o?4:0,d=i.start;for(i.next();i.pos>l;){if(i.size<0){if(-3!=i.size)break t;u+=4}else i.id>=o&&(u+=4);i.next()}r=d,n+=t,a+=u}return(e<0||n==t)&&(c.size=n,c.start=r,c.skip=a),c.size>4?c:void 0}function v(t,e,i){let{id:n,start:s,end:r,size:a}=l;if(l.next(),a>=0&&n4){let n=l.pos-(a-4);for(;l.pos>n;)i=v(t,e,i)}e[--i]=o,e[--i]=r-t,e[--i]=s-t,e[--i]=n}else-3==a?h=n:-4==a&&(c=n);return i}let w=[],b=[];for(;l.pos>0;)u(t.start||0,t.bufferStart||0,w,b,-1,0);let y=null!==(e=t.length)&&void 0!==e?e:w.length?b[0]+w[0].length:0;return new Jo(a[t.topID],w.reverse(),b.reverse(),y)}(t)}}Jo.empty=new Jo(_o.none,[],[],0);class tl{constructor(t,e){this.buffer=t,this.index=e}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new tl(this.buffer,this.index)}}class el{constructor(t,e,i){this.buffer=t,this.length=e,this.set=i}get type(){return _o.none}toString(){let t=[];for(let e=0;e0));l=r[l+3]);return o}slice(t,e,i){let n=this.buffer,s=new Uint16Array(e-t),r=0;for(let o=t,l=0;o=e&&ie;case 1:return i<=e&&n>e;case 2:return n>e;case 4:return!0}}function nl(t,e,i,n){for(var s;t.from==t.to||(i<1?t.from>=e:t.from>e)||(i>-1?t.to<=e:t.to0?o.length:-1;t!=a;t+=e){let a=o[t],h=l[t]+r.from;if(il(n,i,h,h+a.length))if(a instanceof el){if(s&Zo.ExcludeBuffers)continue;let o=a.findChild(0,a.buffer.length,e,i-h,n);if(o>-1)return new hl(new al(r,a,t,h),null,o)}else if(s&Zo.IncludeAnonymous||!a.type.isAnonymous||fl(a)){let o;if(!(s&Zo.IgnoreMounts)&&(o=Yo.get(a))&&!o.overlay)return new rl(o.tree,h,t,r);let l=new rl(a,h,t,r);return s&Zo.IncludeAnonymous||!l.type.isAnonymous?l:l.nextChild(e<0?a.children.length-1:0,e,i,n)}}if(s&Zo.IncludeAnonymous||!r.type.isAnonymous)return null;if(t=r.index>=0?r.index+e:e<0?-1:r._parent._tree.children.length,r=r._parent,!r)return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(t){return this.nextChild(0,1,t,2)}childBefore(t){return this.nextChild(this._tree.children.length-1,-1,t,-2)}enter(t,e,i=0){let n;if(!(i&Zo.IgnoreOverlays)&&(n=Yo.get(this._tree))&&n.overlay){let i=t-this.from;for(let{from:t,to:s}of n.overlay)if((e>0?t<=i:t=i:s>i))return new rl(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,t,e,i)}nextSignificantParent(){let t=this;for(;t.type.isAnonymous&&t._parent;)t=t._parent;return t}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function ol(t,e,i,n){let s=t.cursor(),r=[];if(!s.firstChild())return r;if(null!=i)for(let t=!1;!t;)if(t=s.type.is(i),!s.nextSibling())return r;for(;;){if(null!=n&&s.type.is(n))return r;if(s.type.is(e)&&r.push(s.node),!s.nextSibling())return null==n?r:[]}}function ll(t,e,i=e.length-1){for(let n=t.parent;i>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(e[i]&&e[i]!=n.name)return!1;i--}}return!0}class al{constructor(t,e,i,n){this.parent=t,this.buffer=e,this.index=i,this.start=n}}class hl extends sl{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(t,e,i){super(),this.context=t,this._parent=e,this.index=i,this.type=t.buffer.set.types[t.buffer.buffer[i]]}child(t,e,i){let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],t,e-this.context.start,i);return s<0?null:new hl(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(t){return this.child(1,t,2)}childBefore(t){return this.child(-1,t,-2)}enter(t,e,i=0){if(i&Zo.ExcludeBuffers)return null;let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],e>0?1:-1,t-this.context.start,e);return s<0?null:new hl(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(t){return this._parent?null:this.context.parent.nextChild(this.context.index+t,t,0,4)}get nextSibling(){let{buffer:t}=this.context,e=t.buffer[this.index+3];return e<(this._parent?t.buffer[this._parent.index+3]:t.buffer.length)?new hl(this.context,this._parent,e):this.externalSibling(1)}get prevSibling(){let{buffer:t}=this.context,e=this._parent?this._parent.index+4:0;return this.index==e?this.externalSibling(-1):new hl(this.context,this._parent,t.findChild(e,this.index,-1,0,4))}get tree(){return null}toTree(){let t=[],e=[],{buffer:i}=this.context,n=this.index+4,s=i.buffer[this.index+3];if(s>n){let r=i.buffer[this.index+1];t.push(i.slice(n,s,r)),e.push(0)}return new Jo(this.type,t,e,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function cl(t){if(!t.length)return null;let e=0,i=t[0];for(let n=1;ni.from||s.to0){if(this.index-1)for(let n=e+t,s=t<0?-1:i._tree.children.length;n!=s;n+=t){let t=i._tree.children[n];if(this.mode&Zo.IncludeAnonymous||t instanceof el||!t.type.isAnonymous||fl(t))return!1}return!0}move(t,e){if(e&&this.enterChild(t,0,4))return!0;for(;;){if(this.sibling(t))return!0;if(this.atLastNode(t)||!this.parent())return!1}}next(t=!0){return this.move(1,t)}prev(t=!0){return this.move(-1,t)}moveTo(t,e=0){for(;(this.from==this.to||(e<1?this.from>=t:this.from>t)||(e>-1?this.to<=t:this.to=0;){for(let r=t;r;r=r._parent)if(r.index==n){if(n==this.index)return r;e=r,i=s+1;break t}n=this.stack[--s]}for(let t=i;t=0;s--){if(s<0)return ll(this.node,t,n);let r=i[e.buffer[this.stack[s]]];if(!r.isAnonymous){if(t[n]&&t[n]!=r.name)return!1;n--}}return!0}}function fl(t){return t.children.some((t=>t instanceof el||!t.type.isAnonymous||fl(t)))}const pl=new WeakMap;function gl(t,e){if(!t.isAnonymous||e instanceof el||e.type!=t)return 1;let i=pl.get(e);if(null==i){i=1;for(let n of e.children){if(n.type!=t||!(n instanceof Jo)){i=1;break}i+=gl(t,n)}pl.set(e,i)}return i}function ml(t,e,i,n,s,r,o,l,a){let h=0;for(let i=n;i=c)break;p+=e}if(h==s+1){if(p>c){let t=i[s];e(t.children,t.positions,0,t.children.length,n[s]+l);continue}u.push(i[s])}else{let e=n[h-1]+i[h-1].length-f;u.push(ml(t,i,n,s,h,f,e,null,a))}d.push(f+l-r)}}(e,i,n,s,0),(l||a)(u,d,o)}class vl{constructor(t,e,i,n,s=!1,r=!1){this.from=t,this.to=e,this.tree=i,this.offset=n,this.open=(s?1:0)|(r?2:0)}get openStart(){return(1&this.open)>0}get openEnd(){return(2&this.open)>0}static addTree(t,e=[],i=!1){let n=[new vl(0,t.length,t,0,!1,i)];for(let i of e)i.to>t.length&&n.push(i);return n}static applyChanges(t,e,i=128){if(!e.length)return t;let n=[],s=1,r=t.length?t[0]:null;for(let o=0,l=0,a=0;;o++){let h=o=i)for(;r&&r.from=e.from||c<=e.to||a){let t=Math.max(e.from,l)-a,i=Math.min(e.to,c)-a;e=t>=i?null:new vl(t,i,e.tree,e.offset+a,o>0,!!h)}if(e&&n.push(e),r.to>c)break;r=snew Uo(t.from,t.to))):[new Uo(0,0)]:[new Uo(0,t.length)],this.createParse(t,e||[],i)}parse(t,e,i){let n=this.startParse(t,e,i);for(;;){let t=n.advance();if(t)return t}}}class bl{constructor(t){this.string=t}get length(){return this.string.length}chunk(t){return this.string.slice(t)}get lineChunks(){return!1}read(t,e){return this.string.slice(t,e)}}new Qo({perNode:!0});let yl=0;class xl{constructor(t,e,i){this.set=t,this.base=e,this.modified=i,this.id=yl++}static define(t){if(null==t?void 0:t.base)throw new Error("Can not derive from a modified tag");let e=new xl([],null,[]);if(e.set.push(e),t)for(let i of t.set)e.set.push(i);return e}static defineModifier(){let t=new Pl;return e=>e.modified.indexOf(t)>-1?e:Pl.get(e.base||e,e.modified.concat(t).sort(((t,e)=>t.id-e.id)))}}let kl=0;class Pl{constructor(){this.instances=[],this.id=kl++}static get(t,e){if(!e.length)return t;let i=e[0].instances.find((i=>{return i.base==t&&(n=e,s=i.modified,n.length==s.length&&n.every(((t,e)=>t==s[e])));var n,s}));if(i)return i;let n=[],s=new xl(n,t,e);for(let t of e)t.instances.push(s);let r=function(t){let e=[[]];for(let i=0;ie.length-t.length))}(e);for(let e of t.set)if(!e.modified.length)for(let t of r)n.push(Pl.get(e,t));return s}}function Sl(t){let e=Object.create(null);for(let i in t){let n=t[i];Array.isArray(n)||(n=[n]);for(let t of i.split(" "))if(t){let i=[],s=2,r=t;for(let e=0;;){if("..."==r&&e>0&&e+3==t.length){s=1;break}let n=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!n)throw new RangeError("Invalid path: "+t);if(i.push("*"==n[0]?"":'"'==n[0][0]?JSON.parse(n[0]):n[0]),e+=n[0].length,e==t.length)break;let o=t[e++];if(e==t.length&&"!"==o){s=0;break}if("/"!=o)throw new RangeError("Invalid path: "+t);r=t.slice(e)}let o=i.length-1,l=i[o];if(!l)throw new RangeError("Invalid path: "+t);let a=new Cl(n,s,o>0?i.slice(0,o):null);e[l]=a.sort(e[l])}}return Ol.add(e)}const Ol=new Qo;class Cl{constructor(t,e,i,n){this.tags=t,this.mode=e,this.context=i,this.next=n}get opaque(){return 0==this.mode}get inherit(){return 1==this.mode}sort(t){return!t||t.depth{let e=s;for(let n of t)for(let t of n.set){let n=i[t.id];if(n){e=e?e+" "+n:n;break}}return e},scope:n}}function Ml(t,e,i,n=0,s=t.length){let r=new Tl(n,Array.isArray(e)?e:[e],i);r.highlightRange(t.cursor(),n,s,"",r.highlighters),r.flush(s)}Cl.empty=new Cl([],2,null);class Tl{constructor(t,e,i){this.at=t,this.highlighters=e,this.span=i,this.class=""}startSpan(t,e){e!=this.class&&(this.flush(t),t>this.at&&(this.at=t),this.class=e)}flush(t){t>this.at&&this.class&&this.span(this.at,t,this.class)}highlightRange(t,e,i,n,s){let{type:r,from:o,to:l}=t;if(o>=i||l<=e)return;r.isTop&&(s=this.highlighters.filter((t=>!t.scope||t.scope(r))));let a=n,h=function(t){let e=t.type.prop(Ol);for(;e&&e.context&&!t.matchContext(e.context);)e=e.next;return e||null}(t)||Cl.empty,c=function(t,e){let i=null;for(let n of t){let t=n.style(e);t&&(i=i?i+" "+t:t)}return i}(s,h.tags);if(c&&(a&&(a+=" "),a+=c,1==h.mode&&(n+=(n?" ":"")+c)),this.startSpan(Math.max(e,o),a),h.opaque)return;let u=t.tree&&t.tree.prop(Qo.mounted);if(u&&u.overlay){let r=t.node.enter(u.overlay[0].from+o,1),h=this.highlighters.filter((t=>!t.scope||t.scope(u.tree.type))),c=t.firstChild();for(let d=0,f=o;;d++){let p=d=g)&&t.nextSibling()););if(!p||g>i)break;f=p.to+o,f>e&&(this.highlightRange(r.cursor(),Math.max(e,p.from+o),Math.min(i,f),"",h),this.startSpan(Math.min(i,f),a))}c&&t.parent()}else if(t.firstChild()){u&&(n="");do{if(!(t.to<=e)){if(t.from>=i)break;this.highlightRange(t,e,i,n,s),this.startSpan(Math.min(i,t.to),a)}}while(t.nextSibling());t.parent()}}}const Dl=xl.define,El=Dl(),Rl=Dl(),Bl=Dl(Rl),Nl=Dl(Rl),Ll=Dl(),Il=Dl(Ll),Fl=Dl(Ll),Vl=Dl(),Wl=Dl(Vl),Hl=Dl(),zl=Dl(),ql=Dl(),Xl=Dl(ql),Ul=Dl(),Ql={comment:El,lineComment:Dl(El),blockComment:Dl(El),docComment:Dl(El),name:Rl,variableName:Dl(Rl),typeName:Bl,tagName:Dl(Bl),propertyName:Nl,attributeName:Dl(Nl),className:Dl(Rl),labelName:Dl(Rl),namespace:Dl(Rl),macroName:Dl(Rl),literal:Ll,string:Il,docString:Dl(Il),character:Dl(Il),attributeValue:Dl(Il),number:Fl,integer:Dl(Fl),float:Dl(Fl),bool:Dl(Ll),regexp:Dl(Ll),escape:Dl(Ll),color:Dl(Ll),url:Dl(Ll),keyword:Hl,self:Dl(Hl),null:Dl(Hl),atom:Dl(Hl),unit:Dl(Hl),modifier:Dl(Hl),operatorKeyword:Dl(Hl),controlKeyword:Dl(Hl),definitionKeyword:Dl(Hl),moduleKeyword:Dl(Hl),operator:zl,derefOperator:Dl(zl),arithmeticOperator:Dl(zl),logicOperator:Dl(zl),bitwiseOperator:Dl(zl),compareOperator:Dl(zl),updateOperator:Dl(zl),definitionOperator:Dl(zl),typeOperator:Dl(zl),controlOperator:Dl(zl),punctuation:ql,separator:Dl(ql),bracket:Xl,angleBracket:Dl(Xl),squareBracket:Dl(Xl),paren:Dl(Xl),brace:Dl(Xl),content:Vl,heading:Wl,heading1:Dl(Wl),heading2:Dl(Wl),heading3:Dl(Wl),heading4:Dl(Wl),heading5:Dl(Wl),heading6:Dl(Wl),contentSeparator:Dl(Vl),list:Dl(Vl),quote:Dl(Vl),emphasis:Dl(Vl),strong:Dl(Vl),link:Dl(Vl),monospace:Dl(Vl),strikethrough:Dl(Vl),inserted:Dl(),deleted:Dl(),changed:Dl(),invalid:Dl(),meta:Ul,documentMeta:Dl(Ul),annotation:Dl(Ul),processingInstruction:Dl(Ul),definition:xl.defineModifier(),constant:xl.defineModifier(),function:xl.defineModifier(),standard:xl.defineModifier(),local:xl.defineModifier(),special:xl.defineModifier()};var Yl;Al([{tag:Ql.link,class:"tok-link"},{tag:Ql.heading,class:"tok-heading"},{tag:Ql.emphasis,class:"tok-emphasis"},{tag:Ql.strong,class:"tok-strong"},{tag:Ql.keyword,class:"tok-keyword"},{tag:Ql.atom,class:"tok-atom"},{tag:Ql.bool,class:"tok-bool"},{tag:Ql.url,class:"tok-url"},{tag:Ql.labelName,class:"tok-labelName"},{tag:Ql.inserted,class:"tok-inserted"},{tag:Ql.deleted,class:"tok-deleted"},{tag:Ql.literal,class:"tok-literal"},{tag:Ql.string,class:"tok-string"},{tag:Ql.number,class:"tok-number"},{tag:[Ql.regexp,Ql.escape,Ql.special(Ql.string)],class:"tok-string2"},{tag:Ql.variableName,class:"tok-variableName"},{tag:Ql.local(Ql.variableName),class:"tok-variableName tok-local"},{tag:Ql.definition(Ql.variableName),class:"tok-variableName tok-definition"},{tag:Ql.special(Ql.variableName),class:"tok-variableName2"},{tag:Ql.definition(Ql.propertyName),class:"tok-propertyName tok-definition"},{tag:Ql.typeName,class:"tok-typeName"},{tag:Ql.namespace,class:"tok-namespace"},{tag:Ql.className,class:"tok-className"},{tag:Ql.macroName,class:"tok-macroName"},{tag:Ql.propertyName,class:"tok-propertyName"},{tag:Ql.operator,class:"tok-operator"},{tag:Ql.comment,class:"tok-comment"},{tag:Ql.meta,class:"tok-meta"},{tag:Ql.invalid,class:"tok-invalid"},{tag:Ql.punctuation,class:"tok-punctuation"}]);const $l=new Qo;const _l=new Qo;class jl{constructor(t,e,i=[],n=""){this.data=t,this.name=n,St.prototype.hasOwnProperty("tree")||Object.defineProperty(St.prototype,"tree",{get(){return Zl(this)}}),this.parser=e,this.extension=[la.of(this),St.languageData.of(((t,e,i)=>{let n=Kl(t,e,i),s=n.type.prop($l);if(!s)return[];let r=t.facet(s),o=n.type.prop(_l);if(o){let s=n.resolve(e-n.from,i);for(let e of o)if(e.test(s,t)){let i=t.facet(e.facet);return"replace"==e.type?i:i.concat(r)}}return r}))].concat(i)}isActiveAt(t,e,i=-1){return Kl(t,e,i).type.prop($l)==this.data}findRegions(t){let e=t.facet(la);if((null==e?void 0:e.data)==this.data)return[{from:0,to:t.doc.length}];if(!e||!e.allowsNesting)return[];let i=[],n=(t,e)=>{if(t.prop($l)==this.data)return void i.push({from:e,to:e+t.length});let s=t.prop(Qo.mounted);if(s){if(s.tree.prop($l)==this.data){if(s.overlay)for(let t of s.overlay)i.push({from:t.from+e,to:t.to+e});else i.push({from:e,to:e+t.length});return}if(s.overlay){let t=i.length;if(n(s.tree,s.overlay[0].from+e),i.length>t)return}}for(let i=0;it.concat(i):void 0}));var i;return new Gl(e,t.parser.configure({props:[$l.add((t=>t.isTop?e:void 0))]}),t.name)}configure(t,e){return new Gl(this.data,this.parser.configure(t),e||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function Zl(t){let e=t.field(jl.state,!1);return e?e.tree:Jo.empty}class Jl{constructor(t){this.doc=t,this.cursorPos=0,this.string="",this.cursor=t.iter()}get length(){return this.doc.length}syncTo(t){return this.string=this.cursor.next(t-this.cursorPos).value,this.cursorPos=t+this.string.length,this.cursorPos-this.string.length}chunk(t){return this.syncTo(t),this.string}get lineChunks(){return!0}read(t,e){let i=this.cursorPos-this.string.length;return t=this.cursorPos?this.doc.sliceString(t,e):this.string.slice(t-i,e-i)}}let ta=null;class ea{constructor(t,e,i=[],n,s,r,o,l){this.parser=t,this.state=e,this.fragments=i,this.tree=n,this.treeLen=s,this.viewport=r,this.skipped=o,this.scheduleOn=l,this.parse=null,this.tempSkipped=[]}static create(t,e,i){return new ea(t,e,[],Jo.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Jl(this.state.doc),this.fragments)}work(t,e){return null!=e&&e>=this.state.doc.length&&(e=void 0),this.tree!=Jo.empty&&this.isDone(null!=e?e:this.state.doc.length)?(this.takeTree(),!0):this.withContext((()=>{var i;if("number"==typeof t){let e=Date.now()+t;t=()=>Date.now()>e}for(this.parse||(this.parse=this.startParse()),null!=e&&(null==this.parse.stoppedAt||this.parse.stoppedAt>e)&&e=this.treeLen&&((null==this.parse.stoppedAt||this.parse.stoppedAt>t)&&this.parse.stopAt(t),this.withContext((()=>{for(;!(e=this.parse.advance()););})),this.treeLen=t,this.tree=e,this.fragments=this.withoutTempSkipped(vl.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(t){let e=ta;ta=this;try{return t()}finally{ta=e}}withoutTempSkipped(t){for(let e;e=this.tempSkipped.pop();)t=ia(t,e.from,e.to);return t}changes(t,e){let{fragments:i,tree:n,treeLen:s,viewport:r,skipped:o}=this;if(this.takeTree(),!t.empty){let e=[];if(t.iterChangedRanges(((t,i,n,s)=>e.push({fromA:t,toA:i,fromB:n,toB:s}))),i=vl.applyChanges(i,e),n=Jo.empty,s=0,r={from:t.mapPos(r.from,-1),to:t.mapPos(r.to,1)},this.skipped.length){o=[];for(let e of this.skipped){let i=t.mapPos(e.from,1),n=t.mapPos(e.to,-1);it.from&&(this.fragments=ia(this.fragments,i,n),this.skipped.splice(e--,1))}return!(this.skipped.length>=e)&&(this.reset(),!0)}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(t,e){this.skipped.push({from:t,to:e})}static getSkippingParser(t){return new class extends wl{createParse(e,i,n){let s=n[0].from,r=n[n.length-1].to;return{parsedPos:s,advance(){let e=ta;if(e){for(let t of n)e.tempSkipped.push(t);t&&(e.scheduleOn=e.scheduleOn?Promise.all([e.scheduleOn,t]):t)}return this.parsedPos=r,new Jo(_o.none,[],[],r-s)},stoppedAt:null,stopAt(){}}}}}isDone(t){t=Math.min(t,this.state.doc.length);let e=this.fragments;return this.treeLen>=t&&e.length&&0==e[0].from&&e[0].to>=t}static get(){return ta}}function ia(t,e,i){return vl.applyChanges(t,[{fromA:e,toA:i,fromB:e,toB:i}])}class na{constructor(t){this.context=t,this.tree=t.tree}apply(t){if(!t.docChanged&&this.tree==this.context.tree)return this;let e=this.context.changes(t.changes,t.state),i=this.context.treeLen==t.startState.doc.length?void 0:Math.max(t.changes.mapPos(this.context.treeLen),e.viewport.to);return e.work(20,i)||e.takeTree(),new na(e)}static init(t){let e=Math.min(3e3,t.doc.length),i=ea.create(t.facet(la).parser,t,{from:0,to:e});return i.work(20,e)||i.takeTree(),new na(i)}}jl.state=X.define({create:na.init,update(t,e){for(let t of e.effects)if(t.is(jl.setState))return t.value;return e.startState.facet(la)!=e.state.facet(la)?na.init(e.state):t.apply(e)}});let sa=t=>{let e=setTimeout((()=>t()),500);return()=>clearTimeout(e)};"undefined"!=typeof requestIdleCallback&&(sa=t=>{let e=-1,i=setTimeout((()=>{e=requestIdleCallback(t,{timeout:400})}),100);return()=>e<0?clearTimeout(i):cancelIdleCallback(e)});const ra="undefined"!=typeof navigator&&(null===(Yl=navigator.scheduling)||void 0===Yl?void 0:Yl.isInputPending)?()=>navigator.scheduling.isInputPending():null,oa=Gi.fromClass(class{constructor(t){this.view=t,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(t){let e=this.view.state.field(jl.state).context;(e.updateViewport(t.view.viewport)||this.view.viewport.to>e.treeLen)&&this.scheduleWork(),(t.docChanged||t.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(e)}scheduleWork(){if(this.working)return;let{state:t}=this.view,e=t.field(jl.state);e.tree==e.context.tree&&e.context.isDone(t.doc.length)||(this.working=sa(this.work))}work(t){this.working=null;let e=Date.now();if(this.chunkEndn+1e3,l=s.context.work((()=>ra&&ra()||Date.now()>r),n+(o?0:1e5));this.chunkBudget-=Date.now()-e,(l||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:jl.setState.of(new na(s.context))})),this.chunkBudget>0&&(!l||o)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(t){t.scheduleOn&&(this.workScheduled++,t.scheduleOn.then((()=>this.scheduleWork())).catch((t=>$i(this.view.state,t))).then((()=>this.workScheduled--)),t.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),la=I.define({combine:t=>t.length?t[0]:null,enables:t=>[jl.state,oa,Ks.contentAttributes.compute([t],(e=>{let i=e.facet(t);return i&&i.name?{"data-language":i.name}:{}}))]});class aa{constructor(t,e=[]){this.language=t,this.support=e,this.extension=[t,e]}}const ha=I.define(),ca=I.define({combine:t=>{if(!t.length)return" ";let e=t[0];if(!e||/\S/.test(e)||Array.from(e).some((t=>t!=e[0])))throw new Error("Invalid indent unit: "+JSON.stringify(t[0]));return e}});function ua(t){let e=t.facet(ca);return 9==e.charCodeAt(0)?t.tabSize*e.length:e.length}function da(t,e){let i="",n=t.tabSize,s=t.facet(ca)[0];if("\t"==s){for(;e>=n;)i+="\t",e-=n;s=" "}for(let t=0;t=e?function(t,e,i){let n=e.resolveStack(i),s=n.node.enterUnfinishedNodesBefore(i);if(s!=n.node){let t=[];for(let e=s;e!=n.node;e=e.parent)t.push(e);for(let e=t.length-1;e>=0;e--)n={node:t[e],next:n}}return ma(n,t,i)}(t,i,e):null}class pa{constructor(t,e={}){this.state=t,this.options=e,this.unit=ua(t)}lineAt(t,e=1){let i=this.state.doc.lineAt(t),{simulateBreak:n,simulateDoubleBreak:s}=this.options;return null!=n&&n>=i.from&&n<=i.to?s&&n==t?{text:"",from:t}:(e<0?n-1&&(s+=r-this.countColumn(i,i.search(/\S|$/))),s}countColumn(t,e=t.length){return qt(t,this.state.tabSize,e)}lineIndent(t,e=1){let{text:i,from:n}=this.lineAt(t,e),s=this.options.overrideIndentation;if(s){let t=s(n);if(t>-1)return t}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const ga=new Qo;function ma(t,e,i){for(let n=t;n;n=n.next){let t=va(n.node);if(t)return t(ba.create(e,i,n))}return 0}function va(t){let e=t.type.prop(ga);if(e)return e;let i,n=t.firstChild;if(n&&(i=n.type.prop(Qo.closedBy))){let e=t.lastChild,n=e&&i.indexOf(e.name)>-1;return t=>xa(t,!0,1,void 0,n&&!function(t){return t.pos==t.options.simulateBreak&&t.options.simulateDoubleBreak}(t)?e.from:void 0)}return null==t.parent?wa:null}function wa(){return 0}class ba extends pa{constructor(t,e,i){super(t.state,t.options),this.base=t,this.pos=e,this.context=i}get node(){return this.context.node}static create(t,e,i){return new ba(t,e,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(t){let e=this.state.doc.lineAt(t.from);for(;;){let i=t.resolve(e.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(ya(i,t))break;e=this.state.doc.lineAt(i.from)}return this.lineIndent(e.from)}continue(){return ma(this.context.next,this.base,this.pos)}}function ya(t,e){for(let i=e;i;i=i.parent)if(t==i)return!0;return!1}function xa(t,e,i,n,s){let r=t.textAfter,o=r.match(/^\s*/)[0].length,l=n&&r.slice(o,o+n.length)==n||s==t.pos+o,a=e?function(t){let e=t.node,i=e.childAfter(e.from),n=e.lastChild;if(!i)return null;let s=t.options.simulateBreak,r=t.state.doc.lineAt(i.from),o=null==s||s<=r.from?r.to:Math.min(r.to,s);for(let t=i.to;;){let s=e.childAfter(t);if(!s||s==n)return null;if(!s.type.isSkipped)return s.fromi)continue;if(s&&o.from=e&&n.to>i&&(s=n)}}return s}(t,e,i)}function Ca(t,e){let i=e.mapPos(t.from,1),n=e.mapPos(t.to,-1);return i>=n?void 0:{from:i,to:n}}const Aa=dt.define({map:Ca}),Ma=dt.define({map:Ca});function Ta(t){let e=[];for(let{head:i}of t.state.selection.ranges)e.some((t=>t.from<=i&&t.to>=i))||e.push(t.lineBlockAt(i));return e}const Da=X.define({create:()=>ni.none,update(t,e){t=t.map(e.changes);for(let i of e.effects)if(i.is(Aa)&&!Ra(t,i.value.from,i.value.to)){let{preparePlaceholder:n}=e.state.facet(Fa),s=n?ni.replace({widget:new za(n(e.state,i.value))}):Ha;t=t.update({add:[s.range(i.value.from,i.value.to)]})}else i.is(Ma)&&(t=t.update({filter:(t,e)=>i.value.from!=t||i.value.to!=e,filterFrom:i.value.from,filterTo:i.value.to}));if(e.selection){let i=!1,{head:n}=e.selection.main;t.between(n,n,((t,e)=>{tn&&(i=!0)})),i&&(t=t.update({filterFrom:n,filterTo:n,filter:(t,e)=>e<=n||t>=n}))}return t},provide:t=>Ks.decorations.from(t),toJSON(t,e){let i=[];return t.between(0,e.doc.length,((t,e)=>{i.push(t,e)})),i},fromJSON(t){if(!Array.isArray(t)||t.length%2)throw new RangeError("Invalid JSON for fold state");let e=[];for(let i=0;i{(!s||s.from>t)&&(s={from:t,to:e})})),s}function Ra(t,e,i){let n=!1;return t.between(e,e,((t,s)=>{t==e&&s==i&&(n=!0)})),n}function Ba(t,e){return t.field(Da,!1)?e:e.concat(dt.appendConfig.of(Va()))}function Na(t,e,i=!0){let n=t.state.doc.lineAt(e.from).number,s=t.state.doc.lineAt(e.to).number;return Ks.announce.of(`${t.state.phrase(i?"Folded lines":"Unfolded lines")} ${n} ${t.state.phrase("to")} ${s}.`)}const La=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:t=>{for(let e of Ta(t)){let i=Oa(t.state,e.from,e.to);if(i)return t.dispatch({effects:Ba(t.state,[Aa.of(i),Na(t,i)])}),!0}return!1}},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:t=>{if(!t.state.field(Da,!1))return!1;let e=[];for(let i of Ta(t)){let n=Ea(t.state,i.from,i.to);n&&e.push(Ma.of(n),Na(t,n,!1))}return e.length&&t.dispatch({effects:e}),e.length>0}},{key:"Ctrl-Alt-[",run:t=>{let{state:e}=t,i=[];for(let n=0;n{let e=t.state.field(Da,!1);if(!e||!e.size)return!1;let i=[];return e.between(0,t.state.doc.length,((t,e)=>{i.push(Ma.of({from:t,to:e}))})),t.dispatch({effects:i}),!0}}],Ia={placeholderDOM:null,preparePlaceholder:null,placeholderText:"…"},Fa=I.define({combine:t=>Ot(t,Ia)});function Va(t){return[Da,Qa]}function Wa(t,e){let{state:i}=t,n=i.facet(Fa),s=e=>{let i=t.lineBlockAt(t.posAtDOM(e.target)),n=Ea(t.state,i.from,i.to);n&&t.dispatch({effects:Ma.of(n)}),e.preventDefault()};if(n.placeholderDOM)return n.placeholderDOM(t,s,e);let r=document.createElement("span");return r.textContent=n.placeholderText,r.setAttribute("aria-label",i.phrase("folded code")),r.title=i.phrase("unfold"),r.className="cm-foldPlaceholder",r.onclick=s,r}const Ha=ni.replace({widget:new class extends ei{toDOM(t){return Wa(t,null)}}});class za extends ei{constructor(t){super(),this.value=t}eq(t){return this.value==t.value}toDOM(t){return Wa(t,this.value)}}const qa={openText:"⌄",closedText:"›",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1};class Xa extends wo{constructor(t,e){super(),this.config=t,this.open=e}eq(t){return this.config==t.config&&this.open==t.open}toDOM(t){if(this.config.markerDOM)return this.config.markerDOM(this.open);let e=document.createElement("span");return e.textContent=this.open?this.config.openText:this.config.closedText,e.title=t.state.phrase(this.open?"Fold line":"Unfold line"),e}}function Ua(t={}){let e=Object.assign(Object.assign({},qa),t),i=new Xa(e,!0),n=new Xa(e,!1),s=Gi.fromClass(class{constructor(t){this.from=t.viewport.from,this.markers=this.buildMarkers(t)}update(t){(t.docChanged||t.viewportChanged||t.startState.facet(la)!=t.state.facet(la)||t.startState.field(Da,!1)!=t.state.field(Da,!1)||Zl(t.startState)!=Zl(t.state)||e.foldingChanged(t))&&(this.markers=this.buildMarkers(t.view))}buildMarkers(t){let e=new Et;for(let s of t.viewportLineBlocks){let r=Ea(t.state,s.from,s.to)?n:Oa(t.state,s.from,s.to)?i:null;r&&e.add(s.from,s.from,r)}return e.finish()}}),{domEventHandlers:r}=e;return[s,Po({class:"cm-foldGutter",markers(t){var e;return(null===(e=t.plugin(s))||void 0===e?void 0:e.markers)||Dt.empty},initialSpacer:()=>new Xa(e,!1),domEventHandlers:Object.assign(Object.assign({},r),{click:(t,e,i)=>{if(r.click&&r.click(t,e,i))return!0;let n=Ea(t.state,e.from,e.to);if(n)return t.dispatch({effects:Ma.of(n)}),!0;let s=Oa(t.state,e.from,e.to);return!!s&&(t.dispatch({effects:Aa.of(s)}),!0)}})}),Va()]}const Qa=Ks.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}});class Ya{constructor(t,e){let i;function n(t){let e=$t.newName();return(i||(i=Object.create(null)))["."+e]=t,e}this.specs=t;const s="string"==typeof e.all?e.all:e.all?n(e.all):void 0,r=e.scope;this.scope=r instanceof jl?t=>t.prop($l)==r.data:r?t=>t==r:void 0,this.style=Al(t.map((t=>({tag:t.tag,class:t.class||n(Object.assign({},t,{tag:null}))}))),{all:s}).style,this.module=i?new $t(i):null,this.themeType=e.themeType}static define(t,e){return new Ya(t,e||{})}}const $a=I.define(),_a=I.define({combine:t=>t.length?[t[0]]:null});function ja(t){let e=t.facet($a);return e.length?e:t.facet(_a)}function Ka(t,e){let i,n=[Za];return t instanceof Ya&&(t.module&&n.push(Ks.styleModule.of(t.module)),i=t.themeType),(null==e?void 0:e.fallback)?n.push(_a.of(t)):i?n.push($a.computeN([Ks.darkTheme],(e=>e.facet(Ks.darkTheme)==("dark"==i)?[t]:[]))):n.push($a.of(t)),n}class Ga{constructor(t){this.markCache=Object.create(null),this.tree=Zl(t.state),this.decorations=this.buildDeco(t,ja(t.state)),this.decoratedTo=t.viewport.to}update(t){let e=Zl(t.state),i=ja(t.state),n=i!=ja(t.startState),{viewport:s}=t.view,r=t.changes.mapPos(this.decoratedTo,1);e.length=s.to?(this.decorations=this.decorations.map(t.changes),this.decoratedTo=r):(e!=this.tree||t.viewportChanged||n)&&(this.tree=e,this.decorations=this.buildDeco(t.view,i),this.decoratedTo=s.to)}buildDeco(t,e){if(!e||!this.tree.length)return ni.none;let i=new Et;for(let{from:n,to:s}of t.visibleRanges)Ml(this.tree,e,((t,e,n)=>{i.add(t,e,this.markCache[n]||(this.markCache[n]=ni.mark({class:n})))}),n,s);return i.finish()}}const Za=j.high(Gi.fromClass(Ga,{decorations:t=>t.decorations})),Ja=Ya.define([{tag:Ql.meta,color:"#404740"},{tag:Ql.link,textDecoration:"underline"},{tag:Ql.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Ql.emphasis,fontStyle:"italic"},{tag:Ql.strong,fontWeight:"bold"},{tag:Ql.strikethrough,textDecoration:"line-through"},{tag:Ql.keyword,color:"#708"},{tag:[Ql.atom,Ql.bool,Ql.url,Ql.contentSeparator,Ql.labelName],color:"#219"},{tag:[Ql.literal,Ql.inserted],color:"#164"},{tag:[Ql.string,Ql.deleted],color:"#a11"},{tag:[Ql.regexp,Ql.escape,Ql.special(Ql.string)],color:"#e40"},{tag:Ql.definition(Ql.variableName),color:"#00f"},{tag:Ql.local(Ql.variableName),color:"#30a"},{tag:[Ql.typeName,Ql.namespace],color:"#085"},{tag:Ql.className,color:"#167"},{tag:[Ql.special(Ql.variableName),Ql.macroName],color:"#256"},{tag:Ql.definition(Ql.propertyName),color:"#00c"},{tag:Ql.comment,color:"#940"},{tag:Ql.invalid,color:"#f00"}]),th=Ks.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),eh=1e4,ih="()[]{}",nh=I.define({combine:t=>Ot(t,{afterCursor:!0,brackets:ih,maxScanDistance:eh,renderMatch:oh})}),sh=ni.mark({class:"cm-matchingBracket"}),rh=ni.mark({class:"cm-nonmatchingBracket"});function oh(t){let e=[],i=t.matched?sh:rh;return e.push(i.range(t.start.from,t.start.to)),t.end&&e.push(i.range(t.end.from,t.end.to)),e}const lh=X.define({create:()=>ni.none,update(t,e){if(!e.docChanged&&!e.selection)return t;let i=[],n=e.state.facet(nh);for(let t of e.state.selection.ranges){if(!t.empty)continue;let s=fh(e.state,t.head,-1,n)||t.head>0&&fh(e.state,t.head-1,1,n)||n.afterCursor&&(fh(e.state,t.head,1,n)||t.headKs.decorations.from(t)}),ah=[lh,th];function hh(t={}){return[nh.of(t),ah]}const ch=new Qo;function uh(t,e,i){let n=t.prop(e<0?Qo.openedBy:Qo.closedBy);if(n)return n;if(1==t.name.length){let n=i.indexOf(t.name);if(n>-1&&n%2==(e<0?1:0))return[i[n+e]]}return null}function dh(t){let e=t.type.prop(ch);return e?e(t.node):t}function fh(t,e,i,n={}){let s=n.maxScanDistance||eh,r=n.brackets||ih,o=Zl(t),l=o.resolveInner(e,i);for(let n=l;n;n=n.parent){let s=uh(n.type,i,r);if(s&&n.from0?e>=o.from&&eo.from&&e<=o.to))return ph(t,e,i,n,o,s,r)}}return function(t,e,i,n,s,r,o){let l=i<0?t.sliceDoc(e-1,e):t.sliceDoc(e,e+1),a=o.indexOf(l);if(a<0||a%2==0!=i>0)return null;let h={from:i<0?e-1:e,to:i>0?e+1:e},c=t.doc.iterRange(e,i>0?t.doc.length:0),u=0;for(let t=0;!c.next().done&&t<=r;){let r=c.value;i<0&&(t+=r.length);let l=e+t*i;for(let t=i>0?0:r.length-1,e=i>0?r.length:-1;t!=e;t+=i){let e=o.indexOf(r[t]);if(!(e<0||n.resolveInner(l+t,1).type!=s))if(e%2==0==i>0)u++;else{if(1==u)return{start:h,end:{from:l+t,to:l+t+1},matched:e>>1==a>>1};u--}}i>0&&(t+=r.length)}return c.done?{start:h,matched:!1}:null}(t,e,i,o,l.type,s,r)}function ph(t,e,i,n,s,r,o){let l=n.parent,a={from:s.from,to:s.to},h=0,c=null==l?void 0:l.cursor();if(c&&(i<0?c.childBefore(n.from):c.childAfter(n.to)))do{if(i<0?c.to<=n.from:c.from>=n.to){if(0==h&&r.indexOf(c.type.name)>-1&&c.from-1||(vh.push(t),console.warn(e))}function xh(t,e){let i=[];for(let n of e.split(" ")){let e=[];for(let i of n.split(".")){let n=t[i]||Ql[i];n?"function"==typeof n?e.length?e=e.map(n):yh(i,`Modifier ${i} used at start of tag`):e.length?yh(i,`Tag ${i} used as modifier`):e=Array.isArray(n)?n:[n]:yh(i,`Unknown highlighting tag ${i}`)}for(let t of e)i.push(t)}if(!i.length)return 0;let n=e.replace(/ /g,"_"),s=n+" "+i.map((t=>t.id)),r=wh[s];if(r)return r.id;let o=wh[s]=_o.define({id:mh.length,name:n,props:[Sl({[n]:i})]});return mh.push(o),o.id}gi.RTL,gi.LTR;function kh(t,e){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=t(e,i);return!!s&&(n(i.update(s)),!0)}}const Ph=kh(Th,0),Sh=kh(Mh,0),Oh=kh(((t,e)=>Mh(t,e,function(t){let e=[];for(let i of t.selection.ranges){let n=t.doc.lineAt(i.from),s=i.to<=n.to?n:t.doc.lineAt(i.to),r=e.length-1;r>=0&&e[r].to>n.from?e[r].to=s.to:e.push({from:n.from+/^\s*/.exec(n.text)[0].length,to:s.to})}return e}(e))),0);function Ch(t,e){let i=t.languageDataAt("commentTokens",e);return i.length?i[0]:{}}const Ah=50;function Mh(t,e,i=e.selection.ranges){let n=i.map((t=>Ch(e,t.from).block));if(!n.every((t=>t)))return null;let s=i.map(((t,i)=>function(t,{open:e,close:i},n,s){let r,o,l=t.sliceDoc(n-Ah,n),a=t.sliceDoc(s,s+Ah),h=/\s*$/.exec(l)[0].length,c=/^\s*/.exec(a)[0].length,u=l.length-h;if(l.slice(u-e.length,u)==e&&a.slice(c,c+i.length)==i)return{open:{pos:n-h,margin:h&&1},close:{pos:s+c,margin:c&&1}};s-n<=2*Ah?r=o=t.sliceDoc(n,s):(r=t.sliceDoc(n,n+Ah),o=t.sliceDoc(s-Ah,s));let d=/^\s*/.exec(r)[0].length,f=/\s*$/.exec(o)[0].length,p=o.length-f-i.length;return r.slice(d,d+e.length)==e&&o.slice(p,p+i.length)==i?{open:{pos:n+d+e.length,margin:/\s/.test(r.charAt(d+e.length))?1:0},close:{pos:s-f-i.length,margin:/\s/.test(o.charAt(p-1))?1:0}}:null}(e,n[i],t.from,t.to)));if(2!=t&&!s.every((t=>t)))return{changes:e.changes(i.map(((t,e)=>s[e]?[]:[{from:t.from,insert:n[e].open+" "},{from:t.to,insert:" "+n[e].close}])))};if(1!=t&&s.some((t=>t))){let t=[];for(let e,i=0;is&&(t==r||r>a.from)){s=a.from;let t=/^\s*/.exec(a.text)[0].length,e=t==a.length,i=a.text.slice(t,t+l.length)==l?t:-1;tt.comment<0&&(!t.empty||t.single)))){let t=[];for(let{line:e,token:i,indent:s,empty:r,single:o}of n)!o&&r||t.push({from:e.from+s,insert:i+" "});let i=e.changes(t);return{changes:i,selection:e.selection.map(i,1)}}if(1!=t&&n.some((t=>t.comment>=0))){let t=[];for(let{line:e,comment:i,token:s}of n)if(i>=0){let n=e.from+i,r=n+s.length;" "==e.text[r-e.from]&&r++,t.push({from:n,to:r})}return{changes:t}}return null}const Dh=ht.define(),Eh=ht.define(),Rh=I.define(),Bh=I.define({combine:t=>Ot(t,{minDepth:100,newGroupDelay:500,joinToEvent:(t,e)=>e},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(t,e)=>(i,n)=>t(i,n)||e(i,n)})}),Nh=X.define({create:()=>Gh.empty,update(t,e){let i=e.state.facet(Bh),n=e.annotation(Dh);if(n){let s=zh.fromTransaction(e,n.selection),r=n.side,o=0==r?t.undone:t.done;return o=s?qh(o,o.length,i.minDepth,s):Yh(o,e.startState.selection),new Gh(0==r?n.rest:o,0==r?o:n.rest)}let s=e.annotation(Eh);if("full"!=s&&"before"!=s||(t=t.isolate()),!1===e.annotation(ft.addToHistory))return e.changes.empty?t:t.addMapping(e.changes.desc);let r=zh.fromTransaction(e),o=e.annotation(ft.time),l=e.annotation(ft.userEvent);return r?t=t.addChanges(r,o,l,i,e):e.selection&&(t=t.addSelection(e.startState.selection,o,l,i.newGroupDelay)),"full"!=s&&"after"!=s||(t=t.isolate()),t},toJSON:t=>({done:t.done.map((t=>t.toJSON())),undone:t.undone.map((t=>t.toJSON()))}),fromJSON:t=>new Gh(t.done.map(zh.fromJSON),t.undone.map(zh.fromJSON))});function Lh(t={}){return[Nh,Bh.of(t),Ks.domEventHandlers({beforeinput(t,e){let i="historyUndo"==t.inputType?Fh:"historyRedo"==t.inputType?Vh:null;return!!i&&(t.preventDefault(),i(e))}})]}function Ih(t,e){return function({state:i,dispatch:n}){if(!e&&i.readOnly)return!1;let s=i.field(Nh,!1);if(!s)return!1;let r=s.pop(t,i,e);return!!r&&(n(r),!0)}}const Fh=Ih(0,!1),Vh=Ih(1,!1),Wh=Ih(0,!0),Hh=Ih(1,!0);class zh{constructor(t,e,i,n,s){this.changes=t,this.effects=e,this.mapped=i,this.startSelection=n,this.selectionsAfter=s}setSelAfter(t){return new zh(this.changes,this.effects,this.mapped,this.startSelection,t)}toJSON(){var t,e,i;return{changes:null===(t=this.changes)||void 0===t?void 0:t.toJSON(),mapped:null===(e=this.mapped)||void 0===e?void 0:e.toJSON(),startSelection:null===(i=this.startSelection)||void 0===i?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map((t=>t.toJSON()))}}static fromJSON(t){return new zh(t.changes&&O.fromJSON(t.changes),[],t.mapped&&S.fromJSON(t.mapped),t.startSelection&&B.fromJSON(t.startSelection),t.selectionsAfter.map(B.fromJSON))}static fromTransaction(t,e){let i=Uh;for(let e of t.startState.facet(Rh)){let n=e(t);n.length&&(i=i.concat(n))}return!i.length&&t.changes.empty?null:new zh(t.changes.invert(t.startState.doc),i,void 0,e||t.startState.selection,Uh)}static selection(t){return new zh(void 0,Uh,void 0,void 0,t)}}function qh(t,e,i,n){let s=e+1>i+20?e-i-1:0,r=t.slice(s,e);return r.push(n),r}function Xh(t,e){return t.length?e.length?t.concat(e):t:e}const Uh=[],Qh=200;function Yh(t,e){if(t.length){let i=t[t.length-1],n=i.selectionsAfter.slice(Math.max(0,i.selectionsAfter.length-Qh));return n.length&&n[n.length-1].eq(e)?t:(n.push(e),qh(t,t.length-1,1e9,i.setSelAfter(n)))}return[zh.selection([e])]}function $h(t){let e=t[t.length-1],i=t.slice();return i[t.length-1]=e.setSelAfter(e.selectionsAfter.slice(0,e.selectionsAfter.length-1)),i}function _h(t,e){if(!t.length)return t;let i=t.length,n=Uh;for(;i;){let s=jh(t[i-1],e,n);if(s.changes&&!s.changes.empty||s.effects.length){let e=t.slice(0,i);return e[i-1]=s,e}e=s.mapped,i--,n=s.selectionsAfter}return n.length?[zh.selection(n)]:Uh}function jh(t,e,i){let n=Xh(t.selectionsAfter.length?t.selectionsAfter.map((t=>t.map(e))):Uh,i);if(!t.changes)return zh.selection(n);let s=t.changes.map(e),r=e.mapDesc(t.changes,!0),o=t.mapped?t.mapped.composeDesc(r):r;return new zh(s,dt.mapEffects(t.effects,e),o,t.startSelection.map(r),n)}const Kh=/^(input\.type|delete)($|\.)/;class Gh{constructor(t,e,i=0,n=void 0){this.done=t,this.undone=e,this.prevTime=i,this.prevUserEvent=n}isolate(){return this.prevTime?new Gh(this.done,this.undone):this}addChanges(t,e,i,n,s){let r=this.done,o=r[r.length-1];return r=o&&o.changes&&!o.changes.empty&&t.changes&&(!i||Kh.test(i))&&(!o.selectionsAfter.length&&e-this.prevTimei.push(t,e))),e.iterChangedRanges(((t,e,s,r)=>{for(let t=0;t=e&&s<=o&&(n=!0)}})),n}(o.changes,t.changes))||"input.type.compose"==i)?qh(r,r.length-1,n.minDepth,new zh(t.changes.compose(o.changes),Xh(t.effects,o.effects),o.mapped,o.startSelection,Uh)):qh(r,r.length,n.minDepth,t),new Gh(r,Uh,e,i)}addSelection(t,e,i,n){let s=this.done.length?this.done[this.done.length-1].selectionsAfter:Uh;return s.length>0&&e-this.prevTimet.empty!=o.ranges[e].empty)).length)?this:new Gh(Yh(this.done,t),this.undone,e,i);var r,o}addMapping(t){return new Gh(_h(this.done,t),_h(this.undone,t),this.prevTime,this.prevUserEvent)}pop(t,e,i){let n=0==t?this.done:this.undone;if(0==n.length)return null;let s=n[n.length-1],r=s.selectionsAfter[0]||e.selection;if(i&&s.selectionsAfter.length)return e.update({selection:s.selectionsAfter[s.selectionsAfter.length-1],annotations:Dh.of({side:t,rest:$h(n),selection:r}),userEvent:0==t?"select.undo":"select.redo",scrollIntoView:!0});if(s.changes){let i=1==n.length?Uh:n.slice(0,n.length-1);return s.mapped&&(i=_h(i,s.mapped)),e.update({changes:s.changes,selection:s.startSelection,effects:s.effects,annotations:Dh.of({side:t,rest:i,selection:r}),filter:!1,userEvent:0==t?"undo":"redo",scrollIntoView:!0})}return null}}Gh.empty=new Gh(Uh,Uh);const Zh=[{key:"Mod-z",run:Fh,preventDefault:!0},{key:"Mod-y",mac:"Mod-Shift-z",run:Vh,preventDefault:!0},{linux:"Ctrl-Shift-z",run:Vh,preventDefault:!0},{key:"Mod-u",run:Wh,preventDefault:!0},{key:"Alt-u",mac:"Mod-Shift-u",run:Hh,preventDefault:!0}];function Jh(t,e){return B.create(t.ranges.map(e),t.mainIndex)}function tc(t,e){return t.update({selection:e,scrollIntoView:!0,userEvent:"select"})}function ec({state:t,dispatch:e},i){let n=Jh(t.selection,i);return!n.eq(t.selection,!0)&&(e(tc(t,n)),!0)}function ic(t,e){return B.cursor(e?t.to:t.from)}function nc(t,e){return ec(t,(i=>i.empty?t.moveByChar(i,e):ic(i,e)))}function sc(t){return t.textDirectionAt(t.state.selection.main.head)==gi.LTR}const rc=t=>nc(t,!sc(t)),oc=t=>nc(t,sc(t));function lc(t,e){return ec(t,(i=>i.empty?t.moveByGroup(i,e):ic(i,e)))}function ac(t,e,i){if(e.type.prop(i))return!0;let n=e.to-e.from;return n&&(n>2||/[^\s,.;:]/.test(t.sliceDoc(e.from,e.to)))||e.firstChild}function hc(t,e,i){let n,s,r=Zl(t).resolveInner(e.head),o=i?Qo.closedBy:Qo.openedBy;for(let n=e.head;;){let e=i?r.childAfter(n):r.childBefore(n);if(!e)break;ac(t,e,o)?r=e:n=i?e.to:e.from}return s=r.type.prop(o)&&(n=i?fh(t,r.from,1):fh(t,r.to,-1))&&n.matched?i?n.end.to:n.end.from:i?r.to:r.from,B.cursor(s,i?-1:1)}function cc(t,e){return ec(t,(i=>{if(!i.empty)return ic(i,e);let n=t.moveVertically(i,e);return n.head!=i.head?n:t.moveToLineBoundary(i,e)}))}const uc=t=>cc(t,!1),dc=t=>cc(t,!0);function fc(t){let e,i=t.scrollDOM.clientHeighti.empty?t.moveVertically(i,e,n.height):ic(i,e)));if(r.eq(s.selection))return!1;if(n.selfScroll){let e=t.coordsAtPos(s.selection.main.head),o=t.scrollDOM.getBoundingClientRect(),l=o.top+n.marginTop,a=o.bottom-n.marginBottom;e&&e.top>l&&e.bottompc(t,!1),mc=t=>pc(t,!0);function vc(t,e,i){let n=t.lineBlockAt(e.head),s=t.moveToLineBoundary(e,i);if(s.head==e.head&&s.head!=(i?n.to:n.from)&&(s=t.moveToLineBoundary(e,i,!1)),!i&&s.head==n.from&&n.length){let i=/^\s*/.exec(t.state.sliceDoc(n.from,Math.min(n.from+100,n.to)))[0].length;i&&e.head!=n.from+i&&(s=B.cursor(n.from+i))}return s}function wc(t,e){let i=Jh(t.state.selection,(t=>{let i=e(t);return B.range(t.anchor,i.head,i.goalColumn,i.bidiLevel||void 0)}));return!i.eq(t.state.selection)&&(t.dispatch(tc(t.state,i)),!0)}function bc(t,e){return wc(t,(i=>t.moveByChar(i,e)))}const yc=t=>bc(t,!sc(t)),xc=t=>bc(t,sc(t));function kc(t,e){return wc(t,(i=>t.moveByGroup(i,e)))}function Pc(t,e){return wc(t,(i=>t.moveVertically(i,e)))}const Sc=t=>Pc(t,!1),Oc=t=>Pc(t,!0);function Cc(t,e){return wc(t,(i=>t.moveVertically(i,e,fc(t).height)))}const Ac=t=>Cc(t,!1),Mc=t=>Cc(t,!0),Tc=({state:t,dispatch:e})=>(e(tc(t,{anchor:0})),!0),Dc=({state:t,dispatch:e})=>(e(tc(t,{anchor:t.doc.length})),!0),Ec=({state:t,dispatch:e})=>(e(tc(t,{anchor:t.selection.main.anchor,head:0})),!0),Rc=({state:t,dispatch:e})=>(e(tc(t,{anchor:t.selection.main.anchor,head:t.doc.length})),!0);function Bc(t,e){if(t.state.readOnly)return!1;let i="delete.selection",{state:n}=t,s=n.changeByRange((n=>{let{from:s,to:r}=n;if(s==r){let o=e(n);os&&(i="delete.forward",o=Nc(t,o,!0)),s=Math.min(s,o),r=Math.max(r,o)}else s=Nc(t,s,!1),r=Nc(t,r,!0);return s==r?{range:n}:{changes:{from:s,to:r},range:B.cursor(s,se(t))))n.between(e,e,((t,n)=>{te&&(e=i?n:t)}));return e}const Lc=(t,e,i)=>Bc(t,(n=>{let s,r,o=n.from,{state:l}=t,a=l.doc.lineAt(o);if(i&&!e&&o>a.from&&oLc(t,!1,!0),Fc=t=>Lc(t,!0,!1),Vc=(t,e)=>Bc(t,(i=>{let n=i.head,{state:s}=t,r=s.doc.lineAt(n),o=s.charCategorizer(n);for(let t=null;;){if(n==(e?r.to:r.from)){n==i.head&&r.number!=(e?s.doc.lines:1)&&(n+=e?1:-1);break}let l=p(r.text,n-r.from,e)+r.from,a=r.text.slice(Math.min(n,l)-r.from,Math.max(n,l)-r.from),h=o(a);if(null!=t&&h!=t)break;" "==a&&n==i.head||(t=h),n=l}return n})),Wc=t=>Vc(t,!1);function Hc(t){let e=[],i=-1;for(let n of t.selection.ranges){let s=t.doc.lineAt(n.from),r=t.doc.lineAt(n.to);if(n.empty||n.to!=r.from||(r=t.doc.lineAt(n.to-1)),i>=s.number){let t=e[e.length-1];t.to=r.to,t.ranges.push(n)}else e.push({from:s.from,to:r.to,ranges:[n]});i=r.number+1}return e}function zc(t,e,i){if(t.readOnly)return!1;let n=[],s=[];for(let e of Hc(t)){if(i?e.to==t.doc.length:0==e.from)continue;let r=t.doc.lineAt(i?e.to+1:e.from-1),o=r.length+1;if(i){n.push({from:e.to,to:r.to},{from:e.from,insert:r.text+t.lineBreak});for(let i of e.ranges)s.push(B.range(Math.min(t.doc.length,i.anchor+o),Math.min(t.doc.length,i.head+o)))}else{n.push({from:r.from,to:e.from},{from:e.to,insert:t.lineBreak+r.text});for(let t of e.ranges)s.push(B.range(t.anchor-o,t.head-o))}}return!!n.length&&(e(t.update({changes:n,scrollIntoView:!0,selection:B.create(s,t.selection.mainIndex),userEvent:"move.line"})),!0)}function qc(t,e,i){if(t.readOnly)return!1;let n=[];for(let e of Hc(t))i?n.push({from:e.from,insert:t.doc.slice(e.from,e.to)+t.lineBreak}):n.push({from:e.to,insert:t.lineBreak+t.doc.slice(e.from,e.to)});return e(t.update({changes:n,scrollIntoView:!0,userEvent:"input.copyline"})),!0}const Xc=Uc(!1);function Uc(e){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=i.changeByRange((n=>{let{from:s,to:r}=n,o=i.doc.lineAt(s),l=!e&&s==r&&function(t,e){if(/\(\)|\[\]|\{\}/.test(t.sliceDoc(e-1,e+1)))return{from:e,to:e};let i,n=Zl(t).resolveInner(e),s=n.childBefore(e),r=n.childAfter(e);return s&&r&&s.to<=e&&r.from>=e&&(i=s.type.prop(Qo.closedBy))&&i.indexOf(r.name)>-1&&t.doc.lineAt(s.to).from==t.doc.lineAt(r.from).from&&!/\S/.test(t.sliceDoc(s.to,r.from))?{from:s.to,to:r.from}:null}(i,s);e&&(s=r=(r<=o.to?o:i.doc.lineAt(r)).to);let a=new pa(i,{simulateBreak:s,simulateDoubleBreak:!!l}),h=fa(a,s);for(null==h&&(h=qt(/^\s*/.exec(i.doc.lineAt(s).text)[0],i.tabSize));ro.from&&s{let s=[];for(let r=n.from;r<=n.to;){let o=t.doc.lineAt(r);o.number>i&&(n.empty||n.to>o.from)&&(e(o,s,n),i=o.number),r=o.to+1}let r=t.changes(s);return{changes:s,range:B.range(r.mapPos(n.anchor,1),r.mapPos(n.head,1))}}))}const Yc=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:t=>ec(t,(e=>hc(t.state,e,!sc(t)))),shift:t=>wc(t,(e=>hc(t.state,e,!sc(t))))},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:t=>ec(t,(e=>hc(t.state,e,sc(t)))),shift:t=>wc(t,(e=>hc(t.state,e,sc(t))))},{key:"Alt-ArrowUp",run:({state:t,dispatch:e})=>zc(t,e,!1)},{key:"Shift-Alt-ArrowUp",run:({state:t,dispatch:e})=>qc(t,e,!1)},{key:"Alt-ArrowDown",run:({state:t,dispatch:e})=>zc(t,e,!0)},{key:"Shift-Alt-ArrowDown",run:({state:t,dispatch:e})=>qc(t,e,!0)},{key:"Escape",run:({state:t,dispatch:e})=>{let i=t.selection,n=null;return i.ranges.length>1?n=B.create([i.main]):i.main.empty||(n=B.create([B.cursor(i.main.head)])),!!n&&(e(tc(t,n)),!0)}},{key:"Mod-Enter",run:Uc(!0)},{key:"Alt-l",mac:"Ctrl-l",run:({state:t,dispatch:e})=>{let i=Hc(t).map((({from:e,to:i})=>B.range(e,Math.min(i+1,t.doc.length))));return e(t.update({selection:B.create(i),userEvent:"select"})),!0}},{key:"Mod-i",run:({state:t,dispatch:e})=>{let i=Jh(t.selection,(e=>{var i;for(let n=Zl(t).resolveStack(e.from,1);n;n=n.next){let{node:t}=n;if((t.from=e.to||t.to>e.to&&t.from<=e.from)&&(null===(i=t.parent)||void 0===i?void 0:i.parent))return B.range(t.to,t.from)}return e}));return e(tc(t,i)),!0},preventDefault:!0},{key:"Mod-[",run:({state:t,dispatch:e})=>!t.readOnly&&(e(t.update(Qc(t,((e,i)=>{let n=/^\s*/.exec(e.text)[0];if(!n)return;let s=qt(n,t.tabSize),r=0,o=da(t,Math.max(0,s-ua(t)));for(;r!t.readOnly&&(e(t.update(Qc(t,((e,i)=>{i.push({from:e.from,insert:t.facet(ca)})})),{userEvent:"input.indent"})),!0)},{key:"Mod-Alt-\\",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=Object.create(null),n=new pa(t,{overrideIndentation:t=>{let e=i[t];return null==e?-1:e}}),s=Qc(t,((e,s,r)=>{let o=fa(n,e.from);if(null==o)return;/\S/.test(e.text)||(o=0);let l=/^\s*/.exec(e.text)[0],a=da(t,o);(l!=a||r.from{if(t.state.readOnly)return!1;let{state:e}=t,i=e.changes(Hc(e).map((({from:t,to:i})=>(t>0?t--:i{let i;if(t.lineWrapping){let n=t.lineBlockAt(e.head),s=t.coordsAtPos(e.head,e.assoc||1);s&&(i=n.bottom+t.documentTop-s.bottom+t.defaultLineHeight/2)}return t.moveVertically(e,!0,i)})).map(i);return t.dispatch({changes:i,selection:n,scrollIntoView:!0,userEvent:"delete.line"}),!0}},{key:"Shift-Mod-\\",run:({state:t,dispatch:e})=>function(t,e){let i=!1,n=Jh(t.selection,(e=>{let n=fh(t,e.head,-1)||fh(t,e.head,1)||e.head>0&&fh(t,e.head-1,1)||e.head{let{state:e}=t,i=e.doc.lineAt(e.selection.main.from),n=Ch(t.state,i.from);return n.line?Ph(t):!!n.block&&Oh(t)}},{key:"Alt-A",run:Sh},{key:"Ctrl-m",mac:"Shift-Alt-m",run:t=>(t.setTabFocusMode(),!0)}].concat([{key:"ArrowLeft",run:rc,shift:yc,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:t=>lc(t,!sc(t)),shift:t=>kc(t,!sc(t)),preventDefault:!0},{mac:"Cmd-ArrowLeft",run:t=>ec(t,(e=>vc(t,e,!sc(t)))),shift:t=>wc(t,(e=>vc(t,e,!sc(t)))),preventDefault:!0},{key:"ArrowRight",run:oc,shift:xc,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:t=>lc(t,sc(t)),shift:t=>kc(t,sc(t)),preventDefault:!0},{mac:"Cmd-ArrowRight",run:t=>ec(t,(e=>vc(t,e,sc(t)))),shift:t=>wc(t,(e=>vc(t,e,sc(t)))),preventDefault:!0},{key:"ArrowUp",run:uc,shift:Sc,preventDefault:!0},{mac:"Cmd-ArrowUp",run:Tc,shift:Ec},{mac:"Ctrl-ArrowUp",run:gc,shift:Ac},{key:"ArrowDown",run:dc,shift:Oc,preventDefault:!0},{mac:"Cmd-ArrowDown",run:Dc,shift:Rc},{mac:"Ctrl-ArrowDown",run:mc,shift:Mc},{key:"PageUp",run:gc,shift:Ac},{key:"PageDown",run:mc,shift:Mc},{key:"Home",run:t=>ec(t,(e=>vc(t,e,!1))),shift:t=>wc(t,(e=>vc(t,e,!1))),preventDefault:!0},{key:"Mod-Home",run:Tc,shift:Ec},{key:"End",run:t=>ec(t,(e=>vc(t,e,!0))),shift:t=>wc(t,(e=>vc(t,e,!0))),preventDefault:!0},{key:"Mod-End",run:Dc,shift:Rc},{key:"Enter",run:Xc},{key:"Mod-a",run:({state:t,dispatch:e})=>(e(t.update({selection:{anchor:0,head:t.doc.length},userEvent:"select"})),!0)},{key:"Backspace",run:Ic,shift:Ic},{key:"Delete",run:Fc},{key:"Mod-Backspace",mac:"Alt-Backspace",run:Wc},{key:"Mod-Delete",mac:"Alt-Delete",run:t=>Vc(t,!0)},{mac:"Mod-Backspace",run:t=>Bc(t,(e=>{let i=t.moveToLineBoundary(e,!1).head;return e.head>i?i:Math.max(0,e.head-1)}))},{mac:"Mod-Delete",run:t=>Bc(t,(e=>{let i=t.moveToLineBoundary(e,!0).head;return e.headec(t,(e=>B.cursor(t.lineBlockAt(e.head).from,1))),shift:t=>wc(t,(e=>B.cursor(t.lineBlockAt(e.head).from)))},{key:"Ctrl-e",run:t=>ec(t,(e=>B.cursor(t.lineBlockAt(e.head).to,-1))),shift:t=>wc(t,(e=>B.cursor(t.lineBlockAt(e.head).to)))},{key:"Ctrl-d",run:Fc},{key:"Ctrl-h",run:Ic},{key:"Ctrl-k",run:t=>Bc(t,(e=>{let i=t.lineBlockAt(e.head).to;return e.head{if(e.readOnly)return!1;let n=e.changeByRange((e=>({changes:{from:e.from,to:e.to,insert:t.of(["",""])},range:B.cursor(e.from)})));return i(e.update(n,{scrollIntoView:!0,userEvent:"input"})),!0}},{key:"Ctrl-t",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=t.changeByRange((e=>{if(!e.empty||0==e.from||e.from==t.doc.length)return{range:e};let i=e.from,n=t.doc.lineAt(i),s=i==n.from?i-1:p(n.text,i-n.from,!1)+n.from,r=i==n.to?i+1:p(n.text,i-n.from,!0)+n.from;return{changes:{from:s,to:r,insert:t.doc.slice(i,r).append(t.doc.slice(s,i))},range:B.cursor(r)}}));return!i.changes.empty&&(e(t.update(i,{scrollIntoView:!0,userEvent:"move.character"})),!0)}},{key:"Ctrl-v",run:mc}].map((t=>({mac:t.key,run:t.run,shift:t.shift})))));function $c(){var t=arguments[0];"string"==typeof t&&(t=document.createElement(t));var e=1,i=arguments[1];if(i&&"object"==typeof i&&null==i.nodeType&&!Array.isArray(i)){for(var n in i)if(Object.prototype.hasOwnProperty.call(i,n)){var s=i[n];"string"==typeof s?t.setAttribute(n,s):null!=s&&(t[n]=s)}e++}for(;et.normalize("NFKD"):t=>t;class Kc{constructor(t,e,i=0,n=t.length,s,r){this.test=r,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=t.iterRange(i,n),this.bufferStart=i,this.normalize=s?t=>s(jc(t)):jc,this.query=this.normalize(e)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return b(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let t=this.peek();if(t<0)return this.done=!0,this;let e=y(t),i=this.bufferStart+this.bufferPos;this.bufferPos+=x(t);let n=this.normalize(e);for(let t=0,s=i;;t++){let r=n.charCodeAt(t),o=this.match(r,s,this.bufferPos+this.bufferStart);if(t==n.length-1){if(o)return this.value=o,this;break}s==i&&tthis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let t=this.matchPos-this.curLineStart;;){this.re.lastIndex=t;let e=this.matchPos<=this.to&&this.re.exec(this.curLine);if(e){let i=this.curLineStart+e.index,n=i+e[0].length;if(this.matchPos=nu(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,n,e)))return this.value={from:i,to:n,match:e},this;t=this.matchPos-this.curLineStart}else{if(!(this.curLineStart+this.curLine.length=i||n.to<=e){let n=new eu(e,t.sliceString(e,i));return tu.set(t,n),n}if(n.from==e&&n.to==i)return n;let{text:s,from:r}=n;return r>e&&(s=t.sliceString(e,r)+s,r=e),n.to=this.to?this.to:this.text.lineAt(t).to}next(){for(;;){let t=this.re.lastIndex=this.matchPos-this.flat.from,e=this.re.exec(this.flat.text);if(e&&!e[0]&&e.index==t&&(this.re.lastIndex=t+1,e=this.re.exec(this.flat.text)),e){let t=this.flat.from+e.index,i=t+e[0].length;if((this.flat.to>=this.to||e.index+e[0].length<=this.flat.text.length-10)&&(!this.test||this.test(t,i,e)))return this.value={from:t,to:i,match:e},this.matchPos=nu(this.text,i+(t==i?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=eu.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+2*this.flat.text.length))}}}function nu(t,e){if(e>=t.length)return e;let i,n=t.lineAt(e);for(;e=56320&&i<57344;)e++;return e}function su(t){let e=$c("input",{class:"cm-textfield",name:"line",value:String(t.state.doc.lineAt(t.state.selection.main.head).number)});function i(){let i=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(e.value);if(!i)return;let{state:n}=t,s=n.doc.lineAt(n.selection.main.head),[,r,o,l,a]=i,h=l?+l.slice(1):0,c=o?+o:s.number;if(o&&a){let t=c/100;r&&(t=t*("-"==r?-1:1)+s.number/n.doc.lines),c=Math.round(n.doc.lines*t)}else o&&r&&(c=c*("-"==r?-1:1)+s.number);let u=n.doc.line(Math.max(1,Math.min(n.doc.lines,c))),d=B.cursor(u.from+Math.max(0,Math.min(h,u.length)));t.dispatch({effects:[ru.of(!1),Ks.scrollIntoView(d.from,{y:"center"})],selection:d}),t.focus()}return{dom:$c("form",{class:"cm-gotoLine",onkeydown:e=>{27==e.keyCode?(e.preventDefault(),t.dispatch({effects:ru.of(!1)}),t.focus()):13==e.keyCode&&(e.preventDefault(),i())},onsubmit:t=>{t.preventDefault(),i()}},$c("label",t.state.phrase("Go to line"),": ",e)," ",$c("button",{class:"cm-button",type:"submit"},t.state.phrase("go")))}}"undefined"!=typeof Symbol&&(Jc.prototype[Symbol.iterator]=iu.prototype[Symbol.iterator]=function(){return this});const ru=dt.define(),ou=X.define({create:()=>!0,update(t,e){for(let i of e.effects)i.is(ru)&&(t=i.value);return t},provide:t=>vo.from(t,(t=>t?su:null))}),lu=Ks.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px","& label":{fontSize:"80%"}}}),au={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},hu=I.define({combine:t=>Ot(t,au,{highlightWordAroundCursor:(t,e)=>t||e,minSelectionLength:Math.min,maxMatches:Math.min})});const cu=ni.mark({class:"cm-selectionMatch"}),uu=ni.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function du(t,e,i,n){return!(0!=i&&t(e.sliceDoc(i-1,i))==yt.Word||n!=e.doc.length&&t(e.sliceDoc(n,n+1))==yt.Word)}const fu=Gi.fromClass(class{constructor(t){this.decorations=this.getDeco(t)}update(t){(t.selectionSet||t.docChanged||t.viewportChanged)&&(this.decorations=this.getDeco(t.view))}getDeco(t){let e=t.state.facet(hu),{state:i}=t,n=i.selection;if(n.ranges.length>1)return ni.none;let s,r=n.main,o=null;if(r.empty){if(!e.highlightWordAroundCursor)return ni.none;let t=i.wordAt(r.head);if(!t)return ni.none;o=i.charCategorizer(r.head),s=i.sliceDoc(t.from,t.to)}else{let t=r.to-r.from;if(t200)return ni.none;if(e.wholeWords){if(s=i.sliceDoc(r.from,r.to),o=i.charCategorizer(r.head),!du(o,i,r.from,r.to)||!function(t,e,i,n){return t(e.sliceDoc(i,i+1))==yt.Word&&t(e.sliceDoc(n-1,n))==yt.Word}(o,i,r.from,r.to))return ni.none}else if(s=i.sliceDoc(r.from,r.to),!s)return ni.none}let l=[];for(let n of t.visibleRanges){let t=new Kc(i.doc,s,n.from,n.to);for(;!t.next().done;){let{from:n,to:s}=t.value;if((!o||du(o,i,n,s))&&(r.empty&&n<=r.from&&s>=r.to?l.push(uu.range(n,s)):(n>=r.to||s<=r.from)&&l.push(cu.range(n,s)),l.length>e.maxMatches))return ni.none}}return ni.set(l)}},{decorations:t=>t.decorations}),pu=Ks.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}});const gu=I.define({combine:t=>Ot(t,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:t=>new Uu(t),scrollToMatch:t=>Ks.scrollIntoView(t)})});class mu{constructor(t){this.search=t.search,this.caseSensitive=!!t.caseSensitive,this.literal=!!t.literal,this.regexp=!!t.regexp,this.replace=t.replace||"",this.valid=!!this.search&&(!this.regexp||function(t){try{return new RegExp(t,Zc),!0}catch(t){return!1}}(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!t.wholeWord}unquote(t){return this.literal?t:t.replace(/\\([nrt\\])/g,((t,e)=>"n"==e?"\n":"r"==e?"\r":"t"==e?"\t":"\\"))}eq(t){return this.search==t.search&&this.replace==t.replace&&this.caseSensitive==t.caseSensitive&&this.regexp==t.regexp&&this.wholeWord==t.wholeWord}create(){return this.regexp?new Pu(this):new bu(this)}getCursor(t,e=0,i){let n=t.doc?t:St.create({doc:t});return null==i&&(i=n.doc.length),this.regexp?yu(this,n,e,i):wu(this,n,e,i)}}class vu{constructor(t){this.spec=t}}function wu(t,e,i,n){return new Kc(e.doc,t.unquoted,i,n,t.caseSensitive?void 0:t=>t.toLowerCase(),t.wholeWord?function(t,e){return(i,n,s,r)=>((r>i||r+s.length=e)return null;n.push(i.value)}return n}highlight(t,e,i,n){let s=wu(this.spec,t,Math.max(0,e-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,t.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}function yu(t,e,i,n){return new Jc(e.doc,t.search,{ignoreCase:!t.caseSensitive,test:t.wholeWord?(s=e.charCategorizer(e.selection.main.head),(t,e,i)=>!i[0].length||(s(xu(i.input,i.index))!=yt.Word||s(ku(i.input,i.index))!=yt.Word)&&(s(ku(i.input,i.index+i[0].length))!=yt.Word||s(xu(i.input,i.index+i[0].length))!=yt.Word)):void 0},i,n);var s}function xu(t,e){return t.slice(p(t,e,!1),e)}function ku(t,e){return t.slice(e,p(t,e))}class Pu extends vu{nextMatch(t,e,i){let n=yu(this.spec,t,i,t.doc.length).next();return n.done&&(n=yu(this.spec,t,0,e).next()),n.done?null:n.value}prevMatchInRange(t,e,i){for(let n=1;;n++){let s=Math.max(e,i-1e4*n),r=yu(this.spec,t,s,i),o=null;for(;!r.next().done;)o=r.value;if(o&&(s==e||o.from>s+10))return o;if(s==e)return null}}prevMatch(t,e,i){return this.prevMatchInRange(t,0,e)||this.prevMatchInRange(t,i,t.doc.length)}getReplacement(t){return this.spec.unquote(this.spec.replace).replace(/\$([$&\d+])/g,((e,i)=>"$"==i?"$":"&"==i?t.match[0]:"0"!=i&&+i=e)return null;n.push(i.value)}return n}highlight(t,e,i,n){let s=yu(this.spec,t,Math.max(0,e-250),Math.min(i+250,t.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}const Su=dt.define(),Ou=dt.define(),Cu=X.define({create:t=>new Au(Vu(t).create(),null),update(t,e){for(let i of e.effects)i.is(Su)?t=new Au(i.value.create(),t.panel):i.is(Ou)&&(t=new Au(t.query,i.value?Fu:null));return t},provide:t=>vo.from(t,(t=>t.panel))});class Au{constructor(t,e){this.query=t,this.panel=e}}const Mu=ni.mark({class:"cm-searchMatch"}),Tu=ni.mark({class:"cm-searchMatch cm-searchMatch-selected"}),Du=Gi.fromClass(class{constructor(t){this.view=t,this.decorations=this.highlight(t.state.field(Cu))}update(t){let e=t.state.field(Cu);(e!=t.startState.field(Cu)||t.docChanged||t.selectionSet||t.viewportChanged)&&(this.decorations=this.highlight(e))}highlight({query:t,panel:e}){if(!e||!t.spec.valid)return ni.none;let{view:i}=this,n=new Et;for(let e=0,s=i.visibleRanges,r=s.length;es[e+1].from-500;)l=s[++e].to;t.highlight(i.state,o,l,((t,e)=>{let s=i.state.selection.ranges.some((i=>i.from==t&&i.to==e));n.add(t,e,s?Tu:Mu)}))}return n.finish()}},{decorations:t=>t.decorations});function Eu(t){return e=>{let i=e.state.field(Cu,!1);return i&&i.query.spec.valid?t(e,i):zu(e)}}const Ru=Eu(((t,{query:e})=>{let{to:i}=t.state.selection.main,n=e.nextMatch(t.state,i,i);if(!n)return!1;let s=B.single(n.from,n.to),r=t.state.facet(gu);return t.dispatch({selection:s,effects:[_u(t,n),r.scrollToMatch(s.main,t)],userEvent:"select.search"}),Hu(t),!0})),Bu=Eu(((t,{query:e})=>{let{state:i}=t,{from:n}=i.selection.main,s=e.prevMatch(i,n,n);if(!s)return!1;let r=B.single(s.from,s.to),o=t.state.facet(gu);return t.dispatch({selection:r,effects:[_u(t,s),o.scrollToMatch(r.main,t)],userEvent:"select.search"}),Hu(t),!0})),Nu=Eu(((t,{query:e})=>{let i=e.matchAll(t.state,1e3);return!(!i||!i.length)&&(t.dispatch({selection:B.create(i.map((t=>B.range(t.from,t.to)))),userEvent:"select.search.matches"}),!0)})),Lu=Eu(((t,{query:e})=>{let{state:i}=t,{from:n,to:s}=i.selection.main;if(i.readOnly)return!1;let r=e.nextMatch(i,n,n);if(!r)return!1;let o,l,a=[],h=[];if(r.from==n&&r.to==s&&(l=i.toText(e.getReplacement(r)),a.push({from:r.from,to:r.to,insert:l}),r=e.nextMatch(i,r.from,r.to),h.push(Ks.announce.of(i.phrase("replaced match on line $",i.doc.lineAt(n).number)+"."))),r){let e=0==a.length||a[0].from>=r.to?0:r.to-r.from-l.length;o=B.single(r.from-e,r.to-e),h.push(_u(t,r)),h.push(i.facet(gu).scrollToMatch(o.main,t))}return t.dispatch({changes:a,selection:o,effects:h,userEvent:"input.replace"}),!0})),Iu=Eu(((t,{query:e})=>{if(t.state.readOnly)return!1;let i=e.matchAll(t.state,1e9).map((t=>{let{from:i,to:n}=t;return{from:i,to:n,insert:e.getReplacement(t)}}));if(!i.length)return!1;let n=t.state.phrase("replaced $ matches",i.length)+".";return t.dispatch({changes:i,effects:Ks.announce.of(n),userEvent:"input.replace.all"}),!0}));function Fu(t){return t.state.facet(gu).createPanel(t)}function Vu(t,e){var i,n,s,r,o;let l=t.selection.main,a=l.empty||l.to>l.from+100?"":t.sliceDoc(l.from,l.to);if(e&&!a)return e;let h=t.facet(gu);return new mu({search:(null!==(i=null==e?void 0:e.literal)&&void 0!==i?i:h.literal)?a:a.replace(/\n/g,"\\n"),caseSensitive:null!==(n=null==e?void 0:e.caseSensitive)&&void 0!==n?n:h.caseSensitive,literal:null!==(s=null==e?void 0:e.literal)&&void 0!==s?s:h.literal,regexp:null!==(r=null==e?void 0:e.regexp)&&void 0!==r?r:h.regexp,wholeWord:null!==(o=null==e?void 0:e.wholeWord)&&void 0!==o?o:h.wholeWord})}function Wu(t){let e=fo(t,Fu);return e&&e.dom.querySelector("[main-field]")}function Hu(t){let e=Wu(t);e&&e==t.root.activeElement&&e.select()}const zu=t=>{let e=t.state.field(Cu,!1);if(e&&e.panel){let i=Wu(t);if(i&&i!=t.root.activeElement){let n=Vu(t.state,e.query.spec);n.valid&&t.dispatch({effects:Su.of(n)}),i.focus(),i.select()}}else t.dispatch({effects:[Ou.of(!0),e?Su.of(Vu(t.state,e.query.spec)):dt.appendConfig.of(Ku)]});return!0},qu=t=>{let e=t.state.field(Cu,!1);if(!e||!e.panel)return!1;let i=fo(t,Fu);return i&&i.dom.contains(t.root.activeElement)&&t.focus(),t.dispatch({effects:Ou.of(!1)}),!0},Xu=[{key:"Mod-f",run:zu,scope:"editor search-panel"},{key:"F3",run:Ru,shift:Bu,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:Ru,shift:Bu,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:qu,scope:"editor search-panel"},{key:"Mod-Shift-l",run:({state:t,dispatch:e})=>{let i=t.selection;if(i.ranges.length>1||i.main.empty)return!1;let{from:n,to:s}=i.main,r=[],o=0;for(let e=new Kc(t.doc,t.sliceDoc(n,s));!e.next().done;){if(r.length>1e3)return!1;e.value.from==n&&(o=r.length),r.push(B.range(e.value.from,e.value.to))}return e(t.update({selection:B.create(r,o),userEvent:"select.search.matches"})),!0}},{key:"Mod-Alt-g",run:t=>{let e=fo(t,su);if(!e){let i=[ru.of(!0)];null==t.state.field(ou,!1)&&i.push(dt.appendConfig.of([ou,lu])),t.dispatch({effects:i}),e=fo(t,su)}return e&&e.dom.querySelector("input").select(),!0}},{key:"Mod-d",run:({state:t,dispatch:e})=>{let{ranges:i}=t.selection;if(i.some((t=>t.from===t.to)))return(({state:t,dispatch:e})=>{let{selection:i}=t,n=B.create(i.ranges.map((e=>t.wordAt(e.head)||B.cursor(e.head))),i.mainIndex);return!n.eq(i)&&(e(t.update({selection:n})),!0)})({state:t,dispatch:e});let n=t.sliceDoc(i[0].from,i[0].to);if(t.selection.ranges.some((e=>t.sliceDoc(e.from,e.to)!=n)))return!1;let s=function(t,e){let{main:i,ranges:n}=t.selection,s=t.wordAt(i.head),r=s&&s.from==i.from&&s.to==i.to;for(let i=!1,s=new Kc(t.doc,e,n[n.length-1].to);;){if(s.next(),!s.done){if(i&&n.some((t=>t.from==s.value.from)))continue;if(r){let e=t.wordAt(s.value.from);if(!e||e.from!=s.value.from||e.to!=s.value.to)continue}return s.value}if(i)return null;s=new Kc(t.doc,e,0,Math.max(0,n[n.length-1].from-1)),i=!0}}(t,n);return!!s&&(e(t.update({selection:t.selection.addRange(B.range(s.from,s.to),!1),effects:Ks.scrollIntoView(s.to)})),!0)},preventDefault:!0}];class Uu{constructor(t){this.view=t;let e=this.query=t.state.field(Cu).query.spec;function i(t,e,i){return $c("button",{class:"cm-button",name:t,onclick:e,type:"button"},i)}this.commit=this.commit.bind(this),this.searchField=$c("input",{value:e.search,placeholder:Qu(t,"Find"),"aria-label":Qu(t,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=$c("input",{value:e.replace,placeholder:Qu(t,"Replace"),"aria-label":Qu(t,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=$c("input",{type:"checkbox",name:"case",form:"",checked:e.caseSensitive,onchange:this.commit}),this.reField=$c("input",{type:"checkbox",name:"re",form:"",checked:e.regexp,onchange:this.commit}),this.wordField=$c("input",{type:"checkbox",name:"word",form:"",checked:e.wholeWord,onchange:this.commit}),this.dom=$c("div",{onkeydown:t=>this.keydown(t),class:"cm-search"},[this.searchField,i("next",(()=>Ru(t)),[Qu(t,"next")]),i("prev",(()=>Bu(t)),[Qu(t,"previous")]),i("select",(()=>Nu(t)),[Qu(t,"all")]),$c("label",null,[this.caseField,Qu(t,"match case")]),$c("label",null,[this.reField,Qu(t,"regexp")]),$c("label",null,[this.wordField,Qu(t,"by word")]),...t.state.readOnly?[]:[$c("br"),this.replaceField,i("replace",(()=>Lu(t)),[Qu(t,"replace")]),i("replaceAll",(()=>Iu(t)),[Qu(t,"replace all")])],$c("button",{name:"close",onclick:()=>qu(t),"aria-label":Qu(t,"close"),type:"button"},["×"])])}commit(){let t=new mu({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});t.eq(this.query)||(this.query=t,this.view.dispatch({effects:Su.of(t)}))}keydown(t){var e,i,n;e=this.view,i=t,n="search-panel",cr(or(e.state),i,e,n)?t.preventDefault():13==t.keyCode&&t.target==this.searchField?(t.preventDefault(),(t.shiftKey?Bu:Ru)(this.view)):13==t.keyCode&&t.target==this.replaceField&&(t.preventDefault(),Lu(this.view))}update(t){for(let e of t.transactions)for(let t of e.effects)t.is(Su)&&!t.value.eq(this.query)&&this.setQuery(t.value)}setQuery(t){this.query=t,this.searchField.value=t.search,this.replaceField.value=t.replace,this.caseField.checked=t.caseSensitive,this.reField.checked=t.regexp,this.wordField.checked=t.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(gu).top}}function Qu(t,e){return t.state.phrase(e)}const Yu=30,$u=/[\s\.,:;?!]/;function _u(t,{from:e,to:i}){let n=t.state.doc.lineAt(e),s=t.state.doc.lineAt(i).to,r=Math.max(n.from,e-Yu),o=Math.min(s,i+Yu),l=t.state.sliceDoc(r,o);if(r!=n.from)for(let t=0;tl.length-Yu;t--)if(!$u.test(l[t-1])&&$u.test(l[t])){l=l.slice(0,t);break}return Ks.announce.of(`${t.state.phrase("current match")}. ${l} ${t.state.phrase("on line")} ${n.number}.`)}const ju=Ks.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),Ku=[Cu,j.low(Du),ju];class Gu{constructor(t,e,i,n){this.state=t,this.pos=e,this.explicit=i,this.view=n,this.abortListeners=[],this.abortOnDocChange=!1}tokenBefore(t){let e=Zl(this.state).resolveInner(this.pos,-1);for(;e&&t.indexOf(e.name)<0;)e=e.parent;return e?{from:e.from,to:this.pos,text:this.state.sliceDoc(e.from,this.pos),type:e.type}:null}matchBefore(t){let e=this.state.doc.lineAt(this.pos),i=Math.max(e.from,this.pos-250),n=e.text.slice(i-e.from,this.pos-e.from),s=n.search(id(t,!1));return s<0?null:{from:i+s,to:this.pos,text:n.slice(s)}}get aborted(){return null==this.abortListeners}addEventListener(t,e,i){"abort"==t&&this.abortListeners&&(this.abortListeners.push(e),i&&i.onDocChange&&(this.abortOnDocChange=!0))}}function Zu(t){let e=Object.keys(t).join(""),i=/\w/.test(e);return i&&(e=e.replace(/\w/g,"")),`[${i?"\\w":""}${e.replace(/[^\w\s]/g,"\\$&")}]`}function Ju(t){let e=t.map((t=>"string"==typeof t?{label:t}:t)),[i,n]=e.every((t=>/^\w+$/.test(t.label)))?[/\w*$/,/\w+$/]:function(t){let e=Object.create(null),i=Object.create(null);for(let{label:n}of t){e[n[0]]=!0;for(let t=1;t{let s=t.matchBefore(n);return s||t.explicit?{from:s?s.from:t.pos,options:e,validFor:i}:null}}class td{constructor(t,e,i,n){this.completion=t,this.source=e,this.match=i,this.score=n}}function ed(t){return t.selection.main.from}function id(t,e){var i;let{source:n}=t,s=e&&"^"!=n[0],r="$"!=n[n.length-1];return s||r?new RegExp(`${s?"^":""}(?:${n})${r?"$":""}`,null!==(i=t.flags)&&void 0!==i?i:t.ignoreCase?"i":""):t}const nd=ht.define();const sd=new WeakMap;function rd(t){if(!Array.isArray(t))return t;let e=sd.get(t);return e||sd.set(t,e=Ju(t)),e}const od=dt.define(),ld=dt.define();class ad{constructor(t){this.pattern=t,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let e=0;e=48&&a<=57||a>=97&&a<=122?2:a>=65&&a<=90?1:0:(w=y(a))!=w.toLowerCase()?1:w!=w.toUpperCase()?2:0;(!n||1==k&&g||0==v&&0!=k)&&(e[c]==a||i[c]==a&&(u=!0)?r[c++]=n:r.length&&(m=!1)),v=k,n+=x(a)}return c==l&&0==r[0]&&m?this.result((u?-200:0)-100,r,t):d==l&&0==f?this.ret(-200-t.length+(p==t.length?0:-100),[0,p]):o>-1?this.ret(-700-t.length,[o,o+this.pattern.length]):d==l?this.ret(-900-t.length,[f,p]):c==l?this.result((u?-200:0)-100-700+(m?0:-1100),r,t):2==e.length?null:this.result((n[0]?-700:0)-200-1100,n,t)}result(t,e,i){let n=[],s=0;for(let t of e){let e=t+(this.astral?x(b(i,t)):1);s&&n[s-1]==t?n[s-1]=e:(n[s++]=t,n[s++]=e)}return this.ret(t-i.length,n)}}class hd{constructor(t){this.pattern=t,this.matched=[],this.score=0,this.folded=t.toLowerCase()}match(t){if(t.lengthOt(t,{activateOnTyping:!0,activateOnCompletion:()=>!1,activateOnTypingDelay:100,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:dd,filterStrict:!1,compareCompletions:(t,e)=>t.label.localeCompare(e.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(t,e)=>t&&e,closeOnBlur:(t,e)=>t&&e,icons:(t,e)=>t&&e,tooltipClass:(t,e)=>i=>ud(t(i),e(i)),optionClass:(t,e)=>i=>ud(t(i),e(i)),addToOptions:(t,e)=>t.concat(e),filterStrict:(t,e)=>t||e})});function ud(t,e){return t?e?t+" "+e:t:e}function dd(t,e,i,n,s,r){let o,l,a=t.textDirection==gi.RTL,h=a,c=!1,u="top",d=e.left-s.left,f=s.right-e.right,p=n.right-n.left,g=n.bottom-n.top;if(h&&d=g||t>e.top?o=i.bottom-e.top:(u="bottom",o=e.bottom-i.top)}return{style:`${u}: ${o/((e.bottom-e.top)/r.offsetHeight)}px; max-width: ${l/((e.right-e.left)/r.offsetWidth)}px`,class:"cm-completionInfo-"+(c?a?"left-narrow":"right-narrow":h?"left":"right")}}function fd(t,e,i){if(t<=i)return{from:0,to:t};if(e<0&&(e=0),e<=t>>1){let t=Math.floor(e/i);return{from:t*i,to:(t+1)*i}}let n=Math.floor((t-e)/i);return{from:t-(n+1)*i,to:t-n*i}}class pd{constructor(t,e,i){this.view=t,this.stateField=e,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:t=>this.placeInfo(t),key:this},this.space=null,this.currentClass="";let n=t.state.field(e),{options:s,selected:r}=n.open,o=t.state.facet(cd);this.optionContent=function(t){let e=t.addToOptions.slice();return t.icons&&e.push({render(t){let e=document.createElement("div");return e.classList.add("cm-completionIcon"),t.type&&e.classList.add(...t.type.split(/\s+/g).map((t=>"cm-completionIcon-"+t))),e.setAttribute("aria-hidden","true"),e},position:20}),e.push({render(t,e,i,n){let s=document.createElement("span");s.className="cm-completionLabel";let r=t.displayLabel||t.label,o=0;for(let t=0;to&&s.appendChild(document.createTextNode(r.slice(o,e)));let l=s.appendChild(document.createElement("span"));l.appendChild(document.createTextNode(r.slice(e,i))),l.className="cm-completionMatchedText",o=i}return ot.position-e.position)).map((t=>t.render))}(o),this.optionClass=o.optionClass,this.tooltipClass=o.tooltipClass,this.range=fd(s.length,r,o.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(t.state),this.dom.addEventListener("mousedown",(i=>{let{options:n}=t.state.field(e).open;for(let e,s=i.target;s&&s!=this.dom;s=s.parentNode)if("LI"==s.nodeName&&(e=/-(\d+)$/.exec(s.id))&&+e[1]{let i=t.state.field(this.stateField,!1);i&&i.tooltip&&t.state.facet(cd).closeOnBlur&&e.relatedTarget!=t.contentDOM&&t.dispatch({effects:ld.of(null)})})),this.showOptions(s,n.id)}mount(){this.updateSel()}showOptions(t,e){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(t,e,this.range)),this.list.addEventListener("scroll",(()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)}))}update(t){var e;let i=t.state.field(this.stateField),n=t.startState.field(this.stateField);if(this.updateTooltipClass(t.state),i!=n){let{options:s,selected:r,disabled:o}=i.open;n.open&&n.open.options==s||(this.range=fd(s.length,r,t.state.facet(cd).maxRenderedOptions),this.showOptions(s,i.id)),this.updateSel(),o!=(null===(e=n.open)||void 0===e?void 0:e.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!o)}}updateTooltipClass(t){let e=this.tooltipClass(t);if(e!=this.currentClass){for(let t of this.currentClass.split(" "))t&&this.dom.classList.remove(t);for(let t of e.split(" "))t&&this.dom.classList.add(t);this.currentClass=e}}positioned(t){this.space=t,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let t=this.view.state.field(this.stateField),e=t.open;if((e.selected>-1&&e.selected=this.range.to)&&(this.range=fd(e.options.length,e.selected,this.view.state.facet(cd).maxRenderedOptions),this.showOptions(e.options,t.id)),this.updateSelectedOption(e.selected)){this.destroyInfo();let{completion:i}=e.options[e.selected],{info:n}=i;if(!n)return;let s="string"==typeof n?document.createTextNode(n):n(i);if(!s)return;"then"in s?s.then((e=>{e&&this.view.state.field(this.stateField,!1)==t&&this.addInfoPane(e,i)})).catch((t=>$i(this.view.state,t,"completion info"))):this.addInfoPane(s,i)}}addInfoPane(t,e){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",null!=t.nodeType)i.appendChild(t),this.infoDestroy=null;else{let{dom:e,destroy:n}=t;i.appendChild(e),this.infoDestroy=n||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(t){let e=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)"LI"==i.nodeName&&i.id?n==t?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),e=i):i.hasAttribute("aria-selected")&&i.removeAttribute("aria-selected"):n--;return e&&function(t,e){let i=t.getBoundingClientRect(),n=e.getBoundingClientRect(),s=i.height/t.offsetHeight;n.topi.bottom&&(t.scrollTop+=(n.bottom-i.bottom)/s)}(this.list,e),e}measureInfo(){let t=this.dom.querySelector("[aria-selected]");if(!t||!this.info)return null;let e=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=t.getBoundingClientRect(),s=this.space;if(!s){let t=this.dom.ownerDocument.defaultView||window;s={left:0,top:0,right:t.innerWidth,bottom:t.innerHeight}}return n.top>Math.min(s.bottom,e.bottom)-10||n.bottomi.from||0==i.from))if(s=t,"string"!=typeof a&&a.header)n.appendChild(a.header(a));else{n.appendChild(document.createElement("completion-section")).textContent=t}}const h=n.appendChild(document.createElement("li"));h.id=e+"-"+r,h.setAttribute("role","option");let c=this.optionClass(o);c&&(h.className=c);for(let t of this.optionContent){let e=t(o,this.view.state,this.view,l);e&&h.appendChild(e)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.tonew pd(i,t,e)}function md(t){return 100*(t.boost||0)+(t.apply?10:0)+(t.info?5:0)+(t.type?1:0)}class vd{constructor(t,e,i,n,s,r){this.options=t,this.attrs=e,this.tooltip=i,this.timestamp=n,this.selected=s,this.disabled=r}setSelected(t,e){return t==this.selected||t>=this.options.length?this:new vd(this.options,xd(e,t),this.tooltip,this.timestamp,t,this.disabled)}static build(t,e,i,n,s){let r=function(t,e){let i=[],n=null,s=t=>{i.push(t);let{section:e}=t.completion;if(e){n||(n=[]);let t="string"==typeof e?e:e.name;n.some((e=>e.name==t))||n.push("string"==typeof e?{name:t}:e)}},r=e.facet(cd);for(let n of t)if(n.hasResult()){let t=n.result.getMatch;if(!1===n.result.filter)for(let e of n.result.options)s(new td(e,n.source,t?t(e):[],1e9-i.length));else{let i,o=e.sliceDoc(n.from,n.to),l=r.filterStrict?new hd(o):new ad(o);for(let e of n.result.options)if(i=l.match(e.label)){let r=e.displayLabel?t?t(e,i.matched):[]:i.matched;s(new td(e,n.source,r,i.score+(e.boost||0)))}}}if(n){let t=Object.create(null),e=0,s=(t,e)=>{var i,n;return(null!==(i=t.rank)&&void 0!==i?i:1e9)-(null!==(n=e.rank)&&void 0!==n?n:1e9)||(t.namee.score-t.score||a(t.completion,e.completion)))){let e=t.completion;!l||l.label!=e.label||l.detail!=e.detail||null!=l.type&&null!=e.type&&l.type!=e.type||l.apply!=e.apply||l.boost!=e.boost?o.push(t):md(t.completion)>md(l)&&(o[o.length-1]=t),l=t.completion}return o}(t,e);if(!r.length)return n&&t.some((t=>1==t.state))?new vd(n.options,n.attrs,n.tooltip,n.timestamp,n.selected,!0):null;let o=e.facet(cd).selectOnOpen?0:-1;if(n&&n.selected!=o&&-1!=n.selected){let t=n.options[n.selected].completion;for(let e=0;ee.hasResult()?Math.min(t,e.from):t),1e8),create:Dd,above:s.aboveCursor},n?n.timestamp:Date.now(),o,!1)}map(t){return new vd(this.options,this.attrs,Object.assign(Object.assign({},this.tooltip),{pos:t.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}}class wd{constructor(t,e,i){this.active=t,this.id=e,this.open=i}static start(){return new wd(kd,"cm-ac-"+Math.floor(2e6*Math.random()).toString(36),null)}update(t){let{state:e}=t,i=e.facet(cd),n=(i.override||e.languageDataAt("autocomplete",ed(e)).map(rd)).map((e=>(this.active.find((t=>t.source==e))||new Sd(e,this.active.some((t=>0!=t.state))?1:0)).update(t,i)));n.length==this.active.length&&n.every(((t,e)=>t==this.active[e]))&&(n=this.active);let s=this.open;s&&t.docChanged&&(s=s.map(t.changes)),t.selection||n.some((e=>e.hasResult()&&t.changes.touchesRange(e.from,e.to)))||!function(t,e){if(t==e)return!0;for(let i=0,n=0;;){for(;i1==t.state))&&(s=null),!s&&n.every((t=>1!=t.state))&&n.some((t=>t.hasResult()))&&(n=n.map((t=>t.hasResult()?new Sd(t.source,0):t)));for(let e of t.effects)e.is(Ad)&&(s=s&&s.setSelected(e.value,this.id));return n==this.active&&s==this.open?this:new wd(n,this.id,s)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:this.active.length?bd:yd}}const bd={"aria-autocomplete":"list"},yd={};function xd(t,e){let i={"aria-autocomplete":"list","aria-haspopup":"listbox","aria-controls":t};return e>-1&&(i["aria-activedescendant"]=t+"-"+e),i}const kd=[];function Pd(t,e){if(t.isUserEvent("input.complete")){let i=t.annotation(nd);if(i&&e.activateOnCompletion(i))return 12}let i=t.isUserEvent("input.type");return i&&e.activateOnTyping?5:i?1:t.isUserEvent("delete.backward")?2:t.selection?8:t.docChanged?16:0}class Sd{constructor(t,e,i=-1){this.source=t,this.state=e,this.explicitPos=i}hasResult(){return!1}update(t,e){let i=Pd(t,e),n=this;(8&i||16&i&&this.touches(t))&&(n=new Sd(n.source,0)),4&i&&0==n.state&&(n=new Sd(this.source,1)),n=n.updateFor(t,i);for(let e of t.effects)if(e.is(od))n=new Sd(n.source,1,e.value?ed(t.state):-1);else if(e.is(ld))n=new Sd(n.source,0);else if(e.is(Cd))for(let t of e.value)t.source==n.source&&(n=t);return n}updateFor(t,e){return this.map(t.changes)}map(t){return t.empty||this.explicitPos<0?this:new Sd(this.source,this.state,t.mapPos(this.explicitPos))}touches(t){return t.changes.touchesRange(ed(t.state))}}class Od extends Sd{constructor(t,e,i,n,s){super(t,2,e),this.result=i,this.from=n,this.to=s}hasResult(){return!0}updateFor(t,e){var i;if(!(3&e))return this.map(t.changes);let n=this.result;n.map&&!t.changes.empty&&(n=n.map(n,t.changes));let s=t.changes.mapPos(this.from),r=t.changes.mapPos(this.to,1),o=ed(t.state);if((this.explicitPos<0?o<=s:or||!n||2&e&&ed(t.startState)==this.from)return new Sd(this.source,4&e?1:0);let l=this.explicitPos<0?-1:t.changes.mapPos(this.explicitPos);return function(t,e,i,n){if(!t)return!1;let s=e.sliceDoc(i,n);return"function"==typeof t?t(s,i,n,e):id(t,!0).test(s)}(n.validFor,t.state,s,r)?new Od(this.source,l,n,s,r):n.update&&(n=n.update(n,s,r,new Gu(t.state,o,l>=0)))?new Od(this.source,l,n,n.from,null!==(i=n.to)&&void 0!==i?i:ed(t.state)):new Sd(this.source,1,l)}map(t){if(t.empty)return this;return(this.result.map?this.result.map(this.result,t):this.result)?new Od(this.source,this.explicitPos<0?-1:t.mapPos(this.explicitPos),this.result,t.mapPos(this.from),t.mapPos(this.to,1)):new Sd(this.source,0)}touches(t){return t.changes.touchesRange(this.from,this.to)}}const Cd=dt.define({map:(t,e)=>t.map((t=>t.map(e)))}),Ad=dt.define(),Md=X.define({create:()=>wd.start(),update:(t,e)=>t.update(e),provide:t=>[io.from(t,(t=>t.tooltip)),Ks.contentAttributes.from(t,(t=>t.attrs))]});function Td(t,e){const i=e.completion.apply||e.completion.label;let n=t.state.field(Md).active.find((t=>t.source==e.source));return n instanceof Od&&("string"==typeof i?t.dispatch(Object.assign(Object.assign({},function(t,e,i,n){let{main:s}=t.selection,r=i-s.from,o=n-s.from;return Object.assign(Object.assign({},t.changeByRange((l=>l!=s&&i!=n&&t.sliceDoc(l.from+r,l.from+o)!=t.sliceDoc(i,n)?{range:l}:{changes:{from:l.from+r,to:n==s.from?l.to:l.from+o,insert:e},range:B.cursor(l.from+r+e.length)}))),{scrollIntoView:!0,userEvent:"input.complete"})}(t.state,i,n.from,n.to)),{annotations:nd.of(e.completion)})):i(t,e.completion,n.from,n.to),!0)}const Dd=gd(Md,Td);function Ed(t,e="option"){return i=>{let n=i.state.field(Md,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp-1?n.open.selected+r*(t?1:-1):t?0:o-1;return l<0?l="page"==e?0:o-1:l>=o&&(l="page"==e?o-1:0),i.dispatch({effects:Ad.of(l)}),!0}}class Rd{constructor(t,e){this.active=t,this.context=e,this.time=Date.now(),this.updates=[],this.done=void 0}}const Bd=Gi.fromClass(class{constructor(t){this.view=t,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.pendingStart=!1,this.composing=0;for(let e of t.state.field(Md).active)1==e.state&&this.startQuery(e)}update(t){let e=t.state.field(Md),i=t.state.facet(cd);if(!t.selectionSet&&!t.docChanged&&t.startState.field(Md)==e)return;let n=t.transactions.some((t=>{let e=Pd(t,i);return 8&e||(t.selection||t.docChanged)&&!(3&e)}));for(let e=0;e50&&Date.now()-i.time>1e3){for(let t of i.context.abortListeners)try{t()}catch(t){$i(this.view.state,t)}i.context.abortListeners=null,this.running.splice(e--,1)}else i.updates.push(...t.transactions)}this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),t.transactions.some((t=>t.effects.some((t=>t.is(od)))))&&(this.pendingStart=!0);let s=this.pendingStart?50:i.activateOnTypingDelay;if(this.debounceUpdate=e.active.some((t=>1==t.state&&!this.running.some((e=>e.active.source==t.source))))?setTimeout((()=>this.startUpdate()),s):-1,0!=this.composing)for(let e of t.transactions)e.isUserEvent("input.type")?this.composing=2:2==this.composing&&e.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:t}=this.view,e=t.field(Md);for(let t of e.active)1!=t.state||this.running.some((e=>e.active.source==t.source))||this.startQuery(t)}startQuery(t){let{state:e}=this.view,i=ed(e),n=new Gu(e,i,t.explicitPos==i,this.view),s=new Rd(t,n);this.running.push(s),Promise.resolve(t.source(n)).then((t=>{s.context.aborted||(s.done=t||null,this.scheduleAccept())}),(t=>{this.view.dispatch({effects:ld.of(null)}),$i(this.view.state,t)}))}scheduleAccept(){this.running.every((t=>void 0!==t.done))?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout((()=>this.accept()),this.view.state.facet(cd).updateSyncTime))}accept(){var t;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let e=[],i=this.view.state.facet(cd);for(let n=0;nt.source==s.active.source));if(r&&1==r.state)if(null==s.done){let t=new Sd(s.active.source,0);for(let e of s.updates)t=t.update(e,i);1!=t.state&&e.push(t)}else this.startQuery(r)}e.length&&this.view.dispatch({effects:Cd.of(e)})}},{eventHandlers:{blur(t){let e=this.view.state.field(Md,!1);if(e&&e.tooltip&&this.view.state.facet(cd).closeOnBlur){let i=e.open&&ho(this.view,e.open.tooltip);i&&i.dom.contains(t.relatedTarget)||setTimeout((()=>this.view.dispatch({effects:ld.of(null)})),10)}},compositionstart(){this.composing=1},compositionend(){3==this.composing&&setTimeout((()=>this.view.dispatch({effects:od.of(!1)})),20),this.composing=0}}}),Nd="object"==typeof navigator&&/Win/.test(navigator.platform),Ld=j.highest(Ks.domEventHandlers({keydown(t,e){let i=e.state.field(Md,!1);if(!i||!i.open||i.open.disabled||i.open.selected<0||t.key.length>1||t.ctrlKey&&(!Nd||!t.altKey)||t.metaKey)return!1;let n=i.open.options[i.open.selected],s=i.active.find((t=>t.source==n.source)),r=n.completion.commitCharacters||s.result.commitCharacters;return r&&r.indexOf(t.key)>-1&&Td(e,n),!1}})),Id=Ks.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"···"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box",whiteSpace:"pre-line"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ƒ'"}},".cm-completionIcon-class":{"&:after":{content:"'○'"}},".cm-completionIcon-interface":{"&:after":{content:"'◌'"}},".cm-completionIcon-variable":{"&:after":{content:"'𝑥'"}},".cm-completionIcon-constant":{"&:after":{content:"'𝐶'"}},".cm-completionIcon-type":{"&:after":{content:"'𝑡'"}},".cm-completionIcon-enum":{"&:after":{content:"'∪'"}},".cm-completionIcon-property":{"&:after":{content:"'□'"}},".cm-completionIcon-keyword":{"&:after":{content:"'🔑︎'"}},".cm-completionIcon-namespace":{"&:after":{content:"'▢'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}}),Fd={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Vd=dt.define({map(t,e){let i=e.mapPos(t,-1,P.TrackAfter);return null==i?void 0:i}}),Wd=new class extends Ct{};Wd.startSide=1,Wd.endSide=-1;const Hd=X.define({create:()=>Dt.empty,update(t,e){if(t=t.map(e.changes),e.selection){let i=e.state.doc.lineAt(e.selection.main.head);t=t.update({filter:t=>t>=i.from&&t<=i.to})}for(let i of e.effects)i.is(Vd)&&(t=t.update({add:[Wd.range(i.value,i.value+1)]}));return t}});const zd="()[]{}<>";function qd(t){for(let e=0;e{if((Ud?t.composing:t.compositionStarted)||t.state.readOnly)return!1;let s=t.state.selection.main;if(n.length>2||2==n.length&&1==x(b(n,0))||e!=s.from||i!=s.to)return!1;let r=function(t,e){let i=Xd(t,t.selection.main.head),n=i.brackets||Fd.brackets;for(let s of n){let r=qd(b(s,0));if(e==s)return r==s?Gd(t,s,n.indexOf(s+s+s)>-1,i):jd(t,s,r,i.before||Fd.before);if(e==r&&$d(t,t.selection.main.from))return Kd(t,s,r)}return null}(t.state,n);return!!r&&(t.dispatch(r),!0)})),Yd=[{key:"Backspace",run:({state:t,dispatch:e})=>{if(t.readOnly)return!1;let i=Xd(t,t.selection.main.head).brackets||Fd.brackets,n=null,s=t.changeByRange((e=>{if(e.empty){let n=function(t,e){let i=t.sliceString(e-2,e);return x(b(i,0))==i.length?i:i.slice(1)}(t.doc,e.head);for(let s of i)if(s==n&&_d(t.doc,e.head)==qd(b(s,0)))return{changes:{from:e.head-s.length,to:e.head+s.length},range:B.cursor(e.head-s.length)}}return{range:n=e}}));return n||e(t.update(s,{scrollIntoView:!0,userEvent:"delete.backward"})),!n}}];function $d(t,e){let i=!1;return t.field(Hd).between(0,t.doc.length,(t=>{t==e&&(i=!0)})),i}function _d(t,e){let i=t.sliceString(e,e+2);return i.slice(0,x(b(i,0)))}function jd(t,e,i,n){let s=null,r=t.changeByRange((r=>{if(!r.empty)return{changes:[{insert:e,from:r.from},{insert:i,from:r.to}],effects:Vd.of(r.to+e.length),range:B.range(r.anchor+e.length,r.head+e.length)};let o=_d(t.doc,r.head);return!o||/\s/.test(o)||n.indexOf(o)>-1?{changes:{insert:e+i,from:r.head},effects:Vd.of(r.head+e.length),range:B.cursor(r.head+e.length)}:{range:s=r}}));return s?null:t.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function Kd(t,e,i){let n=null,s=t.changeByRange((e=>e.empty&&_d(t.doc,e.head)==i?{changes:{from:e.head,to:e.head+i.length,insert:i},range:B.cursor(e.head+i.length)}:n={range:e}));return n?null:t.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function Gd(t,e,i,n){let s=n.stringPrefixes||Fd.stringPrefixes,r=null,o=t.changeByRange((n=>{if(!n.empty)return{changes:[{insert:e,from:n.from},{insert:e,from:n.to}],effects:Vd.of(n.to+e.length),range:B.range(n.anchor+e.length,n.head+e.length)};let o,l=n.head,a=_d(t.doc,l);if(a==e){if(Zd(t,l))return{changes:{insert:e+e,from:l},effects:Vd.of(l+e.length),range:B.cursor(l+e.length)};if($d(t,l)){let n=i&&t.sliceDoc(l,l+3*e.length)==e+e+e?e+e+e:e;return{changes:{from:l,to:l+n.length,insert:n},range:B.cursor(l+n.length)}}}else{if(i&&t.sliceDoc(l-2*e.length,l)==e+e&&(o=Jd(t,l-2*e.length,s))>-1&&Zd(t,o))return{changes:{insert:e+e+e+e,from:l},effects:Vd.of(l+e.length),range:B.cursor(l+e.length)};if(t.charCategorizer(l)(a)!=yt.Word&&Jd(t,l,s)>-1&&!function(t,e,i,n){let s=Zl(t).resolveInner(e,-1),r=n.reduce(((t,e)=>Math.max(t,e.length)),0);for(let o=0;o<5;o++){let o=t.sliceDoc(s.from,Math.min(s.to,s.from+i.length+r)),l=o.indexOf(i);if(!l||l>-1&&n.indexOf(o.slice(0,l))>-1){let e=s.firstChild;for(;e&&e.from==s.from&&e.to-e.from>i.length+l;){if(t.sliceDoc(e.to-i.length,e.to)==i)return!1;e=e.firstChild}return!0}let a=s.to==e&&s.parent;if(!a)break;s=a}return!1}(t,l,e,s))return{changes:{insert:e+e,from:l},effects:Vd.of(l+e.length),range:B.cursor(l+e.length)}}return{range:r=n}}));return r?null:t.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function Zd(t,e){let i=Zl(t).resolveInner(e+1);return i.parent&&i.from==e}function Jd(t,e,i){let n=t.charCategorizer(e);if(n(t.sliceDoc(e-1,e))!=yt.Word)return e;for(let s of i){let i=e-s.length;if(t.sliceDoc(i,e)==s&&n(t.sliceDoc(i-1,i))!=yt.Word)return i}return-1}function tf(t={}){return[Ld,Md,cd.of(t),Bd,nf,Id]}const ef=[{key:"Ctrl-Space",run:t=>!!t.state.field(Md,!1)&&(t.dispatch({effects:od.of(!0)}),!0)},{key:"Escape",run:t=>{let e=t.state.field(Md,!1);return!(!e||!e.active.some((t=>0!=t.state)))&&(t.dispatch({effects:ld.of(null)}),!0)}},{key:"ArrowDown",run:Ed(!0)},{key:"ArrowUp",run:Ed(!1)},{key:"PageDown",run:Ed(!0,"page")},{key:"PageUp",run:Ed(!1,"page")},{key:"Enter",run:t=>{let e=t.state.field(Md,!1);return!(t.state.readOnly||!e||!e.open||e.open.selected<0||e.open.disabled||Date.now()-e.open.timestampt.facet(cd).defaultKeymap?[ef]:[])));class sf{constructor(t,e,i){this.from=t,this.to=e,this.diagnostic=i}}class rf{constructor(t,e,i){this.diagnostics=t,this.panel=e,this.selected=i}static init(t,e,i){let n=t,s=i.facet(mf).markerFilter;s&&(n=s(n,i));let r=ni.set(n.map((t=>t.from==t.to||t.from==t.to-1&&i.doc.lineAt(t.from).to==t.from?ni.widget({widget:new bf(t),diagnostic:t}).range(t.from):ni.mark({attributes:{class:"cm-lintRange cm-lintRange-"+t.severity+(t.markClass?" "+t.markClass:"")},diagnostic:t}).range(t.from,t.to))),!0);return new rf(r,e,of(r))}}function of(t,e=null,i=0){let n=null;return t.between(i,1e9,((t,i,{spec:s})=>{if(!e||s.diagnostic==e)return n=new sf(t,i,s.diagnostic),!1})),n}const lf=dt.define(),af=dt.define(),hf=dt.define(),cf=X.define({create:()=>new rf(ni.none,null,null),update(t,e){if(e.docChanged&&t.diagnostics.size){let i=t.diagnostics.map(e.changes),n=null,s=t.panel;if(t.selected){let s=e.changes.mapPos(t.selected.from,1);n=of(i,t.selected.diagnostic,s)||of(i,null,s)}!i.size&&s&&e.state.facet(mf).autoPanel&&(s=null),t=new rf(i,s,n)}for(let i of e.effects)if(i.is(lf)){let n=e.state.facet(mf).autoPanel?i.value.length?xf.open:null:t.panel;t=rf.init(i.value,n,e.state)}else i.is(af)?t=new rf(t.diagnostics,i.value?xf.open:null,t.selected):i.is(hf)&&(t=new rf(t.diagnostics,t.panel,i.value));return t},provide:t=>[vo.from(t,(t=>t.panel)),Ks.decorations.from(t,(t=>t.diagnostics))]}),uf=ni.mark({class:"cm-lintRange cm-lintRange-active"});function df(t,e,i){let{diagnostics:n}=t.state.field(cf),s=[],r=2e8,o=0;n.between(e-(i<0?1:0),e+(i>0?1:0),((t,n,{spec:l})=>{e>=t&&e<=n&&(t==n||(e>t||i>0)&&(e({dom:ff(t,s)})}:null}function ff(t,e){return $c("ul",{class:"cm-tooltip-lint"},e.map((e=>wf(t,e,!1))))}const pf=t=>{let e=t.state.field(cf,!1);return!(!e||!e.panel)&&(t.dispatch({effects:af.of(!1)}),!0)},gf=[{key:"Mod-Shift-m",run:t=>{let e=t.state.field(cf,!1);var i,n;e&&e.panel||t.dispatch({effects:(i=t.state,n=[af.of(!0)],i.field(cf,!1)?n:n.concat(dt.appendConfig.of(Sf)))});let s=fo(t,xf.open);return s&&s.dom.querySelector(".cm-panel-lint ul").focus(),!0},preventDefault:!0},{key:"F8",run:t=>{let e=t.state.field(cf,!1);if(!e)return!1;let i=t.state.selection.main,n=e.diagnostics.iter(i.to+1);return!(!n.value&&(n=e.diagnostics.iter(0),!n.value||n.from==i.from&&n.to==i.to))&&(t.dispatch({selection:{anchor:n.from,head:n.to},scrollIntoView:!0}),!0)}}],mf=I.define({combine:t=>Object.assign({sources:t.map((t=>t.source)).filter((t=>null!=t))},Ot(t.map((t=>t.config)),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null,hideOn:()=>null},{needsRefresh:(t,e)=>t?e?i=>t(i)||e(i):t:e}))});function vf(t){let e=[];if(t)t:for(let{name:i}of t){for(let t=0;tt.toLowerCase()==n.toLowerCase()))){e.push(n);continue t}}e.push("")}return e}function wf(t,e,i){var n;let s=i?vf(e.actions):[];return $c("li",{class:"cm-diagnostic cm-diagnostic-"+e.severity},$c("span",{class:"cm-diagnosticText"},e.renderMessage?e.renderMessage(t):e.message),null===(n=e.actions)||void 0===n?void 0:n.map(((i,n)=>{let r=!1,o=n=>{if(n.preventDefault(),r)return;r=!0;let s=of(t.state.field(cf).diagnostics,e);s&&i.apply(t,s.from,s.to)},{name:l}=i,a=s[n]?l.indexOf(s[n]):-1,h=a<0?l:[l.slice(0,a),$c("u",l.slice(a,a+1)),l.slice(a+1)];return $c("button",{type:"button",class:"cm-diagnosticAction",onclick:o,onmousedown:o,"aria-label":` Action: ${l}${a<0?"":` (access key "${s[n]})"`}.`},h)})),e.source&&$c("div",{class:"cm-diagnosticSource"},e.source))}class bf extends ei{constructor(t){super(),this.diagnostic=t}eq(t){return t.diagnostic==this.diagnostic}toDOM(){return $c("span",{class:"cm-lintPoint cm-lintPoint-"+this.diagnostic.severity})}}class yf{constructor(t,e){this.diagnostic=e,this.id="item_"+Math.floor(4294967295*Math.random()).toString(16),this.dom=wf(t,e,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}}class xf{constructor(t){this.view=t,this.items=[];this.list=$c("ul",{tabIndex:0,role:"listbox","aria-label":this.view.state.phrase("Diagnostics"),onkeydown:e=>{if(27==e.keyCode)pf(this.view),this.view.focus();else if(38==e.keyCode||33==e.keyCode)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(40==e.keyCode||34==e.keyCode)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(36==e.keyCode)this.moveSelection(0);else if(35==e.keyCode)this.moveSelection(this.items.length-1);else if(13==e.keyCode)this.view.focus();else{if(!(e.keyCode>=65&&e.keyCode<=90&&this.selectedIndex>=0))return;{let{diagnostic:i}=this.items[this.selectedIndex],n=vf(i.actions);for(let s=0;s{for(let e=0;epf(this.view)},"×")),this.update()}get selectedIndex(){let t=this.view.state.field(cf).selected;if(!t)return-1;for(let e=0;e{let l,a=-1;for(let t=i;ti&&(this.items.splice(i,a-i),n=!0)),e&&l.diagnostic==e.diagnostic?l.dom.hasAttribute("aria-selected")||(l.dom.setAttribute("aria-selected","true"),s=l):l.dom.hasAttribute("aria-selected")&&l.dom.removeAttribute("aria-selected"),i++}));i({sel:s.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:t,panel:e})=>{let i=e.height/this.list.offsetHeight;t.tope.bottom&&(this.list.scrollTop+=(t.bottom-e.bottom)/i)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let t=this.list.firstChild;function e(){let e=t;t=e.nextSibling,e.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;t!=i.dom;)e();t=i.dom.nextSibling}else this.list.insertBefore(i.dom,t);for(;t;)e()}moveSelection(t){if(this.selectedIndex<0)return;let e=of(this.view.state.field(cf).diagnostics,this.items[t].diagnostic);e&&this.view.dispatch({selection:{anchor:e.from,head:e.to},scrollIntoView:!0,effects:hf.of(e)})}static open(t){return new xf(t)}}function kf(t){return function(t,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(t)}')`}(``,'width="6" height="3"')}const Pf=Ks.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:kf("#d11")},".cm-lintRange-warning":{backgroundImage:kf("orange")},".cm-lintRange-info":{backgroundImage:kf("#999")},".cm-lintRange-hint":{backgroundImage:kf("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}}),Sf=[cf,Ks.decorations.compute([cf],(t=>{let{selected:e,panel:i}=t.field(cf);return e&&i&&e.from!=e.to?ni.set([uf.range(e.from,e.to)]):ni.none})),ao(df,{hideOn:function(t,e){let i=e.pos,n=e.end||i,s=t.state.facet(mf).hideOn(t,i,n);if(null!=s)return s;let r=t.startState.doc.lineAt(e.pos);return!(!t.effects.some((t=>t.is(lf)))&&!t.changes.touchesRange(r.from,Math.max(r.to,n)))}}),Pf],Of=(()=>[Vo(),zo,Ir(),Lh(),Ua(),br(),[Ar,Mr],St.allowMultipleSelections.of(!0),St.transactionFilter.of((t=>{if(!t.docChanged||!t.isUserEvent("input.type")&&!t.isUserEvent("input.complete"))return t;let e=t.startState.languageDataAt("indentOnInput",t.startState.selection.main.head);if(!e.length)return t;let i=t.newDoc,{head:n}=t.newSelection.main,s=i.lineAt(n);if(n>s.from+200)return t;let r=i.sliceString(s.from,n);if(!e.some((t=>t.test(r))))return t;let{state:o}=t,l=-1,a=[];for(let{head:t}of o.selection.ranges){let e=o.doc.lineAt(t);if(e.from==l)continue;l=e.from;let i=fa(o,e.from);if(null==i)continue;let n=/^\s*/.exec(e.text)[0],s=da(o,i);n!=s&&a.push({from:e.from,to:e.from+n.length,insert:s})}return a.length?[t,{changes:a,sequential:!0}]:t})),Ka(Ja,{fallback:!0}),hh(),[Qd,Hd],tf(),Ks.mouseSelectionStyle.of(((t,e)=>{return(i=e).altKey&&0==i.button?Ur(t,e):null;var i})),$r(),zr,[pu,fu],sr.of([...Yd,...Yc,...Xu,...Zh,...La,...ef,...gf])])();class Cf{constructor(t,e,i,n,s,r,o,l,a,h=0,c){this.p=t,this.stack=e,this.state=i,this.reducePos=n,this.pos=s,this.score=r,this.buffer=o,this.bufferBase=l,this.curContext=a,this.lookAhead=h,this.parent=c}toString(){return`[${this.stack.filter(((t,e)=>e%3==0)).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(t,e,i=0){let n=t.parser.context;return new Cf(t,[],e,i,i,0,[],0,n?new Af(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(t,e){this.stack.push(this.state,e,this.bufferBase+this.buffer.length),this.state=t}reduce(t){var e;let i=t>>19,n=65535&t,{parser:s}=this.p,r=this.reducePos=2e3&&!(null===(e=this.p.parser.nodeSet.types[n])||void 0===e?void 0:e.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=h):this.p.lastBigReductionSizel;)this.stack.pop();this.reduceContext(n,a)}storeNode(t,e,i,n=4,s=!1){if(0==t&&(!this.stack.length||this.stack[this.stack.length-1]0&&0==t.buffer[n-4]&&t.buffer[n-1]>-1){if(e==i)return;if(t.buffer[n-2]>=e)return void(t.buffer[n-2]=i)}}if(s&&this.pos!=i){let s=this.buffer.length;if(s>0&&0!=this.buffer[s-4]){let t=!1;for(let e=s;e>0&&this.buffer[e-2]>i;e-=4)if(this.buffer[e-1]>=0){t=!0;break}if(t)for(;s>0&&this.buffer[s-2]>i;)this.buffer[s]=this.buffer[s-4],this.buffer[s+1]=this.buffer[s-3],this.buffer[s+2]=this.buffer[s-2],this.buffer[s+3]=this.buffer[s-1],s-=4,n>4&&(n-=4)}this.buffer[s]=t,this.buffer[s+1]=e,this.buffer[s+2]=i,this.buffer[s+3]=n}else this.buffer.push(t,e,i,n)}shift(t,e,i,n){if(131072&t)this.pushState(65535&t,this.pos);else if(262144&t)this.pos=n,this.shiftContext(e,i),e<=this.p.parser.maxNode&&this.buffer.push(e,i,n,4);else{let s=t,{parser:r}=this.p;(n>this.pos||e<=r.maxNode)&&(this.pos=n,r.stateFlag(s,1)||(this.reducePos=n)),this.pushState(s,i),this.shiftContext(e,i),e<=r.maxNode&&this.buffer.push(e,i,n,4)}}apply(t,e,i,n){65536&t?this.reduce(t):this.shift(t,e,i,n)}useNode(t,e){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=t)&&(this.p.reused.push(t),i++);let n=this.pos;this.reducePos=this.pos=n+t.length,this.pushState(e,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,t,this,this.p.stream.reset(this.pos-t.length)))}split(){let t=this,e=t.buffer.length;for(;e>0&&t.buffer[e-2]>t.reducePos;)e-=4;let i=t.buffer.slice(e),n=t.bufferBase+e;for(;t&&n==t.bufferBase;)t=t.parent;return new Cf(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,t)}recoverByDelete(t,e){let i=t<=this.p.parser.maxNode;i&&this.storeNode(t,this.pos,e,4),this.storeNode(0,this.pos,e,i?8:4),this.pos=this.reducePos=e,this.score-=190}canShift(t){for(let e=new Mf(this);;){let i=this.p.parser.stateSlot(e.state,4)||this.p.parser.hasAction(e.state,t);if(0==i)return!1;if(!(65536&i))return!0;e.reduce(i)}}recoverByInsert(t){if(this.stack.length>=300)return[];let e=this.p.parser.nextStates(this.state);if(e.length>8||this.stack.length>=120){let i=[];for(let n,s=0;s1&e&&t==n))||i.push(e[t],n)}e=i}let i=[];for(let t=0;t>19,n=65535&e,s=this.stack.length-3*i;if(s<0||t.getGoto(this.stack[s],n,!1)<0){let t=this.findForcedReduction();if(null==t)return!1;e=t}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(e),!0}findForcedReduction(){let{parser:t}=this.p,e=[],i=(n,s)=>{if(!e.includes(n))return e.push(n),t.allActions(n,(e=>{if(393216&e);else if(65536&e){let i=(e>>19)-s;if(i>1){let n=65535&e,s=this.stack.length-3*i;if(s>=0&&t.getGoto(this.stack[s],n,!1)>=0)return i<<19|65536|n}}else{let t=i(e,s+1);if(null!=t)return t}}))};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(3!=this.stack.length)return!1;let{parser:t}=this.p;return 65535==t.data[t.stateSlot(this.state,1)]&&!t.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(t){if(this.state!=t.state||this.stack.length!=t.stack.length)return!1;for(let e=0;ethis.lookAhead&&(this.emitLookAhead(),this.lookAhead=t)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}}class Af{constructor(t,e){this.tracker=t,this.context=e,this.hash=t.strict?t.hash(e):0}}class Mf{constructor(t){this.start=t,this.state=t.state,this.stack=t.stack,this.base=this.stack.length}reduce(t){let e=65535&t,i=t>>19;0==i?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=3*(i-1);let n=this.start.p.parser.getGoto(this.stack[this.base-3],e,!0);this.state=n}}class Tf{constructor(t,e,i){this.stack=t,this.pos=e,this.index=i,this.buffer=t.buffer,0==this.index&&this.maybeNext()}static create(t,e=t.bufferBase+t.buffer.length){return new Tf(t,e,e-t.bufferBase)}maybeNext(){let t=this.stack.parent;null!=t&&(this.index=this.stack.bufferBase-t.bufferBase,this.stack=t,this.buffer=t.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,0==this.index&&this.maybeNext()}fork(){return new Tf(this.stack,this.pos,this.index)}}function Df(t,e=Uint16Array){if("string"!=typeof t)return t;let i=null;for(let n=0,s=0;n=92&&e--,e>=34&&e--;let s=e-32;if(s>=46&&(s-=46,i=!0),r+=s,i)break;r*=46}i?i[s++]=r:i=new e(r)}return i}class Ef{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const Rf=new Ef;class Bf{constructor(t,e){this.input=t,this.ranges=e,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Rf,this.rangeIndex=0,this.pos=this.chunkPos=e[0].from,this.range=e[0],this.end=e[e.length-1].to,this.readNext()}resolveOffset(t,e){let i=this.range,n=this.rangeIndex,s=this.pos+t;for(;si.to:s>=i.to;){if(n==this.ranges.length-1)return null;let t=this.ranges[++n];s+=t.from-i.to,i=t}return s}clipPos(t){if(t>=this.range.from&&tt)return Math.max(t,e.from);return this.end}peek(t){let e,i,n=this.chunkOff+t;if(n>=0&&n=this.chunk2Pos&&en.to&&(this.chunk2=this.chunk2.slice(0,n.to-e)),i=this.chunk2.charCodeAt(0)}}return e>=this.token.lookAhead&&(this.token.lookAhead=e+1),i}acceptToken(t,e=0){let i=e?this.resolveOffset(e,-1):this.pos;if(null==i||i=this.chunk2Pos&&this.posthis.range.to?t.slice(0,this.range.to-this.pos):t,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(t=1){for(this.chunkOff+=t;this.pos+t>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();t-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=t,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(t,e){if(e?(this.token=e,e.start=t,e.lookAhead=t+1,e.value=e.extended=-1):this.token=Rf,this.pos!=t){if(this.pos=t,t==this.end)return this.setDone(),this;for(;t=this.range.to;)this.range=this.ranges[++this.rangeIndex];t>=this.chunkPos&&t=this.chunkPos&&e<=this.chunkPos+this.chunk.length)return this.chunk.slice(t-this.chunkPos,e-this.chunkPos);if(t>=this.chunk2Pos&&e<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(t-this.chunk2Pos,e-this.chunk2Pos);if(t>=this.range.from&&e<=this.range.to)return this.input.read(t,e);let i="";for(let n of this.ranges){if(n.from>=e)break;n.to>t&&(i+=this.input.read(Math.max(n.from,t),Math.min(n.to,e)))}return i}}class Nf{constructor(t,e){this.data=t,this.id=e}token(t,e){let{parser:i}=e.p;!function(t,e,i,n,s,r){let o=0,l=1<0){let i=t[n];if(a.allows(i)&&(-1==e.token.value||e.token.value==i||Ff(i,e.token.value,s,r))){e.acceptToken(i);break}}let n=e.next,h=0,c=t[o+2];if(!(e.next<0&&c>h&&65535==t[i+3*c-3])){for(;h>1,r=i+s+(s<<1),l=t[r],a=t[r+1]||65536;if(n=a)){o=t[r+2],e.advance();continue t}h=s+1}}break}o=t[i+3*c-1]}}(this.data,t,e,this.id,i.data,i.tokenPrecTable)}}Nf.prototype.contextual=Nf.prototype.fallback=Nf.prototype.extend=!1,Nf.prototype.fallback=Nf.prototype.extend=!1;class Lf{constructor(t,e={}){this.token=t,this.contextual=!!e.contextual,this.fallback=!!e.fallback,this.extend=!!e.extend}}function If(t,e,i){for(let n,s=e;65535!=(n=t[s]);s++)if(n==i)return s-e;return-1}function Ff(t,e,i,n){let s=If(i,n,e);return s<0||If(i,n,t)e)&&!n.type.isError)return i<0?Math.max(0,Math.min(n.to-1,e-25)):Math.min(t.length,Math.max(n.from+1,e+25));if(i<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return i<0?0:t.length}}class zf{constructor(t,e){this.fragments=t,this.nodeSet=e,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let t=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(t){for(this.safeFrom=t.openStart?Hf(t.tree,t.from+t.offset,1)-t.offset:t.from,this.safeTo=t.openEnd?Hf(t.tree,t.to+t.offset,-1)-t.offset:t.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(t.tree),this.start.push(-t.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(t){if(tt)return this.nextStart=r,null;if(s instanceof Jo){if(r==t){if(r=Math.max(this.safeFrom,t)&&(this.trees.push(s),this.start.push(r),this.index.push(0))}else this.index[e]++,this.nextStart=r+s.length}}}class qf{constructor(t,e){this.stream=e,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=t.tokenizers.map((t=>new Ef))}getActions(t){let e=0,i=null,{parser:n}=t.p,{tokenizers:s}=n,r=n.stateSlot(t.state,3),o=t.curContext?t.curContext.hash:0,l=0;for(let n=0;nh.end+25&&(l=Math.max(h.lookAhead,l)),0!=h.value)){let n=e;if(h.extended>-1&&(e=this.addActions(t,h.extended,h.end,e)),e=this.addActions(t,h.value,h.end,e),!a.extend&&(i=h,e>n))break}}for(;this.actions.length>e;)this.actions.pop();return l&&t.setLookAhead(l),i||t.pos!=this.stream.end||(i=new Ef,i.value=t.p.parser.eofTerm,i.start=i.end=t.pos,e=this.addActions(t,i.value,i.end,e)),this.mainToken=i,this.actions}getMainToken(t){if(this.mainToken)return this.mainToken;let e=new Ef,{pos:i,p:n}=t;return e.start=i,e.end=Math.min(i+1,n.stream.end),e.value=i==n.stream.end?n.parser.eofTerm:0,e}updateCachedToken(t,e,i){let n=this.stream.clipPos(i.pos);if(e.token(this.stream.reset(n,t),i),t.value>-1){let{parser:e}=i.p;for(let n=0;n=0&&i.p.parser.dialect.allows(s>>1)){1&s?t.extended=s>>1:t.value=s>>1;break}}}else t.value=0,t.end=this.stream.clipPos(n+1)}putAction(t,e,i,n){for(let e=0;e4*t.bufferLength?new zf(i,t.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let t,e,i=this.stacks,n=this.minStackPos,s=this.stacks=[];if(this.bigReductionCount>300&&1==i.length){let[t]=i;for(;t.forceReduce()&&t.stack.length&&t.stack[t.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;rn)s.push(o);else{if(this.advanceStack(o,s,i))continue;{t||(t=[],e=[]),t.push(o);let i=this.tokens.getMainToken(o);e.push(i.value,i.end)}}break}}if(!s.length){let e=t&&function(t){let e=null;for(let i of t){let t=i.p.stoppedAt;(i.pos==i.p.stream.end||null!=t&&i.pos>t)&&i.p.parser.stateFlag(i.state,2)&&(!e||e.scorethis.stoppedAt?t[0]:this.runRecovery(t,e,s);if(i)return Vf&&console.log("Force-finish "+this.stackID(i)),this.stackToTree(i.forceAll())}if(this.recovering){let t=1==this.recovering?1:3*this.recovering;if(s.length>t)for(s.sort(((t,e)=>e.score-t.score));s.length>t;)s.pop();s.some((t=>t.reducePos>n))&&this.recovering--}else if(s.length>1){t:for(let t=0;t500&&n.buffer.length>500){if(!((e.score-n.score||e.buffer.length-n.buffer.length)>0)){s.splice(t--,1);continue t}s.splice(i--,1)}}}s.length>12&&s.splice(12,s.length-12)}this.minStackPos=s[0].pos;for(let t=1;t ":"";if(null!=this.stoppedAt&&n>this.stoppedAt)return t.forceReduce()?t:null;if(this.fragments){let e=t.curContext&&t.curContext.tracker.strict,i=e?t.curContext.hash:0;for(let o=this.fragments.nodeAt(n);o;){let n=this.parser.nodeSet.types[o.type.id]==o.type?s.getGoto(t.state,o.type.id):-1;if(n>-1&&o.length&&(!e||(o.prop(Qo.contextHash)||0)==i))return t.useNode(o,n),Vf&&console.log(r+this.stackID(t)+` (via reuse of ${s.getName(o.type.id)})`),!0;if(!(o instanceof Jo)||0==o.children.length||o.positions[0]>0)break;let l=o.children[0];if(!(l instanceof Jo&&0==o.positions[0]))break;o=l}}let o=s.stateSlot(t.state,4);if(o>0)return t.reduce(o),Vf&&console.log(r+this.stackID(t)+` (via always-reduce ${s.getName(65535&o)})`),!0;if(t.stack.length>=8400)for(;t.stack.length>6e3&&t.forceReduce(););let l=this.tokens.getActions(t);for(let o=0;on?e.push(d):i.push(d)}return!1}advanceFully(t,e){let i=t.pos;for(;;){if(!this.advanceStack(t,null,null))return!1;if(t.pos>i)return Uf(t,e),!0}}runRecovery(t,e,i){let n=null,s=!1;for(let r=0;r ":"";if(o.deadEnd){if(s)continue;if(s=!0,o.restart(),Vf&&console.log(h+this.stackID(o)+" (restarted)"),this.advanceFully(o,i))continue}let c=o.split(),u=h;for(let t=0;c.forceReduce()&&t<10;t++){if(Vf&&console.log(u+this.stackID(c)+" (via force-reduce)"),this.advanceFully(c,i))break;Vf&&(u=this.stackID(c)+" -> ")}for(let t of o.recoverByInsert(l))Vf&&console.log(h+this.stackID(t)+" (via recover-insert)"),this.advanceFully(t,i);this.stream.end>o.pos?(a==o.pos&&(a++,l=0),o.recoverByDelete(l,a),Vf&&console.log(h+this.stackID(o)+` (via recover-delete ${this.parser.getName(l)})`),Uf(o,i)):(!n||n.scoret.topRules[e][1])),n=[];for(let t=0;t=0)s(n,t,e[i++]);else{let r=e[i+-n];for(let o=-n;o>0;o--)s(e[i++],t,r);i++}}}this.nodeSet=new jo(e.map(((e,s)=>_o.define({name:s>=this.minRepeatTerm?void 0:e,id:s,props:n[s],top:i.indexOf(s)>-1,error:0==s,skipped:t.skippedNodes&&t.skippedNodes.indexOf(s)>-1})))),t.propSources&&(this.nodeSet=this.nodeSet.extend(...t.propSources)),this.strict=!1,this.bufferLength=qo;let r=Df(t.tokenData);this.context=t.context,this.specializerSpecs=t.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let t=0;t"number"==typeof t?new Nf(r,t):t)),this.topRules=t.topRules,this.dialects=t.dialects||{},this.dynamicPrecedences=t.dynamicPrecedences||null,this.tokenPrecTable=t.tokenPrec,this.termNames=t.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(t,e,i){let n=new Xf(this,t,e,i);for(let s of this.wrappers)n=s(n,t,e,i);return n}getGoto(t,e,i=!1){let n=this.goto;if(e>=n[0])return-1;for(let s=n[e+1];;){let e=n[s++],r=1&e,o=n[s++];if(r&&i)return o;for(let i=s+(e>>1);s0}validAction(t,e){return!!this.allActions(t,(t=>t==e||null))}allActions(t,e){let i=this.stateSlot(t,4),n=i?e(i):void 0;for(let i=this.stateSlot(t,1);null==n;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=$f(this.data,i+2)}n=e($f(this.data,i+1))}return n}nextStates(t){let e=[];for(let i=this.stateSlot(t,1);;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=$f(this.data,i+2)}if(!(1&this.data[i+2])){let t=this.data[i+1];e.some(((e,i)=>1&i&&e==t))||e.push(this.data[i],t)}}return e}configure(t){let e=Object.assign(Object.create(Yf.prototype),this);if(t.props&&(e.nodeSet=this.nodeSet.extend(...t.props)),t.top){let i=this.topRules[t.top];if(!i)throw new RangeError(`Invalid top rule name ${t.top}`);e.top=i}return t.tokenizers&&(e.tokenizers=this.tokenizers.map((e=>{let i=t.tokenizers.find((t=>t.from==e));return i?i.to:e}))),t.specializers&&(e.specializers=this.specializers.slice(),e.specializerSpecs=this.specializerSpecs.map(((i,n)=>{let s=t.specializers.find((t=>t.from==i.external));if(!s)return i;let r=Object.assign(Object.assign({},i),{external:s.to});return e.specializers[n]=_f(r),r}))),t.contextTracker&&(e.context=t.contextTracker),t.dialect&&(e.dialect=this.parseDialect(t.dialect)),null!=t.strict&&(e.strict=t.strict),t.wrap&&(e.wrappers=e.wrappers.concat(t.wrap)),null!=t.bufferLength&&(e.bufferLength=t.bufferLength),e}hasWrappers(){return this.wrappers.length>0}getName(t){return this.termNames?this.termNames[t]:String(t<=this.maxNode&&this.nodeSet.types[t].name||t)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(t){let e=this.dynamicPrecedences;return null==e?0:e[t]||0}parseDialect(t){let e=Object.keys(this.dialects),i=e.map((()=>!1));if(t)for(let n of t.split(" ")){let t=e.indexOf(n);t>=0&&(i[t]=!0)}let n=null;for(let t=0;tt.external(i,n)<<1|e}return t.get}const jf=10,Kf=13,Gf=39,Zf=45,Jf=46,tp=new Map;tp.set(13,["above","over"]),tp.set(14,["and"]),tp.set(15,["around","round"]),tp.set(16,["as"]),tp.set(33,["great","high","big","strong"]),tp.set(62,["less","low","small","weak"]),tp.set(17,["at"]),tp.set(18,["back"]),tp.set(19,["be"]),tp.set(20,["break"]),tp.set(21,["build"]),tp.set(22,["call"]),tp.set(23,["cast","burn"]),tp.set(24,["continue","take"]),tp.set(25,["debug"]),tp.set(26,["divided","between","over"]),tp.set(27,["down"]),tp.set(28,["else","otherwise"]),tp.set(29,["empty","silent","silence"]),tp.set(30,["end","yeah","baby","oh"]),tp.set(31,["exactly","totally","really"]),tp.set(32,["false","lies","no","wrong"]),tp.set(34,["his","her"]),tp.set(35,["if","when"]),tp.set(36,["into","in"]),tp.set(37,["is","was","are","were","am"]),tp.set(38,["isnt","isn't","aint","ain't","wasn't","wasnt","aren't","arent","weren't","werent"]),tp.set(39,["join","unite"]),tp.set(40,["knock"]),tp.set(41,["less","lower","smaller","weaker"]),tp.set(42,["let"]),tp.set(43,["like","so"]),tp.set(44,["listen"]),tp.set(45,["minus","without"]),tp.set(46,["greater","higher","bigger","stronger","more"]),tp.set(47,["mysterious"]),tp.set(48,["non"]),tp.set(49,["nor"]),tp.set(50,["not"]),tp.set(51,["now"]),tp.set(52,["null","nothing","nowhere","nobody","gone"]),tp.set(53,["or"]),tp.set(54,["over"]),tp.set(55,["plus","with"]),tp.set(56,["roll","pop"]),tp.set(57,["print","shout","say","scream","whisper"]),tp.set(4,["they","them","she","him","her","hir","zie","zir","xem","ver","ze","ve","xe","it","he","you","me","i"]),tp.set(58,["rock","push"]),tp.set(59,["put"]),tp.set(60,["return","giving","give","send"]),tp.set(61,["say","says","said"]),tp.set(63,["cut","split","shatter"]),tp.set(64,["takes","wants"]),tp.set(65,["taking"]),tp.set(66,["than"]),tp.set(67,["an","a","the","my","your","our","their"]),tp.set(68,["then"]),tp.set(69,["times","of"]),tp.set(70,["to"]),tp.set(71,["true","yes","ok","right"]),tp.set(72,["turn"]),tp.set(73,["under","below"]),tp.set(74,["until"]),tp.set(75,["up"]),tp.set(76,["using","with"]),tp.set(77,["while"]),tp.set(78,["with"]),tp.set(79,["write"]);const ep=Array.from(tp.values()).flat(),ip=[">=","<=",">","<","="],np=["+","/","*","-"],sp=gp(" \t,?!./;"),rp=gp("?!.;");let op=rp.concat([Kf,jf]);const lp=new Map;lp.set(6,[50,37,38]),lp.set(7,[55,45,26,69]),lp.set(5,[14,49,53]);function ap(t){var e="string"==typeof t?t.toLowerCase():String.fromCodePoint(...t).toLowerCase();return ep.includes(e)}const hp=gp(" \t"),cp=t=>pp(t,bp.concat(mp)),up=t=>pp(t,bp),dp=(t,e=0)=>{let i=[];for(;hp.includes(t.peek(e));)e++;for(;;){var n=t.peek(e);if(n<=0)break;if(hp.includes(n))break;i.push(n),e++}return[i,e]},fp=(t,e=0)=>{let i=[];for(;hp.includes(t.peek(e));)e++;if(t.peek(e)<=0)return[i,e];for(;bp.includes(t.peek(e));)i.push(t.peek(e++));for(;t.peek(e)==Jf;)i.push(t.peek(e++));return[i,e]};function pp(t,e){let i=[];for(;hp.includes(t.next);)t.advance();for(;e.includes(t.next);)i.push(t.next),t.advance();return i}function gp(t){for(var e=[],i=0;i=!+/-*"),vp=gp("ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĸĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ"),wp=gp("abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįi̇ijĵķĸĺļľŀłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷÿźżžʼnß"),bp=vp.concat(wp),yp=new Lf((function(t){var e=up(t),i=String.fromCodePoint(...e).toLowerCase();for(const[e,n]of tp)if(n.includes(i))return t.acceptToken(e)})),xp=new Lf((function(t){var e=up(t);if(e.length){var i=String.fromCodePoint(...e);if(tp.get(67).includes(i.toLowerCase()))return up(t),t.acceptToken(2);if(tp.get(34).includes(i.toLowerCase()))return e=up(t),i+=" "+String.fromCodePoint(...e),0==e.length||ap(e)?t.acceptToken(4):t.acceptToken(2);if(tp.get(4).includes(i.toLowerCase()))return t.acceptToken(4);if(!ap(e)){for(;t.next==Jf;)e.push(t.next),t.advance();for(var n=[],s=0,r=t.pos,o=0;o<99&&!ap(e);o++)vp.includes(e[0])&&(n.push(String.fromCodePoint(...e)),t.advance(s),r+=s),[e,s]=fp(t);return n.length>1?t.acceptTokenTo(1,r):t.acceptToken(3)}}})),kp=new Lf((function(t){var e=cp(t),i=String.fromCodePoint(...e).toLowerCase();if(ip.includes(i))return t.acceptToken(6);if(np.includes(i))return t.acceptToken(7);if(tp.get(37).includes(i)){for(var n of(e=cp(t),i=String.fromCodePoint(...e).toLowerCase(),[13,41,46,73]))if(tp.get(n).includes(i)){var s=t.pos;return e=cp(t),i=String.fromCodePoint(...e).toLowerCase(),tp.get(66).includes(i)?t.acceptToken(6):t.acceptTokenTo(6,s)}if("as"==i)for(var n of(e=cp(t),i=String.fromCodePoint(...e).toLowerCase(),[33,62]))if(tp.get(n).includes(i)&&(e=cp(t),i=String.fromCodePoint(...e).toLowerCase(),tp.get(16).includes(i)))return t.acceptToken(6)}else for(var r of lp.keys())for(var n of lp.get(r))if(tp.get(n).includes(i)){if("divided"==i){var[e,o]=fp(t);"by"==String.fromCodePoint(...e).toLowerCase()&&up(t)}return t.acceptToken(r)}})),Pp=new Lf((function(t){for(;t.next>=0&&t.next!=jf;)t.advance();t.acceptToken(9)})),Sp=new Lf((function(t){let e=[];for(;hp.includes(t.next);)t.advance();if(bp.concat([Gf,Zf]).includes(t.next)){for(;t.next>=0&&!hp.includes(t.next);)e.push(t.next),t.advance();if(!function(t){if(ip.includes(t))return!0;if(np.includes(t))return!0;for(var e of lp.keys())for(var i of lp.get(e))if(tp.get(i).includes(t))return!0;return!1}(String.fromCodePoint(...e).toLowerCase())){for(;t.next>=0&&t.next!=jf;)t.advance();return t.acceptToken(8)}}})),Op=new Lf((function(t){for(var e=hp.concat(sp);t.next>=0&&e.includes(t.next);)t.advance();var i=0;if(t.peek(i)==Kf&&i++,t.peek(i)==jf){if(t.advance(i+1),i=0,t.next<0)return;for(;t.peek(i)>=0;){for(;sp.includes(t.peek(i));)i++;if(t.peek(i)==Kf&&i++,t.peek(i)==jf)return t.acceptToken(10);for(;sp.includes(t.peek(i));)i++;let[e,s]=fp(t,i);var n=String.fromCodePoint(...e).toLowerCase();if(tp.get(28).includes(n))return t.acceptToken(10);if(tp.get(30).includes(n))return t.acceptToken(10);i++}}var[s,r]=fp(t);return n=String.fromCodePoint(...s),/oo*h/i.test(n)?(t.advance(1),t.acceptToken(10)):tp.get(28).includes(n)||tp.get(30).includes(n)?(up(t),t.acceptToken(10)):void 0})),Cp=new Lf((function(t){for(var e=!1,i=hp.concat(sp);t.next>=0&&i.includes(t.next);)rp.includes(t.next)&&(e=!0),t.advance();var n=0;t.peek(n)==Kf&&n++,t.peek(n)==jf&&(t.advance(n+1),e=!0);var[s,r]=dp(t);if(s.length){var o=String.fromCodePoint(...s).toLowerCase();if(tp.get(14).includes(o))return;if(["&","n'","'n'"].includes(o))return}if(e)return t.acceptToken(11)})),Ap=new Lf((function(t){for(;t.next>=0;){if(op.includes(t.peek()))return t.peek()==Kf&&t.advance(),t.acceptToken(12);t.advance()}})),Mp=Sl({ProperVariable:Ql.variableName,CommonVariable:Ql.variableName,SimpleVariable:Ql.variableName,Pronoun:Ql.variableName,Number:Ql.number,PoeticString:Ql.string,PoeticNumber:Ql.number,String:Ql.string,Comment:Ql.comment,LineComment:Ql.lineComment,BlockComment:Ql.blockComment,ArithmeticOperator:Ql.arithmeticOperator,LogicOperator:Ql.logicOperator,CompareOperator:Ql.compareOperator,VLS:Ql.separator,XLS:Ql.separator,ALS:Ql.separator,Comma:Ql.separator,Nacton:Ql.separator,Ampersand:Ql.separator,OxfordComma:Ql.separator,Wildcard:Ql.lineComment,End:Ql.controlKeyword,EOB:Ql.controlKeyword,EOS:Ql.controlKeyword,Above:Ql.compareOperator,And:Ql.logicOperator,Around:Ql.keyword,As:Ql.keyword,AsGreat:Ql.compareOperator,AsSmall:Ql.compareOperator,At:Ql.keyword,Back:Ql.controlKeyword,Be:Ql.keyword,Break:Ql.controlKeyword,Build:Ql.keyword,Call:Ql.keyword,Cast:Ql.keyword,Continue:Ql.controlKeyword,Debug:Ql.keyword,Divided:Ql.arithmeticOperator,Down:Ql.keyword,Else:Ql.controlKeyword,Empty:Ql.literal,End:Ql.keyword,Exactly:Ql.compareOperator,False:Ql.bool,If:Ql.controlKeyword,Into:Ql.keyword,Is:Ql.compareOperator,Isnt:Ql.compareOperator,Join:Ql.keyword,Knock:Ql.keyword,Less:Ql.compareOperator,Let:Ql.keyword,Like:Ql.keyword,Listen:Ql.keyword,Minus:Ql.arithmeticOperator,More:Ql.compareOperator,Mysterious:Ql.null,Non:Ql.logicOperator,Nor:Ql.logicOperator,Not:Ql.logicOperator,Now:Ql.keyword,Null:Ql.null,Or:Ql.logicOperator,Over:Ql.arithmeticOperator,Plus:Ql.arithmeticOperator,Pop:Ql.keyword,Print:Ql.keyword,Push:Ql.keyword,Put:Ql.keyword,Return:Ql.controlKeyword,Says:Ql.keyword,Split:Ql.keyword,Takes:Ql.keyword,Taking:Ql.keyword,Than:Ql.compareOperator,Then:Ql.controlKeyword,Times:Ql.arithmeticOperator,To:Ql.keyword,True:Ql.bool,Turn:Ql.keyword,Under:Ql.keyword,Until:Ql.controlKeyword,Up:Ql.keyword,Using:Ql.keyword,While:Ql.controlKeyword,With:Ql.keyword,Write:Ql.keyword}),Tp=Yf.deserialize({version:14,states:"*hO!TQ)aOOP![O&jOOOOQ$y'#Eq'#EqO!dQ)`O'#EVO!iQ)aO'#EaO#^Q)aO'#EbO#eQ'|O'#EcO#jQ'|O'#EdO!iQ)aO'#EeO!iQ)aO'#EgO#oQ)`O'#EgOOQ$w'#EU'#EUO!iQ)aO'#EUO#wQ*cO'#ETO$UQ&zOOQOQ&jOOPOOO'#EP'#EPPOOO)C@e)C@eO$^Q&kO,5:qO$lQ)bO'#E^OOQQ'#E_'#E_OOQQ'#EZ'#EZO$zQ&lO'#EYOOQ$y'#EX'#EXOOQ$w,5:{,5:{OOQ$w,5:|,5:|O!iQ)aO,5:|OOQ$w,5:},5:}OOQ$w,5;O,5;OO%VQ*RO,5;PO%^Q)`O,5;RO%cQ&rO,5;RO%hQ)fO,5;ROOQ$w,5:p,5:pOOQ$g'#Ej'#EjO%VQ*RO'#EkOOQ$w'#Ek'#EkO%yQ*cO,5:oOOQ$w,5:o,5:oOOQ$V'#Em'#EmO&TQ)qO'#ElO$UQ&zOOO&[Q*cO'#EpOOQ$w1G0]1G0]O'uQ)bO,5:xO!iQ)aO'#EWOOQ$y'#Ei'#EiOOQ#u'#E`'#E`O!iQ)aO,5:tOOQ$w1G0h1G0hO%VQ*RO'#EfOOQ$w'#Ef'#EfOOQ$w1G0k1G0kO$^Q&kO1G0mOOQ#u1G0m1G0mO!iQ)aO1G0mO$^Q&kO1G0mOOQ$g-E8h-E8hOOQ$w,5;V,5;VOOQ$w-E8i-E8iOOQ$w1G0Z1G0ZOOQ$V-E8k-E8kOOQ`,5;W,5;WOOQ`-E8j-E8jO(TQ*cO,5;[OOQ$y-E8g-E8gOOQ$y,5:r,5:rOOQ$y1G0`1G0`OOQ$w,5;Q,5;QOOQ#u7+&X7+&XO)nQ)`O7+&XO!iQ)aO<_!w!x!A[!x!y!Cu~!rS!{~XY!mYZ!m]^!mpq!m~#RR#b#c#[#f#g%s#h#i'|~#_Q#Z#[#e#b#c$r~#hP#`#a#k~#nP#X#Y#q~#tP!d!e#w~#zP#f#g#}~$QP#T#U$T~$WP#V#W$Z~$^P#_#`$a~$dP#X#Y$g~$jP#h#i$m~$rO!U~~$uP#c#d$x~${P#h#i%O~%RP#T#U%U~%XP#h#i%[~%_P#]#^%b~%eP#c#d%h~%kP#b#c%n~%sO!p~~%vP#]#^%y~%|P#h#i&P~&SP#[#]&V~&YP#a#b&]~&`P#X#Y&c~&fP#h#i&i~&lP#]#^&o~&rP#V#W&u~&xP!q!r&{~'OP#d#e'R~'UP#X#Y'X~'[P#f#g'_~'bP#T#U'e~'hP#h#i'k~'nP#c#d'q~'tP#f#g'w~'|Oy~~(PQ#c#d(V#h#i(b~(YP#a#b(]~(bOp~~(eP#f#g(h~(kP#]#^(n~(qP#U#V(t~(wP#i#j(z~(}P#h#i)Q~)TP#X#Y)W~)ZQ!p!q)a!x!y)x~)dP#T#U)g~)jP#a#b)m~)pP#X#Y)s~)xOZ~~){P#T#U*O~*RP#`#a*U~*XP#i#j*[~*_P#X#Y*b~*gOd~~*jS#]#^*v#`#a,m#c#d.Q#f#g.c~*yP#h#i*|~+PP#k#l+S~+VP#]#^+Y~+]P#g#h+`~+cP#X#Y+f~+iP!q!r+l~+oP#d#e+r~+uP#X#Y+x~+{P#f#g,O~,RP#T#U,U~,XP#h#i,[~,_P#c#d,b~,eP#f#g,h~,mO{~~,pP#c#d,s~,vP#V#W,y~,|P#_#`-P~-SP!e!f-V~-YP#c#d-]~-`P#a#b-c~-fP#a#b-i~-lP#X#Y-o~-rP#b#c-u~-xP#h#i-{~.QOS~~.TP#c#d.W~.ZP#`#a.^~.cOh~~.fP#T#U.i~.lP#V#W.o~.rQ#X#Y.x#_#`.}~.}O!X~~/QP#X#Y/T~/WP#h#i/Z~/`O!T~~/cR#[#]/l#`#a1X#c#d2Y~/oP#T#U/r~/uQ#b#c/{#f#g0d~0OP#Z#[0R~0UP#X#Y0X~0[P#W#X0_~0dO!l~~0gP#T#U0j~0mP#V#W0p~0sP#h#i0v~0yP#X#Y0|~1PP#f#g1S~1XOc~~1[P#T#U1_~1bP#g#h1e~1hP#g#h1k~1nP!p!q1q~1tP#T#U1w~1zP#a#b1}~2QP#X#Y2T~2YO[~~2]R#`#a2f#a#b2w#b#c5S~2iP#c#d2l~2oP#f#g2r~2wOk~~2zQ#a#b3Q#d#e3i~3TP#X#Y3W~3ZP#b#c3^~3aP#h#i3d~3iOQ~~3lP#T#U3o~3rP#f#g3u~3xP#X#Y3{~4OP!q!r4R~4UP#d#e4X~4[P#X#Y4_~4bP#f#g4e~4hP#T#U4k~4nP#h#i4q~4tP#c#d4w~4zP#f#g4}~5SO|~~5VQ#g#h5]#h#i6j~5`P#h#i5c~5fP#T#U5i~5lP#b#c5o~5rP#h#i5u~5xPxy5{~6OP#h#i6R~6UP#T#U6X~6[P#Z#[6_~6bPyz6e~6jO!s~~6mQ#X#Y6s#f#g8`~6vP#b#c6y~6|P#h#i7P~7UP!Y~!u!v7X~7[P#X#Y7_~7bP#d#e7e~7hP#T#U7k~7nP#f#g7q~7tP#T#U7w~7zP#h#i7}~8QP#c#d8T~8WP#f#g8Z~8`O!b~~8cP#c#d8f~8iP#`#a8l~8oQ!m!n8u!q!r9p~8xP#X#Y8{~9OP#m#n9R~9UP#k#l9X~9[P#c#d9_~9bP#f#g9e~9hP#W#X9k~9pOt~~9sP#d#e9v~9yP#X#Y9|~:PP#f#g:S~:VP#T#U:Y~:]P#h#i:`~:cP#c#d:f~:iP#f#g:l~:qO!Q~~:tQ#X#Y:z#c#d@{~:}R#Y#Z;W#`#a>y#f#g?h~;ZP#]#^;^~;aP#b#c;d~;gP#]#^;j~;mP#h#i;p~;sP#]#^;v~;yP#c#d;|~O~>RP#X#Y>U~>XP#f#g>[~>_P#T#U>b~>eP#h#i>h~>kP#c#d>n~>qP#f#g>t~>yO!O~~>|P#X#Y?P~?SP#h#i?V~?YP#X#Y?]~?`P#W#X?c~?hO!k~~?kP#X#Y?n~?qP#Y#Z?t~?wP!q!r?z~?}P#d#e@Q~@TP#X#Y@W~@ZP#f#g@^~@aP#T#U@d~@gP#h#i@j~@mP#c#d@p~@sP#f#g@v~@{Ox~~AOP#V#WAR~AUR!e!fA_!u!vBY#i#jB}~AbP#c#dAe~AhP#a#bAk~AnP#a#bAq~AtP#X#YAw~AzP#b#cA}~BQP#h#iBT~BYOT~~B]P#h#iB`~BcP#f#gBf~BiP#]#^Bl~BoP#b#cBr~BuP#Z#[Bx~B}Ob~~CQP#a#bCT~CWP#X#YCZ~C^P#b#cCa~CdP#h#iCg~CjP!o!pCm~CpP#X#YCs~CvP#h#iCy~C|P#T#UDP~DUO!o~~DXQ#a#bD_#g#hEY~DbP#d#eDe~DhP#[#]Dk~DnP#T#UDq~DtP#g#hDw~DzP#]#^D}~EQP#g#hET~EYO!e~~E]P#V#WE`~EcP#T#UEf~EiP#d#eEl~EoP#X#YEr~EwOj~~EzQ#`#aFQ#i#jFi~FTP#c#dFW~FZP#T#UF^~FaP#h#iFd~FiOg~~FlP#b#cFo~FrP#V#WFu~FxP#h#iF{~GOP#]#^GR~GUP#c#dGX~G[P#b#cG_~GbPxyGe~GhP#h#iGk~GnP#T#UGq~GtP#Z#[Gw~GzPyzG}~HSO!t~~HVP#X#YHY~H]P#T#UH`~HcP#W#XHf~HiP#]#^Hl~HoP#b#cHr~HuP#Z#[Hx~H}U!Z~!R!SIa!S!TIf!T!UIk!U!VIp!V!WIu!W!XIz~IfO![~~IkO!]~~IpO!^~~IuO!_~~IzO!`~~JPO!a~~JSP#b#cJV~JYR#g#hJc#h#iKW#j#kKu~JfP#X#YJi~JlP#f#gJo~JrP#h#iJu~JxP#X#YJ{~KOP#W#XKR~KWO!j~~KZP#X#YK^~KaP#Z#[Kd~KgP#X#YKj~KmP#f#gKp~KuOf~~KxP#T#UK{~LOP#`#aLR~LUP#]#^LX~L[P#W#XL_~LdO!m~~LgP#X#YLj~LmP#m#nLp~LsP#k#lLv~LyP#c#dL|~MPP#f#gMS~MVP#W#XMY~M_Om~~MbR#T#UMk#]#^Nl#c#d!#R~MnP#U#VMq~MtP#X#YMw~MzP#`#aM}~NQP!p!qNT~NWP#T#UNZ~N^P#a#bNa~NdP#X#YNg~NlO]~~NoR#b#cNx#g#h!!X#h#i!!d~N{Q#X#Y! R#_#`!!S~! UP!e!f! X~! [P#c#d! _~! bP#a#b! e~! hP#a#b! k~! nP#X#Y! q~! tP#b#c! w~! zP#h#i! }~!!SOR~~!!XO!g~~!![P#h#i!!_~!!dO!c~~!!gP#X#Y!!j~!!mP#f#g!!p~!!sP#T#U!!v~!!yP#`#a!!|~!#RO`~~!#UQ#V#W!#[#Z#[!$]~!#_P#T#U!#b~!#eP#`#a!#h~!#kPxy!#n~!#qP#h#i!#t~!#wP#T#U!#z~!#}P#Z#[!$Q~!$TPyz!$W~!$]O!v~~!$`P#]#^!$c~!$fP#V#W!$i~!$lP!q!r!$o~!$rP#d#e!$u~!$xP#X#Y!${~!%OP#f#g!%R~!%UP#T#U!%X~!%[P#h#i!%_~!%bP#c#d!%e~!%hP#f#g!%k~!%pOz~~!%sR#T#U!%|#X#Y!&}#c#d!'`~!&PP#V#W!&S~!&VP#f#g!&Y~!&]P#c#d!&`~!&cP!p!q!&f~!&iP#T#U!&l~!&oP#a#b!&r~!&uP#X#Y!&x~!&}O_~~!'QP#h#i!'T~!'WP#T#U!'Z~!'`O!n~~!'cQ#W#X!'i#b#c!)n~!'lQ#]#^!'r#i#j!(a~!'uP#Y#Z!'x~!'{P#]#^!(O~!(RP#X#Y!(U~!(XP#f#g!([~!(aOr~~!(dP#`#a!(g~!(jP#X#Y!(m~!(pP!m!n!(s~!(vP#X#Y!(y~!(|P#m#n!)P~!)SP#k#l!)V~!)YP#c#d!)]~!)`P#f#g!)c~!)fP#W#X!)i~!)nOv~~!)qP#c#d!)t~!)wP#g#h!)z~!)}P#d#e!*Q~!*TP#T#U!*W~!*ZP#V#W!*^~!*aP#X#Y!*d~!*iO!h~~!*lQ#T#U!*r#i#j!+u~!*uP#a#b!*x~!*{P#X#Y!+O~!+TPU~#g#h!+W~!+ZP#d#e!+^~!+aP#T#U!+d~!+gP#V#W!+j~!+mP#X#Y!+p~!+uO^~~!+xQ#`#a!,O#a#b!,Z~!,RP#`#a!,U~!,ZOo~~!,^P#U#V!,a~!,dP#X#Y!,g~!,jP#f#g!,m~!,rOe~~!,uP#d#e!,x~!,{P#X#Y!-O~!-RP#f#g!-U~!-XP#T#U!-[~!-_P#h#i!-b~!-eP#c#d!-h~!-kP#f#g!-n~!-sPw~!m!n!-v~!-yP#X#Y!-|~!.PP#m#n!.S~!.VP#k#l!.Y~!.]P#c#d!.`~!.cP#f#g!.f~!.iP#W#X!.l~!.qOs~~!.tR#T#U!.}#f#g!/f#i#j!3]~!/QP#f#g!/T~!/WP#X#Y!/Z~!/^P#b#c!/a~!/fO!W~~!/iP#c#d!/l~!/oQ#V#W!/u#d#e!2U~!/xP#X#Y!/{~!0OP#g#h!0R~!0UP#g#h!0X~!0[P#]#^!0_~!0bP#b#c!0e~!0hP#Z#[!0k~!0nP!k!l!0q~!0tP#b#c!0w~!0zP#g#h!0}~!1QP#h#i!1T~!1WP#f#g!1Z~!1^P#i#j!1a~!1dP#V#W!1g~!1jP#h#i!1m~!1pP#]#^!1s~!1vP#c#d!1y~!1|P#b#c!2P~!2UO!q~~!2XP#X#Y!2[~!2_P#f#g!2b~!2eP#h#i!2h~!2kP#m#n!2n~!2qP!p!q!2t~!2wP#T#U!2z~!2}P#a#b!3Q~!3TP#X#Y!3W~!3]OY~~!3`P#b#c!3c~!3fP#V#W!3i~!3lP#h#i!3o~!3rP#i#j!3u~!3xP#T#U!3{~!4OP#h#i!4R~!4UP#]#^!4X~!4[P#c#d!4_~!4bP#b#c!4e~!4jO!R~~!4mP#i#j!4p~!4sP#c#d!4v~!4yP#h#i!4|~!5PP#X#Y!5S~!5XO!d~~!5[P#X#Y!5_~!5bP#Z#[!5e~!5hP#X#Y!5k~!5nP#l#m!5q~!5tP#d#e!5w~!5|Oi~~!6PS#X#Y!6]#d#e!7l#e#f!9P#h#i!:j~!6`Q#`#a!6f#d#e!6q~!6iP#Y#Z!6l~!6qOn~~!6tP#T#U!6w~!6zP#f#g!6}~!7QP#T#U!7T~!7WP#h#i!7Z~!7^P#c#d!7a~!7dP#f#g!7g~!7lO!S~~!7oP#X#Y!7r~!7uP#V#W!7x~!7{P#]#^!8O~!8RP#T#U!8U~!8XP#`#a!8[~!8_Pxy!8b~!8eP#h#i!8h~!8kP#T#U!8n~!8qP#Z#[!8t~!8wPyz!8z~!9PO!w~~!9SP#i#j!9V~!9YP#T#U!9]~!9`P#f#g!9c~!9fP#X#Y!9i~!9lP!d!e!9o~!9rP#f#g!9u~!9xP#T#U!9{~!:OP#V#W!:R~!:UP#_#`!:X~!:[P#X#Y!:_~!:bP#h#i!:e~!:jO!V~~!:mQ#T#U!:s#f#g!PP#b#c!>S~!>VP#Z#[!>Y~!>_O!f~~!>bQ#T#U!>h#m#n!?]~!>kP#Z#[!>n~!>qP!p!q!>t~!>wP#T#U!>z~!>}P#a#b!?Q~!?TP#X#Y!?W~!?]OX~~!?`P#d#e!?c~!?fP#X#Y!?i~!?lQ!p!q!?r!q!r!@Z~!?uP#T#U!?x~!?{P#a#b!@O~!@RP#X#Y!@U~!@ZOW~~!@^P#d#e!@a~!@dP#X#Y!@g~!@jP#f#g!@m~!@pP#T#U!@s~!@vP#h#i!@y~!@|P#c#d!AP~!ASP#f#g!AV~!A[O!P~~!A_R#b#c!Ah#d#e!Ay#f#g!Cj~!AkP#]#^!An~!AqP#h#i!At~!AyOq~~!A|P#W#X!BP~!BSP#T#U!BV~!BYP#h#i!B]~!B`P#X#Y!Bc~!BfP!q!r!Bi~!BlP#d#e!Bo~!BrP#X#Y!Bu~!BxP#f#g!B{~!COP#T#U!CR~!CUP#h#i!CX~!C[P#c#d!C_~!CbP#f#g!Ce~!CjO}~~!CmP#`#a!Cp~!CuOl~~!CxP#T#U!C{~!DOP#f#g!DR~!DUP#]#^!DX~!D[P#T#U!D_~!DbP#U#V!De~!DhP#`#a!Dk~!DnP#X#Y!Dq~!DtP!p!q!Dw~!DzP#T#U!D}~!EQP#a#b!ET~!EWP#X#Y!EZ~!E`OV~",tokenizers:[0],topRules:{Program:[0,1]},tokenPrec:0}),Np=Gl.define({parser:Bp.configure({props:[ga.add({Application:function({closing:t,align:e=!0,units:i=1}){return n=>xa(n,e,i,t)}({closing:")",align:!1})}),Pa.add({Application:function(t){let e=t.firstChild,i=t.lastChild;return e&&e.to[Ks.theme({"&":{backgroundColor:e.background,color:e.foreground},".cm-content":{caretColor:e.caret},".cm-cursor, .cm-dropCursor":{borderLeftColor:e.caret},"&.cm-focused .cm-selectionBackgroundm .cm-selectionBackground, .cm-content ::selection":{backgroundColor:e.selection},".cm-activeLine":{backgroundColor:e.lineHighlight},".cm-gutters":{backgroundColor:e.gutterBackground,color:e.gutterForeground},".cm-activeLineGutter":{backgroundColor:e.lineHighlight}},{dark:"dark"===t}),Ka(Ya.define(i))],Fp=Ip({variant:"dark",settings:{background:"#000000",foreground:"#ffffff",caret:"#ff00ff",selection:"#0000ff",gutterBackground:"#006666",gutterForeground:"rgb(50, 90, 150)",lineHighlight:"#ffff00"},styles:function(){var t=[Ql.comment,Ql.lineComment,Ql.blockComment,Ql.docComment,Ql.name,Ql.variableName,Ql.typeName,Ql.tagName,Ql.propertyName,Ql.attributeName,Ql.className,Ql.labelName,Ql.namespace,Ql.macroName,Ql.literal,Ql.string,Ql.docString,Ql.character,Ql.attributeValue,Ql.number,Ql.integer,Ql.float,Ql.bool,Ql.regexp,Ql.escape,Ql.color,Ql.url,Ql.keyword,Ql.self,Ql.null,Ql.atom,Ql.unit,Ql.modifier,Ql.operatorKeyword,Ql.controlKeyword,Ql.definitionKeyword,Ql.moduleKeyword,Ql.operator,Ql.derefOperator,Ql.arithmeticOperator,Ql.logicOperator,Ql.bitwiseOperator,Ql.compareOperator,Ql.updateOperator,Ql.definitionOperator,Ql.typeOperator,Ql.controlOperator,Ql.punctuation,Ql.separator,Ql.bracket,Ql.angleBracket,Ql.squareBracket,Ql.paren,Ql.brace,Ql.content,Ql.heading,Ql.heading1,Ql.heading2,Ql.heading3,Ql.heading4,Ql.heading5,Ql.heading6,Ql.contentSeparator,Ql.list,Ql.quote,Ql.emphasis,Ql.strong,Ql.link,Ql.monospace,Ql.strikethrough,Ql.inserted,Ql.deleted,Ql.changed,Ql.invalid,Ql.meta,Ql.documentMeta,Ql.annotation,Ql.processingInstruction];const e=121;for(var i=e,n=e,s=e,r=[],o=0;o255&&(i=e,(n+=17)>255&&(n=e,(s+=17)>255&&(s=e)))}return r}()});const Vp=Ip({variant:"dark",settings:{background:"#00254b",foreground:"#FFFFFF",caret:"#FFFFFF",selection:"#B36539BF",gutterBackground:"#00254b",gutterForeground:"#FFFFFF70",lineHighlight:"#00000059"},styles:[{tag:Ql.comment,color:"#0088FF"},{tag:Ql.string,color:"#3AD900"},{tag:Ql.regexp,color:"#80FFC2"},{tag:[Ql.number,Ql.bool,Ql.null],color:"#FF628C"},{tag:[Ql.definitionKeyword,Ql.modifier],color:"#FFEE80"},{tag:Ql.variableName,color:"#CCCCCC"},{tag:Ql.self,color:"#FF80E1"},{tag:[Ql.className,Ql.definition(Ql.propertyName),Ql.function(Ql.variableName),Ql.definition(Ql.typeName),Ql.labelName],color:"#FFDD00"},{tag:[Ql.keyword,Ql.operator],color:"#FF9D00"},{tag:[Ql.propertyName,Ql.typeName],color:"#80FFBB"},{tag:Ql.special(Ql.brace),color:"#EDEF7D"},{tag:Ql.attributeName,color:"#9EFFFF"},{tag:Ql.derefOperator,color:"#fff"}]}),Wp=Ip({variant:"dark",settings:{background:"#2d2f3f",foreground:"#f8f8f2",caret:"#f8f8f0",selection:"#44475a",gutterBackground:"#282a36",gutterForeground:"rgb(144, 145, 148)",lineHighlight:"#44475a"},styles:[{tag:Ql.comment,color:"#6272a4"},{tag:[Ql.string,Ql.special(Ql.brace)],color:"#f1fa8c"},{tag:[Ql.number,Ql.self,Ql.bool,Ql.null],color:"#bd93f9"},{tag:[Ql.keyword,Ql.operator],color:"#ff79c6"},{tag:[Ql.definitionKeyword,Ql.typeName],color:"#8be9fd"},{tag:Ql.definition(Ql.typeName),color:"#f8f8f2"},{tag:[Ql.className,Ql.definition(Ql.propertyName),Ql.function(Ql.variableName),Ql.attributeName],color:"#50fa7b"}]}),Hp=Ip({variant:"light",settings:{background:"#FFFFFF",foreground:"#000000",caret:"#000000",selection:"#80C7FF",gutterBackground:"#FFFFFF",gutterForeground:"#00000070",lineHighlight:"#C1E2F8"},styles:[{tag:Ql.comment,color:"#AAAAAA"},{tag:[Ql.keyword,Ql.operator,Ql.typeName,Ql.tagName,Ql.propertyName],color:"#2F6F9F",fontWeight:"bold"},{tag:[Ql.attributeName,Ql.definition(Ql.propertyName)],color:"#4F9FD0"},{tag:[Ql.className,Ql.string,Ql.special(Ql.brace)],color:"#CF4F5F"},{tag:Ql.number,color:"#CF4F5F",fontWeight:"bold"},{tag:Ql.variableName,fontWeight:"bold"}]}),zp=Ip({variant:"dark",settings:{background:"#000000",foreground:"#ffffff",caret:"#ff00ff",selection:"#0000ff",gutterBackground:"#006666",gutterForeground:"rgb(50, 90, 150)",lineHighlight:"#111111"},styles:function(){for(var t=[Ql.comment,Ql.lineComment,Ql.blockComment,Ql.docComment,Ql.name,Ql.variableName,Ql.typeName,Ql.tagName,Ql.propertyName,Ql.attributeName,Ql.className,Ql.labelName,Ql.namespace,Ql.macroName,Ql.literal,Ql.string,Ql.docString,Ql.character,Ql.attributeValue,Ql.number,Ql.integer,Ql.float,Ql.bool,Ql.regexp,Ql.escape,Ql.color,Ql.url,Ql.keyword,Ql.self,Ql.null,Ql.atom,Ql.unit,Ql.modifier,Ql.operatorKeyword,Ql.controlKeyword,Ql.definitionKeyword,Ql.moduleKeyword,Ql.operator,Ql.derefOperator,Ql.arithmeticOperator,Ql.logicOperator,Ql.bitwiseOperator,Ql.compareOperator,Ql.updateOperator,Ql.definitionOperator,Ql.typeOperator,Ql.controlOperator,Ql.punctuation,Ql.separator,Ql.bracket,Ql.angleBracket,Ql.squareBracket,Ql.paren,Ql.brace,Ql.content,Ql.heading,Ql.heading1,Ql.heading2,Ql.heading3,Ql.heading4,Ql.heading5,Ql.heading6,Ql.contentSeparator,Ql.list,Ql.quote,Ql.emphasis,Ql.strong,Ql.link,Ql.monospace,Ql.strikethrough,Ql.inserted,Ql.deleted,Ql.changed,Ql.invalid,Ql.meta,Ql.documentMeta,Ql.annotation,Ql.processingInstruction,Ql.definition(Ql.name),Ql.constant(Ql.name),Ql.function(Ql.name),Ql.standard(Ql.name),Ql.local(Ql.name),Ql.special(Ql.name)],e=[],i=0;ierror: ${message.data.error}`; + } else if (message.data.type == "result") { + if (output.showResult) output.innerHTML += `» ${message.data.result}`; + } else if (message.data.type == "parse") { + return output.innerText = message.data.result; + } else { + console.log(message); + } + var button = document.getElementById(`rockstar-button-${message.data.editorId}`); + button.innerHTML = ROCK_BUTTON_HTML; + rockCount--; + } else { + console.log(message); + } +} + +var worker = new Worker("/js/worker.js", { type: 'module' }); +worker.addEventListener("message", handleMessageFromWorker); + +var timeouts = []; +var outputs = []; +var queuedMessages = []; + +function clearLoadingMessages() { + while (timeouts.length) window.clearTimeout(timeouts.pop()); + while (outputs.length) { + var output = outputs.pop(); + output.innerText = ""; + output.classList.remove("loading-messages"); + } +} + +function displayLoadingMessages(output) { + outputs.push(output); + output.classList.add("loading-messages"); + [ + "Initializing Rockstar engine...", + "Getting ready to rock...", + "Downloading WASM runtime...", + "Writing a set list...", + "DRUM SOLO!", + "Pretending to go off stage...", + "Waiting for audience chant...", + "ENCORE!", + "SECOND ENCORE!", + "THIRD ENCORE!", + "It really should have loaded by now.", + "...you're not on 56kbps dial-up, are you?", + "...you are? Cool. Modem noises ", + "OK, this hasn't worked. Sorry.", + "Maybe try reloading the page?", + "...ok, fine. BASS SOLO.", + ].forEach((message, index) => { + timeouts.push(window.setTimeout(() => output.innerText += message + "\n", 1000 + (1000 * Math.pow(index, 1.5)))); + }); +} + +function executeProgram(program, editorId, input) { + var output = document.getElementById(`rockstar-output-${editorId}`); + var message = { command: "run", program: program, editorId: editorId, input: input }; + if (!starshipLoaded) { + displayLoadingMessages(output); + queuedMessages.push(message); + console.log(queuedMessages); + } else { + rockCount++; + worker.postMessage(message); + } +} + +function parseProgram(program, editorId) { + worker.postMessage({ command: "parse", program: program, editorId: editorId }); +} + +function stopTheRock() { + console.log("STOPPING THE ROCK..."); + clearLoadingMessages(); + worker.terminate(); + worker = new Worker("/js/worker.js", { type: 'module' }); + worker.addEventListener("message", handleMessageFromWorker); + document.querySelectorAll("button.rock-button").forEach((button) => { + button.innerHTML = ROCK_BUTTON_HTML; + }) + rockCount = 0; +} + +function makeParseTreeLogger(parser) { + var textarea = document.getElementById('parseTreeTextarea'); + return function logParseTree(viewUpdate) { + if (viewUpdate.docChanged) { + var source = viewUpdate.state.doc.toString(); + logTree(parser.parse(source), textarea); + } + }; +} + +function logTree(tree, targetElement) { + if (!targetElement) return; + tree = tree.toString(); + var output = []; + var indent = ""; + for (var i = 0; i < tree.length; i++) { + if (tree[i] == ',') { + output.push(' '); + } else if (tree[i] == '(') { + indent += " "; + output.push('\n' + indent); + } else if (tree[i] == ')') { + indent = indent.substring(2); + output.push('\n'); + while (tree[i + 1] == ')') { + indent = indent.substring(2); + i++; + } + output.push(indent); + } else { + output.push(tree[i]); + } + } + targetElement.value = output.join(''); +} + +function makeRockstarRunner(editorId) { + return function handleCtrlEnter({ state, dispatch }) { + document.getElementById(`rockstar-button-${editorId}`).click(); + console.log(state); + console.log(dispatch); + return true; + } +} + +function replaceElementWithEditor({ editorElement, content, languageSupport, theme, editorId, parseTreeElement }) { + let language = (languageSupport ? languageSupport() : null); + let rockstarKeymap = Prec.highest( + keymap.of([ + { key: "Ctrl-Enter", mac: "Cmd-Enter", run: makeRockstarRunner(editorId) } + ]) + ); + let extensions = [basicSetup, rockstarKeymap]; + if (language) extensions.push(language); + if (theme) extensions.push(theme); + if (language && parseTreeElement) { + let logger = makeParseTreeLogger(language.language.parser); + extensions.push(EditorView.updateListener.of(logger.bind(this))); + logTree(language.language.parser.parse(editorElement.innerText), parseTreeElement); + } + + const fixedHeightEditor = EditorView.theme({ + ".cm-content, .cm-gutter": { minHeight: "60px" } + // "&": {height: "300px"}, + // ".cm-scroller": {overflow: "auto"} + }); + extensions.push(fixedHeightEditor); + let view = new EditorView({ doc: content, extensions: extensions }); + editorElement.parentNode.insertBefore(view.dom, editorElement); + editorElement.style.display = "none"; + return view; +} + +function createControls(editorId, editorView, originalSource, controls) { + let div = document.createElement("div"); + div.className = "rockstar-controls"; + let output = document.createElement("div"); + output.className = "output"; + output.showResult = controls.result; + let rockButton = document.createElement("button"); + rockButton.className = "rock-button"; + let parseButton = document.createElement("button"); + let resetButton = document.createElement("button"); + let buttonContainer = document.createElement("div"); + buttonContainer.className = "buttons"; + + rockButton.id = `rockstar-button-${editorId}`; + output.id = `rockstar-output-${editorId}`; + rockButton.innerHTML = ROCK_BUTTON_HTML; + resetButton.innerHTML = "Reset "; + parseButton.innerHTML = "Parse "; + parseButton.onclick = () => { + let source = editorView.state.doc.toString(); + output.classList.add("parse-tree"); + try { + parseProgram(source, editorId); + } catch (e) { + console.log(e); + } + } + rockButton.onclick = () => { + output.classList.remove("parse-tree"); + console.log(rockCount); + if (rockCount > 0) { + stopTheRock(); + } else { + rockButton.innerHTML = STOP_BUTTON_HTML; + output.innerText = ""; + let source = editorView.state.doc.toString(); + let inputTextarea = document.getElementById(`rockstar-input-${editorId}`); + let input = inputTextarea ? inputTextarea.value : ""; + try { + executeProgram(source, editorId, input); + } catch (e) { + console.log(e); + } + } + } + resetButton.onclick = evt => { + output.classList.remove("parse-tree"); + output.innerText = ""; + editorView.dispatch({ + changes: { + from: 0, + to: editorView.state.doc.length, + insert: originalSource + } + }); + } + buttonContainer.appendChild(rockButton); + buttonContainer.appendChild(resetButton); + if (controls.parse) buttonContainer.appendChild(parseButton); + div.appendChild(buttonContainer); + div.appendChild(output); + return div; +} + +let options = ["play", "parse", "reset", "input", "result"]; + +function configureControls(preElement) { + let list = (preElement.getAttribute("data-controls") ?? "").split(","); + let controls = {}; + for (var option of options) controls[option] = true; + if (list.length == 1 && list[0] == '') return controls; + if (list.includes("all")) return controls; + for (var option of options) controls[option] = list.includes(option); + return controls; +} + +var editorId = 1; +document.querySelectorAll(('code.language-rockstar')).forEach((codeElement) => { + let preElement = codeElement.parentElement; + let controls = configureControls(preElement); + editorId++; + var originalSource = codeElement.innerText; + var settings = { + content: originalSource, + editorElement: preElement, + parseTreeTextarea: document.getElementById('parseTreeTextarea'), + language: Rockstar, // Rockstar + theme: deepPurple, // kitchenSink + editorId: editorId + }; + var editorView = replaceElementWithEditor(settings); + if (controls.input) { + let inputDiv = document.createElement("div"); + inputDiv.className = "rockstar-inputs"; + let label = document.createElement("label"); + label.setAttribute("for", `rockstar-input-${editorId}`); + label.innerText = "Input:"; + let input = document.createElement("textarea"); + input.id = `rockstar-input-${editorId}`; + input.className = "rockstar-stdin"; + input.placeholder = "Does your program need input from stdin? Paste it here."; + // input.value = ""; + inputDiv.appendChild(label); + inputDiv.appendChild(input); + preElement.parentNode.insertBefore(inputDiv, preElement); + } + var controlPanel = createControls(editorId, editorView, originalSource, controls); + preElement.parentNode.insertBefore(controlPanel, preElement); +}); + +document.querySelectorAll(('code.language-kitchen-sink')).forEach((codeElement) => { + let preElement = codeElement.parentElement; + editorId++; + var content = codeElement.innerText; + // kitchenSink, blackSabbath, espresso, cobalt, dracula, solarizedLight, coolGlow, amy + let extensions = [ basicSetup, KitchenSink(), deepPurple ]; + let view = new EditorView({ doc: content, extensions: extensions }); + preElement.parentNode.insertBefore(view.dom, preElement); + preElement.style.display = "none"; + return view; +}); + + diff --git a/codewithrockstar.com/js/rockstar-editor.js b/codewithrockstar.com/js/rockstar-editor.js new file mode 100644 index 00000000..60c94c21 --- /dev/null +++ b/codewithrockstar.com/js/rockstar-editor.js @@ -0,0 +1,29657 @@ +import { parser as parser$1 } from 'parsers/kitchen-sink-parser.js'; + +/** +The data structure for documents. @nonabstract +*/ +class Text { + /** + Get the line description around the given position. + */ + lineAt(pos) { + if (pos < 0 || pos > this.length) + throw new RangeError(`Invalid position ${pos} in document of length ${this.length}`); + return this.lineInner(pos, false, 1, 0); + } + /** + Get the description for the given (1-based) line number. + */ + line(n) { + if (n < 1 || n > this.lines) + throw new RangeError(`Invalid line number ${n} in ${this.lines}-line document`); + return this.lineInner(n, true, 1, 0); + } + /** + Replace a range of the text with the given content. + */ + replace(from, to, text) { + [from, to] = clip(this, from, to); + let parts = []; + this.decompose(0, from, parts, 2 /* Open.To */); + if (text.length) + text.decompose(0, text.length, parts, 1 /* Open.From */ | 2 /* Open.To */); + this.decompose(to, this.length, parts, 1 /* Open.From */); + return TextNode.from(parts, this.length - (to - from) + text.length); + } + /** + Append another document to this one. + */ + append(other) { + return this.replace(this.length, this.length, other); + } + /** + Retrieve the text between the given points. + */ + slice(from, to = this.length) { + [from, to] = clip(this, from, to); + let parts = []; + this.decompose(from, to, parts, 0); + return TextNode.from(parts, to - from); + } + /** + Test whether this text is equal to another instance. + */ + eq(other) { + if (other == this) + return true; + if (other.length != this.length || other.lines != this.lines) + return false; + let start = this.scanIdentical(other, 1), end = this.length - this.scanIdentical(other, -1); + let a = new RawTextCursor(this), b = new RawTextCursor(other); + for (let skip = start, pos = start;;) { + a.next(skip); + b.next(skip); + skip = 0; + if (a.lineBreak != b.lineBreak || a.done != b.done || a.value != b.value) + return false; + pos += a.value.length; + if (a.done || pos >= end) + return true; + } + } + /** + Iterate over the text. When `dir` is `-1`, iteration happens + from end to start. This will return lines and the breaks between + them as separate strings. + */ + iter(dir = 1) { return new RawTextCursor(this, dir); } + /** + Iterate over a range of the text. When `from` > `to`, the + iterator will run in reverse. + */ + iterRange(from, to = this.length) { return new PartialTextCursor(this, from, to); } + /** + Return a cursor that iterates over the given range of lines, + _without_ returning the line breaks between, and yielding empty + strings for empty lines. + + When `from` and `to` are given, they should be 1-based line numbers. + */ + iterLines(from, to) { + let inner; + if (from == null) { + inner = this.iter(); + } + else { + if (to == null) + to = this.lines + 1; + let start = this.line(from).from; + inner = this.iterRange(start, Math.max(start, to == this.lines + 1 ? this.length : to <= 1 ? 0 : this.line(to - 1).to)); + } + return new LineCursor(inner); + } + /** + Return the document as a string, using newline characters to + separate lines. + */ + toString() { return this.sliceString(0); } + /** + Convert the document to an array of lines (which can be + deserialized again via [`Text.of`](https://codemirror.net/6/docs/ref/#state.Text^of)). + */ + toJSON() { + let lines = []; + this.flatten(lines); + return lines; + } + /** + @internal + */ + constructor() { } + /** + Create a `Text` instance for the given array of lines. + */ + static of(text) { + if (text.length == 0) + throw new RangeError("A document must have at least one line"); + if (text.length == 1 && !text[0]) + return Text.empty; + return text.length <= 32 /* Tree.Branch */ ? new TextLeaf(text) : TextNode.from(TextLeaf.split(text, [])); + } +} +// Leaves store an array of line strings. There are always line breaks +// between these strings. Leaves are limited in size and have to be +// contained in TextNode instances for bigger documents. +class TextLeaf extends Text { + constructor(text, length = textLength(text)) { + super(); + this.text = text; + this.length = length; + } + get lines() { return this.text.length; } + get children() { return null; } + lineInner(target, isLine, line, offset) { + for (let i = 0;; i++) { + let string = this.text[i], end = offset + string.length; + if ((isLine ? line : end) >= target) + return new Line(offset, end, line, string); + offset = end + 1; + line++; + } + } + decompose(from, to, target, open) { + let text = from <= 0 && to >= this.length ? this + : new TextLeaf(sliceText(this.text, from, to), Math.min(to, this.length) - Math.max(0, from)); + if (open & 1 /* Open.From */) { + let prev = target.pop(); + let joined = appendText(text.text, prev.text.slice(), 0, text.length); + if (joined.length <= 32 /* Tree.Branch */) { + target.push(new TextLeaf(joined, prev.length + text.length)); + } + else { + let mid = joined.length >> 1; + target.push(new TextLeaf(joined.slice(0, mid)), new TextLeaf(joined.slice(mid))); + } + } + else { + target.push(text); + } + } + replace(from, to, text) { + if (!(text instanceof TextLeaf)) + return super.replace(from, to, text); + [from, to] = clip(this, from, to); + let lines = appendText(this.text, appendText(text.text, sliceText(this.text, 0, from)), to); + let newLen = this.length + text.length - (to - from); + if (lines.length <= 32 /* Tree.Branch */) + return new TextLeaf(lines, newLen); + return TextNode.from(TextLeaf.split(lines, []), newLen); + } + sliceString(from, to = this.length, lineSep = "\n") { + [from, to] = clip(this, from, to); + let result = ""; + for (let pos = 0, i = 0; pos <= to && i < this.text.length; i++) { + let line = this.text[i], end = pos + line.length; + if (pos > from && i) + result += lineSep; + if (from < end && to > pos) + result += line.slice(Math.max(0, from - pos), to - pos); + pos = end + 1; + } + return result; + } + flatten(target) { + for (let line of this.text) + target.push(line); + } + scanIdentical() { return 0; } + static split(text, target) { + let part = [], len = -1; + for (let line of text) { + part.push(line); + len += line.length + 1; + if (part.length == 32 /* Tree.Branch */) { + target.push(new TextLeaf(part, len)); + part = []; + len = -1; + } + } + if (len > -1) + target.push(new TextLeaf(part, len)); + return target; + } +} +// Nodes provide the tree structure of the `Text` type. They store a +// number of other nodes or leaves, taking care to balance themselves +// on changes. There are implied line breaks _between_ the children of +// a node (but not before the first or after the last child). +class TextNode extends Text { + constructor(children, length) { + super(); + this.children = children; + this.length = length; + this.lines = 0; + for (let child of children) + this.lines += child.lines; + } + lineInner(target, isLine, line, offset) { + for (let i = 0;; i++) { + let child = this.children[i], end = offset + child.length, endLine = line + child.lines - 1; + if ((isLine ? endLine : end) >= target) + return child.lineInner(target, isLine, line, offset); + offset = end + 1; + line = endLine + 1; + } + } + decompose(from, to, target, open) { + for (let i = 0, pos = 0; pos <= to && i < this.children.length; i++) { + let child = this.children[i], end = pos + child.length; + if (from <= end && to >= pos) { + let childOpen = open & ((pos <= from ? 1 /* Open.From */ : 0) | (end >= to ? 2 /* Open.To */ : 0)); + if (pos >= from && end <= to && !childOpen) + target.push(child); + else + child.decompose(from - pos, to - pos, target, childOpen); + } + pos = end + 1; + } + } + replace(from, to, text) { + [from, to] = clip(this, from, to); + if (text.lines < this.lines) + for (let i = 0, pos = 0; i < this.children.length; i++) { + let child = this.children[i], end = pos + child.length; + // Fast path: if the change only affects one child and the + // child's size remains in the acceptable range, only update + // that child + if (from >= pos && to <= end) { + let updated = child.replace(from - pos, to - pos, text); + let totalLines = this.lines - child.lines + updated.lines; + if (updated.lines < (totalLines >> (5 /* Tree.BranchShift */ - 1)) && + updated.lines > (totalLines >> (5 /* Tree.BranchShift */ + 1))) { + let copy = this.children.slice(); + copy[i] = updated; + return new TextNode(copy, this.length - (to - from) + text.length); + } + return super.replace(pos, end, updated); + } + pos = end + 1; + } + return super.replace(from, to, text); + } + sliceString(from, to = this.length, lineSep = "\n") { + [from, to] = clip(this, from, to); + let result = ""; + for (let i = 0, pos = 0; i < this.children.length && pos <= to; i++) { + let child = this.children[i], end = pos + child.length; + if (pos > from && i) + result += lineSep; + if (from < end && to > pos) + result += child.sliceString(from - pos, to - pos, lineSep); + pos = end + 1; + } + return result; + } + flatten(target) { + for (let child of this.children) + child.flatten(target); + } + scanIdentical(other, dir) { + if (!(other instanceof TextNode)) + return 0; + let length = 0; + let [iA, iB, eA, eB] = dir > 0 ? [0, 0, this.children.length, other.children.length] + : [this.children.length - 1, other.children.length - 1, -1, -1]; + for (;; iA += dir, iB += dir) { + if (iA == eA || iB == eB) + return length; + let chA = this.children[iA], chB = other.children[iB]; + if (chA != chB) + return length + chA.scanIdentical(chB, dir); + length += chA.length + 1; + } + } + static from(children, length = children.reduce((l, ch) => l + ch.length + 1, -1)) { + let lines = 0; + for (let ch of children) + lines += ch.lines; + if (lines < 32 /* Tree.Branch */) { + let flat = []; + for (let ch of children) + ch.flatten(flat); + return new TextLeaf(flat, length); + } + let chunk = Math.max(32 /* Tree.Branch */, lines >> 5 /* Tree.BranchShift */), maxChunk = chunk << 1, minChunk = chunk >> 1; + let chunked = [], currentLines = 0, currentLen = -1, currentChunk = []; + function add(child) { + let last; + if (child.lines > maxChunk && child instanceof TextNode) { + for (let node of child.children) + add(node); + } + else if (child.lines > minChunk && (currentLines > minChunk || !currentLines)) { + flush(); + chunked.push(child); + } + else if (child instanceof TextLeaf && currentLines && + (last = currentChunk[currentChunk.length - 1]) instanceof TextLeaf && + child.lines + last.lines <= 32 /* Tree.Branch */) { + currentLines += child.lines; + currentLen += child.length + 1; + currentChunk[currentChunk.length - 1] = new TextLeaf(last.text.concat(child.text), last.length + 1 + child.length); + } + else { + if (currentLines + child.lines > chunk) + flush(); + currentLines += child.lines; + currentLen += child.length + 1; + currentChunk.push(child); + } + } + function flush() { + if (currentLines == 0) + return; + chunked.push(currentChunk.length == 1 ? currentChunk[0] : TextNode.from(currentChunk, currentLen)); + currentLen = -1; + currentLines = currentChunk.length = 0; + } + for (let child of children) + add(child); + flush(); + return chunked.length == 1 ? chunked[0] : new TextNode(chunked, length); + } +} +Text.empty = /*@__PURE__*/new TextLeaf([""], 0); +function textLength(text) { + let length = -1; + for (let line of text) + length += line.length + 1; + return length; +} +function appendText(text, target, from = 0, to = 1e9) { + for (let pos = 0, i = 0, first = true; i < text.length && pos <= to; i++) { + let line = text[i], end = pos + line.length; + if (end >= from) { + if (end > to) + line = line.slice(0, to - pos); + if (pos < from) + line = line.slice(from - pos); + if (first) { + target[target.length - 1] += line; + first = false; + } + else + target.push(line); + } + pos = end + 1; + } + return target; +} +function sliceText(text, from, to) { + return appendText(text, [""], from, to); +} +class RawTextCursor { + constructor(text, dir = 1) { + this.dir = dir; + this.done = false; + this.lineBreak = false; + this.value = ""; + this.nodes = [text]; + this.offsets = [dir > 0 ? 1 : (text instanceof TextLeaf ? text.text.length : text.children.length) << 1]; + } + nextInner(skip, dir) { + this.done = this.lineBreak = false; + for (;;) { + let last = this.nodes.length - 1; + let top = this.nodes[last], offsetValue = this.offsets[last], offset = offsetValue >> 1; + let size = top instanceof TextLeaf ? top.text.length : top.children.length; + if (offset == (dir > 0 ? size : 0)) { + if (last == 0) { + this.done = true; + this.value = ""; + return this; + } + if (dir > 0) + this.offsets[last - 1]++; + this.nodes.pop(); + this.offsets.pop(); + } + else if ((offsetValue & 1) == (dir > 0 ? 0 : 1)) { + this.offsets[last] += dir; + if (skip == 0) { + this.lineBreak = true; + this.value = "\n"; + return this; + } + skip--; + } + else if (top instanceof TextLeaf) { + // Move to the next string + let next = top.text[offset + (dir < 0 ? -1 : 0)]; + this.offsets[last] += dir; + if (next.length > Math.max(0, skip)) { + this.value = skip == 0 ? next : dir > 0 ? next.slice(skip) : next.slice(0, next.length - skip); + return this; + } + skip -= next.length; + } + else { + let next = top.children[offset + (dir < 0 ? -1 : 0)]; + if (skip > next.length) { + skip -= next.length; + this.offsets[last] += dir; + } + else { + if (dir < 0) + this.offsets[last]--; + this.nodes.push(next); + this.offsets.push(dir > 0 ? 1 : (next instanceof TextLeaf ? next.text.length : next.children.length) << 1); + } + } + } + } + next(skip = 0) { + if (skip < 0) { + this.nextInner(-skip, (-this.dir)); + skip = this.value.length; + } + return this.nextInner(skip, this.dir); + } +} +class PartialTextCursor { + constructor(text, start, end) { + this.value = ""; + this.done = false; + this.cursor = new RawTextCursor(text, start > end ? -1 : 1); + this.pos = start > end ? text.length : 0; + this.from = Math.min(start, end); + this.to = Math.max(start, end); + } + nextInner(skip, dir) { + if (dir < 0 ? this.pos <= this.from : this.pos >= this.to) { + this.value = ""; + this.done = true; + return this; + } + skip += Math.max(0, dir < 0 ? this.pos - this.to : this.from - this.pos); + let limit = dir < 0 ? this.pos - this.from : this.to - this.pos; + if (skip > limit) + skip = limit; + limit -= skip; + let { value } = this.cursor.next(skip); + this.pos += (value.length + skip) * dir; + this.value = value.length <= limit ? value : dir < 0 ? value.slice(value.length - limit) : value.slice(0, limit); + this.done = !this.value; + return this; + } + next(skip = 0) { + if (skip < 0) + skip = Math.max(skip, this.from - this.pos); + else if (skip > 0) + skip = Math.min(skip, this.to - this.pos); + return this.nextInner(skip, this.cursor.dir); + } + get lineBreak() { return this.cursor.lineBreak && this.value != ""; } +} +class LineCursor { + constructor(inner) { + this.inner = inner; + this.afterBreak = true; + this.value = ""; + this.done = false; + } + next(skip = 0) { + let { done, lineBreak, value } = this.inner.next(skip); + if (done && this.afterBreak) { + this.value = ""; + this.afterBreak = false; + } + else if (done) { + this.done = true; + this.value = ""; + } + else if (lineBreak) { + if (this.afterBreak) { + this.value = ""; + } + else { + this.afterBreak = true; + this.next(); + } + } + else { + this.value = value; + this.afterBreak = false; + } + return this; + } + get lineBreak() { return false; } +} +if (typeof Symbol != "undefined") { + Text.prototype[Symbol.iterator] = function () { return this.iter(); }; + RawTextCursor.prototype[Symbol.iterator] = PartialTextCursor.prototype[Symbol.iterator] = + LineCursor.prototype[Symbol.iterator] = function () { return this; }; +} +/** +This type describes a line in the document. It is created +on-demand when lines are [queried](https://codemirror.net/6/docs/ref/#state.Text.lineAt). +*/ +class Line { + /** + @internal + */ + constructor( + /** + The position of the start of the line. + */ + from, + /** + The position at the end of the line (_before_ the line break, + or at the end of document for the last line). + */ + to, + /** + This line's line number (1-based). + */ + number, + /** + The line's content. + */ + text) { + this.from = from; + this.to = to; + this.number = number; + this.text = text; + } + /** + The length of the line (not including any line break after it). + */ + get length() { return this.to - this.from; } +} +function clip(text, from, to) { + from = Math.max(0, Math.min(text.length, from)); + return [from, Math.max(from, Math.min(text.length, to))]; +} + +// Compressed representation of the Grapheme_Cluster_Break=Extend +// information from +// http://www.unicode.org/Public/13.0.0/ucd/auxiliary/GraphemeBreakProperty.txt. +// Each pair of elements represents a range, as an offet from the +// previous range and a length. Numbers are in base-36, with the empty +// string being a shorthand for 1. +let extend = /*@__PURE__*/"lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map(s => s ? parseInt(s, 36) : 1); +// Convert offsets into absolute values +for (let i = 1; i < extend.length; i++) + extend[i] += extend[i - 1]; +function isExtendingChar(code) { + for (let i = 1; i < extend.length; i += 2) + if (extend[i] > code) + return extend[i - 1] <= code; + return false; +} +function isRegionalIndicator(code) { + return code >= 0x1F1E6 && code <= 0x1F1FF; +} +const ZWJ = 0x200d; +/** +Returns a next grapheme cluster break _after_ (not equal to) +`pos`, if `forward` is true, or before otherwise. Returns `pos` +itself if no further cluster break is available in the string. +Moves across surrogate pairs, extending characters (when +`includeExtending` is true), characters joined with zero-width +joiners, and flag emoji. +*/ +function findClusterBreak(str, pos, forward = true, includeExtending = true) { + return (forward ? nextClusterBreak : prevClusterBreak)(str, pos, includeExtending); +} +function nextClusterBreak(str, pos, includeExtending) { + if (pos == str.length) + return pos; + // If pos is in the middle of a surrogate pair, move to its start + if (pos && surrogateLow(str.charCodeAt(pos)) && surrogateHigh(str.charCodeAt(pos - 1))) + pos--; + let prev = codePointAt(str, pos); + pos += codePointSize(prev); + while (pos < str.length) { + let next = codePointAt(str, pos); + if (prev == ZWJ || next == ZWJ || includeExtending && isExtendingChar(next)) { + pos += codePointSize(next); + prev = next; + } + else if (isRegionalIndicator(next)) { + let countBefore = 0, i = pos - 2; + while (i >= 0 && isRegionalIndicator(codePointAt(str, i))) { + countBefore++; + i -= 2; + } + if (countBefore % 2 == 0) + break; + else + pos += 2; + } + else { + break; + } + } + return pos; +} +function prevClusterBreak(str, pos, includeExtending) { + while (pos > 0) { + let found = nextClusterBreak(str, pos - 2, includeExtending); + if (found < pos) + return found; + pos--; + } + return 0; +} +function surrogateLow(ch) { return ch >= 0xDC00 && ch < 0xE000; } +function surrogateHigh(ch) { return ch >= 0xD800 && ch < 0xDC00; } +/** +Find the code point at the given position in a string (like the +[`codePointAt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) +string method). +*/ +function codePointAt(str, pos) { + let code0 = str.charCodeAt(pos); + if (!surrogateHigh(code0) || pos + 1 == str.length) + return code0; + let code1 = str.charCodeAt(pos + 1); + if (!surrogateLow(code1)) + return code0; + return ((code0 - 0xd800) << 10) + (code1 - 0xdc00) + 0x10000; +} +/** +Given a Unicode codepoint, return the JavaScript string that +respresents it (like +[`String.fromCodePoint`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCodePoint)). +*/ +function fromCodePoint(code) { + if (code <= 0xffff) + return String.fromCharCode(code); + code -= 0x10000; + return String.fromCharCode((code >> 10) + 0xd800, (code & 1023) + 0xdc00); +} +/** +The amount of positions a character takes up a JavaScript string. +*/ +function codePointSize(code) { return code < 0x10000 ? 1 : 2; } + +const DefaultSplit = /\r\n?|\n/; +/** +Distinguishes different ways in which positions can be mapped. +*/ +var MapMode = /*@__PURE__*/(function (MapMode) { + /** + Map a position to a valid new position, even when its context + was deleted. + */ + MapMode[MapMode["Simple"] = 0] = "Simple"; + /** + Return null if deletion happens across the position. + */ + MapMode[MapMode["TrackDel"] = 1] = "TrackDel"; + /** + Return null if the character _before_ the position is deleted. + */ + MapMode[MapMode["TrackBefore"] = 2] = "TrackBefore"; + /** + Return null if the character _after_ the position is deleted. + */ + MapMode[MapMode["TrackAfter"] = 3] = "TrackAfter"; +return MapMode})(MapMode || (MapMode = {})); +/** +A change description is a variant of [change set](https://codemirror.net/6/docs/ref/#state.ChangeSet) +that doesn't store the inserted text. As such, it can't be +applied, but is cheaper to store and manipulate. +*/ +class ChangeDesc { + // Sections are encoded as pairs of integers. The first is the + // length in the current document, and the second is -1 for + // unaffected sections, and the length of the replacement content + // otherwise. So an insertion would be (0, n>0), a deletion (n>0, + // 0), and a replacement two positive numbers. + /** + @internal + */ + constructor( + /** + @internal + */ + sections) { + this.sections = sections; + } + /** + The length of the document before the change. + */ + get length() { + let result = 0; + for (let i = 0; i < this.sections.length; i += 2) + result += this.sections[i]; + return result; + } + /** + The length of the document after the change. + */ + get newLength() { + let result = 0; + for (let i = 0; i < this.sections.length; i += 2) { + let ins = this.sections[i + 1]; + result += ins < 0 ? this.sections[i] : ins; + } + return result; + } + /** + False when there are actual changes in this set. + */ + get empty() { return this.sections.length == 0 || this.sections.length == 2 && this.sections[1] < 0; } + /** + Iterate over the unchanged parts left by these changes. `posA` + provides the position of the range in the old document, `posB` + the new position in the changed document. + */ + iterGaps(f) { + for (let i = 0, posA = 0, posB = 0; i < this.sections.length;) { + let len = this.sections[i++], ins = this.sections[i++]; + if (ins < 0) { + f(posA, posB, len); + posB += len; + } + else { + posB += ins; + } + posA += len; + } + } + /** + Iterate over the ranges changed by these changes. (See + [`ChangeSet.iterChanges`](https://codemirror.net/6/docs/ref/#state.ChangeSet.iterChanges) for a + variant that also provides you with the inserted text.) + `fromA`/`toA` provides the extent of the change in the starting + document, `fromB`/`toB` the extent of the replacement in the + changed document. + + When `individual` is true, adjacent changes (which are kept + separate for [position mapping](https://codemirror.net/6/docs/ref/#state.ChangeDesc.mapPos)) are + reported separately. + */ + iterChangedRanges(f, individual = false) { + iterChanges(this, f, individual); + } + /** + Get a description of the inverted form of these changes. + */ + get invertedDesc() { + let sections = []; + for (let i = 0; i < this.sections.length;) { + let len = this.sections[i++], ins = this.sections[i++]; + if (ins < 0) + sections.push(len, ins); + else + sections.push(ins, len); + } + return new ChangeDesc(sections); + } + /** + Compute the combined effect of applying another set of changes + after this one. The length of the document after this set should + match the length before `other`. + */ + composeDesc(other) { return this.empty ? other : other.empty ? this : composeSets(this, other); } + /** + Map this description, which should start with the same document + as `other`, over another set of changes, so that it can be + applied after it. When `before` is true, map as if the changes + in `other` happened before the ones in `this`. + */ + mapDesc(other, before = false) { return other.empty ? this : mapSet(this, other, before); } + mapPos(pos, assoc = -1, mode = MapMode.Simple) { + let posA = 0, posB = 0; + for (let i = 0; i < this.sections.length;) { + let len = this.sections[i++], ins = this.sections[i++], endA = posA + len; + if (ins < 0) { + if (endA > pos) + return posB + (pos - posA); + posB += len; + } + else { + if (mode != MapMode.Simple && endA >= pos && + (mode == MapMode.TrackDel && posA < pos && endA > pos || + mode == MapMode.TrackBefore && posA < pos || + mode == MapMode.TrackAfter && endA > pos)) + return null; + if (endA > pos || endA == pos && assoc < 0 && !len) + return pos == posA || assoc < 0 ? posB : posB + ins; + posB += ins; + } + posA = endA; + } + if (pos > posA) + throw new RangeError(`Position ${pos} is out of range for changeset of length ${posA}`); + return posB; + } + /** + Check whether these changes touch a given range. When one of the + changes entirely covers the range, the string `"cover"` is + returned. + */ + touchesRange(from, to = from) { + for (let i = 0, pos = 0; i < this.sections.length && pos <= to;) { + let len = this.sections[i++], ins = this.sections[i++], end = pos + len; + if (ins >= 0 && pos <= to && end >= from) + return pos < from && end > to ? "cover" : true; + pos = end; + } + return false; + } + /** + @internal + */ + toString() { + let result = ""; + for (let i = 0; i < this.sections.length;) { + let len = this.sections[i++], ins = this.sections[i++]; + result += (result ? " " : "") + len + (ins >= 0 ? ":" + ins : ""); + } + return result; + } + /** + Serialize this change desc to a JSON-representable value. + */ + toJSON() { return this.sections; } + /** + Create a change desc from its JSON representation (as produced + by [`toJSON`](https://codemirror.net/6/docs/ref/#state.ChangeDesc.toJSON). + */ + static fromJSON(json) { + if (!Array.isArray(json) || json.length % 2 || json.some(a => typeof a != "number")) + throw new RangeError("Invalid JSON representation of ChangeDesc"); + return new ChangeDesc(json); + } + /** + @internal + */ + static create(sections) { return new ChangeDesc(sections); } +} +/** +A change set represents a group of modifications to a document. It +stores the document length, and can only be applied to documents +with exactly that length. +*/ +class ChangeSet extends ChangeDesc { + constructor(sections, + /** + @internal + */ + inserted) { + super(sections); + this.inserted = inserted; + } + /** + Apply the changes to a document, returning the modified + document. + */ + apply(doc) { + if (this.length != doc.length) + throw new RangeError("Applying change set to a document with the wrong length"); + iterChanges(this, (fromA, toA, fromB, _toB, text) => doc = doc.replace(fromB, fromB + (toA - fromA), text), false); + return doc; + } + mapDesc(other, before = false) { return mapSet(this, other, before, true); } + /** + Given the document as it existed _before_ the changes, return a + change set that represents the inverse of this set, which could + be used to go from the document created by the changes back to + the document as it existed before the changes. + */ + invert(doc) { + let sections = this.sections.slice(), inserted = []; + for (let i = 0, pos = 0; i < sections.length; i += 2) { + let len = sections[i], ins = sections[i + 1]; + if (ins >= 0) { + sections[i] = ins; + sections[i + 1] = len; + let index = i >> 1; + while (inserted.length < index) + inserted.push(Text.empty); + inserted.push(len ? doc.slice(pos, pos + len) : Text.empty); + } + pos += len; + } + return new ChangeSet(sections, inserted); + } + /** + Combine two subsequent change sets into a single set. `other` + must start in the document produced by `this`. If `this` goes + `docA` → `docB` and `other` represents `docB` → `docC`, the + returned value will represent the change `docA` → `docC`. + */ + compose(other) { return this.empty ? other : other.empty ? this : composeSets(this, other, true); } + /** + Given another change set starting in the same document, maps this + change set over the other, producing a new change set that can be + applied to the document produced by applying `other`. When + `before` is `true`, order changes as if `this` comes before + `other`, otherwise (the default) treat `other` as coming first. + + Given two changes `A` and `B`, `A.compose(B.map(A))` and + `B.compose(A.map(B, true))` will produce the same document. This + provides a basic form of [operational + transformation](https://en.wikipedia.org/wiki/Operational_transformation), + and can be used for collaborative editing. + */ + map(other, before = false) { return other.empty ? this : mapSet(this, other, before, true); } + /** + Iterate over the changed ranges in the document, calling `f` for + each, with the range in the original document (`fromA`-`toA`) + and the range that replaces it in the new document + (`fromB`-`toB`). + + When `individual` is true, adjacent changes are reported + separately. + */ + iterChanges(f, individual = false) { + iterChanges(this, f, individual); + } + /** + Get a [change description](https://codemirror.net/6/docs/ref/#state.ChangeDesc) for this change + set. + */ + get desc() { return ChangeDesc.create(this.sections); } + /** + @internal + */ + filter(ranges) { + let resultSections = [], resultInserted = [], filteredSections = []; + let iter = new SectionIter(this); + done: for (let i = 0, pos = 0;;) { + let next = i == ranges.length ? 1e9 : ranges[i++]; + while (pos < next || pos == next && iter.len == 0) { + if (iter.done) + break done; + let len = Math.min(iter.len, next - pos); + addSection(filteredSections, len, -1); + let ins = iter.ins == -1 ? -1 : iter.off == 0 ? iter.ins : 0; + addSection(resultSections, len, ins); + if (ins > 0) + addInsert(resultInserted, resultSections, iter.text); + iter.forward(len); + pos += len; + } + let end = ranges[i++]; + while (pos < end) { + if (iter.done) + break done; + let len = Math.min(iter.len, end - pos); + addSection(resultSections, len, -1); + addSection(filteredSections, len, iter.ins == -1 ? -1 : iter.off == 0 ? iter.ins : 0); + iter.forward(len); + pos += len; + } + } + return { changes: new ChangeSet(resultSections, resultInserted), + filtered: ChangeDesc.create(filteredSections) }; + } + /** + Serialize this change set to a JSON-representable value. + */ + toJSON() { + let parts = []; + for (let i = 0; i < this.sections.length; i += 2) { + let len = this.sections[i], ins = this.sections[i + 1]; + if (ins < 0) + parts.push(len); + else if (ins == 0) + parts.push([len]); + else + parts.push([len].concat(this.inserted[i >> 1].toJSON())); + } + return parts; + } + /** + Create a change set for the given changes, for a document of the + given length, using `lineSep` as line separator. + */ + static of(changes, length, lineSep) { + let sections = [], inserted = [], pos = 0; + let total = null; + function flush(force = false) { + if (!force && !sections.length) + return; + if (pos < length) + addSection(sections, length - pos, -1); + let set = new ChangeSet(sections, inserted); + total = total ? total.compose(set.map(total)) : set; + sections = []; + inserted = []; + pos = 0; + } + function process(spec) { + if (Array.isArray(spec)) { + for (let sub of spec) + process(sub); + } + else if (spec instanceof ChangeSet) { + if (spec.length != length) + throw new RangeError(`Mismatched change set length (got ${spec.length}, expected ${length})`); + flush(); + total = total ? total.compose(spec.map(total)) : spec; + } + else { + let { from, to = from, insert } = spec; + if (from > to || from < 0 || to > length) + throw new RangeError(`Invalid change range ${from} to ${to} (in doc of length ${length})`); + let insText = !insert ? Text.empty : typeof insert == "string" ? Text.of(insert.split(lineSep || DefaultSplit)) : insert; + let insLen = insText.length; + if (from == to && insLen == 0) + return; + if (from < pos) + flush(); + if (from > pos) + addSection(sections, from - pos, -1); + addSection(sections, to - from, insLen); + addInsert(inserted, sections, insText); + pos = to; + } + } + process(changes); + flush(!total); + return total; + } + /** + Create an empty changeset of the given length. + */ + static empty(length) { + return new ChangeSet(length ? [length, -1] : [], []); + } + /** + Create a changeset from its JSON representation (as produced by + [`toJSON`](https://codemirror.net/6/docs/ref/#state.ChangeSet.toJSON). + */ + static fromJSON(json) { + if (!Array.isArray(json)) + throw new RangeError("Invalid JSON representation of ChangeSet"); + let sections = [], inserted = []; + for (let i = 0; i < json.length; i++) { + let part = json[i]; + if (typeof part == "number") { + sections.push(part, -1); + } + else if (!Array.isArray(part) || typeof part[0] != "number" || part.some((e, i) => i && typeof e != "string")) { + throw new RangeError("Invalid JSON representation of ChangeSet"); + } + else if (part.length == 1) { + sections.push(part[0], 0); + } + else { + while (inserted.length < i) + inserted.push(Text.empty); + inserted[i] = Text.of(part.slice(1)); + sections.push(part[0], inserted[i].length); + } + } + return new ChangeSet(sections, inserted); + } + /** + @internal + */ + static createSet(sections, inserted) { + return new ChangeSet(sections, inserted); + } +} +function addSection(sections, len, ins, forceJoin = false) { + if (len == 0 && ins <= 0) + return; + let last = sections.length - 2; + if (last >= 0 && ins <= 0 && ins == sections[last + 1]) + sections[last] += len; + else if (len == 0 && sections[last] == 0) + sections[last + 1] += ins; + else if (forceJoin) { + sections[last] += len; + sections[last + 1] += ins; + } + else + sections.push(len, ins); +} +function addInsert(values, sections, value) { + if (value.length == 0) + return; + let index = (sections.length - 2) >> 1; + if (index < values.length) { + values[values.length - 1] = values[values.length - 1].append(value); + } + else { + while (values.length < index) + values.push(Text.empty); + values.push(value); + } +} +function iterChanges(desc, f, individual) { + let inserted = desc.inserted; + for (let posA = 0, posB = 0, i = 0; i < desc.sections.length;) { + let len = desc.sections[i++], ins = desc.sections[i++]; + if (ins < 0) { + posA += len; + posB += len; + } + else { + let endA = posA, endB = posB, text = Text.empty; + for (;;) { + endA += len; + endB += ins; + if (ins && inserted) + text = text.append(inserted[(i - 2) >> 1]); + if (individual || i == desc.sections.length || desc.sections[i + 1] < 0) + break; + len = desc.sections[i++]; + ins = desc.sections[i++]; + } + f(posA, endA, posB, endB, text); + posA = endA; + posB = endB; + } + } +} +function mapSet(setA, setB, before, mkSet = false) { + // Produce a copy of setA that applies to the document after setB + // has been applied (assuming both start at the same document). + let sections = [], insert = mkSet ? [] : null; + let a = new SectionIter(setA), b = new SectionIter(setB); + // Iterate over both sets in parallel. inserted tracks, for changes + // in A that have to be processed piece-by-piece, whether their + // content has been inserted already, and refers to the section + // index. + for (let inserted = -1;;) { + if (a.ins == -1 && b.ins == -1) { + // Move across ranges skipped by both sets. + let len = Math.min(a.len, b.len); + addSection(sections, len, -1); + a.forward(len); + b.forward(len); + } + else if (b.ins >= 0 && (a.ins < 0 || inserted == a.i || a.off == 0 && (b.len < a.len || b.len == a.len && !before))) { + // If there's a change in B that comes before the next change in + // A (ordered by start pos, then len, then before flag), skip + // that (and process any changes in A it covers). + let len = b.len; + addSection(sections, b.ins, -1); + while (len) { + let piece = Math.min(a.len, len); + if (a.ins >= 0 && inserted < a.i && a.len <= piece) { + addSection(sections, 0, a.ins); + if (insert) + addInsert(insert, sections, a.text); + inserted = a.i; + } + a.forward(piece); + len -= piece; + } + b.next(); + } + else if (a.ins >= 0) { + // Process the part of a change in A up to the start of the next + // non-deletion change in B (if overlapping). + let len = 0, left = a.len; + while (left) { + if (b.ins == -1) { + let piece = Math.min(left, b.len); + len += piece; + left -= piece; + b.forward(piece); + } + else if (b.ins == 0 && b.len < left) { + left -= b.len; + b.next(); + } + else { + break; + } + } + addSection(sections, len, inserted < a.i ? a.ins : 0); + if (insert && inserted < a.i) + addInsert(insert, sections, a.text); + inserted = a.i; + a.forward(a.len - left); + } + else if (a.done && b.done) { + return insert ? ChangeSet.createSet(sections, insert) : ChangeDesc.create(sections); + } + else { + throw new Error("Mismatched change set lengths"); + } + } +} +function composeSets(setA, setB, mkSet = false) { + let sections = []; + let insert = mkSet ? [] : null; + let a = new SectionIter(setA), b = new SectionIter(setB); + for (let open = false;;) { + if (a.done && b.done) { + return insert ? ChangeSet.createSet(sections, insert) : ChangeDesc.create(sections); + } + else if (a.ins == 0) { // Deletion in A + addSection(sections, a.len, 0, open); + a.next(); + } + else if (b.len == 0 && !b.done) { // Insertion in B + addSection(sections, 0, b.ins, open); + if (insert) + addInsert(insert, sections, b.text); + b.next(); + } + else if (a.done || b.done) { + throw new Error("Mismatched change set lengths"); + } + else { + let len = Math.min(a.len2, b.len), sectionLen = sections.length; + if (a.ins == -1) { + let insB = b.ins == -1 ? -1 : b.off ? 0 : b.ins; + addSection(sections, len, insB, open); + if (insert && insB) + addInsert(insert, sections, b.text); + } + else if (b.ins == -1) { + addSection(sections, a.off ? 0 : a.len, len, open); + if (insert) + addInsert(insert, sections, a.textBit(len)); + } + else { + addSection(sections, a.off ? 0 : a.len, b.off ? 0 : b.ins, open); + if (insert && !b.off) + addInsert(insert, sections, b.text); + } + open = (a.ins > len || b.ins >= 0 && b.len > len) && (open || sections.length > sectionLen); + a.forward2(len); + b.forward(len); + } + } +} +class SectionIter { + constructor(set) { + this.set = set; + this.i = 0; + this.next(); + } + next() { + let { sections } = this.set; + if (this.i < sections.length) { + this.len = sections[this.i++]; + this.ins = sections[this.i++]; + } + else { + this.len = 0; + this.ins = -2; + } + this.off = 0; + } + get done() { return this.ins == -2; } + get len2() { return this.ins < 0 ? this.len : this.ins; } + get text() { + let { inserted } = this.set, index = (this.i - 2) >> 1; + return index >= inserted.length ? Text.empty : inserted[index]; + } + textBit(len) { + let { inserted } = this.set, index = (this.i - 2) >> 1; + return index >= inserted.length && !len ? Text.empty + : inserted[index].slice(this.off, len == null ? undefined : this.off + len); + } + forward(len) { + if (len == this.len) + this.next(); + else { + this.len -= len; + this.off += len; + } + } + forward2(len) { + if (this.ins == -1) + this.forward(len); + else if (len == this.ins) + this.next(); + else { + this.ins -= len; + this.off += len; + } + } +} + +/** +A single selection range. When +[`allowMultipleSelections`](https://codemirror.net/6/docs/ref/#state.EditorState^allowMultipleSelections) +is enabled, a [selection](https://codemirror.net/6/docs/ref/#state.EditorSelection) may hold +multiple ranges. By default, selections hold exactly one range. +*/ +class SelectionRange { + constructor( + /** + The lower boundary of the range. + */ + from, + /** + The upper boundary of the range. + */ + to, flags) { + this.from = from; + this.to = to; + this.flags = flags; + } + /** + The anchor of the range—the side that doesn't move when you + extend it. + */ + get anchor() { return this.flags & 32 /* RangeFlag.Inverted */ ? this.to : this.from; } + /** + The head of the range, which is moved when the range is + [extended](https://codemirror.net/6/docs/ref/#state.SelectionRange.extend). + */ + get head() { return this.flags & 32 /* RangeFlag.Inverted */ ? this.from : this.to; } + /** + True when `anchor` and `head` are at the same position. + */ + get empty() { return this.from == this.to; } + /** + If this is a cursor that is explicitly associated with the + character on one of its sides, this returns the side. -1 means + the character before its position, 1 the character after, and 0 + means no association. + */ + get assoc() { return this.flags & 8 /* RangeFlag.AssocBefore */ ? -1 : this.flags & 16 /* RangeFlag.AssocAfter */ ? 1 : 0; } + /** + The bidirectional text level associated with this cursor, if + any. + */ + get bidiLevel() { + let level = this.flags & 7 /* RangeFlag.BidiLevelMask */; + return level == 7 ? null : level; + } + /** + The goal column (stored vertical offset) associated with a + cursor. This is used to preserve the vertical position when + [moving](https://codemirror.net/6/docs/ref/#view.EditorView.moveVertically) across + lines of different length. + */ + get goalColumn() { + let value = this.flags >> 6 /* RangeFlag.GoalColumnOffset */; + return value == 16777215 /* RangeFlag.NoGoalColumn */ ? undefined : value; + } + /** + Map this range through a change, producing a valid range in the + updated document. + */ + map(change, assoc = -1) { + let from, to; + if (this.empty) { + from = to = change.mapPos(this.from, assoc); + } + else { + from = change.mapPos(this.from, 1); + to = change.mapPos(this.to, -1); + } + return from == this.from && to == this.to ? this : new SelectionRange(from, to, this.flags); + } + /** + Extend this range to cover at least `from` to `to`. + */ + extend(from, to = from) { + if (from <= this.anchor && to >= this.anchor) + return EditorSelection.range(from, to); + let head = Math.abs(from - this.anchor) > Math.abs(to - this.anchor) ? from : to; + return EditorSelection.range(this.anchor, head); + } + /** + Compare this range to another range. + */ + eq(other, includeAssoc = false) { + return this.anchor == other.anchor && this.head == other.head && + (!includeAssoc || !this.empty || this.assoc == other.assoc); + } + /** + Return a JSON-serializable object representing the range. + */ + toJSON() { return { anchor: this.anchor, head: this.head }; } + /** + Convert a JSON representation of a range to a `SelectionRange` + instance. + */ + static fromJSON(json) { + if (!json || typeof json.anchor != "number" || typeof json.head != "number") + throw new RangeError("Invalid JSON representation for SelectionRange"); + return EditorSelection.range(json.anchor, json.head); + } + /** + @internal + */ + static create(from, to, flags) { + return new SelectionRange(from, to, flags); + } +} +/** +An editor selection holds one or more selection ranges. +*/ +class EditorSelection { + constructor( + /** + The ranges in the selection, sorted by position. Ranges cannot + overlap (but they may touch, if they aren't empty). + */ + ranges, + /** + The index of the _main_ range in the selection (which is + usually the range that was added last). + */ + mainIndex) { + this.ranges = ranges; + this.mainIndex = mainIndex; + } + /** + Map a selection through a change. Used to adjust the selection + position for changes. + */ + map(change, assoc = -1) { + if (change.empty) + return this; + return EditorSelection.create(this.ranges.map(r => r.map(change, assoc)), this.mainIndex); + } + /** + Compare this selection to another selection. By default, ranges + are compared only by position. When `includeAssoc` is true, + cursor ranges must also have the same + [`assoc`](https://codemirror.net/6/docs/ref/#state.SelectionRange.assoc) value. + */ + eq(other, includeAssoc = false) { + if (this.ranges.length != other.ranges.length || + this.mainIndex != other.mainIndex) + return false; + for (let i = 0; i < this.ranges.length; i++) + if (!this.ranges[i].eq(other.ranges[i], includeAssoc)) + return false; + return true; + } + /** + Get the primary selection range. Usually, you should make sure + your code applies to _all_ ranges, by using methods like + [`changeByRange`](https://codemirror.net/6/docs/ref/#state.EditorState.changeByRange). + */ + get main() { return this.ranges[this.mainIndex]; } + /** + Make sure the selection only has one range. Returns a selection + holding only the main range from this selection. + */ + asSingle() { + return this.ranges.length == 1 ? this : new EditorSelection([this.main], 0); + } + /** + Extend this selection with an extra range. + */ + addRange(range, main = true) { + return EditorSelection.create([range].concat(this.ranges), main ? 0 : this.mainIndex + 1); + } + /** + Replace a given range with another range, and then normalize the + selection to merge and sort ranges if necessary. + */ + replaceRange(range, which = this.mainIndex) { + let ranges = this.ranges.slice(); + ranges[which] = range; + return EditorSelection.create(ranges, this.mainIndex); + } + /** + Convert this selection to an object that can be serialized to + JSON. + */ + toJSON() { + return { ranges: this.ranges.map(r => r.toJSON()), main: this.mainIndex }; + } + /** + Create a selection from a JSON representation. + */ + static fromJSON(json) { + if (!json || !Array.isArray(json.ranges) || typeof json.main != "number" || json.main >= json.ranges.length) + throw new RangeError("Invalid JSON representation for EditorSelection"); + return new EditorSelection(json.ranges.map((r) => SelectionRange.fromJSON(r)), json.main); + } + /** + Create a selection holding a single range. + */ + static single(anchor, head = anchor) { + return new EditorSelection([EditorSelection.range(anchor, head)], 0); + } + /** + Sort and merge the given set of ranges, creating a valid + selection. + */ + static create(ranges, mainIndex = 0) { + if (ranges.length == 0) + throw new RangeError("A selection needs at least one range"); + for (let pos = 0, i = 0; i < ranges.length; i++) { + let range = ranges[i]; + if (range.empty ? range.from <= pos : range.from < pos) + return EditorSelection.normalized(ranges.slice(), mainIndex); + pos = range.to; + } + return new EditorSelection(ranges, mainIndex); + } + /** + Create a cursor selection range at the given position. You can + safely ignore the optional arguments in most situations. + */ + static cursor(pos, assoc = 0, bidiLevel, goalColumn) { + return SelectionRange.create(pos, pos, (assoc == 0 ? 0 : assoc < 0 ? 8 /* RangeFlag.AssocBefore */ : 16 /* RangeFlag.AssocAfter */) | + (bidiLevel == null ? 7 : Math.min(6, bidiLevel)) | + ((goalColumn !== null && goalColumn !== void 0 ? goalColumn : 16777215 /* RangeFlag.NoGoalColumn */) << 6 /* RangeFlag.GoalColumnOffset */)); + } + /** + Create a selection range. + */ + static range(anchor, head, goalColumn, bidiLevel) { + let flags = ((goalColumn !== null && goalColumn !== void 0 ? goalColumn : 16777215 /* RangeFlag.NoGoalColumn */) << 6 /* RangeFlag.GoalColumnOffset */) | + (bidiLevel == null ? 7 : Math.min(6, bidiLevel)); + return head < anchor ? SelectionRange.create(head, anchor, 32 /* RangeFlag.Inverted */ | 16 /* RangeFlag.AssocAfter */ | flags) + : SelectionRange.create(anchor, head, (head > anchor ? 8 /* RangeFlag.AssocBefore */ : 0) | flags); + } + /** + @internal + */ + static normalized(ranges, mainIndex = 0) { + let main = ranges[mainIndex]; + ranges.sort((a, b) => a.from - b.from); + mainIndex = ranges.indexOf(main); + for (let i = 1; i < ranges.length; i++) { + let range = ranges[i], prev = ranges[i - 1]; + if (range.empty ? range.from <= prev.to : range.from < prev.to) { + let from = prev.from, to = Math.max(range.to, prev.to); + if (i <= mainIndex) + mainIndex--; + ranges.splice(--i, 2, range.anchor > range.head ? EditorSelection.range(to, from) : EditorSelection.range(from, to)); + } + } + return new EditorSelection(ranges, mainIndex); + } +} +function checkSelection(selection, docLength) { + for (let range of selection.ranges) + if (range.to > docLength) + throw new RangeError("Selection points outside of document"); +} + +let nextID = 0; +/** +A facet is a labeled value that is associated with an editor +state. It takes inputs from any number of extensions, and combines +those into a single output value. + +Examples of uses of facets are the [tab +size](https://codemirror.net/6/docs/ref/#state.EditorState^tabSize), [editor +attributes](https://codemirror.net/6/docs/ref/#view.EditorView^editorAttributes), and [update +listeners](https://codemirror.net/6/docs/ref/#view.EditorView^updateListener). + +Note that `Facet` instances can be used anywhere where +[`FacetReader`](https://codemirror.net/6/docs/ref/#state.FacetReader) is expected. +*/ +class Facet { + constructor( + /** + @internal + */ + combine, + /** + @internal + */ + compareInput, + /** + @internal + */ + compare, isStatic, enables) { + this.combine = combine; + this.compareInput = compareInput; + this.compare = compare; + this.isStatic = isStatic; + /** + @internal + */ + this.id = nextID++; + this.default = combine([]); + this.extensions = typeof enables == "function" ? enables(this) : enables; + } + /** + Returns a facet reader for this facet, which can be used to + [read](https://codemirror.net/6/docs/ref/#state.EditorState.facet) it but not to define values for it. + */ + get reader() { return this; } + /** + Define a new facet. + */ + static define(config = {}) { + return new Facet(config.combine || ((a) => a), config.compareInput || ((a, b) => a === b), config.compare || (!config.combine ? sameArray$2 : (a, b) => a === b), !!config.static, config.enables); + } + /** + Returns an extension that adds the given value to this facet. + */ + of(value) { + return new FacetProvider([], this, 0 /* Provider.Static */, value); + } + /** + Create an extension that computes a value for the facet from a + state. You must take care to declare the parts of the state that + this value depends on, since your function is only called again + for a new state when one of those parts changed. + + In cases where your value depends only on a single field, you'll + want to use the [`from`](https://codemirror.net/6/docs/ref/#state.Facet.from) method instead. + */ + compute(deps, get) { + if (this.isStatic) + throw new Error("Can't compute a static facet"); + return new FacetProvider(deps, this, 1 /* Provider.Single */, get); + } + /** + Create an extension that computes zero or more values for this + facet from a state. + */ + computeN(deps, get) { + if (this.isStatic) + throw new Error("Can't compute a static facet"); + return new FacetProvider(deps, this, 2 /* Provider.Multi */, get); + } + from(field, get) { + if (!get) + get = x => x; + return this.compute([field], state => get(state.field(field))); + } +} +function sameArray$2(a, b) { + return a == b || a.length == b.length && a.every((e, i) => e === b[i]); +} +class FacetProvider { + constructor(dependencies, facet, type, value) { + this.dependencies = dependencies; + this.facet = facet; + this.type = type; + this.value = value; + this.id = nextID++; + } + dynamicSlot(addresses) { + var _a; + let getter = this.value; + let compare = this.facet.compareInput; + let id = this.id, idx = addresses[id] >> 1, multi = this.type == 2 /* Provider.Multi */; + let depDoc = false, depSel = false, depAddrs = []; + for (let dep of this.dependencies) { + if (dep == "doc") + depDoc = true; + else if (dep == "selection") + depSel = true; + else if ((((_a = addresses[dep.id]) !== null && _a !== void 0 ? _a : 1) & 1) == 0) + depAddrs.push(addresses[dep.id]); + } + return { + create(state) { + state.values[idx] = getter(state); + return 1 /* SlotStatus.Changed */; + }, + update(state, tr) { + if ((depDoc && tr.docChanged) || (depSel && (tr.docChanged || tr.selection)) || ensureAll(state, depAddrs)) { + let newVal = getter(state); + if (multi ? !compareArray(newVal, state.values[idx], compare) : !compare(newVal, state.values[idx])) { + state.values[idx] = newVal; + return 1 /* SlotStatus.Changed */; + } + } + return 0; + }, + reconfigure: (state, oldState) => { + let newVal, oldAddr = oldState.config.address[id]; + if (oldAddr != null) { + let oldVal = getAddr(oldState, oldAddr); + if (this.dependencies.every(dep => { + return dep instanceof Facet ? oldState.facet(dep) === state.facet(dep) : + dep instanceof StateField ? oldState.field(dep, false) == state.field(dep, false) : true; + }) || (multi ? compareArray(newVal = getter(state), oldVal, compare) : compare(newVal = getter(state), oldVal))) { + state.values[idx] = oldVal; + return 0; + } + } + else { + newVal = getter(state); + } + state.values[idx] = newVal; + return 1 /* SlotStatus.Changed */; + } + }; + } +} +function compareArray(a, b, compare) { + if (a.length != b.length) + return false; + for (let i = 0; i < a.length; i++) + if (!compare(a[i], b[i])) + return false; + return true; +} +function ensureAll(state, addrs) { + let changed = false; + for (let addr of addrs) + if (ensureAddr(state, addr) & 1 /* SlotStatus.Changed */) + changed = true; + return changed; +} +function dynamicFacetSlot(addresses, facet, providers) { + let providerAddrs = providers.map(p => addresses[p.id]); + let providerTypes = providers.map(p => p.type); + let dynamic = providerAddrs.filter(p => !(p & 1)); + let idx = addresses[facet.id] >> 1; + function get(state) { + let values = []; + for (let i = 0; i < providerAddrs.length; i++) { + let value = getAddr(state, providerAddrs[i]); + if (providerTypes[i] == 2 /* Provider.Multi */) + for (let val of value) + values.push(val); + else + values.push(value); + } + return facet.combine(values); + } + return { + create(state) { + for (let addr of providerAddrs) + ensureAddr(state, addr); + state.values[idx] = get(state); + return 1 /* SlotStatus.Changed */; + }, + update(state, tr) { + if (!ensureAll(state, dynamic)) + return 0; + let value = get(state); + if (facet.compare(value, state.values[idx])) + return 0; + state.values[idx] = value; + return 1 /* SlotStatus.Changed */; + }, + reconfigure(state, oldState) { + let depChanged = ensureAll(state, providerAddrs); + let oldProviders = oldState.config.facets[facet.id], oldValue = oldState.facet(facet); + if (oldProviders && !depChanged && sameArray$2(providers, oldProviders)) { + state.values[idx] = oldValue; + return 0; + } + let value = get(state); + if (facet.compare(value, oldValue)) { + state.values[idx] = oldValue; + return 0; + } + state.values[idx] = value; + return 1 /* SlotStatus.Changed */; + } + }; +} +const initField = /*@__PURE__*/Facet.define({ static: true }); +/** +Fields can store additional information in an editor state, and +keep it in sync with the rest of the state. +*/ +class StateField { + constructor( + /** + @internal + */ + id, createF, updateF, compareF, + /** + @internal + */ + spec) { + this.id = id; + this.createF = createF; + this.updateF = updateF; + this.compareF = compareF; + this.spec = spec; + /** + @internal + */ + this.provides = undefined; + } + /** + Define a state field. + */ + static define(config) { + let field = new StateField(nextID++, config.create, config.update, config.compare || ((a, b) => a === b), config); + if (config.provide) + field.provides = config.provide(field); + return field; + } + create(state) { + let init = state.facet(initField).find(i => i.field == this); + return ((init === null || init === void 0 ? void 0 : init.create) || this.createF)(state); + } + /** + @internal + */ + slot(addresses) { + let idx = addresses[this.id] >> 1; + return { + create: (state) => { + state.values[idx] = this.create(state); + return 1 /* SlotStatus.Changed */; + }, + update: (state, tr) => { + let oldVal = state.values[idx]; + let value = this.updateF(oldVal, tr); + if (this.compareF(oldVal, value)) + return 0; + state.values[idx] = value; + return 1 /* SlotStatus.Changed */; + }, + reconfigure: (state, oldState) => { + if (oldState.config.address[this.id] != null) { + state.values[idx] = oldState.field(this); + return 0; + } + state.values[idx] = this.create(state); + return 1 /* SlotStatus.Changed */; + } + }; + } + /** + Returns an extension that enables this field and overrides the + way it is initialized. Can be useful when you need to provide a + non-default starting value for the field. + */ + init(create) { + return [this, initField.of({ field: this, create })]; + } + /** + State field instances can be used as + [`Extension`](https://codemirror.net/6/docs/ref/#state.Extension) values to enable the field in a + given state. + */ + get extension() { return this; } +} +const Prec_ = { lowest: 4, low: 3, default: 2, high: 1, highest: 0 }; +function prec(value) { + return (ext) => new PrecExtension(ext, value); +} +/** +By default extensions are registered in the order they are found +in the flattened form of nested array that was provided. +Individual extension values can be assigned a precedence to +override this. Extensions that do not have a precedence set get +the precedence of the nearest parent with a precedence, or +[`default`](https://codemirror.net/6/docs/ref/#state.Prec.default) if there is no such parent. The +final ordering of extensions is determined by first sorting by +precedence and then by order within each precedence. +*/ +const Prec = { + /** + The highest precedence level, for extensions that should end up + near the start of the precedence ordering. + */ + highest: /*@__PURE__*/prec(Prec_.highest), + /** + A higher-than-default precedence, for extensions that should + come before those with default precedence. + */ + high: /*@__PURE__*/prec(Prec_.high), + /** + The default precedence, which is also used for extensions + without an explicit precedence. + */ + default: /*@__PURE__*/prec(Prec_.default), + /** + A lower-than-default precedence. + */ + low: /*@__PURE__*/prec(Prec_.low), + /** + The lowest precedence level. Meant for things that should end up + near the end of the extension order. + */ + lowest: /*@__PURE__*/prec(Prec_.lowest) +}; +class PrecExtension { + constructor(inner, prec) { + this.inner = inner; + this.prec = prec; + } +} +/** +Extension compartments can be used to make a configuration +dynamic. By [wrapping](https://codemirror.net/6/docs/ref/#state.Compartment.of) part of your +configuration in a compartment, you can later +[replace](https://codemirror.net/6/docs/ref/#state.Compartment.reconfigure) that part through a +transaction. +*/ +class Compartment { + /** + Create an instance of this compartment to add to your [state + configuration](https://codemirror.net/6/docs/ref/#state.EditorStateConfig.extensions). + */ + of(ext) { return new CompartmentInstance(this, ext); } + /** + Create an [effect](https://codemirror.net/6/docs/ref/#state.TransactionSpec.effects) that + reconfigures this compartment. + */ + reconfigure(content) { + return Compartment.reconfigure.of({ compartment: this, extension: content }); + } + /** + Get the current content of the compartment in the state, or + `undefined` if it isn't present. + */ + get(state) { + return state.config.compartments.get(this); + } +} +class CompartmentInstance { + constructor(compartment, inner) { + this.compartment = compartment; + this.inner = inner; + } +} +class Configuration { + constructor(base, compartments, dynamicSlots, address, staticValues, facets) { + this.base = base; + this.compartments = compartments; + this.dynamicSlots = dynamicSlots; + this.address = address; + this.staticValues = staticValues; + this.facets = facets; + this.statusTemplate = []; + while (this.statusTemplate.length < dynamicSlots.length) + this.statusTemplate.push(0 /* SlotStatus.Unresolved */); + } + staticFacet(facet) { + let addr = this.address[facet.id]; + return addr == null ? facet.default : this.staticValues[addr >> 1]; + } + static resolve(base, compartments, oldState) { + let fields = []; + let facets = Object.create(null); + let newCompartments = new Map(); + for (let ext of flatten(base, compartments, newCompartments)) { + if (ext instanceof StateField) + fields.push(ext); + else + (facets[ext.facet.id] || (facets[ext.facet.id] = [])).push(ext); + } + let address = Object.create(null); + let staticValues = []; + let dynamicSlots = []; + for (let field of fields) { + address[field.id] = dynamicSlots.length << 1; + dynamicSlots.push(a => field.slot(a)); + } + let oldFacets = oldState === null || oldState === void 0 ? void 0 : oldState.config.facets; + for (let id in facets) { + let providers = facets[id], facet = providers[0].facet; + let oldProviders = oldFacets && oldFacets[id] || []; + if (providers.every(p => p.type == 0 /* Provider.Static */)) { + address[facet.id] = (staticValues.length << 1) | 1; + if (sameArray$2(oldProviders, providers)) { + staticValues.push(oldState.facet(facet)); + } + else { + let value = facet.combine(providers.map(p => p.value)); + staticValues.push(oldState && facet.compare(value, oldState.facet(facet)) ? oldState.facet(facet) : value); + } + } + else { + for (let p of providers) { + if (p.type == 0 /* Provider.Static */) { + address[p.id] = (staticValues.length << 1) | 1; + staticValues.push(p.value); + } + else { + address[p.id] = dynamicSlots.length << 1; + dynamicSlots.push(a => p.dynamicSlot(a)); + } + } + address[facet.id] = dynamicSlots.length << 1; + dynamicSlots.push(a => dynamicFacetSlot(a, facet, providers)); + } + } + let dynamic = dynamicSlots.map(f => f(address)); + return new Configuration(base, newCompartments, dynamic, address, staticValues, facets); + } +} +function flatten(extension, compartments, newCompartments) { + let result = [[], [], [], [], []]; + let seen = new Map(); + function inner(ext, prec) { + let known = seen.get(ext); + if (known != null) { + if (known <= prec) + return; + let found = result[known].indexOf(ext); + if (found > -1) + result[known].splice(found, 1); + if (ext instanceof CompartmentInstance) + newCompartments.delete(ext.compartment); + } + seen.set(ext, prec); + if (Array.isArray(ext)) { + for (let e of ext) + inner(e, prec); + } + else if (ext instanceof CompartmentInstance) { + if (newCompartments.has(ext.compartment)) + throw new RangeError(`Duplicate use of compartment in extensions`); + let content = compartments.get(ext.compartment) || ext.inner; + newCompartments.set(ext.compartment, content); + inner(content, prec); + } + else if (ext instanceof PrecExtension) { + inner(ext.inner, ext.prec); + } + else if (ext instanceof StateField) { + result[prec].push(ext); + if (ext.provides) + inner(ext.provides, prec); + } + else if (ext instanceof FacetProvider) { + result[prec].push(ext); + if (ext.facet.extensions) + inner(ext.facet.extensions, Prec_.default); + } + else { + let content = ext.extension; + if (!content) + throw new Error(`Unrecognized extension value in extension set (${ext}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`); + inner(content, prec); + } + } + inner(extension, Prec_.default); + return result.reduce((a, b) => a.concat(b)); +} +function ensureAddr(state, addr) { + if (addr & 1) + return 2 /* SlotStatus.Computed */; + let idx = addr >> 1; + let status = state.status[idx]; + if (status == 4 /* SlotStatus.Computing */) + throw new Error("Cyclic dependency between fields and/or facets"); + if (status & 2 /* SlotStatus.Computed */) + return status; + state.status[idx] = 4 /* SlotStatus.Computing */; + let changed = state.computeSlot(state, state.config.dynamicSlots[idx]); + return state.status[idx] = 2 /* SlotStatus.Computed */ | changed; +} +function getAddr(state, addr) { + return addr & 1 ? state.config.staticValues[addr >> 1] : state.values[addr >> 1]; +} + +const languageData = /*@__PURE__*/Facet.define(); +const allowMultipleSelections = /*@__PURE__*/Facet.define({ + combine: values => values.some(v => v), + static: true +}); +const lineSeparator = /*@__PURE__*/Facet.define({ + combine: values => values.length ? values[0] : undefined, + static: true +}); +const changeFilter = /*@__PURE__*/Facet.define(); +const transactionFilter = /*@__PURE__*/Facet.define(); +const transactionExtender = /*@__PURE__*/Facet.define(); +const readOnly = /*@__PURE__*/Facet.define({ + combine: values => values.length ? values[0] : false +}); + +/** +Annotations are tagged values that are used to add metadata to +transactions in an extensible way. They should be used to model +things that effect the entire transaction (such as its [time +stamp](https://codemirror.net/6/docs/ref/#state.Transaction^time) or information about its +[origin](https://codemirror.net/6/docs/ref/#state.Transaction^userEvent)). For effects that happen +_alongside_ the other changes made by the transaction, [state +effects](https://codemirror.net/6/docs/ref/#state.StateEffect) are more appropriate. +*/ +class Annotation { + /** + @internal + */ + constructor( + /** + The annotation type. + */ + type, + /** + The value of this annotation. + */ + value) { + this.type = type; + this.value = value; + } + /** + Define a new type of annotation. + */ + static define() { return new AnnotationType(); } +} +/** +Marker that identifies a type of [annotation](https://codemirror.net/6/docs/ref/#state.Annotation). +*/ +class AnnotationType { + /** + Create an instance of this annotation. + */ + of(value) { return new Annotation(this, value); } +} +/** +Representation of a type of state effect. Defined with +[`StateEffect.define`](https://codemirror.net/6/docs/ref/#state.StateEffect^define). +*/ +class StateEffectType { + /** + @internal + */ + constructor( + // The `any` types in these function types are there to work + // around TypeScript issue #37631, where the type guard on + // `StateEffect.is` mysteriously stops working when these properly + // have type `Value`. + /** + @internal + */ + map) { + this.map = map; + } + /** + Create a [state effect](https://codemirror.net/6/docs/ref/#state.StateEffect) instance of this + type. + */ + of(value) { return new StateEffect(this, value); } +} +/** +State effects can be used to represent additional effects +associated with a [transaction](https://codemirror.net/6/docs/ref/#state.Transaction.effects). They +are often useful to model changes to custom [state +fields](https://codemirror.net/6/docs/ref/#state.StateField), when those changes aren't implicit in +document or selection changes. +*/ +class StateEffect { + /** + @internal + */ + constructor( + /** + @internal + */ + type, + /** + The value of this effect. + */ + value) { + this.type = type; + this.value = value; + } + /** + Map this effect through a position mapping. Will return + `undefined` when that ends up deleting the effect. + */ + map(mapping) { + let mapped = this.type.map(this.value, mapping); + return mapped === undefined ? undefined : mapped == this.value ? this : new StateEffect(this.type, mapped); + } + /** + Tells you whether this effect object is of a given + [type](https://codemirror.net/6/docs/ref/#state.StateEffectType). + */ + is(type) { return this.type == type; } + /** + Define a new effect type. The type parameter indicates the type + of values that his effect holds. It should be a type that + doesn't include `undefined`, since that is used in + [mapping](https://codemirror.net/6/docs/ref/#state.StateEffect.map) to indicate that an effect is + removed. + */ + static define(spec = {}) { + return new StateEffectType(spec.map || (v => v)); + } + /** + Map an array of effects through a change set. + */ + static mapEffects(effects, mapping) { + if (!effects.length) + return effects; + let result = []; + for (let effect of effects) { + let mapped = effect.map(mapping); + if (mapped) + result.push(mapped); + } + return result; + } +} +/** +This effect can be used to reconfigure the root extensions of +the editor. Doing this will discard any extensions +[appended](https://codemirror.net/6/docs/ref/#state.StateEffect^appendConfig), but does not reset +the content of [reconfigured](https://codemirror.net/6/docs/ref/#state.Compartment.reconfigure) +compartments. +*/ +StateEffect.reconfigure = /*@__PURE__*/StateEffect.define(); +/** +Append extensions to the top-level configuration of the editor. +*/ +StateEffect.appendConfig = /*@__PURE__*/StateEffect.define(); +/** +Changes to the editor state are grouped into transactions. +Typically, a user action creates a single transaction, which may +contain any number of document changes, may change the selection, +or have other effects. Create a transaction by calling +[`EditorState.update`](https://codemirror.net/6/docs/ref/#state.EditorState.update), or immediately +dispatch one by calling +[`EditorView.dispatch`](https://codemirror.net/6/docs/ref/#view.EditorView.dispatch). +*/ +class Transaction { + constructor( + /** + The state from which the transaction starts. + */ + startState, + /** + The document changes made by this transaction. + */ + changes, + /** + The selection set by this transaction, or undefined if it + doesn't explicitly set a selection. + */ + selection, + /** + The effects added to the transaction. + */ + effects, + /** + @internal + */ + annotations, + /** + Whether the selection should be scrolled into view after this + transaction is dispatched. + */ + scrollIntoView) { + this.startState = startState; + this.changes = changes; + this.selection = selection; + this.effects = effects; + this.annotations = annotations; + this.scrollIntoView = scrollIntoView; + /** + @internal + */ + this._doc = null; + /** + @internal + */ + this._state = null; + if (selection) + checkSelection(selection, changes.newLength); + if (!annotations.some((a) => a.type == Transaction.time)) + this.annotations = annotations.concat(Transaction.time.of(Date.now())); + } + /** + @internal + */ + static create(startState, changes, selection, effects, annotations, scrollIntoView) { + return new Transaction(startState, changes, selection, effects, annotations, scrollIntoView); + } + /** + The new document produced by the transaction. Contrary to + [`.state`](https://codemirror.net/6/docs/ref/#state.Transaction.state)`.doc`, accessing this won't + force the entire new state to be computed right away, so it is + recommended that [transaction + filters](https://codemirror.net/6/docs/ref/#state.EditorState^transactionFilter) use this getter + when they need to look at the new document. + */ + get newDoc() { + return this._doc || (this._doc = this.changes.apply(this.startState.doc)); + } + /** + The new selection produced by the transaction. If + [`this.selection`](https://codemirror.net/6/docs/ref/#state.Transaction.selection) is undefined, + this will [map](https://codemirror.net/6/docs/ref/#state.EditorSelection.map) the start state's + current selection through the changes made by the transaction. + */ + get newSelection() { + return this.selection || this.startState.selection.map(this.changes); + } + /** + The new state created by the transaction. Computed on demand + (but retained for subsequent access), so it is recommended not to + access it in [transaction + filters](https://codemirror.net/6/docs/ref/#state.EditorState^transactionFilter) when possible. + */ + get state() { + if (!this._state) + this.startState.applyTransaction(this); + return this._state; + } + /** + Get the value of the given annotation type, if any. + */ + annotation(type) { + for (let ann of this.annotations) + if (ann.type == type) + return ann.value; + return undefined; + } + /** + Indicates whether the transaction changed the document. + */ + get docChanged() { return !this.changes.empty; } + /** + Indicates whether this transaction reconfigures the state + (through a [configuration compartment](https://codemirror.net/6/docs/ref/#state.Compartment) or + with a top-level configuration + [effect](https://codemirror.net/6/docs/ref/#state.StateEffect^reconfigure). + */ + get reconfigured() { return this.startState.config != this.state.config; } + /** + Returns true if the transaction has a [user + event](https://codemirror.net/6/docs/ref/#state.Transaction^userEvent) annotation that is equal to + or more specific than `event`. For example, if the transaction + has `"select.pointer"` as user event, `"select"` and + `"select.pointer"` will match it. + */ + isUserEvent(event) { + let e = this.annotation(Transaction.userEvent); + return !!(e && (e == event || e.length > event.length && e.slice(0, event.length) == event && e[event.length] == ".")); + } +} +/** +Annotation used to store transaction timestamps. Automatically +added to every transaction, holding `Date.now()`. +*/ +Transaction.time = /*@__PURE__*/Annotation.define(); +/** +Annotation used to associate a transaction with a user interface +event. Holds a string identifying the event, using a +dot-separated format to support attaching more specific +information. The events used by the core libraries are: + + - `"input"` when content is entered + - `"input.type"` for typed input + - `"input.type.compose"` for composition + - `"input.paste"` for pasted input + - `"input.drop"` when adding content with drag-and-drop + - `"input.complete"` when autocompleting + - `"delete"` when the user deletes content + - `"delete.selection"` when deleting the selection + - `"delete.forward"` when deleting forward from the selection + - `"delete.backward"` when deleting backward from the selection + - `"delete.cut"` when cutting to the clipboard + - `"move"` when content is moved + - `"move.drop"` when content is moved within the editor through drag-and-drop + - `"select"` when explicitly changing the selection + - `"select.pointer"` when selecting with a mouse or other pointing device + - `"undo"` and `"redo"` for history actions + +Use [`isUserEvent`](https://codemirror.net/6/docs/ref/#state.Transaction.isUserEvent) to check +whether the annotation matches a given event. +*/ +Transaction.userEvent = /*@__PURE__*/Annotation.define(); +/** +Annotation indicating whether a transaction should be added to +the undo history or not. +*/ +Transaction.addToHistory = /*@__PURE__*/Annotation.define(); +/** +Annotation indicating (when present and true) that a transaction +represents a change made by some other actor, not the user. This +is used, for example, to tag other people's changes in +collaborative editing. +*/ +Transaction.remote = /*@__PURE__*/Annotation.define(); +function joinRanges(a, b) { + let result = []; + for (let iA = 0, iB = 0;;) { + let from, to; + if (iA < a.length && (iB == b.length || b[iB] >= a[iA])) { + from = a[iA++]; + to = a[iA++]; + } + else if (iB < b.length) { + from = b[iB++]; + to = b[iB++]; + } + else + return result; + if (!result.length || result[result.length - 1] < from) + result.push(from, to); + else if (result[result.length - 1] < to) + result[result.length - 1] = to; + } +} +function mergeTransaction(a, b, sequential) { + var _a; + let mapForA, mapForB, changes; + if (sequential) { + mapForA = b.changes; + mapForB = ChangeSet.empty(b.changes.length); + changes = a.changes.compose(b.changes); + } + else { + mapForA = b.changes.map(a.changes); + mapForB = a.changes.mapDesc(b.changes, true); + changes = a.changes.compose(mapForA); + } + return { + changes, + selection: b.selection ? b.selection.map(mapForB) : (_a = a.selection) === null || _a === void 0 ? void 0 : _a.map(mapForA), + effects: StateEffect.mapEffects(a.effects, mapForA).concat(StateEffect.mapEffects(b.effects, mapForB)), + annotations: a.annotations.length ? a.annotations.concat(b.annotations) : b.annotations, + scrollIntoView: a.scrollIntoView || b.scrollIntoView + }; +} +function resolveTransactionInner(state, spec, docSize) { + let sel = spec.selection, annotations = asArray$1(spec.annotations); + if (spec.userEvent) + annotations = annotations.concat(Transaction.userEvent.of(spec.userEvent)); + return { + changes: spec.changes instanceof ChangeSet ? spec.changes + : ChangeSet.of(spec.changes || [], docSize, state.facet(lineSeparator)), + selection: sel && (sel instanceof EditorSelection ? sel : EditorSelection.single(sel.anchor, sel.head)), + effects: asArray$1(spec.effects), + annotations, + scrollIntoView: !!spec.scrollIntoView + }; +} +function resolveTransaction(state, specs, filter) { + let s = resolveTransactionInner(state, specs.length ? specs[0] : {}, state.doc.length); + if (specs.length && specs[0].filter === false) + filter = false; + for (let i = 1; i < specs.length; i++) { + if (specs[i].filter === false) + filter = false; + let seq = !!specs[i].sequential; + s = mergeTransaction(s, resolveTransactionInner(state, specs[i], seq ? s.changes.newLength : state.doc.length), seq); + } + let tr = Transaction.create(state, s.changes, s.selection, s.effects, s.annotations, s.scrollIntoView); + return extendTransaction(filter ? filterTransaction(tr) : tr); +} +// Finish a transaction by applying filters if necessary. +function filterTransaction(tr) { + let state = tr.startState; + // Change filters + let result = true; + for (let filter of state.facet(changeFilter)) { + let value = filter(tr); + if (value === false) { + result = false; + break; + } + if (Array.isArray(value)) + result = result === true ? value : joinRanges(result, value); + } + if (result !== true) { + let changes, back; + if (result === false) { + back = tr.changes.invertedDesc; + changes = ChangeSet.empty(state.doc.length); + } + else { + let filtered = tr.changes.filter(result); + changes = filtered.changes; + back = filtered.filtered.mapDesc(filtered.changes).invertedDesc; + } + tr = Transaction.create(state, changes, tr.selection && tr.selection.map(back), StateEffect.mapEffects(tr.effects, back), tr.annotations, tr.scrollIntoView); + } + // Transaction filters + let filters = state.facet(transactionFilter); + for (let i = filters.length - 1; i >= 0; i--) { + let filtered = filters[i](tr); + if (filtered instanceof Transaction) + tr = filtered; + else if (Array.isArray(filtered) && filtered.length == 1 && filtered[0] instanceof Transaction) + tr = filtered[0]; + else + tr = resolveTransaction(state, asArray$1(filtered), false); + } + return tr; +} +function extendTransaction(tr) { + let state = tr.startState, extenders = state.facet(transactionExtender), spec = tr; + for (let i = extenders.length - 1; i >= 0; i--) { + let extension = extenders[i](tr); + if (extension && Object.keys(extension).length) + spec = mergeTransaction(spec, resolveTransactionInner(state, extension, tr.changes.newLength), true); + } + return spec == tr ? tr : Transaction.create(state, tr.changes, tr.selection, spec.effects, spec.annotations, spec.scrollIntoView); +} +const none$2 = []; +function asArray$1(value) { + return value == null ? none$2 : Array.isArray(value) ? value : [value]; +} + +/** +The categories produced by a [character +categorizer](https://codemirror.net/6/docs/ref/#state.EditorState.charCategorizer). These are used +do things like selecting by word. +*/ +var CharCategory = /*@__PURE__*/(function (CharCategory) { + /** + Word characters. + */ + CharCategory[CharCategory["Word"] = 0] = "Word"; + /** + Whitespace. + */ + CharCategory[CharCategory["Space"] = 1] = "Space"; + /** + Anything else. + */ + CharCategory[CharCategory["Other"] = 2] = "Other"; +return CharCategory})(CharCategory || (CharCategory = {})); +const nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; +let wordChar; +try { + wordChar = /*@__PURE__*/new RegExp("[\\p{Alphabetic}\\p{Number}_]", "u"); +} +catch (_) { } +function hasWordChar(str) { + if (wordChar) + return wordChar.test(str); + for (let i = 0; i < str.length; i++) { + let ch = str[i]; + if (/\w/.test(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch))) + return true; + } + return false; +} +function makeCategorizer(wordChars) { + return (char) => { + if (!/\S/.test(char)) + return CharCategory.Space; + if (hasWordChar(char)) + return CharCategory.Word; + for (let i = 0; i < wordChars.length; i++) + if (char.indexOf(wordChars[i]) > -1) + return CharCategory.Word; + return CharCategory.Other; + }; +} + +/** +The editor state class is a persistent (immutable) data structure. +To update a state, you [create](https://codemirror.net/6/docs/ref/#state.EditorState.update) a +[transaction](https://codemirror.net/6/docs/ref/#state.Transaction), which produces a _new_ state +instance, without modifying the original object. + +As such, _never_ mutate properties of a state directly. That'll +just break things. +*/ +class EditorState { + constructor( + /** + @internal + */ + config, + /** + The current document. + */ + doc, + /** + The current selection. + */ + selection, + /** + @internal + */ + values, computeSlot, tr) { + this.config = config; + this.doc = doc; + this.selection = selection; + this.values = values; + this.status = config.statusTemplate.slice(); + this.computeSlot = computeSlot; + // Fill in the computed state immediately, so that further queries + // for it made during the update return this state + if (tr) + tr._state = this; + for (let i = 0; i < this.config.dynamicSlots.length; i++) + ensureAddr(this, i << 1); + this.computeSlot = null; + } + field(field, require = true) { + let addr = this.config.address[field.id]; + if (addr == null) { + if (require) + throw new RangeError("Field is not present in this state"); + return undefined; + } + ensureAddr(this, addr); + return getAddr(this, addr); + } + /** + Create a [transaction](https://codemirror.net/6/docs/ref/#state.Transaction) that updates this + state. Any number of [transaction specs](https://codemirror.net/6/docs/ref/#state.TransactionSpec) + can be passed. Unless + [`sequential`](https://codemirror.net/6/docs/ref/#state.TransactionSpec.sequential) is set, the + [changes](https://codemirror.net/6/docs/ref/#state.TransactionSpec.changes) (if any) of each spec + are assumed to start in the _current_ document (not the document + produced by previous specs), and its + [selection](https://codemirror.net/6/docs/ref/#state.TransactionSpec.selection) and + [effects](https://codemirror.net/6/docs/ref/#state.TransactionSpec.effects) are assumed to refer + to the document created by its _own_ changes. The resulting + transaction contains the combined effect of all the different + specs. For [selection](https://codemirror.net/6/docs/ref/#state.TransactionSpec.selection), later + specs take precedence over earlier ones. + */ + update(...specs) { + return resolveTransaction(this, specs, true); + } + /** + @internal + */ + applyTransaction(tr) { + let conf = this.config, { base, compartments } = conf; + for (let effect of tr.effects) { + if (effect.is(Compartment.reconfigure)) { + if (conf) { + compartments = new Map; + conf.compartments.forEach((val, key) => compartments.set(key, val)); + conf = null; + } + compartments.set(effect.value.compartment, effect.value.extension); + } + else if (effect.is(StateEffect.reconfigure)) { + conf = null; + base = effect.value; + } + else if (effect.is(StateEffect.appendConfig)) { + conf = null; + base = asArray$1(base).concat(effect.value); + } + } + let startValues; + if (!conf) { + conf = Configuration.resolve(base, compartments, this); + let intermediateState = new EditorState(conf, this.doc, this.selection, conf.dynamicSlots.map(() => null), (state, slot) => slot.reconfigure(state, this), null); + startValues = intermediateState.values; + } + else { + startValues = tr.startState.values.slice(); + } + let selection = tr.startState.facet(allowMultipleSelections) ? tr.newSelection : tr.newSelection.asSingle(); + new EditorState(conf, tr.newDoc, selection, startValues, (state, slot) => slot.update(state, tr), tr); + } + /** + Create a [transaction spec](https://codemirror.net/6/docs/ref/#state.TransactionSpec) that + replaces every selection range with the given content. + */ + replaceSelection(text) { + if (typeof text == "string") + text = this.toText(text); + return this.changeByRange(range => ({ changes: { from: range.from, to: range.to, insert: text }, + range: EditorSelection.cursor(range.from + text.length) })); + } + /** + Create a set of changes and a new selection by running the given + function for each range in the active selection. The function + can return an optional set of changes (in the coordinate space + of the start document), plus an updated range (in the coordinate + space of the document produced by the call's own changes). This + method will merge all the changes and ranges into a single + changeset and selection, and return it as a [transaction + spec](https://codemirror.net/6/docs/ref/#state.TransactionSpec), which can be passed to + [`update`](https://codemirror.net/6/docs/ref/#state.EditorState.update). + */ + changeByRange(f) { + let sel = this.selection; + let result1 = f(sel.ranges[0]); + let changes = this.changes(result1.changes), ranges = [result1.range]; + let effects = asArray$1(result1.effects); + for (let i = 1; i < sel.ranges.length; i++) { + let result = f(sel.ranges[i]); + let newChanges = this.changes(result.changes), newMapped = newChanges.map(changes); + for (let j = 0; j < i; j++) + ranges[j] = ranges[j].map(newMapped); + let mapBy = changes.mapDesc(newChanges, true); + ranges.push(result.range.map(mapBy)); + changes = changes.compose(newMapped); + effects = StateEffect.mapEffects(effects, newMapped).concat(StateEffect.mapEffects(asArray$1(result.effects), mapBy)); + } + return { + changes, + selection: EditorSelection.create(ranges, sel.mainIndex), + effects + }; + } + /** + Create a [change set](https://codemirror.net/6/docs/ref/#state.ChangeSet) from the given change + description, taking the state's document length and line + separator into account. + */ + changes(spec = []) { + if (spec instanceof ChangeSet) + return spec; + return ChangeSet.of(spec, this.doc.length, this.facet(EditorState.lineSeparator)); + } + /** + Using the state's [line + separator](https://codemirror.net/6/docs/ref/#state.EditorState^lineSeparator), create a + [`Text`](https://codemirror.net/6/docs/ref/#state.Text) instance from the given string. + */ + toText(string) { + return Text.of(string.split(this.facet(EditorState.lineSeparator) || DefaultSplit)); + } + /** + Return the given range of the document as a string. + */ + sliceDoc(from = 0, to = this.doc.length) { + return this.doc.sliceString(from, to, this.lineBreak); + } + /** + Get the value of a state [facet](https://codemirror.net/6/docs/ref/#state.Facet). + */ + facet(facet) { + let addr = this.config.address[facet.id]; + if (addr == null) + return facet.default; + ensureAddr(this, addr); + return getAddr(this, addr); + } + /** + Convert this state to a JSON-serializable object. When custom + fields should be serialized, you can pass them in as an object + mapping property names (in the resulting object, which should + not use `doc` or `selection`) to fields. + */ + toJSON(fields) { + let result = { + doc: this.sliceDoc(), + selection: this.selection.toJSON() + }; + if (fields) + for (let prop in fields) { + let value = fields[prop]; + if (value instanceof StateField && this.config.address[value.id] != null) + result[prop] = value.spec.toJSON(this.field(fields[prop]), this); + } + return result; + } + /** + Deserialize a state from its JSON representation. When custom + fields should be deserialized, pass the same object you passed + to [`toJSON`](https://codemirror.net/6/docs/ref/#state.EditorState.toJSON) when serializing as + third argument. + */ + static fromJSON(json, config = {}, fields) { + if (!json || typeof json.doc != "string") + throw new RangeError("Invalid JSON representation for EditorState"); + let fieldInit = []; + if (fields) + for (let prop in fields) { + if (Object.prototype.hasOwnProperty.call(json, prop)) { + let field = fields[prop], value = json[prop]; + fieldInit.push(field.init(state => field.spec.fromJSON(value, state))); + } + } + return EditorState.create({ + doc: json.doc, + selection: EditorSelection.fromJSON(json.selection), + extensions: config.extensions ? fieldInit.concat([config.extensions]) : fieldInit + }); + } + /** + Create a new state. You'll usually only need this when + initializing an editor—updated states are created by applying + transactions. + */ + static create(config = {}) { + let configuration = Configuration.resolve(config.extensions || [], new Map); + let doc = config.doc instanceof Text ? config.doc + : Text.of((config.doc || "").split(configuration.staticFacet(EditorState.lineSeparator) || DefaultSplit)); + let selection = !config.selection ? EditorSelection.single(0) + : config.selection instanceof EditorSelection ? config.selection + : EditorSelection.single(config.selection.anchor, config.selection.head); + checkSelection(selection, doc.length); + if (!configuration.staticFacet(allowMultipleSelections)) + selection = selection.asSingle(); + return new EditorState(configuration, doc, selection, configuration.dynamicSlots.map(() => null), (state, slot) => slot.create(state), null); + } + /** + The size (in columns) of a tab in the document, determined by + the [`tabSize`](https://codemirror.net/6/docs/ref/#state.EditorState^tabSize) facet. + */ + get tabSize() { return this.facet(EditorState.tabSize); } + /** + Get the proper [line-break](https://codemirror.net/6/docs/ref/#state.EditorState^lineSeparator) + string for this state. + */ + get lineBreak() { return this.facet(EditorState.lineSeparator) || "\n"; } + /** + Returns true when the editor is + [configured](https://codemirror.net/6/docs/ref/#state.EditorState^readOnly) to be read-only. + */ + get readOnly() { return this.facet(readOnly); } + /** + Look up a translation for the given phrase (via the + [`phrases`](https://codemirror.net/6/docs/ref/#state.EditorState^phrases) facet), or return the + original string if no translation is found. + + If additional arguments are passed, they will be inserted in + place of markers like `$1` (for the first value) and `$2`, etc. + A single `$` is equivalent to `$1`, and `$$` will produce a + literal dollar sign. + */ + phrase(phrase, ...insert) { + for (let map of this.facet(EditorState.phrases)) + if (Object.prototype.hasOwnProperty.call(map, phrase)) { + phrase = map[phrase]; + break; + } + if (insert.length) + phrase = phrase.replace(/\$(\$|\d*)/g, (m, i) => { + if (i == "$") + return "$"; + let n = +(i || 1); + return !n || n > insert.length ? m : insert[n - 1]; + }); + return phrase; + } + /** + Find the values for a given language data field, provided by the + the [`languageData`](https://codemirror.net/6/docs/ref/#state.EditorState^languageData) facet. + + Examples of language data fields are... + + - [`"commentTokens"`](https://codemirror.net/6/docs/ref/#commands.CommentTokens) for specifying + comment syntax. + - [`"autocomplete"`](https://codemirror.net/6/docs/ref/#autocomplete.autocompletion^config.override) + for providing language-specific completion sources. + - [`"wordChars"`](https://codemirror.net/6/docs/ref/#state.EditorState.charCategorizer) for adding + characters that should be considered part of words in this + language. + - [`"closeBrackets"`](https://codemirror.net/6/docs/ref/#autocomplete.CloseBracketConfig) controls + bracket closing behavior. + */ + languageDataAt(name, pos, side = -1) { + let values = []; + for (let provider of this.facet(languageData)) { + for (let result of provider(this, pos, side)) { + if (Object.prototype.hasOwnProperty.call(result, name)) + values.push(result[name]); + } + } + return values; + } + /** + Return a function that can categorize strings (expected to + represent a single [grapheme cluster](https://codemirror.net/6/docs/ref/#state.findClusterBreak)) + into one of: + + - Word (contains an alphanumeric character or a character + explicitly listed in the local language's `"wordChars"` + language data, which should be a string) + - Space (contains only whitespace) + - Other (anything else) + */ + charCategorizer(at) { + return makeCategorizer(this.languageDataAt("wordChars", at).join("")); + } + /** + Find the word at the given position, meaning the range + containing all [word](https://codemirror.net/6/docs/ref/#state.CharCategory.Word) characters + around it. If no word characters are adjacent to the position, + this returns null. + */ + wordAt(pos) { + let { text, from, length } = this.doc.lineAt(pos); + let cat = this.charCategorizer(pos); + let start = pos - from, end = pos - from; + while (start > 0) { + let prev = findClusterBreak(text, start, false); + if (cat(text.slice(prev, start)) != CharCategory.Word) + break; + start = prev; + } + while (end < length) { + let next = findClusterBreak(text, end); + if (cat(text.slice(end, next)) != CharCategory.Word) + break; + end = next; + } + return start == end ? null : EditorSelection.range(start + from, end + from); + } +} +/** +A facet that, when enabled, causes the editor to allow multiple +ranges to be selected. Be careful though, because by default the +editor relies on the native DOM selection, which cannot handle +multiple selections. An extension like +[`drawSelection`](https://codemirror.net/6/docs/ref/#view.drawSelection) can be used to make +secondary selections visible to the user. +*/ +EditorState.allowMultipleSelections = allowMultipleSelections; +/** +Configures the tab size to use in this state. The first +(highest-precedence) value of the facet is used. If no value is +given, this defaults to 4. +*/ +EditorState.tabSize = /*@__PURE__*/Facet.define({ + combine: values => values.length ? values[0] : 4 +}); +/** +The line separator to use. By default, any of `"\n"`, `"\r\n"` +and `"\r"` is treated as a separator when splitting lines, and +lines are joined with `"\n"`. + +When you configure a value here, only that precise separator +will be used, allowing you to round-trip documents through the +editor without normalizing line separators. +*/ +EditorState.lineSeparator = lineSeparator; +/** +This facet controls the value of the +[`readOnly`](https://codemirror.net/6/docs/ref/#state.EditorState.readOnly) getter, which is +consulted by commands and extensions that implement editing +functionality to determine whether they should apply. It +defaults to false, but when its highest-precedence value is +`true`, such functionality disables itself. + +Not to be confused with +[`EditorView.editable`](https://codemirror.net/6/docs/ref/#view.EditorView^editable), which +controls whether the editor's DOM is set to be editable (and +thus focusable). +*/ +EditorState.readOnly = readOnly; +/** +Registers translation phrases. The +[`phrase`](https://codemirror.net/6/docs/ref/#state.EditorState.phrase) method will look through +all objects registered with this facet to find translations for +its argument. +*/ +EditorState.phrases = /*@__PURE__*/Facet.define({ + compare(a, b) { + let kA = Object.keys(a), kB = Object.keys(b); + return kA.length == kB.length && kA.every(k => a[k] == b[k]); + } +}); +/** +A facet used to register [language +data](https://codemirror.net/6/docs/ref/#state.EditorState.languageDataAt) providers. +*/ +EditorState.languageData = languageData; +/** +Facet used to register change filters, which are called for each +transaction (unless explicitly +[disabled](https://codemirror.net/6/docs/ref/#state.TransactionSpec.filter)), and can suppress +part of the transaction's changes. + +Such a function can return `true` to indicate that it doesn't +want to do anything, `false` to completely stop the changes in +the transaction, or a set of ranges in which changes should be +suppressed. Such ranges are represented as an array of numbers, +with each pair of two numbers indicating the start and end of a +range. So for example `[10, 20, 100, 110]` suppresses changes +between 10 and 20, and between 100 and 110. +*/ +EditorState.changeFilter = changeFilter; +/** +Facet used to register a hook that gets a chance to update or +replace transaction specs before they are applied. This will +only be applied for transactions that don't have +[`filter`](https://codemirror.net/6/docs/ref/#state.TransactionSpec.filter) set to `false`. You +can either return a single transaction spec (possibly the input +transaction), or an array of specs (which will be combined in +the same way as the arguments to +[`EditorState.update`](https://codemirror.net/6/docs/ref/#state.EditorState.update)). + +When possible, it is recommended to avoid accessing +[`Transaction.state`](https://codemirror.net/6/docs/ref/#state.Transaction.state) in a filter, +since it will force creation of a state that will then be +discarded again, if the transaction is actually filtered. + +(This functionality should be used with care. Indiscriminately +modifying transaction is likely to break something or degrade +the user experience.) +*/ +EditorState.transactionFilter = transactionFilter; +/** +This is a more limited form of +[`transactionFilter`](https://codemirror.net/6/docs/ref/#state.EditorState^transactionFilter), +which can only add +[annotations](https://codemirror.net/6/docs/ref/#state.TransactionSpec.annotations) and +[effects](https://codemirror.net/6/docs/ref/#state.TransactionSpec.effects). _But_, this type +of filter runs even if the transaction has disabled regular +[filtering](https://codemirror.net/6/docs/ref/#state.TransactionSpec.filter), making it suitable +for effects that don't need to touch the changes or selection, +but do want to process every transaction. + +Extenders run _after_ filters, when both are present. +*/ +EditorState.transactionExtender = transactionExtender; +Compartment.reconfigure = /*@__PURE__*/StateEffect.define(); + +/** +Utility function for combining behaviors to fill in a config +object from an array of provided configs. `defaults` should hold +default values for all optional fields in `Config`. + +The function will, by default, error +when a field gets two values that aren't `===`-equal, but you can +provide combine functions per field to do something else. +*/ +function combineConfig(configs, defaults, // Should hold only the optional properties of Config, but I haven't managed to express that +combine = {}) { + let result = {}; + for (let config of configs) + for (let key of Object.keys(config)) { + let value = config[key], current = result[key]; + if (current === undefined) + result[key] = value; + else if (current === value || value === undefined) ; // No conflict + else if (Object.hasOwnProperty.call(combine, key)) + result[key] = combine[key](current, value); + else + throw new Error("Config merge conflict for field " + key); + } + for (let key in defaults) + if (result[key] === undefined) + result[key] = defaults[key]; + return result; +} + +/** +Each range is associated with a value, which must inherit from +this class. +*/ +class RangeValue { + /** + Compare this value with another value. Used when comparing + rangesets. The default implementation compares by identity. + Unless you are only creating a fixed number of unique instances + of your value type, it is a good idea to implement this + properly. + */ + eq(other) { return this == other; } + /** + Create a [range](https://codemirror.net/6/docs/ref/#state.Range) with this value. + */ + range(from, to = from) { return Range$2.create(from, to, this); } +} +RangeValue.prototype.startSide = RangeValue.prototype.endSide = 0; +RangeValue.prototype.point = false; +RangeValue.prototype.mapMode = MapMode.TrackDel; +/** +A range associates a value with a range of positions. +*/ +class Range$2 { + constructor( + /** + The range's start position. + */ + from, + /** + Its end position. + */ + to, + /** + The value associated with this range. + */ + value) { + this.from = from; + this.to = to; + this.value = value; + } + /** + @internal + */ + static create(from, to, value) { + return new Range$2(from, to, value); + } +} +function cmpRange(a, b) { + return a.from - b.from || a.value.startSide - b.value.startSide; +} +class Chunk { + constructor(from, to, value, + // Chunks are marked with the largest point that occurs + // in them (or -1 for no points), so that scans that are + // only interested in points (such as the + // heightmap-related logic) can skip range-only chunks. + maxPoint) { + this.from = from; + this.to = to; + this.value = value; + this.maxPoint = maxPoint; + } + get length() { return this.to[this.to.length - 1]; } + // Find the index of the given position and side. Use the ranges' + // `from` pos when `end == false`, `to` when `end == true`. + findIndex(pos, side, end, startAt = 0) { + let arr = end ? this.to : this.from; + for (let lo = startAt, hi = arr.length;;) { + if (lo == hi) + return lo; + let mid = (lo + hi) >> 1; + let diff = arr[mid] - pos || (end ? this.value[mid].endSide : this.value[mid].startSide) - side; + if (mid == lo) + return diff >= 0 ? lo : hi; + if (diff >= 0) + hi = mid; + else + lo = mid + 1; + } + } + between(offset, from, to, f) { + for (let i = this.findIndex(from, -1000000000 /* C.Far */, true), e = this.findIndex(to, 1000000000 /* C.Far */, false, i); i < e; i++) + if (f(this.from[i] + offset, this.to[i] + offset, this.value[i]) === false) + return false; + } + map(offset, changes) { + let value = [], from = [], to = [], newPos = -1, maxPoint = -1; + for (let i = 0; i < this.value.length; i++) { + let val = this.value[i], curFrom = this.from[i] + offset, curTo = this.to[i] + offset, newFrom, newTo; + if (curFrom == curTo) { + let mapped = changes.mapPos(curFrom, val.startSide, val.mapMode); + if (mapped == null) + continue; + newFrom = newTo = mapped; + if (val.startSide != val.endSide) { + newTo = changes.mapPos(curFrom, val.endSide); + if (newTo < newFrom) + continue; + } + } + else { + newFrom = changes.mapPos(curFrom, val.startSide); + newTo = changes.mapPos(curTo, val.endSide); + if (newFrom > newTo || newFrom == newTo && val.startSide > 0 && val.endSide <= 0) + continue; + } + if ((newTo - newFrom || val.endSide - val.startSide) < 0) + continue; + if (newPos < 0) + newPos = newFrom; + if (val.point) + maxPoint = Math.max(maxPoint, newTo - newFrom); + value.push(val); + from.push(newFrom - newPos); + to.push(newTo - newPos); + } + return { mapped: value.length ? new Chunk(from, to, value, maxPoint) : null, pos: newPos }; + } +} +/** +A range set stores a collection of [ranges](https://codemirror.net/6/docs/ref/#state.Range) in a +way that makes them efficient to [map](https://codemirror.net/6/docs/ref/#state.RangeSet.map) and +[update](https://codemirror.net/6/docs/ref/#state.RangeSet.update). This is an immutable data +structure. +*/ +class RangeSet { + constructor( + /** + @internal + */ + chunkPos, + /** + @internal + */ + chunk, + /** + @internal + */ + nextLayer, + /** + @internal + */ + maxPoint) { + this.chunkPos = chunkPos; + this.chunk = chunk; + this.nextLayer = nextLayer; + this.maxPoint = maxPoint; + } + /** + @internal + */ + static create(chunkPos, chunk, nextLayer, maxPoint) { + return new RangeSet(chunkPos, chunk, nextLayer, maxPoint); + } + /** + @internal + */ + get length() { + let last = this.chunk.length - 1; + return last < 0 ? 0 : Math.max(this.chunkEnd(last), this.nextLayer.length); + } + /** + The number of ranges in the set. + */ + get size() { + if (this.isEmpty) + return 0; + let size = this.nextLayer.size; + for (let chunk of this.chunk) + size += chunk.value.length; + return size; + } + /** + @internal + */ + chunkEnd(index) { + return this.chunkPos[index] + this.chunk[index].length; + } + /** + Update the range set, optionally adding new ranges or filtering + out existing ones. + + (Note: The type parameter is just there as a kludge to work + around TypeScript variance issues that prevented `RangeSet` + from being a subtype of `RangeSet` when `X` is a subtype of + `Y`.) + */ + update(updateSpec) { + let { add = [], sort = false, filterFrom = 0, filterTo = this.length } = updateSpec; + let filter = updateSpec.filter; + if (add.length == 0 && !filter) + return this; + if (sort) + add = add.slice().sort(cmpRange); + if (this.isEmpty) + return add.length ? RangeSet.of(add) : this; + let cur = new LayerCursor(this, null, -1).goto(0), i = 0, spill = []; + let builder = new RangeSetBuilder(); + while (cur.value || i < add.length) { + if (i < add.length && (cur.from - add[i].from || cur.startSide - add[i].value.startSide) >= 0) { + let range = add[i++]; + if (!builder.addInner(range.from, range.to, range.value)) + spill.push(range); + } + else if (cur.rangeIndex == 1 && cur.chunkIndex < this.chunk.length && + (i == add.length || this.chunkEnd(cur.chunkIndex) < add[i].from) && + (!filter || filterFrom > this.chunkEnd(cur.chunkIndex) || filterTo < this.chunkPos[cur.chunkIndex]) && + builder.addChunk(this.chunkPos[cur.chunkIndex], this.chunk[cur.chunkIndex])) { + cur.nextChunk(); + } + else { + if (!filter || filterFrom > cur.to || filterTo < cur.from || filter(cur.from, cur.to, cur.value)) { + if (!builder.addInner(cur.from, cur.to, cur.value)) + spill.push(Range$2.create(cur.from, cur.to, cur.value)); + } + cur.next(); + } + } + return builder.finishInner(this.nextLayer.isEmpty && !spill.length ? RangeSet.empty + : this.nextLayer.update({ add: spill, filter, filterFrom, filterTo })); + } + /** + Map this range set through a set of changes, return the new set. + */ + map(changes) { + if (changes.empty || this.isEmpty) + return this; + let chunks = [], chunkPos = [], maxPoint = -1; + for (let i = 0; i < this.chunk.length; i++) { + let start = this.chunkPos[i], chunk = this.chunk[i]; + let touch = changes.touchesRange(start, start + chunk.length); + if (touch === false) { + maxPoint = Math.max(maxPoint, chunk.maxPoint); + chunks.push(chunk); + chunkPos.push(changes.mapPos(start)); + } + else if (touch === true) { + let { mapped, pos } = chunk.map(start, changes); + if (mapped) { + maxPoint = Math.max(maxPoint, mapped.maxPoint); + chunks.push(mapped); + chunkPos.push(pos); + } + } + } + let next = this.nextLayer.map(changes); + return chunks.length == 0 ? next : new RangeSet(chunkPos, chunks, next || RangeSet.empty, maxPoint); + } + /** + Iterate over the ranges that touch the region `from` to `to`, + calling `f` for each. There is no guarantee that the ranges will + be reported in any specific order. When the callback returns + `false`, iteration stops. + */ + between(from, to, f) { + if (this.isEmpty) + return; + for (let i = 0; i < this.chunk.length; i++) { + let start = this.chunkPos[i], chunk = this.chunk[i]; + if (to >= start && from <= start + chunk.length && + chunk.between(start, from - start, to - start, f) === false) + return; + } + this.nextLayer.between(from, to, f); + } + /** + Iterate over the ranges in this set, in order, including all + ranges that end at or after `from`. + */ + iter(from = 0) { + return HeapCursor.from([this]).goto(from); + } + /** + @internal + */ + get isEmpty() { return this.nextLayer == this; } + /** + Iterate over the ranges in a collection of sets, in order, + starting from `from`. + */ + static iter(sets, from = 0) { + return HeapCursor.from(sets).goto(from); + } + /** + Iterate over two groups of sets, calling methods on `comparator` + to notify it of possible differences. + */ + static compare(oldSets, newSets, + /** + This indicates how the underlying data changed between these + ranges, and is needed to synchronize the iteration. + */ + textDiff, comparator, + /** + Can be used to ignore all non-point ranges, and points below + the given size. When -1, all ranges are compared. + */ + minPointSize = -1) { + let a = oldSets.filter(set => set.maxPoint > 0 || !set.isEmpty && set.maxPoint >= minPointSize); + let b = newSets.filter(set => set.maxPoint > 0 || !set.isEmpty && set.maxPoint >= minPointSize); + let sharedChunks = findSharedChunks(a, b, textDiff); + let sideA = new SpanCursor(a, sharedChunks, minPointSize); + let sideB = new SpanCursor(b, sharedChunks, minPointSize); + textDiff.iterGaps((fromA, fromB, length) => compare(sideA, fromA, sideB, fromB, length, comparator)); + if (textDiff.empty && textDiff.length == 0) + compare(sideA, 0, sideB, 0, 0, comparator); + } + /** + Compare the contents of two groups of range sets, returning true + if they are equivalent in the given range. + */ + static eq(oldSets, newSets, from = 0, to) { + if (to == null) + to = 1000000000 /* C.Far */ - 1; + let a = oldSets.filter(set => !set.isEmpty && newSets.indexOf(set) < 0); + let b = newSets.filter(set => !set.isEmpty && oldSets.indexOf(set) < 0); + if (a.length != b.length) + return false; + if (!a.length) + return true; + let sharedChunks = findSharedChunks(a, b); + let sideA = new SpanCursor(a, sharedChunks, 0).goto(from), sideB = new SpanCursor(b, sharedChunks, 0).goto(from); + for (;;) { + if (sideA.to != sideB.to || + !sameValues(sideA.active, sideB.active) || + sideA.point && (!sideB.point || !sideA.point.eq(sideB.point))) + return false; + if (sideA.to > to) + return true; + sideA.next(); + sideB.next(); + } + } + /** + Iterate over a group of range sets at the same time, notifying + the iterator about the ranges covering every given piece of + content. Returns the open count (see + [`SpanIterator.span`](https://codemirror.net/6/docs/ref/#state.SpanIterator.span)) at the end + of the iteration. + */ + static spans(sets, from, to, iterator, + /** + When given and greater than -1, only points of at least this + size are taken into account. + */ + minPointSize = -1) { + let cursor = new SpanCursor(sets, null, minPointSize).goto(from), pos = from; + let openRanges = cursor.openStart; + for (;;) { + let curTo = Math.min(cursor.to, to); + if (cursor.point) { + let active = cursor.activeForPoint(cursor.to); + let openCount = cursor.pointFrom < from ? active.length + 1 + : cursor.point.startSide < 0 ? active.length + : Math.min(active.length, openRanges); + iterator.point(pos, curTo, cursor.point, active, openCount, cursor.pointRank); + openRanges = Math.min(cursor.openEnd(curTo), active.length); + } + else if (curTo > pos) { + iterator.span(pos, curTo, cursor.active, openRanges); + openRanges = cursor.openEnd(curTo); + } + if (cursor.to > to) + return openRanges + (cursor.point && cursor.to > to ? 1 : 0); + pos = cursor.to; + cursor.next(); + } + } + /** + Create a range set for the given range or array of ranges. By + default, this expects the ranges to be _sorted_ (by start + position and, if two start at the same position, + `value.startSide`). You can pass `true` as second argument to + cause the method to sort them. + */ + static of(ranges, sort = false) { + let build = new RangeSetBuilder(); + for (let range of ranges instanceof Range$2 ? [ranges] : sort ? lazySort(ranges) : ranges) + build.add(range.from, range.to, range.value); + return build.finish(); + } + /** + Join an array of range sets into a single set. + */ + static join(sets) { + if (!sets.length) + return RangeSet.empty; + let result = sets[sets.length - 1]; + for (let i = sets.length - 2; i >= 0; i--) { + for (let layer = sets[i]; layer != RangeSet.empty; layer = layer.nextLayer) + result = new RangeSet(layer.chunkPos, layer.chunk, result, Math.max(layer.maxPoint, result.maxPoint)); + } + return result; + } +} +/** +The empty set of ranges. +*/ +RangeSet.empty = /*@__PURE__*/new RangeSet([], [], null, -1); +function lazySort(ranges) { + if (ranges.length > 1) + for (let prev = ranges[0], i = 1; i < ranges.length; i++) { + let cur = ranges[i]; + if (cmpRange(prev, cur) > 0) + return ranges.slice().sort(cmpRange); + prev = cur; + } + return ranges; +} +RangeSet.empty.nextLayer = RangeSet.empty; +/** +A range set builder is a data structure that helps build up a +[range set](https://codemirror.net/6/docs/ref/#state.RangeSet) directly, without first allocating +an array of [`Range`](https://codemirror.net/6/docs/ref/#state.Range) objects. +*/ +class RangeSetBuilder { + finishChunk(newArrays) { + this.chunks.push(new Chunk(this.from, this.to, this.value, this.maxPoint)); + this.chunkPos.push(this.chunkStart); + this.chunkStart = -1; + this.setMaxPoint = Math.max(this.setMaxPoint, this.maxPoint); + this.maxPoint = -1; + if (newArrays) { + this.from = []; + this.to = []; + this.value = []; + } + } + /** + Create an empty builder. + */ + constructor() { + this.chunks = []; + this.chunkPos = []; + this.chunkStart = -1; + this.last = null; + this.lastFrom = -1000000000 /* C.Far */; + this.lastTo = -1000000000 /* C.Far */; + this.from = []; + this.to = []; + this.value = []; + this.maxPoint = -1; + this.setMaxPoint = -1; + this.nextLayer = null; + } + /** + Add a range. Ranges should be added in sorted (by `from` and + `value.startSide`) order. + */ + add(from, to, value) { + if (!this.addInner(from, to, value)) + (this.nextLayer || (this.nextLayer = new RangeSetBuilder)).add(from, to, value); + } + /** + @internal + */ + addInner(from, to, value) { + let diff = from - this.lastTo || value.startSide - this.last.endSide; + if (diff <= 0 && (from - this.lastFrom || value.startSide - this.last.startSide) < 0) + throw new Error("Ranges must be added sorted by `from` position and `startSide`"); + if (diff < 0) + return false; + if (this.from.length == 250 /* C.ChunkSize */) + this.finishChunk(true); + if (this.chunkStart < 0) + this.chunkStart = from; + this.from.push(from - this.chunkStart); + this.to.push(to - this.chunkStart); + this.last = value; + this.lastFrom = from; + this.lastTo = to; + this.value.push(value); + if (value.point) + this.maxPoint = Math.max(this.maxPoint, to - from); + return true; + } + /** + @internal + */ + addChunk(from, chunk) { + if ((from - this.lastTo || chunk.value[0].startSide - this.last.endSide) < 0) + return false; + if (this.from.length) + this.finishChunk(true); + this.setMaxPoint = Math.max(this.setMaxPoint, chunk.maxPoint); + this.chunks.push(chunk); + this.chunkPos.push(from); + let last = chunk.value.length - 1; + this.last = chunk.value[last]; + this.lastFrom = chunk.from[last] + from; + this.lastTo = chunk.to[last] + from; + return true; + } + /** + Finish the range set. Returns the new set. The builder can't be + used anymore after this has been called. + */ + finish() { return this.finishInner(RangeSet.empty); } + /** + @internal + */ + finishInner(next) { + if (this.from.length) + this.finishChunk(false); + if (this.chunks.length == 0) + return next; + let result = RangeSet.create(this.chunkPos, this.chunks, this.nextLayer ? this.nextLayer.finishInner(next) : next, this.setMaxPoint); + this.from = null; // Make sure further `add` calls produce errors + return result; + } +} +function findSharedChunks(a, b, textDiff) { + let inA = new Map(); + for (let set of a) + for (let i = 0; i < set.chunk.length; i++) + if (set.chunk[i].maxPoint <= 0) + inA.set(set.chunk[i], set.chunkPos[i]); + let shared = new Set(); + for (let set of b) + for (let i = 0; i < set.chunk.length; i++) { + let known = inA.get(set.chunk[i]); + if (known != null && (textDiff ? textDiff.mapPos(known) : known) == set.chunkPos[i] && + !(textDiff === null || textDiff === void 0 ? void 0 : textDiff.touchesRange(known, known + set.chunk[i].length))) + shared.add(set.chunk[i]); + } + return shared; +} +class LayerCursor { + constructor(layer, skip, minPoint, rank = 0) { + this.layer = layer; + this.skip = skip; + this.minPoint = minPoint; + this.rank = rank; + } + get startSide() { return this.value ? this.value.startSide : 0; } + get endSide() { return this.value ? this.value.endSide : 0; } + goto(pos, side = -1000000000 /* C.Far */) { + this.chunkIndex = this.rangeIndex = 0; + this.gotoInner(pos, side, false); + return this; + } + gotoInner(pos, side, forward) { + while (this.chunkIndex < this.layer.chunk.length) { + let next = this.layer.chunk[this.chunkIndex]; + if (!(this.skip && this.skip.has(next) || + this.layer.chunkEnd(this.chunkIndex) < pos || + next.maxPoint < this.minPoint)) + break; + this.chunkIndex++; + forward = false; + } + if (this.chunkIndex < this.layer.chunk.length) { + let rangeIndex = this.layer.chunk[this.chunkIndex].findIndex(pos - this.layer.chunkPos[this.chunkIndex], side, true); + if (!forward || this.rangeIndex < rangeIndex) + this.setRangeIndex(rangeIndex); + } + this.next(); + } + forward(pos, side) { + if ((this.to - pos || this.endSide - side) < 0) + this.gotoInner(pos, side, true); + } + next() { + for (;;) { + if (this.chunkIndex == this.layer.chunk.length) { + this.from = this.to = 1000000000 /* C.Far */; + this.value = null; + break; + } + else { + let chunkPos = this.layer.chunkPos[this.chunkIndex], chunk = this.layer.chunk[this.chunkIndex]; + let from = chunkPos + chunk.from[this.rangeIndex]; + this.from = from; + this.to = chunkPos + chunk.to[this.rangeIndex]; + this.value = chunk.value[this.rangeIndex]; + this.setRangeIndex(this.rangeIndex + 1); + if (this.minPoint < 0 || this.value.point && this.to - this.from >= this.minPoint) + break; + } + } + } + setRangeIndex(index) { + if (index == this.layer.chunk[this.chunkIndex].value.length) { + this.chunkIndex++; + if (this.skip) { + while (this.chunkIndex < this.layer.chunk.length && this.skip.has(this.layer.chunk[this.chunkIndex])) + this.chunkIndex++; + } + this.rangeIndex = 0; + } + else { + this.rangeIndex = index; + } + } + nextChunk() { + this.chunkIndex++; + this.rangeIndex = 0; + this.next(); + } + compare(other) { + return this.from - other.from || this.startSide - other.startSide || this.rank - other.rank || + this.to - other.to || this.endSide - other.endSide; + } +} +class HeapCursor { + constructor(heap) { + this.heap = heap; + } + static from(sets, skip = null, minPoint = -1) { + let heap = []; + for (let i = 0; i < sets.length; i++) { + for (let cur = sets[i]; !cur.isEmpty; cur = cur.nextLayer) { + if (cur.maxPoint >= minPoint) + heap.push(new LayerCursor(cur, skip, minPoint, i)); + } + } + return heap.length == 1 ? heap[0] : new HeapCursor(heap); + } + get startSide() { return this.value ? this.value.startSide : 0; } + goto(pos, side = -1000000000 /* C.Far */) { + for (let cur of this.heap) + cur.goto(pos, side); + for (let i = this.heap.length >> 1; i >= 0; i--) + heapBubble(this.heap, i); + this.next(); + return this; + } + forward(pos, side) { + for (let cur of this.heap) + cur.forward(pos, side); + for (let i = this.heap.length >> 1; i >= 0; i--) + heapBubble(this.heap, i); + if ((this.to - pos || this.value.endSide - side) < 0) + this.next(); + } + next() { + if (this.heap.length == 0) { + this.from = this.to = 1000000000 /* C.Far */; + this.value = null; + this.rank = -1; + } + else { + let top = this.heap[0]; + this.from = top.from; + this.to = top.to; + this.value = top.value; + this.rank = top.rank; + if (top.value) + top.next(); + heapBubble(this.heap, 0); + } + } +} +function heapBubble(heap, index) { + for (let cur = heap[index];;) { + let childIndex = (index << 1) + 1; + if (childIndex >= heap.length) + break; + let child = heap[childIndex]; + if (childIndex + 1 < heap.length && child.compare(heap[childIndex + 1]) >= 0) { + child = heap[childIndex + 1]; + childIndex++; + } + if (cur.compare(child) < 0) + break; + heap[childIndex] = cur; + heap[index] = child; + index = childIndex; + } +} +class SpanCursor { + constructor(sets, skip, minPoint) { + this.minPoint = minPoint; + this.active = []; + this.activeTo = []; + this.activeRank = []; + this.minActive = -1; + // A currently active point range, if any + this.point = null; + this.pointFrom = 0; + this.pointRank = 0; + this.to = -1000000000 /* C.Far */; + this.endSide = 0; + // The amount of open active ranges at the start of the iterator. + // Not including points. + this.openStart = -1; + this.cursor = HeapCursor.from(sets, skip, minPoint); + } + goto(pos, side = -1000000000 /* C.Far */) { + this.cursor.goto(pos, side); + this.active.length = this.activeTo.length = this.activeRank.length = 0; + this.minActive = -1; + this.to = pos; + this.endSide = side; + this.openStart = -1; + this.next(); + return this; + } + forward(pos, side) { + while (this.minActive > -1 && (this.activeTo[this.minActive] - pos || this.active[this.minActive].endSide - side) < 0) + this.removeActive(this.minActive); + this.cursor.forward(pos, side); + } + removeActive(index) { + remove(this.active, index); + remove(this.activeTo, index); + remove(this.activeRank, index); + this.minActive = findMinIndex(this.active, this.activeTo); + } + addActive(trackOpen) { + let i = 0, { value, to, rank } = this.cursor; + // Organize active marks by rank first, then by size + while (i < this.activeRank.length && (rank - this.activeRank[i] || to - this.activeTo[i]) > 0) + i++; + insert(this.active, i, value); + insert(this.activeTo, i, to); + insert(this.activeRank, i, rank); + if (trackOpen) + insert(trackOpen, i, this.cursor.from); + this.minActive = findMinIndex(this.active, this.activeTo); + } + // After calling this, if `this.point` != null, the next range is a + // point. Otherwise, it's a regular range, covered by `this.active`. + next() { + let from = this.to, wasPoint = this.point; + this.point = null; + let trackOpen = this.openStart < 0 ? [] : null; + for (;;) { + let a = this.minActive; + if (a > -1 && (this.activeTo[a] - this.cursor.from || this.active[a].endSide - this.cursor.startSide) < 0) { + if (this.activeTo[a] > from) { + this.to = this.activeTo[a]; + this.endSide = this.active[a].endSide; + break; + } + this.removeActive(a); + if (trackOpen) + remove(trackOpen, a); + } + else if (!this.cursor.value) { + this.to = this.endSide = 1000000000 /* C.Far */; + break; + } + else if (this.cursor.from > from) { + this.to = this.cursor.from; + this.endSide = this.cursor.startSide; + break; + } + else { + let nextVal = this.cursor.value; + if (!nextVal.point) { // Opening a range + this.addActive(trackOpen); + this.cursor.next(); + } + else if (wasPoint && this.cursor.to == this.to && this.cursor.from < this.cursor.to) { + // Ignore any non-empty points that end precisely at the end of the prev point + this.cursor.next(); + } + else { // New point + this.point = nextVal; + this.pointFrom = this.cursor.from; + this.pointRank = this.cursor.rank; + this.to = this.cursor.to; + this.endSide = nextVal.endSide; + this.cursor.next(); + this.forward(this.to, this.endSide); + break; + } + } + } + if (trackOpen) { + this.openStart = 0; + for (let i = trackOpen.length - 1; i >= 0 && trackOpen[i] < from; i--) + this.openStart++; + } + } + activeForPoint(to) { + if (!this.active.length) + return this.active; + let active = []; + for (let i = this.active.length - 1; i >= 0; i--) { + if (this.activeRank[i] < this.pointRank) + break; + if (this.activeTo[i] > to || this.activeTo[i] == to && this.active[i].endSide >= this.point.endSide) + active.push(this.active[i]); + } + return active.reverse(); + } + openEnd(to) { + let open = 0; + for (let i = this.activeTo.length - 1; i >= 0 && this.activeTo[i] > to; i--) + open++; + return open; + } +} +function compare(a, startA, b, startB, length, comparator) { + a.goto(startA); + b.goto(startB); + let endB = startB + length; + let pos = startB, dPos = startB - startA; + for (;;) { + let diff = (a.to + dPos) - b.to || a.endSide - b.endSide; + let end = diff < 0 ? a.to + dPos : b.to, clipEnd = Math.min(end, endB); + if (a.point || b.point) { + if (!(a.point && b.point && (a.point == b.point || a.point.eq(b.point)) && + sameValues(a.activeForPoint(a.to), b.activeForPoint(b.to)))) + comparator.comparePoint(pos, clipEnd, a.point, b.point); + } + else { + if (clipEnd > pos && !sameValues(a.active, b.active)) + comparator.compareRange(pos, clipEnd, a.active, b.active); + } + if (end > endB) + break; + pos = end; + if (diff <= 0) + a.next(); + if (diff >= 0) + b.next(); + } +} +function sameValues(a, b) { + if (a.length != b.length) + return false; + for (let i = 0; i < a.length; i++) + if (a[i] != b[i] && !a[i].eq(b[i])) + return false; + return true; +} +function remove(array, index) { + for (let i = index, e = array.length - 1; i < e; i++) + array[i] = array[i + 1]; + array.pop(); +} +function insert(array, index, value) { + for (let i = array.length - 1; i >= index; i--) + array[i + 1] = array[i]; + array[index] = value; +} +function findMinIndex(value, array) { + let found = -1, foundPos = 1000000000 /* C.Far */; + for (let i = 0; i < array.length; i++) + if ((array[i] - foundPos || value[i].endSide - value[found].endSide) < 0) { + found = i; + foundPos = array[i]; + } + return found; +} + +/** +Count the column position at the given offset into the string, +taking extending characters and tab size into account. +*/ +function countColumn(string, tabSize, to = string.length) { + let n = 0; + for (let i = 0; i < to;) { + if (string.charCodeAt(i) == 9) { + n += tabSize - (n % tabSize); + i++; + } + else { + n++; + i = findClusterBreak(string, i); + } + } + return n; +} +/** +Find the offset that corresponds to the given column position in a +string, taking extending characters and tab size into account. By +default, the string length is returned when it is too short to +reach the column. Pass `strict` true to make it return -1 in that +situation. +*/ +function findColumn(string, col, tabSize, strict) { + for (let i = 0, n = 0;;) { + if (n >= col) + return i; + if (i == string.length) + break; + n += string.charCodeAt(i) == 9 ? tabSize - (n % tabSize) : 1; + i = findClusterBreak(string, i); + } + return strict === true ? -1 : string.length; +} + +const C = "\u037c"; +const COUNT = typeof Symbol == "undefined" ? "__" + C : Symbol.for(C); +const SET = typeof Symbol == "undefined" ? "__styleSet" + Math.floor(Math.random() * 1e8) : Symbol("styleSet"); +const top = typeof globalThis != "undefined" ? globalThis : typeof window != "undefined" ? window : {}; + +// :: - Style modules encapsulate a set of CSS rules defined from +// JavaScript. Their definitions are only available in a given DOM +// root after it has been _mounted_ there with `StyleModule.mount`. +// +// Style modules should be created once and stored somewhere, as +// opposed to re-creating them every time you need them. The amount of +// CSS rules generated for a given DOM root is bounded by the amount +// of style modules that were used. So to avoid leaking rules, don't +// create these dynamically, but treat them as one-time allocations. +class StyleModule { + // :: (Object + + +

A Rockstar Interpreter in WASM

+

Source:

+ + +

Output:

+

+	
+	
+
+
\ No newline at end of file
diff --git a/codewithrockstar.com/wasm-demo/wasm.js b/codewithrockstar.com/wasm-demo/wasm.js
new file mode 100644
index 00000000..7b26f6bf
--- /dev/null
+++ b/codewithrockstar.com/wasm-demo/wasm.js
@@ -0,0 +1,24 @@
+import { dotnet } from '/wasm/wwwroot/_framework/dotnet.js'
+
+const { setModuleImports, getAssemblyExports, getConfig } = await dotnet
+    .withDiagnosticTracing(false)
+    .withApplicationArgumentsFromQuery()
+    .create();
+
+const config = getConfig();
+const exports = await getAssemblyExports(config.mainAssemblyName);
+await dotnet.run();
+var runButton = document.getElementById("runButton");
+var sourceTextArea = document.getElementById("source");
+var outputPre = document.getElementById("output");
+
+runButton.addEventListener("click", function() {
+	var source = sourceTextArea.value;
+	console.log(source);
+	try {
+	var result = exports.Rockstar.Wasm.RockstarRunner.Run(source);
+	outputPre.innerText = result;
+	} catch(e) {
+		outputPre.innerText = e;
+	}
+});
diff --git a/design-decisions.md b/design-decisions.md
deleted file mode 100644
index 93d5b46c..00000000
--- a/design-decisions.md
+++ /dev/null
@@ -1,10 +0,0 @@
-Rockstar .NET interpreter - Design Decisions
-
-Names
-
-Use good names. If the name you want conflicts with part of the .NET namespace or a built-in type, use a heavy metal umlaut
-
-`Program` => `Prögram`
-
-`String` => `Strïng`
-
diff --git a/examples/nth-fibonacci.rock b/examples/nth-fibonacci.rock
deleted file mode 100644
index e1e6a59b..00000000
--- a/examples/nth-fibonacci.rock
+++ /dev/null
@@ -1,21 +0,0 @@
-The spiral takes my soul
-The moon is all over me 
-Let my life be the moon over the moon
-The night was gone 
-If my soul is my life 
-Give back the night
-
-The circle is me
-If my soul is the circle 
-Give back my life
-
-Until the circle is my soul
-Let the moon be the night
-Let the night be my life
-Put the moon with my life into my life
-Build the circle up
-
-Give back the night with my life
-
-Listen to the nature
-Shout the spiral taking the nature
diff --git a/examples/pi_approx.rock b/examples/pi_approx.rock
deleted file mode 100644
index 0122804e..00000000
--- a/examples/pi_approx.rock
+++ /dev/null
@@ -1,27 +0,0 @@
-My life was a mushroom cloud, then
-  it was nothing
-Sin is unquenchable
-My cell was empty
-
-Your love was a jackhammer shaking the bars
-Your life is a fungus
-Your love is mycorrhizal
-My life was empty without your love
-
-Until your life is my life,
-  build my life up
-Put your love into Me
-Put my life into the song,
-  until your love is stronger than the song
-Put the song of Me into Me
-Knock the song down
-
-Put your love into You
-Put it with my life of Sin into the song,
-  until your love is stronger than the song
-Put the song of You into You
-Knock the song down, down
-
-Put my cell into the song
-Put it with Me over You into my cell
-Scream my cell of Sin
diff --git a/examples/rock_wine.rock b/examples/rock_wine.rock
deleted file mode 100644
index 0963e304..00000000
--- a/examples/rock_wine.rock
+++ /dev/null
@@ -1,109 +0,0 @@
-guilt says guilt
-lover says lover
-longing says longing
-reason says reason
-hope says hope
-desire says desire
-fans says fans
-therapist says therapist
-uncle says uncle
-craving says craving
-wife says wife
-frenzy says frenzy
-friend says friend
-grandma says grandma
-doubt says doubt
-confidant says confidant
-calling says calling
-knowledge says knowledge
-will says will
-dentist says dentist
-angst says angst
-wisdom says wisdom
-foolishness says foolishness
-anger says anger
-mind says mind
-resolve says resolve
-desperation says desperation
-my guilt says my fear is unforgivable
-my lover says my thirst is unquenchable
-my longing says my world is "nothing without your love"
-my reason says it's misleading
-my hope says let my world be without my fear
-my desire says let my dreams be my world over my fear
-my fans says my song says ,
-my therapist says the fear says  says
-my uncle says the worst says my
-my craving says the night says whisper your love taking my
-my wife says your love takes my soul, the heart
-my frenzy says if my fear is my thirst
-my friend says put the heart with the fear, and the heart into my soul
-my grandma says (yeah, yeah, yeah,...)
-my doubt says if my fear ain't my thirst
-my confidant says put the worst of my fear with the heart of my fear with the fear of my fear with my soul into my soul
-my calling says (oooh)
-my knowledge says if my fear is my dreams
-my will says put the night with the heart with my song, and the heart into my soul
-my dentist says (aaaah)
-my angst says give back my soul
-my wisdom says (incomprehensible mumbling)
-my foolishness says While my fear is as strong as my world
-my anger says if my fear is my world
-my mind says say "knock my fear down"
-my resolve says break it down
-my desperation says (solo)
-my fear is unforgivable
-my thirst is unquenchable
-my world is "nothing without your love"
-it's misleading
-let my world be without my fear
-let my dreams be my world over my fear
-my song says ,
-the fear says  says
-the worst says my
-the night says whisper your love taking my
-your love takes my soul, the heart
-if my fear is my thirst
-put the heart with the fear, and the heart into my soul
-(yeah, yeah, yeah,...)
-if my fear ain't my thirst
-put the worst of my fear with the heart of my fear with the fear of my fear with my soul into my soul
-(oooh)
-if my fear is my dreams
-put the night with the heart with my song, and the heart into my soul
-(aaaah)
-give back my soul
-(incomprehensible mumbling)
-While my fear is as strong as my world
-if my fear is my world
-say "knock my fear down"
-break it down
-(solo)
-whisper your love taking my guilt, guilt
-whisper your love taking my lover, lover
-whisper your love taking my longing, longing
-whisper your love taking my reason, reason
-whisper your love taking my hope, hope
-whisper your love taking my desire, desire
-whisper your love taking my fans, fans
-whisper your love taking my therapist, therapist
-whisper your love taking my uncle, uncle
-whisper your love taking my craving, craving
-whisper your love taking my wife, wife
-whisper your love taking my frenzy, frenzy
-whisper your love taking my friend, friend
-whisper your love taking my grandma, grandma
-whisper your love taking my doubt, doubt
-whisper your love taking my confidant, confidant
-whisper your love taking my calling, calling
-whisper your love taking my knowledge, knowledge
-whisper your love taking my will, will
-whisper your love taking my dentist, dentist
-whisper your love taking my angst, angst
-whisper your love taking my wisdom, wisdom
-whisper your love taking my foolishness, foolishness
-whisper your love taking my anger, anger
-whisper your love taking my mind, mind
-whisper your love taking my resolve, resolve
-whisper your love taking my desperation, desperation
-knock my fear down
\ No newline at end of file
diff --git a/examples/rock_wine_minimalist.rock b/examples/rock_wine_minimalist.rock
deleted file mode 100644
index 24411d6f..00000000
--- a/examples/rock_wine_minimalist.rock
+++ /dev/null
@@ -1,82 +0,0 @@
-(This comment makes the program not a quine. It is here mainly to discourage the use of the minimalistic version as an examle of rockstar code, since this greatly reduces the code singability)
-b says b
-c says c
-d says d
-e says e
-f says f
-g says g
-h says h
-i says i
-j says j
-k says k
-l says l
-m says m
-n says n
-o says o
-p says p
-q says q
-r says r
-s says s
-t says t
-u says u
-my b says my number is 2
-my c says my y says  says
-my d says my w says my
-my e says your love takes my x, my z
-my f says if my number is 2
-my g says put my z with my y with my z into my x
-my h says (yeah, yeah, yeah)
-my i says if my number ain't 2
-my j says put my w of my number with my z of my number with my y of my number with my x into my x
-my k says (oooh)
-my l says if my number is -1
-my m says put "say your love taking my " with my z with ", " with my z into my x
-my n says (yeah, yeah, yeah,...)
-my o says give back my x
-my p says (aaah)
-my q says While my number is as high as -2
-my r says if my number is -2
-my s says say "knock my number down"
-my t says break it down
-my u says (solo)
-my number is 2
-my y says  says
-my w says my
-your love takes my x, my z
-if my number is 2
-put my z with my y with my z into my x
-(yeah, yeah, yeah)
-if my number ain't 2
-put my w of my number with my z of my number with my y of my number with my x into my x
-(oooh)
-if my number is -1
-put "say your love taking my " with my z with ", " with my z into my x
-(yeah, yeah, yeah,...)
-give back my x
-(aaah)
-While my number is as high as -2
-if my number is -2
-say "knock my number down"
-break it down
-(solo)
-say your love taking my b, b
-say your love taking my c, c
-say your love taking my d, d
-say your love taking my e, e
-say your love taking my f, f
-say your love taking my g, g
-say your love taking my h, h
-say your love taking my i, i
-say your love taking my j, j
-say your love taking my k, k
-say your love taking my l, l
-say your love taking my m, m
-say your love taking my n, n
-say your love taking my o, o
-say your love taking my p, p
-say your love taking my q, q
-say your love taking my r, r
-say your love taking my s, s
-say your love taking my t, t
-say your love taking my u, u
-knock my number down
\ No newline at end of file
diff --git a/rockstar-2.md b/rockstar-2.md
deleted file mode 100644
index 8c0d3a37..00000000
--- a/rockstar-2.md
+++ /dev/null
@@ -1,304 +0,0 @@
-# Rockstar 2
-
-Rockstar was invented in a bar, as a joke. It was a parody spec. I thought people might read it, laugh, and move on. I didn't think anybody would implement it, and I certainly didn't think that more than five years later people would still be using it, creating their own implementations, and filing issues when they found inconsistencies in the spec.
-
-Douglas Adams once said about Zaphod Beeblebrox that he gave the character two heads and three arms because on the radio that's a cheap throwaway gag... but when it came to adapting *The Hitch-Hikers Guide to the Galaxy* for television and film, that throwaway gag turned into an expensive nightmare for the production designers.
-
-Bits of the original Rockstar spec were like that. `Take it to the top` as a `continue` statement was daft. Poetic literals were, and are, a lovely idea, but the way they were specified made a lot of other things unnecessarily difficult. Using `mysterious` to denote an uninitialised variable caused a few giggles and a lot of headaches.
-
-**It's time for Rockstar 2.**
-
-The fundamental premise of Rockstar remains the same: it's a language in which your computer programs can also be songs, so **every feature of the language** has to be expressible in a form that wouldn't look out of place in the lyrics to a rock song.
-
-There is another really important consideration, though: Rockstar only exists because it's fun. It should be a fun language to use, and a fun language to maintain... and at some point, working around all the stupid hacks and throwaway gags in the original spec stopped being fun.
-
-**That means there will be breaking changes.** Rockstar 1 programs probably won't run on Rockstar 2, and I have no intention to support a "legacy mode". Rockstar 2 will be a complete overhaul. Some programs might run with minimal modifications, but at this point I'm far more interested in the folks who might consider using it for the next Advent of Code than the folks who used it for the last one.
-
-## So what's going to break?
-
-### Poetic literals
-
-Rockstar 1 used the `is` and `was` keywords to initialise a variable based on a poetic literal:
-
-`Desire is a lovestruck ladykiller`
-
-would initialise the variable `desire` to the value `100`. This was the only place in the language that allowed poetic literals - and meant the `is` keyword couldn't be used for ordinary  assignment. Rockstar 2 will introduce the keyword `like` to denote a poetic literal expression, and poetic literal expressions can be used anywhere. `Desire is like a lovestruck ladykiller` (initialise `Desire` with the value `100`)
-
-`If your smile is like a sledgehammer` - a Boolean expression which is true if `your smile` is equal to `12`
-
-This frees up `is` and `was` for assignment.
-
-```
-X is 5
-Y is X
-Z is X with Y
-```
-
-Poetic literals will use the ellipsis `...` (or the Unicode equivalent U+2026 `…`) as a decimal separator:
-
-```rockstar
-My dreams were like ice... a life unfulfilled, wakin' everybody up, taking booze and pills.
-```
-
-### Statements and block syntax.
-
-In Rockstar 1, statements ended with a newline, and the only way to terminate a block was a blank line.
-
-In Rockstar 2, a statement ends with a **new line** or a **terminal punctuation mark** `.`, `!`, `?`. (These are punctuation marks which would end a sentence in written English.) 
-
-#### Line continuations
-
-If the last non-whitespace character on a line is a **continuation punctuation mark** `-`, `,`, `;`, `.`, the subsequent newline is ignored. This allows Rockstar statements to span multiple lines:
-
-```
-My dreams were like ice... a life unfulfilled, 
-wakin' everybody up, taking booze and pills.
-```
-
-```rockstar
-My pain is like a diamond.
-Until my pain is nothing, shout it, tear it down, yeah.
-```
-
-In Rockstar 2, the block terminators `whoa`, `oh`, `yeah`  and `baby` indicate the end of a code block. 
-
-To end multiple nested blocks, you can use `ooh` (ends two blocks), `oooh` (three blocks), `ooooh` (ends four blocks), `yeeah`, `yeeeah`, `baaby`, `baaaaby`, `whooa`, `whoooa`. *(how easy is this to implement? I have literally no idea.)*
-
-A block terminator includes **all adjacent whitespace and punctuation characters**. `, yeah!` is equivalent to `yeah`
-
-```rockstar
-Midnight takes your heart and your soul
-While your heart is as high as your soul
-Put your heart without your soul into your heart
-Ooh, give back your heart, yeah.
-```
-
-Declaring functions
-
-```rockstar
-wants, takes, needs, craves, longs for
-
-The sum takes w, x, y and z
-Give back w with x with y with z
-
-Search wants a needle and a haystack
-(todo: implement search)
-```
-
-Calling functions
-
-```
-My heart is the sum taking 4, 5, 6 and 7
-```
-
-## The Rockstar Wishlist
-
-### Better equality / comparisons
-
-Truthiness and falsiness are a good idea most of the time. Decrementing a number until it's falsy (zero), chopping characters out of a string until it's falsy (empty string) - they're useful for writing lyrical code.
-
-I propose the `exactly` keyword (alias `really`, `actually`)
-
-```rockstar
-My dreams are nothing
-My heart is silence
-If my heart is my dreams (returns true because 0 ~= "")
-If my heart is really my dreams (returns false because 0 !== "")
-```
-
-### A native interpreter (rockstar.exe, /bin/rockstar)
-
-For Rockstar 2.0, I'm porting the parser and interpreter to .NET. 
-
-.NET 8 supports native ahead-of-time compilation for just about every platform out there - Windows, macOS, Linux, on both Intel and ARM architectures - as well as WebAssembly, so it should be possible to produce native binaries for folks who want to run Rockstar locally, and a WASM version which will replace the Satriani JS interpreter used on codewithrockstar.com
-
-### An improved online editor and AST visualiser
-
-When I was building Satriani, I used a hacky web app I built which rendered the parser output and syntax tree based on a grammar definition and program input. Something like this could be really useful for other folks writing and debugging Rockstar programs. Details TBC but it'll be cool.
-
-### Better VS Code support
-
-Syntax highlighting, an AST visualiser... anybody want to build a Rockstar language server? :)
-
-*(Yes, this is a ridiculous amount of effort to put into a joke language... but programming is fun and I like building things.)*
-
-### Filesystem and network IO
-
-This one's always been a bit controversial because supporting any kind of filesystem or network access means implementing features that won't work in a web-based interpreter. Some sort of HTTP client might be a nice way to allow Rockstar to connect to external resources without tying it to any kind of filesystem.
-
-Here's one possible syntax that might work:
-
-```
-The file is "input.txt"
-Open the file (note that this replaces the variable: the file name is now a file handle)
-Read the file into the line
-Say "this is another line" into the file
-
-
-```
-
-
-
-### Modules, packages, imports, libraries... 
-
-I'm still undecided as to whether we need this. Partly because, along with filesystems, it's a reasonable guarantee that people can't use Rockstar to build anything important.
-
-But it's worth considering. As well as concerns around coupling Rockstar to specific filesystems, the big challenge with modules and imports is that I have no idea what the syntax for this might look like. 
-
-One idea that I've had floating around for a while is to use the list of "musicians" as the imports and possessive apostrophes to denote namespacing.
-
-**Minimalist:**
-
-```
-(math.rock)
-Modulus takes x and y
-While x is as high as y
-put x without y into x
-End
-Give back x
-End
-```
-
-```rockstar
-(program.rock)
-Math: M
-
-The result is M's modulus taking 5 and 3
-Shout the result
-```
-
-**Idiomatic:**
-
-```
-(vocals.rock)
-Revenge takes your heart and your soul
-While your heart is as high as your soul
-Put your heart without your soul into your heart
-Whoa, give back your heart, yeah
-```
-
-```rockstar
-Vocals: Stevie
-Guitar: Kelly 
-Bass: Nik
-
-Fire is like ice, hate is like water
-My world is nothing
-The answer is Stevie's revenge taking my world, fire
-```
-
-### Random numbers
-
-Idea: the `shuffle` keyword. `Shuffle x` returns a random integer between zero and `x`. `Shuffle my array` randomises the array order in place; `shuffle my array into the result` leaves the `my array` intact and puts the shuffled version into `the result`
-
-### The system clock
-
-I think `now` returning the current UTC timestamp  JS new Date().valueOf())?
-
-## The Silly Stuff
-
-### Meat Loaf Conditionals
-
-There is an [old suggestion on the Rockstar repo from jimbobbennett](https://github.com/RockstarLang/rockstar/issues/68):
-
-> For `if` blocks, Rockstar should support Meatloaf syntax:
-> `I would do  for  But I won't do `
- This syntax would evaluate the ``, and if it is `true`, then call ``, else it will call ``.
-
-I have no plans to implement this one incredibly specific scenario.
-
-But... wouldn't it be cool if some combination of structures and statements meant this was valid Rockstar?
-### Bill & Ted
-
-We should parse expression like:
-
-```rockstar
-That is totally non non non non non NON heinous
-```
-
-### Real songs as Rockstar programs ("Rock You Like A Hurricane")
-
-I think that Scorpions' "[Rock You Like A Hurricane](https://www.google.com/search?q=scorpions+rock+you+like+a+hurricane+lyric)" is the best candidate for an actual rock song which will cleanly compile in Rockstar, and I'd like to see if I can implement new language features in such a way that the whole song is syntactically valid.
-## Timeline
-
-The [Copenhagen Developers Festival](https://cphdevfest.com/) is happening in August. It's a great event -- a mashup of a software developer conference and a music festival -- and sounds like a great excuse to throw a Rockstar 2.0 launch party.
-
-Time to get to work.
-
-### Developer Diary
-
-Keywords with spaces in them.
-
-OK, this is going to cause all kinds of fun.
-
-Here are two expressions:
-
-```
-x is greater than y
-x is y is greater than z
-```
-
-The first parses to:
-
-```
-binary:
-	op: greater_than
-	lhs: x
-	rhs: y
-```
-
-The second to:
-
-```
-binary:
-	op: equality
-	lhs: x
-	rhs: binary
-		op: greater_than
-		lhs: y
-		rhs: z
-```
-
-## Types vs Expressions
-
-#### Option 1: Number : Type : Expression
-
-Pros:
-* No repetition - there is only one thing called Number
-* Parser captures literals as actual types
-
-Cons:
-
-* Results of evaluations will have empty line/column/lexeme (is this bad?)
-	* what if we replace this with a Source property that tells us where it came from?
-	* If Source is null - it didn't come from source code
-#### Option 2: Number Type AND Number Expression
-
-Pros: 
-
-* Type doesn't contain any unnecessary metadata
-* Eval() returns a Type, not an Expression
-	* so Eval() will ALWAYS result in a Number/String/Boolean/Symbol/Function/Reference?
-	* ...but this still works even if Type : Expression
-
-
-
-
-x is 5
-y is 7
-the total is x with y
-
-# Breaking changes
-Stuff that works differently in rockstar 2.0
-
-* Boolean operators now behave like JavaScript: `true && x` will return x, `false || foo` will return foo
-* 
-
-CONDITIONALS
-
-"foo" = !"bar"    
-"foo" != "bar" => true
-
-a = !b
-a != b
-
diff --git a/rockstar-icon.ico b/rockstar-icon.ico
new file mode 100644
index 00000000..7cba5fe4
Binary files /dev/null and b/rockstar-icon.ico differ
diff --git a/satriani/.gitignore b/satriani/.gitignore
deleted file mode 100644
index 570a527e..00000000
--- a/satriani/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-satriani.parser.js
-satriani.standalone.js
diff --git a/satriani/README.md b/satriani/README.md
deleted file mode 100644
index 67f5c930..00000000
--- a/satriani/README.md
+++ /dev/null
@@ -1,118 +0,0 @@
-# Satriani
-
-Satriani is a JavaScript interpreter for the Rockstar programming language. Satriani has been created to act as a reference implementation for managing changes to the Rockstar language specification.
-
-## Usage
-
-To run Satriani using nodeJS from the command line:
-```
-git clone https://github.com/RockstarLang/rockstar 
-cd rockstar/satriani
-yarn install
-yarn pegjs
-node rockstar .rock
-```
-
-To run the test suite:
-
-```
-git clone https://github.com/RockstarLang/rockstar 
-cd rockstar/satriani
-yarn test
-```
-
-To run Satriani from your own JavaScript code:
-
-```
-const satriani = require('./satriani.js');
-
-// Required to support reading from stdin
-const readlineSync = require('readline-sync');
-
-let rockstar = new satriani.Interpreter();
-let program = "Shout Hello World!\nGive back 1\n";
-let ast = rockstar.parse(program);
-
-// Draw the abstract syntax tree (AST) to the console as a JSON object
-console.log(JSON.stringify(ast, null, 2))
-
-let output = console.log
-let input = readlineSync.question
-let result = rockstar.run(ast, input, output)
-console.log(result);
-```
-
-To run Satriani in a browser, use `browserify` to bundle it:
-
-```
-git clone https://github.com/RockstarLang/rockstar 
-cd rockstar/satriani
-yarn browserify
-```
-
-This will create a single JS file, `satriani.standalone.js`, containing the Satriani parser and interpreter, which
-you can use in web pages:
-
-```
-
-
-
-
-
-
-
-
-```
-## How it works
-
-Satriani uses `pegjs`, a parser generator for JavaScript. The language 
-grammar is defined in **[rockstar.peg](rockstar.peg)**.
-
-We use the `pegjs` command line to generate `rockstar.parser.js`, which is the parser itself:
-
-```
-$ pegjs -o rockstar.parser.js rockstar.peg
-```
-
-This is also defined as a yarn build task, so you can build the parser using:
-
-```
-$ yarn run pegjs
-```
-
-**[rockstar.parser.js](rockstar.parser.js)** exports a function `parse(input, options)`, where `input` 
-is a string containing the source code of your Rockstar program and `options` is the 
-optional [pegjs parser options](https://pegjs.org/documentation#using-the-parser).
-
-`parse` will return an **abstract syntax tree** (AST) containing your program. The 
-AST is a JSON object representing your program as a tree of operations.
-
-**[rockstar.interpreter.js](satriani.interpreter.js)** is a runtime interpreter that can take the AST created by the parser and evaluate it. It's pluggable
-so you can override the I/O mechanisms.
-
-The test suite is runnable using [Mocha](https://mochajs.org/) - each 'test' is defined as a .rock source file and an .rock.out output file, so the test suite is completely platform-agnostic.
-
-## Acknowledgements
-
-I've basically had to teach myself how to build compilers again to create this - it's been a long, long time since University... :)
-
-HUGE thanks to Wolfgang Faust for https://github.com/wolfgang42/rockstar-js - I've been using his grammar
-as a reference throughout and have reused bits of it directly, and it's been invaluable.
-
-Mihai Bazon's fantastic series of articles on building recursive descent compilers in JavaScript has also been
-really useful: http://lisperator.net/pltut/
-
-
-
-
-
-
-
-
diff --git a/satriani/package-lock.json b/satriani/package-lock.json
deleted file mode 100644
index 582550e4..00000000
--- a/satriani/package-lock.json
+++ /dev/null
@@ -1,3258 +0,0 @@
-{
-  "name": "satriani",
-  "version": "0.9.0",
-  "lockfileVersion": 2,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "satriani",
-      "version": "0.9.0",
-      "license": "ISC",
-      "dependencies": {
-        "browserify": "^16.2.3",
-        "chai": "^4.2.0",
-        "gh-pages": "^2.0.1",
-        "pegjs": "^0.10.0",
-        "readline-sync": "^1.4.9"
-      },
-      "devDependencies": {
-        "mocha": "^5.2.0"
-      }
-    },
-    "node_modules/acorn": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
-      "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-node": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
-      "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
-      "dependencies": {
-        "acorn": "^7.0.0",
-        "acorn-walk": "^7.0.0",
-        "xtend": "^4.0.2"
-      }
-    },
-    "node_modules/acorn-walk": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz",
-      "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dependencies": {
-        "array-uniq": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/asn1.js": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
-      "dependencies": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "node_modules/assert": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
-      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
-      "dependencies": {
-        "object-assign": "^4.1.1",
-        "util": "0.10.3"
-      }
-    },
-    "node_modules/assert/node_modules/inherits": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-      "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
-    },
-    "node_modules/assert/node_modules/util": {
-      "version": "0.10.3",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
-      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
-      "dependencies": {
-        "inherits": "2.0.1"
-      }
-    },
-    "node_modules/assertion-error": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
-      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/async": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
-      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
-      "dependencies": {
-        "lodash": "^4.17.14"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-    },
-    "node_modules/base64-js": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
-      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
-    },
-    "node_modules/bn.js": {
-      "version": "4.11.8",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
-    },
-    "node_modules/browser-pack": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
-      "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
-      "dependencies": {
-        "combine-source-map": "~0.8.0",
-        "defined": "^1.0.0",
-        "JSONStream": "^1.0.3",
-        "safe-buffer": "^5.1.1",
-        "through2": "^2.0.0",
-        "umd": "^3.0.0"
-      },
-      "bin": {
-        "browser-pack": "bin/cmd.js"
-      }
-    },
-    "node_modules/browser-resolve": {
-      "version": "1.11.3",
-      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
-      "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
-      "dependencies": {
-        "resolve": "1.1.7"
-      }
-    },
-    "node_modules/browser-resolve/node_modules/resolve": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-      "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
-    },
-    "node_modules/browser-stdout": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
-      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
-      "dev": true
-    },
-    "node_modules/browserify": {
-      "version": "16.5.0",
-      "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz",
-      "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==",
-      "dependencies": {
-        "assert": "^1.4.0",
-        "browser-pack": "^6.0.1",
-        "browser-resolve": "^1.11.0",
-        "browserify-zlib": "~0.2.0",
-        "buffer": "^5.0.2",
-        "cached-path-relative": "^1.0.0",
-        "concat-stream": "^1.6.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "~1.0.0",
-        "crypto-browserify": "^3.0.0",
-        "defined": "^1.0.0",
-        "deps-sort": "^2.0.0",
-        "domain-browser": "^1.2.0",
-        "duplexer2": "~0.1.2",
-        "events": "^2.0.0",
-        "glob": "^7.1.0",
-        "has": "^1.0.0",
-        "htmlescape": "^1.1.0",
-        "https-browserify": "^1.0.0",
-        "inherits": "~2.0.1",
-        "insert-module-globals": "^7.0.0",
-        "JSONStream": "^1.0.3",
-        "labeled-stream-splicer": "^2.0.0",
-        "mkdirp": "^0.5.0",
-        "module-deps": "^6.0.0",
-        "os-browserify": "~0.3.0",
-        "parents": "^1.0.1",
-        "path-browserify": "~0.0.0",
-        "process": "~0.11.0",
-        "punycode": "^1.3.2",
-        "querystring-es3": "~0.2.0",
-        "read-only-stream": "^2.0.0",
-        "readable-stream": "^2.0.2",
-        "resolve": "^1.1.4",
-        "shasum": "^1.0.0",
-        "shell-quote": "^1.6.1",
-        "stream-browserify": "^2.0.0",
-        "stream-http": "^3.0.0",
-        "string_decoder": "^1.1.1",
-        "subarg": "^1.0.0",
-        "syntax-error": "^1.1.1",
-        "through2": "^2.0.0",
-        "timers-browserify": "^1.0.1",
-        "tty-browserify": "0.0.1",
-        "url": "~0.11.0",
-        "util": "~0.10.1",
-        "vm-browserify": "^1.0.0",
-        "xtend": "^4.0.0"
-      },
-      "bin": {
-        "browserify": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/browserify-aes": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
-      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
-      "dependencies": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "node_modules/browserify-cipher": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
-      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
-      "dependencies": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "node_modules/browserify-des": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
-      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
-      "dependencies": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "node_modules/browserify-rsa": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
-      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
-      "dependencies": {
-        "bn.js": "^4.1.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "node_modules/browserify-sign": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
-      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
-      "dependencies": {
-        "bn.js": "^4.1.1",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.2",
-        "elliptic": "^6.0.0",
-        "inherits": "^2.0.1",
-        "parse-asn1": "^5.0.0"
-      }
-    },
-    "node_modules/browserify-zlib": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
-      "dependencies": {
-        "pako": "~1.0.5"
-      }
-    },
-    "node_modules/buffer": {
-      "version": "5.4.3",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
-      "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
-      "dependencies": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4"
-      }
-    },
-    "node_modules/buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
-    },
-    "node_modules/buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
-    },
-    "node_modules/builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
-    },
-    "node_modules/cached-path-relative": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz",
-      "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg=="
-    },
-    "node_modules/chai": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
-      "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
-      "dependencies": {
-        "assertion-error": "^1.1.0",
-        "check-error": "^1.0.2",
-        "deep-eql": "^3.0.1",
-        "get-func-name": "^2.0.0",
-        "pathval": "^1.1.0",
-        "type-detect": "^4.0.5"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/check-error": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
-      "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/cipher-base": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "node_modules/combine-source-map": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
-      "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
-      "dependencies": {
-        "convert-source-map": "~1.1.0",
-        "inline-source-map": "~0.6.0",
-        "lodash.memoize": "~3.0.3",
-        "source-map": "~0.5.3"
-      }
-    },
-    "node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "node_modules/concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "engines": [
-        "node >= 0.8"
-      ],
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "node_modules/console-browserify": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
-      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
-    },
-    "node_modules/constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
-    },
-    "node_modules/convert-source-map": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
-      "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA="
-    },
-    "node_modules/core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-    },
-    "node_modules/create-ecdh": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
-      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
-      "dependencies": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.0.0"
-      }
-    },
-    "node_modules/create-hash": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
-      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
-      "dependencies": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "node_modules/create-hmac": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
-      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
-      "dependencies": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "node_modules/crypto-browserify": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
-      "dependencies": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/dash-ast": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
-      "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA=="
-    },
-    "node_modules/debug": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-      "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/deep-eql": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
-      "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
-      "dependencies": {
-        "type-detect": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/defined": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
-      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
-    },
-    "node_modules/deps-sort": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
-      "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
-      "dependencies": {
-        "JSONStream": "^1.0.3",
-        "shasum-object": "^1.0.0",
-        "subarg": "^1.0.0",
-        "through2": "^2.0.0"
-      },
-      "bin": {
-        "deps-sort": "bin/cmd.js"
-      }
-    },
-    "node_modules/des.js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
-      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "node_modules/detective": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
-      "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
-      "dependencies": {
-        "acorn-node": "^1.6.1",
-        "defined": "^1.0.0",
-        "minimist": "^1.1.1"
-      },
-      "bin": {
-        "detective": "bin/detective.js"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/diff": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.3.1"
-      }
-    },
-    "node_modules/diffie-hellman": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
-      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
-      "dependencies": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      }
-    },
-    "node_modules/domain-browser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
-      "engines": {
-        "node": ">=0.4",
-        "npm": ">=1.2"
-      }
-    },
-    "node_modules/duplexer2": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
-      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
-      "dependencies": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "node_modules/elliptic": {
-      "version": "6.5.4",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
-      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
-      "dependencies": {
-        "bn.js": "^4.11.9",
-        "brorand": "^1.1.0",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.1",
-        "inherits": "^2.0.4",
-        "minimalistic-assert": "^1.0.1",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "node_modules/elliptic/node_modules/bn.js": {
-      "version": "4.12.0",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-    },
-    "node_modules/email-addresses": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz",
-      "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg=="
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/events": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
-      "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==",
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "node_modules/evp_bytestokey": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
-      "dependencies": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "node_modules/fast-safe-stringify": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
-      "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
-    },
-    "node_modules/filename-reserved-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz",
-      "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/filenamify": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz",
-      "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=",
-      "dependencies": {
-        "filename-reserved-regex": "^1.0.0",
-        "strip-outer": "^1.0.0",
-        "trim-repeated": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/filenamify-url": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz",
-      "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=",
-      "dependencies": {
-        "filenamify": "^1.0.0",
-        "humanize-url": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fs-extra": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
-      "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
-      "dependencies": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=6 <7 || >=8"
-      }
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-    },
-    "node_modules/get-assigned-identifiers": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
-      "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ=="
-    },
-    "node_modules/get-func-name": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
-      "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/gh-pages": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.1.1.tgz",
-      "integrity": "sha512-yNW2SFp9xGRP/8Sk2WXuLI/Gn92oOL4HBgudn6PsqAnuWT90Y1tozJoTfX1WdrDSW5Rb90kLVOf5mm9KJ/2fDw==",
-      "dependencies": {
-        "async": "^2.6.1",
-        "commander": "^2.18.0",
-        "email-addresses": "^3.0.1",
-        "filenamify-url": "^1.0.0",
-        "fs-extra": "^7.0.0",
-        "globby": "^6.1.0",
-        "graceful-fs": "^4.1.11",
-        "rimraf": "^2.6.2"
-      },
-      "bin": {
-        "gh-pages": "bin/gh-pages.js",
-        "gh-pages-clean": "bin/gh-pages-clean.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/globby": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-      "dependencies": {
-        "array-union": "^1.0.1",
-        "glob": "^7.0.3",
-        "object-assign": "^4.0.1",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
-      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
-    },
-    "node_modules/growl": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
-      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.x"
-      }
-    },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/hash-base": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
-      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/hash.js": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
-      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
-    "node_modules/he": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
-      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
-      "dev": true,
-      "bin": {
-        "he": "bin/he"
-      }
-    },
-    "node_modules/hmac-drbg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
-      "dependencies": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "node_modules/htmlescape": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
-      "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/https-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
-    },
-    "node_modules/humanize-url": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz",
-      "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=",
-      "dependencies": {
-        "normalize-url": "^1.0.0",
-        "strip-url-auth": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ieee754": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
-      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "node_modules/inline-source-map": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
-      "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
-      "dependencies": {
-        "source-map": "~0.5.3"
-      }
-    },
-    "node_modules/insert-module-globals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
-      "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
-      "dependencies": {
-        "acorn-node": "^1.5.2",
-        "combine-source-map": "^0.8.0",
-        "concat-stream": "^1.6.1",
-        "is-buffer": "^1.1.0",
-        "JSONStream": "^1.0.3",
-        "path-is-absolute": "^1.0.1",
-        "process": "~0.11.0",
-        "through2": "^2.0.0",
-        "undeclared-identifiers": "^1.1.2",
-        "xtend": "^4.0.0"
-      },
-      "bin": {
-        "insert-module-globals": "bin/cmd.js"
-      }
-    },
-    "node_modules/is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
-    },
-    "node_modules/is-plain-obj": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-    },
-    "node_modules/json-stable-stringify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
-      "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
-      "dependencies": {
-        "jsonify": "~0.0.0"
-      }
-    },
-    "node_modules/jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
-      "optionalDependencies": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "node_modules/jsonify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/jsonparse": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
-      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
-      "engines": [
-        "node >= 0.2.0"
-      ]
-    },
-    "node_modules/JSONStream": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
-      "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
-      "dependencies": {
-        "jsonparse": "^1.2.0",
-        "through": ">=2.2.7 <3"
-      },
-      "bin": {
-        "JSONStream": "bin.js"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/labeled-stream-splicer": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
-      "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "stream-splicer": "^2.0.0"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "node_modules/lodash.memoize": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
-      "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8="
-    },
-    "node_modules/md5.js": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
-      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
-      "dependencies": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "node_modules/miller-rabin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
-      "dependencies": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      },
-      "bin": {
-        "miller-rabin": "bin/miller-rabin"
-      }
-    },
-    "node_modules/minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
-    },
-    "node_modules/minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
-    },
-    "node_modules/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-    },
-    "node_modules/mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
-      "dependencies": {
-        "minimist": "0.0.8"
-      },
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      }
-    },
-    "node_modules/mkdirp/node_modules/minimist": {
-      "version": "0.0.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
-    },
-    "node_modules/mocha": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
-      "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
-      "dev": true,
-      "dependencies": {
-        "browser-stdout": "1.3.1",
-        "commander": "2.15.1",
-        "debug": "3.1.0",
-        "diff": "3.5.0",
-        "escape-string-regexp": "1.0.5",
-        "glob": "7.1.2",
-        "growl": "1.10.5",
-        "he": "1.1.1",
-        "minimatch": "3.0.4",
-        "mkdirp": "0.5.1",
-        "supports-color": "5.4.0"
-      },
-      "bin": {
-        "_mocha": "bin/_mocha",
-        "mocha": "bin/mocha"
-      },
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/mocha/node_modules/commander": {
-      "version": "2.15.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
-      "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
-      "dev": true
-    },
-    "node_modules/mocha/node_modules/glob": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
-      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-      "dev": true,
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/module-deps": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz",
-      "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==",
-      "dependencies": {
-        "browser-resolve": "^1.7.0",
-        "cached-path-relative": "^1.0.2",
-        "concat-stream": "~1.6.0",
-        "defined": "^1.0.0",
-        "detective": "^5.0.2",
-        "duplexer2": "^0.1.2",
-        "inherits": "^2.0.1",
-        "JSONStream": "^1.0.3",
-        "parents": "^1.0.0",
-        "readable-stream": "^2.0.2",
-        "resolve": "^1.4.0",
-        "stream-combiner2": "^1.1.1",
-        "subarg": "^1.0.0",
-        "through2": "^2.0.0",
-        "xtend": "^4.0.0"
-      },
-      "bin": {
-        "module-deps": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "node_modules/normalize-url": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
-      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
-      "dependencies": {
-        "object-assign": "^4.0.1",
-        "prepend-http": "^1.0.0",
-        "query-string": "^4.1.0",
-        "sort-keys": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
-    },
-    "node_modules/pako": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
-      "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw=="
-    },
-    "node_modules/parents": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
-      "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
-      "dependencies": {
-        "path-platform": "~0.11.15"
-      }
-    },
-    "node_modules/parse-asn1": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
-      "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
-      "dependencies": {
-        "asn1.js": "^4.0.0",
-        "browserify-aes": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "node_modules/path-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
-      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-    },
-    "node_modules/path-platform": {
-      "version": "0.11.15",
-      "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
-      "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=",
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/pathval": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
-      "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/pbkdf2": {
-      "version": "3.0.17",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
-      "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
-      "dependencies": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      },
-      "engines": {
-        "node": ">=0.12"
-      }
-    },
-    "node_modules/pegjs": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz",
-      "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=",
-      "bin": {
-        "pegjs": "bin/pegjs"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dependencies": {
-        "pinkie": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/prepend-http": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
-      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
-      "engines": {
-        "node": ">= 0.6.0"
-      }
-    },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-    },
-    "node_modules/public-encrypt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
-      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
-      "dependencies": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "node_modules/punycode": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
-    },
-    "node_modules/query-string": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
-      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
-      "dependencies": {
-        "object-assign": "^4.1.0",
-        "strict-uri-encode": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
-      "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "node_modules/querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
-      "engines": {
-        "node": ">=0.4.x"
-      }
-    },
-    "node_modules/randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dependencies": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
-      "dependencies": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/read-only-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
-      "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
-      "dependencies": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "node_modules/readable-stream": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/readable-stream/node_modules/safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-    },
-    "node_modules/readable-stream/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/readline-sync": {
-      "version": "1.4.10",
-      "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
-      "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw==",
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/resolve": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz",
-      "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==",
-      "dependencies": {
-        "path-parse": "^1.0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      }
-    },
-    "node_modules/ripemd160": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
-      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
-      "dependencies": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
-    },
-    "node_modules/sha.js": {
-      "version": "2.4.11",
-      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
-      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      },
-      "bin": {
-        "sha.js": "bin.js"
-      }
-    },
-    "node_modules/shasum": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
-      "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
-      "dependencies": {
-        "json-stable-stringify": "~0.0.0",
-        "sha.js": "~2.4.4"
-      }
-    },
-    "node_modules/shasum-object": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
-      "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
-      "dependencies": {
-        "fast-safe-stringify": "^2.0.7"
-      }
-    },
-    "node_modules/shell-quote": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
-      "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
-    },
-    "node_modules/simple-concat": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
-      "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
-    },
-    "node_modules/sort-keys": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
-      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
-      "dependencies": {
-        "is-plain-obj": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/stream-browserify": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
-      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
-      "dependencies": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "node_modules/stream-combiner2": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
-      "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
-      "dependencies": {
-        "duplexer2": "~0.1.0",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "node_modules/stream-http": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz",
-      "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==",
-      "dependencies": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^3.0.6",
-        "xtend": "^4.0.0"
-      }
-    },
-    "node_modules/stream-http/node_modules/readable-stream": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
-      "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/stream-splicer": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
-      "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
-      "dependencies": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "node_modules/strict-uri-encode": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
-      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/string_decoder": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-      "dependencies": {
-        "safe-buffer": "~5.2.0"
-      }
-    },
-    "node_modules/strip-outer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
-      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
-      "dependencies": {
-        "escape-string-regexp": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/strip-url-auth": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz",
-      "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/subarg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
-      "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
-      "dependencies": {
-        "minimist": "^1.1.0"
-      }
-    },
-    "node_modules/supports-color": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
-      "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/syntax-error": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
-      "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
-      "dependencies": {
-        "acorn-node": "^1.2.0"
-      }
-    },
-    "node_modules/through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
-    },
-    "node_modules/through2": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "node_modules/timers-browserify": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
-      "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
-      "dependencies": {
-        "process": "~0.11.0"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
-    "node_modules/trim-repeated": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
-      "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
-      "dependencies": {
-        "escape-string-regexp": "^1.0.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/tty-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
-      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
-    },
-    "node_modules/type-detect": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
-    },
-    "node_modules/umd": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
-      "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==",
-      "bin": {
-        "umd": "bin/cli.js"
-      }
-    },
-    "node_modules/undeclared-identifiers": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
-      "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
-      "dependencies": {
-        "acorn-node": "^1.3.0",
-        "dash-ast": "^1.0.0",
-        "get-assigned-identifiers": "^1.2.0",
-        "simple-concat": "^1.0.0",
-        "xtend": "^4.0.1"
-      },
-      "bin": {
-        "undeclared-identifiers": "bin.js"
-      }
-    },
-    "node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
-    "node_modules/url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "dependencies": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      }
-    },
-    "node_modules/url/node_modules/punycode": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-      "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
-    },
-    "node_modules/util": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
-      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
-      "dependencies": {
-        "inherits": "2.0.3"
-      }
-    },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "node_modules/util/node_modules/inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-    },
-    "node_modules/vm-browserify": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
-      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "node_modules/xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "engines": {
-        "node": ">=0.4"
-      }
-    }
-  },
-  "dependencies": {
-    "acorn": {
-      "version": "7.1.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
-      "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ=="
-    },
-    "acorn-node": {
-      "version": "1.8.2",
-      "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz",
-      "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==",
-      "requires": {
-        "acorn": "^7.0.0",
-        "acorn-walk": "^7.0.0",
-        "xtend": "^4.0.2"
-      }
-    },
-    "acorn-walk": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz",
-      "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg=="
-    },
-    "array-union": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "requires": {
-        "array-uniq": "^1.0.1"
-      }
-    },
-    "array-uniq": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
-    },
-    "asn1.js": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
-      "requires": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "assert": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
-      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
-      "requires": {
-        "object-assign": "^4.1.1",
-        "util": "0.10.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
-        },
-        "util": {
-          "version": "0.10.3",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
-          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
-          "requires": {
-            "inherits": "2.0.1"
-          }
-        }
-      }
-    },
-    "assertion-error": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
-      "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="
-    },
-    "async": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
-      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
-      "requires": {
-        "lodash": "^4.17.14"
-      }
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-    },
-    "base64-js": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
-      "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
-    },
-    "bn.js": {
-      "version": "4.11.8",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
-    },
-    "browser-pack": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
-      "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
-      "requires": {
-        "combine-source-map": "~0.8.0",
-        "defined": "^1.0.0",
-        "JSONStream": "^1.0.3",
-        "safe-buffer": "^5.1.1",
-        "through2": "^2.0.0",
-        "umd": "^3.0.0"
-      }
-    },
-    "browser-resolve": {
-      "version": "1.11.3",
-      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
-      "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
-      "requires": {
-        "resolve": "1.1.7"
-      },
-      "dependencies": {
-        "resolve": {
-          "version": "1.1.7",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
-        }
-      }
-    },
-    "browser-stdout": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
-      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
-      "dev": true
-    },
-    "browserify": {
-      "version": "16.5.0",
-      "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz",
-      "integrity": "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw==",
-      "requires": {
-        "assert": "^1.4.0",
-        "browser-pack": "^6.0.1",
-        "browser-resolve": "^1.11.0",
-        "browserify-zlib": "~0.2.0",
-        "buffer": "^5.0.2",
-        "cached-path-relative": "^1.0.0",
-        "concat-stream": "^1.6.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "~1.0.0",
-        "crypto-browserify": "^3.0.0",
-        "defined": "^1.0.0",
-        "deps-sort": "^2.0.0",
-        "domain-browser": "^1.2.0",
-        "duplexer2": "~0.1.2",
-        "events": "^2.0.0",
-        "glob": "^7.1.0",
-        "has": "^1.0.0",
-        "htmlescape": "^1.1.0",
-        "https-browserify": "^1.0.0",
-        "inherits": "~2.0.1",
-        "insert-module-globals": "^7.0.0",
-        "JSONStream": "^1.0.3",
-        "labeled-stream-splicer": "^2.0.0",
-        "mkdirp": "^0.5.0",
-        "module-deps": "^6.0.0",
-        "os-browserify": "~0.3.0",
-        "parents": "^1.0.1",
-        "path-browserify": "~0.0.0",
-        "process": "~0.11.0",
-        "punycode": "^1.3.2",
-        "querystring-es3": "~0.2.0",
-        "read-only-stream": "^2.0.0",
-        "readable-stream": "^2.0.2",
-        "resolve": "^1.1.4",
-        "shasum": "^1.0.0",
-        "shell-quote": "^1.6.1",
-        "stream-browserify": "^2.0.0",
-        "stream-http": "^3.0.0",
-        "string_decoder": "^1.1.1",
-        "subarg": "^1.0.0",
-        "syntax-error": "^1.1.1",
-        "through2": "^2.0.0",
-        "timers-browserify": "^1.0.1",
-        "tty-browserify": "0.0.1",
-        "url": "~0.11.0",
-        "util": "~0.10.1",
-        "vm-browserify": "^1.0.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "browserify-aes": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
-      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
-      "requires": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "browserify-cipher": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
-      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
-      "requires": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "browserify-des": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
-      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "browserify-rsa": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
-      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "browserify-sign": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
-      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
-      "requires": {
-        "bn.js": "^4.1.1",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.2",
-        "elliptic": "^6.0.0",
-        "inherits": "^2.0.1",
-        "parse-asn1": "^5.0.0"
-      }
-    },
-    "browserify-zlib": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
-      "requires": {
-        "pako": "~1.0.5"
-      }
-    },
-    "buffer": {
-      "version": "5.4.3",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
-      "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4"
-      }
-    },
-    "buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
-    },
-    "buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
-    },
-    "builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
-    },
-    "cached-path-relative": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz",
-      "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg=="
-    },
-    "chai": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
-      "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
-      "requires": {
-        "assertion-error": "^1.1.0",
-        "check-error": "^1.0.2",
-        "deep-eql": "^3.0.1",
-        "get-func-name": "^2.0.0",
-        "pathval": "^1.1.0",
-        "type-detect": "^4.0.5"
-      }
-    },
-    "check-error": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
-      "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII="
-    },
-    "cipher-base": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "combine-source-map": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
-      "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
-      "requires": {
-        "convert-source-map": "~1.1.0",
-        "inline-source-map": "~0.6.0",
-        "lodash.memoize": "~3.0.3",
-        "source-map": "~0.5.3"
-      }
-    },
-    "commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "console-browserify": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
-      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
-    },
-    "constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
-    },
-    "convert-source-map": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
-      "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA="
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-    },
-    "create-ecdh": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
-      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.0.0"
-      }
-    },
-    "create-hash": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
-      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "create-hmac": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
-      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
-      "requires": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "crypto-browserify": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
-      "requires": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      }
-    },
-    "dash-ast": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz",
-      "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA=="
-    },
-    "debug": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
-      "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
-      "dev": true,
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "deep-eql": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
-      "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
-      "requires": {
-        "type-detect": "^4.0.0"
-      }
-    },
-    "defined": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
-      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
-    },
-    "deps-sort": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz",
-      "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==",
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "shasum-object": "^1.0.0",
-        "subarg": "^1.0.0",
-        "through2": "^2.0.0"
-      }
-    },
-    "des.js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
-      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "detective": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
-      "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
-      "requires": {
-        "acorn-node": "^1.6.1",
-        "defined": "^1.0.0",
-        "minimist": "^1.1.1"
-      }
-    },
-    "diff": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
-      "dev": true
-    },
-    "diffie-hellman": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
-      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      }
-    },
-    "domain-browser": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
-    },
-    "duplexer2": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
-      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
-      "requires": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "elliptic": {
-      "version": "6.5.4",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
-      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
-      "requires": {
-        "bn.js": "^4.11.9",
-        "brorand": "^1.1.0",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.1",
-        "inherits": "^2.0.4",
-        "minimalistic-assert": "^1.0.1",
-        "minimalistic-crypto-utils": "^1.0.1"
-      },
-      "dependencies": {
-        "bn.js": {
-          "version": "4.12.0",
-          "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
-          "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-        }
-      }
-    },
-    "email-addresses": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz",
-      "integrity": "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg=="
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-    },
-    "events": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
-      "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg=="
-    },
-    "evp_bytestokey": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
-      "requires": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "fast-safe-stringify": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
-      "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
-    },
-    "filename-reserved-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz",
-      "integrity": "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q="
-    },
-    "filenamify": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz",
-      "integrity": "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU=",
-      "requires": {
-        "filename-reserved-regex": "^1.0.0",
-        "strip-outer": "^1.0.0",
-        "trim-repeated": "^1.0.0"
-      }
-    },
-    "filenamify-url": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz",
-      "integrity": "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A=",
-      "requires": {
-        "filenamify": "^1.0.0",
-        "humanize-url": "^1.0.0"
-      }
-    },
-    "fs-extra": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
-      "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^4.0.0",
-        "universalify": "^0.1.0"
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-    },
-    "get-assigned-identifiers": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
-      "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ=="
-    },
-    "get-func-name": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
-      "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE="
-    },
-    "gh-pages": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.1.1.tgz",
-      "integrity": "sha512-yNW2SFp9xGRP/8Sk2WXuLI/Gn92oOL4HBgudn6PsqAnuWT90Y1tozJoTfX1WdrDSW5Rb90kLVOf5mm9KJ/2fDw==",
-      "requires": {
-        "async": "^2.6.1",
-        "commander": "^2.18.0",
-        "email-addresses": "^3.0.1",
-        "filenamify-url": "^1.0.0",
-        "fs-extra": "^7.0.0",
-        "globby": "^6.1.0",
-        "graceful-fs": "^4.1.11",
-        "rimraf": "^2.6.2"
-      }
-    },
-    "glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "globby": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
-      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
-      "requires": {
-        "array-union": "^1.0.1",
-        "glob": "^7.0.3",
-        "object-assign": "^4.0.1",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
-      "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
-    },
-    "growl": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
-      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
-      "dev": true
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-flag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
-    },
-    "hash-base": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
-      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "hash.js": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
-      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
-      "requires": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
-    "he": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
-      "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
-      "dev": true
-    },
-    "hmac-drbg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
-      "requires": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "htmlescape": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
-      "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E="
-    },
-    "https-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
-    },
-    "humanize-url": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz",
-      "integrity": "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8=",
-      "requires": {
-        "normalize-url": "^1.0.0",
-        "strip-url-auth": "^1.0.0"
-      }
-    },
-    "ieee754": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
-      "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "inline-source-map": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
-      "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
-      "requires": {
-        "source-map": "~0.5.3"
-      }
-    },
-    "insert-module-globals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
-      "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
-      "requires": {
-        "acorn-node": "^1.5.2",
-        "combine-source-map": "^0.8.0",
-        "concat-stream": "^1.6.1",
-        "is-buffer": "^1.1.0",
-        "JSONStream": "^1.0.3",
-        "path-is-absolute": "^1.0.1",
-        "process": "~0.11.0",
-        "through2": "^2.0.0",
-        "undeclared-identifiers": "^1.1.2",
-        "xtend": "^4.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
-    },
-    "is-plain-obj": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
-      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
-    },
-    "isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-    },
-    "json-stable-stringify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
-      "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
-      "requires": {
-        "jsonify": "~0.0.0"
-      }
-    },
-    "jsonfile": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
-      "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
-      "requires": {
-        "graceful-fs": "^4.1.6"
-      }
-    },
-    "jsonify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
-    },
-    "jsonparse": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
-      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
-    },
-    "JSONStream": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
-      "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
-      "requires": {
-        "jsonparse": "^1.2.0",
-        "through": ">=2.2.7 <3"
-      }
-    },
-    "labeled-stream-splicer": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz",
-      "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "stream-splicer": "^2.0.0"
-      }
-    },
-    "lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "lodash.memoize": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
-      "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8="
-    },
-    "md5.js": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
-      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "miller-rabin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
-      "requires": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      }
-    },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
-    },
-    "minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "requires": {
-        "minimist": "0.0.8"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "0.0.8",
-          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
-        }
-      }
-    },
-    "mocha": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz",
-      "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==",
-      "dev": true,
-      "requires": {
-        "browser-stdout": "1.3.1",
-        "commander": "2.15.1",
-        "debug": "3.1.0",
-        "diff": "3.5.0",
-        "escape-string-regexp": "1.0.5",
-        "glob": "7.1.2",
-        "growl": "1.10.5",
-        "he": "1.1.1",
-        "minimatch": "3.0.4",
-        "mkdirp": "0.5.1",
-        "supports-color": "5.4.0"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "2.15.1",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
-          "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
-          "dev": true
-        },
-        "glob": {
-          "version": "7.1.2",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
-          "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.4",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        }
-      }
-    },
-    "module-deps": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz",
-      "integrity": "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A==",
-      "requires": {
-        "browser-resolve": "^1.7.0",
-        "cached-path-relative": "^1.0.2",
-        "concat-stream": "~1.6.0",
-        "defined": "^1.0.0",
-        "detective": "^5.0.2",
-        "duplexer2": "^0.1.2",
-        "inherits": "^2.0.1",
-        "JSONStream": "^1.0.3",
-        "parents": "^1.0.0",
-        "readable-stream": "^2.0.2",
-        "resolve": "^1.4.0",
-        "stream-combiner2": "^1.1.1",
-        "subarg": "^1.0.0",
-        "through2": "^2.0.0",
-        "xtend": "^4.0.0"
-      }
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-      "dev": true
-    },
-    "normalize-url": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
-      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
-      "requires": {
-        "object-assign": "^4.0.1",
-        "prepend-http": "^1.0.0",
-        "query-string": "^4.1.0",
-        "sort-keys": "^1.0.0"
-      }
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
-    },
-    "pako": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
-      "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw=="
-    },
-    "parents": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
-      "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
-      "requires": {
-        "path-platform": "~0.11.15"
-      }
-    },
-    "parse-asn1": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
-      "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
-      "requires": {
-        "asn1.js": "^4.0.0",
-        "browserify-aes": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "path-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
-      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-    },
-    "path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-    },
-    "path-platform": {
-      "version": "0.11.15",
-      "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
-      "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I="
-    },
-    "pathval": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
-      "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA="
-    },
-    "pbkdf2": {
-      "version": "3.0.17",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
-      "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
-      "requires": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "pegjs": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz",
-      "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0="
-    },
-    "pify": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
-      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "prepend-http": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
-      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
-    },
-    "process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-    },
-    "public-encrypt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
-      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "punycode": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
-    },
-    "query-string": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
-      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
-      "requires": {
-        "object-assign": "^4.1.0",
-        "strict-uri-encode": "^1.0.0"
-      }
-    },
-    "querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
-    },
-    "querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
-    },
-    "randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "requires": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
-      "requires": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "read-only-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
-      "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
-      "requires": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "readable-stream": {
-      "version": "2.3.6",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.1.2",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "readline-sync": {
-      "version": "1.4.10",
-      "resolved": "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz",
-      "integrity": "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw=="
-    },
-    "resolve": {
-      "version": "1.13.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz",
-      "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==",
-      "requires": {
-        "path-parse": "^1.0.6"
-      }
-    },
-    "rimraf": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-      "requires": {
-        "glob": "^7.1.3"
-      }
-    },
-    "ripemd160": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
-      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "safe-buffer": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
-      "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
-    },
-    "sha.js": {
-      "version": "2.4.11",
-      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
-      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "shasum": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
-      "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
-      "requires": {
-        "json-stable-stringify": "~0.0.0",
-        "sha.js": "~2.4.4"
-      }
-    },
-    "shasum-object": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz",
-      "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==",
-      "requires": {
-        "fast-safe-stringify": "^2.0.7"
-      }
-    },
-    "shell-quote": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
-      "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
-    },
-    "simple-concat": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
-      "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
-    },
-    "sort-keys": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
-      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
-      "requires": {
-        "is-plain-obj": "^1.0.0"
-      }
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-    },
-    "stream-browserify": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
-      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
-      "requires": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "stream-combiner2": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
-      "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
-      "requires": {
-        "duplexer2": "~0.1.0",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "stream-http": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz",
-      "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==",
-      "requires": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^3.0.6",
-        "xtend": "^4.0.0"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.4.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
-          "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        }
-      }
-    },
-    "stream-splicer": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz",
-      "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "strict-uri-encode": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
-      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
-    },
-    "string_decoder": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
-      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
-      "requires": {
-        "safe-buffer": "~5.2.0"
-      }
-    },
-    "strip-outer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
-      "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
-      "requires": {
-        "escape-string-regexp": "^1.0.2"
-      }
-    },
-    "strip-url-auth": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz",
-      "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164="
-    },
-    "subarg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
-      "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
-      "requires": {
-        "minimist": "^1.1.0"
-      }
-    },
-    "supports-color": {
-      "version": "5.4.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
-      "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^3.0.0"
-      }
-    },
-    "syntax-error": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
-      "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
-      "requires": {
-        "acorn-node": "^1.2.0"
-      }
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
-    },
-    "through2": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-      "requires": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "timers-browserify": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
-      "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
-      "requires": {
-        "process": "~0.11.0"
-      }
-    },
-    "trim-repeated": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
-      "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=",
-      "requires": {
-        "escape-string-regexp": "^1.0.2"
-      }
-    },
-    "tty-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
-      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
-    },
-    "type-detect": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
-    },
-    "umd": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
-      "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow=="
-    },
-    "undeclared-identifiers": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz",
-      "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==",
-      "requires": {
-        "acorn-node": "^1.3.0",
-        "dash-ast": "^1.0.0",
-        "get-assigned-identifiers": "^1.2.0",
-        "simple-concat": "^1.0.0",
-        "xtend": "^4.0.1"
-      }
-    },
-    "universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
-    },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
-        }
-      }
-    },
-    "util": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
-      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
-      "requires": {
-        "inherits": "2.0.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-        }
-      }
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "vm-browserify": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
-      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
-    }
-  }
-}
diff --git a/satriani/package.json b/satriani/package.json
deleted file mode 100644
index c51abe1e..00000000
--- a/satriani/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "name": "satriani",
-  "version": "0.9.0",
-  "description": "JS interpreter for Rockstar",
-  "main": "satriani.js",
-  "directories": {
-    "test": "tests"
-  },
-  "dependencies": {
-    "browserify": "^16.2.3",
-    "chai": "^4.2.0",
-    "gh-pages": "^2.0.1",
-    "pegjs": "^0.10.0",
-    "readline-sync": "^1.4.9"
-  },
-  "devDependencies": {
-    "mocha": "^5.2.0"
-  },
-  "scripts": {
-    "browserify": "yarn pegjs && node node_modules/browserify/bin/cmd.js satriani.js --standalone Satriani -o satriani.standalone.js",
-    "deploy": "node_modules/gh-pages/bin/gh-pages.js -u 'CircleCI ' -r git@github.com:RockstarLang/codewithrockstar.com.git --add --src docs/js/satriani.js -m 'Updated js/satriani.js from main repo' -b master -d deploy",
-    "serve": "python -m SimpleHTTPServer 8000",
-    "pegjs": "node node_modules/pegjs/bin/pegjs --cache -o satriani.parser.js rockstar.peg",
-    "test": "yarn pegjs && mocha test/*.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/RockstarLang/rockstar.git"
-  },
-  "author": "",
-  "license": "ISC",
-  "bugs": {
-    "url": "https://github.com/dylanbeattie/satriani/issues"
-  },
-  "homepage": "https://github.com/dylanbeattie/satriani#readme"
-}
diff --git a/satriani/rockstar.js b/satriani/rockstar.js
deleted file mode 100644
index 0964819a..00000000
--- a/satriani/rockstar.js
+++ /dev/null
@@ -1,41 +0,0 @@
-const fs = require('fs');
-const satriani = require('./satriani.js');
-var readlineSync = require('readline-sync');
-
-var sourceFilePath = process.argv[2];
-var watch = process.argv.filter(x => x.toLowerCase() === "--watch").length > 0;
-
-function execute() {
-    var rockstar = new satriani.Interpreter();
-    fs.readFile(sourceFilePath, 'utf8', (err, data) => {
-        if (err) throw err;
-        try {
-            let tree = rockstar.parse(data);
-            let input = readlineSync.question;
-            let output = console.log;
-            let result = rockstar.run(tree, input, output)
-            console.log(result ? result : "(program returned no output)");
-        } catch (e) {
-            if (e.location && e.location.start) {
-                let lines = data.split(/\n/);
-                console.log(lines[e.location.start.line - 1]);
-                console.log(' '.repeat(e.location.start.column - 1) + '^');
-                console.log(e.message);
-                console.log(sourceFilePath + " line " + e.location.start.line + " col " + e.location.start.column);
-            } else {
-                console.log(e);
-            }
-
-        }
-    });
-}
-
-if (!sourceFilePath) {
-    console.log('No source file specified');
-    console.log('Usage: node rockstar.js program.rock');
-} else {
-    execute();
-    if (watch) {
-        fs.watch(sourceFilePath, execute);
-    }
-}
\ No newline at end of file
diff --git a/satriani/rockstar.peg b/satriani/rockstar.peg
deleted file mode 100644
index 058298cc..00000000
--- a/satriani/rockstar.peg
+++ /dev/null
@@ -1,472 +0,0 @@
-/*
-PEG grammar for Rockstar (https://codewithrockstar.com)
-Created using PEG.js        https://pegjs.org
-After updating, run pegjs -o rockstar-parser.js rockstar.peg
-*/
-
-{
-  /* initialiser code - this is JS that runs before the parser is generated */
-
-  const keywords = new Set([
-    // common variable prefixes
-    'a', 'an', 'the', 'my', 'your', 'our',
-
-    // pronouns
-    'it', 'he', 'she', 'him', 'her', 'they', 'them', 'ze', 'hir', 'zie', 'zir', 'xe', 'xem', 've', 'ver',
-
-    // literal values
-    'mysterious',
-    'null', 'nothing', 'nowhere', 'nobody', 'gone',
-    'true', 'right', 'yes', 'ok',
-    'false', 'wrong', 'no', 'lies',
-    'maybe', 'definitely', // reserved for future use
-    'empty', 'silent', 'silence',
-
-    // assignment
-    'let', 'be', 'put', 'into', 'in', // expression
-    'is', 'are', 'was', 'were', 'say', 'says', 'said', // poetic
-
-    // operations
-    'at', 'rock', 'with', 'roll', 'into', 'push', 'pop', 'like', // arrays
-    'cut', 'split', 'shatter', 'join', 'unite', 'cast', 'burn', // strings
-    'build', 'up', 'knock', 'down', // increment/decrement
-    'plus', 'with', 'minus', 'without', 'times', 'of', 'over', 'between', // arithmetic
-    'and', // list arithmetic
-    'turn', 'up', 'down', 'round', 'around', // rounding
-    'and', 'or', 'nor', 'not', // logical
-
-    // comparison
-    'is', "isn't", 'isnt', "ain't", 'aint',
-    'arent', "aren't", 'wasnt', "wasn't", 'werent', "weren't",
-    'not',
-    'than',
-    'higher', 'greater', 'bigger', 'stronger',
-    'lower', 'less', 'smaller', 'weaker',
-    'as',
-    'high', 'great', 'big', 'strong',
-    'low', 'little', 'small', 'weak',
-
-    // input/output
-    'listen', 'to',
-    'say', 'shout', 'whisper', 'scream',
-
-    // control flow
-    'if', 'else',
-    'while', 'until',
-    'break', 'continue',
-    'break', 'it', 'down',
-    'take', 'it', 'to', 'the', 'top',
-    'take',
-
-    // functions
-    'takes', 'wants',
-    'give', 'return', 'send', 'back',
-    'taking',
-  ])
-
-  function isKeyword(string) {
-    return keywords.has(string.toLowerCase());
-  }
-}
-
-program = p:line * { return { list: p.filter(item => item) } }
-
-line = _* s:statement (EOL+ / EOF) { return s }
-  /
-    EOL { return null }
-
-whitespace  = [ \t]
-comment     = '(' [^)]* ')' / '{' [^\}]* '}' / '[' [^\]]* ']'
-_           = (whitespace / comment)+
-
-noise 	= (_ / [;,?!&.])
-EOL = 	noise* '\r'? '\n'
-EOF = !.
-
-ignore_rest_of_line = (_[^\n]*)?
-
-statement   = _* s:(break / continue / function / function_call
-			/ function_return / loop / conditional / operation / expression) { return s }
-
-break = 'break'i ignore_rest_of_line {
-	return { 'break' : {} }
-}
-
-continue = ('continue'i ignore_rest_of_line / 'take it to the top'i) {
-	return { 'continue' : {} }
-}
-
-takes = ('takes'i / 'wants'i)
-function = name:variable _ takes _ args:variable_list EOL body:block EOL
-	{ return { 'function': {
-    	name: name,
-        args: args.map(arg => arg),
-        body: body
-    } } }
-
-
-expression_list_separator = (_? ', and'i _ / _?('&' / ',' / "'n'"i)_?)
-
-variable_list_separator   = expression_list_separator / _ 'and'i _
-
-variable_list = head:variable variable_list_separator tail:variable_list
-	{ return [head].concat(tail) }
-  / arg:variable { return [arg] }
-
-function_call = name:variable _ 'taking'i _ args:expression_list
-	{ return { 'call': { name: name, args: Array.isArray(args) ? args : [args] } } }
-
-expression_list = head:simple_expression expression_list_separator tail:expression_list
-	{ return [head].concat(tail) }
-  / arg:simple_expression { return [arg] }
-
-return = 'return'i / 'give back'i / 'send'i / 'give'i
-
-function_return = return _ e:expression (_ 'back'i)?
-	{ return { 'return': { 'expression' : e } } }
-
-operation = readline / output / crement / mutation / assignment / rounding
-
-readline
-  = 'listen to'i _ target:assignable
-    { return { assign: { expression: { listen : ''}, target: target } } }
-	/ 'listen'i
-    { return { 'listen' : ''} }
-
-continuation = EOL _* s:statement { return s };
-
-block 	= head:statement tail:(continuation)+
-    {
-          return { list : [head].concat(tail) }
-        }
-    / s:statement { return s }
-
-consequent 	= _ s:statement { return s }
-      / EOL s:block { return s }
-
-alternate 	= _ 'else'i _ a:statement { return a }
-      / EOL+ _* 'else'i _ a:statement { return a }
-      / EOL+ _* 'else'i EOL a:block { return a }
-            / EOL { return null }
-
-conditional = 'if'i _ e:expression c:consequent? a:alternate?  {
-          return {
-              'conditional': {
-                  'condition' : e,
-                    'consequent' : c,
-                    'alternate' : a
-                }
-            };
-        }
-
-loopable 	= _ s:statement { return s }
-      		/ EOL s:block EOL { return s }
-
-loop 	= 'while'i _ e:expression c:loopable
-          { return { 'while_loop': {
-            'condition': e,
-            'consequent': c
-         } }; }
-         /
-         'until'i _ e:expression c:loopable
-          { return { 'until_loop': {
-            'condition': e,
-            'consequent': c
-         } }; }
-
-output      = ('say'i/'shout'i/'whisper'i/'scream'i) _ e:expression
-                {return {'output': e}}
-
-simple_expression  =   function_call / constant / lookup / literal / pronoun
-
-literal = constant / number / string
-
-constant = null / true / false / empty_string / mysterious
-
-true 	= ('true'i / 'ok'i / 'right'i / 'yes'i) !letter { return { constant: true } }
-
-false 	= ('false'i / 'lies'i / 'wrong'i / 'no'i) !letter { return { constant: false } }
-
-null 	= ('null'i / 'nothing'i / 'nowhere'i / 'nobody'i / 'gone'i) { return { constant: null } }
-
-empty_string = ('empty'i / 'silent'i / 'silence'i) { return { constant: "" } }
-
-mysterious = 'mysterious'i  { return '__MYSTERIOUS__' }
-
-number      = n:$('-'?[0-9]+ ('.' [0-9]+)?) '.'?
-                { return {number: parseFloat(n)} }
-      /
-              n:$('.' [0-9]+)
-                { return {number: parseFloat(n) } }
-
-
-string      = '"' s:$[^"]* '"'
-                { return {string: s}}
-
-expression = boolean
-
-boolean = nor
-
-nor = lhs:or _ 'nor'i _ rhs:nor {
-	return { 'binary' : { op: 'nor', lhs: lhs, rhs: rhs } } }
-	/ or
-
-or = lhs:and _ 'or'i _ rhs:or {
-	return { 'binary': {
-        op: 'or',
-        lhs: lhs,
-        rhs: rhs
-    } }
- }
- /and
-
-and = lhs:equality_check _ 'and'i _ rhs:and {
-	return { 'binary': {
-        op: 'and',
-        lhs: lhs,
-        rhs: rhs
-    } }
- }
- /
- equality_check
-
-eq = isnt { return 'ne' }
-   / is   { return 'eq' }
-
-equality_check = lhs:not c:eq rhs:equality_check
-	{
-      return {
-          comparison: {
-              comparator: c,
-                lhs: lhs,
-                rhs: rhs
-            }
-        };
-    }
-	/
-    not
-
- not = 'not'i _ e:not { return { 'not': { expression: e} } }
- 	/ comparison
-
-comparison = lhs:arithmetic c:comparator rhs:comparison
-  {
-      return {
-          comparison: {
-              comparator: c,
-                lhs: lhs,
-                rhs: rhs
-            }
-        };
-    }
-    /
-    arithmetic
-
-greater = ('higher'i / 'greater'i / 'bigger'i / 'stronger'i)
-smaller = ('lower'i / 'less'i / 'smaller'i / 'weaker'i)
-great   = ('high'i / 'great'i / 'big'i / 'strong'i)
-small   = ('low'i / 'little'i / 'small'i / 'weak'i)
-
-comparator 	= is greater _ 'than'i     _ { return 'gt' }
-            / is smaller _ 'than'i     _ { return 'lt' }
-            / is 'as'i _ great _ 'as'i _ { return 'ge' }
-            / is 'as'i _ small _ 'as'i _ { return 'le' }
-
-
-arithmetic         = first:product_simple rest:((add / subtract) product_expression_list)+
-                { return rest.reduce(function(memo, curr) {
-                      return { binary: { op: curr[0], lhs: memo, rhs: curr[1]} };
-                }, first); }
-            / product_simple
-
-product     = first:simple_expression rest:((multiply / divide) expression_list)+
-                { return rest.reduce(function(memo, curr) {
-                    return { binary: { op: curr[0], lhs: memo, rhs: curr[1]} };
-                }, first); }
-
-product_simple = product / simple_expression
-
-product_expression_list = product / expression_list
-
-// Note that operator aliases explicitly include a trailing space,
-// otherwise 'with' is a prefix code for 'without' and confuses the parser.
-add 		= _* ('+' / 'plus 'i / 'with 'i) _*       { return '+' }
-subtract 	= _* ('-' / 'minus 'i / 'without 'i) _*   { return '-' }
-multiply 	= _* ('*' / 'times 'i / 'of 'i) _*        { return '*' }
-divide 		= _* ('/' / 'over 'i / 'between 'i) _*    { return '/' }
-
-compoundable_operator = add / subtract / multiply / divide
-
-pronoun = pronoun:(
-    'they'i / 'them'i
-    / 'she'i / 'him'i / 'her'i / 'hir'i / 'zie'i / 'zir'i / 'xem'i / 'ver'i
-    / 'ze'i / 've'i / 'xe'i / 'it'i / 'he'i
-    ) &(is / _ / EOL / EOF)
-    { return { pronoun: pronoun.toLowerCase() } }
-
-common_prefix = ( 'an'i / 'a'i / 'the'i / 'my'i / 'your'i / 'our'i)
-
-uppercase_letter = [A-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJĴĶĸĹĻĽĿŁŃŅŇŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ]
-lowercase_letter = [a-zàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňŋōŏőœŕŗřśŝşšţťŧũūŭůűųŵŷÿźżžʼnß]
-
-letter = uppercase_letter / lowercase_letter
-
-common_variable = prefix:common_prefix _ name:$(letter+)
-        { return (prefix + '_' + name).toLowerCase() };
-
-is = ("'s"i / "'re"i / _ ('=' / 'is'i / 'was'i / 'are'i / 'were'i)) _
-
-isnt = _ (
-  'isnt'i   / "isn't"i   /
-  'aint'i   / "ain't"i   /
-  'arent'i  / "aren't"i  /
-  'wasnt'i  / "wasn't"i  /
-  'werent'i / "weren't"i
-  ) _
-
-push  = ('rock'i / 'push'i )
-pop   = ('roll'i / 'pop'i)
-into  = _ ('into'i / 'in'i) _
-
-delist = pop _ v:variable
-  { return { delist: { variable: v } }; }
-
-lookup
-  = d:delist { return d; }
-  / v:variable _ 'at'i _ i:expression
-    { return { lookup: { variable: v, index: i } }; }
-  / v:variable
-    { return { lookup: { variable: v } }; }
-
-indexer = _ 'at'i _ i:expression { return i };
-
-assignable
-  = v:variable i:indexer?
-    { return { variable: v, index: i }; }
-
-assignment = target:assignable is _* e:(literal / poetic_number)
-    { return { assign: { target: target, expression: e} }; }
-
-  / target:assignable _ ('says 'i / 'say 'i / 'said 'i) e:poetic_string
-    { return { assign: { target: target, expression: e} }; }
-
-  / 'put'i _ e:expression into target:assignable
-    { return { assign: { target: target, expression: e} }; }
-
-
-  / 'let'i _ target:assignable _ 'be'i o:compoundable_operator e:(expression_list / expression) {
-      return { assign: {
-        target: target,
-        expression: { binary: {  op: o, lhs: { lookup: target }, rhs: e } }
-      } };
-    }
-
-  / 'let'i _ t:assignable _ 'be'i _ e:expression
-    { return { assign: { target: t, expression: e} }; }
-
-  / push _ e:expression into v:variable
-    { return { enlist: { variable: v, expression: e } }; }
-
-  / push _ v:variable _ 'like'i _ e:(literal / poetic_number)
-    { return { enlist: { variable: v, expression: e } }; }
-
-  / push _ v:variable (_ 'with'i)? _ e:(expression_list / expression)
-    { return { enlist: { variable: v, expression: e } }; }
-
-  / push _ v:variable
-    { return { enlist: { variable: v } }; }
-
-  / e:delist into target:assignable
-    { return { assign: { target: target, expression: e } }; }
-
-poetic_string = s:$[^\r\n]*
-  { return { string: s} }
-
-poetic_number = poetic_digit_separator* n:poetic_digits poetic_digit_separator* d:poetic_decimal? poetic_digit_separator*
-
-  { return { number: parseFloat(d?n+'.'+d:n)}}
-
-poetic_decimal = '.' poetic_decimal_digit_separator* d:poetic_decimal_digits poetic_decimal_digit_separator* {return d}
-        /
-                '.' poetic_decimal_digit_separator*
-
-poetic_digit_separator = ( _ / [0-9\',;:?!+_/] )
-
-poetic_digits =
-  poetic_digit_separator* head:poetic_digit poetic_digit_separator+ tail:poetic_digits
-      { return head + tail }
-  /
-    d: poetic_digit
-      { return d }
-
-poetic_decimal_digit_separator = ( _ / poetic_digit_separator / '.')
-poetic_decimal_digits =
-  poetic_decimal_digit_separator* head:poetic_digit poetic_decimal_digit_separator+ tail:poetic_decimal_digits
-      { return head + tail }
-  /
-    d: poetic_digit
-      { return d }
-
-poetic_digit = t:[A-Za-z\-']+
-  { return (t.filter(c => /[A-Za-z\-]/.test(c)).length%10).toString()}
-
-variable = common_variable / proper_variable / pronoun / simple_variable
-
-simple_variable = name:$(letter letter*) !{ return isKeyword(name) } { return name.toLowerCase() }
-
-proper_noun = noun:$(uppercase_letter letter*) !{ return isKeyword(noun) } { return noun }
-
-proper_variable = head:$(proper_noun (' ' $proper_noun)*)
-  { return head.replace(/ /g, '_').toLowerCase()  }
-
-crement = increment / decrement
-
-increment = 'build'i _ v:variable _ t:('up'i noise*)+
-  { return {
-      increment: {
-          variable: v,
-            multiple: t.length
-        }
-    }; }
-
-decrement = 'knock'i _ v:variable _ t:('down'i noise*)+
-  { return {
-      decrement: {
-          variable: v,
-            multiple: t.length
-        }
-    }; }
-
-
-split = ('cut'i / 'split'i / 'shatter'i) { return 'split' }
-cast = ('cast'i / 'burn'i) { return 'cast' }
-join = ('join'i / 'unite'i) { return 'join' }
-
-mutator = split / cast / join
-modifier =  _ ('with'i / 'using'i) _ m:expression { return m }
-
-mutation
-    = op:mutator _ s:expression into t:assignable m:modifier?
-        { return { assign: { target: t, expression: { mutation: { type: op, source: s, modifier: m } } } } ; }
-	/ op:mutator _ s:assignable m:modifier?
-        { return { assign: { target: s, expression: { mutation: { type: op, source: { lookup: s }, modifier: m } } } } ; }
-
-rounding = floor / ceil / math_round
-
-floor
-  = 'turn'i _ v:variable _ 'down'i
-    { return { rounding: { variable: v, direction: 'down'  } }; }
-  / 'turn'i _ 'down'i _ v:variable
-    { return { rounding: { variable: v, direction: 'down'  } }; }
-
-ceil
-  = 'turn'i _ v:variable _ 'up'i
-    { return { rounding: { variable: v, direction: 'up'  } }; }
-  / 'turn'i _ 'up'i _ v:variable
-    { return { rounding: { variable: v, direction: 'up' } }; }
-
-math_round
-  = 'turn'i _ v:variable _ ('round'i/'around'i)
-    { return { rounding: { variable: v, direction: 'nearest' } }; }
-  / 'turn'i _ ('round'i/'around'i) _ v:variable
-    { return { rounding: { variable: v, direction: 'nearest' } }; }
\ No newline at end of file
diff --git a/satriani/satriani.interpreter.js b/satriani/satriani.interpreter.js
deleted file mode 100644
index abb498b4..00000000
--- a/satriani/satriani.interpreter.js
+++ /dev/null
@@ -1,440 +0,0 @@
-module.exports = {
-    Environment: Environment,
-    eq: eq
-}
-
-const MYSTERIOUS = '__MYSTERIOUS__';
-
-function Environment(parent) {
-    this.vars = Object.create(parent ? parent.vars : null);
-    this.parent = parent;
-    this.output = (parent && parent.output ? parent.output : console.log);
-    // Because nodeJS is based on asynchronous IO, there is no built-in console.readline or similar
-    // so by default, any input will yield an empty string.
-    this.input = (parent && parent.input ? parent.input : () => "")
-}
-
-Environment.prototype = {
-    extend: function () { return new Environment(this) },
-
-    exists: function (name) {
-        return (name in this.vars);
-    },
-
-    lookup: function (name, index) {
-        if (name in this.vars == false) {
-            throw new Error("Undefined variable " + name);
-        }
-        let variable = this.vars[name];
-        if (Array.isArray(variable)) {
-            if (typeof (index) == 'undefined' || index == null) {
-                return variable;
-            }
-            return variable[index];
-        }
-        if (typeof (variable) == 'string' && typeof (index) == 'number') {
-            return (variable[index]);
-        }
-        return variable;
-    },
-
-    assign: function (name, value, index, local) {
-        let container = (!local && typeof (value) != "function" && this.parent && name in this.parent.vars) ? this.parent.vars : this.vars;
-        if (typeof (index) == 'undefined' || index == null) return container[name] = value;
-        if (name in container) {
-            if (!Array.isArray(container[name])) throw new Error(`Can't assign ${name} at ${index} - ${name} is not an indexed variable.`);
-        } else {
-            container[name] = new Array();
-        }
-        return container[name][index] = value;
-    },
-
-    run: function (program) {
-        let result = evaluate(program, this);
-        return (result ? result.value : undefined);
-    },
-
-    dealias: function (expr) {
-        if (expr.variable.pronoun) return this.pronoun_alias;
-        return (expr.variable);
-    },
-
-    pronoun_alias: null,
-}
-
-function toScalar(value) {
-    if (Array.isArray(value)) {
-        return value.length;
-    }
-    return value;
-}
-
-function evaluate(tree, env) {
-    if (tree == MYSTERIOUS || typeof (tree) == 'undefined') return undefined;
-    if (tree == null) return null;
-    let list = Object.entries(tree)
-    for (let i = 0; i < list.length; i++) {
-        let node = list[i];
-        let type = node[0];
-        let expr = node[1];
-        switch (type) {
-            case "action": return (tree);
-            case "list":
-                let result = null;
-                for (let i = 0; i < expr.length; i++) {
-                    let next = expr[i];
-                    result = evaluate(next, env);
-                    if (result && result.action) return (result);
-                }
-                return result;
-            case "conditional":
-                if (toScalar(evaluate(expr.condition, env))) {
-                    return evaluate(expr.consequent, env);
-                } else if (expr.alternate) {
-                    return evaluate(expr.alternate, env);
-                }
-                return;
-            case 'break':
-                return { 'action': 'break' };
-            case 'continue':
-                return { 'action': 'continue' };
-            case "return":
-                return { 'action': 'return', 'value': evaluate(expr.expression, env) };
-            case "number":
-            case "string":
-            case "constant":
-                return (expr);
-            case "output":
-                let printable = toScalar(evaluate(expr, env));
-                if (typeof (printable) == 'undefined') printable = "mysterious";
-                env.output(printable);
-                return;
-            case "listen":
-                return env.input();
-            case "binary":
-                return binary(expr, env);
-            case "lookup":
-                return lookup(expr, env);
-            case "assign":
-                return assign(expr, env);
-            case "pronoun":
-                return env.lookup(env.pronoun_alias);
-            case "blank":
-                return;
-            case "rounding":
-                return rounding(expr, env);
-            case "mutation":
-                return mutation(expr, env);
-            case "increment":
-                let increment_name = env.dealias(expr);
-                let old_increment_value = env.lookup(increment_name);
-                switch (typeof (old_increment_value)) {
-                    case "boolean":
-                        if (expr.multiple % 2 != 0) env.assign(increment_name, !old_increment_value);
-                        return;
-                    default:
-                        env.assign(increment_name, (old_increment_value + expr.multiple));
-                        return;
-                }
-            case "decrement":
-                let decrement_name = env.dealias(expr);
-                let old_decrement_value = env.lookup(decrement_name);
-                switch (typeof (old_decrement_value)) {
-                    case "boolean":
-                        if (expr.multiple % 2 != 0) env.assign(decrement_name, !old_decrement_value);
-                        return;
-                    default:
-                        env.assign(decrement_name, (old_decrement_value - expr.multiple));
-                        return;
-                }
-            case "while_loop":
-                while_outer: while (toScalar(evaluate(expr.condition, env))) {
-                    let result = evaluate(expr.consequent, env);
-                    if (result) switch (result.action) {
-                        case 'continue':
-                            continue while_outer;
-                        case 'break':
-                            break while_outer;
-                        case 'return':
-                            return (result);
-                    }
-                }
-                return;
-            case "until_loop":
-                until_outer: while (!toScalar(evaluate(expr.condition, env))) {
-                    let result = evaluate(expr.consequent, env);
-                    if (result) switch (result.action) {
-                        case 'continue':
-                            continue until_outer;
-                        case 'break':
-                            break until_outer;
-                        case 'return':
-                            return (result);
-                    }
-                }
-                return;
-            case "comparison":
-                let lhs = evaluate(expr.lhs, env);
-                let rhs = evaluate(expr.rhs, env);
-                switch (expr.comparator) {
-                    case "eq":
-                        return eq(lhs, rhs);
-                    case "ne":
-                        return !eq(lhs, rhs);
-                    case "lt":
-                        return (toScalar(lhs) < toScalar(rhs));
-                    case "le":
-                        return (toScalar(lhs) <= toScalar(rhs));
-                    case "ge":
-                        return (toScalar(lhs) >= toScalar(rhs));
-                    case "gt":
-                        return (toScalar(lhs) > toScalar(rhs));
-                    default:
-                        throw new Error(`Unknown comparison operator ${expr.comparator}`);
-                }
-            case "not":
-                return (!toScalar(evaluate(expr.expression, env)));
-            case "function":
-                env.assign(expr.name, make_lambda(expr, env));
-                return;
-            case "call":
-                let func = env.lookup(expr.name);
-                let func_result = func.apply(null, expr.args.map(arg => {
-                    let value =  evaluate(arg, env);
-                    // If the arg is an array, we shallow-copy it when passing it to a function call
-                    return (value && value.map ? value.map(e => e) : value);                
-                }));
-                return (func_result ? func_result.value : undefined);
-            case "enlist":
-                return enlist(expr, env);
-            case "delist":
-                return delist(expr, env);
-            default:
-                if (Array.isArray(tree) && tree.length == 1) return (evaluate(tree[0], env));
-                throw new Error("Sorry - I don't know how to evaluate this: " + JSON.stringify(tree))
-        }
-    }
-}
-
-function mutation(expr, env) {
-    let source = evaluate(expr.source, env);
-    let modifier = evaluate(expr.modifier, env);
-    switch (expr.type) {
-        case "split":
-            return source.toString().split(modifier || "");
-        case "cast":
-            if (typeof (source) == 'string') return parseInt(source, modifier);
-            if (typeof (source) == 'number') return String.fromCharCode(source);
-            if (Array.isArray(source)) return String.fromCharCode(toScalar(source));
-            throw new Error(`I don't know how to cast ${source}`);
-        case "join":
-            if (Array.isArray(source)) {
-                let joiner = (typeof (modifier) == 'undefined' || modifier == null) ? '' : modifier;
-                return source.join(joiner);
-            }
-            throw new Error("I don't know how to join that.");
-    }
-}
-
-function lookup(expr, env) {
-    let lookup_name = env.dealias(expr);
-    let index = evaluate(expr.index, env);
-    return env.lookup(lookup_name, index);
-}
-
-function assign(expr, env) {
-    let target = expr.target;
-    let index = evaluate(target.index, env);
-    let alias = (target.variable.pronoun ? env.pronoun_alias : target.variable);
-    let value = evaluate(expr.expression, env);
-    env.assign(alias, value, index);
-    if (!target.variable.pronoun) env.pronoun_alias = alias;
-    return value;
-}
-
-function enlist(expr, env) {
-
-    let array_value;
-    let array_name = env.dealias(expr);
-
-    if (env.exists(array_name)) {
-        array_value = env.lookup(array_name, null, true);
-        if (!Array.isArray(array_value)) array_value = [array_value];
-    } else {
-        array_value = [];
-    }
-    if (expr.expression) {
-        let elements_to_enlist = (expr.expression.map ? expr.expression : [expr.expression]);
-        array_value = array_value.concat(elements_to_enlist.map(e => evaluate(e, env)));
-    }
-    env.assign(array_name, array_value);
-    return array_value;
-
-    // let alias = "";
-    // let target = expr.target;
-    // let index = evaluate(target.index, env);
-    // if (target.variable.pronoun) {
-    //     alias = env.pronoun_alias;
-    // } else {
-    //     alias = target.variable;
-    //     env.pronoun_alias = alias;
-    // }
-
-    // let value;
-    // if (env.exists(alias)) {
-    //     value = env.lookup(alias);
-    //     if (!Array.isArray(value)) value = [value];
-    // } else {
-    //     value = [];
-    // }
-    // if (expr.expression) {
-    //     let values = (expr.expression.map ? expr.expression : [expr.expression]);
-    //     value = value.concat(values.map(e => evaluate(e, env)));
-    // }
-    // env.assign(alias, value, index);
-    // return value;
-}
-
-function delist(expr, env) {
-    let name = env.dealias(expr);
-    let source = env.lookup(name, null)
-    let result = (source.shift && source.shift());
-    return result;
-}
-
-function rounding(expr, env) {
-    let variable_name = env.dealias(expr);
-    let variable_value = env.lookup(variable_name);
-    switch (expr.direction) {
-        case "up":
-            return env.assign(variable_name, Math.ceil(variable_value));
-        case "down":
-            return env.assign(variable_name, Math.floor(variable_value));
-        default:
-            return env.assign(variable_name, Math.round(variable_value));
-    }
-}
-
-function demystify(expr, env) {
-    let result = evaluate(expr, env);
-    if (typeof (result) == 'undefined') return ('mysterious');
-    return (result);
-}
-
-function eq(lhs, rhs) {
-    if (Array.isArray(lhs)) return (eq_array(lhs, rhs));
-    if (Array.isArray(rhs)) return (eq_array(rhs, lhs));
-
-    if (is_nothing(lhs) && is_nothing(rhs)) return (true);
-    // if (typeof (lhs) == 'undefined') return (typeof (rhs) == 'undefined');
-    // if (typeof (rhs) == 'undefined') return (typeof (lhs) == 'undefined');
-
-    if (typeof (lhs) == 'boolean') return (eq_boolean(lhs, rhs));
-    if (typeof (rhs) == 'boolean') return (eq_boolean(rhs, lhs));
-
-    if (typeof (lhs) == 'number') return (eq_number(lhs, rhs));
-    if (typeof (rhs) == 'number') return (eq_number(rhs, lhs));
-
-    if (typeof (lhs) == 'string') return (eq_string(lhs, rhs));
-    if (typeof (rhs) == 'string') return (eq_string(rhs, lhs));
-
-    return lhs == rhs;
-}
-
-function is_nothing(thing) {
-    return (
-        typeof (thing) == 'undefined'
-        ||
-        thing === null
-        ||
-        thing === ""
-        ||
-        thing == 0
-        ||
-        thing == false
-    );
-}
-
-function eq_array(array, other) {
-    if (Array.isArray(other)) return ((array.length == other.length) && array.every((el, ix) => eq(el, other[ix])));
-    if (other == null || other == 0 || other == "") return (array.length == 0);
-    return (false);
-}
-
-function eq_string(string, other) {
-    if (other == null || typeof (other) == 'undefined') return (string === "");
-    return (other == string);
-}
-
-function eq_number(number, other) {
-    if (other == null || typeof (other) == 'undefined') return (number === 0);
-    return (other == number);
-}
-
-function eq_boolean(bool, other) {
-    // false equals null in Rockstar
-    if (other == null) other = false;
-    // false equals zero in Rockstar
-    if (typeof (other) == 'number') other = (other !== 0);
-    if (typeof (other) == 'string') other = (other !== "");
-    return (bool == other);
-}
-
-function make_lambda(expr, env) {
-    function lambda() {
-        let names = expr.args;
-        if (names.length != arguments.length) throw ('Wrong number of arguments supplied to function ' + expr.name + ' (' + expr.args + ')');
-        let scope = env.extend();
-        for (let i = 0; i < names.length; ++i) scope.assign(names[i], arguments[i], null, 1)
-        return evaluate(expr.body, scope);
-    }
-
-    return lambda;
-}
-
-function binary(b, env) {
-    switch (b.op) {
-        case "and": return (toScalar(evaluate(b.lhs, env)) && toScalar(evaluate(b.rhs, env)));
-        case "nor": return (!toScalar(evaluate(b.lhs, env)) && !toScalar(evaluate(b.rhs, env)));
-        case "or": return (toScalar(evaluate(b.lhs, env)) || toScalar(evaluate(b.rhs, env)));
-        case '+': return add(b.lhs, b.rhs, env);
-        case '-': return subtract(b.lhs, b.rhs, env);
-        case '/': return divide(b.lhs, b.rhs, env);
-        case '*': return multiply(b.lhs, b.rhs, env);
-    }
-}
-
-function add(lhs, rhs, env) {
-    return (rhs.reduce ? rhs : [rhs]).reduce((acc, val) => acc += toScalar(demystify(val, env)), toScalar(demystify(lhs, env)));
-}
-
-function subtract(lhs, rhs, env) {
-    return (rhs.reduce ? rhs : [rhs]).reduce((acc, val) => acc -= toScalar(evaluate(val, env)), toScalar(evaluate(lhs, env)));
-}
-
-function divide(lhs, rhs, env) {
-    return (rhs.reduce ? rhs : [rhs]).reduce((acc, val) => acc /= toScalar(evaluate(val, env)), toScalar(evaluate(lhs, env)));
-}
-
-function multiply(lhs, rhs, env) {
-    return (rhs.reduce ? rhs : [rhs])
-        .map(expr => toScalar(evaluate(expr, env)))
-        .reduce(multiply_reduce, toScalar(evaluate(lhs, env)));
-}
-
-function multiply_reduce(acc, val, idx, src) {
-    // Null, nothing, noone, nowhere, etc. are all zero for multiplication purposes.
-    if (acc == null) acc = 0;
-    if (val == null) val = 0;
-    // Mu ltiplying numbers just works.
-    if (typeof (acc) == 'number' && typeof (val) == 'number') return (acc * val);
-    // Multiplying strings by numbers does repeated concatenation
-    if (typeof (acc) == 'string' && typeof (val) == 'number') return multiply_string(acc, val);
-    if (typeof (acc) == 'number' && typeof (val) == 'string') return multiply_string(val, acc);
-}
-
-function multiply_string(s, n) {
-    let result = Array();
-    while (--n >= 0) result.push(s);
-    return (result.join(''));
-}
diff --git a/satriani/satriani.js b/satriani/satriani.js
deleted file mode 100644
index 2f8ec4c3..00000000
--- a/satriani/satriani.js
+++ /dev/null
@@ -1,18 +0,0 @@
-const parser = require('./satriani.parser.js');
-const interpreter = require('./satriani.interpreter.js');
-
-module.exports = {
-    Interpreter : function() {
-        this.run = function(program, input, output) {
-            if (typeof(program) == 'string') program = this.parse(program);
-            let env = new interpreter.Environment();
-            env.output = output || console.log;
-            env.input = input || (() => "");
-            return env.run(program);
-        }
-
-        this.parse = function(program) {
-            return parser.parse(program);
-        }
-    }
-};
diff --git a/satriani/satriani.parser.cache.js b/satriani/satriani.parser.cache.js
deleted file mode 100644
index 36f28426..00000000
--- a/satriani/satriani.parser.cache.js
+++ /dev/null
@@ -1,6952 +0,0 @@
-/*
- * Generated by PEG.js 0.10.0.
- *
- * http://pegjs.org/
- */
-
-"use strict";
-
-function peg$subclass(child, parent) {
-  function ctor() { this.constructor = child; }
-  ctor.prototype = parent.prototype;
-  child.prototype = new ctor();
-}
-
-function peg$SyntaxError(message, expected, found, location) {
-  this.message  = message;
-  this.expected = expected;
-  this.found    = found;
-  this.location = location;
-  this.name     = "SyntaxError";
-
-  if (typeof Error.captureStackTrace === "function") {
-    Error.captureStackTrace(this, peg$SyntaxError);
-  }
-}
-
-peg$subclass(peg$SyntaxError, Error);
-
-peg$SyntaxError.buildMessage = function(expected, found) {
-  var DESCRIBE_EXPECTATION_FNS = {
-        literal: function(expectation) {
-          return "\"" + literalEscape(expectation.text) + "\"";
-        },
-
-        "class": function(expectation) {
-          var escapedParts = "",
-              i;
-
-          for (i = 0; i < expectation.parts.length; i++) {
-            escapedParts += expectation.parts[i] instanceof Array
-              ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])
-              : classEscape(expectation.parts[i]);
-          }
-
-          return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
-        },
-
-        any: function(expectation) {
-          return "any character";
-        },
-
-        end: function(expectation) {
-          return "end of input";
-        },
-
-        other: function(expectation) {
-          return expectation.description;
-        }
-      };
-
-  function hex(ch) {
-    return ch.charCodeAt(0).toString(16).toUpperCase();
-  }
-
-  function literalEscape(s) {
-    return s
-      .replace(/\\/g, '\\\\')
-      .replace(/"/g,  '\\"')
-      .replace(/\0/g, '\\0')
-      .replace(/\t/g, '\\t')
-      .replace(/\n/g, '\\n')
-      .replace(/\r/g, '\\r')
-      .replace(/[\x00-\x0F]/g,          function(ch) { return '\\x0' + hex(ch); })
-      .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x'  + hex(ch); });
-  }
-
-  function classEscape(s) {
-    return s
-      .replace(/\\/g, '\\\\')
-      .replace(/\]/g, '\\]')
-      .replace(/\^/g, '\\^')
-      .replace(/-/g,  '\\-')
-      .replace(/\0/g, '\\0')
-      .replace(/\t/g, '\\t')
-      .replace(/\n/g, '\\n')
-      .replace(/\r/g, '\\r')
-      .replace(/[\x00-\x0F]/g,          function(ch) { return '\\x0' + hex(ch); })
-      .replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return '\\x'  + hex(ch); });
-  }
-
-  function describeExpectation(expectation) {
-    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
-  }
-
-  function describeExpected(expected) {
-    var descriptions = new Array(expected.length),
-        i, j;
-
-    for (i = 0; i < expected.length; i++) {
-      descriptions[i] = describeExpectation(expected[i]);
-    }
-
-    descriptions.sort();
-
-    if (descriptions.length > 0) {
-      for (i = 1, j = 1; i < descriptions.length; i++) {
-        if (descriptions[i - 1] !== descriptions[i]) {
-          descriptions[j] = descriptions[i];
-          j++;
-        }
-      }
-      descriptions.length = j;
-    }
-
-    switch (descriptions.length) {
-      case 1:
-        return descriptions[0];
-
-      case 2:
-        return descriptions[0] + " or " + descriptions[1];
-
-      default:
-        return descriptions.slice(0, -1).join(", ")
-          + ", or "
-          + descriptions[descriptions.length - 1];
-    }
-  }
-
-  function describeFound(found) {
-    return found ? "\"" + literalEscape(found) + "\"" : "end of input";
-  }
-
-  return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
-};
-
-function peg$parse(input, options) {
-  options = options !== void 0 ? options : {};
-
-  var peg$FAILED = {},
-
-      peg$startRuleFunctions = { program: peg$parseprogram },
-      peg$startRuleFunction  = peg$parseprogram,
-
-      peg$c0 = function(p) { return { list: p.filter(item => item) } },
-      peg$c1 = function(s) { return s },
-      peg$c2 = function() { return null },
-      peg$c3 = /^[ \t]/,
-      peg$c4 = peg$classExpectation([" ", "\t"], false, false),
-      peg$c5 = "(",
-      peg$c6 = peg$literalExpectation("(", false),
-      peg$c7 = /^[^)]/,
-      peg$c8 = peg$classExpectation([")"], true, false),
-      peg$c9 = ")",
-      peg$c10 = peg$literalExpectation(")", false),
-      peg$c11 = /^[;,?!&.]/,
-      peg$c12 = peg$classExpectation([";", ",", "?", "!", "&", "."], false, false),
-      peg$c13 = "\n",
-      peg$c14 = peg$literalExpectation("\n", false),
-      peg$c15 = peg$anyExpectation(),
-      peg$c16 = /^[^\n]/,
-      peg$c17 = peg$classExpectation(["\n"], true, false),
-      peg$c18 = "break",
-      peg$c19 = peg$literalExpectation("break", true),
-      peg$c20 = function() {
-      	return { 'break' : {} }
-      },
-      peg$c21 = "continue",
-      peg$c22 = peg$literalExpectation("continue", true),
-      peg$c23 = "take it to the top",
-      peg$c24 = peg$literalExpectation("take it to the top", true),
-      peg$c25 = function() {
-      	return { 'continue' : {} }
-      },
-      peg$c26 = "takes",
-      peg$c27 = peg$literalExpectation("takes", true),
-      peg$c28 = function(name, args, body) { return { 'function': {
-          	name: name,
-              args: args.map(arg => arg),
-              body: body
-          } } },
-      peg$c29 = ", and",
-      peg$c30 = peg$literalExpectation(", and", false),
-      peg$c31 = "&",
-      peg$c32 = peg$literalExpectation("&", false),
-      peg$c33 = ",",
-      peg$c34 = peg$literalExpectation(",", false),
-      peg$c35 = "'n'",
-      peg$c36 = peg$literalExpectation("'n'", false),
-      peg$c37 = "and",
-      peg$c38 = peg$literalExpectation("and", false),
-      peg$c39 = function(head, tail) { return [head].concat(tail) },
-      peg$c40 = function(arg) { return [arg] },
-      peg$c41 = "taking",
-      peg$c42 = peg$literalExpectation("taking", true),
-      peg$c43 = function(name, args) { return { 'call': { name: name, args: Array.isArray(args) ? args : [args] } } },
-      peg$c44 = function(arg) { return arg },
-      peg$c45 = "return",
-      peg$c46 = peg$literalExpectation("return", true),
-      peg$c47 = "give back",
-      peg$c48 = peg$literalExpectation("give back", true),
-      peg$c49 = function(e) { return { 'return': { 'expression' : e } } },
-      peg$c50 = "listen to",
-      peg$c51 = peg$literalExpectation("listen to", true),
-      peg$c52 = function(target) { return { assign: { expression: { listen : ''}, target: target } } },
-      peg$c53 = "listen",
-      peg$c54 = peg$literalExpectation("listen", true),
-      peg$c55 = function() { return { 'listen' : ''} },
-      peg$c56 = function(head, tail) {
-                return { list : [head].concat(tail) }
-              },
-      peg$c57 = "else",
-      peg$c58 = peg$literalExpectation("else", true),
-      peg$c59 = function(a) { return a },
-      peg$c60 = "if",
-      peg$c61 = peg$literalExpectation("if", true),
-      peg$c62 = function(e, c, a) {
-                return {
-                    'conditional': {
-                        'condition' : e,
-                          'consequent' : c,
-                          'alternate' : a
-                      }
-                  };
-              },
-      peg$c63 = "while",
-      peg$c64 = peg$literalExpectation("while", true),
-      peg$c65 = function(e, c) { return { 'while_loop': {
-                  'condition': e,
-                  'consequent': c
-               } }; },
-      peg$c66 = "until",
-      peg$c67 = peg$literalExpectation("until", true),
-      peg$c68 = function(e, c) { return { 'until_loop': {
-                  'condition': e,
-                  'consequent': c
-               } }; },
-      peg$c69 = "say",
-      peg$c70 = peg$literalExpectation("say", true),
-      peg$c71 = "shout",
-      peg$c72 = peg$literalExpectation("shout", true),
-      peg$c73 = "whisper",
-      peg$c74 = peg$literalExpectation("whisper", true),
-      peg$c75 = "scream",
-      peg$c76 = peg$literalExpectation("scream", true),
-      peg$c77 = function(e) {return {'output': e}},
-      peg$c78 = "true",
-      peg$c79 = peg$literalExpectation("true", true),
-      peg$c80 = "ok",
-      peg$c81 = peg$literalExpectation("ok", true),
-      peg$c82 = "right",
-      peg$c83 = peg$literalExpectation("right", true),
-      peg$c84 = "yes",
-      peg$c85 = peg$literalExpectation("yes", true),
-      peg$c86 = function() { return { constant: true } },
-      peg$c87 = "false",
-      peg$c88 = peg$literalExpectation("false", true),
-      peg$c89 = "lies",
-      peg$c90 = peg$literalExpectation("lies", true),
-      peg$c91 = "wrong",
-      peg$c92 = peg$literalExpectation("wrong", true),
-      peg$c93 = "no",
-      peg$c94 = peg$literalExpectation("no", true),
-      peg$c95 = function() { return { constant: false } },
-      peg$c96 = "null",
-      peg$c97 = peg$literalExpectation("null", true),
-      peg$c98 = "nothing",
-      peg$c99 = peg$literalExpectation("nothing", true),
-      peg$c100 = "nowhere",
-      peg$c101 = peg$literalExpectation("nowhere", true),
-      peg$c102 = "nobody",
-      peg$c103 = peg$literalExpectation("nobody", true),
-      peg$c104 = "empty",
-      peg$c105 = peg$literalExpectation("empty", true),
-      peg$c106 = "gone",
-      peg$c107 = peg$literalExpectation("gone", true),
-      peg$c108 = function() { return { constant: null } },
-      peg$c109 = "mysterious",
-      peg$c110 = peg$literalExpectation("mysterious", false),
-      peg$c111 = function() { return '__MYSTERIOUS__' },
-      peg$c112 = "-",
-      peg$c113 = peg$literalExpectation("-", false),
-      peg$c114 = /^[0-9]/,
-      peg$c115 = peg$classExpectation([["0", "9"]], false, false),
-      peg$c116 = ".",
-      peg$c117 = peg$literalExpectation(".", false),
-      peg$c118 = function(n) { return {number: parseFloat(n)} },
-      peg$c119 = function(n) { return {number: parseFloat(n) } },
-      peg$c120 = "\"",
-      peg$c121 = peg$literalExpectation("\"", false),
-      peg$c122 = /^[^"]/,
-      peg$c123 = peg$classExpectation(["\""], true, false),
-      peg$c124 = function(s) { return {string: s}},
-      peg$c125 = "nor",
-      peg$c126 = peg$literalExpectation("nor", false),
-      peg$c127 = function(lhs, rhs) {
-      	return { 'binary' : { op: 'nor', lhs: lhs, rhs: rhs } } },
-      peg$c128 = "or",
-      peg$c129 = peg$literalExpectation("or", false),
-      peg$c130 = function(lhs, rhs) {
-      	return { 'binary': {
-              op: 'or',
-              lhs: lhs,
-              rhs: rhs
-          } }
-       },
-      peg$c131 = function(lhs, rhs) {
-      	return { 'binary': {
-              op: 'and',
-              lhs: lhs,
-              rhs: rhs
-          } }
-       },
-      peg$c132 = "aint",
-      peg$c133 = peg$literalExpectation("aint", true),
-      peg$c134 = "ain't",
-      peg$c135 = peg$literalExpectation("ain't", true),
-      peg$c136 = function() { return 'ne' },
-      peg$c137 = "is",
-      peg$c138 = peg$literalExpectation("is", true),
-      peg$c139 = function() { return 'eq' },
-      peg$c140 = function(lhs, c, rhs) {
-            return {
-                comparison: {
-                    comparator: c,
-                      lhs: lhs,
-                      rhs: rhs
-                  }
-              };
-          },
-      peg$c141 = "not",
-      peg$c142 = peg$literalExpectation("not", false),
-      peg$c143 = function(e) { return { 'not': { expression: e} } },
-      peg$c144 = "higher",
-      peg$c145 = peg$literalExpectation("higher", true),
-      peg$c146 = "greater",
-      peg$c147 = peg$literalExpectation("greater", true),
-      peg$c148 = "bigger",
-      peg$c149 = peg$literalExpectation("bigger", true),
-      peg$c150 = "stronger",
-      peg$c151 = peg$literalExpectation("stronger", true),
-      peg$c152 = "lower",
-      peg$c153 = peg$literalExpectation("lower", true),
-      peg$c154 = "less",
-      peg$c155 = peg$literalExpectation("less", true),
-      peg$c156 = "smaller",
-      peg$c157 = peg$literalExpectation("smaller", true),
-      peg$c158 = "weaker",
-      peg$c159 = peg$literalExpectation("weaker", true),
-      peg$c160 = "high",
-      peg$c161 = peg$literalExpectation("high", true),
-      peg$c162 = "great",
-      peg$c163 = peg$literalExpectation("great", true),
-      peg$c164 = "big",
-      peg$c165 = peg$literalExpectation("big", true),
-      peg$c166 = "strong",
-      peg$c167 = peg$literalExpectation("strong", true),
-      peg$c168 = "low",
-      peg$c169 = peg$literalExpectation("low", true),
-      peg$c170 = "small",
-      peg$c171 = peg$literalExpectation("small", true),
-      peg$c172 = "weak",
-      peg$c173 = peg$literalExpectation("weak", true),
-      peg$c174 = "than",
-      peg$c175 = peg$literalExpectation("than", true),
-      peg$c176 = function() { return 'gt' },
-      peg$c177 = function() { return 'lt' },
-      peg$c178 = "as",
-      peg$c179 = peg$literalExpectation("as", true),
-      peg$c180 = function() { return 'ge' },
-      peg$c181 = function() { return 'le' },
-      peg$c182 = function(first, rest) { return rest.reduce(function(memo, curr) {
-                            return { binary: { op: curr[0], lhs: memo, rhs: curr[1]} };
-                      }, first); },
-      peg$c183 = function(first, rest) { return rest.reduce(function(memo, curr) {
-                          return { binary: { op: curr[0], lhs: memo, rhs: curr[1]} };
-                      }, first); },
-      peg$c184 = "+",
-      peg$c185 = peg$literalExpectation("+", false),
-      peg$c186 = "plus ",
-      peg$c187 = peg$literalExpectation("plus ", false),
-      peg$c188 = "with ",
-      peg$c189 = peg$literalExpectation("with ", false),
-      peg$c190 = function() { return '+' },
-      peg$c191 = "minus ",
-      peg$c192 = peg$literalExpectation("minus ", false),
-      peg$c193 = "without ",
-      peg$c194 = peg$literalExpectation("without ", false),
-      peg$c195 = function() { return '-' },
-      peg$c196 = "*",
-      peg$c197 = peg$literalExpectation("*", false),
-      peg$c198 = "times ",
-      peg$c199 = peg$literalExpectation("times ", false),
-      peg$c200 = "of ",
-      peg$c201 = peg$literalExpectation("of ", false),
-      peg$c202 = function() { return '*' },
-      peg$c203 = "/",
-      peg$c204 = peg$literalExpectation("/", false),
-      peg$c205 = "over ",
-      peg$c206 = peg$literalExpectation("over ", false),
-      peg$c207 = "between ",
-      peg$c208 = peg$literalExpectation("between ", false),
-      peg$c209 = function() { return '/' },
-      peg$c210 = "they",
-      peg$c211 = peg$literalExpectation("they", true),
-      peg$c212 = "them",
-      peg$c213 = peg$literalExpectation("them", true),
-      peg$c214 = "she",
-      peg$c215 = peg$literalExpectation("she", true),
-      peg$c216 = "him",
-      peg$c217 = peg$literalExpectation("him", true),
-      peg$c218 = "her",
-      peg$c219 = peg$literalExpectation("her", true),
-      peg$c220 = "hir",
-      peg$c221 = peg$literalExpectation("hir", true),
-      peg$c222 = "zie",
-      peg$c223 = peg$literalExpectation("zie", true),
-      peg$c224 = "zir",
-      peg$c225 = peg$literalExpectation("zir", true),
-      peg$c226 = "xem",
-      peg$c227 = peg$literalExpectation("xem", true),
-      peg$c228 = "ver",
-      peg$c229 = peg$literalExpectation("ver", true),
-      peg$c230 = "ze",
-      peg$c231 = peg$literalExpectation("ze", true),
-      peg$c232 = "ve",
-      peg$c233 = peg$literalExpectation("ve", true),
-      peg$c234 = "xe",
-      peg$c235 = peg$literalExpectation("xe", true),
-      peg$c236 = "it",
-      peg$c237 = peg$literalExpectation("it", true),
-      peg$c238 = "he",
-      peg$c239 = peg$literalExpectation("he", true),
-      peg$c240 = function(pronoun) { return { pronoun: pronoun.toLowerCase() } },
-      peg$c241 = "at",
-      peg$c242 = peg$literalExpectation("at", true),
-      peg$c243 = function(v, i) { return { lookup: { variable: v, index: i } }; },
-      peg$c244 = function(v) { return { lookup: { variable: v } }; },
-      peg$c245 = "an",
-      peg$c246 = peg$literalExpectation("an", true),
-      peg$c247 = "a",
-      peg$c248 = peg$literalExpectation("a", true),
-      peg$c249 = "the",
-      peg$c250 = peg$literalExpectation("the", true),
-      peg$c251 = "my",
-      peg$c252 = peg$literalExpectation("my", true),
-      peg$c253 = "your",
-      peg$c254 = peg$literalExpectation("your", true),
-      peg$c255 = /^[A-Z\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0138\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178\u0179\u017B\u017D]/,
-      peg$c256 = peg$classExpectation([["A", "Z"], "\xC0", "\xC1", "\xC2", "\xC3", "\xC4", "\xC5", "\xC6", "\xC7", "\xC8", "\xC9", "\xCA", "\xCB", "\xCC", "\xCD", "\xCE", "\xCF", "\xD0", "\xD1", "\xD2", "\xD3", "\xD4", "\xD5", "\xD6", "\xD8", "\xD9", "\xDA", "\xDB", "\xDC", "\xDD", "\xDE", "\u0100", "\u0102", "\u0104", "\u0106", "\u0108", "\u010A", "\u010C", "\u010E", "\u0110", "\u0112", "\u0114", "\u0116", "\u0118", "\u011A", "\u011C", "\u011E", "\u0120", "\u0122", "\u0124", "\u0126", "\u0128", "\u012A", "\u012C", "\u012E", "\u0130", "\u0132", "\u0134", "\u0136", "\u0138", "\u0139", "\u013B", "\u013D", "\u013F", "\u0141", "\u0143", "\u0145", "\u0147", "\u014A", "\u014C", "\u014E", "\u0150", "\u0152", "\u0154", "\u0156", "\u0158", "\u015A", "\u015C", "\u015E", "\u0160", "\u0162", "\u0164", "\u0166", "\u0168", "\u016A", "\u016C", "\u016E", "\u0170", "\u0172", "\u0174", "\u0176", "\u0178", "\u0179", "\u017B", "\u017D"], false, false),
-      peg$c257 = /^[a-z\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\xFF\u017A\u017C\u017E\u0149\xDF]/,
-      peg$c258 = peg$classExpectation([["a", "z"], "\xE0", "\xE1", "\xE2", "\xE3", "\xE4", "\xE5", "\xE6", "\xE7", "\xE8", "\xE9", "\xEA", "\xEB", "\xEC", "\xED", "\xEE", "\xEF", "\xF0", "\xF1", "\xF2", "\xF3", "\xF4", "\xF5", "\xF6", "\xF8", "\xF9", "\xFA", "\xFB", "\xFC", "\xFD", "\xFE", "\u0101", "\u0103", "\u0105", "\u0107", "\u0109", "\u010B", "\u010D", "\u010F", "\u0111", "\u0113", "\u0115", "\u0117", "\u0119", "\u011B", "\u011D", "\u011F", "\u0121", "\u0123", "\u0125", "\u0127", "\u0129", "\u012B", "\u012D", "\u012F", "\u0131", "\u0133", "\u0135", "\u0137", "\u0138", "\u013A", "\u013C", "\u013E", "\u0140", "\u0142", "\u0144", "\u0146", "\u0148", "\u014B", "\u014D", "\u014F", "\u0151", "\u0153", "\u0155", "\u0157", "\u0159", "\u015B", "\u015D", "\u015F", "\u0161", "\u0163", "\u0165", "\u0167", "\u0169", "\u016B", "\u016D", "\u016F", "\u0171", "\u0173", "\u0175", "\u0177", "\xFF", "\u017A", "\u017C", "\u017E", "\u0149", "\xDF"], false, false),
-      peg$c259 = function(prefix, name) { return (prefix + '_' + name).toLowerCase() },
-      peg$c260 = "'s",
-      peg$c261 = peg$literalExpectation("'s", false),
-      peg$c262 = "=",
-      peg$c263 = peg$literalExpectation("=", false),
-      peg$c264 = "is ",
-      peg$c265 = peg$literalExpectation("is ", true),
-      peg$c266 = "was ",
-      peg$c267 = peg$literalExpectation("was ", true),
-      peg$c268 = "are ",
-      peg$c269 = peg$literalExpectation("are ", true),
-      peg$c270 = "were ",
-      peg$c271 = peg$literalExpectation("were ", true),
-      peg$c272 = "into",
-      peg$c273 = peg$literalExpectation("into", true),
-      peg$c274 = function(t) { return t },
-      peg$c275 = function(i) { return i },
-      peg$c276 = function(v, i) { return { variable: v, index: i }; },
-      peg$c277 = function(target, e) { return { assign: { target: target, expression: e} }; },
-      peg$c278 = "says ",
-      peg$c279 = peg$literalExpectation("says ", true),
-      peg$c280 = "put",
-      peg$c281 = peg$literalExpectation("put", true),
-      peg$c282 = function(e, target) { return { assign: { target: target, expression: e} }; },
-      peg$c283 = "let",
-      peg$c284 = peg$literalExpectation("let", true),
-      peg$c285 = "be",
-      peg$c286 = peg$literalExpectation("be", true),
-      peg$c287 = function(target, o, e) {
-            return { assign: {
-              target: target,
-              expression: { binary: {  op: o, lhs: { lookup: target }, rhs: e } }
-            } };
-          },
-      peg$c288 = function(s) { return { string: s} },
-      peg$c289 = function(n, d) { return { number: parseFloat(d?n+'.'+d:n)}},
-      peg$c290 = function(d) {return d},
-      peg$c291 = /^[0-9',;:?!+_\-\/]/,
-      peg$c292 = peg$classExpectation([["0", "9"], "'", ",", ";", ":", "?", "!", "+", "_", "-", "/"], false, false),
-      peg$c293 = function(head, tail) { return head + tail },
-      peg$c294 = function(d) { return d },
-      peg$c295 = /^[A-Za-z']/,
-      peg$c296 = peg$classExpectation([["A", "Z"], ["a", "z"], "'"], false, false),
-      peg$c297 = function(t) { return (t.filter(c => /[A-Za-z]/.test(c)).length%10).toString()},
-      peg$c298 = function(name) { return isKeyword(name) },
-      peg$c299 = function(name) { return name },
-      peg$c300 = function(noun) { return isKeyword(noun) },
-      peg$c301 = function(noun) { return noun },
-      peg$c302 = " ",
-      peg$c303 = peg$literalExpectation(" ", false),
-      peg$c304 = function(head) { return head.replace(/ /g, '_').toLowerCase()  },
-      peg$c305 = "build",
-      peg$c306 = peg$literalExpectation("build", true),
-      peg$c307 = "up",
-      peg$c308 = peg$literalExpectation("up", true),
-      peg$c309 = function(v, t) { return {
-            increment: {
-                variable: v,
-                  multiple: t.length
-              }
-          }; },
-      peg$c310 = "knock",
-      peg$c311 = peg$literalExpectation("knock", true),
-      peg$c312 = "down",
-      peg$c313 = peg$literalExpectation("down", true),
-      peg$c314 = function(v, t) { return {
-            decrement: {
-                variable: v,
-                  multiple: t.length
-              }
-          }; },
-      peg$c315 = "cut",
-      peg$c316 = peg$literalExpectation("cut", true),
-      peg$c317 = "split",
-      peg$c318 = peg$literalExpectation("split", true),
-      peg$c319 = "shatter",
-      peg$c320 = peg$literalExpectation("shatter", true),
-      peg$c321 = function() { return 'split' },
-      peg$c322 = "cast",
-      peg$c323 = peg$literalExpectation("cast", true),
-      peg$c324 = "burn",
-      peg$c325 = peg$literalExpectation("burn", true),
-      peg$c326 = function() { return 'cast' },
-      peg$c327 = "join",
-      peg$c328 = peg$literalExpectation("join", true),
-      peg$c329 = "unite",
-      peg$c330 = peg$literalExpectation("unite", true),
-      peg$c331 = function() { return 'join' },
-      peg$c332 = "with",
-      peg$c333 = peg$literalExpectation("with", true),
-      peg$c334 = function(m) { return m },
-      peg$c335 = function(op, s, m) { return { assign: { target: s, expression: { mutation: { type: op, source: { lookup: s }, modifier: m } } } } ; },
-      peg$c336 = function(op, s, t, m) { return { assign: { target: t, expression: { mutation: { type: op, source: s, modifier: m } } } } ; },
-      peg$c337 = "turn",
-      peg$c338 = peg$literalExpectation("turn", true),
-      peg$c339 = function(v) { return { rounding: { variable: v, direction: 'down'  } }; },
-      peg$c340 = function(v) { return { rounding: { variable: v, direction: 'up'  } }; },
-      peg$c341 = function(v) { return { rounding: { variable: v, direction: 'up' } }; },
-      peg$c342 = "round",
-      peg$c343 = peg$literalExpectation("round", true),
-      peg$c344 = "around",
-      peg$c345 = peg$literalExpectation("around", true),
-      peg$c346 = function(v) { return { rounding: { variable: v, direction: 'nearest' } }; },
-
-      peg$currPos          = 0,
-      peg$savedPos         = 0,
-      peg$posDetailsCache  = [{ line: 1, column: 1 }],
-      peg$maxFailPos       = 0,
-      peg$maxFailExpected  = [],
-      peg$silentFails      = 0,
-
-      peg$resultsCache = {},
-
-      peg$result;
-
-  if ("startRule" in options) {
-    if (!(options.startRule in peg$startRuleFunctions)) {
-      throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
-    }
-
-    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
-  }
-
-  function text() {
-    return input.substring(peg$savedPos, peg$currPos);
-  }
-
-  function location() {
-    return peg$computeLocation(peg$savedPos, peg$currPos);
-  }
-
-  function expected(description, location) {
-    location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
-
-    throw peg$buildStructuredError(
-      [peg$otherExpectation(description)],
-      input.substring(peg$savedPos, peg$currPos),
-      location
-    );
-  }
-
-  function error(message, location) {
-    location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
-
-    throw peg$buildSimpleError(message, location);
-  }
-
-  function peg$literalExpectation(text, ignoreCase) {
-    return { type: "literal", text: text, ignoreCase: ignoreCase };
-  }
-
-  function peg$classExpectation(parts, inverted, ignoreCase) {
-    return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
-  }
-
-  function peg$anyExpectation() {
-    return { type: "any" };
-  }
-
-  function peg$endExpectation() {
-    return { type: "end" };
-  }
-
-  function peg$otherExpectation(description) {
-    return { type: "other", description: description };
-  }
-
-  function peg$computePosDetails(pos) {
-    var details = peg$posDetailsCache[pos], p;
-
-    if (details) {
-      return details;
-    } else {
-      p = pos - 1;
-      while (!peg$posDetailsCache[p]) {
-        p--;
-      }
-
-      details = peg$posDetailsCache[p];
-      details = {
-        line:   details.line,
-        column: details.column
-      };
-
-      while (p < pos) {
-        if (input.charCodeAt(p) === 10) {
-          details.line++;
-          details.column = 1;
-        } else {
-          details.column++;
-        }
-
-        p++;
-      }
-
-      peg$posDetailsCache[pos] = details;
-      return details;
-    }
-  }
-
-  function peg$computeLocation(startPos, endPos) {
-    var startPosDetails = peg$computePosDetails(startPos),
-        endPosDetails   = peg$computePosDetails(endPos);
-
-    return {
-      start: {
-        offset: startPos,
-        line:   startPosDetails.line,
-        column: startPosDetails.column
-      },
-      end: {
-        offset: endPos,
-        line:   endPosDetails.line,
-        column: endPosDetails.column
-      }
-    };
-  }
-
-  function peg$fail(expected) {
-    if (peg$currPos < peg$maxFailPos) { return; }
-
-    if (peg$currPos > peg$maxFailPos) {
-      peg$maxFailPos = peg$currPos;
-      peg$maxFailExpected = [];
-    }
-
-    peg$maxFailExpected.push(expected);
-  }
-
-  function peg$buildSimpleError(message, location) {
-    return new peg$SyntaxError(message, null, null, location);
-  }
-
-  function peg$buildStructuredError(expected, found, location) {
-    return new peg$SyntaxError(
-      peg$SyntaxError.buildMessage(expected, found),
-      expected,
-      found,
-      location
-    );
-  }
-
-  function peg$parseprogram() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 95 + 0,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parseline();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parseline();
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c0(s1);
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseline() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 1,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parse_();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parse_();
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsestatement();
-      if (s2 !== peg$FAILED) {
-        s3 = [];
-        s4 = peg$parseEOL();
-        if (s4 !== peg$FAILED) {
-          while (s4 !== peg$FAILED) {
-            s3.push(s4);
-            s4 = peg$parseEOL();
-          }
-        } else {
-          s3 = peg$FAILED;
-        }
-        if (s3 === peg$FAILED) {
-          s3 = peg$parseEOF();
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c1(s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parseEOL();
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c2();
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsewhitespace() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 2,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (peg$c3.test(input.charAt(peg$currPos))) {
-      s0 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c4); }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecomment() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 3,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 40) {
-      s1 = peg$c5;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c6); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      if (peg$c7.test(input.charAt(peg$currPos))) {
-        s3 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c8); }
-      }
-      while (s3 !== peg$FAILED) {
-        s2.push(s3);
-        if (peg$c7.test(input.charAt(peg$currPos))) {
-          s3 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c8); }
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 41) {
-          s3 = peg$c9;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c10); }
-        }
-        if (s3 !== peg$FAILED) {
-          s1 = [s1, s2, s3];
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parse_() {
-    var s0, s1;
-
-    var key    = peg$currPos * 95 + 4,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = [];
-    s1 = peg$parsewhitespace();
-    if (s1 === peg$FAILED) {
-      s1 = peg$parsecomment();
-    }
-    if (s1 !== peg$FAILED) {
-      while (s1 !== peg$FAILED) {
-        s0.push(s1);
-        s1 = peg$parsewhitespace();
-        if (s1 === peg$FAILED) {
-          s1 = peg$parsecomment();
-        }
-      }
-    } else {
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsenoise() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 5,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parse_();
-    if (s0 === peg$FAILED) {
-      if (peg$c11.test(input.charAt(peg$currPos))) {
-        s0 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s0 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c12); }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseEOL() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 95 + 6,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parsenoise();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parsenoise();
-    }
-    if (s1 !== peg$FAILED) {
-      if (input.charCodeAt(peg$currPos) === 10) {
-        s2 = peg$c13;
-        peg$currPos++;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c14); }
-      }
-      if (s2 !== peg$FAILED) {
-        s1 = [s1, s2];
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseEOF() {
-    var s0, s1;
-
-    var key    = peg$currPos * 95 + 7,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    peg$silentFails++;
-    if (input.length > peg$currPos) {
-      s1 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c15); }
-    }
-    peg$silentFails--;
-    if (s1 === peg$FAILED) {
-      s0 = void 0;
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseignore_rest_of_line() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 8,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      if (peg$c16.test(input.charAt(peg$currPos))) {
-        s3 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c17); }
-      }
-      while (s3 !== peg$FAILED) {
-        s2.push(s3);
-        if (peg$c16.test(input.charAt(peg$currPos))) {
-          s3 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c17); }
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        s1 = [s1, s2];
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = null;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsestatement() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 95 + 9,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parse_();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parse_();
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsebreak();
-      if (s2 === peg$FAILED) {
-        s2 = peg$parsecontinue();
-        if (s2 === peg$FAILED) {
-          s2 = peg$parsefunction();
-          if (s2 === peg$FAILED) {
-            s2 = peg$parsefunction_call();
-            if (s2 === peg$FAILED) {
-              s2 = peg$parsefunction_return();
-              if (s2 === peg$FAILED) {
-                s2 = peg$parseloop();
-                if (s2 === peg$FAILED) {
-                  s2 = peg$parseconditional();
-                  if (s2 === peg$FAILED) {
-                    s2 = peg$parseoperation();
-                    if (s2 === peg$FAILED) {
-                      s2 = peg$parsenor();
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c1(s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsebreak() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 95 + 10,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c18) {
-      s1 = input.substr(peg$currPos, 5);
-      peg$currPos += 5;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c19); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseignore_rest_of_line();
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c20();
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecontinue() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 11,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    if (input.substr(peg$currPos, 8).toLowerCase() === peg$c21) {
-      s2 = input.substr(peg$currPos, 8);
-      peg$currPos += 8;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c22); }
-    }
-    if (s2 !== peg$FAILED) {
-      s3 = peg$parseignore_rest_of_line();
-      if (s3 !== peg$FAILED) {
-        s2 = [s2, s3];
-        s1 = s2;
-      } else {
-        peg$currPos = s1;
-        s1 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s1;
-      s1 = peg$FAILED;
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 18).toLowerCase() === peg$c23) {
-        s1 = input.substr(peg$currPos, 18);
-        peg$currPos += 18;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c24); }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c25();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsefunction() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8;
-
-    var key    = peg$currPos * 95 + 12,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsevariable();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.substr(peg$currPos, 5).toLowerCase() === peg$c26) {
-          s3 = input.substr(peg$currPos, 5);
-          peg$currPos += 5;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c27); }
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parsevariable_list();
-            if (s5 !== peg$FAILED) {
-              s6 = peg$parseEOL();
-              if (s6 !== peg$FAILED) {
-                s7 = peg$parseblock();
-                if (s7 !== peg$FAILED) {
-                  s8 = peg$parseEOL();
-                  if (s8 !== peg$FAILED) {
-                    peg$savedPos = s0;
-                    s1 = peg$c28(s1, s5, s7);
-                    s0 = s1;
-                  } else {
-                    peg$currPos = s0;
-                    s0 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseexpression_list_separator() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 13,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 === peg$FAILED) {
-      s1 = null;
-    }
-    if (s1 !== peg$FAILED) {
-      if (input.substr(peg$currPos, 5) === peg$c29) {
-        s2 = peg$c29;
-        peg$currPos += 5;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c30); }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parse_();
-        if (s3 !== peg$FAILED) {
-          s1 = [s1, s2, s3];
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parse_();
-      if (s1 === peg$FAILED) {
-        s1 = null;
-      }
-      if (s1 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 38) {
-          s2 = peg$c31;
-          peg$currPos++;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c32); }
-        }
-        if (s2 === peg$FAILED) {
-          if (input.charCodeAt(peg$currPos) === 44) {
-            s2 = peg$c33;
-            peg$currPos++;
-          } else {
-            s2 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c34); }
-          }
-          if (s2 === peg$FAILED) {
-            if (input.substr(peg$currPos, 3) === peg$c35) {
-              s2 = peg$c35;
-              peg$currPos += 3;
-            } else {
-              s2 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c36); }
-            }
-          }
-        }
-        if (s2 !== peg$FAILED) {
-          s3 = peg$parse_();
-          if (s3 === peg$FAILED) {
-            s3 = null;
-          }
-          if (s3 !== peg$FAILED) {
-            s1 = [s1, s2, s3];
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsevariable_list_separator() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 14,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseexpression_list_separator();
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parse_();
-      if (s1 !== peg$FAILED) {
-        if (input.substr(peg$currPos, 3) === peg$c37) {
-          s2 = peg$c37;
-          peg$currPos += 3;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c38); }
-        }
-        if (s2 !== peg$FAILED) {
-          s3 = peg$parse_();
-          if (s3 !== peg$FAILED) {
-            s1 = [s1, s2, s3];
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsevariable_list() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 15,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsevariable();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsevariable_list_separator();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsevariable_list();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c39(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parsevariable();
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c40(s1);
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsefunction_call() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 16,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsevariable();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.substr(peg$currPos, 6).toLowerCase() === peg$c41) {
-          s3 = input.substr(peg$currPos, 6);
-          peg$currPos += 6;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c42); }
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseexpression_list();
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c43(s1, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseexpression_list() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 17,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsesimple_expression();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseexpression_list_separator();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseexpression_list();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c39(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parsesimple_expression();
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c44(s1);
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsereturn() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 18,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c45) {
-      s0 = input.substr(peg$currPos, 6);
-      peg$currPos += 6;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c46); }
-    }
-    if (s0 === peg$FAILED) {
-      if (input.substr(peg$currPos, 9).toLowerCase() === peg$c47) {
-        s0 = input.substr(peg$currPos, 9);
-        peg$currPos += 9;
-      } else {
-        s0 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c48); }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsefunction_return() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 19,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsereturn();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsenor();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c49(s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseoperation() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 20,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsereadline();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseoutput();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsecrement();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parsemutation();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parseassignment();
-            if (s0 === peg$FAILED) {
-              s0 = peg$parserounding();
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsereadline() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 21,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 9).toLowerCase() === peg$c50) {
-      s1 = input.substr(peg$currPos, 9);
-      peg$currPos += 9;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c51); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseassignable();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c52(s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.substr(peg$currPos, 6).toLowerCase() === peg$c53) {
-        s1 = input.substr(peg$currPos, 6);
-        peg$currPos += 6;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c54); }
-      }
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c55();
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecontinuation() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 22,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseEOL();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$parse_();
-      while (s3 !== peg$FAILED) {
-        s2.push(s3);
-        s3 = peg$parse_();
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsestatement();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c1(s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseblock() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 23,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsestatement();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$parsecontinuation();
-      if (s3 !== peg$FAILED) {
-        while (s3 !== peg$FAILED) {
-          s2.push(s3);
-          s3 = peg$parsecontinuation();
-        }
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c56(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parsestatement();
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c1(s1);
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseconsequent() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 95 + 24,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsestatement();
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c1(s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parseEOL();
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parseblock();
-        if (s2 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c1(s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsealternate() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 25,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 !== peg$FAILED) {
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c57) {
-        s2 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c58); }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parse_();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parsestatement();
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c59(s4);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = [];
-      s2 = peg$parseEOL();
-      if (s2 !== peg$FAILED) {
-        while (s2 !== peg$FAILED) {
-          s1.push(s2);
-          s2 = peg$parseEOL();
-        }
-      } else {
-        s1 = peg$FAILED;
-      }
-      if (s1 !== peg$FAILED) {
-        if (input.substr(peg$currPos, 4).toLowerCase() === peg$c57) {
-          s2 = input.substr(peg$currPos, 4);
-          peg$currPos += 4;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c58); }
-        }
-        if (s2 !== peg$FAILED) {
-          s3 = peg$parse_();
-          if (s3 !== peg$FAILED) {
-            s4 = peg$parsestatement();
-            if (s4 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c59(s4);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-      if (s0 === peg$FAILED) {
-        s0 = peg$currPos;
-        s1 = [];
-        s2 = peg$parseEOL();
-        if (s2 !== peg$FAILED) {
-          while (s2 !== peg$FAILED) {
-            s1.push(s2);
-            s2 = peg$parseEOL();
-          }
-        } else {
-          s1 = peg$FAILED;
-        }
-        if (s1 !== peg$FAILED) {
-          if (input.substr(peg$currPos, 4).toLowerCase() === peg$c57) {
-            s2 = input.substr(peg$currPos, 4);
-            peg$currPos += 4;
-          } else {
-            s2 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c58); }
-          }
-          if (s2 !== peg$FAILED) {
-            s3 = peg$parseEOL();
-            if (s3 !== peg$FAILED) {
-              s4 = peg$parseblock();
-              if (s4 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c59(s4);
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-        if (s0 === peg$FAILED) {
-          s0 = peg$currPos;
-          s1 = peg$parseEOL();
-          if (s1 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c2();
-          }
-          s0 = s1;
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseconditional() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 26,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c60) {
-      s1 = input.substr(peg$currPos, 2);
-      peg$currPos += 2;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c61); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsenor();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parseconsequent();
-          if (s4 === peg$FAILED) {
-            s4 = null;
-          }
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parsealternate();
-            if (s5 === peg$FAILED) {
-              s5 = null;
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c62(s3, s4, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseloopable() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 27,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsestatement();
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c1(s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parseEOL();
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parseblock();
-        if (s2 !== peg$FAILED) {
-          s3 = peg$parseEOL();
-          if (s3 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c1(s2);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseloop() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 28,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c63) {
-      s1 = input.substr(peg$currPos, 5);
-      peg$currPos += 5;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c64); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsenor();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parseloopable();
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c65(s3, s4);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c66) {
-        s1 = input.substr(peg$currPos, 5);
-        peg$currPos += 5;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c67); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parse_();
-        if (s2 !== peg$FAILED) {
-          s3 = peg$parsenor();
-          if (s3 !== peg$FAILED) {
-            s4 = peg$parseloopable();
-            if (s4 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c68(s3, s4);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseoutput() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 29,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c69) {
-      s1 = input.substr(peg$currPos, 3);
-      peg$currPos += 3;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c70); }
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c71) {
-        s1 = input.substr(peg$currPos, 5);
-        peg$currPos += 5;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c72); }
-      }
-      if (s1 === peg$FAILED) {
-        if (input.substr(peg$currPos, 7).toLowerCase() === peg$c73) {
-          s1 = input.substr(peg$currPos, 7);
-          peg$currPos += 7;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c74); }
-        }
-        if (s1 === peg$FAILED) {
-          if (input.substr(peg$currPos, 6).toLowerCase() === peg$c75) {
-            s1 = input.substr(peg$currPos, 6);
-            peg$currPos += 6;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c76); }
-          }
-        }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsenor();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c77(s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsesimple_expression() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 30,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsefunction_call();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseconstant();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parselookup();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parseliteral();
-          if (s0 === peg$FAILED) {
-            s0 = peg$parsepronoun();
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseliteral() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 31,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseconstant();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsenumber();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsestring();
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseconstant() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 32,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsenull();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsetrue();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsefalse();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parsemysterious();
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsetrue() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 33,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c78) {
-      s1 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c79); }
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 2).toLowerCase() === peg$c80) {
-        s1 = input.substr(peg$currPos, 2);
-        peg$currPos += 2;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c81); }
-      }
-      if (s1 === peg$FAILED) {
-        if (input.substr(peg$currPos, 5).toLowerCase() === peg$c82) {
-          s1 = input.substr(peg$currPos, 5);
-          peg$currPos += 5;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c83); }
-        }
-        if (s1 === peg$FAILED) {
-          if (input.substr(peg$currPos, 3).toLowerCase() === peg$c84) {
-            s1 = input.substr(peg$currPos, 3);
-            peg$currPos += 3;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c85); }
-          }
-        }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parseletter();
-      peg$silentFails--;
-      if (s3 === peg$FAILED) {
-        s2 = void 0;
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c86();
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsefalse() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 34,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c87) {
-      s1 = input.substr(peg$currPos, 5);
-      peg$currPos += 5;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c88); }
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c89) {
-        s1 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c90); }
-      }
-      if (s1 === peg$FAILED) {
-        if (input.substr(peg$currPos, 5).toLowerCase() === peg$c91) {
-          s1 = input.substr(peg$currPos, 5);
-          peg$currPos += 5;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c92); }
-        }
-        if (s1 === peg$FAILED) {
-          if (input.substr(peg$currPos, 2).toLowerCase() === peg$c93) {
-            s1 = input.substr(peg$currPos, 2);
-            peg$currPos += 2;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c94); }
-          }
-        }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      peg$silentFails++;
-      s3 = peg$parseletter();
-      peg$silentFails--;
-      if (s3 === peg$FAILED) {
-        s2 = void 0;
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c95();
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsenull() {
-    var s0, s1;
-
-    var key    = peg$currPos * 95 + 35,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c96) {
-      s1 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c97); }
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 7).toLowerCase() === peg$c98) {
-        s1 = input.substr(peg$currPos, 7);
-        peg$currPos += 7;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c99); }
-      }
-      if (s1 === peg$FAILED) {
-        if (input.substr(peg$currPos, 7).toLowerCase() === peg$c100) {
-          s1 = input.substr(peg$currPos, 7);
-          peg$currPos += 7;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c101); }
-        }
-        if (s1 === peg$FAILED) {
-          if (input.substr(peg$currPos, 6).toLowerCase() === peg$c102) {
-            s1 = input.substr(peg$currPos, 6);
-            peg$currPos += 6;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c103); }
-          }
-          if (s1 === peg$FAILED) {
-            if (input.substr(peg$currPos, 5).toLowerCase() === peg$c104) {
-              s1 = input.substr(peg$currPos, 5);
-              peg$currPos += 5;
-            } else {
-              s1 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c105); }
-            }
-            if (s1 === peg$FAILED) {
-              if (input.substr(peg$currPos, 4).toLowerCase() === peg$c106) {
-                s1 = input.substr(peg$currPos, 4);
-                peg$currPos += 4;
-              } else {
-                s1 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c107); }
-              }
-            }
-          }
-        }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c108();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsemysterious() {
-    var s0, s1;
-
-    var key    = peg$currPos * 95 + 36,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 10) === peg$c109) {
-      s1 = peg$c109;
-      peg$currPos += 10;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c110); }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c111();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsenumber() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8;
-
-    var key    = peg$currPos * 95 + 37,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    s2 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 45) {
-      s3 = peg$c112;
-      peg$currPos++;
-    } else {
-      s3 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c113); }
-    }
-    if (s3 === peg$FAILED) {
-      s3 = null;
-    }
-    if (s3 !== peg$FAILED) {
-      s4 = [];
-      if (peg$c114.test(input.charAt(peg$currPos))) {
-        s5 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s5 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c115); }
-      }
-      if (s5 !== peg$FAILED) {
-        while (s5 !== peg$FAILED) {
-          s4.push(s5);
-          if (peg$c114.test(input.charAt(peg$currPos))) {
-            s5 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s5 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c115); }
-          }
-        }
-      } else {
-        s4 = peg$FAILED;
-      }
-      if (s4 !== peg$FAILED) {
-        s5 = peg$currPos;
-        if (input.charCodeAt(peg$currPos) === 46) {
-          s6 = peg$c116;
-          peg$currPos++;
-        } else {
-          s6 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c117); }
-        }
-        if (s6 !== peg$FAILED) {
-          s7 = [];
-          if (peg$c114.test(input.charAt(peg$currPos))) {
-            s8 = input.charAt(peg$currPos);
-            peg$currPos++;
-          } else {
-            s8 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c115); }
-          }
-          if (s8 !== peg$FAILED) {
-            while (s8 !== peg$FAILED) {
-              s7.push(s8);
-              if (peg$c114.test(input.charAt(peg$currPos))) {
-                s8 = input.charAt(peg$currPos);
-                peg$currPos++;
-              } else {
-                s8 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c115); }
-              }
-            }
-          } else {
-            s7 = peg$FAILED;
-          }
-          if (s7 !== peg$FAILED) {
-            s6 = [s6, s7];
-            s5 = s6;
-          } else {
-            peg$currPos = s5;
-            s5 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s5;
-          s5 = peg$FAILED;
-        }
-        if (s5 === peg$FAILED) {
-          s5 = null;
-        }
-        if (s5 !== peg$FAILED) {
-          s3 = [s3, s4, s5];
-          s2 = s3;
-        } else {
-          peg$currPos = s2;
-          s2 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s2;
-      s2 = peg$FAILED;
-    }
-    if (s2 !== peg$FAILED) {
-      s1 = input.substring(s1, peg$currPos);
-    } else {
-      s1 = s2;
-    }
-    if (s1 !== peg$FAILED) {
-      if (input.charCodeAt(peg$currPos) === 46) {
-        s2 = peg$c116;
-        peg$currPos++;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c117); }
-      }
-      if (s2 === peg$FAILED) {
-        s2 = null;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c118(s1);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$currPos;
-      s2 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 46) {
-        s3 = peg$c116;
-        peg$currPos++;
-      } else {
-        s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c117); }
-      }
-      if (s3 !== peg$FAILED) {
-        s4 = [];
-        if (peg$c114.test(input.charAt(peg$currPos))) {
-          s5 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s5 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c115); }
-        }
-        if (s5 !== peg$FAILED) {
-          while (s5 !== peg$FAILED) {
-            s4.push(s5);
-            if (peg$c114.test(input.charAt(peg$currPos))) {
-              s5 = input.charAt(peg$currPos);
-              peg$currPos++;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c115); }
-            }
-          }
-        } else {
-          s4 = peg$FAILED;
-        }
-        if (s4 !== peg$FAILED) {
-          s3 = [s3, s4];
-          s2 = s3;
-        } else {
-          peg$currPos = s2;
-          s2 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        s1 = input.substring(s1, peg$currPos);
-      } else {
-        s1 = s2;
-      }
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c119(s1);
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsestring() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 38,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 34) {
-      s1 = peg$c120;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c121); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$currPos;
-      s3 = [];
-      if (peg$c122.test(input.charAt(peg$currPos))) {
-        s4 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s4 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c123); }
-      }
-      while (s4 !== peg$FAILED) {
-        s3.push(s4);
-        if (peg$c122.test(input.charAt(peg$currPos))) {
-          s4 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s4 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c123); }
-        }
-      }
-      if (s3 !== peg$FAILED) {
-        s2 = input.substring(s2, peg$currPos);
-      } else {
-        s2 = s3;
-      }
-      if (s2 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 34) {
-          s3 = peg$c120;
-          peg$currPos++;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c121); }
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c124(s2);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsenor() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 39,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseor();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.substr(peg$currPos, 3) === peg$c125) {
-          s3 = peg$c125;
-          peg$currPos += 3;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c126); }
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parsenor();
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c127(s1, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseor();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseor() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 40,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseand();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.substr(peg$currPos, 2) === peg$c128) {
-          s3 = peg$c128;
-          peg$currPos += 2;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c129); }
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseor();
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c130(s1, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseand();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseand() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 41,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseequality_check();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.substr(peg$currPos, 3) === peg$c37) {
-          s3 = peg$c37;
-          peg$currPos += 3;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c38); }
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseand();
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c131(s1, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseequality_check();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseeq() {
-    var s0, s1;
-
-    var key    = peg$currPos * 95 + 42,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c132) {
-      s1 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c133); }
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c134) {
-        s1 = input.substr(peg$currPos, 5);
-        peg$currPos += 5;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c135); }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c136();
-    }
-    s0 = s1;
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) {
-        s1 = input.substr(peg$currPos, 2);
-        peg$currPos += 2;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c138); }
-      }
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c139();
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseequality_check() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 43,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsenot();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseeq();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseequality_check();
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c140(s1, s3, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsenot();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsenot() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 44,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 3) === peg$c141) {
-      s1 = peg$c141;
-      peg$currPos += 3;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c142); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsenot();
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c143(s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsecomparison();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecomparison() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 45,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsearithmetic();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsecomparator();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parsecomparison();
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c140(s1, s3, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsearithmetic();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsegreater() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 46,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (input.substr(peg$currPos, 6).toLowerCase() === peg$c144) {
-      s0 = input.substr(peg$currPos, 6);
-      peg$currPos += 6;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c145); }
-    }
-    if (s0 === peg$FAILED) {
-      if (input.substr(peg$currPos, 7).toLowerCase() === peg$c146) {
-        s0 = input.substr(peg$currPos, 7);
-        peg$currPos += 7;
-      } else {
-        s0 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c147); }
-      }
-      if (s0 === peg$FAILED) {
-        if (input.substr(peg$currPos, 6).toLowerCase() === peg$c148) {
-          s0 = input.substr(peg$currPos, 6);
-          peg$currPos += 6;
-        } else {
-          s0 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c149); }
-        }
-        if (s0 === peg$FAILED) {
-          if (input.substr(peg$currPos, 8).toLowerCase() === peg$c150) {
-            s0 = input.substr(peg$currPos, 8);
-            peg$currPos += 8;
-          } else {
-            s0 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c151); }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsesmaller() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 47,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c152) {
-      s0 = input.substr(peg$currPos, 5);
-      peg$currPos += 5;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c153); }
-    }
-    if (s0 === peg$FAILED) {
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c154) {
-        s0 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s0 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c155); }
-      }
-      if (s0 === peg$FAILED) {
-        if (input.substr(peg$currPos, 7).toLowerCase() === peg$c156) {
-          s0 = input.substr(peg$currPos, 7);
-          peg$currPos += 7;
-        } else {
-          s0 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c157); }
-        }
-        if (s0 === peg$FAILED) {
-          if (input.substr(peg$currPos, 6).toLowerCase() === peg$c158) {
-            s0 = input.substr(peg$currPos, 6);
-            peg$currPos += 6;
-          } else {
-            s0 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c159); }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsegreat() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 48,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c160) {
-      s0 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c161); }
-    }
-    if (s0 === peg$FAILED) {
-      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c162) {
-        s0 = input.substr(peg$currPos, 5);
-        peg$currPos += 5;
-      } else {
-        s0 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c163); }
-      }
-      if (s0 === peg$FAILED) {
-        if (input.substr(peg$currPos, 3).toLowerCase() === peg$c164) {
-          s0 = input.substr(peg$currPos, 3);
-          peg$currPos += 3;
-        } else {
-          s0 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c165); }
-        }
-        if (s0 === peg$FAILED) {
-          if (input.substr(peg$currPos, 6).toLowerCase() === peg$c166) {
-            s0 = input.substr(peg$currPos, 6);
-            peg$currPos += 6;
-          } else {
-            s0 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c167); }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsesmall() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 49,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c168) {
-      s0 = input.substr(peg$currPos, 3);
-      peg$currPos += 3;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c169); }
-    }
-    if (s0 === peg$FAILED) {
-      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c170) {
-        s0 = input.substr(peg$currPos, 5);
-        peg$currPos += 5;
-      } else {
-        s0 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c171); }
-      }
-      if (s0 === peg$FAILED) {
-        if (input.substr(peg$currPos, 4).toLowerCase() === peg$c172) {
-          s0 = input.substr(peg$currPos, 4);
-          peg$currPos += 4;
-        } else {
-          s0 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c173); }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecomparator() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 95 + 50,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) {
-      s1 = input.substr(peg$currPos, 2);
-      peg$currPos += 2;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c138); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsegreater();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.substr(peg$currPos, 4).toLowerCase() === peg$c174) {
-              s5 = input.substr(peg$currPos, 4);
-              peg$currPos += 4;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c175); }
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c176();
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) {
-        s1 = input.substr(peg$currPos, 2);
-        peg$currPos += 2;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c138); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parse_();
-        if (s2 !== peg$FAILED) {
-          s3 = peg$parsesmaller();
-          if (s3 !== peg$FAILED) {
-            s4 = peg$parse_();
-            if (s4 !== peg$FAILED) {
-              if (input.substr(peg$currPos, 4).toLowerCase() === peg$c174) {
-                s5 = input.substr(peg$currPos, 4);
-                peg$currPos += 4;
-              } else {
-                s5 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c175); }
-              }
-              if (s5 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c177();
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-      if (s0 === peg$FAILED) {
-        s0 = peg$currPos;
-        if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) {
-          s1 = input.substr(peg$currPos, 2);
-          peg$currPos += 2;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c138); }
-        }
-        if (s1 !== peg$FAILED) {
-          s2 = peg$parse_();
-          if (s2 !== peg$FAILED) {
-            if (input.substr(peg$currPos, 2).toLowerCase() === peg$c178) {
-              s3 = input.substr(peg$currPos, 2);
-              peg$currPos += 2;
-            } else {
-              s3 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c179); }
-            }
-            if (s3 !== peg$FAILED) {
-              s4 = peg$parse_();
-              if (s4 !== peg$FAILED) {
-                s5 = peg$parsegreat();
-                if (s5 !== peg$FAILED) {
-                  s6 = peg$parse_();
-                  if (s6 !== peg$FAILED) {
-                    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c178) {
-                      s7 = input.substr(peg$currPos, 2);
-                      peg$currPos += 2;
-                    } else {
-                      s7 = peg$FAILED;
-                      if (peg$silentFails === 0) { peg$fail(peg$c179); }
-                    }
-                    if (s7 !== peg$FAILED) {
-                      peg$savedPos = s0;
-                      s1 = peg$c180();
-                      s0 = s1;
-                    } else {
-                      peg$currPos = s0;
-                      s0 = peg$FAILED;
-                    }
-                  } else {
-                    peg$currPos = s0;
-                    s0 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-        if (s0 === peg$FAILED) {
-          s0 = peg$currPos;
-          if (input.substr(peg$currPos, 2).toLowerCase() === peg$c137) {
-            s1 = input.substr(peg$currPos, 2);
-            peg$currPos += 2;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c138); }
-          }
-          if (s1 !== peg$FAILED) {
-            s2 = peg$parse_();
-            if (s2 !== peg$FAILED) {
-              if (input.substr(peg$currPos, 2).toLowerCase() === peg$c178) {
-                s3 = input.substr(peg$currPos, 2);
-                peg$currPos += 2;
-              } else {
-                s3 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c179); }
-              }
-              if (s3 !== peg$FAILED) {
-                s4 = peg$parse_();
-                if (s4 !== peg$FAILED) {
-                  s5 = peg$parsesmall();
-                  if (s5 !== peg$FAILED) {
-                    s6 = peg$parse_();
-                    if (s6 !== peg$FAILED) {
-                      if (input.substr(peg$currPos, 2).toLowerCase() === peg$c178) {
-                        s7 = input.substr(peg$currPos, 2);
-                        peg$currPos += 2;
-                      } else {
-                        s7 = peg$FAILED;
-                        if (peg$silentFails === 0) { peg$fail(peg$c179); }
-                      }
-                      if (s7 !== peg$FAILED) {
-                        peg$savedPos = s0;
-                        s1 = peg$c181();
-                        s0 = s1;
-                      } else {
-                        peg$currPos = s0;
-                        s0 = peg$FAILED;
-                      }
-                    } else {
-                      peg$currPos = s0;
-                      s0 = peg$FAILED;
-                    }
-                  } else {
-                    peg$currPos = s0;
-                    s0 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsearithmetic() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 51,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseproduct();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$currPos;
-      s4 = peg$parseadd();
-      if (s4 === peg$FAILED) {
-        s4 = peg$parsesubtract();
-      }
-      if (s4 !== peg$FAILED) {
-        s5 = peg$parseproduct();
-        if (s5 !== peg$FAILED) {
-          s4 = [s4, s5];
-          s3 = s4;
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s3;
-        s3 = peg$FAILED;
-      }
-      if (s3 !== peg$FAILED) {
-        while (s3 !== peg$FAILED) {
-          s2.push(s3);
-          s3 = peg$currPos;
-          s4 = peg$parseadd();
-          if (s4 === peg$FAILED) {
-            s4 = peg$parsesubtract();
-          }
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseproduct();
-            if (s5 !== peg$FAILED) {
-              s4 = [s4, s5];
-              s3 = s4;
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        }
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c182(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseproduct();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseproduct() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 52,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsesimple_expression();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$currPos;
-      s4 = peg$parsemultiply();
-      if (s4 === peg$FAILED) {
-        s4 = peg$parsedivide();
-      }
-      if (s4 !== peg$FAILED) {
-        s5 = peg$parseexpression_list();
-        if (s5 !== peg$FAILED) {
-          s4 = [s4, s5];
-          s3 = s4;
-        } else {
-          peg$currPos = s3;
-          s3 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s3;
-        s3 = peg$FAILED;
-      }
-      if (s3 !== peg$FAILED) {
-        while (s3 !== peg$FAILED) {
-          s2.push(s3);
-          s3 = peg$currPos;
-          s4 = peg$parsemultiply();
-          if (s4 === peg$FAILED) {
-            s4 = peg$parsedivide();
-          }
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parseexpression_list();
-            if (s5 !== peg$FAILED) {
-              s4 = [s4, s5];
-              s3 = s4;
-            } else {
-              peg$currPos = s3;
-              s3 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s3;
-            s3 = peg$FAILED;
-          }
-        }
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c183(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseexpression_list();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsesimple_expression();
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseadd() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 53,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parse_();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parse_();
-    }
-    if (s1 !== peg$FAILED) {
-      if (input.charCodeAt(peg$currPos) === 43) {
-        s2 = peg$c184;
-        peg$currPos++;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c185); }
-      }
-      if (s2 === peg$FAILED) {
-        if (input.substr(peg$currPos, 5) === peg$c186) {
-          s2 = peg$c186;
-          peg$currPos += 5;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c187); }
-        }
-        if (s2 === peg$FAILED) {
-          if (input.substr(peg$currPos, 5) === peg$c188) {
-            s2 = peg$c188;
-            peg$currPos += 5;
-          } else {
-            s2 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c189); }
-          }
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = [];
-        s4 = peg$parse_();
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          s4 = peg$parse_();
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c190();
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsesubtract() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 54,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parse_();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parse_();
-    }
-    if (s1 !== peg$FAILED) {
-      if (input.charCodeAt(peg$currPos) === 45) {
-        s2 = peg$c112;
-        peg$currPos++;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c113); }
-      }
-      if (s2 === peg$FAILED) {
-        if (input.substr(peg$currPos, 6) === peg$c191) {
-          s2 = peg$c191;
-          peg$currPos += 6;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c192); }
-        }
-        if (s2 === peg$FAILED) {
-          if (input.substr(peg$currPos, 8) === peg$c193) {
-            s2 = peg$c193;
-            peg$currPos += 8;
-          } else {
-            s2 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c194); }
-          }
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = [];
-        s4 = peg$parse_();
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          s4 = peg$parse_();
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c195();
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsemultiply() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 55,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parse_();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parse_();
-    }
-    if (s1 !== peg$FAILED) {
-      if (input.charCodeAt(peg$currPos) === 42) {
-        s2 = peg$c196;
-        peg$currPos++;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c197); }
-      }
-      if (s2 === peg$FAILED) {
-        if (input.substr(peg$currPos, 6) === peg$c198) {
-          s2 = peg$c198;
-          peg$currPos += 6;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c199); }
-        }
-        if (s2 === peg$FAILED) {
-          if (input.substr(peg$currPos, 3) === peg$c200) {
-            s2 = peg$c200;
-            peg$currPos += 3;
-          } else {
-            s2 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c201); }
-          }
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = [];
-        s4 = peg$parse_();
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          s4 = peg$parse_();
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c202();
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsedivide() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 56,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parse_();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parse_();
-    }
-    if (s1 !== peg$FAILED) {
-      if (input.charCodeAt(peg$currPos) === 47) {
-        s2 = peg$c203;
-        peg$currPos++;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c204); }
-      }
-      if (s2 === peg$FAILED) {
-        if (input.substr(peg$currPos, 5) === peg$c205) {
-          s2 = peg$c205;
-          peg$currPos += 5;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c206); }
-        }
-        if (s2 === peg$FAILED) {
-          if (input.substr(peg$currPos, 8) === peg$c207) {
-            s2 = peg$c207;
-            peg$currPos += 8;
-          } else {
-            s2 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c208); }
-          }
-        }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = [];
-        s4 = peg$parse_();
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          s4 = peg$parse_();
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c209();
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecompoundable_operator() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 57,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseadd();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsesubtract();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsemultiply();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parsedivide();
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsepronoun() {
-    var s0, s1;
-
-    var key    = peg$currPos * 95 + 58,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c210) {
-      s1 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c211); }
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c212) {
-        s1 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c213); }
-      }
-      if (s1 === peg$FAILED) {
-        if (input.substr(peg$currPos, 3).toLowerCase() === peg$c214) {
-          s1 = input.substr(peg$currPos, 3);
-          peg$currPos += 3;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c215); }
-        }
-        if (s1 === peg$FAILED) {
-          if (input.substr(peg$currPos, 3).toLowerCase() === peg$c216) {
-            s1 = input.substr(peg$currPos, 3);
-            peg$currPos += 3;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c217); }
-          }
-          if (s1 === peg$FAILED) {
-            if (input.substr(peg$currPos, 3).toLowerCase() === peg$c218) {
-              s1 = input.substr(peg$currPos, 3);
-              peg$currPos += 3;
-            } else {
-              s1 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c219); }
-            }
-            if (s1 === peg$FAILED) {
-              if (input.substr(peg$currPos, 3).toLowerCase() === peg$c220) {
-                s1 = input.substr(peg$currPos, 3);
-                peg$currPos += 3;
-              } else {
-                s1 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c221); }
-              }
-              if (s1 === peg$FAILED) {
-                if (input.substr(peg$currPos, 3).toLowerCase() === peg$c222) {
-                  s1 = input.substr(peg$currPos, 3);
-                  peg$currPos += 3;
-                } else {
-                  s1 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c223); }
-                }
-                if (s1 === peg$FAILED) {
-                  if (input.substr(peg$currPos, 3).toLowerCase() === peg$c224) {
-                    s1 = input.substr(peg$currPos, 3);
-                    peg$currPos += 3;
-                  } else {
-                    s1 = peg$FAILED;
-                    if (peg$silentFails === 0) { peg$fail(peg$c225); }
-                  }
-                  if (s1 === peg$FAILED) {
-                    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c226) {
-                      s1 = input.substr(peg$currPos, 3);
-                      peg$currPos += 3;
-                    } else {
-                      s1 = peg$FAILED;
-                      if (peg$silentFails === 0) { peg$fail(peg$c227); }
-                    }
-                    if (s1 === peg$FAILED) {
-                      if (input.substr(peg$currPos, 3).toLowerCase() === peg$c228) {
-                        s1 = input.substr(peg$currPos, 3);
-                        peg$currPos += 3;
-                      } else {
-                        s1 = peg$FAILED;
-                        if (peg$silentFails === 0) { peg$fail(peg$c229); }
-                      }
-                      if (s1 === peg$FAILED) {
-                        if (input.substr(peg$currPos, 2).toLowerCase() === peg$c230) {
-                          s1 = input.substr(peg$currPos, 2);
-                          peg$currPos += 2;
-                        } else {
-                          s1 = peg$FAILED;
-                          if (peg$silentFails === 0) { peg$fail(peg$c231); }
-                        }
-                        if (s1 === peg$FAILED) {
-                          if (input.substr(peg$currPos, 2).toLowerCase() === peg$c232) {
-                            s1 = input.substr(peg$currPos, 2);
-                            peg$currPos += 2;
-                          } else {
-                            s1 = peg$FAILED;
-                            if (peg$silentFails === 0) { peg$fail(peg$c233); }
-                          }
-                          if (s1 === peg$FAILED) {
-                            if (input.substr(peg$currPos, 2).toLowerCase() === peg$c234) {
-                              s1 = input.substr(peg$currPos, 2);
-                              peg$currPos += 2;
-                            } else {
-                              s1 = peg$FAILED;
-                              if (peg$silentFails === 0) { peg$fail(peg$c235); }
-                            }
-                            if (s1 === peg$FAILED) {
-                              if (input.substr(peg$currPos, 2).toLowerCase() === peg$c236) {
-                                s1 = input.substr(peg$currPos, 2);
-                                peg$currPos += 2;
-                              } else {
-                                s1 = peg$FAILED;
-                                if (peg$silentFails === 0) { peg$fail(peg$c237); }
-                              }
-                              if (s1 === peg$FAILED) {
-                                if (input.substr(peg$currPos, 2).toLowerCase() === peg$c238) {
-                                  s1 = input.substr(peg$currPos, 2);
-                                  peg$currPos += 2;
-                                } else {
-                                  s1 = peg$FAILED;
-                                  if (peg$silentFails === 0) { peg$fail(peg$c239); }
-                                }
-                              }
-                            }
-                          }
-                        }
-                      }
-                    }
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c240(s1);
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parselookup() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 59,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsevariable();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        if (input.substr(peg$currPos, 2).toLowerCase() === peg$c241) {
-          s3 = input.substr(peg$currPos, 2);
-          peg$currPos += 2;
-        } else {
-          s3 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c242); }
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = peg$parsenor();
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c243(s1, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parsevariable();
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c244(s1);
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecommon_prefix() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 60,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c245) {
-      s0 = input.substr(peg$currPos, 2);
-      peg$currPos += 2;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c246); }
-    }
-    if (s0 === peg$FAILED) {
-      if (input.substr(peg$currPos, 1).toLowerCase() === peg$c247) {
-        s0 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s0 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c248); }
-      }
-      if (s0 === peg$FAILED) {
-        if (input.substr(peg$currPos, 3).toLowerCase() === peg$c249) {
-          s0 = input.substr(peg$currPos, 3);
-          peg$currPos += 3;
-        } else {
-          s0 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c250); }
-        }
-        if (s0 === peg$FAILED) {
-          if (input.substr(peg$currPos, 2).toLowerCase() === peg$c251) {
-            s0 = input.substr(peg$currPos, 2);
-            peg$currPos += 2;
-          } else {
-            s0 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c252); }
-          }
-          if (s0 === peg$FAILED) {
-            if (input.substr(peg$currPos, 4).toLowerCase() === peg$c253) {
-              s0 = input.substr(peg$currPos, 4);
-              peg$currPos += 4;
-            } else {
-              s0 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c254); }
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseuppercase_letter() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 61,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (peg$c255.test(input.charAt(peg$currPos))) {
-      s0 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c256); }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parselowercase_letter() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 62,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (peg$c257.test(input.charAt(peg$currPos))) {
-      s0 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c258); }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseletter() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 63,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseuppercase_letter();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parselowercase_letter();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecommon_variable() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 64,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsecommon_prefix();
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$parse_();
-      if (s3 !== peg$FAILED) {
-        while (s3 !== peg$FAILED) {
-          s2.push(s3);
-          s3 = peg$parse_();
-        }
-      } else {
-        s2 = peg$FAILED;
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$currPos;
-        s4 = [];
-        s5 = peg$parseletter();
-        if (s5 !== peg$FAILED) {
-          while (s5 !== peg$FAILED) {
-            s4.push(s5);
-            s5 = peg$parseletter();
-          }
-        } else {
-          s4 = peg$FAILED;
-        }
-        if (s4 !== peg$FAILED) {
-          s3 = input.substring(s3, peg$currPos);
-        } else {
-          s3 = s4;
-        }
-        if (s3 !== peg$FAILED) {
-          peg$savedPos = s0;
-          s1 = peg$c259(s1, s3);
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseis() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 95 + 65,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    if (input.substr(peg$currPos, 2) === peg$c260) {
-      s0 = peg$c260;
-      peg$currPos += 2;
-    } else {
-      s0 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c261); }
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = [];
-      s2 = peg$parse_();
-      while (s2 !== peg$FAILED) {
-        s1.push(s2);
-        s2 = peg$parse_();
-      }
-      if (s1 !== peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 61) {
-          s2 = peg$c262;
-          peg$currPos++;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c263); }
-        }
-        if (s2 === peg$FAILED) {
-          if (input.substr(peg$currPos, 3).toLowerCase() === peg$c264) {
-            s2 = input.substr(peg$currPos, 3);
-            peg$currPos += 3;
-          } else {
-            s2 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c265); }
-          }
-          if (s2 === peg$FAILED) {
-            if (input.substr(peg$currPos, 4).toLowerCase() === peg$c266) {
-              s2 = input.substr(peg$currPos, 4);
-              peg$currPos += 4;
-            } else {
-              s2 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c267); }
-            }
-            if (s2 === peg$FAILED) {
-              if (input.substr(peg$currPos, 4).toLowerCase() === peg$c268) {
-                s2 = input.substr(peg$currPos, 4);
-                peg$currPos += 4;
-              } else {
-                s2 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c269); }
-              }
-              if (s2 === peg$FAILED) {
-                if (input.substr(peg$currPos, 5).toLowerCase() === peg$c270) {
-                  s2 = input.substr(peg$currPos, 5);
-                  peg$currPos += 5;
-                } else {
-                  s2 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c271); }
-                }
-              }
-            }
-          }
-        }
-        if (s2 !== peg$FAILED) {
-          s1 = [s1, s2];
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsetarget() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 66,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 !== peg$FAILED) {
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c272) {
-        s2 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c273); }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parse_();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parseassignable();
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c274(s4);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseindexer() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 67,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 !== peg$FAILED) {
-      if (input.substr(peg$currPos, 2).toLowerCase() === peg$c241) {
-        s2 = input.substr(peg$currPos, 2);
-        peg$currPos += 2;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c242); }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parse_();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parsenor();
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c275(s4);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseassignable() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 95 + 68,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsevariable();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseindexer();
-      if (s2 === peg$FAILED) {
-        s2 = null;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c276(s1, s2);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseassignment() {
-    var s0, s1, s2, s3, s4, s5, s6, s7;
-
-    var key    = peg$currPos * 95 + 69,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parseassignable();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parseis();
-      if (s2 !== peg$FAILED) {
-        s3 = [];
-        s4 = peg$parse_();
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          s4 = peg$parse_();
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parseliteral();
-          if (s4 === peg$FAILED) {
-            s4 = peg$parsepoetic_number();
-          }
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c277(s1, s4);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parseassignable();
-      if (s1 !== peg$FAILED) {
-        s2 = [];
-        s3 = peg$parse_();
-        if (s3 !== peg$FAILED) {
-          while (s3 !== peg$FAILED) {
-            s2.push(s3);
-            s3 = peg$parse_();
-          }
-        } else {
-          s2 = peg$FAILED;
-        }
-        if (s2 !== peg$FAILED) {
-          if (input.substr(peg$currPos, 5).toLowerCase() === peg$c278) {
-            s3 = input.substr(peg$currPos, 5);
-            peg$currPos += 5;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c279); }
-          }
-          if (s3 !== peg$FAILED) {
-            s4 = peg$parsepoetic_string();
-            if (s4 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c277(s1, s4);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-      if (s0 === peg$FAILED) {
-        s0 = peg$currPos;
-        if (input.substr(peg$currPos, 3).toLowerCase() === peg$c280) {
-          s1 = input.substr(peg$currPos, 3);
-          peg$currPos += 3;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c281); }
-        }
-        if (s1 !== peg$FAILED) {
-          s2 = [];
-          s3 = peg$parse_();
-          if (s3 !== peg$FAILED) {
-            while (s3 !== peg$FAILED) {
-              s2.push(s3);
-              s3 = peg$parse_();
-            }
-          } else {
-            s2 = peg$FAILED;
-          }
-          if (s2 !== peg$FAILED) {
-            s3 = peg$parsenor();
-            if (s3 !== peg$FAILED) {
-              s4 = peg$parsetarget();
-              if (s4 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c282(s3, s4);
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-        if (s0 === peg$FAILED) {
-          s0 = peg$currPos;
-          if (input.substr(peg$currPos, 3).toLowerCase() === peg$c283) {
-            s1 = input.substr(peg$currPos, 3);
-            peg$currPos += 3;
-          } else {
-            s1 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c284); }
-          }
-          if (s1 !== peg$FAILED) {
-            s2 = [];
-            s3 = peg$parse_();
-            if (s3 !== peg$FAILED) {
-              while (s3 !== peg$FAILED) {
-                s2.push(s3);
-                s3 = peg$parse_();
-              }
-            } else {
-              s2 = peg$FAILED;
-            }
-            if (s2 !== peg$FAILED) {
-              s3 = peg$parseassignable();
-              if (s3 !== peg$FAILED) {
-                s4 = [];
-                s5 = peg$parse_();
-                if (s5 !== peg$FAILED) {
-                  while (s5 !== peg$FAILED) {
-                    s4.push(s5);
-                    s5 = peg$parse_();
-                  }
-                } else {
-                  s4 = peg$FAILED;
-                }
-                if (s4 !== peg$FAILED) {
-                  if (input.substr(peg$currPos, 2).toLowerCase() === peg$c285) {
-                    s5 = input.substr(peg$currPos, 2);
-                    peg$currPos += 2;
-                  } else {
-                    s5 = peg$FAILED;
-                    if (peg$silentFails === 0) { peg$fail(peg$c286); }
-                  }
-                  if (s5 !== peg$FAILED) {
-                    s6 = peg$parsecompoundable_operator();
-                    if (s6 !== peg$FAILED) {
-                      s7 = peg$parsenor();
-                      if (s7 !== peg$FAILED) {
-                        peg$savedPos = s0;
-                        s1 = peg$c287(s3, s6, s7);
-                        s0 = s1;
-                      } else {
-                        peg$currPos = s0;
-                        s0 = peg$FAILED;
-                      }
-                    } else {
-                      peg$currPos = s0;
-                      s0 = peg$FAILED;
-                    }
-                  } else {
-                    peg$currPos = s0;
-                    s0 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-          if (s0 === peg$FAILED) {
-            s0 = peg$currPos;
-            if (input.substr(peg$currPos, 3).toLowerCase() === peg$c283) {
-              s1 = input.substr(peg$currPos, 3);
-              peg$currPos += 3;
-            } else {
-              s1 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c284); }
-            }
-            if (s1 !== peg$FAILED) {
-              s2 = [];
-              s3 = peg$parse_();
-              if (s3 !== peg$FAILED) {
-                while (s3 !== peg$FAILED) {
-                  s2.push(s3);
-                  s3 = peg$parse_();
-                }
-              } else {
-                s2 = peg$FAILED;
-              }
-              if (s2 !== peg$FAILED) {
-                s3 = peg$parseassignable();
-                if (s3 !== peg$FAILED) {
-                  s4 = [];
-                  s5 = peg$parse_();
-                  if (s5 !== peg$FAILED) {
-                    while (s5 !== peg$FAILED) {
-                      s4.push(s5);
-                      s5 = peg$parse_();
-                    }
-                  } else {
-                    s4 = peg$FAILED;
-                  }
-                  if (s4 !== peg$FAILED) {
-                    if (input.substr(peg$currPos, 2).toLowerCase() === peg$c285) {
-                      s5 = input.substr(peg$currPos, 2);
-                      peg$currPos += 2;
-                    } else {
-                      s5 = peg$FAILED;
-                      if (peg$silentFails === 0) { peg$fail(peg$c286); }
-                    }
-                    if (s5 !== peg$FAILED) {
-                      s6 = [];
-                      s7 = peg$parse_();
-                      if (s7 !== peg$FAILED) {
-                        while (s7 !== peg$FAILED) {
-                          s6.push(s7);
-                          s7 = peg$parse_();
-                        }
-                      } else {
-                        s6 = peg$FAILED;
-                      }
-                      if (s6 !== peg$FAILED) {
-                        s7 = peg$parsenor();
-                        if (s7 !== peg$FAILED) {
-                          peg$savedPos = s0;
-                          s1 = peg$c277(s3, s7);
-                          s0 = s1;
-                        } else {
-                          peg$currPos = s0;
-                          s0 = peg$FAILED;
-                        }
-                      } else {
-                        peg$currPos = s0;
-                        s0 = peg$FAILED;
-                      }
-                    } else {
-                      peg$currPos = s0;
-                      s0 = peg$FAILED;
-                    }
-                  } else {
-                    peg$currPos = s0;
-                    s0 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s0;
-                  s0 = peg$FAILED;
-                }
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsepoetic_string() {
-    var s0, s1, s2, s3;
-
-    var key    = peg$currPos * 95 + 70,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    s2 = [];
-    if (peg$c16.test(input.charAt(peg$currPos))) {
-      s3 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s3 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c17); }
-    }
-    while (s3 !== peg$FAILED) {
-      s2.push(s3);
-      if (peg$c16.test(input.charAt(peg$currPos))) {
-        s3 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s3 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c17); }
-      }
-    }
-    if (s2 !== peg$FAILED) {
-      s1 = input.substring(s1, peg$currPos);
-    } else {
-      s1 = s2;
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c288(s1);
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsepoetic_number() {
-    var s0, s1, s2, s3, s4, s5, s6;
-
-    var key    = peg$currPos * 95 + 71,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parsepoetic_digit_separator();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parsepoetic_digit_separator();
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsepoetic_digits();
-      if (s2 !== peg$FAILED) {
-        s3 = [];
-        s4 = peg$parsepoetic_digit_separator();
-        while (s4 !== peg$FAILED) {
-          s3.push(s4);
-          s4 = peg$parsepoetic_digit_separator();
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parsepoetic_decimal();
-          if (s4 === peg$FAILED) {
-            s4 = null;
-          }
-          if (s4 !== peg$FAILED) {
-            s5 = [];
-            s6 = peg$parsepoetic_digit_separator();
-            while (s6 !== peg$FAILED) {
-              s5.push(s6);
-              s6 = peg$parsepoetic_digit_separator();
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c289(s2, s4);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsepoetic_decimal() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 72,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.charCodeAt(peg$currPos) === 46) {
-      s1 = peg$c116;
-      peg$currPos++;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c117); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = [];
-      s3 = peg$parsepoetic_decimal_digit_separator();
-      while (s3 !== peg$FAILED) {
-        s2.push(s3);
-        s3 = peg$parsepoetic_decimal_digit_separator();
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsepoetic_decimal_digits();
-        if (s3 !== peg$FAILED) {
-          s4 = [];
-          s5 = peg$parsepoetic_decimal_digit_separator();
-          while (s5 !== peg$FAILED) {
-            s4.push(s5);
-            s5 = peg$parsepoetic_decimal_digit_separator();
-          }
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c290(s3);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 46) {
-        s1 = peg$c116;
-        peg$currPos++;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c117); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = [];
-        s3 = peg$parsepoetic_decimal_digit_separator();
-        while (s3 !== peg$FAILED) {
-          s2.push(s3);
-          s3 = peg$parsepoetic_decimal_digit_separator();
-        }
-        if (s2 !== peg$FAILED) {
-          s1 = [s1, s2];
-          s0 = s1;
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsepoetic_digit_separator() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 73,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parse_();
-    if (s0 === peg$FAILED) {
-      if (peg$c291.test(input.charAt(peg$currPos))) {
-        s0 = input.charAt(peg$currPos);
-        peg$currPos++;
-      } else {
-        s0 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c292); }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsepoetic_digits() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 74,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parsepoetic_digit_separator();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parsepoetic_digit_separator();
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsepoetic_digit();
-      if (s2 !== peg$FAILED) {
-        s3 = [];
-        s4 = peg$parsepoetic_digit_separator();
-        if (s4 !== peg$FAILED) {
-          while (s4 !== peg$FAILED) {
-            s3.push(s4);
-            s4 = peg$parsepoetic_digit_separator();
-          }
-        } else {
-          s3 = peg$FAILED;
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parsepoetic_digits();
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c293(s2, s4);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parsepoetic_digit();
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c294(s1);
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsepoetic_decimal_digit_separator() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 75,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parse_();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsepoetic_digit_separator();
-      if (s0 === peg$FAILED) {
-        if (input.charCodeAt(peg$currPos) === 46) {
-          s0 = peg$c116;
-          peg$currPos++;
-        } else {
-          s0 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c117); }
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsepoetic_decimal_digits() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 76,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    s2 = peg$parsepoetic_decimal_digit_separator();
-    while (s2 !== peg$FAILED) {
-      s1.push(s2);
-      s2 = peg$parsepoetic_decimal_digit_separator();
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parsepoetic_digit();
-      if (s2 !== peg$FAILED) {
-        s3 = [];
-        s4 = peg$parsepoetic_decimal_digit_separator();
-        if (s4 !== peg$FAILED) {
-          while (s4 !== peg$FAILED) {
-            s3.push(s4);
-            s4 = peg$parsepoetic_decimal_digit_separator();
-          }
-        } else {
-          s3 = peg$FAILED;
-        }
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parsepoetic_decimal_digits();
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c293(s2, s4);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parsepoetic_digit();
-      if (s1 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c294(s1);
-      }
-      s0 = s1;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsepoetic_digit() {
-    var s0, s1, s2;
-
-    var key    = peg$currPos * 95 + 77,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = [];
-    if (peg$c295.test(input.charAt(peg$currPos))) {
-      s2 = input.charAt(peg$currPos);
-      peg$currPos++;
-    } else {
-      s2 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c296); }
-    }
-    if (s2 !== peg$FAILED) {
-      while (s2 !== peg$FAILED) {
-        s1.push(s2);
-        if (peg$c295.test(input.charAt(peg$currPos))) {
-          s2 = input.charAt(peg$currPos);
-          peg$currPos++;
-        } else {
-          s2 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c296); }
-        }
-      }
-    } else {
-      s1 = peg$FAILED;
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c297(s1);
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsevariable() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 78,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsecommon_variable();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseproper_variable();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsepronoun();
-        if (s0 === peg$FAILED) {
-          s0 = peg$parsesimple_variable();
-        }
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsesimple_variable() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 79,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    s2 = peg$currPos;
-    s3 = peg$parseletter();
-    if (s3 !== peg$FAILED) {
-      s4 = [];
-      s5 = peg$parseletter();
-      while (s5 !== peg$FAILED) {
-        s4.push(s5);
-        s5 = peg$parseletter();
-      }
-      if (s4 !== peg$FAILED) {
-        s3 = [s3, s4];
-        s2 = s3;
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s2;
-      s2 = peg$FAILED;
-    }
-    if (s2 !== peg$FAILED) {
-      s1 = input.substring(s1, peg$currPos);
-    } else {
-      s1 = s2;
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = peg$currPos;
-      s2 = peg$c298(s1);
-      if (s2) {
-        s2 = peg$FAILED;
-      } else {
-        s2 = void 0;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c299(s1);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseproper_noun() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 80,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    s2 = peg$currPos;
-    s3 = peg$parseuppercase_letter();
-    if (s3 !== peg$FAILED) {
-      s4 = [];
-      s5 = peg$parseletter();
-      while (s5 !== peg$FAILED) {
-        s4.push(s5);
-        s5 = peg$parseletter();
-      }
-      if (s4 !== peg$FAILED) {
-        s3 = [s3, s4];
-        s2 = s3;
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s2;
-      s2 = peg$FAILED;
-    }
-    if (s2 !== peg$FAILED) {
-      s1 = input.substring(s1, peg$currPos);
-    } else {
-      s1 = s2;
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = peg$currPos;
-      s2 = peg$c300(s1);
-      if (s2) {
-        s2 = peg$FAILED;
-      } else {
-        s2 = void 0;
-      }
-      if (s2 !== peg$FAILED) {
-        peg$savedPos = s0;
-        s1 = peg$c301(s1);
-        s0 = s1;
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseproper_variable() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8;
-
-    var key    = peg$currPos * 95 + 81,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$currPos;
-    s2 = peg$currPos;
-    s3 = peg$parseproper_noun();
-    if (s3 !== peg$FAILED) {
-      s4 = [];
-      s5 = peg$currPos;
-      if (input.charCodeAt(peg$currPos) === 32) {
-        s6 = peg$c302;
-        peg$currPos++;
-      } else {
-        s6 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c303); }
-      }
-      if (s6 !== peg$FAILED) {
-        s7 = peg$currPos;
-        s8 = peg$parseproper_noun();
-        if (s8 !== peg$FAILED) {
-          s7 = input.substring(s7, peg$currPos);
-        } else {
-          s7 = s8;
-        }
-        if (s7 !== peg$FAILED) {
-          s6 = [s6, s7];
-          s5 = s6;
-        } else {
-          peg$currPos = s5;
-          s5 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s5;
-        s5 = peg$FAILED;
-      }
-      while (s5 !== peg$FAILED) {
-        s4.push(s5);
-        s5 = peg$currPos;
-        if (input.charCodeAt(peg$currPos) === 32) {
-          s6 = peg$c302;
-          peg$currPos++;
-        } else {
-          s6 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c303); }
-        }
-        if (s6 !== peg$FAILED) {
-          s7 = peg$currPos;
-          s8 = peg$parseproper_noun();
-          if (s8 !== peg$FAILED) {
-            s7 = input.substring(s7, peg$currPos);
-          } else {
-            s7 = s8;
-          }
-          if (s7 !== peg$FAILED) {
-            s6 = [s6, s7];
-            s5 = s6;
-          } else {
-            peg$currPos = s5;
-            s5 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s5;
-          s5 = peg$FAILED;
-        }
-      }
-      if (s4 !== peg$FAILED) {
-        s3 = [s3, s4];
-        s2 = s3;
-      } else {
-        peg$currPos = s2;
-        s2 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s2;
-      s2 = peg$FAILED;
-    }
-    if (s2 !== peg$FAILED) {
-      s1 = input.substring(s1, peg$currPos);
-    } else {
-      s1 = s2;
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c304(s1);
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecrement() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 82,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parseincrement();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsedecrement();
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseincrement() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
-
-    var key    = peg$currPos * 95 + 83,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c305) {
-      s1 = input.substr(peg$currPos, 5);
-      peg$currPos += 5;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c306); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsevariable();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = [];
-            s6 = peg$currPos;
-            if (input.substr(peg$currPos, 2).toLowerCase() === peg$c307) {
-              s7 = input.substr(peg$currPos, 2);
-              peg$currPos += 2;
-            } else {
-              s7 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c308); }
-            }
-            if (s7 !== peg$FAILED) {
-              s8 = [];
-              s9 = peg$parsenoise();
-              while (s9 !== peg$FAILED) {
-                s8.push(s9);
-                s9 = peg$parsenoise();
-              }
-              if (s8 !== peg$FAILED) {
-                s7 = [s7, s8];
-                s6 = s7;
-              } else {
-                peg$currPos = s6;
-                s6 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s6;
-              s6 = peg$FAILED;
-            }
-            if (s6 !== peg$FAILED) {
-              while (s6 !== peg$FAILED) {
-                s5.push(s6);
-                s6 = peg$currPos;
-                if (input.substr(peg$currPos, 2).toLowerCase() === peg$c307) {
-                  s7 = input.substr(peg$currPos, 2);
-                  peg$currPos += 2;
-                } else {
-                  s7 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c308); }
-                }
-                if (s7 !== peg$FAILED) {
-                  s8 = [];
-                  s9 = peg$parsenoise();
-                  while (s9 !== peg$FAILED) {
-                    s8.push(s9);
-                    s9 = peg$parsenoise();
-                  }
-                  if (s8 !== peg$FAILED) {
-                    s7 = [s7, s8];
-                    s6 = s7;
-                  } else {
-                    peg$currPos = s6;
-                    s6 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s6;
-                  s6 = peg$FAILED;
-                }
-              }
-            } else {
-              s5 = peg$FAILED;
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c309(s3, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsedecrement() {
-    var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
-
-    var key    = peg$currPos * 95 + 84,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 5).toLowerCase() === peg$c310) {
-      s1 = input.substr(peg$currPos, 5);
-      peg$currPos += 5;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c311); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsevariable();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            s5 = [];
-            s6 = peg$currPos;
-            if (input.substr(peg$currPos, 4).toLowerCase() === peg$c312) {
-              s7 = input.substr(peg$currPos, 4);
-              peg$currPos += 4;
-            } else {
-              s7 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c313); }
-            }
-            if (s7 !== peg$FAILED) {
-              s8 = [];
-              s9 = peg$parsenoise();
-              while (s9 !== peg$FAILED) {
-                s8.push(s9);
-                s9 = peg$parsenoise();
-              }
-              if (s8 !== peg$FAILED) {
-                s7 = [s7, s8];
-                s6 = s7;
-              } else {
-                peg$currPos = s6;
-                s6 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s6;
-              s6 = peg$FAILED;
-            }
-            if (s6 !== peg$FAILED) {
-              while (s6 !== peg$FAILED) {
-                s5.push(s6);
-                s6 = peg$currPos;
-                if (input.substr(peg$currPos, 4).toLowerCase() === peg$c312) {
-                  s7 = input.substr(peg$currPos, 4);
-                  peg$currPos += 4;
-                } else {
-                  s7 = peg$FAILED;
-                  if (peg$silentFails === 0) { peg$fail(peg$c313); }
-                }
-                if (s7 !== peg$FAILED) {
-                  s8 = [];
-                  s9 = peg$parsenoise();
-                  while (s9 !== peg$FAILED) {
-                    s8.push(s9);
-                    s9 = peg$parsenoise();
-                  }
-                  if (s8 !== peg$FAILED) {
-                    s7 = [s7, s8];
-                    s6 = s7;
-                  } else {
-                    peg$currPos = s6;
-                    s6 = peg$FAILED;
-                  }
-                } else {
-                  peg$currPos = s6;
-                  s6 = peg$FAILED;
-                }
-              }
-            } else {
-              s5 = peg$FAILED;
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c314(s3, s5);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsesplit() {
-    var s0, s1;
-
-    var key    = peg$currPos * 95 + 85,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 3).toLowerCase() === peg$c315) {
-      s1 = input.substr(peg$currPos, 3);
-      peg$currPos += 3;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c316); }
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c317) {
-        s1 = input.substr(peg$currPos, 5);
-        peg$currPos += 5;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c318); }
-      }
-      if (s1 === peg$FAILED) {
-        if (input.substr(peg$currPos, 7).toLowerCase() === peg$c319) {
-          s1 = input.substr(peg$currPos, 7);
-          peg$currPos += 7;
-        } else {
-          s1 = peg$FAILED;
-          if (peg$silentFails === 0) { peg$fail(peg$c320); }
-        }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c321();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsecast() {
-    var s0, s1;
-
-    var key    = peg$currPos * 95 + 86,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c322) {
-      s1 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c323); }
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c324) {
-        s1 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c325); }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c326();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsejoin() {
-    var s0, s1;
-
-    var key    = peg$currPos * 95 + 87,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c327) {
-      s1 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c328); }
-    }
-    if (s1 === peg$FAILED) {
-      if (input.substr(peg$currPos, 5).toLowerCase() === peg$c329) {
-        s1 = input.substr(peg$currPos, 5);
-        peg$currPos += 5;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c330); }
-      }
-    }
-    if (s1 !== peg$FAILED) {
-      peg$savedPos = s0;
-      s1 = peg$c331();
-    }
-    s0 = s1;
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsemutator() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 88,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsesplit();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parsecast();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsejoin();
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsemodifier() {
-    var s0, s1, s2, s3, s4;
-
-    var key    = peg$currPos * 95 + 89,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parse_();
-    if (s1 !== peg$FAILED) {
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c332) {
-        s2 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s2 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c333); }
-      }
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parse_();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parsenor();
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c334(s4);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsemutation() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 90,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    s1 = peg$parsemutator();
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parseassignable();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parsemodifier();
-          if (s4 === peg$FAILED) {
-            s4 = null;
-          }
-          if (s4 !== peg$FAILED) {
-            peg$savedPos = s0;
-            s1 = peg$c335(s1, s3, s4);
-            s0 = s1;
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      s1 = peg$parsemutator();
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parse_();
-        if (s2 !== peg$FAILED) {
-          s3 = peg$parsenor();
-          if (s3 !== peg$FAILED) {
-            s4 = peg$parsetarget();
-            if (s4 !== peg$FAILED) {
-              s5 = peg$parsemodifier();
-              if (s5 === peg$FAILED) {
-                s5 = null;
-              }
-              if (s5 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c336(s1, s3, s4, s5);
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parserounding() {
-    var s0;
-
-    var key    = peg$currPos * 95 + 91,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$parsefloor();
-    if (s0 === peg$FAILED) {
-      s0 = peg$parseceil();
-      if (s0 === peg$FAILED) {
-        s0 = peg$parsemath_round();
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsefloor() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 92,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) {
-      s1 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c338); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsevariable();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.substr(peg$currPos, 4).toLowerCase() === peg$c312) {
-              s5 = input.substr(peg$currPos, 4);
-              peg$currPos += 4;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c313); }
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c339(s3);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) {
-        s1 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c338); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parse_();
-        if (s2 !== peg$FAILED) {
-          if (input.substr(peg$currPos, 4).toLowerCase() === peg$c312) {
-            s3 = input.substr(peg$currPos, 4);
-            peg$currPos += 4;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c313); }
-          }
-          if (s3 !== peg$FAILED) {
-            s4 = peg$parse_();
-            if (s4 !== peg$FAILED) {
-              s5 = peg$parsevariable();
-              if (s5 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c339(s5);
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parseceil() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 93,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) {
-      s1 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c338); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsevariable();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.substr(peg$currPos, 2).toLowerCase() === peg$c307) {
-              s5 = input.substr(peg$currPos, 2);
-              peg$currPos += 2;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c308); }
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c340(s3);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) {
-        s1 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c338); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parse_();
-        if (s2 !== peg$FAILED) {
-          if (input.substr(peg$currPos, 2).toLowerCase() === peg$c307) {
-            s3 = input.substr(peg$currPos, 2);
-            peg$currPos += 2;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c308); }
-          }
-          if (s3 !== peg$FAILED) {
-            s4 = peg$parse_();
-            if (s4 !== peg$FAILED) {
-              s5 = peg$parsevariable();
-              if (s5 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c341(s5);
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-  function peg$parsemath_round() {
-    var s0, s1, s2, s3, s4, s5;
-
-    var key    = peg$currPos * 95 + 94,
-        cached = peg$resultsCache[key];
-
-    if (cached) {
-      peg$currPos = cached.nextPos;
-
-      return cached.result;
-    }
-
-    s0 = peg$currPos;
-    if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) {
-      s1 = input.substr(peg$currPos, 4);
-      peg$currPos += 4;
-    } else {
-      s1 = peg$FAILED;
-      if (peg$silentFails === 0) { peg$fail(peg$c338); }
-    }
-    if (s1 !== peg$FAILED) {
-      s2 = peg$parse_();
-      if (s2 !== peg$FAILED) {
-        s3 = peg$parsevariable();
-        if (s3 !== peg$FAILED) {
-          s4 = peg$parse_();
-          if (s4 !== peg$FAILED) {
-            if (input.substr(peg$currPos, 5).toLowerCase() === peg$c342) {
-              s5 = input.substr(peg$currPos, 5);
-              peg$currPos += 5;
-            } else {
-              s5 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c343); }
-            }
-            if (s5 === peg$FAILED) {
-              if (input.substr(peg$currPos, 6).toLowerCase() === peg$c344) {
-                s5 = input.substr(peg$currPos, 6);
-                peg$currPos += 6;
-              } else {
-                s5 = peg$FAILED;
-                if (peg$silentFails === 0) { peg$fail(peg$c345); }
-              }
-            }
-            if (s5 !== peg$FAILED) {
-              peg$savedPos = s0;
-              s1 = peg$c346(s3);
-              s0 = s1;
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    } else {
-      peg$currPos = s0;
-      s0 = peg$FAILED;
-    }
-    if (s0 === peg$FAILED) {
-      s0 = peg$currPos;
-      if (input.substr(peg$currPos, 4).toLowerCase() === peg$c337) {
-        s1 = input.substr(peg$currPos, 4);
-        peg$currPos += 4;
-      } else {
-        s1 = peg$FAILED;
-        if (peg$silentFails === 0) { peg$fail(peg$c338); }
-      }
-      if (s1 !== peg$FAILED) {
-        s2 = peg$parse_();
-        if (s2 !== peg$FAILED) {
-          if (input.substr(peg$currPos, 5).toLowerCase() === peg$c342) {
-            s3 = input.substr(peg$currPos, 5);
-            peg$currPos += 5;
-          } else {
-            s3 = peg$FAILED;
-            if (peg$silentFails === 0) { peg$fail(peg$c343); }
-          }
-          if (s3 === peg$FAILED) {
-            if (input.substr(peg$currPos, 6).toLowerCase() === peg$c344) {
-              s3 = input.substr(peg$currPos, 6);
-              peg$currPos += 6;
-            } else {
-              s3 = peg$FAILED;
-              if (peg$silentFails === 0) { peg$fail(peg$c345); }
-            }
-          }
-          if (s3 !== peg$FAILED) {
-            s4 = peg$parse_();
-            if (s4 !== peg$FAILED) {
-              s5 = peg$parsevariable();
-              if (s5 !== peg$FAILED) {
-                peg$savedPos = s0;
-                s1 = peg$c346(s5);
-                s0 = s1;
-              } else {
-                peg$currPos = s0;
-                s0 = peg$FAILED;
-              }
-            } else {
-              peg$currPos = s0;
-              s0 = peg$FAILED;
-            }
-          } else {
-            peg$currPos = s0;
-            s0 = peg$FAILED;
-          }
-        } else {
-          peg$currPos = s0;
-          s0 = peg$FAILED;
-        }
-      } else {
-        peg$currPos = s0;
-        s0 = peg$FAILED;
-      }
-    }
-
-    peg$resultsCache[key] = { nextPos: peg$currPos, result: s0 };
-
-    return s0;
-  }
-
-
-    /* initialiser code - this is JS that runs before the parser is generated */
-    const keywords = [
-      'mysterious',
-      'stronger','continue',
-      'between','greater','nothing','nowhere','smaller','whisper','without',
-      'ain\'t','around','bigger','listen','nobody','return','scream','taking','weaker','higher', 'strong',
-      'break','build','empty','false','great','knock','lower','right','round','shout', 
-      'small','take','takes','times','until','unite','while','wrong','minus',
-      'aint','back','cast','burn','join','down','else','give','gone','high','into','less','lies','null','plus','says','than','them','they','true','weak','were','your','over','with',
-      'and','big','her','him','hir','it ','low','nor','not','put','say','she','the','top','ver','was','xem','yes','zie','zir',
-      'an','as','at','he','if','is','it','my','no','of','ok','or','to','up','ve', 'xe','ze',
-      'a'
-    ]
-
-    function isKeyword(string) {
-      return keywords.includes(string.toLowerCase());
-    }
-
-
-  peg$result = peg$startRuleFunction();
-
-  if (peg$result !== peg$FAILED && peg$currPos === input.length) {
-    return peg$result;
-  } else {
-    if (peg$result !== peg$FAILED && peg$currPos < input.length) {
-      peg$fail(peg$endExpectation());
-    }
-
-    throw peg$buildStructuredError(
-      peg$maxFailExpected,
-      peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
-      peg$maxFailPos < input.length
-        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
-        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
-    );
-  }
-}
-
-module.exports = {
-  SyntaxError: peg$SyntaxError,
-  parse:       peg$parse
-};
diff --git a/satriani/test/comparison.js b/satriani/test/comparison.js
deleted file mode 100644
index c97a1c44..00000000
--- a/satriani/test/comparison.js
+++ /dev/null
@@ -1,43 +0,0 @@
-const interpreter = require('../satriani.interpreter.js');
-const assert = require('chai').assert;
-
-let tests = [
-    [true, true, true],
-    [true, false, false],
-    [false, true, false],
-    [false, false, true],
-    ["5",    5, true],
-    ["05.0", 5, true],
-    ["5.0",  5, true],
-    ["-10",  -10, true],
-    [false, null, true],
-    [true, null, false],
-    [0, null, true],
-    [1, null, false],
-    [undefined, undefined, true],
-    [undefined, 1, false],
-    [undefined, 0, true],
-    [undefined, null, true],
-    [false,5,false],
-    [5,false,false],
-    [false,0,true],
-    [0,false,true],
-    ["true", true, true],
-    ["lies", true, true],
-    ["false", true, true],
-    ["", false, true],
-    ["", true, false],
-    ["hello", "hello", true],
-    ["hello","world", false]
-];
-
-describe('comparison tests', function() {
-    tests.forEach(test => {
-        let lhs = test[0];
-        let rhs = test[1];
-        let out = test[2];
-        it(typeof (lhs) + ':' + JSON.stringify(lhs) + ' ' + (out  ? '==' : '!=') + ' ' + typeof (rhs) + ':' + JSON.stringify(rhs), function () {
-            assert.equal(interpreter.eq(lhs, rhs), test[2]);
-        });
-    });
-});
\ No newline at end of file
diff --git a/satriani/test/test.js b/satriani/test/test.js
deleted file mode 100644
index 4a3f8f86..00000000
--- a/satriani/test/test.js
+++ /dev/null
@@ -1,67 +0,0 @@
-const assert = require('chai').assert;
-const path = require('path');
-const fs = require('fs');
-const satriani = require('../satriani.js');
-const util = require('util');
-
-describe('failure tests', function() {
-    test_directory('../tests/failures/', execute_and_compare_error);
-});
-
-describe('feature tests', function() {
-    var fixtures = fs.readdirSync('../tests/fixtures');
-    fixtures.forEach(fixture => {
-        test_directory(path.join('../tests/fixtures/', fixture), execute_and_compare_output);
-    });
-});
-
-function test_directory(directory, predicate) {
-    describe(directory, function () {
-        var files = fs.readdirSync(directory);
-        files.forEach(file => {
-            if (/^\._/.test(file)) return; // skip ._ files that macOS drops all over some filesystems.
-            if (! /\.rock$/.test(file)) return;
-            it(file, function() {
-                predicate(path.join(directory,file));
-            });
-        });
-    });
-}
-
-function execute(source, inputs) {
-    let result = "";
-    // We pass arrays to util.inspect() here because we're looking for parity
-    // with console.log so we can run nodejs on the console to verify
-    // test behaviour.
-    let output = function(s) { result += (Array.isArray(s) ? util.inspect(s) : String(s))  + "\n"; };
-    let input = function() { return inputs.shift(); };
-    let rockstar = new satriani.Interpreter();
-    rockstar.run(source, input, output);
-    return result;
-}
-
-function execute_and_compare_output(file) {
-    let source = fs.readFileSync(file, 'utf8');
-    let inputs = [];
-    ['.in', '.in\''].forEach(ext => {
-        let inputsFile = file + ext;
-        if (fs.existsSync(inputsFile)) {
-            inputs = fs.readFileSync(inputsFile, 'utf8').split(/\n/g);
-            return;
-        }
-    });
-
-    let targetFile = file + '.out';
-    let target = fs.existsSync(targetFile) ? fs.readFileSync(targetFile, 'utf8') : '';
-    let actual = execute(source, inputs);
-    target = target.replace(/\r/g, '');
-    actual = actual.replace(/\r/g, '');
-    assert.equal(actual, target);
-}
-
-function execute_and_compare_error(file) {
-    let source = fs.readFileSync(file, 'utf8');
-    let targetFile = file + '.err';
-    let target = fs.existsSync(targetFile) ? fs.readFileSync(targetFile, 'utf8') : '';
-    assert.throws(function() { execute(source) }, Error, target);
-}
diff --git a/satriani/yarn.lock b/satriani/yarn.lock
deleted file mode 100644
index 067c7ad9..00000000
--- a/satriani/yarn.lock
+++ /dev/null
@@ -1,1373 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"acorn-node@^1.2.0", "acorn-node@^1.3.0", "acorn-node@^1.5.2", "acorn-node@^1.6.1":
-  "integrity" "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A=="
-  "resolved" "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz"
-  "version" "1.8.2"
-  dependencies:
-    "acorn" "^7.0.0"
-    "acorn-walk" "^7.0.0"
-    "xtend" "^4.0.2"
-
-"acorn-walk@^7.0.0":
-  "integrity" "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg=="
-  "resolved" "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz"
-  "version" "7.0.0"
-
-"acorn@^7.0.0":
-  "integrity" "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ=="
-  "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz"
-  "version" "7.1.0"
-
-"array-union@^1.0.1":
-  "integrity" "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk="
-  "resolved" "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz"
-  "version" "1.0.2"
-  dependencies:
-    "array-uniq" "^1.0.1"
-
-"array-uniq@^1.0.1":
-  "integrity" "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
-  "resolved" "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz"
-  "version" "1.0.3"
-
-"asn1.js@^4.0.0":
-  "integrity" "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw=="
-  "resolved" "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz"
-  "version" "4.10.1"
-  dependencies:
-    "bn.js" "^4.0.0"
-    "inherits" "^2.0.1"
-    "minimalistic-assert" "^1.0.0"
-
-"assert@^1.4.0":
-  "integrity" "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA=="
-  "resolved" "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz"
-  "version" "1.5.0"
-  dependencies:
-    "object-assign" "^4.1.1"
-    "util" "0.10.3"
-
-"assertion-error@^1.1.0":
-  "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="
-  "resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz"
-  "version" "1.1.0"
-
-"async@^2.6.1":
-  "integrity" "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg=="
-  "resolved" "https://registry.npmjs.org/async/-/async-2.6.3.tgz"
-  "version" "2.6.3"
-  dependencies:
-    "lodash" "^4.17.14"
-
-"balanced-match@^1.0.0":
-  "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-  "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz"
-  "version" "1.0.0"
-
-"base64-js@^1.0.2":
-  "integrity" "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
-  "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz"
-  "version" "1.3.1"
-
-"bn.js@^4.0.0", "bn.js@^4.1.0", "bn.js@^4.1.1":
-  "integrity" "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
-  "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz"
-  "version" "4.11.8"
-
-"bn.js@^4.11.9":
-  "integrity" "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
-  "resolved" "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz"
-  "version" "4.12.0"
-
-"brace-expansion@^1.1.7":
-  "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
-  "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
-  "version" "1.1.11"
-  dependencies:
-    "balanced-match" "^1.0.0"
-    "concat-map" "0.0.1"
-
-"brorand@^1.0.1", "brorand@^1.1.0":
-  "integrity" "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
-  "resolved" "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz"
-  "version" "1.1.0"
-
-"browser-pack@^6.0.1":
-  "integrity" "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA=="
-  "resolved" "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz"
-  "version" "6.1.0"
-  dependencies:
-    "combine-source-map" "~0.8.0"
-    "defined" "^1.0.0"
-    "JSONStream" "^1.0.3"
-    "safe-buffer" "^5.1.1"
-    "through2" "^2.0.0"
-    "umd" "^3.0.0"
-
-"browser-resolve@^1.11.0", "browser-resolve@^1.7.0":
-  "integrity" "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ=="
-  "resolved" "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz"
-  "version" "1.11.3"
-  dependencies:
-    "resolve" "1.1.7"
-
-"browser-stdout@1.3.1":
-  "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw=="
-  "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz"
-  "version" "1.3.1"
-
-"browserify-aes@^1.0.0", "browserify-aes@^1.0.4":
-  "integrity" "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="
-  "resolved" "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz"
-  "version" "1.2.0"
-  dependencies:
-    "buffer-xor" "^1.0.3"
-    "cipher-base" "^1.0.0"
-    "create-hash" "^1.1.0"
-    "evp_bytestokey" "^1.0.3"
-    "inherits" "^2.0.1"
-    "safe-buffer" "^5.0.1"
-
-"browserify-cipher@^1.0.0":
-  "integrity" "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w=="
-  "resolved" "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz"
-  "version" "1.0.1"
-  dependencies:
-    "browserify-aes" "^1.0.4"
-    "browserify-des" "^1.0.0"
-    "evp_bytestokey" "^1.0.0"
-
-"browserify-des@^1.0.0":
-  "integrity" "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A=="
-  "resolved" "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz"
-  "version" "1.0.2"
-  dependencies:
-    "cipher-base" "^1.0.1"
-    "des.js" "^1.0.0"
-    "inherits" "^2.0.1"
-    "safe-buffer" "^5.1.2"
-
-"browserify-rsa@^4.0.0":
-  "integrity" "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ="
-  "resolved" "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz"
-  "version" "4.0.1"
-  dependencies:
-    "bn.js" "^4.1.0"
-    "randombytes" "^2.0.1"
-
-"browserify-sign@^4.0.0":
-  "integrity" "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg="
-  "resolved" "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz"
-  "version" "4.0.4"
-  dependencies:
-    "bn.js" "^4.1.1"
-    "browserify-rsa" "^4.0.0"
-    "create-hash" "^1.1.0"
-    "create-hmac" "^1.1.2"
-    "elliptic" "^6.0.0"
-    "inherits" "^2.0.1"
-    "parse-asn1" "^5.0.0"
-
-"browserify-zlib@~0.2.0":
-  "integrity" "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="
-  "resolved" "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz"
-  "version" "0.2.0"
-  dependencies:
-    "pako" "~1.0.5"
-
-"browserify@^16.2.3":
-  "integrity" "sha512-6bfI3cl76YLAnCZ75AGu/XPOsqUhRyc0F/olGIJeCxtfxF2HvPKEcmjU9M8oAPxl4uBY1U7Nry33Q6koV3f2iw=="
-  "resolved" "https://registry.npmjs.org/browserify/-/browserify-16.5.0.tgz"
-  "version" "16.5.0"
-  dependencies:
-    "assert" "^1.4.0"
-    "browser-pack" "^6.0.1"
-    "browser-resolve" "^1.11.0"
-    "browserify-zlib" "~0.2.0"
-    "buffer" "^5.0.2"
-    "cached-path-relative" "^1.0.0"
-    "concat-stream" "^1.6.0"
-    "console-browserify" "^1.1.0"
-    "constants-browserify" "~1.0.0"
-    "crypto-browserify" "^3.0.0"
-    "defined" "^1.0.0"
-    "deps-sort" "^2.0.0"
-    "domain-browser" "^1.2.0"
-    "duplexer2" "~0.1.2"
-    "events" "^2.0.0"
-    "glob" "^7.1.0"
-    "has" "^1.0.0"
-    "htmlescape" "^1.1.0"
-    "https-browserify" "^1.0.0"
-    "inherits" "~2.0.1"
-    "insert-module-globals" "^7.0.0"
-    "JSONStream" "^1.0.3"
-    "labeled-stream-splicer" "^2.0.0"
-    "mkdirp" "^0.5.0"
-    "module-deps" "^6.0.0"
-    "os-browserify" "~0.3.0"
-    "parents" "^1.0.1"
-    "path-browserify" "~0.0.0"
-    "process" "~0.11.0"
-    "punycode" "^1.3.2"
-    "querystring-es3" "~0.2.0"
-    "read-only-stream" "^2.0.0"
-    "readable-stream" "^2.0.2"
-    "resolve" "^1.1.4"
-    "shasum" "^1.0.0"
-    "shell-quote" "^1.6.1"
-    "stream-browserify" "^2.0.0"
-    "stream-http" "^3.0.0"
-    "string_decoder" "^1.1.1"
-    "subarg" "^1.0.0"
-    "syntax-error" "^1.1.1"
-    "through2" "^2.0.0"
-    "timers-browserify" "^1.0.1"
-    "tty-browserify" "0.0.1"
-    "url" "~0.11.0"
-    "util" "~0.10.1"
-    "vm-browserify" "^1.0.0"
-    "xtend" "^4.0.0"
-
-"buffer-from@^1.0.0":
-  "integrity" "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
-  "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz"
-  "version" "1.1.1"
-
-"buffer-xor@^1.0.3":
-  "integrity" "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
-  "resolved" "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz"
-  "version" "1.0.3"
-
-"buffer@^5.0.2":
-  "integrity" "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A=="
-  "resolved" "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz"
-  "version" "5.4.3"
-  dependencies:
-    "base64-js" "^1.0.2"
-    "ieee754" "^1.1.4"
-
-"builtin-status-codes@^3.0.0":
-  "integrity" "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
-  "resolved" "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz"
-  "version" "3.0.0"
-
-"cached-path-relative@^1.0.0", "cached-path-relative@^1.0.2":
-  "integrity" "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg=="
-  "resolved" "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz"
-  "version" "1.0.2"
-
-"chai@^4.2.0":
-  "integrity" "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw=="
-  "resolved" "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz"
-  "version" "4.2.0"
-  dependencies:
-    "assertion-error" "^1.1.0"
-    "check-error" "^1.0.2"
-    "deep-eql" "^3.0.1"
-    "get-func-name" "^2.0.0"
-    "pathval" "^1.1.0"
-    "type-detect" "^4.0.5"
-
-"check-error@^1.0.2":
-  "integrity" "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII="
-  "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz"
-  "version" "1.0.2"
-
-"cipher-base@^1.0.0", "cipher-base@^1.0.1", "cipher-base@^1.0.3":
-  "integrity" "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q=="
-  "resolved" "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz"
-  "version" "1.0.4"
-  dependencies:
-    "inherits" "^2.0.1"
-    "safe-buffer" "^5.0.1"
-
-"combine-source-map@^0.8.0", "combine-source-map@~0.8.0":
-  "integrity" "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos="
-  "resolved" "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz"
-  "version" "0.8.0"
-  dependencies:
-    "convert-source-map" "~1.1.0"
-    "inline-source-map" "~0.6.0"
-    "lodash.memoize" "~3.0.3"
-    "source-map" "~0.5.3"
-
-"commander@^2.18.0":
-  "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
-  "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
-  "version" "2.20.3"
-
-"commander@2.15.1":
-  "integrity" "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag=="
-  "resolved" "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz"
-  "version" "2.15.1"
-
-"concat-map@0.0.1":
-  "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-  "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
-  "version" "0.0.1"
-
-"concat-stream@^1.6.0", "concat-stream@^1.6.1", "concat-stream@~1.6.0":
-  "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="
-  "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz"
-  "version" "1.6.2"
-  dependencies:
-    "buffer-from" "^1.0.0"
-    "inherits" "^2.0.3"
-    "readable-stream" "^2.2.2"
-    "typedarray" "^0.0.6"
-
-"console-browserify@^1.1.0":
-  "integrity" "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
-  "resolved" "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz"
-  "version" "1.2.0"
-
-"constants-browserify@~1.0.0":
-  "integrity" "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
-  "resolved" "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz"
-  "version" "1.0.0"
-
-"convert-source-map@~1.1.0":
-  "integrity" "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA="
-  "resolved" "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz"
-  "version" "1.1.3"
-
-"core-util-is@~1.0.0":
-  "integrity" "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-  "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
-  "version" "1.0.2"
-
-"create-ecdh@^4.0.0":
-  "integrity" "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw=="
-  "resolved" "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz"
-  "version" "4.0.3"
-  dependencies:
-    "bn.js" "^4.1.0"
-    "elliptic" "^6.0.0"
-
-"create-hash@^1.1.0", "create-hash@^1.1.2":
-  "integrity" "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="
-  "resolved" "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz"
-  "version" "1.2.0"
-  dependencies:
-    "cipher-base" "^1.0.1"
-    "inherits" "^2.0.1"
-    "md5.js" "^1.3.4"
-    "ripemd160" "^2.0.1"
-    "sha.js" "^2.4.0"
-
-"create-hmac@^1.1.0", "create-hmac@^1.1.2", "create-hmac@^1.1.4":
-  "integrity" "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="
-  "resolved" "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz"
-  "version" "1.1.7"
-  dependencies:
-    "cipher-base" "^1.0.3"
-    "create-hash" "^1.1.0"
-    "inherits" "^2.0.1"
-    "ripemd160" "^2.0.0"
-    "safe-buffer" "^5.0.1"
-    "sha.js" "^2.4.8"
-
-"crypto-browserify@^3.0.0":
-  "integrity" "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg=="
-  "resolved" "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz"
-  "version" "3.12.0"
-  dependencies:
-    "browserify-cipher" "^1.0.0"
-    "browserify-sign" "^4.0.0"
-    "create-ecdh" "^4.0.0"
-    "create-hash" "^1.1.0"
-    "create-hmac" "^1.1.0"
-    "diffie-hellman" "^5.0.0"
-    "inherits" "^2.0.1"
-    "pbkdf2" "^3.0.3"
-    "public-encrypt" "^4.0.0"
-    "randombytes" "^2.0.0"
-    "randomfill" "^1.0.3"
-
-"dash-ast@^1.0.0":
-  "integrity" "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA=="
-  "resolved" "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz"
-  "version" "1.0.0"
-
-"debug@3.1.0":
-  "integrity" "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g=="
-  "resolved" "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz"
-  "version" "3.1.0"
-  dependencies:
-    "ms" "2.0.0"
-
-"deep-eql@^3.0.1":
-  "integrity" "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw=="
-  "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz"
-  "version" "3.0.1"
-  dependencies:
-    "type-detect" "^4.0.0"
-
-"defined@^1.0.0":
-  "integrity" "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
-  "resolved" "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz"
-  "version" "1.0.0"
-
-"deps-sort@^2.0.0":
-  "integrity" "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw=="
-  "resolved" "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz"
-  "version" "2.0.1"
-  dependencies:
-    "JSONStream" "^1.0.3"
-    "shasum-object" "^1.0.0"
-    "subarg" "^1.0.0"
-    "through2" "^2.0.0"
-
-"des.js@^1.0.0":
-  "integrity" "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA=="
-  "resolved" "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz"
-  "version" "1.0.1"
-  dependencies:
-    "inherits" "^2.0.1"
-    "minimalistic-assert" "^1.0.0"
-
-"detective@^5.0.2":
-  "integrity" "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg=="
-  "resolved" "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz"
-  "version" "5.2.0"
-  dependencies:
-    "acorn-node" "^1.6.1"
-    "defined" "^1.0.0"
-    "minimist" "^1.1.1"
-
-"diff@3.5.0":
-  "integrity" "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
-  "resolved" "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz"
-  "version" "3.5.0"
-
-"diffie-hellman@^5.0.0":
-  "integrity" "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg=="
-  "resolved" "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz"
-  "version" "5.0.3"
-  dependencies:
-    "bn.js" "^4.1.0"
-    "miller-rabin" "^4.0.0"
-    "randombytes" "^2.0.0"
-
-"domain-browser@^1.2.0":
-  "integrity" "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
-  "resolved" "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz"
-  "version" "1.2.0"
-
-"duplexer2@^0.1.2", "duplexer2@~0.1.0", "duplexer2@~0.1.2":
-  "integrity" "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME="
-  "resolved" "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz"
-  "version" "0.1.4"
-  dependencies:
-    "readable-stream" "^2.0.2"
-
-"elliptic@^6.0.0":
-  "integrity" "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ=="
-  "resolved" "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz"
-  "version" "6.5.4"
-  dependencies:
-    "bn.js" "^4.11.9"
-    "brorand" "^1.1.0"
-    "hash.js" "^1.0.0"
-    "hmac-drbg" "^1.0.1"
-    "inherits" "^2.0.4"
-    "minimalistic-assert" "^1.0.1"
-    "minimalistic-crypto-utils" "^1.0.1"
-
-"email-addresses@^3.0.1":
-  "integrity" "sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg=="
-  "resolved" "https://registry.npmjs.org/email-addresses/-/email-addresses-3.1.0.tgz"
-  "version" "3.1.0"
-
-"escape-string-regexp@^1.0.2", "escape-string-regexp@1.0.5":
-  "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-  "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
-  "version" "1.0.5"
-
-"events@^2.0.0":
-  "integrity" "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg=="
-  "resolved" "https://registry.npmjs.org/events/-/events-2.1.0.tgz"
-  "version" "2.1.0"
-
-"evp_bytestokey@^1.0.0", "evp_bytestokey@^1.0.3":
-  "integrity" "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="
-  "resolved" "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz"
-  "version" "1.0.3"
-  dependencies:
-    "md5.js" "^1.3.4"
-    "safe-buffer" "^5.1.1"
-
-"fast-safe-stringify@^2.0.7":
-  "integrity" "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
-  "resolved" "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz"
-  "version" "2.0.7"
-
-"filename-reserved-regex@^1.0.0":
-  "integrity" "sha1-5hz4BfDeHJhFZ9A4bcXfUO5a9+Q="
-  "resolved" "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-1.0.0.tgz"
-  "version" "1.0.0"
-
-"filenamify-url@^1.0.0":
-  "integrity" "sha1-syvYExnvWGO3MHi+1Q9GpPeXX1A="
-  "resolved" "https://registry.npmjs.org/filenamify-url/-/filenamify-url-1.0.0.tgz"
-  "version" "1.0.0"
-  dependencies:
-    "filenamify" "^1.0.0"
-    "humanize-url" "^1.0.0"
-
-"filenamify@^1.0.0":
-  "integrity" "sha1-qfL/0RxQO+0wABUCknI3jx8TZaU="
-  "resolved" "https://registry.npmjs.org/filenamify/-/filenamify-1.2.1.tgz"
-  "version" "1.2.1"
-  dependencies:
-    "filename-reserved-regex" "^1.0.0"
-    "strip-outer" "^1.0.0"
-    "trim-repeated" "^1.0.0"
-
-"fs-extra@^7.0.0":
-  "integrity" "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw=="
-  "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz"
-  "version" "7.0.1"
-  dependencies:
-    "graceful-fs" "^4.1.2"
-    "jsonfile" "^4.0.0"
-    "universalify" "^0.1.0"
-
-"fs.realpath@^1.0.0":
-  "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-  "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
-  "version" "1.0.0"
-
-"function-bind@^1.1.1":
-  "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-  "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
-  "version" "1.1.1"
-
-"get-assigned-identifiers@^1.2.0":
-  "integrity" "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ=="
-  "resolved" "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz"
-  "version" "1.2.0"
-
-"get-func-name@^2.0.0":
-  "integrity" "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE="
-  "resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz"
-  "version" "2.0.0"
-
-"gh-pages@^2.0.1":
-  "integrity" "sha512-yNW2SFp9xGRP/8Sk2WXuLI/Gn92oOL4HBgudn6PsqAnuWT90Y1tozJoTfX1WdrDSW5Rb90kLVOf5mm9KJ/2fDw=="
-  "resolved" "https://registry.npmjs.org/gh-pages/-/gh-pages-2.1.1.tgz"
-  "version" "2.1.1"
-  dependencies:
-    "async" "^2.6.1"
-    "commander" "^2.18.0"
-    "email-addresses" "^3.0.1"
-    "filenamify-url" "^1.0.0"
-    "fs-extra" "^7.0.0"
-    "globby" "^6.1.0"
-    "graceful-fs" "^4.1.11"
-    "rimraf" "^2.6.2"
-
-"glob@^7.0.3", "glob@^7.1.0", "glob@^7.1.3":
-  "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA=="
-  "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz"
-  "version" "7.1.6"
-  dependencies:
-    "fs.realpath" "^1.0.0"
-    "inflight" "^1.0.4"
-    "inherits" "2"
-    "minimatch" "^3.0.4"
-    "once" "^1.3.0"
-    "path-is-absolute" "^1.0.0"
-
-"glob@7.1.2":
-  "integrity" "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ=="
-  "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz"
-  "version" "7.1.2"
-  dependencies:
-    "fs.realpath" "^1.0.0"
-    "inflight" "^1.0.4"
-    "inherits" "2"
-    "minimatch" "^3.0.4"
-    "once" "^1.3.0"
-    "path-is-absolute" "^1.0.0"
-
-"globby@^6.1.0":
-  "integrity" "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw="
-  "resolved" "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz"
-  "version" "6.1.0"
-  dependencies:
-    "array-union" "^1.0.1"
-    "glob" "^7.0.3"
-    "object-assign" "^4.0.1"
-    "pify" "^2.0.0"
-    "pinkie-promise" "^2.0.0"
-
-"graceful-fs@^4.1.11", "graceful-fs@^4.1.2", "graceful-fs@^4.1.6":
-  "integrity" "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
-  "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz"
-  "version" "4.2.3"
-
-"growl@1.10.5":
-  "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA=="
-  "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz"
-  "version" "1.10.5"
-
-"has-flag@^3.0.0":
-  "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
-  "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
-  "version" "3.0.0"
-
-"has@^1.0.0":
-  "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
-  "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
-  "version" "1.0.3"
-  dependencies:
-    "function-bind" "^1.1.1"
-
-"hash-base@^3.0.0":
-  "integrity" "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg="
-  "resolved" "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz"
-  "version" "3.0.4"
-  dependencies:
-    "inherits" "^2.0.1"
-    "safe-buffer" "^5.0.1"
-
-"hash.js@^1.0.0", "hash.js@^1.0.3":
-  "integrity" "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="
-  "resolved" "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz"
-  "version" "1.1.7"
-  dependencies:
-    "inherits" "^2.0.3"
-    "minimalistic-assert" "^1.0.1"
-
-"he@1.1.1":
-  "integrity" "sha1-k0EP0hsAlzUVH4howvJx80J+I/0="
-  "resolved" "https://registry.npmjs.org/he/-/he-1.1.1.tgz"
-  "version" "1.1.1"
-
-"hmac-drbg@^1.0.1":
-  "integrity" "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE="
-  "resolved" "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz"
-  "version" "1.0.1"
-  dependencies:
-    "hash.js" "^1.0.3"
-    "minimalistic-assert" "^1.0.0"
-    "minimalistic-crypto-utils" "^1.0.1"
-
-"htmlescape@^1.1.0":
-  "integrity" "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E="
-  "resolved" "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz"
-  "version" "1.1.1"
-
-"https-browserify@^1.0.0":
-  "integrity" "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
-  "resolved" "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz"
-  "version" "1.0.0"
-
-"humanize-url@^1.0.0":
-  "integrity" "sha1-9KuZ4NKIF0yk4eUEB8VfuuRk7/8="
-  "resolved" "https://registry.npmjs.org/humanize-url/-/humanize-url-1.0.1.tgz"
-  "version" "1.0.1"
-  dependencies:
-    "normalize-url" "^1.0.0"
-    "strip-url-auth" "^1.0.0"
-
-"ieee754@^1.1.4":
-  "integrity" "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
-  "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz"
-  "version" "1.1.13"
-
-"inflight@^1.0.4":
-  "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
-  "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
-  "version" "1.0.6"
-  dependencies:
-    "once" "^1.3.0"
-    "wrappy" "1"
-
-"inherits@^2.0.1", "inherits@^2.0.3", "inherits@^2.0.4", "inherits@~2.0.1", "inherits@~2.0.3", "inherits@2":
-  "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-  "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
-  "version" "2.0.4"
-
-"inherits@2.0.1":
-  "integrity" "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
-  "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
-  "version" "2.0.1"
-
-"inherits@2.0.3":
-  "integrity" "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-  "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
-  "version" "2.0.3"
-
-"inline-source-map@~0.6.0":
-  "integrity" "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU="
-  "resolved" "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz"
-  "version" "0.6.2"
-  dependencies:
-    "source-map" "~0.5.3"
-
-"insert-module-globals@^7.0.0":
-  "integrity" "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw=="
-  "resolved" "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz"
-  "version" "7.2.0"
-  dependencies:
-    "acorn-node" "^1.5.2"
-    "combine-source-map" "^0.8.0"
-    "concat-stream" "^1.6.1"
-    "is-buffer" "^1.1.0"
-    "JSONStream" "^1.0.3"
-    "path-is-absolute" "^1.0.1"
-    "process" "~0.11.0"
-    "through2" "^2.0.0"
-    "undeclared-identifiers" "^1.1.2"
-    "xtend" "^4.0.0"
-
-"is-buffer@^1.1.0":
-  "integrity" "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
-  "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz"
-  "version" "1.1.6"
-
-"is-plain-obj@^1.0.0":
-  "integrity" "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
-  "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz"
-  "version" "1.1.0"
-
-"isarray@~1.0.0":
-  "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-  "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
-  "version" "1.0.0"
-
-"json-stable-stringify@~0.0.0":
-  "integrity" "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U="
-  "resolved" "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz"
-  "version" "0.0.1"
-  dependencies:
-    "jsonify" "~0.0.0"
-
-"jsonfile@^4.0.0":
-  "integrity" "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss="
-  "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz"
-  "version" "4.0.0"
-  optionalDependencies:
-    "graceful-fs" "^4.1.6"
-
-"jsonify@~0.0.0":
-  "integrity" "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
-  "resolved" "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz"
-  "version" "0.0.0"
-
-"jsonparse@^1.2.0":
-  "integrity" "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
-  "resolved" "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz"
-  "version" "1.3.1"
-
-"JSONStream@^1.0.3":
-  "integrity" "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="
-  "resolved" "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz"
-  "version" "1.3.5"
-  dependencies:
-    "jsonparse" "^1.2.0"
-    "through" ">=2.2.7 <3"
-
-"labeled-stream-splicer@^2.0.0":
-  "integrity" "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw=="
-  "resolved" "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz"
-  "version" "2.0.2"
-  dependencies:
-    "inherits" "^2.0.1"
-    "stream-splicer" "^2.0.0"
-
-"lodash.memoize@~3.0.3":
-  "integrity" "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8="
-  "resolved" "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz"
-  "version" "3.0.4"
-
-"lodash@^4.17.14":
-  "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-  "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
-  "version" "4.17.21"
-
-"md5.js@^1.3.4":
-  "integrity" "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="
-  "resolved" "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz"
-  "version" "1.3.5"
-  dependencies:
-    "hash-base" "^3.0.0"
-    "inherits" "^2.0.1"
-    "safe-buffer" "^5.1.2"
-
-"miller-rabin@^4.0.0":
-  "integrity" "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA=="
-  "resolved" "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz"
-  "version" "4.0.1"
-  dependencies:
-    "bn.js" "^4.0.0"
-    "brorand" "^1.0.1"
-
-"minimalistic-assert@^1.0.0", "minimalistic-assert@^1.0.1":
-  "integrity" "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
-  "resolved" "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"
-  "version" "1.0.1"
-
-"minimalistic-crypto-utils@^1.0.1":
-  "integrity" "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
-  "resolved" "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
-  "version" "1.0.1"
-
-"minimatch@^3.0.4", "minimatch@3.0.4":
-  "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA=="
-  "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz"
-  "version" "3.0.4"
-  dependencies:
-    "brace-expansion" "^1.1.7"
-
-"minimist@^1.1.0", "minimist@^1.1.1":
-  "integrity" "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-  "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz"
-  "version" "1.2.0"
-
-"minimist@0.0.8":
-  "integrity" "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
-  "resolved" "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
-  "version" "0.0.8"
-
-"mkdirp@^0.5.0", "mkdirp@0.5.1":
-  "integrity" "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM="
-  "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz"
-  "version" "0.5.1"
-  dependencies:
-    "minimist" "0.0.8"
-
-"mocha@^5.2.0":
-  "integrity" "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ=="
-  "resolved" "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz"
-  "version" "5.2.0"
-  dependencies:
-    "browser-stdout" "1.3.1"
-    "commander" "2.15.1"
-    "debug" "3.1.0"
-    "diff" "3.5.0"
-    "escape-string-regexp" "1.0.5"
-    "glob" "7.1.2"
-    "growl" "1.10.5"
-    "he" "1.1.1"
-    "minimatch" "3.0.4"
-    "mkdirp" "0.5.1"
-    "supports-color" "5.4.0"
-
-"module-deps@^6.0.0":
-  "integrity" "sha512-UnEn6Ah36Tu4jFiBbJVUtt0h+iXqxpLqDvPS8nllbw5RZFmNJ1+Mz5BjYnM9ieH80zyxHkARGLnMIHlPK5bu6A=="
-  "resolved" "https://registry.npmjs.org/module-deps/-/module-deps-6.2.1.tgz"
-  "version" "6.2.1"
-  dependencies:
-    "browser-resolve" "^1.7.0"
-    "cached-path-relative" "^1.0.2"
-    "concat-stream" "~1.6.0"
-    "defined" "^1.0.0"
-    "detective" "^5.0.2"
-    "duplexer2" "^0.1.2"
-    "inherits" "^2.0.1"
-    "JSONStream" "^1.0.3"
-    "parents" "^1.0.0"
-    "readable-stream" "^2.0.2"
-    "resolve" "^1.4.0"
-    "stream-combiner2" "^1.1.1"
-    "subarg" "^1.0.0"
-    "through2" "^2.0.0"
-    "xtend" "^4.0.0"
-
-"ms@2.0.0":
-  "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-  "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
-  "version" "2.0.0"
-
-"normalize-url@^1.0.0":
-  "integrity" "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw="
-  "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz"
-  "version" "1.9.1"
-  dependencies:
-    "object-assign" "^4.0.1"
-    "prepend-http" "^1.0.0"
-    "query-string" "^4.1.0"
-    "sort-keys" "^1.0.0"
-
-"object-assign@^4.0.1", "object-assign@^4.1.0", "object-assign@^4.1.1":
-  "integrity" "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-  "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
-  "version" "4.1.1"
-
-"once@^1.3.0":
-  "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
-  "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
-  "version" "1.4.0"
-  dependencies:
-    "wrappy" "1"
-
-"os-browserify@~0.3.0":
-  "integrity" "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
-  "resolved" "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz"
-  "version" "0.3.0"
-
-"pako@~1.0.5":
-  "integrity" "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw=="
-  "resolved" "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz"
-  "version" "1.0.10"
-
-"parents@^1.0.0", "parents@^1.0.1":
-  "integrity" "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E="
-  "resolved" "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz"
-  "version" "1.0.1"
-  dependencies:
-    "path-platform" "~0.11.15"
-
-"parse-asn1@^5.0.0":
-  "integrity" "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ=="
-  "resolved" "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz"
-  "version" "5.1.5"
-  dependencies:
-    "asn1.js" "^4.0.0"
-    "browserify-aes" "^1.0.0"
-    "create-hash" "^1.1.0"
-    "evp_bytestokey" "^1.0.0"
-    "pbkdf2" "^3.0.3"
-    "safe-buffer" "^5.1.1"
-
-"path-browserify@~0.0.0":
-  "integrity" "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
-  "resolved" "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz"
-  "version" "0.0.1"
-
-"path-is-absolute@^1.0.0", "path-is-absolute@^1.0.1":
-  "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-  "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
-  "version" "1.0.1"
-
-"path-parse@^1.0.6":
-  "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-  "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
-  "version" "1.0.7"
-
-"path-platform@~0.11.15":
-  "integrity" "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I="
-  "resolved" "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz"
-  "version" "0.11.15"
-
-"pathval@^1.1.0":
-  "integrity" "sha1-uULm1L3mUwBe9rcTYd74cn0GReA="
-  "resolved" "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz"
-  "version" "1.1.0"
-
-"pbkdf2@^3.0.3":
-  "integrity" "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA=="
-  "resolved" "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz"
-  "version" "3.0.17"
-  dependencies:
-    "create-hash" "^1.1.2"
-    "create-hmac" "^1.1.4"
-    "ripemd160" "^2.0.1"
-    "safe-buffer" "^5.0.1"
-    "sha.js" "^2.4.8"
-
-"pegjs@^0.10.0":
-  "integrity" "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0="
-  "resolved" "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz"
-  "version" "0.10.0"
-
-"pify@^2.0.0":
-  "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
-  "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
-  "version" "2.3.0"
-
-"pinkie-promise@^2.0.0":
-  "integrity" "sha1-ITXW36ejWMBprJsXh3YogihFD/o="
-  "resolved" "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
-  "version" "2.0.1"
-  dependencies:
-    "pinkie" "^2.0.0"
-
-"pinkie@^2.0.0":
-  "integrity" "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
-  "resolved" "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
-  "version" "2.0.4"
-
-"prepend-http@^1.0.0":
-  "integrity" "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
-  "resolved" "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz"
-  "version" "1.0.4"
-
-"process-nextick-args@~2.0.0":
-  "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
-  "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
-  "version" "2.0.1"
-
-"process@~0.11.0":
-  "integrity" "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
-  "resolved" "https://registry.npmjs.org/process/-/process-0.11.10.tgz"
-  "version" "0.11.10"
-
-"public-encrypt@^4.0.0":
-  "integrity" "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q=="
-  "resolved" "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz"
-  "version" "4.0.3"
-  dependencies:
-    "bn.js" "^4.1.0"
-    "browserify-rsa" "^4.0.0"
-    "create-hash" "^1.1.0"
-    "parse-asn1" "^5.0.0"
-    "randombytes" "^2.0.1"
-    "safe-buffer" "^5.1.2"
-
-"punycode@^1.3.2":
-  "integrity" "sha1-wNWmOycYgArY4esPpSachN1BhF4="
-  "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz"
-  "version" "1.4.1"
-
-"punycode@1.3.2":
-  "integrity" "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
-  "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz"
-  "version" "1.3.2"
-
-"query-string@^4.1.0":
-  "integrity" "sha1-u7aTucqRXCMlFbIosaArYJBD2+s="
-  "resolved" "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz"
-  "version" "4.3.4"
-  dependencies:
-    "object-assign" "^4.1.0"
-    "strict-uri-encode" "^1.0.0"
-
-"querystring-es3@~0.2.0":
-  "integrity" "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
-  "resolved" "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz"
-  "version" "0.2.1"
-
-"querystring@0.2.0":
-  "integrity" "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
-  "resolved" "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz"
-  "version" "0.2.0"
-
-"randombytes@^2.0.0", "randombytes@^2.0.1", "randombytes@^2.0.5":
-  "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="
-  "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
-  "version" "2.1.0"
-  dependencies:
-    "safe-buffer" "^5.1.0"
-
-"randomfill@^1.0.3":
-  "integrity" "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw=="
-  "resolved" "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz"
-  "version" "1.0.4"
-  dependencies:
-    "randombytes" "^2.0.5"
-    "safe-buffer" "^5.1.0"
-
-"read-only-stream@^2.0.0":
-  "integrity" "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A="
-  "resolved" "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz"
-  "version" "2.0.0"
-  dependencies:
-    "readable-stream" "^2.0.2"
-
-"readable-stream@^2.0.2", "readable-stream@^2.2.2", "readable-stream@~2.3.6":
-  "integrity" "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw=="
-  "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz"
-  "version" "2.3.6"
-  dependencies:
-    "core-util-is" "~1.0.0"
-    "inherits" "~2.0.3"
-    "isarray" "~1.0.0"
-    "process-nextick-args" "~2.0.0"
-    "safe-buffer" "~5.1.1"
-    "string_decoder" "~1.1.1"
-    "util-deprecate" "~1.0.1"
-
-"readable-stream@^3.0.6":
-  "integrity" "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ=="
-  "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz"
-  "version" "3.4.0"
-  dependencies:
-    "inherits" "^2.0.3"
-    "string_decoder" "^1.1.1"
-    "util-deprecate" "^1.0.1"
-
-"readline-sync@^1.4.9":
-  "integrity" "sha512-gNva8/6UAe8QYepIQH/jQ2qn91Qj0B9sYjMBBs3QOB8F2CXcKgLxQaJRP76sWVRQt+QU+8fAkCbCvjjMFu7Ycw=="
-  "resolved" "https://registry.npmjs.org/readline-sync/-/readline-sync-1.4.10.tgz"
-  "version" "1.4.10"
-
-"resolve@^1.1.4", "resolve@^1.4.0":
-  "integrity" "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w=="
-  "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz"
-  "version" "1.13.1"
-  dependencies:
-    "path-parse" "^1.0.6"
-
-"resolve@1.1.7":
-  "integrity" "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
-  "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz"
-  "version" "1.1.7"
-
-"rimraf@^2.6.2":
-  "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
-  "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
-  "version" "2.7.1"
-  dependencies:
-    "glob" "^7.1.3"
-
-"ripemd160@^2.0.0", "ripemd160@^2.0.1":
-  "integrity" "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA=="
-  "resolved" "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz"
-  "version" "2.0.2"
-  dependencies:
-    "hash-base" "^3.0.0"
-    "inherits" "^2.0.1"
-
-"safe-buffer@^5.0.1", "safe-buffer@^5.1.0", "safe-buffer@^5.1.1", "safe-buffer@^5.1.2", "safe-buffer@~5.2.0":
-  "integrity" "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
-  "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz"
-  "version" "5.2.0"
-
-"safe-buffer@~5.1.0", "safe-buffer@~5.1.1":
-  "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-  "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
-  "version" "5.1.2"
-
-"sha.js@^2.4.0", "sha.js@^2.4.8", "sha.js@~2.4.4":
-  "integrity" "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="
-  "resolved" "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz"
-  "version" "2.4.11"
-  dependencies:
-    "inherits" "^2.0.1"
-    "safe-buffer" "^5.0.1"
-
-"shasum-object@^1.0.0":
-  "integrity" "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg=="
-  "resolved" "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz"
-  "version" "1.0.0"
-  dependencies:
-    "fast-safe-stringify" "^2.0.7"
-
-"shasum@^1.0.0":
-  "integrity" "sha1-5wEjENj0F/TetXEhUOVni4euVl8="
-  "resolved" "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz"
-  "version" "1.0.2"
-  dependencies:
-    "json-stable-stringify" "~0.0.0"
-    "sha.js" "~2.4.4"
-
-"shell-quote@^1.6.1":
-  "integrity" "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
-  "resolved" "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz"
-  "version" "1.7.2"
-
-"simple-concat@^1.0.0":
-  "integrity" "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
-  "resolved" "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz"
-  "version" "1.0.0"
-
-"sort-keys@^1.0.0":
-  "integrity" "sha1-RBttTTRnmPG05J6JIK37oOVD+a0="
-  "resolved" "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz"
-  "version" "1.1.2"
-  dependencies:
-    "is-plain-obj" "^1.0.0"
-
-"source-map@~0.5.3":
-  "integrity" "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-  "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
-  "version" "0.5.7"
-
-"stream-browserify@^2.0.0":
-  "integrity" "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg=="
-  "resolved" "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz"
-  "version" "2.0.2"
-  dependencies:
-    "inherits" "~2.0.1"
-    "readable-stream" "^2.0.2"
-
-"stream-combiner2@^1.1.1":
-  "integrity" "sha1-+02KFCDqNidk4hrUeAOXvry0HL4="
-  "resolved" "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz"
-  "version" "1.1.1"
-  dependencies:
-    "duplexer2" "~0.1.0"
-    "readable-stream" "^2.0.2"
-
-"stream-http@^3.0.0":
-  "integrity" "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw=="
-  "resolved" "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz"
-  "version" "3.1.0"
-  dependencies:
-    "builtin-status-codes" "^3.0.0"
-    "inherits" "^2.0.1"
-    "readable-stream" "^3.0.6"
-    "xtend" "^4.0.0"
-
-"stream-splicer@^2.0.0":
-  "integrity" "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg=="
-  "resolved" "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz"
-  "version" "2.0.1"
-  dependencies:
-    "inherits" "^2.0.1"
-    "readable-stream" "^2.0.2"
-
-"strict-uri-encode@^1.0.0":
-  "integrity" "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
-  "resolved" "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz"
-  "version" "1.1.0"
-
-"string_decoder@^1.1.1":
-  "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
-  "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
-  "version" "1.3.0"
-  dependencies:
-    "safe-buffer" "~5.2.0"
-
-"string_decoder@~1.1.1":
-  "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="
-  "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
-  "version" "1.1.1"
-  dependencies:
-    "safe-buffer" "~5.1.0"
-
-"strip-outer@^1.0.0":
-  "integrity" "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg=="
-  "resolved" "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz"
-  "version" "1.0.1"
-  dependencies:
-    "escape-string-regexp" "^1.0.2"
-
-"strip-url-auth@^1.0.0":
-  "integrity" "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164="
-  "resolved" "https://registry.npmjs.org/strip-url-auth/-/strip-url-auth-1.0.1.tgz"
-  "version" "1.0.1"
-
-"subarg@^1.0.0":
-  "integrity" "sha1-9izxdYHplrSPyWVpn1TAauJouNI="
-  "resolved" "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz"
-  "version" "1.0.0"
-  dependencies:
-    "minimist" "^1.1.0"
-
-"supports-color@5.4.0":
-  "integrity" "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w=="
-  "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz"
-  "version" "5.4.0"
-  dependencies:
-    "has-flag" "^3.0.0"
-
-"syntax-error@^1.1.1":
-  "integrity" "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w=="
-  "resolved" "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz"
-  "version" "1.4.0"
-  dependencies:
-    "acorn-node" "^1.2.0"
-
-"through@>=2.2.7 <3":
-  "integrity" "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
-  "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
-  "version" "2.3.8"
-
-"through2@^2.0.0":
-  "integrity" "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="
-  "resolved" "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz"
-  "version" "2.0.5"
-  dependencies:
-    "readable-stream" "~2.3.6"
-    "xtend" "~4.0.1"
-
-"timers-browserify@^1.0.1":
-  "integrity" "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0="
-  "resolved" "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz"
-  "version" "1.4.2"
-  dependencies:
-    "process" "~0.11.0"
-
-"trim-repeated@^1.0.0":
-  "integrity" "sha1-42RqLqTokTEr9+rObPsFOAvAHCE="
-  "resolved" "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz"
-  "version" "1.0.0"
-  dependencies:
-    "escape-string-regexp" "^1.0.2"
-
-"tty-browserify@0.0.1":
-  "integrity" "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
-  "resolved" "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz"
-  "version" "0.0.1"
-
-"type-detect@^4.0.0", "type-detect@^4.0.5":
-  "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
-  "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz"
-  "version" "4.0.8"
-
-"typedarray@^0.0.6":
-  "integrity" "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
-  "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
-  "version" "0.0.6"
-
-"umd@^3.0.0":
-  "integrity" "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow=="
-  "resolved" "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz"
-  "version" "3.0.3"
-
-"undeclared-identifiers@^1.1.2":
-  "integrity" "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw=="
-  "resolved" "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz"
-  "version" "1.1.3"
-  dependencies:
-    "acorn-node" "^1.3.0"
-    "dash-ast" "^1.0.0"
-    "get-assigned-identifiers" "^1.2.0"
-    "simple-concat" "^1.0.0"
-    "xtend" "^4.0.1"
-
-"universalify@^0.1.0":
-  "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
-  "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz"
-  "version" "0.1.2"
-
-"url@~0.11.0":
-  "integrity" "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE="
-  "resolved" "https://registry.npmjs.org/url/-/url-0.11.0.tgz"
-  "version" "0.11.0"
-  dependencies:
-    "punycode" "1.3.2"
-    "querystring" "0.2.0"
-
-"util-deprecate@^1.0.1", "util-deprecate@~1.0.1":
-  "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-  "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
-  "version" "1.0.2"
-
-"util@~0.10.1":
-  "integrity" "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="
-  "resolved" "https://registry.npmjs.org/util/-/util-0.10.4.tgz"
-  "version" "0.10.4"
-  dependencies:
-    "inherits" "2.0.3"
-
-"util@0.10.3":
-  "integrity" "sha1-evsa/lCAUkZInj23/g7TeTNqwPk="
-  "resolved" "https://registry.npmjs.org/util/-/util-0.10.3.tgz"
-  "version" "0.10.3"
-  dependencies:
-    "inherits" "2.0.1"
-
-"vm-browserify@^1.0.0":
-  "integrity" "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
-  "resolved" "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz"
-  "version" "1.1.2"
-
-"wrappy@1":
-  "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-  "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
-  "version" "1.0.2"
-
-"xtend@^4.0.0", "xtend@^4.0.1", "xtend@^4.0.2", "xtend@~4.0.1":
-  "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
-  "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz"
-  "version" "4.0.2"
diff --git a/spec.md b/spec.md
deleted file mode 100644
index f7a7de62..00000000
--- a/spec.md
+++ /dev/null
@@ -1,657 +0,0 @@
-## The Rockstar Language Specification
-
-Rockstar is intended to give the programmer an unprecedented degree of poetic license when it comes to the composition and structure of their programs. 
-
-### File format
-
-Rockstar programs are [UTF-8](https://en.wikipedia.org/wiki/UTF-8) files with the `.rock` file extension. *(Given that for everything included in the current Rockstar specification, UTF-8 is indistinguishable from 7-bit ASCII, that's a fancy way of saying they're plain text files.)*
-
-### Comments 
-
-The use of comments in Rockstar programs is strongly discouraged. This is rock'n'roll; it's up to the audience to find their own meaning. If you absolutely insist on commenting your Rockstar programs, comments should be contained in parentheses (). Yes, this means you can't use brackets in arithmetic expressions and may need to decompose complex expressions into multiple evaluations and assignments. 
-
-There is, however, a good use for comments - to mark up your code so people know how to play it!  Comment delimiters "{}" and "[]" are now available, as well.  These are used by the [ChordPro](https://www.chordpro.org/) musical notation system.
-
-Rockstar developers are not into that whole [brevity thing](https://www.urbandictionary.com/define.php?term=Brevity%20Thing). 
-
-``` 
-(Initialise Tommy = 1337)
-Tommy was a big bad brother. 
-```
-
-### Variables
-
-Rockstar supports three kinds of variable names.
-
-**Simple variables** are valid identifiers that are not language keywords. A simple variable name must contain only letters, and cannot contain spaces. Note that Rockstar does not allow numbers or underscores in variable names - remember the golden rule of Rockstar syntax: if you can't sing it, you can't have it. Simple variables are case-insensitive.
-
-```
-Variable is 1
-Tommy is a rockstar
-X is 2
-Y is 3
-Put x plus y into result
-```
-
-**Common variables** consist of one of the keywords `a`, `an`, `the`, `my`, `your` or `our` followed by whitespace and a unique variable name, which must contain only lowercase ASCII letters a-z. The keyword is part of the variable name, so `a boy` is a different variable from `the boy`. Common variables are case-insensitive.
-
-```
-My variable is 5
-Your variable is 4
-
-Put my variable plus your variable into the total
-Shout the total
-```
-
-**Proper variables** are multi-word proper nouns - words that aren't language keywords, each starting with an uppercase letter, separated by spaces. (Single-word variables are always simple variables.) Whilst some developers may use this feature to create variables with names like `Customer ID`, `Tax Rate` or `Distance In KM`, we recommend you favour idiomatic variable names such as `Doctor Feelgood`, `Mister Crowley`,  `Tom Sawyer`, and `Billie Jean`. 
-
-(Although not strictly idiomatic, `Eleanor Rigby`, `Peggy Sue`, `Black Betty`, and `Johnny B Goode` would also all be valid variable names in Rockstar.)
-
-As in Ruby, Python and VBScript, variables are dynamically typed and you don't need to declare variables before use.
-
-If a variable is defined outside of a function, it is in global scope. Global scope variables are available everywhere below their first initialization. If a variable is defined inside of a function, it is in local scope. Local scope variables are available from their initialization until the end of the function they are defined in.
-
-While within a function, if you write to a variable that has been defined in global scope, you write to that variable; you do not define a new local variable.
-
-#### A note on case sensitivity in Rockstar
-
-Rockstar keywords and variable names are all case-insensitive, with the exception of proper variables. Proper variables are case-insensitive **apart from the first letter of each word, which must be a capital letter.**
-
-* `TIME`, `time`, `tIMe`, `TIMe` are all equivalent. Simple variables are case-insensitive.
-* `MY HEART`, `my heart`, `My Heart` - are all equivalent; the keyword `my` triggers **common variable** behaviour
-* `Tom Sawyer`, `TOM SAWYER`, `TOm SAWyer` - are all equivalent; the capital `S` on `Sawyer` triggers **proper variable** behaviour
-* `DOCTOR feelgood` is not a valid Rockstar variable; the lowercase `f` on `feelgood` does not match any valid variable naming style and so the variable name is not valid.
-
-#### Pronouns
-
-The keywords `it`, `he`, `she`, `him`, `her`, `they`, `them`, `ze`, `hir`, `zie`, `zir`, `xe`, `xem`, `ve`, and `ver` refer to the variable which was most recently assigned a value.
-
-(Please don't file issues pointing out that 80s rockers were a bunch of misogynists and gender-inclusive pronouns aren't really idiomatic. You're right, we know, and we've all learned a lot since then. Besides, [*Look What The Cat Dragged In*](https://en.wikipedia.org/wiki/Look_What_the_Cat_Dragged_In) was recorded by four cishet guys who spent more money on lipgloss and hairspray than they did on studio time, and it's an absolute classic.)
-
-### Types
-
-Rockstar uses a similar type system to that defined by the [ECMAScript type system](http://www.ecma-international.org/ecma-262/5.1/#sec-8), except `undefined` doesn't sound very rock'n'roll so we use `mysterious` instead.
-
-* **Mysterious** - the value of any variable that hasn't been assigned a value, denoted by the keyword `mysterious`
-* **Null** - the null type. Evaluates as equal to zero and equal to false. The keywords `nothing`, `nowhere`, `nobody`, and `gone` are defined as aliases for `null`
-* **Boolean** - a logical entity having two values `true` and `false`. *(The keywords `maybe` and `definitely maybe` are reserved for future use)*
- * `right`, `yes` and `ok` are valid aliases for `true`
- * `wrong`, `no` and `lies` are valid aliases for `false`
-* **Number** - Numbers in Rockstar are double-precision floating point numbers, stored according to the [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) standard. *(An earlier version of this spec proposed that Rockstar used the [DEC64](http://www.dec64.com/) numeric type. This is a perfect example of something that seemed like a great idea after a couple of beers but turns out to be prohibitively difficult to implement...)*
-* **String** - Rockstar strings are sequences of 16-bit unsigned integer values representing UTF-16 code units. `empty`, `silent`, and `silence` are aliases for the empty string (`""`).
-
-Functions and function identifiers are not strictly part of the type system in Rockstar 1.0.
-
-## Arrays
-
-Rockstar supports JavaScript-style arrays. Arrays are zero-based, and dynamically 
-allocated when values are assigned using numeric indexes.
-
-```$rockstar
-Let the array at 0 be "zero"
-Let the array at 1 be "one"
-Let the array at 255 be "big"
-Shout the array at 0
-Shout the array at 255
-```
-
-Returning an array in a scalar context will return the current length of the array:
-
-```$rockstar
-Let my array at 255 be "some value"
-Shout my array (will print the value 256)
-```
-
-Rockstar also supports non-numeric array keys, so it is valid to say:
-
-```
-let my array at "some_key" be "some_value"
-Shout my array at "some_key"
-```
-
-You can mix string and numeric keys within the same array. The array length property 
-ignores any non-numeric keys:
-
-```
-Let my array at "some_key" be "some_value"
-Shout my array (will print 0, since there are no numeric indexes)
-Let my array at 7 be "some other value"
-Shout my array (will now print 8, since assigning my array at 7 modifies the array length)
-```
-
-You can also use array index syntax to read (but not write) specific characters from a string
-
-```$
-Let my string be "abcdefg"
-Shout my string at 0 (will print "a")
-Shout my string at 1 (will print "b")
-Let the character be my string at 2
-```
-
-### Queue operations
-
-Rockstar arrays can also be created and manipulated by the queue operations `rock` and `roll`. (The aliases `push` and `pop` are supported for Rockstar developers who are into 80s dance music.)
-
-#### Pushing elements onto an array
-
-To create a new empty array, `rock` the name of the array:
-
-```
-Rock the array (the array is now [])
-```
-
-To push an element onto the end of an array:
-
-```
-Rock the array with the element
-```
-
-This supports list expressions, so you can push multiple elements onto the end of an array:
-
-```
-Rock ints with 1, 2, 3 (ints is now [1, 2, 3])
-Rock the array with the first, the second, and the third
-```
-
-Remember the `with` keyword is context-sensitive, so in this example:
-
-```
-Rock ints with 1, 2 with 3, 4, 5
-          ^         ^
-          |         +-- this 'with' is the binary addition operator
-          |
-          +------------ this 'with' is part of the array push syntax
-          
-(ints is now [ 1, 5, 4, 5 ])
-```
-
-Rockstar supports a special syntax for pushing poetic literals onto a queue:
-
-```rockstar
-Rock the array like the poetic literal (the array is now [ 367 ])
-Rock the array like a wolf (the array is now [ 367, 14 ])
-```
-
-This syntax is very useful for initialising strings without using string literals - see below. It also means that the following line is valid Rockstar:
-
-```
-Rock you like a hurricane (you is now [ 19 ])
-```
-
-#### Popping elements from an array
-
-The `roll` keyword will remove the first element from an array and return the element that was removed.
-
-```
-Rock ints with 1, 2, 3
-Roll ints (returns 1; ints is now [ 2, 3 ])
-Roll ints (returns 2; ints is now [ 3 ])
-Roll ints (returns 3; ints is now [] )
-Roll ints (returns mysterious; ints is now [])
-```
-
-`roll` can be used in assignments:
-
-```
-Rock ints with 1, 2, 3
-Let the first be roll ints
-Let the second be roll ints
-Let the third be roll ints
-Shout the first (outputs 1)
-Shout the second (outputs 2)
-Shout the third (outputs 3)
-```
-
-Rockstar also supports a special `roll x into y` syntax for removing the first element from an array and assigning it to a variable:
-
-```
-Rock the list with 4, 5, 6
-Roll the list into foo
-Roll the list into bar
-Roll the list into baz
-Shout foo (will output 4)
-Shout bar (will output 5)
-Shout baz (will output 6)
-```
-
-### Splitting strings and type conversions
-
-#### A note about mutations
-
-Some operations in Rockstar will either act in-place, modifying the variable passed to them, or will leave the
-source variable unmodified and place their output into a target variable. These operations are known as mutation 
-operations, and they all have the following syntax:
-
-* `Modify X` - acts in-place 
-* `Modify X into Y` - leave `X` alone and put modified output into `Y`
-* `Modify X with Z` - modify `X` in-place, with optional parameter `Z`
-* `Modify X into Y with Z` - modify `X`, using parameter `Z`, and put results in `Y`
-
-Note that in-place mutations are **only valid where the first argument is a variable**:
-
-#### Splitting Strings
-
-To split a string in Rockstar, use the `cut` mutation (aliases `split` and `shatter`)
-
-String splitting can either operate in-place, or place results into an output variable.
-You can specify an optional delimiter; if no delimiter is provided, the string is split
-into a character array.
-
-```
-Split "a,b,c" into the array (the array is ["a", ",", "b", ",", "c"])
-Split "a,b,c" into the array with "," (the array is ["a", "b", "c"])
-Split my string (my string will split in-place to an array of characters)
-Split my string with x (split my string in-place using the current value of x as a delimiter)
-
-Cut my life into pieces 
-  (split my life, put the resulting array in pieces)
-
-Cut your cake with my knife
-  (modify your cake in-place, by splitting it using my knife as a delimiter)
-
-Shatter my heart into pieces with your lies
-   (Split my heart, using your lies as a delimiter, and put the result into pieces)
-```
-
-In-place string splitting is only valid when the first argument is a variable; the 
-following would be invalid (because where would the result actually go?)
-
-```$
-Split "a,b,c,d,e" with "," (NOT VALID - nowhere to place the output)
-Split "a,b,c,d,e" into tokens with "," (valid - tokens now contains ["a","b","c","d","e"])
-```
-
-#### Joining Arrays
-
-To join an array in Rockstar, use the `join` mutation, or the alias `unite`
-
-```
-Let the string be "abcde"
-Split the string into tokens
-Join tokens with ";"
-    (the tokens now contains "a;b;c;d;e")
-
-The input says hey now hey now now
-Split the input into words with " "
-Unite words into the output with "! "
-    (the output now contains "hey! now! hey! now! now!")
-```
-
-#### Parsing numbers and character codes
-
-Use the `cast` mutation (alias `burn`) to parse strings into numbers, or to convert numbers into their corresponding Unicode characters.
-
-```$rockstar
-Let X be "123.45"
-Cast X
-    (X now contains the numeric value 123.45)
-Let X be "ff"
-Cast X with 16
-    (X now contains the numeric value 255 - OxFF)
-Cast "12345" into result
-    (result now contains the number 12345)
-Cast "aa" into result with 16
-    (result now contains the number 170 - 0xAA)
-
-Cast 65 into result
-    (result now contains the string "A" - ASCII code 65)
-
-Cast 1046 into result
-    (result now contains the Cyrillic letter "Ж" - Unicode code point 1046)
-```
-
-### Truthiness
-
-The results of comparisons often rely on a concept called 'truthiness'. If the value is truthy, it will be implicitly converted to true. If it is falsy, it will be implicitly converted to false.
-
-- Mysterious - Falsy
-- Null - Falsy
-- Boolean - Truthy if True, Falsy if False
-- Number - If equal to zero, falsy. Otherwise, truthy.
-- String - Truthy (null is the falsy equivalent)
-
-### Constants vs Keywords
-
-Words that are used to construct a literal of a certain type are referred to as **constants** and words that are used to construct various syntax constructs are referred to as **keywords**
-
-| Constant     | Aliases                                |
-| ------------ | -------------------------------------- |
-| `mysterious` | -                                      |
-| `null`       | `nothing`, `nowhere`, `nobody`, `gone` |
-| `true`       | `right`, `yes`, `ok`                   |
-| `false`      | `wrong`, `no`, `lies`                  |
-| `empty`      | `silent`, `silence`                    |
-
-### Literals and Assignment
-
-String literals in Rockstar use double quotes. 
-
-* `"Hello San Francisco"`
-
-Numeric literals in Rockstar are written as decimal numbers
-
-* `123`
-* `3.141592654`
-
-Assignment is done using either `put  into ` or `let  be `:
-
-
-* `Put 123 into X` will assign the value `123` to the variable `X`
-* `Put "Hello San Francisco" into the message` will assign the value `"Hello San Francisco"` to the variable `the message`
-* `Let my balance be 1000000` will store the value `1000000` in the variable `my balance`
-* `Let the survivors be the brave without the fallen` will subtract `the fallen` from `the brave` and store the result in `the survivors`
-
-The keyword `in` is an alias for `into`.
-
-#### Single Quotes
-
-Given Rockstar's intriguing ancestral mixture of computer programming, creative English and idiomatic rock'n'roll, the single quote character presents all sorts of challenges.
-
-Most programming languages use the single quote for quoting literal strings - `'like this'`. English, when written using the basic ASCII character set, often uses the single quote to stand in for the apostrophe to denote contractions or possessives - `you're, she's, he's, shouldn't, rock'n'roll`. Rock'n'roll uses the apostrophe apparently at random - `sweet child o' mine`, `ain't talkin' 'bout love`, `guns n' roses`.
-
-Given three such dramatically different influences, here's how Rockstar interprets single quotes.
-
-1. The sequence `'s` or `'re` appearing at the end of a word is equivalent to ` is`, except when used in poetic literals.
-
-   * This allows `Janie's got a gun` (initialises `Janie` with the value `313`) and `Union's been on strike` (initialises `Union` with the value `426`) as valid variable declarations. `We're here to see the show` initialises `We` with the value `42334`.
-   * You can also use `'s` and `'re` in comparisons: `If Janie's gone` tests whether `Janie` is `null`.
-
-2. All other single quotes are then ignored. `ain't` is equivalent to `aint`, `wakin'` has five letters, and `'''''` is equal to the empty string. This means you can use single quotes freely throughout your program to punctuate, adjust word lengths and generally channel the spirit of rock'n'roll without worrying about compiler errors. 
-
-`The fire's burning Tommy's feet` initialises `the fire` with the value `764`.
-
-#### Increment and Decrement
-
-Increment and decrement are supported by the `Build {variable} up` and `Knock {variable} down` statements. Adding more than one `up` or `down` in the statement will increment or decrement the same amount of times as you have `up`s or `down`s in the statement. There may be a comma between each `up` and `down`.
-
-* `Build my world up` will increment the value stored in `my world` by 1.
-* `Knock the walls down` will decrement the value stored in `the walls` by 1
-* `Knock the walls down, down` will decrement the value stored in `the walls` by 2
-
-#### Operators
-
-Rockstar supports the infix arithmetic operators `+`, `-`, `*` and `/`. The language includes aliases for each operator so you can write lyrically pleasing expressions.
-
-| Operator | Operation         | Aliases            |
-| -------- | ----------------- | ------------------ |
-| +        | addition          | `plus`, `with` .   |
-| -        | subtraction       | `minus`, `without` |
-| *        | multiplication    | `times`, `of`      |
-| /        | division          | `over`, `between`  |
-
-The alias `by` has been explicitly rejected because of disagreements between the colloquial English `ten by four` (i.e. `10*4 = 40`) and `ten (divided) by four` (i.e. `10/4 = 2.5`)
-
-Examples:
-
-* `Put the whole of your heart into my hands` - multiply `your heart` by `the whole` and assign the result to `my hands`
-
-* `My world is nothing without your love` - Initialize `my world` with the result of subtracting `your love` from 0
-
-* `If the tears of a child are nothing` - check whether `the tears` * `a child` = 0
-
-* `My heart over the moon` - Returns `my heart` divided by `the moon`
-
-#### Compound Assignment Operators
-
-As in many C-style languages, Rockstar supports compound assignment operators, providing a terser syntax for storing the result of an operation. This is done using the `let` keyword.
-
-* `Let X be with 10` - add `10` to `X` and store the result in `X`. (Equivalent to `X += 10`)
-* `Let the children be without fear` - subtract `fear` from `the children` and store the result in `the children`
-* `Let my heart be over the moon` - equivalent to `my heart /= the moon`
-
-#### Arithmetic Rounding
-
-Rounding in Rockstar is performed by the `turn` keyword. `Turn up` will round up (i.e. towards positive infinity), to the nearest integer; `turn down` will round down (towards negative infinity) to the nearest integer, and `turn round` will round to the nearest integer. Bonnie Tyler enthusiasts will be pleased to note that Rockstar accepts `turn around` as a valid alias.
-
-Turn operations act in-place: they modify the variable directly, and will return the rounded value.
-
-```
-X is 1.2
-Turn up X
-Shout X (will print 2)
-
-X is 1.2
-Turn down X
-Shout X (will print 1)
-
-The radio's playing. The night has just begun. 
- (initialises the radio with 7.35345)
-Turn up the radio
-Say the radio (will print 8)
-```
-Rounding supports variable [pronouns](#pronouns), so you can write phrases like:
-
-```
-My heart is on fire. Aflame with desire.
-Turn it up.
-Shout it.
-```
-
-which will print the value 25 (obviously).
-
-#### List Arithmetic
-
-Rockstar operators support a list of expressions on the right-hand side of the operator. (Imagine explaining in English that, say, "the restaurant bill is the food, plus the drinks, the service, and the tax" - same idea.)
-
-* `Let X be 1 with 2, 3, 4` - shorthand for `X = 1 + 2 + 3 + 4`
-* `Let X be "foo" with "bar", and "baz"` - X will be `"foo" + "bar" + "baz"`
-
-You can combine list arithmetic with compound assignment, as with this example:
-
-```
-The wolf is hungry, out on the street (initialise the_wolf = 63236)
-Fear is the mind killer (fear = 346)
-Fury is the demon child (fury = 355)
-Hate is the only truth (hate = 345)
-Let the wolf be without fear, fury, and hate (the_wolf = the_wolf - 346 - 355 - 345) 
-Shout the wolf (output 62190)
-```
-
-List arithmetic is only possible where the result type supports further operations.
-
-* `Let X be "foo" times 2, 2, 2` - OK; X is `"foofoofoofoofoofoofoofoo"`
-* `Let X be 2 times "foo", "bar"` - is `mysterious` (because `2 * foo = "foofoo"`, and `"foofoo" * "bar"` is undefined)
-
-#### Poetic Literals
-
-Rockstar also supports a unique language feature known as **poetic literals**. Inspired by the [here-document](https://en.wikipedia.org/wiki/Here_document) syntax supported by many scripting languages, poetic literals allow the programmer to simultaneously initialize a variable and express their innermost angst.
-
-##### Poetic Constant Literals
-
-A poetic constant literal is a single line consisting of a variable name, the `is` keyword, or the aliases `are`, `was` or `were`, and a constant signifying the value the variable will be set to.
-
-* `My heart is true` - initialises the variable `my heart` with the Boolean value `true` 
-* `Tommy is nobody` - initialises the variable `Tommy` with the value `null` using the `nobody` alias
-* `Tommy is mysterious` - initialises the variable `Tommy` with the value `mysterious`.
-
-##### Poetic String Literals
-
-A poetic string literal assignment starts with a variable name, followed by one of the keywords `say`, `says` or `said` followed by a single space. The rest of the line up to the `\n` terminator is treated as an unquoted string literal.
-
-* `Peter says Hello San Francisco!\n` will initialise the variable `Peter` with the string literal `"Hello San Francisco!"`.
-* `San Francisco says Hello back\n` will initialise the variable `San Francisco` with the string literal `Hello back`.
-* `You say I'm no good for you\n` will initialise the variable `You` with the string literal `I'm no good for you`.
-* `My parents said we'd never make it\n` will initialise the variable `My parents` with the string literal `we'd never make it`.
-
-#### Poetic Number Literals
-
-A poetic number literal begins with a variable name, followed by the keyword `is`, or the aliases `are`, `was` or `were`. As long as the next symbol is not a Literal Word, the rest of the line is treated as a decimal number in which the values of consecutive digits are given by the lengths of the subsequent barewords, up until the end of the line. To allow the digit zero, and to compensate for a lack of suitably rock'n'roll 1- and 2-letter words, word lengths are parsed modulo 10. A period (.) character denotes a decimal place. Other than the first period, any non-alphabetical characters are ignored.
-
-* `Tommy was a lovestruck ladykiller` initialises `Tommy` with the value `100`
-* `Sweet Lucy was a dancer` - initialises `Sweet Lucy` with the value 16
-* `A killer is on the loose` - initialises `a killer` with the value 235.
-* `My dreams were ice. A life unfulfilled; wakin' everybody up, taking booze and pills` - initialises `my dreams` with the value `3.1415926535`
-* `Tommy was without` initialises `Tommy` with the value `7` because `without` is a Reserved Keyword, but not a Literal Word.
- * Note that poetic literals **can** include Reserved Keywords, as with `taking` in this example.
- * The hyphen (`-`) is counted as a letter – so you can use terms like 'all-consuming' (13 letters > 3) and
-    'power-hungry' (12 letters > 2) instead of having to think of 12- and 13-letter words.
- * The semi-colon, comma, apostrophe and any other non-alphabetical characters are ignored.
-
-### Comparison
-
-Similar to the single-equals operator in Visual Basic and some scripting languages, the `is` keyword in Rockstar is interpreted differently depending whether it appears as part of a statement or as part of an expression. `isn't` is the logical negation of the `is` keyword.
-
-Comparison in Rockstar can only be done within an expression.
-
-* `Tommy is nobody` initialises the variable `Tommy` with the value `nobody`
-* `If Tommy is nobody` - will execute the following block if, and only if, the variable `Tommy` is equal to `nobody`
-
-Comparison can also be done with any alias of `is`:
-
-* `If he's gone`
-* `If we are the future`
-* `If the cat was mysterious`
-* `If dreams were real`
-
-The keyword `ain't` (which is reduced to `aint` by Rockstar) is an alias for `isn't`. This usage runs contrary to idiomatic English, where "Tommy isn't anybody", "Tommy ain't nobody" and "Tommy ain't not nobody" somehow mean exactly the same thing.
-
-`aren't`, `wasn't`, and `weren't` are also aliases for `isn't`.
-
-Rockstar also supports the following comparison syntax:
-
-* `is higher/greater/bigger/stronger than` to denote 'greater than'
-* `is lower/less/smaller/weaker than` to denote 'less than'
-* `is as high/great/big/strong as` to denote 'greater than or equal to'
-* `is as low/little/small/weak as` to denote 'less than or equal to'
-
-### Logical Operations
-
-Rockstar has 4 different logical operators that first convert their operand(s) to a boolean by truthiness.
-
-* `A and B` returns the [Conjunction](https://en.wikipedia.org/wiki/AND_gate)
-* `A or B` returns the [Disjunction](https://en.wikipedia.org/wiki/OR_gate)
-* `A nor B` returns the [Joint Denial](https://en.wikipedia.org/wiki/NOR_gate)
-* `not A` returns the [Negation](https://en.wikipedia.org/wiki/Inverter_(logic_gate)) of its single argument.
-
-All logical operators are short circuiting. This means if evaluating the first argument to the operator guarantees a result, the other argument is not evaluated. `false and 1 over 0` is `false` and does not produce an error for dividing by zero.
-
-### Input/Output
-
-Use the `Listen` keyword to read one line of input from `STDIN`. Use `Listen to` to capture the input into a named variable.
-
-* `Listen to your heart` - read one line of input from `STDIN` and store it in `your heart`
-
-Use the `Say` keyword to write the value of a variable to `STDOUT`.
-
-* `Say Tommy` - will output the value stored in `Tommy` to `STDOUT`
-
-Rockstar defines `Shout`, `Whisper` and `Scream` as aliases for `Say`
-
-The following examples all use c style syntax for explaining what things do.
-
-### Types Continued
-
-#### Operator Precedence
-
-The higher, the tighter the binding. This is the precedence we generally expect from our math.
-
-1. Function Call (greedy arguments)
-2. Logical NOT (right-associative)
-3. Multiplication and Division (left-associative)
-4. Addition and Subtraction (left-associative)
-5. Comparison operators (left-associative)
-6. `and`, `or`, and `nor` (left-associative)
-
-##### Examples
-
-- `A taking B times C plus not D times E and F` is equivalent to `((A(B) * C) + (!D * E)) && F`
-
-#### Binary Comparison
-
-Equality comparisons (`is`, `ain't`, `is not`) are allowed between types if they are the same type or they can be compared by the rules below. Two arrays are equal if their elements are equal.
-
-Ordering comparisons (`is higher than`, `is lower than`, `is as high as`, and `is as low as`) are only allowed if the operands are both Numbers or both Strings or they are converted to such an arrangement according to the rules below. Numbers are compared as expected. Strings are compared lexicographically.
-
-- \ \ Mysterious =\> Equal.
-- \ \ Mysterious =\> Non equal.
-- String \ Number =\> Convert the string to a number using base 10 with leading zeros ignored. If it fails, return false.
-- String \ Boolean =\> Convert the string to a boolean. The empty string is false; all other strings are true.
-- String \ Null =\> Non equal.
-- Number \ Boolean =\> Convert number to boolean by "truthiness".
-- Number \ Null =\> Convert null to 0.
-- Boolean \ Null =\> Convert null to false.
-
-##### Examples
-
-- `"1" is 1` evaluates to true because `"1"` gets converted to the number `1`
-- `"2" ain't Mysterious` evaluates to true because all types are non equal to mysterious, besides mysterious itself. 
-- `"02" < "10"` is true because the lexicographical comparison between `0` and `1` shows that the first string is less than the second string.
-- `True < 10` is an error because `10` gets coerced into `True` due to the comparison with a boolean and there are no allowed ordering comparisons between booleans.
-
-#### Increment and Decrement Operators
-
-- \ String =\> Error
-- \ Boolean =\> Invert Boolean
-- \ Null =\> coerce to zero (`My world is nothing / build my world up` can be used to initialise a counter loop, for example.)
-- \ Mysterious =\> Error
-
-#### Binary Operators
-
-Conversions other than those listed are errors.
-
-- String \ Number =\> Convert the number to a base-10 string, retaining all precision, but removing unnecessary digits. A leading zero is considered necessary for numbers with no whole part, eg. `00.1000` gets serialized to `0.1`
-- String \ Boolean =\> Convert the boolean to `true` or `false`
-- String \ Null =\> Convert the null to `"null"`
-- String \ Mysterious =\> Convert the mysterious to `"mysterious"`
-- String \ Number =\> String gets repeated \ times
-
-### Flow Control and Block Syntax
-
-#### Conditionals
-
-Conditional expressions start with the `If` keyword, followed by an expression. If the expression evaluates to `true`, then the subsequent code block is executed. Optionally, an `Else` block can be written after an `If` block. The code block following the `Else` keyword would be executed if the `If` expression evaluated to `false`.
-
-For the purpose of conditional expressions, 0, `mysterious`, `null`, `false`, and the empty string all evaluate to `false`, and everything else to `true`.
-
-#### Loops
-
-Similar to the `If` statement, a loop is denoted by the `While` or `Until` keyword, which will cause the subsequent code block to be executed repeatedly whilst the expression is satisfied:
-
-```
-Tommy was a dancer
-While Tommy ain't nothing,
-Knock Tommy down
-```
-
-That'll initialize Tommy with the value 16 (using the poetic number literal syntax) and then loop, decrementing Tommy by 1 each time until Tommy equals zero (i.e `ain't nothing` returns false).
-
-
-The `break` and `continue` statements work as they do in most block-based languages. Rockstar defines `Break it down` as an alias for `break` and `Take it to the top` as an alias for `continue` 
-
-#### Blocks
-
-A block in Rockstar starts with an `If`, `Else`, `While` or `Until` statement, and is terminated by a blank line or the end-of-file. EOF ends all open code blocks
-
-```
-Tommy was a dancer
-While Tommy ain't nothing
-Shout it
-Knock it down
-
-```
-
-### Functions
-
-Functions are declared with a variable name followed by the `takes` keyword (alias `wants`) and a list of arguments separated by one of the following: `and` `,` `&` `, and` `'n'`
-
-* `Multiply takes X and Y`
-* `Search takes Needle and Haystack`
-* `Polly wants a cracker`
-
-The function body is a list of statements with no separating blank lines. A blank line denotes the end of a function body. Functions in Rockstar always have a return value, specified by the `return` keyword and its aliases `give` and `send`. For historical reasons, `give back` is also supported as an alias for `return`, and the return statement can be followed by the keyword `back` (which has no effect but can make code more lyrical). 
-
-```
-(This function adds 9 to its input and returns the result)
-Polly wants a cracker
-Cheese is delicious
-Put a cracker with cheese into your mouth
-Give it back
-```
-
-Functions are called using the 'taking' keyword and must have at least one argument. Multiple arguments are separated with one of the following: `,` `&` `, and` `'n'`.
-
-Arguments may be any valid expression, including literals, arithmetic expressions and function calls.
-
-* `Multiply taking 3, 5` is an expression returning (presumably) 15
-* `Search taking "hands", "lay your hands on me"`
-* `Put Multiply taking 3, 5, and 9 into Large` will set Large to `3 * 5 * 9` **NOT** `(3 * 5) && 9`.
diff --git a/tests/README.md b/tests/README.md
deleted file mode 100644
index 7f3edce0..00000000
--- a/tests/README.md
+++ /dev/null
@@ -1,9 +0,0 @@
-# The Rockstar Test Suite
-
-The test suite is a set of Rockstar programs and their expected output.
-
-It is completely implementation agnostic. To validate your own Rockstar implementation against the 
-official test suite, run each Rockstar program in the suite and compare the output with the associated `.rock.out`
-file.
-
-For programs that read input from the console, your test harness should read input from the `.rock.in` file.
\ No newline at end of file
diff --git a/tests/failures/invalid_comments.rock b/tests/failures/invalid_comments.rock
deleted file mode 100644
index 950e2603..00000000
--- a/tests/failures/invalid_comments.rock
+++ /dev/null
@@ -1 +0,0 @@
-(nested comments (like this) don't work)
\ No newline at end of file
diff --git a/tests/failures/invalid_comments.rock.err b/tests/failures/invalid_comments.rock.err
deleted file mode 100644
index 6f6fbac2..00000000
--- a/tests/failures/invalid_comments.rock.err
+++ /dev/null
@@ -1 +0,0 @@
-Expected
\ No newline at end of file
diff --git a/tests/failures/reserved_definitely_maybe.rock b/tests/failures/reserved_definitely_maybe.rock
deleted file mode 100644
index 2abddb7a..00000000
--- a/tests/failures/reserved_definitely_maybe.rock
+++ /dev/null
@@ -1 +0,0 @@
-Definitely maybe is reserved for future use
diff --git a/tests/failures/reserved_maybe.rock b/tests/failures/reserved_maybe.rock
deleted file mode 100644
index 917eea1c..00000000
--- a/tests/failures/reserved_maybe.rock
+++ /dev/null
@@ -1 +0,0 @@
-Maybe is reserved for future use
diff --git a/tests/fixtures/comments/chordpro_comments.rock b/tests/fixtures/comments/chordpro_comments.rock
deleted file mode 100644
index 9df987fd..00000000
--- a/tests/fixtures/comments/chordpro_comments.rock
+++ /dev/null
@@ -1,11 +0,0 @@
-{Title: Chordpro Comments}
-{Artist: theGleep}
-
-{Verse}
-[C]One Line is fine
-[G]Two Lines are more than one
-[D: quiet]Put Two Lines with One Line into All Lines
-[G: loud]Knock it down
-[C]shout All Lines
-[C]Shout Two Lines
-[C]Shout One Line
\ No newline at end of file
diff --git a/tests/fixtures/comments/chordpro_comments.rock.out b/tests/fixtures/comments/chordpro_comments.rock.out
deleted file mode 100644
index 1200149d..00000000
--- a/tests/fixtures/comments/chordpro_comments.rock.out
+++ /dev/null
@@ -1,3 +0,0 @@
-446
-443
-4
diff --git a/tests/fixtures/comments/complex_comments.rock.out b/tests/fixtures/comments/complex_comments.rock.out
deleted file mode 100644
index 1bb0d82b..00000000
--- a/tests/fixtures/comments/complex_comments.rock.out
+++ /dev/null
@@ -1,5 +0,0 @@
-pass 1
-pass 2
-pass 3
-pass 4
-pass 5
diff --git a/tests/fixtures/comments/simpleComments.rock b/tests/fixtures/comments/simpleComments.rock
deleted file mode 100644
index 51d862b2..00000000
--- a/tests/fixtures/comments/simpleComments.rock
+++ /dev/null
@@ -1,7 +0,0 @@
-(comment on it's own)
-
-say "the words" (comment at the end of a line)
-
-say (comment between items) "you want to say"
-
-(comment before items) say "whatever you want"
diff --git a/tests/fixtures/comments/simpleComments.rock.out b/tests/fixtures/comments/simpleComments.rock.out
deleted file mode 100644
index a87a45e9..00000000
--- a/tests/fixtures/comments/simpleComments.rock.out
+++ /dev/null
@@ -1,3 +0,0 @@
-the words
-you want to say
-whatever you want
diff --git a/tests/fixtures/comments/simple_comment.rock b/tests/fixtures/comments/simple_comment.rock
deleted file mode 100644
index 53eecbd1..00000000
--- a/tests/fixtures/comments/simple_comment.rock
+++ /dev/null
@@ -1,2 +0,0 @@
-(this is a comment)
-(this) (is) (lots) (of) (comments)
diff --git a/tests/fixtures/constants/constants.rock b/tests/fixtures/constants/constants.rock
deleted file mode 100644
index 6e6321f8..00000000
--- a/tests/fixtures/constants/constants.rock
+++ /dev/null
@@ -1,5 +0,0 @@
-my heart is true
-say my heart
-
-my love is false
-say my love
diff --git a/tests/fixtures/constants/constants.rock.out b/tests/fixtures/constants/constants.rock.out
deleted file mode 100644
index da29283a..00000000
--- a/tests/fixtures/constants/constants.rock.out
+++ /dev/null
@@ -1,2 +0,0 @@
-true
-false
diff --git a/tests/fixtures/control-flow/simpleLoops.rock b/tests/fixtures/control-flow/simpleLoops.rock
deleted file mode 100644
index 78dd33c0..00000000
--- a/tests/fixtures/control-flow/simpleLoops.rock
+++ /dev/null
@@ -1,9 +0,0 @@
-put 10 into I
-while I
-say I
-knock I down
-(end loop)
-until I
-say I
-build I up
-(end loop)
diff --git a/tests/fixtures/equality/nothing.rock b/tests/fixtures/equality/nothing.rock
deleted file mode 100644
index c6d55c32..00000000
--- a/tests/fixtures/equality/nothing.rock
+++ /dev/null
@@ -1,9 +0,0 @@
-Say 0 is nothing
-Say false is nothing
-Say nobody is nothing
-Say null is nothing
-Say "" is nothing
-
-Say 1 is nothing
-Say true is nothing
-Say "hello" is nothing
diff --git a/tests/fixtures/equality/nothing.rock.out b/tests/fixtures/equality/nothing.rock.out
deleted file mode 100644
index aabb84c0..00000000
--- a/tests/fixtures/equality/nothing.rock.out
+++ /dev/null
@@ -1,8 +0,0 @@
-true
-true
-true
-true
-true
-false
-false
-false
diff --git a/tests/fixtures/equality/null.rock b/tests/fixtures/equality/null.rock
deleted file mode 100644
index 3e6ce2c1..00000000
--- a/tests/fixtures/equality/null.rock
+++ /dev/null
@@ -1,5 +0,0 @@
-say true is null
-say false is null
-say null is null
-say 0 is null
-say 1 is null
diff --git a/tests/fixtures/equality/null.rock.out b/tests/fixtures/equality/null.rock.out
deleted file mode 100644
index 8ef5add5..00000000
--- a/tests/fixtures/equality/null.rock.out
+++ /dev/null
@@ -1,5 +0,0 @@
-false
-true
-true
-true
-false
diff --git a/tests/fixtures/equality/numbers.rock b/tests/fixtures/equality/numbers.rock
deleted file mode 100644
index 2a60652d..00000000
--- a/tests/fixtures/equality/numbers.rock
+++ /dev/null
@@ -1,17 +0,0 @@
-say true is 5
-say 5 is true
-say 0 is false
-say false is 0
-say 0 is null
-say 5 is 5
-say 5 is 5.0
-say 0.26 is 0.26
-say "5" is 5
-say 5 is "05.0"
-say ""
-say true is 0
-say 0 is true
-say 1 is false
-say false is 1
-say 1 is null
-say 5 is 4
diff --git a/tests/fixtures/equality/numbers.rock.out b/tests/fixtures/equality/numbers.rock.out
deleted file mode 100644
index e31029f0..00000000
--- a/tests/fixtures/equality/numbers.rock.out
+++ /dev/null
@@ -1,17 +0,0 @@
-true
-true
-true
-true
-true
-true
-true
-true
-true
-true
-
-false
-false
-false
-false
-false
-false
diff --git a/tests/fixtures/equality/strings.rock b/tests/fixtures/equality/strings.rock
deleted file mode 100644
index 2dca8457..00000000
--- a/tests/fixtures/equality/strings.rock
+++ /dev/null
@@ -1,27 +0,0 @@
-say "true" is true
-say "yes" is true
-say "OK" is true
-say ""
-say true is "true"
-say true is "RIGht"
-say "yes" is true
-say "OK" is true
-say false is "false"
-say false is "WROng"
-say "lies" is false
-say ""
-say true is "hello"
-say "true" is true
-say ""
-say 5 is "3"
-say 5 is "hello"
-say ""
-say true is "lies"
-say "lies" is true
-say false is "true"
-say false is "hello"
-say "false" is false
-say "true" is false
-say ""
-say "hello" is "hello"
-say "hello" is "world"
diff --git a/tests/fixtures/equality/strings.rock.out b/tests/fixtures/equality/strings.rock.out
deleted file mode 100644
index 8283a82e..00000000
--- a/tests/fixtures/equality/strings.rock.out
+++ /dev/null
@@ -1,27 +0,0 @@
-true
-true
-true
-
-true
-true
-true
-true
-false
-false
-false
-
-true
-true
-
-false
-false
-
-true
-true
-false
-false
-false
-false
-
-true
-false
diff --git a/tests/fixtures/examples/hello-world.rock b/tests/fixtures/examples/hello-world.rock
deleted file mode 100644
index 0da43f3c..00000000
--- a/tests/fixtures/examples/hello-world.rock
+++ /dev/null
@@ -1,31 +0,0 @@
-Eternity takes the pain.
-The prize is silence
-Until the pain is nothing,
-Roll the pain into violence,
-Cast violence into your lies,
-Let the prize be with your lies.
-
-Give back the prize
-
-The night is calling me
-Rock the night like a colourcast tranquility
-The dawn is a spellbound moonbeam
-Rock the night with the dawn, the dawn,
-Your fire is a neverending aftereffect
-Rock the night with your fire
-
-The spirit is electric thunder
-Rock the spirit with your fire
-Rock the spirit like a thunderbolt fist
-Rock the spirit with the dawn
-Rock the spirit like a chamaeleon stormcloud 
-
-Let fear be eternity taking the night
-Let hope be eternity taking the spirit
-
-Time is all up
-Cast it into the void
-Let fear be with the void
-Let fear be with hope
-
-Shout fear
diff --git a/tests/fixtures/io/hello_number.rock b/tests/fixtures/io/hello_number.rock
deleted file mode 100644
index 9ae772e7..00000000
--- a/tests/fixtures/io/hello_number.rock
+++ /dev/null
@@ -1,5 +0,0 @@
-say -123.45
-say -1
-say 0
-say 1
-say 123.45
diff --git a/tests/fixtures/io/hello_world.rock b/tests/fixtures/io/hello_world.rock
deleted file mode 100644
index a99b73b2..00000000
--- a/tests/fixtures/io/hello_world.rock
+++ /dev/null
@@ -1,3 +0,0 @@
-Say "hello world"
-Say "Hello World"
-SAY "HELLO WORLD"
diff --git a/tests/fixtures/io/hello_world.rock.out b/tests/fixtures/io/hello_world.rock.out
deleted file mode 100644
index 0a35266c..00000000
--- a/tests/fixtures/io/hello_world.rock.out
+++ /dev/null
@@ -1,3 +0,0 @@
-hello world
-Hello World
-HELLO WORLD
diff --git a/tests/fixtures/literals/literalAliases.rock b/tests/fixtures/literals/literalAliases.rock
deleted file mode 100644
index c79faa6c..00000000
--- a/tests/fixtures/literals/literalAliases.rock
+++ /dev/null
@@ -1,23 +0,0 @@
-(all aliases for literals work)
-say mysterious
-say "aliases for null"
-say null
-say nothing
-say nowhere
-say nobody
-say gone
-
-say "aliases for empty string"
-say empty
-
-say "aliases for true"
-say true
-say right
-say yes
-say ok
-
-say "aliases for false"
-say false
-say wrong
-say no
-say lies
diff --git a/tests/fixtures/literals/literalAliases.rock.out b/tests/fixtures/literals/literalAliases.rock.out
deleted file mode 100644
index 7ec2294a..00000000
--- a/tests/fixtures/literals/literalAliases.rock.out
+++ /dev/null
@@ -1,19 +0,0 @@
-mysterious
-aliases for null
-null
-null
-null
-null
-null
-aliases for empty string
-
-aliases for true
-true
-true
-true
-true
-aliases for false
-false
-false
-false
-false
diff --git a/tests/fixtures/literals/literalstrings.rock b/tests/fixtures/literals/literalstrings.rock
deleted file mode 100644
index 9bcc18fc..00000000
--- a/tests/fixtures/literals/literalstrings.rock
+++ /dev/null
@@ -1,2 +0,0 @@
-Shout "What is not denied is permitted!"
-Shout "This ain't not allowed!"
diff --git a/tests/fixtures/literals/literalstrings.rock.out b/tests/fixtures/literals/literalstrings.rock.out
deleted file mode 100644
index 3ab630a4..00000000
--- a/tests/fixtures/literals/literalstrings.rock.out
+++ /dev/null
@@ -1,2 +0,0 @@
-What is not denied is permitted!
-This ain't not allowed!
diff --git a/tests/fixtures/literals/poeticNumbers.rock.out b/tests/fixtures/literals/poeticNumbers.rock.out
deleted file mode 100644
index 29cf4c17..00000000
--- a/tests/fixtures/literals/poeticNumbers.rock.out
+++ /dev/null
@@ -1,7 +0,0 @@
-100
-16
-235
-3.1415926535
-1627
-14
-6
diff --git a/tests/fixtures/math/operator_aliases.rock b/tests/fixtures/math/operator_aliases.rock
deleted file mode 100644
index 3484b26d..00000000
--- a/tests/fixtures/math/operator_aliases.rock
+++ /dev/null
@@ -1,16 +0,0 @@
-say "addition"
-say 2 plus 2
-say 2 with 2
-
-say "subtraction"
-say 5 minus 3
-say 5 without 3
-
-say "multiplication"
-say 5 times 5
-say 5 of 5
-
-say "division"
-say 4 over 2
-
-
diff --git a/tests/fixtures/math/operator_aliases.rock.out b/tests/fixtures/math/operator_aliases.rock.out
deleted file mode 100644
index 1ba866fd..00000000
--- a/tests/fixtures/math/operator_aliases.rock.out
+++ /dev/null
@@ -1,11 +0,0 @@
-addition
-4
-4
-subtraction
-2
-2
-multiplication
-25
-25
-division
-2
diff --git a/tests/fixtures/math/operator_precedence.rock b/tests/fixtures/math/operator_precedence.rock
deleted file mode 100644
index dc3e056e..00000000
--- a/tests/fixtures/math/operator_precedence.rock
+++ /dev/null
@@ -1,6 +0,0 @@
-say 1 + 1 * 2 (= 3)
-say 1 * 2 + 1 (= 5)
-say 1 / 2 * 3 + 4
-say 5-2*3
-say 2*3 - 5
-
diff --git a/tests/fixtures/math/operator_precedence.rock.out b/tests/fixtures/math/operator_precedence.rock.out
deleted file mode 100644
index ece5c43a..00000000
--- a/tests/fixtures/math/operator_precedence.rock.out
+++ /dev/null
@@ -1,5 +0,0 @@
-3
-3
-5.5
--1
-1
diff --git a/tests/fixtures/math/operators.rock b/tests/fixtures/math/operators.rock
deleted file mode 100644
index b0fa20cb..00000000
--- a/tests/fixtures/math/operators.rock
+++ /dev/null
@@ -1,14 +0,0 @@
-say "addition"
-say 1 + 1
-say 5 + 10
-say 2.5 + 2.5
-say 1 + 0.2 + 0.03
-say "subtraction"
-say 2 - 1
-say 0 - 1
-say 1 - 0.5
-say "multiplication"
-say 1 * 0
-say 1 * 1
-say 1 * 2
-say 2 * 2
diff --git a/tests/fixtures/math/operators.rock.out b/tests/fixtures/math/operators.rock.out
deleted file mode 100644
index cf4d1523..00000000
--- a/tests/fixtures/math/operators.rock.out
+++ /dev/null
@@ -1,14 +0,0 @@
-addition
-2
-15
-5
-1.23
-subtraction
-1
--1
-0.5
-multiplication
-0
-1
-2
-4
diff --git a/tests/fixtures/operators/multiplicationOperator.rock.out b/tests/fixtures/operators/multiplicationOperator.rock.out
deleted file mode 100644
index 206885b1..00000000
--- a/tests/fixtures/operators/multiplicationOperator.rock.out
+++ /dev/null
@@ -1,7 +0,0 @@
-25
-8
-24
--6
-0
-hellohello
-mysterious
diff --git a/tests/fixtures/variables/simple_variables.rock b/tests/fixtures/variables/simple_variables.rock
deleted file mode 100644
index 4952460c..00000000
--- a/tests/fixtures/variables/simple_variables.rock
+++ /dev/null
@@ -1,44 +0,0 @@
-Variable is 1
-Say variable
-
-Value is 1
-say value with value
-
-X is 1
-Y is 2
-Say x plus y
-Alpha says r
-Beta says o
-Gamma says c
-Delta says k
-Say alpha with beta with gamma with delta
-
-Let themes be 10 (variable name beginning with pronoun 'the')
-Let italics be true (variable name beginning with pronoun 'it')
-Shout themes
-Shout italics
-
-say "case insensitivity"
-TIME is 1
-say TIME
-say time
-say tIMe
-say TIMe
-
-time is 2
-say TIME
-say time
-say tIMe
-say TIMe
-
-tIMe is 3
-say TIME
-say time
-say tIMe
-say TIMe
-
-TIMe is 4
-say TIME
-say time
-say tIMe
-say TIMe
diff --git a/tests/fixtures/variables/simple_variables.rock.out b/tests/fixtures/variables/simple_variables.rock.out
deleted file mode 100644
index dd61123a..00000000
--- a/tests/fixtures/variables/simple_variables.rock.out
+++ /dev/null
@@ -1,23 +0,0 @@
-1
-2
-3
-rock
-10
-true
-case insensitivity
-1
-1
-1
-1
-2
-2
-2
-2
-3
-3
-3
-3
-4
-4
-4
-4
diff --git a/tests/fixtures/whitespace/apostrophesIgnored.rock b/tests/fixtures/whitespace/apostrophesIgnored.rock
deleted file mode 100644
index c3f8e2c2..00000000
--- a/tests/fixtures/whitespace/apostrophesIgnored.rock
+++ /dev/null
@@ -1,10 +0,0 @@
-('s is valid in poetic assignments with the apostrophe ignored)
-
-my soul is the Devil's to take
-shout my soul
-
-my soul is the Devil'sto take
-shout my soul
-
-my soul is the Devil 's to take
-shout my soul
diff --git a/tests/fixtures/whitespace/apostrophesIgnored.rock.out b/tests/fixtures/whitespace/apostrophesIgnored.rock.out
deleted file mode 100644
index 2db02e27..00000000
--- a/tests/fixtures/whitespace/apostrophesIgnored.rock.out
+++ /dev/null
@@ -1,3 +0,0 @@
-3624
-384
-35124
diff --git a/tests/fixtures/whitespace/leading_blank_lines.rock.out b/tests/fixtures/whitespace/leading_blank_lines.rock.out
deleted file mode 100644
index 2ae28399..00000000
--- a/tests/fixtures/whitespace/leading_blank_lines.rock.out
+++ /dev/null
@@ -1 +0,0 @@
-pass
diff --git a/tests/fixtures/whitespace/leading_empty_lines.rock.out b/tests/fixtures/whitespace/leading_empty_lines.rock.out
deleted file mode 100644
index 2ae28399..00000000
--- a/tests/fixtures/whitespace/leading_empty_lines.rock.out
+++ /dev/null
@@ -1 +0,0 @@
-pass
diff --git a/tests/fixtures/whitespace/leading_whitespace.rock b/tests/fixtures/whitespace/leading_whitespace.rock
deleted file mode 100644
index ba222974..00000000
--- a/tests/fixtures/whitespace/leading_whitespace.rock
+++ /dev/null
@@ -1,6 +0,0 @@
-Rockstar is a big bad monster truck
-While Rockstar is greater than nothing
-   Shout Rockstar
-   Put Rockstar without 500 into Rockstar
-
-
diff --git a/tests/fixtures/whitespace/leading_whitespace.rock.out b/tests/fixtures/whitespace/leading_whitespace.rock.out
deleted file mode 100644
index aa267a16..00000000
--- a/tests/fixtures/whitespace/leading_whitespace.rock.out
+++ /dev/null
@@ -1,27 +0,0 @@
-13375
-12875
-12375
-11875
-11375
-10875
-10375
-9875
-9375
-8875
-8375
-7875
-7375
-6875
-6375
-5875
-5375
-4875
-4375
-3875
-3375
-2875
-2375
-1875
-1375
-875
-375
diff --git a/tests/fixtures/whitespace/no_newline_at_eof.rock.out b/tests/fixtures/whitespace/no_newline_at_eof.rock.out
deleted file mode 100644
index 2ae28399..00000000
--- a/tests/fixtures/whitespace/no_newline_at_eof.rock.out
+++ /dev/null
@@ -1 +0,0 @@
-pass
diff --git a/tests/fixtures/whitespace/trailing_blank_lines.rock.out b/tests/fixtures/whitespace/trailing_blank_lines.rock.out
deleted file mode 100644
index 2ae28399..00000000
--- a/tests/fixtures/whitespace/trailing_blank_lines.rock.out
+++ /dev/null
@@ -1 +0,0 @@
-pass
diff --git a/tests/fixtures/whitespace/trailing_empty_lines.rock.out b/tests/fixtures/whitespace/trailing_empty_lines.rock.out
deleted file mode 100644
index 2ae28399..00000000
--- a/tests/fixtures/whitespace/trailing_empty_lines.rock.out
+++ /dev/null
@@ -1 +0,0 @@
-pass
diff --git a/tools/example.rock b/tools/example.rock
deleted file mode 100644
index 0da43f3c..00000000
--- a/tools/example.rock
+++ /dev/null
@@ -1,31 +0,0 @@
-Eternity takes the pain.
-The prize is silence
-Until the pain is nothing,
-Roll the pain into violence,
-Cast violence into your lies,
-Let the prize be with your lies.
-
-Give back the prize
-
-The night is calling me
-Rock the night like a colourcast tranquility
-The dawn is a spellbound moonbeam
-Rock the night with the dawn, the dawn,
-Your fire is a neverending aftereffect
-Rock the night with your fire
-
-The spirit is electric thunder
-Rock the spirit with your fire
-Rock the spirit like a thunderbolt fist
-Rock the spirit with the dawn
-Rock the spirit like a chamaeleon stormcloud 
-
-Let fear be eternity taking the night
-Let hope be eternity taking the spirit
-
-Time is all up
-Cast it into the void
-Let fear be with the void
-Let fear be with hope
-
-Shout fear
diff --git a/tools/index.html b/tools/index.html
deleted file mode 100644
index 2ee9d046..00000000
--- a/tools/index.html
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-    rockstar web demo
-
-
-
-pegjs
-

SOURCE

- - -

OUTPUT:

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

Documentation

- -

Table of Contents

- - - -

Installation

- -

Node.js

- -

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

- -
$ npm install -g pegjs
- -

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

- -
$ npm install pegjs
- -

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

- -

Browser

- -

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

- -
$ bower install pegjs
- -

Generating a Parser

- -

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

- -

Command Line

- -

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

- -
$ pegjs arithmetics.pegjs
- -

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

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

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

- -

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

- -

You can tweak the generated parser with several options:

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

JavaScript API

- -

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

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

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

- -

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

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

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

- -

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

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

Using the Parser

- -

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

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

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

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

Parsers can also support their own custom options.

- -

Grammar Syntax and Semantics

- -

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

- -

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

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

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

- -

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

- -

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

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

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

- -

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

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

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

- -

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

- -

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

- -

Parsing Expression Types

- -

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

- -
-
"literal"
'literal'
- -
-

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

-
- -
.
- -
-

Match exactly one character and return it as a string.

-
- -
[characters]
- -
-

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

-
- -
rule
- -
-

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

-
- -
( expression )
- -
-

Match a subexpression and return its match result.

-
- -
expression *
- -
-

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

-
- -
expression +
- -
-

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

-
- -
expression ?
- -
-

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

-
- -
& expression
- -
-

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

-
- -
! expression
- -
-

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

-
- -
& { predicate }
- -
-

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

- -

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

- -

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

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

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

- -

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

- -

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

-
- -
! { predicate }
- -
-

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

- -

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

- -

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

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

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

- -

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

- -

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

-
- -
$ expression
- -
-

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

-
- -
label : expression
- -
-

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

- -

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

-
- -
expression1 expression2 ... expressionn
- -
-

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

-
- -
expression { action }
- -
-

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

- -

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

- -

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

- -

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

- -

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

- -

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

- -

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

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

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

- -

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

- -

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

-
- -
expression1 / expression2 / ... / expressionn
- -
-

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

-
-
- -

Compatibility

- -

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

- -
    -
  • Node.js 0.10.0+
  • -
  • Internet Explorer 8+
  • -
  • Edge
  • -
  • Firefox
  • -
  • Chrome
  • -
  • Safari
  • -
  • Opera
  • -
- -
- - -
- - - - diff --git a/tools/pegjs.org/favicon.ico b/tools/pegjs.org/favicon.ico deleted file mode 100644 index 4872223c..00000000 Binary files a/tools/pegjs.org/favicon.ico and /dev/null differ diff --git a/tools/pegjs.org/img/spinner-16x16-progress.gif b/tools/pegjs.org/img/spinner-16x16-progress.gif deleted file mode 100644 index a5b93871..00000000 Binary files a/tools/pegjs.org/img/spinner-16x16-progress.gif and /dev/null differ diff --git a/tools/pegjs.org/img/spinner-48x48.gif b/tools/pegjs.org/img/spinner-48x48.gif deleted file mode 100644 index 52cba92f..00000000 Binary files a/tools/pegjs.org/img/spinner-48x48.gif and /dev/null differ diff --git a/tools/pegjs.org/index.html b/tools/pegjs.org/index.html deleted file mode 100644 index ab93aa92..00000000 --- a/tools/pegjs.org/index.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - PEG.js – Parser Generator for JavaScript - - - - - - - -
- - - - -
- - -
-

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

- -

Features

- -
    -
  • Simple and expressive grammar syntax
  • - -
  • Integrates both lexical and syntactical analysis
  • - -
  • Parsers have excellent error reporting out of the box
  • - -
  • Based on parsing - expression grammar formalism — more powerful than traditional - LL(k) and LR(k) parsers
  • - -
  • Usable from your browser, - from the command line, or via JavaScript API
  • -
-
- -
- - -
- - - - diff --git a/tools/pegjs.org/js/benchmark-bundle.js b/tools/pegjs.org/js/benchmark-bundle.js deleted file mode 100644 index 1995f316..00000000 --- a/tools/pegjs.org/js/benchmark-bundle.js +++ /dev/null @@ -1,5917 +0,0 @@ -var benchmark = (function () { - 'use strict'; - - function _typeof(obj) { - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) _setPrototypeOf(subClass, superClass); - } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); - } - - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; - } - - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - - return _assertThisInitialized(self); - } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - - return arr2; - } - } - - function _iterableToArray(iter) { - if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance"); - } - - var GrammarError = function GrammarError(message, location) { - _classCallCheck(this, GrammarError); - - this.name = "GrammarError"; - this.message = message; - this.location = location; - - if (typeof Error.captureStackTrace === "function") { - Error.captureStackTrace(this, GrammarError); - } - }; - - var grammarError = GrammarError; - - function createCommonjsModule(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; - } - - function getCjsExportFromNamespace (n) { - return n && n.default || n; - } - - function findIndex(array, condition) { - for (var i = 0; i < array.length; ++i) { - if (condition(array[i], i)) return i; - } - - return -1; - } - - function find(array, condition) { - var index = findIndex(array, condition); - return index < 0 ? void 0 : array[index]; - } - - var arrays = { - findIndex: findIndex, - find: find - }; - - function hex(ch) { - return ch.charCodeAt(0).toString(16).toUpperCase(); - } - - function sourceEscape(s) { - return s.replace(/\0/g, "\\0").replace(/\x08/g, "\\b").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\v/g, "\\v").replace(/\f/g, "\\f").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { - return "\\x0" + hex(ch); - }).replace(/[\x10-\x1F\x7F-\xFF]/g, function (ch) { - return "\\x" + hex(ch); - }).replace(/[\u0100-\u0FFF]/g, function (ch) { - return "\\u0" + hex(ch); - }).replace(/[\u1000-\uFFFF]/g, function (ch) { - return "\\u" + hex(ch); - }); - } - - var js = { - stringEscape: function stringEscape(s) { - return sourceEscape(s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")); - }, - regexpEscape: function regexpEscape(s) { - return sourceEscape(s.replace(/\\/g, "\\\\").replace(/\//g, "\\/").replace(/]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-")); - }, - reservedWords: ["break", "case", "catch", "continue", "debugger", "default", "delete", "do", "else", "finally", "for", "function", "if", "in", "instanceof", "new", "return", "switch", "this", "throw", "try", "typeof", "var", "void", "while", "with", "class", "const", "enum", "export", "extends", "implements", "import", "interface", "let", "package", "private", "protected", "public", "static", "super", "yield", "false", "null", "true"] - }; - var js_1 = js; - - var __hasOwnProperty = Object.prototype.hasOwnProperty; - var objects = { - clone: function clone(source) { - var target = {}; - - for (var key in source) { - if (!__hasOwnProperty.call(source, key)) continue; - target[key] = source[key]; - } - - return target; - }, - each: function each(object, iterator) { - for (var key in object) { - if (!__hasOwnProperty.call(object, key)) continue; - iterator(object[key], key); - } - }, - extend: function extend(target, source) { - for (var key in source) { - if (!__hasOwnProperty.call(source, key)) continue; - if (__hasOwnProperty.call(target, key)) continue; - target[key] = source[key]; - } - - return target; - }, - map: function map(object, transformer) { - var target = {}; - - for (var key in object) { - if (!__hasOwnProperty.call(object, key)) continue; - target[key] = transformer(object[key], key); - } - - return target; - }, - values: function values(object, transformer) { - var target = []; - var index = -1; - var key, value; - - for (key in object) { - if (!__hasOwnProperty.call(object, key)) continue; - value = object[key]; - target[++index] = transformer ? transformer(value, key) : value; - } - - return target; - }, - enforceFastProperties: function enforceFastProperties(o) { - function Sub() {} - - Sub.prototype = o; - var receiver = new Sub(); - - function ic() { - return _typeof(receiver.foo); - } - - ic(); - ic(); - return o; - eval("o" + o); - } - }; - var objects_1 = objects; - - function evalModule(source, context) { - var argumentKeys = Object.keys(context); - var argumentValues = argumentKeys.map(function (argument) { - return context[argument]; - }); - var sandbox = { - exports: {} - }; - argumentKeys.push("module", "exports", source); - argumentValues.push(sandbox, sandbox.exports); - Function.apply(void 0, _toConsumableArray(argumentKeys)).apply(void 0, _toConsumableArray(argumentValues)); - return sandbox.exports; - } - - var vm = { - evalModule: evalModule - }; - - var util = createCommonjsModule(function (module, exports) { - - objects_1.extend(exports, arrays); - objects_1.extend(exports, js_1); - objects_1.extend(exports, objects_1); - objects_1.extend(exports, vm); - - exports.noop = function noop() {}; - - exports.convertPasses = function () { - function convertStage(passes) { - return Array.isArray(passes) ? passes : objects_1.values(passes); - } - - function convertPasses(stages) { - return objects_1.map(stages, convertStage); - } - - return convertPasses; - }(); - - exports.processOptions = function processOptions(options, defaults) { - var processedOptions = {}; - objects_1.extend(processedOptions, options); - objects_1.extend(processedOptions, defaults); - return processedOptions; - }; - }); - var util_1 = util.noop; - var util_2 = util.convertPasses; - var util_3 = util.processOptions; - - var ASTVisitor = function () { - function ASTVisitor() { - _classCallCheck(this, ASTVisitor); - } - - _createClass(ASTVisitor, [{ - key: "visit", - value: function visit(node) { - if (!node) throw new Error("Visitor function called with no arguments or a `falsy` node"); - var fn = this[node.type]; - if (!fn) throw new Error("Visitor function for node type \"".concat(node.type, "\" not defined")); - return fn.apply(this, arguments); - } - }]); - - return ASTVisitor; - }(); - - var visitor = { - ASTVisitor: ASTVisitor, - build: function build(functions) { - var visitor = new ASTVisitor(); - util.extend(visitor, functions); - visitor = util.enforceFastProperties(visitor); - return visitor.visit.bind(visitor); - } - }; - var on = ASTVisitor.on = { - property: function property(name) { - return function visitProperty(node) { - var value = node[name]; - - for (var _len = arguments.length, extraArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - extraArgs[_key - 1] = arguments[_key]; - } - - if (extraArgs.length) this.visit.apply(this, [value].concat(extraArgs));else this.visit(value); - }; - }, - children: function children(name) { - return function visitProperty(node) { - for (var _len2 = arguments.length, extraArgs = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - extraArgs[_key2 - 1] = arguments[_key2]; - } - - var children = node[name]; - var visitor = this; - var cb = extraArgs.length < 1 ? function withoutArgs(child) { - visitor.visit(child); - } : function withArgs(child) { - visitor.visit.apply(visitor, [child].concat(extraArgs)); - }; - children.forEach(cb); - }; - } - }; - var visitNop = util.noop; - var visitExpression = on.property("expression"); - var DEFAULT_FUNCTIONS = { - grammar: function grammar(node) { - var _this = this; - - for (var _len3 = arguments.length, extraArgs = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { - extraArgs[_key3 - 1] = arguments[_key3]; - } - - if (node.initializer) { - this.visit.apply(this, [node.initializer].concat(extraArgs)); - } - - node.rules.forEach(function (rule) { - _this.visit.apply(_this, [rule].concat(extraArgs)); - }); - }, - initializer: visitNop, - rule: visitExpression, - named: visitExpression, - choice: on.children("alternatives"), - action: visitExpression, - sequence: on.children("elements"), - labeled: visitExpression, - text: visitExpression, - simple_and: visitExpression, - simple_not: visitExpression, - optional: visitExpression, - zero_or_more: visitExpression, - one_or_more: visitExpression, - group: visitExpression, - semantic_and: visitNop, - semantic_not: visitNop, - rule_ref: visitNop, - literal: visitNop, - class: visitNop, - any: visitNop - }; - util.each(DEFAULT_FUNCTIONS, function (fn, name) { - ASTVisitor.prototype[name] = fn; - }); - - var Node = function Node(type, location) { - _classCallCheck(this, Node); - - this.type = type; - this.location = location; - }; - - var Node_1 = Node; - - var Grammar = function (_Node) { - _inherits(Grammar, _Node); - - function Grammar(initializer, rules, comments, location) { - var _this; - - _classCallCheck(this, Grammar); - - _this = _possibleConstructorReturn(this, _getPrototypeOf(Grammar).call(this, "grammar", location)); - _this.initializer = initializer; - _this.comments = comments; - _this.rules = rules; - _this._alwaysConsumesOnSuccess = new AlwaysConsumesOnSuccess(_assertThisInitialized(_assertThisInitialized(_this))); - return _this; - } - - _createClass(Grammar, [{ - key: "alwaysConsumesOnSuccess", - value: function alwaysConsumesOnSuccess(node) { - return this._alwaysConsumesOnSuccess.visit(node); - } - }, { - key: "findRule", - value: function findRule(name) { - return util.find(this.rules, function (rule) { - return rule.name === name; - }); - } - }, { - key: "indexOfRule", - value: function indexOfRule(name) { - return util.findIndex(this.rules, function (rule) { - return rule.name === name; - }); - } - }]); - - return Grammar; - }(Node_1); - - var Grammar_1 = Grammar; - - var AlwaysConsumesOnSuccess = function (_visitor$ASTVisitor) { - _inherits(AlwaysConsumesOnSuccess, _visitor$ASTVisitor); - - function AlwaysConsumesOnSuccess(ast) { - var _this2; - - _classCallCheck(this, AlwaysConsumesOnSuccess); - - _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AlwaysConsumesOnSuccess).call(this)); - _this2.ast = ast; - return _this2; - } - - _createClass(AlwaysConsumesOnSuccess, [{ - key: "choice", - value: function choice(node) { - return node.alternatives.every(this.visit, this); - } - }, { - key: "sequence", - value: function sequence(node) { - return node.elements.some(this.visit, this); - } - }, { - key: "rule_ref", - value: function rule_ref(node) { - return this.visit(this.ast.findRule(node.name)); - } - }, { - key: "literal", - value: function literal(node) { - return node.value !== ""; - } - }]); - - return AlwaysConsumesOnSuccess; - }(visitor.ASTVisitor); - - function consumesTrue() { - return true; - } - - function consumesFalse() { - return false; - } - - function consumesExpression(node) { - return this.visit(node.expression); - } - - util.extend(AlwaysConsumesOnSuccess.prototype, { - rule: consumesExpression, - named: consumesExpression, - action: consumesExpression, - labeled: consumesExpression, - text: consumesExpression, - simple_and: consumesFalse, - simple_not: consumesFalse, - optional: consumesFalse, - zero_or_more: consumesFalse, - one_or_more: consumesExpression, - group: consumesExpression, - semantic_and: consumesFalse, - semantic_not: consumesFalse, - class: consumesTrue, - any: consumesTrue - }); - - var visitor$1 = visitor; - var Node$1 = Node_1; - var Grammar$1 = Grammar_1; - var ast = { - visitor: visitor$1, - Node: Node$1, - Grammar: Grammar$1 - }; - - function calcReportFailures(ast, session, options) { - ast.rules.forEach(function (rule) { - rule.reportFailures = false; - }); - var changedRules = options.allowedStartRules.map(function (name) { - var rule = ast.findRule(name); - rule.reportFailures = true; - return rule; - }); - var calc = session.buildVisitor({ - rule: function rule(node) { - calc(node.expression); - }, - named: function named() {}, - rule_ref: function rule_ref(node) { - var rule = ast.findRule(node.name); - - if (!rule.reportFailures) { - rule.reportFailures = true; - changedRules.push(rule); - } - } - }); - - while (changedRules.length > 0) { - calc(changedRules.pop()); - } - } - - var calcReportFailures_1 = calcReportFailures; - - function generateBytecode(ast, session) { - var op = session.opcodes; - var literals = []; - var classes = []; - var expectations = []; - var functions = []; - var generate; - - function addLiteralConst(value) { - var index = literals.indexOf(value); - return index === -1 ? literals.push(value) - 1 : index; - } - - function addClassConst(node) { - var cls = { - value: node.parts, - inverted: node.inverted, - ignoreCase: node.ignoreCase - }; - var pattern = JSON.stringify(cls); - var index = util.findIndex(classes, function (c) { - return JSON.stringify(c) === pattern; - }); - return index === -1 ? classes.push(cls) - 1 : index; - } - - function addExpectedConst(expected) { - var pattern = JSON.stringify(expected); - var index = util.findIndex(expectations, function (e) { - return JSON.stringify(e) === pattern; - }); - return index === -1 ? expectations.push(expected) - 1 : index; - } - - function addFunctionConst(predicate, params, code) { - var func = { - predicate: predicate, - params: params, - body: code - }; - var pattern = JSON.stringify(func); - var index = util.findIndex(functions, function (f) { - return JSON.stringify(f) === pattern; - }); - return index === -1 ? functions.push(func) - 1 : index; - } - - var buildSequence = function buildSequence() { - var _ref; - - return (_ref = []).concat.apply(_ref, arguments); - }; - - function buildCondition(match, condCode, thenCode, elseCode) { - if (match > 0) return thenCode; - if (match < 0) return elseCode; - return condCode.concat([thenCode.length, elseCode.length], thenCode, elseCode); - } - - function buildLoop(condCode, bodyCode) { - return condCode.concat([bodyCode.length], bodyCode); - } - - function buildCall(functionIndex, delta, env, sp) { - var params = util.values(env, function (value) { - return sp - value; - }); - return [op.CALL, functionIndex, delta, params.length].concat(params); - } - - function buildSimplePredicate(expression, negative, context) { - var match = expression.match | 0; - return buildSequence([op.PUSH_CURR_POS], [op.EXPECT_NS_BEGIN], generate(expression, { - sp: context.sp + 1, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }), [op.EXPECT_NS_END, negative ? 1 : 0], buildCondition(negative ? -match : match, [negative ? op.IF_ERROR : op.IF_NOT_ERROR], buildSequence([op.POP], [negative ? op.POP : op.POP_CURR_POS], [op.PUSH_UNDEFINED]), buildSequence([op.POP], [negative ? op.POP_CURR_POS : op.POP], [op.PUSH_FAILED]))); - } - - function buildSemanticPredicate(node, negative, context) { - var functionIndex = addFunctionConst(true, Object.keys(context.env), node.code); - return buildSequence([op.UPDATE_SAVED_POS], buildCall(functionIndex, 0, context.env, context.sp), buildCondition(node.match | 0, [op.IF], buildSequence([op.POP], negative ? [op.PUSH_FAILED] : [op.PUSH_UNDEFINED]), buildSequence([op.POP], negative ? [op.PUSH_UNDEFINED] : [op.PUSH_FAILED]))); - } - - function buildAppendLoop(expressionCode) { - return buildLoop([op.WHILE_NOT_ERROR], buildSequence([op.APPEND], expressionCode)); - } - - generate = session.buildVisitor({ - grammar: function grammar(node) { - node.rules.forEach(generate); - node.literals = literals; - node.classes = classes; - node.expectations = expectations; - node.functions = functions; - }, - rule: function rule(node) { - node.bytecode = generate(node.expression, { - sp: -1, - env: {}, - action: null, - reportFailures: node.reportFailures - }); - }, - named: function named(node, context) { - var nameIndex = context.reportFailures ? addExpectedConst({ - type: "rule", - value: node.name - }) : null; - var expressionCode = generate(node.expression, { - sp: context.sp, - env: context.env, - action: context.action, - reportFailures: false - }); - return context.reportFailures ? buildSequence([op.EXPECT, nameIndex], [op.SILENT_FAILS_ON], expressionCode, [op.SILENT_FAILS_OFF]) : expressionCode; - }, - choice: function choice(node, context) { - function buildAlternativesCode(alternatives, context) { - return buildSequence(generate(alternatives[0], { - sp: context.sp, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }), alternatives.length < 2 ? [] : buildCondition(-(alternatives[0].match | 0), [op.IF_ERROR], buildSequence([op.POP], buildAlternativesCode(alternatives.slice(1), context)), [])); - } - - return buildAlternativesCode(node.alternatives, context); - }, - action: function action(node, context) { - var env = util.clone(context.env); - var emitCall = node.expression.type !== "sequence" || node.expression.elements.length === 0; - var expressionCode = generate(node.expression, { - sp: context.sp + (emitCall ? 1 : 0), - env: env, - action: node, - reportFailures: context.reportFailures - }); - var match = node.expression.match | 0; - var functionIndex = emitCall && match >= 0 ? addFunctionConst(false, Object.keys(env), node.code) : null; - return emitCall === false ? expressionCode : buildSequence([op.PUSH_CURR_POS], expressionCode, buildCondition(match, [op.IF_NOT_ERROR], buildSequence([op.LOAD_SAVED_POS, 1], buildCall(functionIndex, 1, env, context.sp + 2)), []), [op.NIP]); - }, - sequence: function sequence(node, context) { - var TOTAL_ELEMENTS = node.elements.length; - - function buildElementsCode(elements, context) { - if (elements.length > 0) { - var processedCount = TOTAL_ELEMENTS - elements.slice(1).length; - return buildSequence(generate(elements[0], { - sp: context.sp, - env: context.env, - pluck: context.pluck, - action: null, - reportFailures: context.reportFailures - }), buildCondition(elements[0].match | 0, [op.IF_NOT_ERROR], buildElementsCode(elements.slice(1), { - sp: context.sp + 1, - env: context.env, - pluck: context.pluck, - action: context.action, - reportFailures: context.reportFailures - }), buildSequence(processedCount > 1 ? [op.POP_N, processedCount] : [op.POP], [op.POP_CURR_POS], [op.PUSH_FAILED]))); - } - - if (context.pluck.length > 0) return buildSequence([op.PLUCK, TOTAL_ELEMENTS + 1, context.pluck.length], context.pluck.map(function (eSP) { - return context.sp - eSP; - })); - if (context.action) return buildSequence([op.LOAD_SAVED_POS, TOTAL_ELEMENTS], buildCall(addFunctionConst(false, Object.keys(context.env), context.action.code), TOTAL_ELEMENTS + 1, context.env, context.sp)); - return buildSequence([op.WRAP, TOTAL_ELEMENTS], [op.NIP]); - } - - return buildSequence([op.PUSH_CURR_POS], buildElementsCode(node.elements, { - sp: context.sp + 1, - env: context.env, - pluck: [], - action: context.action, - reportFailures: context.reportFailures - })); - }, - labeled: function labeled(node, context) { - var env = context.env; - var label = node.label; - var sp = context.sp + 1; - - if (label !== null) { - env = util.clone(context.env); - context.env[label] = sp; - } - - if (context.pluck && node.pick) context.pluck.push(sp); - return generate(node.expression, { - sp: context.sp, - env: env, - action: null, - reportFailures: context.reportFailures - }); - }, - text: function text(node, context) { - return buildSequence([op.PUSH_CURR_POS], generate(node.expression, { - sp: context.sp + 1, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }), buildCondition(node.expression.match | 0, [op.IF_NOT_ERROR], buildSequence([op.POP], [op.TEXT]), [op.NIP])); - }, - simple_and: function simple_and(node, context) { - return buildSimplePredicate(node.expression, false, context); - }, - simple_not: function simple_not(node, context) { - return buildSimplePredicate(node.expression, true, context); - }, - optional: function optional(node, context) { - return buildSequence(generate(node.expression, { - sp: context.sp, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }), buildCondition(-(node.expression.match | 0), [op.IF_ERROR], buildSequence([op.POP], [op.PUSH_NULL]), [])); - }, - zero_or_more: function zero_or_more(node, context) { - var expressionCode = generate(node.expression, { - sp: context.sp + 1, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }); - return buildSequence([op.PUSH_EMPTY_ARRAY], expressionCode, buildAppendLoop(expressionCode), [op.POP]); - }, - one_or_more: function one_or_more(node, context) { - var expressionCode = generate(node.expression, { - sp: context.sp + 1, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }); - return buildSequence([op.PUSH_EMPTY_ARRAY], expressionCode, buildCondition(node.expression.match | 0, [op.IF_NOT_ERROR], buildSequence(buildAppendLoop(expressionCode), [op.POP]), buildSequence([op.POP], [op.POP], [op.PUSH_FAILED]))); - }, - group: function group(node, context) { - return generate(node.expression, { - sp: context.sp, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }); - }, - semantic_and: function semantic_and(node, context) { - return buildSemanticPredicate(node, false, context); - }, - semantic_not: function semantic_not(node, context) { - return buildSemanticPredicate(node, true, context); - }, - rule_ref: function rule_ref(node) { - return [op.RULE, ast.indexOfRule(node.name)]; - }, - literal: function literal(node, context) { - if (node.value.length > 0) { - var match = node.match | 0; - var needConst = match === 0 || match > 0 && !node.ignoreCase; - var stringIndex = needConst ? addLiteralConst(node.ignoreCase ? node.value.toLowerCase() : node.value) : null; - var expectedIndex = context.reportFailures ? addExpectedConst({ - type: "literal", - value: node.value, - ignoreCase: node.ignoreCase - }) : null; - return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(match, node.ignoreCase ? [op.MATCH_STRING_IC, stringIndex] : [op.MATCH_STRING, stringIndex], node.ignoreCase ? [op.ACCEPT_N, node.value.length] : [op.ACCEPT_STRING, stringIndex], [op.PUSH_FAILED])); - } - - return [op.PUSH_EMPTY_STRING]; - }, - class: function _class(node, context) { - var match = node.match | 0; - var classIndex = match === 0 ? addClassConst(node) : null; - var expectedIndex = context.reportFailures ? addExpectedConst({ - type: "class", - value: node.parts, - inverted: node.inverted, - ignoreCase: node.ignoreCase - }) : null; - return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(match, [op.MATCH_CLASS, classIndex], [op.ACCEPT_N, 1], [op.PUSH_FAILED])); - }, - any: function any(node, context) { - var expectedIndex = context.reportFailures ? addExpectedConst({ - type: "any" - }) : null; - return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(node.match | 0, [op.MATCH_ANY], [op.ACCEPT_N, 1], [op.PUSH_FAILED])); - } - }); - generate(ast); - } - - var generateBytecode_1 = generateBytecode; - - var _package = { - name: "pegjs", - version: "0.11.0-dev", - description: "Parser generator for JavaScript", - keywords: [ - "PEG.js", - "pegjs", - "grammar", - "parser", - "generator", - "language", - "PEG" - ], - homepage: "https://pegjs.org/", - repository: "pegjs/pegjs", - license: "MIT", - contributors: [ - "David Majda (https://majda.cz/)", - "Futago-za Ryuu " - ], - types: "typings/pegjs.d.ts", - main: "lib/peg.js", - bin: "bin/peg.js", - engines: { - node: ">= 6" - } - }; - - var _package$1 = /*#__PURE__*/Object.freeze({ - default: _package - }); - - var require$$0 = getCjsExportFromNamespace(_package$1); - - var VERSION = require$$0.version; - - function generateJS(ast, session, options) { - var op = session.opcodes; - var features = options.features || {}; - - function use(feature, use) { - return feature in features ? !!features[feature] : use == null ? true : !!use; - } - - var lineMatchRE = /^([^`\r\n]+?(?:`[^`]*?`[^\r\n]*?)?)$/gm; - - function indent2(code) { - return code.replace(lineMatchRE, " $1"); - } - - function indent10(code) { - return code.replace(lineMatchRE, " $1"); - } - - var l = function l(i) { - return "peg$c" + i; - }; - - var r = function r(i) { - return "peg$r" + i; - }; - - var e = function e(i) { - return "peg$e" + i; - }; - - var f = function f(i) { - return "peg$f" + i; - }; - - function generateTables() { - function buildLiteral(literal) { - return "\"".concat(util.stringEscape(literal), "\""); - } - - function buildRegexp(cls) { - return "/^[" + (cls.inverted ? "^" : "") + cls.value.map(function (part) { - return Array.isArray(part) ? util.regexpEscape(part[0]) + "-" + util.regexpEscape(part[1]) : util.regexpEscape(part); - }).join("") + "]/" + (cls.ignoreCase ? "i" : ""); - } - - function buildExpectation(e) { - switch (e.type) { - case "rule": - return "peg$otherExpectation(\"".concat(util.stringEscape(e.value), "\")"); - - case "literal": - return "peg$literalExpectation(\"" + util.stringEscape(e.value) + "\", " + e.ignoreCase + ")"; - - case "class": - { - var parts = e.value.map(function (part) { - return Array.isArray(part) ? "[\"".concat(util.stringEscape(part[0]), "\", \"").concat(util.stringEscape(part[1]), "\"]") : "\"".concat(util.stringEscape(part), "\""); - }); - return "peg$classExpectation([" + parts.join(", ") + "], " + e.inverted + ", " + e.ignoreCase + ")"; - } - - case "any": - return "peg$anyExpectation()"; - - default: - session.fatal("Unknown expectation type (".concat(JSON.stringify(e), ")")); - } - } - - function buildFunc(f) { - return "function(".concat(f.params.join(", "), ") {").concat(f.body, "}"); - } - - if (options.optimize === "size") { - return ["var peg$literals = [", indent2(ast.literals.map(buildLiteral).join(",\n")), "];", "var peg$regexps = [", indent2(ast.classes.map(buildRegexp).join(",\n")), "];", "var peg$expectations = [", indent2(ast.expectations.map(buildExpectation).join(",\n")), "];", "var peg$functions = [", indent2(ast.functions.map(buildFunc).join(",\n")), "];", "", "var peg$bytecode = [", indent2(ast.rules.map(function (rule) { - return "peg$decode(\"".concat(util.stringEscape(rule.bytecode.map(function (b) { - return String.fromCharCode(b + 32); - }).join("")), "\")"); - }).join(",\n")), "];"].join("\n"); - } - - return ast.literals.map(function (c, i) { - return "var " + l(i) + " = " + buildLiteral(c) + ";"; - }).concat("", ast.classes.map(function (c, i) { - return "var " + r(i) + " = " + buildRegexp(c) + ";"; - })).concat("", ast.expectations.map(function (c, i) { - return "var " + e(i) + " = " + buildExpectation(c) + ";"; - })).concat("", ast.functions.map(function (c, i) { - return "var " + f(i) + " = " + buildFunc(c) + ";"; - })).join("\n"); - } - - function generateRuleHeader(ruleNameCode, ruleIndexCode) { - var parts = []; - parts.push(["", "var rule$expects = function (expected) {", " if (peg$silentFails === 0) peg$expect(expected);", "}", ""].join("\n")); - - if (options.trace) { - parts.push(["peg$tracer.trace({", " type: \"rule.enter\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", "});", ""].join("\n")); - } - - if (options.cache) { - parts.push(["var key = peg$currPos * " + ast.rules.length + " + " + ruleIndexCode + ";", "var cached = peg$resultsCache[key];", "var rule$expectations = [];", "", "rule$expects = function (expected) {", " if (peg$silentFails === 0) peg$expect(expected);", " rule$expectations.push(expected);", "}", "", "if (cached) {", " peg$currPos = cached.nextPos;", "", " rule$expectations = cached.expectations;", " if (peg$silentFails === 0) {", " rule$expectations.forEach(peg$expect);", " }", ""].join("\n")); - - if (options.trace) { - parts.push(["if (cached.result !== peg$FAILED) {", " peg$tracer.trace({", " type: \"rule.match\",", " rule: " + ruleNameCode + ",", " result: cached.result,", " location: peg$computeLocation(startPos, peg$currPos)", " });", "} else {", " peg$tracer.trace({", " type: \"rule.fail\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", " });", "}", ""].join("\n")); - } - - parts.push([" return cached.result;", "}", ""].join("\n")); - } - - return parts.join("\n"); - } - - function generateRuleFooter(ruleNameCode, resultCode) { - var parts = []; - - if (options.cache) { - parts.push(["", "peg$resultsCache[key] = {", " nextPos: peg$currPos,", " result: " + resultCode + ",", " expectations: rule$expectations", "};"].join("\n")); - } - - if (options.trace) { - parts.push(["", "if (" + resultCode + " !== peg$FAILED) {", " peg$tracer.trace({", " type: \"rule.match\",", " rule: " + ruleNameCode + ",", " result: " + resultCode + ",", " location: peg$computeLocation(startPos, peg$currPos)", " });", "} else {", " peg$tracer.trace({", " type: \"rule.fail\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", " });", "}"].join("\n")); - } - - parts.push(["", "return " + resultCode + ";"].join("\n")); - return parts.join("\n"); - } - - function generateInterpreter() { - var parts = []; - - function generateCondition(cond, argsLength) { - var baseLength = argsLength + 3; - var thenLengthCode = "bc[ip + " + (baseLength - 2) + "]"; - var elseLengthCode = "bc[ip + " + (baseLength - 1) + "]"; - return ["ends.push(end);", "ips.push(ip + " + baseLength + " + " + thenLengthCode + " + " + elseLengthCode + ");", "", "if (" + cond + ") {", " end = ip + " + baseLength + " + " + thenLengthCode + ";", " ip += " + baseLength + ";", "} else {", " end = ip + " + baseLength + " + " + thenLengthCode + " + " + elseLengthCode + ";", " ip += " + baseLength + " + " + thenLengthCode + ";", "}", "", "break;"].join("\n"); - } - - function generateLoop(cond) { - var baseLength = 2; - var bodyLengthCode = "bc[ip + " + (baseLength - 1) + "]"; - return ["if (" + cond + ") {", " ends.push(end);", " ips.push(ip);", "", " end = ip + " + baseLength + " + " + bodyLengthCode + ";", " ip += " + baseLength + ";", "} else {", " ip += " + baseLength + " + " + bodyLengthCode + ";", "}", "", "break;"].join("\n"); - } - - function generateCall() { - var baseLength = 4; - var paramsLengthCode = "bc[ip + " + (baseLength - 1) + "]"; - return ["params = bc.slice(ip + " + baseLength + ", ip + " + baseLength + " + " + paramsLengthCode + ")", " .map(function(p) { return stack[stack.length - 1 - p]; });", "", "stack.splice(", " stack.length - bc[ip + 2],", " bc[ip + 2],", " peg$functions[bc[ip + 1]].apply(null, params)", ");", "", "ip += " + baseLength + " + " + paramsLengthCode + ";", "break;"].join("\n"); - } - - parts.push(["function peg$decode(s) {", " return s.split(\"\").map(function(ch) { return ch.charCodeAt(0) - 32; });", "}", "", "function peg$parseRule(index) {"].join("\n")); - - if (options.trace) { - parts.push([" var bc = peg$bytecode[index];", " var ip = 0;", " var ips = [];", " var end = bc.length;", " var ends = [];", " var stack = [];", " var startPos = peg$currPos;", " var params, paramsLength, paramsN;"].join("\n")); - } else { - parts.push([" var bc = peg$bytecode[index];", " var ip = 0;", " var ips = [];", " var end = bc.length;", " var ends = [];", " var stack = [];", " var params, paramsLength, paramsN;"].join("\n")); - } - - parts.push(indent2(generateRuleHeader("peg$ruleNames[index]", "index"))); - parts.push([" while (true) {", " while (ip < end) {", " switch (bc[ip]) {", " case " + op.PUSH_EMPTY_STRING + ":", " stack.push('');", " ip++;", " break;", "", " case " + op.PUSH_UNDEFINED + ":", " stack.push(undefined);", " ip++;", " break;", "", " case " + op.PUSH_NULL + ":", " stack.push(null);", " ip++;", " break;", "", " case " + op.PUSH_FAILED + ":", " stack.push(peg$FAILED);", " ip++;", " break;", "", " case " + op.PUSH_EMPTY_ARRAY + ":", " stack.push([]);", " ip++;", " break;", "", " case " + op.PUSH_CURR_POS + ":", " stack.push(peg$currPos);", " ip++;", " break;", "", " case " + op.POP + ":", " stack.pop();", " ip++;", " break;", "", " case " + op.POP_CURR_POS + ":", " peg$currPos = stack.pop();", " ip++;", " break;", "", " case " + op.POP_N + ":", " stack.length -= bc[ip + 1];", " ip += 2;", " break;", "", " case " + op.NIP + ":", " stack.splice(-2, 1);", " ip++;", " break;", "", " case " + op.APPEND + ":", " stack[stack.length - 2].push(stack.pop());", " ip++;", " break;", "", " case " + op.WRAP + ":", " stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1]));", " ip += 2;", " break;", "", " case " + op.TEXT + ":", " stack.push(input.substring(stack.pop(), peg$currPos));", " ip++;", " break;", "", " case " + op.PLUCK + ":", " paramsLength = bc[ip + 2];", " paramsN = 3 + paramsLength", "", " params = bc.slice(ip + 3, ip + paramsN);", " params = paramsLength === 1", " ? stack[stack.length - 1 - params[ 0 ]]", " : params.map(function(p) { return stack[stack.length - 1 - p]; });", "", " stack.splice(", " stack.length - bc[ip + 1],", " bc[ip + 1],", " params", " );", "", " ip += paramsN;", " break;", "", " case " + op.IF + ":", indent10(generateCondition("stack[stack.length - 1]", 0)), "", " case " + op.IF_ERROR + ":", indent10(generateCondition("stack[stack.length - 1] === peg$FAILED", 0)), "", " case " + op.IF_NOT_ERROR + ":", indent10(generateCondition("stack[stack.length - 1] !== peg$FAILED", 0)), "", " case " + op.WHILE_NOT_ERROR + ":", indent10(generateLoop("stack[stack.length - 1] !== peg$FAILED")), "", " case " + op.MATCH_ANY + ":", indent10(generateCondition("input.length > peg$currPos", 0)), "", " case " + op.MATCH_STRING + ":", indent10(generateCondition("input.substr(peg$currPos, peg$literals[bc[ip + 1]].length) === peg$literals[bc[ip + 1]]", 1)), "", " case " + op.MATCH_STRING_IC + ":", indent10(generateCondition("input.substr(peg$currPos, peg$literals[bc[ip + 1]].length).toLowerCase() === peg$literals[bc[ip + 1]]", 1)), "", " case " + op.MATCH_CLASS + ":", indent10(generateCondition("peg$regexps[bc[ip + 1]].test(input.charAt(peg$currPos))", 1)), "", " case " + op.ACCEPT_N + ":", " stack.push(input.substr(peg$currPos, bc[ip + 1]));", " peg$currPos += bc[ip + 1];", " ip += 2;", " break;", "", " case " + op.ACCEPT_STRING + ":", " stack.push(peg$literals[bc[ip + 1]]);", " peg$currPos += peg$literals[bc[ip + 1]].length;", " ip += 2;", " break;", "", " case " + op.EXPECT + ":", " rule$expects(peg$expectations[bc[ip + 1]]);", " ip += 2;", " break;", "", " case " + op.LOAD_SAVED_POS + ":", " peg$savedPos = stack[stack.length - 1 - bc[ip + 1]];", " ip += 2;", " break;", "", " case " + op.UPDATE_SAVED_POS + ":", " peg$savedPos = peg$currPos;", " ip++;", " break;", "", " case " + op.CALL + ":", indent10(generateCall()), "", " case " + op.RULE + ":", " stack.push(peg$parseRule(bc[ip + 1]));", " ip += 2;", " break;", "", " case " + op.SILENT_FAILS_ON + ":", " peg$silentFails++;", " ip++;", " break;", "", " case " + op.SILENT_FAILS_OFF + ":", " peg$silentFails--;", " ip++;", " break;", "", " case " + op.EXPECT_NS_BEGIN + ":", " peg$begin();", " ip++;", " break;", "", " case " + op.EXPECT_NS_END + ":", " peg$end(bc[ip + 1]);", " ip += 2;", " break;", "", " // istanbul ignore next", " default:", " throw new Error(", " \"Rule #\" + index + \"" + (options.trace ? " ('\" + peg$ruleNames[ index ] + \"')" : "") + ", position \" + ip + \": \"", " + \"Invalid opcode \" + bc[ip] + \".\"", " );", " }", " }", "", " if (ends.length > 0) {", " end = ends.pop();", " ip = ips.pop();", " } else {", " break;", " }", " }"].join("\n")); - parts.push(indent2(generateRuleFooter("peg$ruleNames[index]", "stack[0]"))); - parts.push("}"); - return parts.join("\n"); - } - - function generateRuleFunction(rule) { - var parts = []; - var stackVars = []; - - function s(i) { - if (i < 0) session.fatal("Rule '" + rule.name + "': Var stack underflow: attempt to use var at index " + i); - return "s" + i; - } - - var stack = { - sp: -1, - maxSp: -1, - push: function push(exprCode) { - var code = s(++this.sp) + " = " + exprCode + ";"; - if (this.sp > this.maxSp) this.maxSp = this.sp; - return code; - }, - pop: function pop(n) { - if (typeof n === "undefined") return s(this.sp--); - var values = Array(n); - - for (var i = 0; i < n; i++) { - values[i] = s(this.sp - n + 1 + i); - } - - this.sp -= n; - return values; - }, - top: function top() { - return s(this.sp); - }, - index: function index(i) { - return s(this.sp - i); - } - }; - - function compile(bc) { - var ip = 0; - var end = bc.length; - var parts = []; - var value; - - function compileCondition(cond, argCount) { - var pos = ip; - var baseLength = argCount + 3; - var thenLength = bc[ip + baseLength - 2]; - var elseLength = bc[ip + baseLength - 1]; - var baseSp = stack.sp; - var thenCode, elseCode, thenSp, elseSp; - ip += baseLength; - thenCode = compile(bc.slice(ip, ip + thenLength)); - thenSp = stack.sp; - ip += thenLength; - - if (elseLength > 0) { - stack.sp = baseSp; - elseCode = compile(bc.slice(ip, ip + elseLength)); - elseSp = stack.sp; - ip += elseLength; - - if (thenSp !== elseSp) { - session.fatal("Rule '" + rule.name + "', position " + pos + ": " + "Branches of a condition can't move the stack pointer differently " + "(before: " + baseSp + ", after then: " + thenSp + ", after else: " + elseSp + ")."); - } - } - - parts.push("if (" + cond + ") {"); - parts.push(indent2(thenCode)); - - if (elseLength > 0) { - parts.push("} else {"); - parts.push(indent2(elseCode)); - } - - parts.push("}"); - } - - function compileLoop(cond) { - var pos = ip; - var baseLength = 2; - var bodyLength = bc[ip + baseLength - 1]; - var baseSp = stack.sp; - var bodyCode, bodySp; - ip += baseLength; - bodyCode = compile(bc.slice(ip, ip + bodyLength)); - bodySp = stack.sp; - ip += bodyLength; - - if (bodySp !== baseSp) { - session.fatal("Rule '" + rule.name + "', position " + pos + ": " + "Body of a loop can't move the stack pointer " + "(before: " + baseSp + ", after: " + bodySp + ")."); - } - - parts.push("while (" + cond + ") {"); - parts.push(indent2(bodyCode)); - parts.push("}"); - } - - function compileCall() { - var baseLength = 4; - var paramsLength = bc[ip + baseLength - 1]; - var value = f(bc[ip + 1]) + "(" + bc.slice(ip + baseLength, ip + baseLength + paramsLength).map(function (p) { - return stack.index(p); - }).join(", ") + ")"; - stack.pop(bc[ip + 2]); - parts.push(stack.push(value)); - ip += baseLength + paramsLength; - } - - while (ip < end) { - switch (bc[ip]) { - case op.PUSH_EMPTY_STRING: - parts.push(stack.push("''")); - ip++; - break; - - case op.PUSH_CURR_POS: - parts.push(stack.push("peg$currPos")); - ip++; - break; - - case op.PUSH_UNDEFINED: - parts.push(stack.push("undefined")); - ip++; - break; - - case op.PUSH_NULL: - parts.push(stack.push("null")); - ip++; - break; - - case op.PUSH_FAILED: - parts.push(stack.push("peg$FAILED")); - ip++; - break; - - case op.PUSH_EMPTY_ARRAY: - parts.push(stack.push("[]")); - ip++; - break; - - case op.POP: - stack.pop(); - ip++; - break; - - case op.POP_CURR_POS: - parts.push("peg$currPos = " + stack.pop() + ";"); - ip++; - break; - - case op.POP_N: - stack.pop(bc[ip + 1]); - ip += 2; - break; - - case op.NIP: - value = stack.pop(); - stack.pop(); - parts.push(stack.push(value)); - ip++; - break; - - case op.APPEND: - value = stack.pop(); - parts.push(stack.top() + ".push(" + value + ");"); - ip++; - break; - - case op.WRAP: - parts.push(stack.push("[" + stack.pop(bc[ip + 1]).join(", ") + "]")); - ip += 2; - break; - - case op.TEXT: - parts.push(stack.push("input.substring(" + stack.pop() + ", peg$currPos)")); - ip++; - break; - - case op.PLUCK: - var baseLength = 3; - var paramsLength = bc[ip + baseLength - 1]; - var n = baseLength + paramsLength; - value = bc.slice(ip + baseLength, ip + n); - value = paramsLength === 1 ? stack.index(value[0]) : "[ ".concat(value.map(function (p) { - return stack.index(p); - }).join(", "), " ]"); - stack.pop(bc[ip + 1]); - parts.push(stack.push(value)); - ip += n; - break; - - case op.IF: - compileCondition(stack.top(), 0); - break; - - case op.IF_ERROR: - compileCondition(stack.top() + " === peg$FAILED", 0); - break; - - case op.IF_NOT_ERROR: - compileCondition(stack.top() + " !== peg$FAILED", 0); - break; - - case op.WHILE_NOT_ERROR: - compileLoop(stack.top() + " !== peg$FAILED", 0); - break; - - case op.MATCH_ANY: - compileCondition("input.length > peg$currPos", 0); - break; - - case op.MATCH_STRING: - compileCondition(ast.literals[bc[ip + 1]].length > 1 ? "input.substr(peg$currPos, " + ast.literals[bc[ip + 1]].length + ") === " + l(bc[ip + 1]) : "input.charCodeAt(peg$currPos) === " + ast.literals[bc[ip + 1]].charCodeAt(0), 1); - break; - - case op.MATCH_STRING_IC: - compileCondition("input.substr(peg$currPos, " + ast.literals[bc[ip + 1]].length + ").toLowerCase() === " + l(bc[ip + 1]), 1); - break; - - case op.MATCH_CLASS: - compileCondition(r(bc[ip + 1]) + ".test(input.charAt(peg$currPos))", 1); - break; - - case op.ACCEPT_N: - parts.push(stack.push(bc[ip + 1] > 1 ? "input.substr(peg$currPos, " + bc[ip + 1] + ")" : "input.charAt(peg$currPos)")); - parts.push(bc[ip + 1] > 1 ? "peg$currPos += " + bc[ip + 1] + ";" : "peg$currPos++;"); - ip += 2; - break; - - case op.ACCEPT_STRING: - parts.push(stack.push(l(bc[ip + 1]))); - parts.push(ast.literals[bc[ip + 1]].length > 1 ? "peg$currPos += " + ast.literals[bc[ip + 1]].length + ";" : "peg$currPos++;"); - ip += 2; - break; - - case op.EXPECT: - parts.push("rule$expects(" + e(bc[ip + 1]) + ");"); - ip += 2; - break; - - case op.LOAD_SAVED_POS: - parts.push("peg$savedPos = " + stack.index(bc[ip + 1]) + ";"); - ip += 2; - break; - - case op.UPDATE_SAVED_POS: - parts.push("peg$savedPos = peg$currPos;"); - ip++; - break; - - case op.CALL: - compileCall(); - break; - - case op.RULE: - parts.push(stack.push("peg$parse" + ast.rules[bc[ip + 1]].name + "()")); - ip += 2; - break; - - case op.SILENT_FAILS_ON: - parts.push("peg$silentFails++;"); - ip++; - break; - - case op.SILENT_FAILS_OFF: - parts.push("peg$silentFails--;"); - ip++; - break; - - case op.EXPECT_NS_BEGIN: - parts.push("peg$begin();"); - ip++; - break; - - case op.EXPECT_NS_END: - parts.push("peg$end(" + (bc[ip + 1] !== 0) + ");"); - ip += 2; - break; - - default: - session.fatal("Rule '" + rule.name + "', position " + ip + ": " + "Invalid opcode " + bc[ip] + "."); - } - } - - return parts.join("\n"); - } - - var code = compile(rule.bytecode); - parts.push("function peg$parse" + rule.name + "() {"); - - if (options.trace) { - parts.push(" var startPos = peg$currPos;"); - } - - for (var i = 0; i <= stack.maxSp; i++) { - stackVars[i] = s(i); - } - - parts.push(" var " + stackVars.join(", ") + ";"); - parts.push(indent2(generateRuleHeader("\"" + util.stringEscape(rule.name) + "\"", ast.indexOfRule(rule.name)))); - parts.push(indent2(code)); - parts.push(indent2(generateRuleFooter("\"" + util.stringEscape(rule.name) + "\"", s(0)))); - parts.push("}"); - return parts.join("\n"); - } - - function generateToplevel() { - var parts = []; - parts.push(["function peg$subclass(child, parent) {", " function C() { this.constructor = child; }", " C.prototype = parent.prototype;", " child.prototype = new C();", "}", "", "function peg$SyntaxError(message, expected, found, location) {", " this.message = message;", " this.expected = expected;", " this.found = found;", " this.location = location;", " this.name = \"SyntaxError\";", "", " // istanbul ignore next", " if (typeof Error.captureStackTrace === \"function\") {", " Error.captureStackTrace(this, peg$SyntaxError);", " }", "}", "", "peg$subclass(peg$SyntaxError, Error);", "", "peg$SyntaxError.buildMessage = function(expected, found) {", " var DESCRIBE_EXPECTATION_FNS = {", " literal: function(expectation) {", " return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";", " },", "", " class: function(expectation) {", " var escapedParts = expectation.parts.map(function(part) {", " return Array.isArray(part)", " ? classEscape(part[0]) + \"-\" + classEscape(part[1])", " : classEscape(part);", " });", "", " return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";", " },", "", " any: function() {", " return \"any character\";", " },", "", " end: function() {", " return \"end of input\";", " },", "", " other: function(expectation) {", " return expectation.description;", " },", "", " not: function(expectation) {", " return \"not \" + describeExpectation(expectation.expected);", " }", " };", "", " function hex(ch) {", " return ch.charCodeAt(0).toString(16).toUpperCase();", " }", "", " function literalEscape(s) {", " return s", " .replace(/\\\\/g, \"\\\\\\\\\")", " .replace(/\"/g, \"\\\\\\\"\")", " .replace(/\\0/g, \"\\\\0\")", " .replace(/\\t/g, \"\\\\t\")", " .replace(/\\n/g, \"\\\\n\")", " .replace(/\\r/g, \"\\\\r\")", " .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })", " .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });", " }", "", " function classEscape(s) {", " return s", " .replace(/\\\\/g, \"\\\\\\\\\")", " .replace(/\\]/g, \"\\\\]\")", " .replace(/\\^/g, \"\\\\^\")", " .replace(/-/g, \"\\\\-\")", " .replace(/\\0/g, \"\\\\0\")", " .replace(/\\t/g, \"\\\\t\")", " .replace(/\\n/g, \"\\\\n\")", " .replace(/\\r/g, \"\\\\r\")", " .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })", " .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });", " }", "", " function describeExpectation(expectation) {", " return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);", " }", "", " function describeExpected(expected) {", " var descriptions = expected.map(describeExpectation);", " var i, j;", "", " descriptions.sort();", "", " if (descriptions.length > 0) {", " for (i = 1, j = 1; i < descriptions.length; i++) {", " if (descriptions[i - 1] !== descriptions[i]) {", " descriptions[j] = descriptions[i];", " j++;", " }", " }", " descriptions.length = j;", " }", "", " switch (descriptions.length) {", " case 1:", " return descriptions[0];", "", " case 2:", " return descriptions[0] + \" or \" + descriptions[1];", "", " default:", " return descriptions.slice(0, -1).join(\", \")", " + \", or \"", " + descriptions[descriptions.length - 1];", " }", " }", "", " function describeFound(found) {", " return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";", " }", "", " return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";", "};", ""].join("\n")); - - if (options.trace) { - if (use("DefaultTracer")) parts.push(["function peg$DefaultTracer() {", " this.indentLevel = 0;", "}", "", "peg$DefaultTracer.prototype.trace = function(event) {", " var that = this;", "", " function log(event) {", " function repeat(string, n) {", " var result = \"\", i;", "", " for (i = 0; i < n; i++) {", " result += string;", " }", "", " return result;", " }", "", " function pad(string, length) {", " return string + repeat(\" \", length - string.length);", " }", "", " if (typeof console === \"object\") {", " console.log(", " event.location.start.line + \":\" + event.location.start.column + \"-\"", " + event.location.end.line + \":\" + event.location.end.column + \" \"", " + pad(event.type, 10) + \" \"", " + repeat(\" \", that.indentLevel) + event.rule", " );", " }", " }", "", " switch (event.type) {", " case \"rule.enter\":", " log(event);", " this.indentLevel++;", " break;", "", " case \"rule.match\":", " this.indentLevel--;", " log(event);", " break;", "", " case \"rule.fail\":", " this.indentLevel--;", " log(event);", " break;", "", " // istanbul ignore next", " default:", " throw new Error(\"Invalid event type: \" + event.type + \".\");", " }", "};", ""].join("\n"));else parts.push(["var peg$FauxTracer = {", " trace: function(event) { }", "};", ""].join("\n")); - } - - parts.push(["function peg$parse(input, options) {", " options = options !== undefined ? options : {};", "", " var peg$FAILED = {};", ""].join("\n")); - - if (options.optimize === "size") { - var startRuleIndices = "{ " + options.allowedStartRules.map(function (r) { - return r + ": " + ast.indexOfRule(r); - }).join(", ") + " }"; - var startRuleIndex = ast.indexOfRule(options.allowedStartRules[0]); - parts.push([" var peg$startRuleIndices = " + startRuleIndices + ";", " var peg$startRuleIndex = " + startRuleIndex + ";"].join("\n")); - } else { - var startRuleFunctions = "{ " + options.allowedStartRules.map(function (r) { - return r + ": peg$parse" + r; - }).join(", ") + " }"; - var startRuleFunction = "peg$parse" + options.allowedStartRules[0]; - parts.push([" var peg$startRuleFunctions = " + startRuleFunctions + ";", " var peg$startRuleFunction = " + startRuleFunction + ";"].join("\n")); - } - - parts.push(""); - parts.push(indent2(generateTables())); - parts.push(["", " var peg$currPos = 0;", " var peg$savedPos = 0;", " var peg$posDetailsCache = [{ line: 1, column: 1 }];", " var peg$expected = [];", " var peg$silentFails = 0;", ""].join("\n")); - - if (options.cache) { - parts.push([" var peg$resultsCache = {};", ""].join("\n")); - } - - if (options.trace) { - if (options.optimize === "size") { - var ruleNames = "[" + ast.rules.map(function (r) { - return "\"".concat(util.stringEscape(r.name), "\""); - }).join(", ") + "]"; - parts.push([" var peg$ruleNames = " + ruleNames + ";", ""].join("\n")); - } - - if (use("DefaultTracer")) parts.push([" var peg$tracer = \"tracer\" in options ? options.tracer : new peg$DefaultTracer();", ""].join("\n"));else parts.push([" var peg$tracer = \"tracer\" in options ? options.tracer : peg$FauxTracer;", ""].join("\n")); - } - - parts.push([" var peg$result;", ""].join("\n")); - - if (options.optimize === "size") { - parts.push([" if (\"startRule\" in options) {", " if (!(options.startRule in peg$startRuleIndices)) {", " throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");", " }", "", " peg$startRuleIndex = peg$startRuleIndices[options.startRule];", " }"].join("\n")); - } else { - parts.push([" if (\"startRule\" in options) {", " if (!(options.startRule in peg$startRuleFunctions)) {", " throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");", " }", "", " peg$startRuleFunction = peg$startRuleFunctions[options.startRule];", " }"].join("\n")); - } - - if (use("text")) { - parts.push(["", " function text() {", " return input.substring(peg$savedPos, peg$currPos);", " }"].join("\n")); - } - - if (use("offset")) { - parts.push(["", " function offset() {", " return peg$savedPos;", " }"].join("\n")); - } - - if (use("range")) { - parts.push(["", " function range() {", " return [peg$savedPos, peg$currPos];", " }"].join("\n")); - } - - if (use("location")) { - parts.push(["", " function location() {", " return peg$computeLocation(peg$savedPos, peg$currPos);", " }"].join("\n")); - } - - if (use("expected")) { - parts.push(["", " function expected(description, location) {", " location = location !== undefined", " ? location", " : peg$computeLocation(peg$savedPos, peg$currPos);", "", " throw peg$buildStructuredError(", " [peg$otherExpectation(description)],", " input.substring(peg$savedPos, peg$currPos),", " location", " );", " }"].join("\n")); - } - - if (use("error")) { - parts.push(["", " function error(message, location) {", " location = location !== undefined", " ? location", " : peg$computeLocation(peg$savedPos, peg$currPos);", "", " throw peg$buildSimpleError(message, location);", " }"].join("\n")); - } - - parts.push(["", " function peg$literalExpectation(text, ignoreCase) {", " return { type: \"literal\", text: text, ignoreCase: ignoreCase };", " }", "", " function peg$classExpectation(parts, inverted, ignoreCase) {", " return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };", " }", "", " function peg$anyExpectation() {", " return { type: \"any\" };", " }", "", " function peg$endExpectation() {", " return { type: \"end\" };", " }", "", " function peg$otherExpectation(description) {", " return { type: \"other\", description: description };", " }", "", " function peg$computePosDetails(pos) {", " var details = peg$posDetailsCache[pos];", " var p;", "", " if (details) {", " return details;", " } else {", " p = pos - 1;", " while (!peg$posDetailsCache[p]) {", " p--;", " }", "", " details = peg$posDetailsCache[p];", " details = {", " line: details.line,", " column: details.column", " };", "", " while (p < pos) {", " if (input.charCodeAt(p) === 10) {", " details.line++;", " details.column = 1;", " } else {", " details.column++;", " }", "", " p++;", " }", "", " peg$posDetailsCache[pos] = details;", "", " return details;", " }", " }", "", use("filename") ? " var peg$VALIDFILENAME = typeof options.filename === \"string\" && options.filename.length > 0;" : "", " function peg$computeLocation(startPos, endPos) {", " var loc = {};", "", use("filename") ? " if ( peg$VALIDFILENAME ) loc.filename = options.filename;" : "", "", " var startPosDetails = peg$computePosDetails(startPos);", " loc.start = {", " offset: startPos,", " line: startPosDetails.line,", " column: startPosDetails.column", " };", "", " var endPosDetails = peg$computePosDetails(endPos);", " loc.end = {", " offset: endPos,", " line: endPosDetails.line,", " column: endPosDetails.column", " };", "", " return loc;", " }", "", " function peg$begin() {", " peg$expected.push({ pos: peg$currPos, variants: [] });", " }", "", " function peg$expect(expected) {", " var top = peg$expected[peg$expected.length - 1];", "", " if (peg$currPos < top.pos) { return; }", "", " if (peg$currPos > top.pos) {", " top.pos = peg$currPos;", " top.variants = [];", " }", "", " top.variants.push(expected);", " }", "", " function peg$end(invert) {", " var expected = peg$expected.pop();", " var top = peg$expected[peg$expected.length - 1];", " var variants = expected.variants;", "", " if (top.pos !== expected.pos) { return; }", "", " if (invert) {", " variants = variants.map(function(e) {", " return e.type === \"not\" ? e.expected : { type: \"not\", expected: e };", " });", " }", "", " Array.prototype.push.apply(top.variants, variants);", " }", "", " function peg$buildSimpleError(message, location) {", " return new peg$SyntaxError(message, null, null, location);", " }", "", " function peg$buildStructuredError(expected, found, location) {", " return new peg$SyntaxError(", " peg$SyntaxError.buildMessage(expected, found),", " expected,", " found,", " location", " );", " }", "", " function peg$buildError() {", " var expected = peg$expected[0];", " var failPos = expected.pos;", "", " return peg$buildStructuredError(", " expected.variants,", " failPos < input.length ? input.charAt(failPos) : null,", " failPos < input.length", " ? peg$computeLocation(failPos, failPos + 1)", " : peg$computeLocation(failPos, failPos)", " );", " }", ""].join("\n")); - - if (options.optimize === "size") { - parts.push(indent2(generateInterpreter())); - parts.push(""); - } else { - ast.rules.forEach(function (rule) { - parts.push(indent2(generateRuleFunction(rule))); - parts.push(""); - }); - } - - if (ast.initializer) { - parts.push(indent2(ast.initializer.code)); - parts.push(""); - } - - parts.push(" peg$begin();"); - - if (options.optimize === "size") { - parts.push(" peg$result = peg$parseRule(peg$startRuleIndex);"); - } else { - parts.push(" peg$result = peg$startRuleFunction();"); - } - - parts.push(["", " if (peg$result !== peg$FAILED && peg$currPos === input.length) {", " return peg$result;", " } else {", " if (peg$result !== peg$FAILED && peg$currPos < input.length) {", " peg$expect(peg$endExpectation());", " }", "", " throw peg$buildError();", " }", "}"].join("\n")); - return parts.join("\n"); - } - - function generateWrapper(toplevelCode) { - function generateHeaderComment() { - var comment = "// Generated by PEG.js v".concat(VERSION, ", https://pegjs.org/"); - var header = options.header; - - if (typeof header === "string") { - comment += "\n\n" + header; - } else if (Array.isArray(header)) { - comment += "\n\n"; - header.forEach(function (data) { - comment += "// " + data; - }); - } - - return comment; - } - - function generateParserObject() { - return options.trace && use("DefaultTracer") ? ["{", " SyntaxError: peg$SyntaxError,", " DefaultTracer: peg$DefaultTracer,", " parse: peg$parse", "}"].join("\n") : ["{", " SyntaxError: peg$SyntaxError,", " parse: peg$parse", "}"].join("\n"); - } - - function generateParserExports() { - return options.trace && use("DefaultTracer") ? ["{", " peg$SyntaxError as SyntaxError,", " peg$DefaultTracer as DefaultTracer,", " peg$parse as parse", "}"].join("\n") : ["{", " peg$SyntaxError as SyntaxError,", " peg$parse as parse", "}"].join("\n"); - } - - var generators = { - bare: function bare() { - return [generateHeaderComment(), "(function() {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "})()"].join("\n"); - }, - commonjs: function commonjs() { - var parts = []; - var dependencyVars = Object.keys(options.dependencies); - parts.push([generateHeaderComment(), "", "\"use strict\";", ""].join("\n")); - - if (dependencyVars.length > 0) { - dependencyVars.forEach(function (variable) { - parts.push("var " + variable + " = require(\"" + util.stringEscape(options.dependencies[variable]) + "\");"); - }); - parts.push(""); - } - - parts.push([toplevelCode, "", "module.exports = " + generateParserObject() + ";", ""].join("\n")); - return parts.join("\n"); - }, - es: function es() { - var parts = []; - var dependencyVars = Object.keys(options.dependencies); - parts.push(generateHeaderComment(), ""); - - if (dependencyVars.length > 0) { - dependencyVars.forEach(function (variable) { - parts.push("import " + variable + " from \"" + util.stringEscape(options.dependencies[variable]) + "\";"); - }); - parts.push(""); - } - - parts.push(toplevelCode, "", "export " + generateParserExports() + ";", "", "export default " + generateParserObject() + ";", ""); - return parts.join("\n"); - }, - amd: function amd() { - var dependencyVars = Object.keys(options.dependencies); - var dependencyIds = dependencyVars.map(function (v) { - return options.dependencies[v]; - }); - var dependencies = "[" + dependencyIds.map(function (id) { - return "\"".concat(util.stringEscape(id), "\""); - }).join(", ") + "]"; - var params = dependencyVars.join(", "); - return [generateHeaderComment(), "define(" + dependencies + ", function(" + params + ") {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "});", ""].join("\n"); - }, - globals: function globals() { - return [generateHeaderComment(), "(function(root) {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("root." + options.exportVar + " = " + generateParserObject() + ";"), "})(this);", ""].join("\n"); - }, - umd: function umd() { - var parts = []; - var dependencyVars = Object.keys(options.dependencies); - var dependencyIds = dependencyVars.map(function (v) { - return options.dependencies[v]; - }); - var dependencies = "[" + dependencyIds.map(function (id) { - return "\"".concat(util.stringEscape(id), "\""); - }).join(", ") + "]"; - var requires = dependencyIds.map(function (id) { - return "require(\"".concat(util.stringEscape(id), "\")"); - }).join(", "); - var args = dependencyVars.map(function (v) { - return "root." + v; - }).join(", "); - var params = dependencyVars.join(", "); - parts.push([generateHeaderComment(), "(function(root, factory) {", " if (typeof define === \"function\" && define.amd) {", " define(" + dependencies + ", factory);", " } else if (typeof module === \"object\" && module.exports) {", " module.exports = factory(" + requires + ");"].join("\n")); - - if (options.exportVar !== null) { - parts.push([" } else {", " root." + options.exportVar + " = factory(" + args + ");"].join("\n")); - } - - parts.push([" }", "})(this, function(" + params + ") {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "});", ""].join("\n")); - return parts.join("\n"); - } - }; - return generators[options.format](); - } - - ast.code = generateWrapper(generateToplevel()); - } - - var generateJs = generateJS; - - function removeProxyRules(ast, session, options) { - function isProxyRule(node) { - return node.type === "rule" && node.expression.type === "rule_ref"; - } - - var replaceRuleRefs = session.buildVisitor({ - rule_ref: function rule_ref(node, proxy, real) { - if (node.name === proxy) node.name = real; - } - }); - var allowedStartRules = options.allowedStartRules; - var rules = []; - ast.rules.forEach(function (rule) { - if (isProxyRule(rule)) { - replaceRuleRefs(ast, rule.name, rule.expression.name); - if (allowedStartRules.indexOf(rule.name) < 0) return; - } - - rules.push(rule); - }); - ast.rules = rules; - } - - var removeProxyRules_1 = removeProxyRules; - - var __hasOwnProperty$1 = Object.prototype.hasOwnProperty; - - function reportDuplicateLabels(ast, session) { - var check; - - function checkExpressionWithClonedEnv(node, env) { - check(node.expression, util.clone(env)); - } - - check = session.buildVisitor({ - rule: function rule(node) { - check(node.expression, {}); - }, - choice: function choice(node, env) { - node.alternatives.forEach(function (alternative) { - check(alternative, util.clone(env)); - }); - }, - action: checkExpressionWithClonedEnv, - labeled: function labeled(node, env) { - var label = node.label; - - if (label && __hasOwnProperty$1.call(env, label)) { - var start = env[label].start; - session.error("Label \"".concat(label, "\" is already defined at line ").concat(start.line, ", column ").concat(start.column, "."), node.location); - } - - check(node.expression, env); - if (label) env[label] = node.location; - }, - text: checkExpressionWithClonedEnv, - simple_and: checkExpressionWithClonedEnv, - simple_not: checkExpressionWithClonedEnv, - optional: checkExpressionWithClonedEnv, - zero_or_more: checkExpressionWithClonedEnv, - one_or_more: checkExpressionWithClonedEnv, - group: checkExpressionWithClonedEnv - }); - check(ast); - } - - var reportDuplicateLabels_1 = reportDuplicateLabels; - - var __hasOwnProperty$2 = Object.prototype.hasOwnProperty; - - function reportDuplicateRules(ast, session) { - var rules = {}; - var check = session.buildVisitor({ - rule: function rule(node) { - var name = node.name; - - if (__hasOwnProperty$2.call(rules, name)) { - var start = rules[name].start; - session.error("Rule \"".concat(name, "\" is already defined at line ").concat(start.line, ", column ").concat(start.column, "."), node.location); - } - - rules[node.name] = node.location; - } - }); - check(ast); - } - - var reportDuplicateRules_1 = reportDuplicateRules; - - function reportUnusedRules(ast, session, options) { - var used = {}; - - function yes(node) { - used[node.name || node] = true; - } - - options.allowedStartRules.forEach(yes); - session.buildVisitor({ - rule_ref: yes - })(ast); - ast.rules.forEach(function (rule) { - if (used[rule.name] !== true) { - session.warn("Rule \"".concat(rule.name, "\" is not referenced."), rule.location); - } - }); - } - - var reportUnusedRules_1 = reportUnusedRules; - - function reportInfiniteRecursion(ast, session) { - var visitedRules = []; - var check = session.buildVisitor({ - rule: function rule(node) { - visitedRules.push(node.name); - check(node.expression); - visitedRules.pop(node.name); - }, - sequence: function sequence(node) { - node.elements.every(function (element) { - check(element); - return !ast.alwaysConsumesOnSuccess(element); - }); - }, - rule_ref: function rule_ref(node) { - if (visitedRules.indexOf(node.name) !== -1) { - visitedRules.push(node.name); - var rulePath = visitedRules.join(" -> "); - session.error("Possible infinite loop when parsing (left recursion: ".concat(rulePath, ")."), node.location); - } - - check(ast.findRule(node.name)); - } - }); - check(ast); - } - - var reportInfiniteRecursion_1 = reportInfiniteRecursion; - - function reportInfiniteRepetition(ast, session) { - var check = session.buildVisitor({ - zero_or_more: function zero_or_more(node) { - if (!ast.alwaysConsumesOnSuccess(node.expression)) { - session.error("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", node.location); - } - }, - one_or_more: function one_or_more(node) { - if (!ast.alwaysConsumesOnSuccess(node.expression)) { - session.error("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", node.location); - } - } - }); - check(ast); - } - - var reportInfiniteRepetition_1 = reportInfiniteRepetition; - - function reportUndefinedRules(ast, session, options) { - var check = session.buildVisitor({ - rule_ref: function rule_ref(node) { - if (!ast.findRule(node.name)) { - session.error("Rule \"".concat(node.name, "\" is not defined."), node.location); - } - } - }); - check(ast); - options.allowedStartRules.forEach(function (rule) { - if (!ast.findRule(rule)) { - session.error("Start rule \"".concat(rule, "\" is not defined.")); - } - }); - } - - var reportUndefinedRules_1 = reportUndefinedRules; - - function inferenceMatchResult(ast, session) { - var inference; - - function sometimesMatch(node) { - node.match = 0; - return node.match; - } - - function alwaysMatch(node) { - inference(node.expression); - node.match = 1; - return node.match; - } - - function inferenceExpression(node) { - node.match = inference(node.expression); - return node.match; - } - - function inferenceElements(elements, forChoice) { - var length = elements.length; - var always = 0; - var never = 0; - - for (var i = 0; i < length; ++i) { - var result = inference(elements[i]); - - if (result > 0) { - ++always; - } - - if (result < 0) { - ++never; - } - } - - if (always === length) { - return 1; - } - - if (forChoice) { - return never === length ? -1 : 0; - } - - return never > 0 ? -1 : 0; - } - - inference = session.buildVisitor({ - rule: function rule(node) { - var oldResult; - var count = 0; - - if (typeof node.match === "undefined") { - node.match = 0; - - do { - oldResult = node.match; - node.match = inference(node.expression); - - if (++count > 6) { - session.error("Infinity cycle detected when trying to evaluate node match result", node.location); - } - } while (oldResult !== node.match); - } - - return node.match; - }, - named: inferenceExpression, - choice: function choice(node) { - node.match = inferenceElements(node.alternatives, true); - return node.match; - }, - action: inferenceExpression, - sequence: function sequence(node) { - node.match = inferenceElements(node.elements, false); - return node.match; - }, - labeled: inferenceExpression, - text: inferenceExpression, - simple_and: inferenceExpression, - simple_not: function simple_not(node) { - node.match = -inference(node.expression); - return node.match; - }, - optional: alwaysMatch, - zero_or_more: alwaysMatch, - one_or_more: inferenceExpression, - group: inferenceExpression, - semantic_and: sometimesMatch, - semantic_not: sometimesMatch, - rule_ref: function rule_ref(node) { - var rule = ast.findRule(node.name); - node.match = inference(rule); - return node.match; - }, - literal: function literal(node) { - node.match = node.value.length === 0 ? 1 : 0; - return node.match; - }, - class: function _class(node) { - node.match = node.parts.length === 0 ? -1 : 0; - return node.match; - }, - any: sometimesMatch - }); - inference(ast); - } - - var inferenceMatchResult_1 = inferenceMatchResult; - - function isSemanticPredicate(element) { - var type = element.expression.type; - if (type === "semantic_and") return true; - if (type === "semantic_not") return true; - return false; - } - - function reportIncorrectPlucking(ast, session) { - session.buildVisitor({ - action: function action(node) { - this.visit(node.expression, true); - }, - labeled: function labeled(node, action) { - if (node.pick !== true) return void 0; - if (action === true) session.error("\"@\" cannot be used with an action block.", node.location); - if (isSemanticPredicate(node)) session.error("\"@\" cannot be used on a semantic predicate.", node.location); - this.visit(node.expression); - } - })(ast); - } - - var reportIncorrectPlucking_1 = reportIncorrectPlucking; - - var opcodes = { - PUSH_EMPTY_STRING: 0, - PUSH_UNDEFINED: 1, - PUSH_NULL: 2, - PUSH_FAILED: 3, - PUSH_EMPTY_ARRAY: 4, - PUSH_CURR_POS: 5, - POP: 6, - POP_CURR_POS: 7, - POP_N: 8, - NIP: 9, - APPEND: 10, - WRAP: 11, - TEXT: 12, - PLUCK: 41, - IF: 13, - IF_ERROR: 14, - IF_NOT_ERROR: 15, - WHILE_NOT_ERROR: 16, - MATCH_ANY: 17, - MATCH_STRING: 18, - MATCH_STRING_IC: 19, - MATCH_CLASS: 20, - ACCEPT_N: 21, - ACCEPT_STRING: 22, - EXPECT: 23, - LOAD_SAVED_POS: 24, - UPDATE_SAVED_POS: 25, - CALL: 26, - RULE: 27, - SILENT_FAILS_ON: 28, - SILENT_FAILS_OFF: 29, - EXPECT_NS_BEGIN: 38, - EXPECT_NS_END: 39 - }; - var opcodes_1 = opcodes; - - function peg$subclass(child, parent) { - function C() { - this.constructor = child; - } - - C.prototype = parent.prototype; - child.prototype = new C(); - } - - function peg$SyntaxError(message, expected, found, location) { - this.message = message; - this.expected = expected; - this.found = found; - this.location = location; - this.name = "SyntaxError"; - - if (typeof Error.captureStackTrace === "function") { - Error.captureStackTrace(this, peg$SyntaxError); - } - } - - peg$subclass(peg$SyntaxError, Error); - - peg$SyntaxError.buildMessage = function (expected, found) { - var DESCRIBE_EXPECTATION_FNS = { - literal: function literal(expectation) { - return "\"" + literalEscape(expectation.text) + "\""; - }, - class: function _class(expectation) { - var escapedParts = expectation.parts.map(function (part) { - return Array.isArray(part) ? classEscape(part[0]) + "-" + classEscape(part[1]) : classEscape(part); - }); - return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; - }, - any: function any() { - return "any character"; - }, - end: function end() { - return "end of input"; - }, - other: function other(expectation) { - return expectation.description; - }, - not: function not(expectation) { - return "not " + describeExpectation(expectation.expected); - } - }; - - function hex(ch) { - return ch.charCodeAt(0).toString(16).toUpperCase(); - } - - function literalEscape(s) { - return s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { - return "\\x0" + hex(ch); - }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { - return "\\x" + hex(ch); - }); - } - - function classEscape(s) { - return s.replace(/\\/g, "\\\\").replace(/\]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { - return "\\x0" + hex(ch); - }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { - return "\\x" + hex(ch); - }); - } - - function describeExpectation(expectation) { - return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); - } - - function describeExpected(expected) { - var descriptions = expected.map(describeExpectation); - var i, j; - descriptions.sort(); - - if (descriptions.length > 0) { - for (i = 1, j = 1; i < descriptions.length; i++) { - if (descriptions[i - 1] !== descriptions[i]) { - descriptions[j] = descriptions[i]; - j++; - } - } - - descriptions.length = j; - } - - switch (descriptions.length) { - case 1: - return descriptions[0]; - - case 2: - return descriptions[0] + " or " + descriptions[1]; - - default: - return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1]; - } - } - - function describeFound(found) { - return found ? "\"" + literalEscape(found) + "\"" : "end of input"; - } - - return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; - }; - - function peg$parse(input, options) { - options = options !== undefined ? options : {}; - var peg$FAILED = {}; - var peg$startRuleFunctions = { - Grammar: peg$parseGrammar - }; - var peg$startRuleFunction = peg$parseGrammar; - var peg$c0 = "="; - var peg$c1 = "/"; - var peg$c2 = "@"; - var peg$c3 = ":"; - var peg$c4 = "$"; - var peg$c5 = "&"; - var peg$c6 = "!"; - var peg$c7 = "?"; - var peg$c8 = "*"; - var peg$c9 = "+"; - var peg$c10 = "("; - var peg$c11 = ")"; - var peg$c12 = "\t"; - var peg$c13 = "\v"; - var peg$c14 = "\f"; - var peg$c15 = " "; - var peg$c16 = "\xA0"; - var peg$c17 = "\uFEFF"; - var peg$c18 = "\n"; - var peg$c19 = "\r\n"; - var peg$c20 = "\r"; - var peg$c21 = "\u2028"; - var peg$c22 = "\u2029"; - var peg$c23 = "/*"; - var peg$c24 = "*/"; - var peg$c25 = "//"; - var peg$c26 = "_"; - var peg$c27 = "\\"; - var peg$c28 = "\u200C"; - var peg$c29 = "\u200D"; - var peg$c30 = "i"; - var peg$c31 = "\""; - var peg$c32 = "'"; - var peg$c33 = "["; - var peg$c34 = "^"; - var peg$c35 = "]"; - var peg$c36 = "-"; - var peg$c37 = "0"; - var peg$c38 = "b"; - var peg$c39 = "f"; - var peg$c40 = "n"; - var peg$c41 = "r"; - var peg$c42 = "t"; - var peg$c43 = "v"; - var peg$c44 = "x"; - var peg$c45 = "u"; - var peg$c46 = "."; - var peg$c47 = "{"; - var peg$c48 = "}"; - var peg$c49 = ";"; - var peg$r0 = /^[\n\r\u2028\u2029]/; - var peg$r1 = /^[0-9]/; - var peg$r2 = /^[0-9a-f]/i; - var peg$r3 = /^[{}]/; - var peg$r4 = /^[a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A]/; - var peg$r5 = /^[\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C-\uA69D\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3-\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E-\uFF9F]/; - var peg$r6 = /^[\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u09FC\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/; - var peg$r7 = /^[\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]/; - var peg$r8 = /^[A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uFF21-\uFF3A]/; - var peg$r9 = /^[\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E-\u094F\u0982-\u0983\u09BE-\u09C0\u09C7-\u09C8\u09CB-\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB-\u0ACC\u0B02-\u0B03\u0B3E\u0B40\u0B47-\u0B48\u0B4B-\u0B4C\u0B57\u0BBE-\u0BBF\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82-\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CD5-\u0CD6\u0D02-\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82-\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2-\u0DF3\u0F3E-\u0F3F\u0F7F\u102B-\u102C\u1031\u1038\u103B-\u103C\u1056-\u1057\u1062-\u1064\u1067-\u106D\u1083-\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7-\u17C8\u1923-\u1926\u1929-\u192B\u1930-\u1931\u1933-\u1938\u1A19-\u1A1A\u1A55\u1A57\u1A61\u1A63-\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43-\u1B44\u1B82\u1BA1\u1BA6-\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2-\u1BF3\u1C24-\u1C2B\u1C34-\u1C35\u1CE1\u1CF2-\u1CF3\u1CF7\u302E-\u302F\uA823-\uA824\uA827\uA880-\uA881\uA8B4-\uA8C3\uA952-\uA953\uA983\uA9B4-\uA9B5\uA9BA-\uA9BB\uA9BD-\uA9C0\uAA2F-\uAA30\uAA33-\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE-\uAAEF\uAAF5\uABE3-\uABE4\uABE6-\uABE7\uABE9-\uABEA\uABEC]/; - var peg$r10 = /^[\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962-\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2-\u09E3\u09FE\u0A01-\u0A02\u0A3C\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A51\u0A70-\u0A71\u0A75\u0A81-\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7-\u0AC8\u0ACD\u0AE2-\u0AE3\u0AFA-\u0AFF\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62-\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C04\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C62-\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC-\u0CCD\u0CE2-\u0CE3\u0D00-\u0D01\u0D3B-\u0D3C\u0D41-\u0D44\u0D4D\u0D62-\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86-\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039-\u103A\u103D-\u103E\u1058-\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17B4-\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885-\u1886\u18A9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193B\u1A17-\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80-\u1B81\u1BA2-\u1BA5\u1BA8-\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8-\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099-\u309A\uA66F\uA674-\uA67D\uA69E-\uA69F\uA6F0-\uA6F1\uA802\uA806\uA80B\uA825-\uA826\uA8C4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31-\uAA32\uAA35-\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7-\uAAB8\uAABE-\uAABF\uAAC1\uAAEC-\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/; - var peg$r11 = /^[0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]/; - var peg$r12 = /^[\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]/; - var peg$r13 = /^[_\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F]/; - var peg$r14 = /^[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/; - var peg$e0 = peg$literalExpectation("=", false); - var peg$e1 = peg$literalExpectation("/", false); - var peg$e2 = peg$literalExpectation("@", false); - var peg$e3 = peg$literalExpectation(":", false); - var peg$e4 = peg$literalExpectation("$", false); - var peg$e5 = peg$literalExpectation("&", false); - var peg$e6 = peg$literalExpectation("!", false); - var peg$e7 = peg$literalExpectation("?", false); - var peg$e8 = peg$literalExpectation("*", false); - var peg$e9 = peg$literalExpectation("+", false); - var peg$e10 = peg$literalExpectation("(", false); - var peg$e11 = peg$literalExpectation(")", false); - var peg$e12 = peg$anyExpectation(); - var peg$e13 = peg$otherExpectation("whitespace"); - var peg$e14 = peg$classExpectation(["\n", "\r", "\u2028", "\u2029"], false, false); - var peg$e15 = peg$otherExpectation("end of line"); - var peg$e16 = peg$otherExpectation("comment"); - var peg$e17 = peg$literalExpectation("/*", false); - var peg$e18 = peg$literalExpectation("*/", false); - var peg$e19 = peg$literalExpectation("//", false); - var peg$e20 = peg$otherExpectation("identifier"); - var peg$e21 = peg$otherExpectation("literal"); - var peg$e22 = peg$otherExpectation("string"); - var peg$e23 = peg$otherExpectation("character class"); - var peg$e24 = peg$literalExpectation(".", false); - var peg$e25 = peg$otherExpectation("code block"); - var peg$e26 = peg$literalExpectation(";", false); - - var peg$f0 = function peg$f0(initializer, rules) { - return new ast.Grammar(initializer, rules, comments, location()); - }; - - var peg$f1 = function peg$f1(code) { - return createNode("initializer", { - code: code - }); - }; - - var peg$f2 = function peg$f2(name, displayName, expression) { - if (displayName) expression = createNode("named", { - name: displayName, - expression: expression - }); - return createNode("rule", { - name: name, - expression: expression - }); - }; - - var peg$f3 = function peg$f3(head, tail) { - if (tail.length === 0) return head; - return createNode("choice", { - alternatives: [head].concat(tail) - }); - }; - - var peg$f4 = function peg$f4(expression, code) { - if (code === null) return expression; - return createNode("action", { - expression: expression, - code: code - }); - }; - - var peg$f5 = function peg$f5(head, tail) { - var elements = [head]; - - if (tail.length === 0) { - if (head.type !== "labeled" || !head.pick) return head; - } else { - elements = elements.concat(tail); - } - - return createNode("sequence", { - elements: elements - }); - }; - - var peg$f6 = function peg$f6(label, expression) { - return createNode("labeled", { - pick: pick, - label: label, - expression: expression - }); - }; - - var peg$f7 = function peg$f7(label, expression) { - return createNode("labeled", { - label: label, - expression: expression - }); - }; - - var peg$f8 = function peg$f8(name) { - if (RESERVED_WORDS[name] !== true) return name; - error("Label can't be a reserved word \"".concat(name, "\"."), location()); - }; - - var peg$f9 = function peg$f9(operator, expression) { - return createNode(operator, { - expression: expression - }); - }; - - var peg$f10 = function peg$f10() { - return "text"; - }; - - var peg$f11 = function peg$f11() { - return "simple_and"; - }; - - var peg$f12 = function peg$f12() { - return "simple_not"; - }; - - var peg$f13 = function peg$f13(expression, operator) { - return createNode(operator, { - expression: expression - }); - }; - - var peg$f14 = function peg$f14() { - return "optional"; - }; - - var peg$f15 = function peg$f15() { - return "zero_or_more"; - }; - - var peg$f16 = function peg$f16() { - return "one_or_more"; - }; - - var peg$f17 = function peg$f17(e) { - if (e.type !== "labeled" && e.type !== "sequence") return e; - return createNode("group", { - expression: e - }); - }; - - var peg$f18 = function peg$f18(name) { - return createNode("rule_ref", { - name: name - }); - }; - - var peg$f19 = function peg$f19(operator, code) { - return createNode(operator, { - code: code - }); - }; - - var peg$f20 = function peg$f20() { - return "semantic_and"; - }; - - var peg$f21 = function peg$f21() { - return "semantic_not"; - }; - - var peg$f22 = function peg$f22(comment) { - return addComment(comment, true); - }; - - var peg$f23 = function peg$f23(comment) { - return addComment(comment, false); - }; - - var peg$f24 = function peg$f24(head, tail) { - return head + tail.join(""); - }; - - var peg$f25 = function peg$f25(value, ignoreCase) { - return createNode("literal", { - value: value, - ignoreCase: ignoreCase !== null - }); - }; - - var peg$f26 = function peg$f26(chars) { - return chars.join(""); - }; - - var peg$f27 = function peg$f27(inverted, parts, ignoreCase) { - return createNode("class", { - parts: parts.filter(function (part) { - return part !== ""; - }), - inverted: inverted !== null, - ignoreCase: ignoreCase !== null - }); - }; - - var peg$f28 = function peg$f28(begin, end) { - if (begin.charCodeAt(0) > end.charCodeAt(0)) error("Invalid character range: " + text() + "."); - return [begin, end]; - }; - - var peg$f29 = function peg$f29() { - return ""; - }; - - var peg$f30 = function peg$f30() { - return "\0"; - }; - - var peg$f31 = function peg$f31() { - return "\b"; - }; - - var peg$f32 = function peg$f32() { - return "\f"; - }; - - var peg$f33 = function peg$f33() { - return "\n"; - }; - - var peg$f34 = function peg$f34() { - return "\r"; - }; - - var peg$f35 = function peg$f35() { - return "\t"; - }; - - var peg$f36 = function peg$f36() { - return "\v"; - }; - - var peg$f37 = function peg$f37(digits) { - return String.fromCharCode(parseInt(digits, 16)); - }; - - var peg$f38 = function peg$f38() { - return createNode("any"); - }; - - var peg$f39 = function peg$f39() { - error("Unbalanced brace."); - }; - - var peg$currPos = 0; - var peg$savedPos = 0; - var peg$posDetailsCache = [{ - line: 1, - column: 1 - }]; - var peg$expected = []; - var peg$silentFails = 0; - var peg$result; - - if ("startRule" in options) { - if (!(options.startRule in peg$startRuleFunctions)) { - throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); - } - - peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; - } - - function text() { - return input.substring(peg$savedPos, peg$currPos); - } - - function location() { - return peg$computeLocation(peg$savedPos, peg$currPos); - } - - function error(message, location) { - location = location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos); - throw peg$buildSimpleError(message, location); - } - - function peg$literalExpectation(text, ignoreCase) { - return { - type: "literal", - text: text, - ignoreCase: ignoreCase - }; - } - - function peg$classExpectation(parts, inverted, ignoreCase) { - return { - type: "class", - parts: parts, - inverted: inverted, - ignoreCase: ignoreCase - }; - } - - function peg$anyExpectation() { - return { - type: "any" - }; - } - - function peg$endExpectation() { - return { - type: "end" - }; - } - - function peg$otherExpectation(description) { - return { - type: "other", - description: description - }; - } - - function peg$computePosDetails(pos) { - var details = peg$posDetailsCache[pos]; - var p; - - if (details) { - return details; - } else { - p = pos - 1; - - while (!peg$posDetailsCache[p]) { - p--; - } - - details = peg$posDetailsCache[p]; - details = { - line: details.line, - column: details.column - }; - - while (p < pos) { - if (input.charCodeAt(p) === 10) { - details.line++; - details.column = 1; - } else { - details.column++; - } - - p++; - } - - peg$posDetailsCache[pos] = details; - return details; - } - } - - var peg$VALIDFILENAME = typeof options.filename === "string" && options.filename.length > 0; - - function peg$computeLocation(startPos, endPos) { - var loc = {}; - if (peg$VALIDFILENAME) loc.filename = options.filename; - var startPosDetails = peg$computePosDetails(startPos); - loc.start = { - offset: startPos, - line: startPosDetails.line, - column: startPosDetails.column - }; - var endPosDetails = peg$computePosDetails(endPos); - loc.end = { - offset: endPos, - line: endPosDetails.line, - column: endPosDetails.column - }; - return loc; - } - - function peg$begin() { - peg$expected.push({ - pos: peg$currPos, - variants: [] - }); - } - - function peg$expect(expected) { - var top = peg$expected[peg$expected.length - 1]; - - if (peg$currPos < top.pos) { - return; - } - - if (peg$currPos > top.pos) { - top.pos = peg$currPos; - top.variants = []; - } - - top.variants.push(expected); - } - - function peg$end(invert) { - var expected = peg$expected.pop(); - var top = peg$expected[peg$expected.length - 1]; - var variants = expected.variants; - - if (top.pos !== expected.pos) { - return; - } - - if (invert) { - variants = variants.map(function (e) { - return e.type === "not" ? e.expected : { - type: "not", - expected: e - }; - }); - } - - Array.prototype.push.apply(top.variants, variants); - } - - function peg$buildSimpleError(message, location) { - return new peg$SyntaxError(message, null, null, location); - } - - function peg$buildStructuredError(expected, found, location) { - return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected, found), expected, found, location); - } - - function peg$buildError() { - var expected = peg$expected[0]; - var failPos = expected.pos; - return peg$buildStructuredError(expected.variants, failPos < input.length ? input.charAt(failPos) : null, failPos < input.length ? peg$computeLocation(failPos, failPos + 1) : peg$computeLocation(failPos, failPos)); - } - - function peg$parseGrammar() { - var s0, s1, s2, s3, s4, s5, s6; - - s0 = peg$currPos; - s1 = peg$parse__(); - s2 = peg$currPos; - s3 = peg$parseInitializer(); - - if (s3 !== peg$FAILED) { - s4 = peg$parse__(); - s2 = s3; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = null; - } - - s3 = []; - s4 = peg$currPos; - s5 = peg$parseRule(); - - if (s5 !== peg$FAILED) { - s6 = peg$parse__(); - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$currPos; - s5 = peg$parseRule(); - - if (s5 !== peg$FAILED) { - s6 = peg$parse__(); - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f0(s2, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseInitializer() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$parseCodeBlock(); - - if (s1 !== peg$FAILED) { - s2 = peg$parseEOS(); - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f1(s1); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseRule() { - var s0, s1, s2, s3, s4, s5, s6, s7; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parseIdentifier(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$currPos; - s4 = peg$parseStringLiteral(); - - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 === peg$FAILED) { - s3 = null; - } - - rule$expects(peg$e0); - - if (input.charCodeAt(peg$currPos) === 61) { - s4 = peg$c0; - peg$currPos++; - } else { - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - s6 = peg$parseChoiceExpression(); - - if (s6 !== peg$FAILED) { - s7 = peg$parseEOS(); - - if (s7 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f2(s1, s3, s6); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseChoiceExpression() { - var s0, s1, s2, s3, s4, s5, s6, s7; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parseActionExpression(); - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$currPos; - s4 = peg$parse__(); - rule$expects(peg$e1); - - if (input.charCodeAt(peg$currPos) === 47) { - s5 = peg$c1; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parse__(); - s7 = peg$parseActionExpression(); - - if (s7 !== peg$FAILED) { - s3 = s7; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$parse__(); - rule$expects(peg$e1); - - if (input.charCodeAt(peg$currPos) === 47) { - s5 = peg$c1; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parse__(); - s7 = peg$parseActionExpression(); - - if (s7 !== peg$FAILED) { - s3 = s7; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - - peg$savedPos = s0; - s0 = peg$f3(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseActionExpression() { - var s0, s1, s2, s3, s4; - - s0 = peg$currPos; - s1 = peg$parseSequenceExpression(); - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = peg$parse__(); - s4 = peg$parseCodeBlock(); - - if (s4 !== peg$FAILED) { - s2 = s4; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = null; - } - - peg$savedPos = s0; - s0 = peg$f4(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseSequenceExpression() { - var s0, s1, s2, s3, s4, s5; - - s0 = peg$currPos; - s1 = peg$parseLabeledExpression(); - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$currPos; - s4 = peg$parse__(); - s5 = peg$parseLabeledExpression(); - - if (s5 !== peg$FAILED) { - s3 = s5; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$parse__(); - s5 = peg$parseLabeledExpression(); - - if (s5 !== peg$FAILED) { - s3 = s5; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - - peg$savedPos = s0; - s0 = peg$f5(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLabeledExpression() { - var s0, s1, s2, s3, s4; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e2); - - if (input.charCodeAt(peg$currPos) === 64) { - s1 = peg$c2; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseLabelIdentifier(); - - if (s2 === peg$FAILED) { - s2 = null; - } - - s3 = peg$parse__(); - s4 = peg$parsePrefixedExpression(); - - if (s4 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f6(s2, s4); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parseLabelIdentifier(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parsePrefixedExpression(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f7(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parsePrefixedExpression(); - } - } - - return s0; - } - - function peg$parseLabelIdentifier() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parseIdentifier(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - rule$expects(peg$e3); - - if (input.charCodeAt(peg$currPos) === 58) { - s3 = peg$c3; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f8(s1); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parsePrefixedExpression() { - var s0, s1, s2, s3; - - s0 = peg$currPos; - s1 = peg$parsePrefixedOperator(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parseSuffixedExpression(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f9(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseSuffixedExpression(); - } - - return s0; - } - - function peg$parsePrefixedOperator() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e4); - - if (input.charCodeAt(peg$currPos) === 36) { - s1 = peg$c4; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f10(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e5); - - if (input.charCodeAt(peg$currPos) === 38) { - s1 = peg$c5; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f11(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e6); - - if (input.charCodeAt(peg$currPos) === 33) { - s1 = peg$c6; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f12(); - } - - s0 = s1; - } - } - - return s0; - } - - function peg$parseSuffixedExpression() { - var s0, s1, s2, s3; - - s0 = peg$currPos; - s1 = peg$parsePrimaryExpression(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parseSuffixedOperator(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f13(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parsePrimaryExpression(); - } - - return s0; - } - - function peg$parseSuffixedOperator() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e7); - - if (input.charCodeAt(peg$currPos) === 63) { - s1 = peg$c7; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f14(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e8); - - if (input.charCodeAt(peg$currPos) === 42) { - s1 = peg$c8; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f15(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e9); - - if (input.charCodeAt(peg$currPos) === 43) { - s1 = peg$c9; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f16(); - } - - s0 = s1; - } - } - - return s0; - } - - function peg$parsePrimaryExpression() { - var s0, s1, s2, s3, s4, s5; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$parseLiteralMatcher(); - - if (s0 === peg$FAILED) { - s0 = peg$parseCharacterClassMatcher(); - - if (s0 === peg$FAILED) { - s0 = peg$parseAnyMatcher(); - - if (s0 === peg$FAILED) { - s0 = peg$parseRuleReferenceExpression(); - - if (s0 === peg$FAILED) { - s0 = peg$parseSemanticPredicateExpression(); - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e10); - - if (input.charCodeAt(peg$currPos) === 40) { - s1 = peg$c10; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parseChoiceExpression(); - - if (s3 !== peg$FAILED) { - s4 = peg$parse__(); - rule$expects(peg$e11); - - if (input.charCodeAt(peg$currPos) === 41) { - s5 = peg$c11; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f17(s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } - } - } - } - } - - return s0; - } - - function peg$parseRuleReferenceExpression() { - var s0, s1, s2, s3, s4, s5, s6, s7; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parseIdentifier(); - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - peg$begin(); - s3 = peg$currPos; - s4 = peg$parse__(); - s5 = peg$currPos; - s6 = peg$parseStringLiteral(); - - if (s6 !== peg$FAILED) { - s7 = peg$parse__(); - s6 = [s6, s7]; - s5 = s6; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 === peg$FAILED) { - s5 = null; - } - - rule$expects(peg$e0); - - if (input.charCodeAt(peg$currPos) === 61) { - s6 = peg$c0; - peg$currPos++; - } else { - s6 = peg$FAILED; - } - - if (s6 !== peg$FAILED) { - s4 = [s4, s5, s6]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - peg$end(true); - - if (s3 === peg$FAILED) { - s2 = undefined; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f18(s1); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseSemanticPredicateExpression() { - var s0, s1, s2, s3; - - s0 = peg$currPos; - s1 = peg$parseSemanticPredicateOperator(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parseCodeBlock(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f19(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseSemanticPredicateOperator() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e5); - - if (input.charCodeAt(peg$currPos) === 38) { - s1 = peg$c5; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f20(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e6); - - if (input.charCodeAt(peg$currPos) === 33) { - s1 = peg$c6; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f21(); - } - - s0 = s1; - } - - return s0; - } - - function peg$parseSourceCharacter() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e12); - - if (input.length > peg$currPos) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseWhiteSpace() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e13); - peg$silentFails++; - - if (input.charCodeAt(peg$currPos) === 9) { - s0 = peg$c12; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 11) { - s0 = peg$c13; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 12) { - s0 = peg$c14; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 32) { - s0 = peg$c15; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 160) { - s0 = peg$c16; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 65279) { - s0 = peg$c17; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseZs(); - } - } - } - } - } - } - - peg$silentFails--; - return s0; - } - - function peg$parseLineTerminator() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e14); - - if (peg$r0.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLineTerminatorSequence() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e15); - peg$silentFails++; - - if (input.charCodeAt(peg$currPos) === 10) { - s0 = peg$c18; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.substr(peg$currPos, 2) === peg$c19) { - s0 = peg$c19; - peg$currPos += 2; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 13) { - s0 = peg$c20; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 8232) { - s0 = peg$c21; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 8233) { - s0 = peg$c22; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - } - } - } - } - - peg$silentFails--; - return s0; - } - - function peg$parseComment() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e16); - peg$silentFails++; - s0 = peg$parseMultiLineComment(); - - if (s0 === peg$FAILED) { - s0 = peg$parseSingleLineComment(); - } - - peg$silentFails--; - return s0; - } - - function peg$parseMultiLineComment() { - var s0, s1, s2, s3, s4, s5, s6; - - s0 = peg$currPos; - - if (input.substr(peg$currPos, 2) === peg$c23) { - s1 = peg$c23; - peg$currPos += 2; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = []; - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s6 = peg$c24; - peg$currPos += 2; - } else { - s6 = peg$FAILED; - } - - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s6 = peg$c24; - peg$currPos += 2; - } else { - s6 = peg$FAILED; - } - - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } - - s2 = input.substring(s2, peg$currPos); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s3 = peg$c24; - peg$currPos += 2; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f22(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseMultiLineCommentNoLineTerminator() { - var s0, s1, s2, s3, s4, s5, s6; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e17); - - if (input.substr(peg$currPos, 2) === peg$c23) { - s1 = peg$c23; - peg$currPos += 2; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = []; - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - rule$expects(peg$e18); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s6 = peg$c24; - peg$currPos += 2; - } else { - s6 = peg$FAILED; - } - - if (s6 === peg$FAILED) { - s6 = peg$parseLineTerminator(); - } - - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - rule$expects(peg$e18); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s6 = peg$c24; - peg$currPos += 2; - } else { - s6 = peg$FAILED; - } - - if (s6 === peg$FAILED) { - s6 = peg$parseLineTerminator(); - } - - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } - - s2 = input.substring(s2, peg$currPos); - rule$expects(peg$e18); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s3 = peg$c24; - peg$currPos += 2; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f22(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseSingleLineComment() { - var s0, s1, s2, s3, s4, s5, s6; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e19); - - if (input.substr(peg$currPos, 2) === peg$c25) { - s1 = peg$c25; - peg$currPos += 2; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = []; - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - s6 = peg$parseLineTerminator(); - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - s6 = peg$parseLineTerminator(); - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } - - s2 = input.substring(s2, peg$currPos); - peg$savedPos = s0; - s0 = peg$f23(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseIdentifier() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e20); - peg$silentFails++; - s0 = peg$currPos; - s1 = peg$parseIdentifierStart(); - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$parseIdentifierPart(); - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$parseIdentifierPart(); - } - - peg$savedPos = s0; - s0 = peg$f24(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - peg$silentFails--; - return s0; - } - - function peg$parseIdentifierStart() { - var s0, s1, s2; - - s0 = peg$parseUnicodeLetter(); - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 36) { - s0 = peg$c4; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 95) { - s0 = peg$c26; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseUnicodeEscapeSequence(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } - } - } - - return s0; - } - - function peg$parseIdentifierPart() { - var s0; - - s0 = peg$parseIdentifierStart(); - - if (s0 === peg$FAILED) { - s0 = peg$parseUnicodeCombiningMark(); - - if (s0 === peg$FAILED) { - s0 = peg$parseNd(); - - if (s0 === peg$FAILED) { - s0 = peg$parsePc(); - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 8204) { - s0 = peg$c28; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 8205) { - s0 = peg$c29; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - } - } - } - } - } - - return s0; - } - - function peg$parseUnicodeLetter() { - var s0; - - s0 = peg$parseLu(); - - if (s0 === peg$FAILED) { - s0 = peg$parseLl(); - - if (s0 === peg$FAILED) { - s0 = peg$parseLt(); - - if (s0 === peg$FAILED) { - s0 = peg$parseLm(); - - if (s0 === peg$FAILED) { - s0 = peg$parseLo(); - - if (s0 === peg$FAILED) { - s0 = peg$parseNl(); - } - } - } - } - } - - return s0; - } - - function peg$parseUnicodeCombiningMark() { - var s0; - - s0 = peg$parseMn(); - - if (s0 === peg$FAILED) { - s0 = peg$parseMc(); - } - - return s0; - } - - function peg$parseLiteralMatcher() { - var s0, s1, s2; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e21); - peg$silentFails++; - s0 = peg$currPos; - s1 = peg$parseStringLiteral(); - - if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 105) { - s2 = peg$c30; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = null; - } - - peg$savedPos = s0; - s0 = peg$f25(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - peg$silentFails--; - return s0; - } - - function peg$parseStringLiteral() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e22); - peg$silentFails++; - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 34) { - s1 = peg$c31; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$parseDoubleStringCharacter(); - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$parseDoubleStringCharacter(); - } - - if (input.charCodeAt(peg$currPos) === 34) { - s3 = peg$c31; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f26(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 39) { - s1 = peg$c32; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$parseSingleStringCharacter(); - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$parseSingleStringCharacter(); - } - - if (input.charCodeAt(peg$currPos) === 39) { - s3 = peg$c32; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f26(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } - - peg$silentFails--; - return s0; - } - - function peg$parseDoubleStringCharacter() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$currPos; - peg$begin(); - - if (input.charCodeAt(peg$currPos) === 34) { - s2 = peg$c31; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 92) { - s2 = peg$c27; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$parseLineTerminator(); - } - } - - peg$end(true); - - if (s2 === peg$FAILED) { - s1 = undefined; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseSourceCharacter(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseEscapeSequence(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseLineContinuation(); - } - } - - return s0; - } - - function peg$parseSingleStringCharacter() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$currPos; - peg$begin(); - - if (input.charCodeAt(peg$currPos) === 39) { - s2 = peg$c32; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 92) { - s2 = peg$c27; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$parseLineTerminator(); - } - } - - peg$end(true); - - if (s2 === peg$FAILED) { - s1 = undefined; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseSourceCharacter(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseEscapeSequence(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseLineContinuation(); - } - } - - return s0; - } - - function peg$parseCharacterClassMatcher() { - var s0, s1, s2, s3, s4, s5; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e23); - peg$silentFails++; - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 91) { - s1 = peg$c33; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 94) { - s2 = peg$c34; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = null; - } - - s3 = []; - s4 = peg$parseCharacterPart(); - - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$parseCharacterPart(); - } - - if (input.charCodeAt(peg$currPos) === 93) { - s4 = peg$c35; - peg$currPos++; - } else { - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 105) { - s5 = peg$c30; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 === peg$FAILED) { - s5 = null; - } - - peg$savedPos = s0; - s0 = peg$f27(s2, s3, s5); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - peg$silentFails--; - return s0; - } - - function peg$parseCharacterPart() { - var s0; - - s0 = peg$parseClassCharacterRange(); - - if (s0 === peg$FAILED) { - s0 = peg$parseClassCharacter(); - } - - return s0; - } - - function peg$parseClassCharacterRange() { - var s0, s1, s2, s3; - - s0 = peg$currPos; - s1 = peg$parseClassCharacter(); - - if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 45) { - s2 = peg$c36; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 !== peg$FAILED) { - s3 = peg$parseClassCharacter(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f28(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseClassCharacter() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$currPos; - peg$begin(); - - if (input.charCodeAt(peg$currPos) === 93) { - s2 = peg$c35; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 92) { - s2 = peg$c27; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$parseLineTerminator(); - } - } - - peg$end(true); - - if (s2 === peg$FAILED) { - s1 = undefined; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseSourceCharacter(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseEscapeSequence(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseLineContinuation(); - } - } - - return s0; - } - - function peg$parseLineContinuation() { - var s0, s1, s2; - - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseLineTerminatorSequence(); - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f29(); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseEscapeSequence() { - var s0, s1, s2, s3; - - s0 = peg$parseCharacterEscapeSequence(); - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 48) { - s1 = peg$c37; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - peg$begin(); - s3 = peg$parseDecimalDigit(); - peg$end(true); - - if (s3 === peg$FAILED) { - s2 = undefined; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f30(); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseHexEscapeSequence(); - - if (s0 === peg$FAILED) { - s0 = peg$parseUnicodeEscapeSequence(); - } - } - } - - return s0; - } - - function peg$parseCharacterEscapeSequence() { - var s0; - - s0 = peg$parseSingleEscapeCharacter(); - - if (s0 === peg$FAILED) { - s0 = peg$parseNonEscapeCharacter(); - } - - return s0; - } - - function peg$parseSingleEscapeCharacter() { - var s0, s1; - - if (input.charCodeAt(peg$currPos) === 39) { - s0 = peg$c32; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 34) { - s0 = peg$c31; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 92) { - s0 = peg$c27; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 98) { - s1 = peg$c38; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f31(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 102) { - s1 = peg$c39; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f32(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 110) { - s1 = peg$c40; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f33(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 114) { - s1 = peg$c41; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f34(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 116) { - s1 = peg$c42; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f35(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 118) { - s1 = peg$c43; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f36(); - } - - s0 = s1; - } - } - } - } - } - } - } - } - - return s0; - } - - function peg$parseNonEscapeCharacter() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$currPos; - peg$begin(); - s2 = peg$parseEscapeCharacter(); - - if (s2 === peg$FAILED) { - s2 = peg$parseLineTerminator(); - } - - peg$end(true); - - if (s2 === peg$FAILED) { - s1 = undefined; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseSourceCharacter(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseEscapeCharacter() { - var s0; - - s0 = peg$parseSingleEscapeCharacter(); - - if (s0 === peg$FAILED) { - s0 = peg$parseDecimalDigit(); - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 120) { - s0 = peg$c44; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 117) { - s0 = peg$c45; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - } - } - } - - return s0; - } - - function peg$parseHexEscapeSequence() { - var s0, s1, s2, s3, s4, s5; - - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 120) { - s1 = peg$c44; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = peg$currPos; - s4 = peg$parseHexDigit(); - - if (s4 !== peg$FAILED) { - s5 = peg$parseHexDigit(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s2 = input.substring(s2, peg$currPos); - } else { - s2 = s3; - } - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f37(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseUnicodeEscapeSequence() { - var s0, s1, s2, s3, s4, s5, s6, s7; - - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 117) { - s1 = peg$c45; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = peg$currPos; - s4 = peg$parseHexDigit(); - - if (s4 !== peg$FAILED) { - s5 = peg$parseHexDigit(); - - if (s5 !== peg$FAILED) { - s6 = peg$parseHexDigit(); - - if (s6 !== peg$FAILED) { - s7 = peg$parseHexDigit(); - - if (s7 !== peg$FAILED) { - s4 = [s4, s5, s6, s7]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s2 = input.substring(s2, peg$currPos); - } else { - s2 = s3; - } - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f37(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseDecimalDigit() { - var s0; - - if (peg$r1.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseHexDigit() { - var s0; - - if (peg$r2.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseAnyMatcher() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e24); - - if (input.charCodeAt(peg$currPos) === 46) { - s1 = peg$c46; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f38(); - } - - s0 = s1; - return s0; - } - - function peg$parseCodeBlock() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e25); - peg$silentFails++; - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 123) { - s1 = peg$c47; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseCode(); - - if (input.charCodeAt(peg$currPos) === 125) { - s3 = peg$c48; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 123) { - s1 = peg$c47; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f39(); - } - - s0 = s1; - } - - peg$silentFails--; - return s0; - } - - function peg$parseCode() { - var s0, s1, s2, s3, s4, s5; - - s0 = peg$currPos; - s1 = []; - s2 = []; - s3 = peg$currPos; - s4 = peg$currPos; - peg$begin(); - - if (peg$r3.test(input.charAt(peg$currPos))) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - peg$end(true); - - if (s5 === peg$FAILED) { - s4 = undefined; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parseSourceCharacter(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$currPos; - peg$begin(); - - if (peg$r3.test(input.charAt(peg$currPos))) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - peg$end(true); - - if (s5 === peg$FAILED) { - s4 = undefined; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parseSourceCharacter(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 123) { - s3 = peg$c47; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s4 = peg$parseCode(); - - if (input.charCodeAt(peg$currPos) === 125) { - s5 = peg$c48; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s3 = [s3, s4, s5]; - s2 = s3; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } - - while (s2 !== peg$FAILED) { - s1.push(s2); - s2 = []; - s3 = peg$currPos; - s4 = peg$currPos; - peg$begin(); - - if (peg$r3.test(input.charAt(peg$currPos))) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - peg$end(true); - - if (s5 === peg$FAILED) { - s4 = undefined; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parseSourceCharacter(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$currPos; - peg$begin(); - - if (peg$r3.test(input.charAt(peg$currPos))) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - peg$end(true); - - if (s5 === peg$FAILED) { - s4 = undefined; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parseSourceCharacter(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 123) { - s3 = peg$c47; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s4 = peg$parseCode(); - - if (input.charCodeAt(peg$currPos) === 125) { - s5 = peg$c48; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s3 = [s3, s4, s5]; - s2 = s3; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } - } - - s0 = input.substring(s0, peg$currPos); - return s0; - } - - function peg$parseLl() { - var s0; - - if (peg$r4.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLm() { - var s0; - - if (peg$r5.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLo() { - var s0; - - if (peg$r6.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLt() { - var s0; - - if (peg$r7.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLu() { - var s0; - - if (peg$r8.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseMc() { - var s0; - - if (peg$r9.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseMn() { - var s0; - - if (peg$r10.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseNd() { - var s0; - - if (peg$r11.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseNl() { - var s0; - - if (peg$r12.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parsePc() { - var s0; - - if (peg$r13.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseZs() { - var s0; - - if (peg$r14.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parse__() { - var s0, s1; - - s0 = []; - s1 = peg$parseWhiteSpace(); - - if (s1 === peg$FAILED) { - s1 = peg$parseLineTerminatorSequence(); - - if (s1 === peg$FAILED) { - s1 = peg$parseComment(); - } - } - - while (s1 !== peg$FAILED) { - s0.push(s1); - s1 = peg$parseWhiteSpace(); - - if (s1 === peg$FAILED) { - s1 = peg$parseLineTerminatorSequence(); - - if (s1 === peg$FAILED) { - s1 = peg$parseComment(); - } - } - } - - return s0; - } - - function peg$parse_() { - var s0, s1; - - s0 = []; - s1 = peg$parseWhiteSpace(); - - if (s1 === peg$FAILED) { - s1 = peg$parseMultiLineCommentNoLineTerminator(); - } - - while (s1 !== peg$FAILED) { - s0.push(s1); - s1 = peg$parseWhiteSpace(); - - if (s1 === peg$FAILED) { - s1 = peg$parseMultiLineCommentNoLineTerminator(); - } - } - - return s0; - } - - function peg$parseEOS() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parse__(); - rule$expects(peg$e26); - - if (input.charCodeAt(peg$currPos) === 59) { - s2 = peg$c49; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 !== peg$FAILED) { - s1 = [s1, s2]; - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parse_(); - s2 = peg$parseSingleLineComment(); - - if (s2 === peg$FAILED) { - s2 = null; - } - - s3 = peg$parseLineTerminatorSequence(); - - if (s3 !== peg$FAILED) { - s1 = [s1, s2, s3]; - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parse__(); - s2 = peg$parseEOF(); - - if (s2 !== peg$FAILED) { - s1 = [s1, s2]; - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } - } - - return s0; - } - - function peg$parseEOF() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - peg$begin(); - rule$expects(peg$e12); - - if (input.length > peg$currPos) { - s1 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - peg$end(true); - - if (s1 === peg$FAILED) { - s0 = undefined; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - var pick = true; - var RESERVED_WORDS = {}; - var reservedWords = options.reservedWords || util.reservedWords; - if (Array.isArray(reservedWords)) reservedWords.forEach(function (word) { - RESERVED_WORDS[word] = true; - }); - - function createNode(type, details) { - var node = new ast.Node(type, location()); - if (details === null) return node; - util.extend(node, details); - return util.enforceFastProperties(node); - } - - var comments = options.extractComments ? {} : null; - - function addComment(text, multiline) { - if (options.extractComments) { - var loc = location(); - comments[loc.start.offset] = { - text: text, - multiline: multiline, - location: loc - }; - } - - return text; - } - - peg$begin(); - peg$result = peg$startRuleFunction(); - - if (peg$result !== peg$FAILED && peg$currPos === input.length) { - return peg$result; - } else { - if (peg$result !== peg$FAILED && peg$currPos < input.length) { - peg$expect(peg$endExpectation()); - } - - throw peg$buildError(); - } - } - - var parser = { - SyntaxError: peg$SyntaxError, - parse: peg$parse - }; - - function fatal(message, location) { - if (typeof location !== "undefined") throw new grammarError(message, location); - throw new Error(message); - } - - var Session = function () { - function Session(config) { - _classCallCheck(this, Session); - - config = typeof config !== "undefined" ? config : {}; - this.opcodes = config.opcodes || opcodes_1; - this.parser = config.parser || parser; - this.passes = config.passes || {}; - this.visitor = config.visitor || ast.visitor; - this.vm = config.vm || vm; - if (typeof config.warn === "function") this.warn = config.warn; - if (typeof config.error === "function") this.error = config.error; - Object.defineProperty(this, "fatal", { - value: fatal - }); - } - - _createClass(Session, [{ - key: "parse", - value: function parse(input, options) { - return this.parser.parse(input, options); - } - }, { - key: "buildVisitor", - value: function buildVisitor(functions) { - return this.visitor.build(functions); - } - }, { - key: "warn", - value: function warn(_message, _location) {} - }, { - key: "error", - value: function error(message, location) { - fatal(message, location); - } - }]); - - return Session; - }(); - - var session = Session; - - var compiler = { - Session: session, - passes: { - check: { - reportUndefinedRules: reportUndefinedRules_1, - reportDuplicateRules: reportDuplicateRules_1, - reportUnusedRules: reportUnusedRules_1, - reportDuplicateLabels: reportDuplicateLabels_1, - reportInfiniteRecursion: reportInfiniteRecursion_1, - reportInfiniteRepetition: reportInfiniteRepetition_1, - reportIncorrectPlucking: reportIncorrectPlucking_1 - }, - transform: { - removeProxyRules: removeProxyRules_1 - }, - generate: { - calcReportFailures: calcReportFailures_1, - inferenceMatchResult: inferenceMatchResult_1, - generateBytecode: generateBytecode_1, - generateJS: generateJs - } - }, - compile: function compile(ast, session$$1, options) { - options = typeof options !== "undefined" ? options : {}; - options = util.processOptions(options, { - allowedStartRules: [ast.rules[0].name], - cache: false, - context: {}, - dependencies: {}, - exportVar: null, - features: null, - format: "bare", - header: null, - optimize: "speed", - output: "parser", - trace: false - }); - if (options.output === "parser") options.format = "umd"; - util.each(session$$1.passes, function (stage) { - stage.forEach(function (pass) { - pass(ast, session$$1, options); - }); - }); - - switch (options.output) { - case "parser": - return session$$1.vm.evalModule(ast.code, options.context); - - case "source": - return ast.code; - - default: - session$$1.error("Invalid output format: ".concat(options.output, ".")); - } - } - }; - var compiler_1 = compiler; - - var peg = { - VERSION: require$$0.version, - GrammarError: grammarError, - ast: ast, - parser: parser, - compiler: compiler_1, - util: util, - generate: function generate(grammar, options) { - options = typeof options !== "undefined" ? options : {}; - var session = new compiler_1.Session({ - passes: util.convertPasses(compiler_1.passes) - }); - if (Array.isArray(options.plugins)) options.plugins.forEach(function (p) { - if (typeof p.use !== "function") return; - p.use(session, options); - }); - return compiler_1.compile(session.parse(grammar, options.parser || {}), session, options); - } - }; - var peg_1 = peg; - - var Runner = { - run: function run(benchmarks, runCount, options, callbacks) { - var Q = { - functions: [], - add: function add(f) { - this.functions.push(f); - }, - run: function run() { - if (this.functions.length > 0) { - this.functions.shift()(); - setTimeout(function () { - Q.run(); - }, 0); - } - } - }; - var state = {}; - - function initialize() { - callbacks.start(); - state.totalInputSize = 0; - state.totalParseTime = 0; - } - - function benchmarkInitializer(benchmark) { - return function () { - callbacks.benchmarkStart(benchmark); - state.parser = peg_1.generate(callbacks.readFile("examples/" + benchmark.id + ".pegjs"), options); - state.benchmarkInputSize = 0; - state.benchmarkParseTime = 0; - }; - } - - function testRunner(benchmark, test) { - return function () { - callbacks.testStart(benchmark, test); - var input = callbacks.readFile("benchmark/" + benchmark.id + "/" + test.file); - var parseTime = 0; - - for (var i = 0; i < runCount; i++) { - var t = new Date().getTime(); - state.parser.parse(input); - parseTime += new Date().getTime() - t; - } - - var averageParseTime = parseTime / runCount; - callbacks.testFinish(benchmark, test, input.length, averageParseTime); - state.benchmarkInputSize += input.length; - state.benchmarkParseTime += averageParseTime; - }; - } - - function benchmarkFinalizer(benchmark) { - return function () { - callbacks.benchmarkFinish(benchmark, state.benchmarkInputSize, state.benchmarkParseTime); - state.totalInputSize += state.benchmarkInputSize; - state.totalParseTime += state.benchmarkParseTime; - }; - } - - function finalize() { - callbacks.finish(state.totalInputSize, state.totalParseTime); - } - - Q.add(initialize); - benchmarks.forEach(function (benchmark) { - Q.add(benchmarkInitializer(benchmark)); - benchmark.tests.forEach(function (test) { - Q.add(testRunner(benchmark, test)); - }); - Q.add(benchmarkFinalizer(benchmark)); - }); - Q.add(finalize); - Q.run(); - } - }; - var runner = Runner; - - var benchmarks = [{ - id: "json", - title: "JSON", - tests: [{ - file: "example1.json", - title: "Example 1" - }, { - file: "example2.json", - title: "Example 2" - }, { - file: "example3.json", - title: "Example 3" - }, { - file: "example4.json", - title: "Example 4" - }, { - file: "example5.json", - title: "Example 5" - }] - }, { - id: "css", - title: "CSS", - tests: [{ - file: "960.gs/min/960_24_col.css", - title: "960.gs - 960_24_col.css (minified)" - }, { - file: "960.gs/min/960.css", - title: "960.gs - 960.css (minified)" - }, { - file: "960.gs/min/reset.css", - title: "960.gs - reset.css (minified)" - }, { - file: "960.gs/min/text.css", - title: "960.gs - text.css (minified)" - }, { - file: "960.gs/src/960_24_col.css", - title: "960.gs - 960_24_col.css (source)" - }, { - file: "960.gs/src/960.css", - title: "960.gs - 960.css (source)" - }, { - file: "960.gs/src/reset.css", - title: "960.gs - reset.css (source)" - }, { - file: "960.gs/src/text.css", - title: "960.gs - text.css (source)" - }, { - file: "blueprint/min/print.css", - title: "Blueprint - print.css (minified)" - }, { - file: "blueprint/min/screen.css", - title: "Blueprint - screen.css (minified)" - }, { - file: "blueprint/src/forms.css", - title: "Blueprint - forms.css (source)" - }, { - file: "blueprint/src/grid.css", - title: "Blueprint - grid.css (source)" - }, { - file: "blueprint/src/print.css", - title: "Blueprint - print.css (source)" - }, { - file: "blueprint/src/reset.css", - title: "Blueprint - reset.css (source)" - }, { - file: "blueprint/src/typography.css", - title: "Blueprint - typography.css (source)" - }] - }]; - var benchmarks_1 = benchmarks; - - $("#run").click(function () { - var resultsTable = $("#results-table"); - - function appendResult(klass, title, url, inputSize, parseTime) { - var KB = 1024; - var MS_IN_S = 1000; - resultsTable.append("\n \n \n ").concat(url !== null ? "" : "", "\n ").concat(title, "\n ").concat(url !== null ? "" : "", "\n \n \n \n ").concat((inputSize / KB).toFixed(2), "\n \n  kB\n \n \n \n ").concat(parseTime.toFixed(2), "\n \n  ms\n \n \n \n ").concat((inputSize / KB / (parseTime / MS_IN_S)).toFixed(2), "\n \n  kB/s\n \n \n ")); - } - - var runCount = parseInt($("#run-count").val(), 10); - var options = { - cache: $("#cache").is(":checked"), - optimize: $("#optimize").val() - }; - - if (isNaN(runCount) || runCount <= 0) { - alert("Number of runs must be a positive integer."); - return; - } - - runner.run(benchmarks_1, runCount, options, { - readFile: function readFile(file) { - return $.ajax({ - type: "GET", - url: "/" + file, - dataType: "text", - async: false - }).responseText; - }, - testStart: function testStart() {}, - testFinish: function testFinish(benchmark, test, inputSize, parseTime) { - appendResult("individual", test.title, "benchmark/" + benchmark.id + "/" + test.file, inputSize, parseTime); - }, - benchmarkStart: function benchmarkStart(benchmark) { - resultsTable.append("\n \n \n ").concat(benchmark.title, " \n \n \"\n ")); - }, - benchmarkFinish: function benchmarkFinish(benchmark, inputSize, parseTime) { - appendResult("benchmark-total", benchmark.title + " total", null, inputSize, parseTime); - }, - start: function start() { - $("#run-count, #cache, #run").attr("disabled", "disabled"); - resultsTable.show(); - $("#results-table tr").slice(1).remove(); - }, - finish: function finish(inputSize, parseTime) { - appendResult("total", "Total", null, inputSize, parseTime); - $.scrollTo("max", { - axis: "y", - duration: 500 - }); - $("#run-count, #cache, #run").removeAttr("disabled"); - } - }); - }); - $(document).ready(function () { - return $("#run").focus(); - }); - var browser = {}; - - return browser; - -}()); diff --git a/tools/pegjs.org/js/online.js b/tools/pegjs.org/js/online.js deleted file mode 100644 index 415f01d5..00000000 --- a/tools/pegjs.org/js/online.js +++ /dev/null @@ -1,222 +0,0 @@ -$(document).ready(function() { - var KB = 1024; - var MS_IN_S = 1000; - - var parser; - - var buildAndParseTimer = null; - var parseTimer = null; - - var oldGrammar = null; - var oldParserVar = null; - var oldOptionCache = null; - var oldOptionOptimize = null; - var oldInput = null; - - var editor = CodeMirror.fromTextArea($("#grammar").get(0), { - lineNumbers: true, - mode: "pegjs" - }); - - window.editor = editor; - - function buildSizeAndTimeInfoHtml(title, size, time) { - return $("", { - "class": "size-and-time", - title: title, - html: (size / KB).toPrecision(2) + " kB, " - + time + " ms, " - + ((size / KB) / (time / MS_IN_S)).toPrecision(2) + " kB/s" - }); - } - - function buildErrorMessage(e) { - return e.location !== undefined - ? "Line " + e.location.start.line + ", column " + e.location.start.column + ": " + e.message - : e.message; - } - - function build() { - oldGrammar = getGrammar(); - oldParserVar = $("#parser-var").val(); - oldOptionCache = $("#option-cache").is(":checked"); - oldOptionOptimize = $("#option-optimize").val(); - - $('#build-message').attr("class", "message progress").text("Building the parser..."); - $("#input").attr("disabled", "disabled"); - $("#parse-message").attr("class", "message disabled").text("Parser not available."); - $("#output").addClass("disabled").text("Output not available."); - $("#parser-var").attr("disabled", "disabled"); - $("#option-cache").attr("disabled", "disabled"); - $("#option-optimize").attr("disabled", "disabled"); - $("#parser-download").attr("disabled", "disabled"); - - try { - var timeBefore = (new Date).getTime(); - var parserSource = peg.generate(getGrammar(), { - cache: $("#option-cache").is(":checked"), - optimize: $("#option-optimize").val(), - output: "source" - }); - var timeAfter = (new Date).getTime(); - - parser = eval(parserSource); - - $("#build-message") - .attr("class", "message info") - .html("Parser built successfully.") - .append(buildSizeAndTimeInfoHtml( - "Parser build time and speed", - getGrammar().length, - timeAfter - timeBefore - )); - $("#input").removeAttr("disabled"); - $("#parser-source").val($("#parser-var").val() + " = " + parserSource + ";\n"); - $("#parser-var").removeAttr("disabled"); - $("#option-cache").removeAttr("disabled"); - $("#option-optimize").removeAttr("disabled"); - $("#parser-download").removeAttr("disabled"); - - var result = true; - } catch (e) { - $("#build-message").attr("class", "message error").text(buildErrorMessage(e)); - - var result = false; - } - - doLayout(); - return result; - } - - function parse() { - oldInput = $("#input").val(); - - $("#input").removeAttr("disabled"); - $("#parse-message").attr("class", "message progress").text("Parsing the input..."); - $("#output").addClass("disabled").text("Output not available."); - - try { - var timeBefore = (new Date).getTime(); - var output = parser.parse($("#input").val()); - var timeAfter = (new Date).getTime(); - - $("#parse-message") - .attr("class", "message info") - .text("Input parsed successfully.") - .append(buildSizeAndTimeInfoHtml( - "Parsing time and speed", - $("#input").val().length, - timeAfter - timeBefore - )); - let json = jsDump.parse(output); - json = json.replace(/ *[{}],? */g, ''); - json = json.replace(/\n([ \t]*\n)*/g, '\n'); - - $("#output").removeClass("disabled").text(json); - - var result = true; - } catch (e) { - $("#parse-message").attr("class", "message error").text(buildErrorMessage(e)); - - var result = false; - } - - doLayout(); - return result; - } - - function buildAndParse() { - console.log('buildAndParse()'); - build() && parse(); - } - - function scheduleBuildAndParse() { - var nothingChanged = getGrammar() === oldGrammar - && $("#parser-var").val() === oldParserVar - && $("#option-cache").is(":checked") === oldOptionCache - && $("#option-optimize").val() === oldOptionOptimize; - if (nothingChanged) { return; } - - if (buildAndParseTimer !== null) { - clearTimeout(buildAndParseTimer); - buildAndParseTimer = null; - } - if (parseTimer !== null) { - clearTimeout(parseTimer); - parseTimer = null; - } - - buildAndParseTimer = setTimeout(function() { - buildAndParse(); - buildAndParseTimer = null; - }, 500); - } - - function scheduleParse() { - if ($("#input").val() === oldInput) { return; } - if (buildAndParseTimer !== null) { return; } - - if (parseTimer !== null) { - clearTimeout(parseTimer); - parseTimer = null; - } - - parseTimer = setTimeout(function() { - parse(); - parseTimer = null; - }, 500); - } - - function doLayout() { - /* - * This forces layout of the page so that the |#columns| table gets a chance - * make itself smaller when the browser window shrinks. - */ - $("#left-column").height("0px"); // needed for IE - $("#right-column").height("0px"); // needed for IE - $(".CodeMirror").height("0px"); - $("#input").height("0px"); - - $("#left-column").height(($("#left-column").parent().innerHeight() - 2) + "px"); // needed for IE - $("#right-column").height(($("#right-column").parent().innerHeight() - 2) + "px"); // needed for IE - $(".CodeMirror").height(($(".CodeMirror").parent().parent().innerHeight() - 14) + "px"); - $("#input").height(($("#input").parent().parent().innerHeight() - 14) + "px"); - } - - function getGrammar() { - return editor.getValue(); - } - - editor.on("change", scheduleBuildAndParse); - - $("#parser-var, #option-cache, #option-optimize") - .change(scheduleBuildAndParse) - .mousedown(scheduleBuildAndParse) - .mouseup(scheduleBuildAndParse) - .click(scheduleBuildAndParse) - .keydown(scheduleBuildAndParse) - .keyup(scheduleBuildAndParse) - .keypress(scheduleBuildAndParse); - - $("#input") - .change(scheduleParse) - .mousedown(scheduleParse) - .mouseup(scheduleParse) - .click(scheduleParse) - .keydown(scheduleParse) - .keyup(scheduleParse) - .keypress(scheduleParse); - - doLayout(); - $(window).resize(doLayout); - - $("#loader").hide(); - $("#content").show(); - - $("#grammar, #parser-var, #option-cache, #option-optimize").removeAttr("disabled"); - - buildAndParse(); - - editor.refresh(); - editor.focus(); -}); diff --git a/tools/pegjs.org/js/test-bundle.js b/tools/pegjs.org/js/test-bundle.js deleted file mode 100644 index 913339e2..00000000 --- a/tools/pegjs.org/js/test-bundle.js +++ /dev/null @@ -1,38063 +0,0 @@ -var test = (function (exports) { - 'use strict'; - - function _typeof(obj) { - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) _setPrototypeOf(subClass, superClass); - } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); - } - - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; - } - - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - - return _assertThisInitialized(self); - } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - - return arr2; - } - } - - function _iterableToArray(iter) { - if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance"); - } - - var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - - function createCommonjsModule(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; - } - - function getCjsExportFromNamespace (n) { - return n && n.default || n; - } - - /*! - * assertion-error - * Copyright(c) 2013 Jake Luer - * MIT Licensed - */ - - /*! - * Return a function that will copy properties from - * one object to another excluding any originally - * listed. Returned function will create a new `{}`. - * - * @param {String} excluded properties ... - * @return {Function} - */ - - function exclude () { - var excludes = [].slice.call(arguments); - - function excludeProps (res, obj) { - Object.keys(obj).forEach(function (key) { - if (!~excludes.indexOf(key)) res[key] = obj[key]; - }); - } - - return function extendExclude () { - var args = [].slice.call(arguments) - , i = 0 - , res = {}; - - for (; i < args.length; i++) { - excludeProps(res, args[i]); - } - - return res; - }; - } - /*! - * Primary Exports - */ - - var assertionError = AssertionError; - - /** - * ### AssertionError - * - * An extension of the JavaScript `Error` constructor for - * assertion and validation scenarios. - * - * @param {String} message - * @param {Object} properties to include (optional) - * @param {callee} start stack function (optional) - */ - - function AssertionError (message, _props, ssf) { - var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON') - , props = extend(_props || {}); - - // default values - this.message = message || 'Unspecified AssertionError'; - this.showDiff = false; - - // copy from properties - for (var key in props) { - this[key] = props[key]; - } - - // capture stack trace - ssf = ssf || AssertionError; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, ssf); - } else { - try { - throw new Error(); - } catch(e) { - this.stack = e.stack; - } - } - } - - /*! - * Inherit from Error.prototype - */ - - AssertionError.prototype = Object.create(Error.prototype); - - /*! - * Statically set name - */ - - AssertionError.prototype.name = 'AssertionError'; - - /*! - * Ensure correct constructor - */ - - AssertionError.prototype.constructor = AssertionError; - - /** - * Allow errors to be converted to JSON for static transfer. - * - * @param {Boolean} include stack (default: `true`) - * @return {Object} object that can be `JSON.stringify` - */ - - AssertionError.prototype.toJSON = function (stack) { - var extend = exclude('constructor', 'toJSON', 'stack') - , props = extend({ name: this.name }, this); - - // include stack if exists and not turned off - if (false !== stack && this.stack) { - props.stack = this.stack; - } - - return props; - }; - - /* ! - * Chai - pathval utility - * Copyright(c) 2012-2014 Jake Luer - * @see https://github.com/logicalparadox/filtr - * MIT Licensed - */ - - /** - * ### .hasProperty(object, name) - * - * This allows checking whether an object has own - * or inherited from prototype chain named property. - * - * Basically does the same thing as the `in` - * operator but works properly with null/undefined values - * and other primitives. - * - * var obj = { - * arr: ['a', 'b', 'c'] - * , str: 'Hello' - * } - * - * The following would be the results. - * - * hasProperty(obj, 'str'); // true - * hasProperty(obj, 'constructor'); // true - * hasProperty(obj, 'bar'); // false - * - * hasProperty(obj.str, 'length'); // true - * hasProperty(obj.str, 1); // true - * hasProperty(obj.str, 5); // false - * - * hasProperty(obj.arr, 'length'); // true - * hasProperty(obj.arr, 2); // true - * hasProperty(obj.arr, 3); // false - * - * @param {Object} object - * @param {String|Symbol} name - * @returns {Boolean} whether it exists - * @namespace Utils - * @name hasProperty - * @api public - */ - - function hasProperty(obj, name) { - if (typeof obj === 'undefined' || obj === null) { - return false; - } - - // The `in` operator does not work with primitives. - return name in Object(obj); - } - - /* ! - * ## parsePath(path) - * - * Helper function used to parse string object - * paths. Use in conjunction with `internalGetPathValue`. - * - * var parsed = parsePath('myobject.property.subprop'); - * - * ### Paths: - * - * * Can be infinitely deep and nested. - * * Arrays are also valid using the formal `myobject.document[3].property`. - * * Literal dots and brackets (not delimiter) must be backslash-escaped. - * - * @param {String} path - * @returns {Object} parsed - * @api private - */ - - function parsePath(path) { - var str = path.replace(/([^\\])\[/g, '$1.['); - var parts = str.match(/(\\\.|[^.]+?)+/g); - return parts.map(function mapMatches(value) { - var regexp = /^\[(\d+)\]$/; - var mArr = regexp.exec(value); - var parsed = null; - if (mArr) { - parsed = { i: parseFloat(mArr[1]) }; - } else { - parsed = { p: value.replace(/\\([.\[\]])/g, '$1') }; - } - - return parsed; - }); - } - - /* ! - * ## internalGetPathValue(obj, parsed[, pathDepth]) - * - * Helper companion function for `.parsePath` that returns - * the value located at the parsed address. - * - * var value = getPathValue(obj, parsed); - * - * @param {Object} object to search against - * @param {Object} parsed definition from `parsePath`. - * @param {Number} depth (nesting level) of the property we want to retrieve - * @returns {Object|Undefined} value - * @api private - */ - - function internalGetPathValue(obj, parsed, pathDepth) { - var temporaryValue = obj; - var res = null; - pathDepth = (typeof pathDepth === 'undefined' ? parsed.length : pathDepth); - - for (var i = 0; i < pathDepth; i++) { - var part = parsed[i]; - if (temporaryValue) { - if (typeof part.p === 'undefined') { - temporaryValue = temporaryValue[part.i]; - } else { - temporaryValue = temporaryValue[part.p]; - } - - if (i === (pathDepth - 1)) { - res = temporaryValue; - } - } - } - - return res; - } - - /* ! - * ## internalSetPathValue(obj, value, parsed) - * - * Companion function for `parsePath` that sets - * the value located at a parsed address. - * - * internalSetPathValue(obj, 'value', parsed); - * - * @param {Object} object to search and define on - * @param {*} value to use upon set - * @param {Object} parsed definition from `parsePath` - * @api private - */ - - function internalSetPathValue(obj, val, parsed) { - var tempObj = obj; - var pathDepth = parsed.length; - var part = null; - // Here we iterate through every part of the path - for (var i = 0; i < pathDepth; i++) { - var propName = null; - var propVal = null; - part = parsed[i]; - - // If it's the last part of the path, we set the 'propName' value with the property name - if (i === (pathDepth - 1)) { - propName = typeof part.p === 'undefined' ? part.i : part.p; - // Now we set the property with the name held by 'propName' on object with the desired val - tempObj[propName] = val; - } else if (typeof part.p !== 'undefined' && tempObj[part.p]) { - tempObj = tempObj[part.p]; - } else if (typeof part.i !== 'undefined' && tempObj[part.i]) { - tempObj = tempObj[part.i]; - } else { - // If the obj doesn't have the property we create one with that name to define it - var next = parsed[i + 1]; - // Here we set the name of the property which will be defined - propName = typeof part.p === 'undefined' ? part.i : part.p; - // Here we decide if this property will be an array or a new object - propVal = typeof next.p === 'undefined' ? [] : {}; - tempObj[propName] = propVal; - tempObj = tempObj[propName]; - } - } - } - - /** - * ### .getPathInfo(object, path) - * - * This allows the retrieval of property info in an - * object given a string path. - * - * The path info consists of an object with the - * following properties: - * - * * parent - The parent object of the property referenced by `path` - * * name - The name of the final property, a number if it was an array indexer - * * value - The value of the property, if it exists, otherwise `undefined` - * * exists - Whether the property exists or not - * - * @param {Object} object - * @param {String} path - * @returns {Object} info - * @namespace Utils - * @name getPathInfo - * @api public - */ - - function getPathInfo(obj, path) { - var parsed = parsePath(path); - var last = parsed[parsed.length - 1]; - var info = { - parent: parsed.length > 1 ? internalGetPathValue(obj, parsed, parsed.length - 1) : obj, - name: last.p || last.i, - value: internalGetPathValue(obj, parsed), - }; - info.exists = hasProperty(info.parent, info.name); - - return info; - } - - /** - * ### .getPathValue(object, path) - * - * This allows the retrieval of values in an - * object given a string path. - * - * var obj = { - * prop1: { - * arr: ['a', 'b', 'c'] - * , str: 'Hello' - * } - * , prop2: { - * arr: [ { nested: 'Universe' } ] - * , str: 'Hello again!' - * } - * } - * - * The following would be the results. - * - * getPathValue(obj, 'prop1.str'); // Hello - * getPathValue(obj, 'prop1.att[2]'); // b - * getPathValue(obj, 'prop2.arr[0].nested'); // Universe - * - * @param {Object} object - * @param {String} path - * @returns {Object} value or `undefined` - * @namespace Utils - * @name getPathValue - * @api public - */ - - function getPathValue(obj, path) { - var info = getPathInfo(obj, path); - return info.value; - } - - /** - * ### .setPathValue(object, path, value) - * - * Define the value in an object at a given string path. - * - * ```js - * var obj = { - * prop1: { - * arr: ['a', 'b', 'c'] - * , str: 'Hello' - * } - * , prop2: { - * arr: [ { nested: 'Universe' } ] - * , str: 'Hello again!' - * } - * }; - * ``` - * - * The following would be acceptable. - * - * ```js - * var properties = require('tea-properties'); - * properties.set(obj, 'prop1.str', 'Hello Universe!'); - * properties.set(obj, 'prop1.arr[2]', 'B'); - * properties.set(obj, 'prop2.arr[0].nested.value', { hello: 'universe' }); - * ``` - * - * @param {Object} object - * @param {String} path - * @param {Mixed} value - * @api private - */ - - function setPathValue(obj, path, val) { - var parsed = parsePath(path); - internalSetPathValue(obj, val, parsed); - return obj; - } - - var pathval = { - hasProperty: hasProperty, - getPathInfo: getPathInfo, - getPathValue: getPathValue, - setPathValue: setPathValue, - }; - - /*! - * Chai - flag utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /** - * ### .flag(object, key, [value]) - * - * Get or set a flag value on an object. If a - * value is provided it will be set, else it will - * return the currently set value or `undefined` if - * the value is not set. - * - * utils.flag(this, 'foo', 'bar'); // setter - * utils.flag(this, 'foo'); // getter, returns `bar` - * - * @param {Object} object constructed Assertion - * @param {String} key - * @param {Mixed} value (optional) - * @namespace Utils - * @name flag - * @api private - */ - - var flag = function flag(obj, key, value) { - var flags = obj.__flags || (obj.__flags = Object.create(null)); - if (arguments.length === 3) { - flags[key] = value; - } else { - return flags[key]; - } - }; - - /*! - * Chai - test utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /*! - * Module dependencies - */ - - - - /** - * ### .test(object, expression) - * - * Test and object for expression. - * - * @param {Object} object (constructed Assertion) - * @param {Arguments} chai.Assertion.prototype.assert arguments - * @namespace Utils - * @name test - */ - - var test = function test(obj, args) { - var negate = flag(obj, 'negate') - , expr = args[0]; - return negate ? !expr : expr; - }; - - var typeDetect = createCommonjsModule(function (module, exports) { - (function (global, factory) { - module.exports = factory(); - }(commonjsGlobal, (function () { - /* ! - * type-detect - * Copyright(c) 2013 jake luer - * MIT Licensed - */ - var promiseExists = typeof Promise === 'function'; - - /* eslint-disable no-undef */ - var globalObject = typeof self === 'object' ? self : commonjsGlobal; // eslint-disable-line id-blacklist - - var symbolExists = typeof Symbol !== 'undefined'; - var mapExists = typeof Map !== 'undefined'; - var setExists = typeof Set !== 'undefined'; - var weakMapExists = typeof WeakMap !== 'undefined'; - var weakSetExists = typeof WeakSet !== 'undefined'; - var dataViewExists = typeof DataView !== 'undefined'; - var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined'; - var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined'; - var setEntriesExists = setExists && typeof Set.prototype.entries === 'function'; - var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function'; - var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries()); - var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries()); - var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function'; - var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]()); - var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function'; - var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]()); - var toStringLeftSliceLength = 8; - var toStringRightSliceLength = -1; - /** - * ### typeOf (obj) - * - * Uses `Object.prototype.toString` to determine the type of an object, - * normalising behaviour across engine versions & well optimised. - * - * @param {Mixed} object - * @return {String} object type - * @api public - */ - function typeDetect(obj) { - /* ! Speed optimisation - * Pre: - * string literal x 3,039,035 ops/sec ±1.62% (78 runs sampled) - * boolean literal x 1,424,138 ops/sec ±4.54% (75 runs sampled) - * number literal x 1,653,153 ops/sec ±1.91% (82 runs sampled) - * undefined x 9,978,660 ops/sec ±1.92% (75 runs sampled) - * function x 2,556,769 ops/sec ±1.73% (77 runs sampled) - * Post: - * string literal x 38,564,796 ops/sec ±1.15% (79 runs sampled) - * boolean literal x 31,148,940 ops/sec ±1.10% (79 runs sampled) - * number literal x 32,679,330 ops/sec ±1.90% (78 runs sampled) - * undefined x 32,363,368 ops/sec ±1.07% (82 runs sampled) - * function x 31,296,870 ops/sec ±0.96% (83 runs sampled) - */ - var typeofObj = typeof obj; - if (typeofObj !== 'object') { - return typeofObj; - } - - /* ! Speed optimisation - * Pre: - * null x 28,645,765 ops/sec ±1.17% (82 runs sampled) - * Post: - * null x 36,428,962 ops/sec ±1.37% (84 runs sampled) - */ - if (obj === null) { - return 'null'; - } - - /* ! Spec Conformance - * Test: `Object.prototype.toString.call(window)`` - * - Node === "[object global]" - * - Chrome === "[object global]" - * - Firefox === "[object Window]" - * - PhantomJS === "[object Window]" - * - Safari === "[object Window]" - * - IE 11 === "[object Window]" - * - IE Edge === "[object Window]" - * Test: `Object.prototype.toString.call(this)`` - * - Chrome Worker === "[object global]" - * - Firefox Worker === "[object DedicatedWorkerGlobalScope]" - * - Safari Worker === "[object DedicatedWorkerGlobalScope]" - * - IE 11 Worker === "[object WorkerGlobalScope]" - * - IE Edge Worker === "[object WorkerGlobalScope]" - */ - if (obj === globalObject) { - return 'global'; - } - - /* ! Speed optimisation - * Pre: - * array literal x 2,888,352 ops/sec ±0.67% (82 runs sampled) - * Post: - * array literal x 22,479,650 ops/sec ±0.96% (81 runs sampled) - */ - if ( - Array.isArray(obj) && - (symbolToStringTagExists === false || !(Symbol.toStringTag in obj)) - ) { - return 'Array'; - } - - // Not caching existence of `window` and related properties due to potential - // for `window` to be unset before tests in quasi-browser environments. - if (typeof window === 'object' && window !== null) { - /* ! Spec Conformance - * (https://html.spec.whatwg.org/multipage/browsers.html#location) - * WhatWG HTML$7.7.3 - The `Location` interface - * Test: `Object.prototype.toString.call(window.location)`` - * - IE <=11 === "[object Object]" - * - IE Edge <=13 === "[object Object]" - */ - if (typeof window.location === 'object' && obj === window.location) { - return 'Location'; - } - - /* ! Spec Conformance - * (https://html.spec.whatwg.org/#document) - * WhatWG HTML$3.1.1 - The `Document` object - * Note: Most browsers currently adher to the W3C DOM Level 2 spec - * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268) - * which suggests that browsers should use HTMLTableCellElement for - * both TD and TH elements. WhatWG separates these. - * WhatWG HTML states: - * > For historical reasons, Window objects must also have a - * > writable, configurable, non-enumerable property named - * > HTMLDocument whose value is the Document interface object. - * Test: `Object.prototype.toString.call(document)`` - * - Chrome === "[object HTMLDocument]" - * - Firefox === "[object HTMLDocument]" - * - Safari === "[object HTMLDocument]" - * - IE <=10 === "[object Document]" - * - IE 11 === "[object HTMLDocument]" - * - IE Edge <=13 === "[object HTMLDocument]" - */ - if (typeof window.document === 'object' && obj === window.document) { - return 'Document'; - } - - if (typeof window.navigator === 'object') { - /* ! Spec Conformance - * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray) - * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray - * Test: `Object.prototype.toString.call(navigator.mimeTypes)`` - * - IE <=10 === "[object MSMimeTypesCollection]" - */ - if (typeof window.navigator.mimeTypes === 'object' && - obj === window.navigator.mimeTypes) { - return 'MimeTypeArray'; - } - - /* ! Spec Conformance - * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) - * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray - * Test: `Object.prototype.toString.call(navigator.plugins)`` - * - IE <=10 === "[object MSPluginsCollection]" - */ - if (typeof window.navigator.plugins === 'object' && - obj === window.navigator.plugins) { - return 'PluginArray'; - } - } - - if ((typeof window.HTMLElement === 'function' || - typeof window.HTMLElement === 'object') && - obj instanceof window.HTMLElement) { - /* ! Spec Conformance - * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) - * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement` - * Test: `Object.prototype.toString.call(document.createElement('blockquote'))`` - * - IE <=10 === "[object HTMLBlockElement]" - */ - if (obj.tagName === 'BLOCKQUOTE') { - return 'HTMLQuoteElement'; - } - - /* ! Spec Conformance - * (https://html.spec.whatwg.org/#htmltabledatacellelement) - * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement` - * Note: Most browsers currently adher to the W3C DOM Level 2 spec - * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) - * which suggests that browsers should use HTMLTableCellElement for - * both TD and TH elements. WhatWG separates these. - * Test: Object.prototype.toString.call(document.createElement('td')) - * - Chrome === "[object HTMLTableCellElement]" - * - Firefox === "[object HTMLTableCellElement]" - * - Safari === "[object HTMLTableCellElement]" - */ - if (obj.tagName === 'TD') { - return 'HTMLTableDataCellElement'; - } - - /* ! Spec Conformance - * (https://html.spec.whatwg.org/#htmltableheadercellelement) - * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement` - * Note: Most browsers currently adher to the W3C DOM Level 2 spec - * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) - * which suggests that browsers should use HTMLTableCellElement for - * both TD and TH elements. WhatWG separates these. - * Test: Object.prototype.toString.call(document.createElement('th')) - * - Chrome === "[object HTMLTableCellElement]" - * - Firefox === "[object HTMLTableCellElement]" - * - Safari === "[object HTMLTableCellElement]" - */ - if (obj.tagName === 'TH') { - return 'HTMLTableHeaderCellElement'; - } - } - } - - /* ! Speed optimisation - * Pre: - * Float64Array x 625,644 ops/sec ±1.58% (80 runs sampled) - * Float32Array x 1,279,852 ops/sec ±2.91% (77 runs sampled) - * Uint32Array x 1,178,185 ops/sec ±1.95% (83 runs sampled) - * Uint16Array x 1,008,380 ops/sec ±2.25% (80 runs sampled) - * Uint8Array x 1,128,040 ops/sec ±2.11% (81 runs sampled) - * Int32Array x 1,170,119 ops/sec ±2.88% (80 runs sampled) - * Int16Array x 1,176,348 ops/sec ±5.79% (86 runs sampled) - * Int8Array x 1,058,707 ops/sec ±4.94% (77 runs sampled) - * Uint8ClampedArray x 1,110,633 ops/sec ±4.20% (80 runs sampled) - * Post: - * Float64Array x 7,105,671 ops/sec ±13.47% (64 runs sampled) - * Float32Array x 5,887,912 ops/sec ±1.46% (82 runs sampled) - * Uint32Array x 6,491,661 ops/sec ±1.76% (79 runs sampled) - * Uint16Array x 6,559,795 ops/sec ±1.67% (82 runs sampled) - * Uint8Array x 6,463,966 ops/sec ±1.43% (85 runs sampled) - * Int32Array x 5,641,841 ops/sec ±3.49% (81 runs sampled) - * Int16Array x 6,583,511 ops/sec ±1.98% (80 runs sampled) - * Int8Array x 6,606,078 ops/sec ±1.74% (81 runs sampled) - * Uint8ClampedArray x 6,602,224 ops/sec ±1.77% (83 runs sampled) - */ - var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]); - if (typeof stringTag === 'string') { - return stringTag; - } - - var objPrototype = Object.getPrototypeOf(obj); - /* ! Speed optimisation - * Pre: - * regex literal x 1,772,385 ops/sec ±1.85% (77 runs sampled) - * regex constructor x 2,143,634 ops/sec ±2.46% (78 runs sampled) - * Post: - * regex literal x 3,928,009 ops/sec ±0.65% (78 runs sampled) - * regex constructor x 3,931,108 ops/sec ±0.58% (84 runs sampled) - */ - if (objPrototype === RegExp.prototype) { - return 'RegExp'; - } - - /* ! Speed optimisation - * Pre: - * date x 2,130,074 ops/sec ±4.42% (68 runs sampled) - * Post: - * date x 3,953,779 ops/sec ±1.35% (77 runs sampled) - */ - if (objPrototype === Date.prototype) { - return 'Date'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag) - * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be "Promise": - * Test: `Object.prototype.toString.call(Promise.resolve())`` - * - Chrome <=47 === "[object Object]" - * - Edge <=20 === "[object Object]" - * - Firefox 29-Latest === "[object Promise]" - * - Safari 7.1-Latest === "[object Promise]" - */ - if (promiseExists && objPrototype === Promise.prototype) { - return 'Promise'; - } - - /* ! Speed optimisation - * Pre: - * set x 2,222,186 ops/sec ±1.31% (82 runs sampled) - * Post: - * set x 4,545,879 ops/sec ±1.13% (83 runs sampled) - */ - if (setExists && objPrototype === Set.prototype) { - return 'Set'; - } - - /* ! Speed optimisation - * Pre: - * map x 2,396,842 ops/sec ±1.59% (81 runs sampled) - * Post: - * map x 4,183,945 ops/sec ±6.59% (82 runs sampled) - */ - if (mapExists && objPrototype === Map.prototype) { - return 'Map'; - } - - /* ! Speed optimisation - * Pre: - * weakset x 1,323,220 ops/sec ±2.17% (76 runs sampled) - * Post: - * weakset x 4,237,510 ops/sec ±2.01% (77 runs sampled) - */ - if (weakSetExists && objPrototype === WeakSet.prototype) { - return 'WeakSet'; - } - - /* ! Speed optimisation - * Pre: - * weakmap x 1,500,260 ops/sec ±2.02% (78 runs sampled) - * Post: - * weakmap x 3,881,384 ops/sec ±1.45% (82 runs sampled) - */ - if (weakMapExists && objPrototype === WeakMap.prototype) { - return 'WeakMap'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag) - * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be "DataView": - * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))`` - * - Edge <=13 === "[object Object]" - */ - if (dataViewExists && objPrototype === DataView.prototype) { - return 'DataView'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag) - * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be "Map Iterator": - * Test: `Object.prototype.toString.call(new Map().entries())`` - * - Edge <=13 === "[object Object]" - */ - if (mapExists && objPrototype === mapIteratorPrototype) { - return 'Map Iterator'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag) - * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be "Set Iterator": - * Test: `Object.prototype.toString.call(new Set().entries())`` - * - Edge <=13 === "[object Object]" - */ - if (setExists && objPrototype === setIteratorPrototype) { - return 'Set Iterator'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag) - * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be "Array Iterator": - * Test: `Object.prototype.toString.call([][Symbol.iterator]())`` - * - Edge <=13 === "[object Object]" - */ - if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) { - return 'Array Iterator'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag) - * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be "String Iterator": - * Test: `Object.prototype.toString.call(''[Symbol.iterator]())`` - * - Edge <=13 === "[object Object]" - */ - if (stringIteratorExists && objPrototype === stringIteratorPrototype) { - return 'String Iterator'; - } - - /* ! Speed optimisation - * Pre: - * object from null x 2,424,320 ops/sec ±1.67% (76 runs sampled) - * Post: - * object from null x 5,838,000 ops/sec ±0.99% (84 runs sampled) - */ - if (objPrototype === null) { - return 'Object'; - } - - return Object - .prototype - .toString - .call(obj) - .slice(toStringLeftSliceLength, toStringRightSliceLength); - } - - return typeDetect; - - }))); - }); - - /*! - * Chai - expectTypes utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /** - * ### .expectTypes(obj, types) - * - * Ensures that the object being tested against is of a valid type. - * - * utils.expectTypes(this, ['array', 'object', 'string']); - * - * @param {Mixed} obj constructed Assertion - * @param {Array} type A list of allowed types for this assertion - * @namespace Utils - * @name expectTypes - * @api public - */ - - - - - - var expectTypes = function expectTypes(obj, types) { - var flagMsg = flag(obj, 'message'); - var ssfi = flag(obj, 'ssfi'); - - flagMsg = flagMsg ? flagMsg + ': ' : ''; - - obj = flag(obj, 'object'); - types = types.map(function (t) { return t.toLowerCase(); }); - types.sort(); - - // Transforms ['lorem', 'ipsum'] into 'a lorem, or an ipsum' - var str = types.map(function (t, index) { - var art = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(t.charAt(0)) ? 'an' : 'a'; - var or = types.length > 1 && index === types.length - 1 ? 'or ' : ''; - return or + art + ' ' + t; - }).join(', '); - - var objType = typeDetect(obj).toLowerCase(); - - if (!types.some(function (expected) { return objType === expected; })) { - throw new assertionError( - flagMsg + 'object tested must be ' + str + ', but ' + objType + ' given', - undefined, - ssfi - ); - } - }; - - /*! - * Chai - getActual utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /** - * ### .getActual(object, [actual]) - * - * Returns the `actual` value for an Assertion. - * - * @param {Object} object (constructed Assertion) - * @param {Arguments} chai.Assertion.prototype.assert arguments - * @namespace Utils - * @name getActual - */ - - var getActual = function getActual(obj, args) { - return args.length > 4 ? args[4] : obj._obj; - }; - - /* ! - * Chai - getFuncName utility - * Copyright(c) 2012-2016 Jake Luer - * MIT Licensed - */ - - /** - * ### .getFuncName(constructorFn) - * - * Returns the name of a function. - * When a non-function instance is passed, returns `null`. - * This also includes a polyfill function if `aFunc.name` is not defined. - * - * @name getFuncName - * @param {Function} funct - * @namespace Utils - * @api public - */ - - var toString = Function.prototype.toString; - var functionNameMatch = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\s\(\/]+)/; - function getFuncName(aFunc) { - if (typeof aFunc !== 'function') { - return null; - } - - var name = ''; - if (typeof Function.prototype.name === 'undefined' && typeof aFunc.name === 'undefined') { - // Here we run a polyfill if Function does not support the `name` property and if aFunc.name is not defined - var match = toString.call(aFunc).match(functionNameMatch); - if (match) { - name = match[1]; - } - } else { - // If we've got a `name` property we just use it - name = aFunc.name; - } - - return name; - } - - var getFuncName_1 = getFuncName; - - /*! - * Chai - getProperties utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /** - * ### .getProperties(object) - * - * This allows the retrieval of property names of an object, enumerable or not, - * inherited or not. - * - * @param {Object} object - * @returns {Array} - * @namespace Utils - * @name getProperties - * @api public - */ - - var getProperties = function getProperties(object) { - var result = Object.getOwnPropertyNames(object); - - function addProperty(property) { - if (result.indexOf(property) === -1) { - result.push(property); - } - } - - var proto = Object.getPrototypeOf(object); - while (proto !== null) { - Object.getOwnPropertyNames(proto).forEach(addProperty); - proto = Object.getPrototypeOf(proto); - } - - return result; - }; - - /*! - * Chai - getEnumerableProperties utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /** - * ### .getEnumerableProperties(object) - * - * This allows the retrieval of enumerable property names of an object, - * inherited or not. - * - * @param {Object} object - * @returns {Array} - * @namespace Utils - * @name getEnumerableProperties - * @api public - */ - - var getEnumerableProperties = function getEnumerableProperties(object) { - var result = []; - for (var name in object) { - result.push(name); - } - return result; - }; - - var config = { - - /** - * ### config.includeStack - * - * User configurable property, influences whether stack trace - * is included in Assertion error message. Default of false - * suppresses stack trace in the error message. - * - * chai.config.includeStack = true; // enable stack on error - * - * @param {Boolean} - * @api public - */ - - includeStack: false, - - /** - * ### config.showDiff - * - * User configurable property, influences whether or not - * the `showDiff` flag should be included in the thrown - * AssertionErrors. `false` will always be `false`; `true` - * will be true when the assertion has requested a diff - * be shown. - * - * @param {Boolean} - * @api public - */ - - showDiff: true, - - /** - * ### config.truncateThreshold - * - * User configurable property, sets length threshold for actual and - * expected values in assertion errors. If this threshold is exceeded, for - * example for large data structures, the value is replaced with something - * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`. - * - * Set it to zero if you want to disable truncating altogether. - * - * This is especially userful when doing assertions on arrays: having this - * set to a reasonable large value makes the failure messages readily - * inspectable. - * - * chai.config.truncateThreshold = 0; // disable truncating - * - * @param {Number} - * @api public - */ - - truncateThreshold: 40, - - /** - * ### config.useProxy - * - * User configurable property, defines if chai will use a Proxy to throw - * an error when a non-existent property is read, which protects users - * from typos when using property-based assertions. - * - * Set it to false if you want to disable this feature. - * - * chai.config.useProxy = false; // disable use of Proxy - * - * This feature is automatically disabled regardless of this config value - * in environments that don't support proxies. - * - * @param {Boolean} - * @api public - */ - - useProxy: true, - - /** - * ### config.proxyExcludedKeys - * - * User configurable property, defines which properties should be ignored - * instead of throwing an error if they do not exist on the assertion. - * This is only applied if the environment Chai is running in supports proxies and - * if the `useProxy` configuration setting is enabled. - * By default, `then` and `inspect` will not throw an error if they do not exist on the - * assertion object because the `.inspect` property is read by `util.inspect` (for example, when - * using `console.log` on the assertion object) and `.then` is necessary for promise type-checking. - * - * // By default these keys will not throw an error if they do not exist on the assertion object - * chai.config.proxyExcludedKeys = ['then', 'inspect']; - * - * @param {Array} - * @api public - */ - - proxyExcludedKeys: ['then', 'catch', 'inspect', 'toJSON'] - }; - - var inspect_1 = createCommonjsModule(function (module, exports) { - // This is (almost) directly from Node.js utils - // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/util.js - - - - - - - module.exports = inspect; - - /** - * ### .inspect(obj, [showHidden], [depth], [colors]) - * - * Echoes the value of a value. Tries to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Boolean} showHidden Flag that shows hidden (not enumerable) - * properties of objects. Default is false. - * @param {Number} depth Depth in which to descend in object. Default is 2. - * @param {Boolean} colors Flag to turn on ANSI escape codes to color the - * output. Default is false (no coloring). - * @namespace Utils - * @name inspect - */ - function inspect(obj, showHidden, depth, colors) { - var ctx = { - showHidden: showHidden, - seen: [], - stylize: function (str) { return str; } - }; - return formatValue(ctx, obj, (typeof depth === 'undefined' ? 2 : depth)); - } - - // Returns true if object is a DOM element. - var isDOMElement = function (object) { - if (typeof HTMLElement === 'object') { - return object instanceof HTMLElement; - } else { - return object && - typeof object === 'object' && - 'nodeType' in object && - object.nodeType === 1 && - typeof object.nodeName === 'string'; - } - }; - - function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (value && typeof value.inspect === 'function' && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (typeof ret !== 'string') { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // If this is a DOM element, try to get the outer HTML. - if (isDOMElement(value)) { - if ('outerHTML' in value) { - return value.outerHTML; - // This value does not have an outerHTML attribute, - // it could still be an XML element - } else { - // Attempt to serialize it - try { - if (document.xmlVersion) { - var xmlSerializer = new XMLSerializer(); - return xmlSerializer.serializeToString(value); - } else { - // Firefox 11- do not support outerHTML - // It does, however, support innerHTML - // Use the following to render the element - var ns = "http://www.w3.org/1999/xhtml"; - var container = document.createElementNS(ns, '_'); - - container.appendChild(value.cloneNode(false)); - var html = container.innerHTML - .replace('><', '>' + value.innerHTML + '<'); - container.innerHTML = ''; - return html; - } - } catch (err) { - // This could be a non-native DOM implementation, - // continue with the normal flow: - // printing the element as if it is an object. - } - } - } - - // Look up the keys of the object. - var visibleKeys = getEnumerableProperties(value); - var keys = ctx.showHidden ? getProperties(value) : visibleKeys; - - var name, nameSuffix; - - // Some type of object without properties can be shortcut. - // In IE, errors have a single `stack` property, or if they are vanilla `Error`, - // a `stack` plus `description` property; ignore those for consistency. - if (keys.length === 0 || (isError(value) && ( - (keys.length === 1 && keys[0] === 'stack') || - (keys.length === 2 && keys[0] === 'description' && keys[1] === 'stack') - ))) { - if (typeof value === 'function') { - name = getFuncName_1(value); - nameSuffix = name ? ': ' + name : ''; - return ctx.stylize('[Function' + nameSuffix + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toUTCString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '' - , array = false - , typedArray = false - , braces = ['{', '}']; - - if (isTypedArray(value)) { - typedArray = true; - braces = ['[', ']']; - } - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (typeof value === 'function') { - name = getFuncName_1(value); - nameSuffix = name ? ': ' + name : ''; - base = ' [Function' + nameSuffix + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - return formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else if (typedArray) { - return formatTypedArray(value); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); - } - - function formatPrimitive(ctx, value) { - switch (typeof value) { - case 'undefined': - return ctx.stylize('undefined', 'undefined'); - - case 'string': - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - - case 'number': - if (value === 0 && (1/value) === -Infinity) { - return ctx.stylize('-0', 'number'); - } - return ctx.stylize('' + value, 'number'); - - case 'boolean': - return ctx.stylize('' + value, 'boolean'); - - case 'symbol': - return ctx.stylize(value.toString(), 'symbol'); - } - // For some reason typeof null is "object", so special case here. - if (value === null) { - return ctx.stylize('null', 'null'); - } - } - - function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; - } - - function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (Object.prototype.hasOwnProperty.call(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; - } - - function formatTypedArray(value) { - var str = '[ '; - - for (var i = 0; i < value.length; ++i) { - if (str.length >= config.truncateThreshold - 7) { - str += '...'; - break; - } - str += value[i] + ', '; - } - str += ' ]'; - - // Removing trailing `, ` if the array was not truncated - if (str.indexOf(', ]') !== -1) { - str = str.replace(', ]', ' ]'); - } - - return str; - } - - function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name; - var propDescriptor = Object.getOwnPropertyDescriptor(value, key); - var str; - - if (propDescriptor) { - if (propDescriptor.get) { - if (propDescriptor.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (propDescriptor.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - } - if (visibleKeys.indexOf(key) < 0) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(value[key]) < 0) { - if (recurseTimes === null) { - str = formatValue(ctx, value[key], null); - } else { - str = formatValue(ctx, value[key], recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (typeof name === 'undefined') { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; - } - - function reduceToSingleString(output, base, braces) { - var length = output.reduce(function(prev, cur) { - return prev + cur.length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; - } - - function isTypedArray(ar) { - // Unfortunately there's no way to check if an object is a TypedArray - // We have to check if it's one of these types - return (typeof ar === 'object' && /\w+Array]$/.test(objectToString(ar))); - } - - function isArray(ar) { - return Array.isArray(ar) || - (typeof ar === 'object' && objectToString(ar) === '[object Array]'); - } - - function isRegExp(re) { - return typeof re === 'object' && objectToString(re) === '[object RegExp]'; - } - - function isDate(d) { - return typeof d === 'object' && objectToString(d) === '[object Date]'; - } - - function isError(e) { - return typeof e === 'object' && objectToString(e) === '[object Error]'; - } - - function objectToString(o) { - return Object.prototype.toString.call(o); - } - }); - - /*! - * Chai - flag utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /*! - * Module dependencies - */ - - - - - /** - * ### .objDisplay(object) - * - * Determines if an object or an array matches - * criteria to be inspected in-line for error - * messages or should be truncated. - * - * @param {Mixed} javascript object to inspect - * @name objDisplay - * @namespace Utils - * @api public - */ - - var objDisplay = function objDisplay(obj) { - var str = inspect_1(obj) - , type = Object.prototype.toString.call(obj); - - if (config.truncateThreshold && str.length >= config.truncateThreshold) { - if (type === '[object Function]') { - return !obj.name || obj.name === '' - ? '[Function]' - : '[Function: ' + obj.name + ']'; - } else if (type === '[object Array]') { - return '[ Array(' + obj.length + ') ]'; - } else if (type === '[object Object]') { - var keys = Object.keys(obj) - , kstr = keys.length > 2 - ? keys.splice(0, 2).join(', ') + ', ...' - : keys.join(', '); - return '{ Object (' + kstr + ') }'; - } else { - return str; - } - } else { - return str; - } - }; - - /*! - * Chai - message composition utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /*! - * Module dependencies - */ - - - - /** - * ### .getMessage(object, message, negateMessage) - * - * Construct the error message based on flags - * and template tags. Template tags will return - * a stringified inspection of the object referenced. - * - * Message template tags: - * - `#{this}` current asserted object - * - `#{act}` actual value - * - `#{exp}` expected value - * - * @param {Object} object (constructed Assertion) - * @param {Arguments} chai.Assertion.prototype.assert arguments - * @namespace Utils - * @name getMessage - * @api public - */ - - var getMessage = function getMessage(obj, args) { - var negate = flag(obj, 'negate') - , val = flag(obj, 'object') - , expected = args[3] - , actual = getActual(obj, args) - , msg = negate ? args[2] : args[1] - , flagMsg = flag(obj, 'message'); - - if(typeof msg === "function") msg = msg(); - msg = msg || ''; - msg = msg - .replace(/#\{this\}/g, function () { return objDisplay(val); }) - .replace(/#\{act\}/g, function () { return objDisplay(actual); }) - .replace(/#\{exp\}/g, function () { return objDisplay(expected); }); - - return flagMsg ? flagMsg + ': ' + msg : msg; - }; - - /*! - * Chai - transferFlags utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /** - * ### .transferFlags(assertion, object, includeAll = true) - * - * Transfer all the flags for `assertion` to `object`. If - * `includeAll` is set to `false`, then the base Chai - * assertion flags (namely `object`, `ssfi`, `lockSsfi`, - * and `message`) will not be transferred. - * - * - * var newAssertion = new Assertion(); - * utils.transferFlags(assertion, newAssertion); - * - * var anotherAssertion = new Assertion(myObj); - * utils.transferFlags(assertion, anotherAssertion, false); - * - * @param {Assertion} assertion the assertion to transfer the flags from - * @param {Object} object the object to transfer the flags to; usually a new assertion - * @param {Boolean} includeAll - * @namespace Utils - * @name transferFlags - * @api private - */ - - var transferFlags = function transferFlags(assertion, object, includeAll) { - var flags = assertion.__flags || (assertion.__flags = Object.create(null)); - - if (!object.__flags) { - object.__flags = Object.create(null); - } - - includeAll = arguments.length === 3 ? includeAll : true; - - for (var flag in flags) { - if (includeAll || - (flag !== 'object' && flag !== 'ssfi' && flag !== 'lockSsfi' && flag != 'message')) { - object.__flags[flag] = flags[flag]; - } - } - }; - - /* globals Symbol: false, Uint8Array: false, WeakMap: false */ - /*! - * deep-eql - * Copyright(c) 2013 Jake Luer - * MIT Licensed - */ - - - function FakeMap() { - this._key = 'chai/deep-eql__' + Math.random() + Date.now(); - } - - FakeMap.prototype = { - get: function getMap(key) { - return key[this._key]; - }, - set: function setMap(key, value) { - if (Object.isExtensible(key)) { - Object.defineProperty(key, this._key, { - value: value, - configurable: true, - }); - } - }, - }; - - var MemoizeMap = typeof WeakMap === 'function' ? WeakMap : FakeMap; - /*! - * Check to see if the MemoizeMap has recorded a result of the two operands - * - * @param {Mixed} leftHandOperand - * @param {Mixed} rightHandOperand - * @param {MemoizeMap} memoizeMap - * @returns {Boolean|null} result - */ - function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) { - // Technically, WeakMap keys can *only* be objects, not primitives. - if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { - return null; - } - var leftHandMap = memoizeMap.get(leftHandOperand); - if (leftHandMap) { - var result = leftHandMap.get(rightHandOperand); - if (typeof result === 'boolean') { - return result; - } - } - return null; - } - - /*! - * Set the result of the equality into the MemoizeMap - * - * @param {Mixed} leftHandOperand - * @param {Mixed} rightHandOperand - * @param {MemoizeMap} memoizeMap - * @param {Boolean} result - */ - function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) { - // Technically, WeakMap keys can *only* be objects, not primitives. - if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { - return; - } - var leftHandMap = memoizeMap.get(leftHandOperand); - if (leftHandMap) { - leftHandMap.set(rightHandOperand, result); - } else { - leftHandMap = new MemoizeMap(); - leftHandMap.set(rightHandOperand, result); - memoizeMap.set(leftHandOperand, leftHandMap); - } - } - - /*! - * Primary Export - */ - - var deepEql = deepEqual; - var MemoizeMap_1 = MemoizeMap; - - /** - * Assert deeply nested sameValue equality between two objects of any type. - * - * @param {Mixed} leftHandOperand - * @param {Mixed} rightHandOperand - * @param {Object} [options] (optional) Additional options - * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. - * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of - complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular - references to blow the stack. - * @return {Boolean} equal match - */ - function deepEqual(leftHandOperand, rightHandOperand, options) { - // If we have a comparator, we can't assume anything; so bail to its check first. - if (options && options.comparator) { - return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); - } - - var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); - if (simpleResult !== null) { - return simpleResult; - } - - // Deeper comparisons are pushed through to a larger function - return extensiveDeepEqual(leftHandOperand, rightHandOperand, options); - } - - /** - * Many comparisons can be canceled out early via simple equality or primitive checks. - * @param {Mixed} leftHandOperand - * @param {Mixed} rightHandOperand - * @return {Boolean|null} equal match - */ - function simpleEqual(leftHandOperand, rightHandOperand) { - // Equal references (except for Numbers) can be returned early - if (leftHandOperand === rightHandOperand) { - // Handle +-0 cases - return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand; - } - - // handle NaN cases - if ( - leftHandOperand !== leftHandOperand && // eslint-disable-line no-self-compare - rightHandOperand !== rightHandOperand // eslint-disable-line no-self-compare - ) { - return true; - } - - // Anything that is not an 'object', i.e. symbols, functions, booleans, numbers, - // strings, and undefined, can be compared by reference. - if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) { - // Easy out b/c it would have passed the first equality check - return false; - } - return null; - } - - /*! - * The main logic of the `deepEqual` function. - * - * @param {Mixed} leftHandOperand - * @param {Mixed} rightHandOperand - * @param {Object} [options] (optional) Additional options - * @param {Array} [options.comparator] (optional) Override default algorithm, determining custom equality. - * @param {Array} [options.memoize] (optional) Provide a custom memoization object which will cache the results of - complex objects for a speed boost. By passing `false` you can disable memoization, but this will cause circular - references to blow the stack. - * @return {Boolean} equal match - */ - function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) { - options = options || {}; - options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap(); - var comparator = options && options.comparator; - - // Check if a memoized result exists. - var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize); - if (memoizeResultLeft !== null) { - return memoizeResultLeft; - } - var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize); - if (memoizeResultRight !== null) { - return memoizeResultRight; - } - - // If a comparator is present, use it. - if (comparator) { - var comparatorResult = comparator(leftHandOperand, rightHandOperand); - // Comparators may return null, in which case we want to go back to default behavior. - if (comparatorResult === false || comparatorResult === true) { - memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult); - return comparatorResult; - } - // To allow comparators to override *any* behavior, we ran them first. Since it didn't decide - // what to do, we need to make sure to return the basic tests first before we move on. - var simpleResult = simpleEqual(leftHandOperand, rightHandOperand); - if (simpleResult !== null) { - // Don't memoize this, it takes longer to set/retrieve than to just compare. - return simpleResult; - } - } - - var leftHandType = typeDetect(leftHandOperand); - if (leftHandType !== typeDetect(rightHandOperand)) { - memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false); - return false; - } - - // Temporarily set the operands in the memoize object to prevent blowing the stack - memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true); - - var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options); - memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result); - return result; - } - - function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) { - switch (leftHandType) { - case 'String': - case 'Number': - case 'Boolean': - case 'Date': - // If these types are their instance types (e.g. `new Number`) then re-deepEqual against their values - return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf()); - case 'Promise': - case 'Symbol': - case 'function': - case 'WeakMap': - case 'WeakSet': - case 'Error': - return leftHandOperand === rightHandOperand; - case 'Arguments': - case 'Int8Array': - case 'Uint8Array': - case 'Uint8ClampedArray': - case 'Int16Array': - case 'Uint16Array': - case 'Int32Array': - case 'Uint32Array': - case 'Float32Array': - case 'Float64Array': - case 'Array': - return iterableEqual(leftHandOperand, rightHandOperand, options); - case 'RegExp': - return regexpEqual(leftHandOperand, rightHandOperand); - case 'Generator': - return generatorEqual(leftHandOperand, rightHandOperand, options); - case 'DataView': - return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options); - case 'ArrayBuffer': - return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options); - case 'Set': - return entriesEqual(leftHandOperand, rightHandOperand, options); - case 'Map': - return entriesEqual(leftHandOperand, rightHandOperand, options); - default: - return objectEqual(leftHandOperand, rightHandOperand, options); - } - } - - /*! - * Compare two Regular Expressions for equality. - * - * @param {RegExp} leftHandOperand - * @param {RegExp} rightHandOperand - * @return {Boolean} result - */ - - function regexpEqual(leftHandOperand, rightHandOperand) { - return leftHandOperand.toString() === rightHandOperand.toString(); - } - - /*! - * Compare two Sets/Maps for equality. Faster than other equality functions. - * - * @param {Set} leftHandOperand - * @param {Set} rightHandOperand - * @param {Object} [options] (Optional) - * @return {Boolean} result - */ - - function entriesEqual(leftHandOperand, rightHandOperand, options) { - // IE11 doesn't support Set#entries or Set#@@iterator, so we need manually populate using Set#forEach - if (leftHandOperand.size !== rightHandOperand.size) { - return false; - } - if (leftHandOperand.size === 0) { - return true; - } - var leftHandItems = []; - var rightHandItems = []; - leftHandOperand.forEach(function gatherEntries(key, value) { - leftHandItems.push([ key, value ]); - }); - rightHandOperand.forEach(function gatherEntries(key, value) { - rightHandItems.push([ key, value ]); - }); - return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options); - } - - /*! - * Simple equality for flat iterable objects such as Arrays, TypedArrays or Node.js buffers. - * - * @param {Iterable} leftHandOperand - * @param {Iterable} rightHandOperand - * @param {Object} [options] (Optional) - * @return {Boolean} result - */ - - function iterableEqual(leftHandOperand, rightHandOperand, options) { - var length = leftHandOperand.length; - if (length !== rightHandOperand.length) { - return false; - } - if (length === 0) { - return true; - } - var index = -1; - while (++index < length) { - if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) { - return false; - } - } - return true; - } - - /*! - * Simple equality for generator objects such as those returned by generator functions. - * - * @param {Iterable} leftHandOperand - * @param {Iterable} rightHandOperand - * @param {Object} [options] (Optional) - * @return {Boolean} result - */ - - function generatorEqual(leftHandOperand, rightHandOperand, options) { - return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options); - } - - /*! - * Determine if the given object has an @@iterator function. - * - * @param {Object} target - * @return {Boolean} `true` if the object has an @@iterator function. - */ - function hasIteratorFunction(target) { - return typeof Symbol !== 'undefined' && - typeof target === 'object' && - typeof Symbol.iterator !== 'undefined' && - typeof target[Symbol.iterator] === 'function'; - } - - /*! - * Gets all iterator entries from the given Object. If the Object has no @@iterator function, returns an empty array. - * This will consume the iterator - which could have side effects depending on the @@iterator implementation. - * - * @param {Object} target - * @returns {Array} an array of entries from the @@iterator function - */ - function getIteratorEntries(target) { - if (hasIteratorFunction(target)) { - try { - return getGeneratorEntries(target[Symbol.iterator]()); - } catch (iteratorError) { - return []; - } - } - return []; - } - - /*! - * Gets all entries from a Generator. This will consume the generator - which could have side effects. - * - * @param {Generator} target - * @returns {Array} an array of entries from the Generator. - */ - function getGeneratorEntries(generator) { - var generatorResult = generator.next(); - var accumulator = [ generatorResult.value ]; - while (generatorResult.done === false) { - generatorResult = generator.next(); - accumulator.push(generatorResult.value); - } - return accumulator; - } - - /*! - * Gets all own and inherited enumerable keys from a target. - * - * @param {Object} target - * @returns {Array} an array of own and inherited enumerable keys from the target. - */ - function getEnumerableKeys(target) { - var keys = []; - for (var key in target) { - keys.push(key); - } - return keys; - } - - /*! - * Determines if two objects have matching values, given a set of keys. Defers to deepEqual for the equality check of - * each key. If any value of the given key is not equal, the function will return false (early). - * - * @param {Mixed} leftHandOperand - * @param {Mixed} rightHandOperand - * @param {Array} keys An array of keys to compare the values of leftHandOperand and rightHandOperand against - * @param {Object} [options] (Optional) - * @return {Boolean} result - */ - function keysEqual(leftHandOperand, rightHandOperand, keys, options) { - var length = keys.length; - if (length === 0) { - return true; - } - for (var i = 0; i < length; i += 1) { - if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) { - return false; - } - } - return true; - } - - /*! - * Recursively check the equality of two Objects. Once basic sameness has been established it will defer to `deepEqual` - * for each enumerable key in the object. - * - * @param {Mixed} leftHandOperand - * @param {Mixed} rightHandOperand - * @param {Object} [options] (Optional) - * @return {Boolean} result - */ - - function objectEqual(leftHandOperand, rightHandOperand, options) { - var leftHandKeys = getEnumerableKeys(leftHandOperand); - var rightHandKeys = getEnumerableKeys(rightHandOperand); - if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) { - leftHandKeys.sort(); - rightHandKeys.sort(); - if (iterableEqual(leftHandKeys, rightHandKeys) === false) { - return false; - } - return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options); - } - - var leftHandEntries = getIteratorEntries(leftHandOperand); - var rightHandEntries = getIteratorEntries(rightHandOperand); - if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) { - leftHandEntries.sort(); - rightHandEntries.sort(); - return iterableEqual(leftHandEntries, rightHandEntries, options); - } - - if (leftHandKeys.length === 0 && - leftHandEntries.length === 0 && - rightHandKeys.length === 0 && - rightHandEntries.length === 0) { - return true; - } - - return false; - } - - /*! - * Returns true if the argument is a primitive. - * - * This intentionally returns true for all objects that can be compared by reference, - * including functions and symbols. - * - * @param {Mixed} value - * @return {Boolean} result - */ - function isPrimitive(value) { - return value === null || typeof value !== 'object'; - } - deepEql.MemoizeMap = MemoizeMap_1; - - /*! - * Chai - isProxyEnabled helper - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /** - * ### .isProxyEnabled() - * - * Helper function to check if Chai's proxy protection feature is enabled. If - * proxies are unsupported or disabled via the user's Chai config, then return - * false. Otherwise, return true. - * - * @namespace Utils - * @name isProxyEnabled - */ - - var isProxyEnabled = function isProxyEnabled() { - return config.useProxy && - typeof Proxy !== 'undefined' && - typeof Reflect !== 'undefined'; - }; - - /*! - * Chai - addProperty utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - - - - - - /** - * ### .addProperty(ctx, name, getter) - * - * Adds a property to the prototype of an object. - * - * utils.addProperty(chai.Assertion.prototype, 'foo', function () { - * var obj = utils.flag(this, 'object'); - * new chai.Assertion(obj).to.be.instanceof(Foo); - * }); - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.addProperty('foo', fn); - * - * Then can be used as any other assertion. - * - * expect(myFoo).to.be.foo; - * - * @param {Object} ctx object to which the property is added - * @param {String} name of property to add - * @param {Function} getter function to be used for name - * @namespace Utils - * @name addProperty - * @api public - */ - - var addProperty = function addProperty(ctx, name, getter) { - getter = getter === undefined ? function () {} : getter; - - Object.defineProperty(ctx, name, - { get: function propertyGetter() { - // Setting the `ssfi` flag to `propertyGetter` causes this function to - // be the starting point for removing implementation frames from the - // stack trace of a failed assertion. - // - // However, we only want to use this function as the starting point if - // the `lockSsfi` flag isn't set and proxy protection is disabled. - // - // If the `lockSsfi` flag is set, then either this assertion has been - // overwritten by another assertion, or this assertion is being invoked - // from inside of another assertion. In the first case, the `ssfi` flag - // has already been set by the overwriting assertion. In the second - // case, the `ssfi` flag has already been set by the outer assertion. - // - // If proxy protection is enabled, then the `ssfi` flag has already been - // set by the proxy getter. - if (!isProxyEnabled() && !flag(this, 'lockSsfi')) { - flag(this, 'ssfi', propertyGetter); - } - - var result = getter.call(this); - if (result !== undefined) - return result; - - var newAssertion = new chai.Assertion(); - transferFlags(this, newAssertion); - return newAssertion; - } - , configurable: true - }); - }; - - var fnLengthDesc = Object.getOwnPropertyDescriptor(function () {}, 'length'); - - /*! - * Chai - addLengthGuard utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /** - * ### .addLengthGuard(fn, assertionName, isChainable) - * - * Define `length` as a getter on the given uninvoked method assertion. The - * getter acts as a guard against chaining `length` directly off of an uninvoked - * method assertion, which is a problem because it references `function`'s - * built-in `length` property instead of Chai's `length` assertion. When the - * getter catches the user making this mistake, it throws an error with a - * helpful message. - * - * There are two ways in which this mistake can be made. The first way is by - * chaining the `length` assertion directly off of an uninvoked chainable - * method. In this case, Chai suggests that the user use `lengthOf` instead. The - * second way is by chaining the `length` assertion directly off of an uninvoked - * non-chainable method. Non-chainable methods must be invoked prior to - * chaining. In this case, Chai suggests that the user consult the docs for the - * given assertion. - * - * If the `length` property of functions is unconfigurable, then return `fn` - * without modification. - * - * Note that in ES6, the function's `length` property is configurable, so once - * support for legacy environments is dropped, Chai's `length` property can - * replace the built-in function's `length` property, and this length guard will - * no longer be necessary. In the mean time, maintaining consistency across all - * environments is the priority. - * - * @param {Function} fn - * @param {String} assertionName - * @param {Boolean} isChainable - * @namespace Utils - * @name addLengthGuard - */ - - var addLengthGuard = function addLengthGuard (fn, assertionName, isChainable) { - if (!fnLengthDesc.configurable) return fn; - - Object.defineProperty(fn, 'length', { - get: function () { - if (isChainable) { - throw Error('Invalid Chai property: ' + assertionName + '.length. Due' + - ' to a compatibility issue, "length" cannot directly follow "' + - assertionName + '". Use "' + assertionName + '.lengthOf" instead.'); - } - - throw Error('Invalid Chai property: ' + assertionName + '.length. See' + - ' docs for proper usage of "' + assertionName + '".'); - } - }); - - return fn; - }; - - /*! - * Chai - proxify utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /** - * ### .proxify(object) - * - * Return a proxy of given object that throws an error when a non-existent - * property is read. By default, the root cause is assumed to be a misspelled - * property, and thus an attempt is made to offer a reasonable suggestion from - * the list of existing properties. However, if a nonChainableMethodName is - * provided, then the root cause is instead a failure to invoke a non-chainable - * method prior to reading the non-existent property. - * - * If proxies are unsupported or disabled via the user's Chai config, then - * return object without modification. - * - * @param {Object} obj - * @param {String} nonChainableMethodName - * @namespace Utils - * @name proxify - */ - - var builtins = ['__flags', '__methods', '_obj', 'assert']; - - var proxify = function proxify(obj, nonChainableMethodName) { - if (!isProxyEnabled()) return obj; - - return new Proxy(obj, { - get: function proxyGetter(target, property) { - // This check is here because we should not throw errors on Symbol properties - // such as `Symbol.toStringTag`. - // The values for which an error should be thrown can be configured using - // the `config.proxyExcludedKeys` setting. - if (typeof property === 'string' && - config.proxyExcludedKeys.indexOf(property) === -1 && - !Reflect.has(target, property)) { - // Special message for invalid property access of non-chainable methods. - if (nonChainableMethodName) { - throw Error('Invalid Chai property: ' + nonChainableMethodName + '.' + - property + '. See docs for proper usage of "' + - nonChainableMethodName + '".'); - } - - // If the property is reasonably close to an existing Chai property, - // suggest that property to the user. Only suggest properties with a - // distance less than 4. - var suggestion = null; - var suggestionDistance = 4; - getProperties(target).forEach(function(prop) { - if ( - !Object.prototype.hasOwnProperty(prop) && - builtins.indexOf(prop) === -1 - ) { - var dist = stringDistanceCapped( - property, - prop, - suggestionDistance - ); - if (dist < suggestionDistance) { - suggestion = prop; - suggestionDistance = dist; - } - } - }); - - if (suggestion !== null) { - throw Error('Invalid Chai property: ' + property + - '. Did you mean "' + suggestion + '"?'); - } else { - throw Error('Invalid Chai property: ' + property); - } - } - - // Use this proxy getter as the starting point for removing implementation - // frames from the stack trace of a failed assertion. For property - // assertions, this prevents the proxy getter from showing up in the stack - // trace since it's invoked before the property getter. For method and - // chainable method assertions, this flag will end up getting changed to - // the method wrapper, which is good since this frame will no longer be in - // the stack once the method is invoked. Note that Chai builtin assertion - // properties such as `__flags` are skipped since this is only meant to - // capture the starting point of an assertion. This step is also skipped - // if the `lockSsfi` flag is set, thus indicating that this assertion is - // being called from within another assertion. In that case, the `ssfi` - // flag is already set to the outer assertion's starting point. - if (builtins.indexOf(property) === -1 && !flag(target, 'lockSsfi')) { - flag(target, 'ssfi', proxyGetter); - } - - return Reflect.get(target, property); - } - }); - }; - - /** - * # stringDistanceCapped(strA, strB, cap) - * Return the Levenshtein distance between two strings, but no more than cap. - * @param {string} strA - * @param {string} strB - * @param {number} number - * @return {number} min(string distance between strA and strB, cap) - * @api private - */ - - function stringDistanceCapped(strA, strB, cap) { - if (Math.abs(strA.length - strB.length) >= cap) { - return cap; - } - - var memo = []; - // `memo` is a two-dimensional array containing distances. - // memo[i][j] is the distance between strA.slice(0, i) and - // strB.slice(0, j). - for (var i = 0; i <= strA.length; i++) { - memo[i] = Array(strB.length + 1).fill(0); - memo[i][0] = i; - } - for (var j = 0; j < strB.length; j++) { - memo[0][j] = j; - } - - for (var i = 1; i <= strA.length; i++) { - var ch = strA.charCodeAt(i - 1); - for (var j = 1; j <= strB.length; j++) { - if (Math.abs(i - j) >= cap) { - memo[i][j] = cap; - continue; - } - memo[i][j] = Math.min( - memo[i - 1][j] + 1, - memo[i][j - 1] + 1, - memo[i - 1][j - 1] + - (ch === strB.charCodeAt(j - 1) ? 0 : 1) - ); - } - } - - return memo[strA.length][strB.length]; - } - - /*! - * Chai - addMethod utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - - - - - - - /** - * ### .addMethod(ctx, name, method) - * - * Adds a method to the prototype of an object. - * - * utils.addMethod(chai.Assertion.prototype, 'foo', function (str) { - * var obj = utils.flag(this, 'object'); - * new chai.Assertion(obj).to.be.equal(str); - * }); - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.addMethod('foo', fn); - * - * Then can be used as any other assertion. - * - * expect(fooStr).to.be.foo('bar'); - * - * @param {Object} ctx object to which the method is added - * @param {String} name of method to add - * @param {Function} method function to be used for name - * @namespace Utils - * @name addMethod - * @api public - */ - - var addMethod = function addMethod(ctx, name, method) { - var methodWrapper = function () { - // Setting the `ssfi` flag to `methodWrapper` causes this function to be the - // starting point for removing implementation frames from the stack trace of - // a failed assertion. - // - // However, we only want to use this function as the starting point if the - // `lockSsfi` flag isn't set. - // - // If the `lockSsfi` flag is set, then either this assertion has been - // overwritten by another assertion, or this assertion is being invoked from - // inside of another assertion. In the first case, the `ssfi` flag has - // already been set by the overwriting assertion. In the second case, the - // `ssfi` flag has already been set by the outer assertion. - if (!flag(this, 'lockSsfi')) { - flag(this, 'ssfi', methodWrapper); - } - - var result = method.apply(this, arguments); - if (result !== undefined) - return result; - - var newAssertion = new chai.Assertion(); - transferFlags(this, newAssertion); - return newAssertion; - }; - - addLengthGuard(methodWrapper, name, false); - ctx[name] = proxify(methodWrapper, name); - }; - - /*! - * Chai - overwriteProperty utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - - - - - - /** - * ### .overwriteProperty(ctx, name, fn) - * - * Overwrites an already existing property getter and provides - * access to previous value. Must return function to use as getter. - * - * utils.overwriteProperty(chai.Assertion.prototype, 'ok', function (_super) { - * return function () { - * var obj = utils.flag(this, 'object'); - * if (obj instanceof Foo) { - * new chai.Assertion(obj.name).to.equal('bar'); - * } else { - * _super.call(this); - * } - * } - * }); - * - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.overwriteProperty('foo', fn); - * - * Then can be used as any other assertion. - * - * expect(myFoo).to.be.ok; - * - * @param {Object} ctx object whose property is to be overwritten - * @param {String} name of property to overwrite - * @param {Function} getter function that returns a getter function to be used for name - * @namespace Utils - * @name overwriteProperty - * @api public - */ - - var overwriteProperty = function overwriteProperty(ctx, name, getter) { - var _get = Object.getOwnPropertyDescriptor(ctx, name) - , _super = function () {}; - - if (_get && 'function' === typeof _get.get) - _super = _get.get; - - Object.defineProperty(ctx, name, - { get: function overwritingPropertyGetter() { - // Setting the `ssfi` flag to `overwritingPropertyGetter` causes this - // function to be the starting point for removing implementation frames - // from the stack trace of a failed assertion. - // - // However, we only want to use this function as the starting point if - // the `lockSsfi` flag isn't set and proxy protection is disabled. - // - // If the `lockSsfi` flag is set, then either this assertion has been - // overwritten by another assertion, or this assertion is being invoked - // from inside of another assertion. In the first case, the `ssfi` flag - // has already been set by the overwriting assertion. In the second - // case, the `ssfi` flag has already been set by the outer assertion. - // - // If proxy protection is enabled, then the `ssfi` flag has already been - // set by the proxy getter. - if (!isProxyEnabled() && !flag(this, 'lockSsfi')) { - flag(this, 'ssfi', overwritingPropertyGetter); - } - - // Setting the `lockSsfi` flag to `true` prevents the overwritten - // assertion from changing the `ssfi` flag. By this point, the `ssfi` - // flag is already set to the correct starting point for this assertion. - var origLockSsfi = flag(this, 'lockSsfi'); - flag(this, 'lockSsfi', true); - var result = getter(_super).call(this); - flag(this, 'lockSsfi', origLockSsfi); - - if (result !== undefined) { - return result; - } - - var newAssertion = new chai.Assertion(); - transferFlags(this, newAssertion); - return newAssertion; - } - , configurable: true - }); - }; - - /*! - * Chai - overwriteMethod utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - - - - - - - /** - * ### .overwriteMethod(ctx, name, fn) - * - * Overwrites an already existing method and provides - * access to previous function. Must return function - * to be used for name. - * - * utils.overwriteMethod(chai.Assertion.prototype, 'equal', function (_super) { - * return function (str) { - * var obj = utils.flag(this, 'object'); - * if (obj instanceof Foo) { - * new chai.Assertion(obj.value).to.equal(str); - * } else { - * _super.apply(this, arguments); - * } - * } - * }); - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.overwriteMethod('foo', fn); - * - * Then can be used as any other assertion. - * - * expect(myFoo).to.equal('bar'); - * - * @param {Object} ctx object whose method is to be overwritten - * @param {String} name of method to overwrite - * @param {Function} method function that returns a function to be used for name - * @namespace Utils - * @name overwriteMethod - * @api public - */ - - var overwriteMethod = function overwriteMethod(ctx, name, method) { - var _method = ctx[name] - , _super = function () { - throw new Error(name + ' is not a function'); - }; - - if (_method && 'function' === typeof _method) - _super = _method; - - var overwritingMethodWrapper = function () { - // Setting the `ssfi` flag to `overwritingMethodWrapper` causes this - // function to be the starting point for removing implementation frames from - // the stack trace of a failed assertion. - // - // However, we only want to use this function as the starting point if the - // `lockSsfi` flag isn't set. - // - // If the `lockSsfi` flag is set, then either this assertion has been - // overwritten by another assertion, or this assertion is being invoked from - // inside of another assertion. In the first case, the `ssfi` flag has - // already been set by the overwriting assertion. In the second case, the - // `ssfi` flag has already been set by the outer assertion. - if (!flag(this, 'lockSsfi')) { - flag(this, 'ssfi', overwritingMethodWrapper); - } - - // Setting the `lockSsfi` flag to `true` prevents the overwritten assertion - // from changing the `ssfi` flag. By this point, the `ssfi` flag is already - // set to the correct starting point for this assertion. - var origLockSsfi = flag(this, 'lockSsfi'); - flag(this, 'lockSsfi', true); - var result = method(_super).apply(this, arguments); - flag(this, 'lockSsfi', origLockSsfi); - - if (result !== undefined) { - return result; - } - - var newAssertion = new chai.Assertion(); - transferFlags(this, newAssertion); - return newAssertion; - }; - - addLengthGuard(overwritingMethodWrapper, name, false); - ctx[name] = proxify(overwritingMethodWrapper, name); - }; - - /*! - * Chai - addChainingMethod utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - /*! - * Module dependencies - */ - - - - - - - - /*! - * Module variables - */ - - // Check whether `Object.setPrototypeOf` is supported - var canSetPrototype = typeof Object.setPrototypeOf === 'function'; - - // Without `Object.setPrototypeOf` support, this module will need to add properties to a function. - // However, some of functions' own props are not configurable and should be skipped. - var testFn = function() {}; - var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) { - var propDesc = Object.getOwnPropertyDescriptor(testFn, name); - - // Note: PhantomJS 1.x includes `callee` as one of `testFn`'s own properties, - // but then returns `undefined` as the property descriptor for `callee`. As a - // workaround, we perform an otherwise unnecessary type-check for `propDesc`, - // and then filter it out if it's not an object as it should be. - if (typeof propDesc !== 'object') - return true; - - return !propDesc.configurable; - }); - - // Cache `Function` properties - var call = Function.prototype.call, - apply = Function.prototype.apply; - - /** - * ### .addChainableMethod(ctx, name, method, chainingBehavior) - * - * Adds a method to an object, such that the method can also be chained. - * - * utils.addChainableMethod(chai.Assertion.prototype, 'foo', function (str) { - * var obj = utils.flag(this, 'object'); - * new chai.Assertion(obj).to.be.equal(str); - * }); - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.addChainableMethod('foo', fn, chainingBehavior); - * - * The result can then be used as both a method assertion, executing both `method` and - * `chainingBehavior`, or as a language chain, which only executes `chainingBehavior`. - * - * expect(fooStr).to.be.foo('bar'); - * expect(fooStr).to.be.foo.equal('foo'); - * - * @param {Object} ctx object to which the method is added - * @param {String} name of method to add - * @param {Function} method function to be used for `name`, when called - * @param {Function} chainingBehavior function to be called every time the property is accessed - * @namespace Utils - * @name addChainableMethod - * @api public - */ - - var addChainableMethod = function addChainableMethod(ctx, name, method, chainingBehavior) { - if (typeof chainingBehavior !== 'function') { - chainingBehavior = function () { }; - } - - var chainableBehavior = { - method: method - , chainingBehavior: chainingBehavior - }; - - // save the methods so we can overwrite them later, if we need to. - if (!ctx.__methods) { - ctx.__methods = {}; - } - ctx.__methods[name] = chainableBehavior; - - Object.defineProperty(ctx, name, - { get: function chainableMethodGetter() { - chainableBehavior.chainingBehavior.call(this); - - var chainableMethodWrapper = function () { - // Setting the `ssfi` flag to `chainableMethodWrapper` causes this - // function to be the starting point for removing implementation - // frames from the stack trace of a failed assertion. - // - // However, we only want to use this function as the starting point if - // the `lockSsfi` flag isn't set. - // - // If the `lockSsfi` flag is set, then this assertion is being - // invoked from inside of another assertion. In this case, the `ssfi` - // flag has already been set by the outer assertion. - // - // Note that overwriting a chainable method merely replaces the saved - // methods in `ctx.__methods` instead of completely replacing the - // overwritten assertion. Therefore, an overwriting assertion won't - // set the `ssfi` or `lockSsfi` flags. - if (!flag(this, 'lockSsfi')) { - flag(this, 'ssfi', chainableMethodWrapper); - } - - var result = chainableBehavior.method.apply(this, arguments); - if (result !== undefined) { - return result; - } - - var newAssertion = new chai.Assertion(); - transferFlags(this, newAssertion); - return newAssertion; - }; - - addLengthGuard(chainableMethodWrapper, name, true); - - // Use `Object.setPrototypeOf` if available - if (canSetPrototype) { - // Inherit all properties from the object by replacing the `Function` prototype - var prototype = Object.create(this); - // Restore the `call` and `apply` methods from `Function` - prototype.call = call; - prototype.apply = apply; - Object.setPrototypeOf(chainableMethodWrapper, prototype); - } - // Otherwise, redefine all properties (slow!) - else { - var asserterNames = Object.getOwnPropertyNames(ctx); - asserterNames.forEach(function (asserterName) { - if (excludeNames.indexOf(asserterName) !== -1) { - return; - } - - var pd = Object.getOwnPropertyDescriptor(ctx, asserterName); - Object.defineProperty(chainableMethodWrapper, asserterName, pd); - }); - } - - transferFlags(this, chainableMethodWrapper); - return proxify(chainableMethodWrapper); - } - , configurable: true - }); - }; - - /*! - * Chai - overwriteChainableMethod utility - * Copyright(c) 2012-2014 Jake Luer - * MIT Licensed - */ - - - - - /** - * ### .overwriteChainableMethod(ctx, name, method, chainingBehavior) - * - * Overwrites an already existing chainable method - * and provides access to the previous function or - * property. Must return functions to be used for - * name. - * - * utils.overwriteChainableMethod(chai.Assertion.prototype, 'lengthOf', - * function (_super) { - * } - * , function (_super) { - * } - * ); - * - * Can also be accessed directly from `chai.Assertion`. - * - * chai.Assertion.overwriteChainableMethod('foo', fn, fn); - * - * Then can be used as any other assertion. - * - * expect(myFoo).to.have.lengthOf(3); - * expect(myFoo).to.have.lengthOf.above(3); - * - * @param {Object} ctx object whose method / property is to be overwritten - * @param {String} name of method / property to overwrite - * @param {Function} method function that returns a function to be used for name - * @param {Function} chainingBehavior function that returns a function to be used for property - * @namespace Utils - * @name overwriteChainableMethod - * @api public - */ - - var overwriteChainableMethod = function overwriteChainableMethod(ctx, name, method, chainingBehavior) { - var chainableBehavior = ctx.__methods[name]; - - var _chainingBehavior = chainableBehavior.chainingBehavior; - chainableBehavior.chainingBehavior = function overwritingChainableMethodGetter() { - var result = chainingBehavior(_chainingBehavior).call(this); - if (result !== undefined) { - return result; - } - - var newAssertion = new chai.Assertion(); - transferFlags(this, newAssertion); - return newAssertion; - }; - - var _method = chainableBehavior.method; - chainableBehavior.method = function overwritingChainableMethodWrapper() { - var result = method(_method).apply(this, arguments); - if (result !== undefined) { - return result; - } - - var newAssertion = new chai.Assertion(); - transferFlags(this, newAssertion); - return newAssertion; - }; - }; - - /*! - * Chai - compareByInspect utility - * Copyright(c) 2011-2016 Jake Luer - * MIT Licensed - */ - - /*! - * Module dependencies - */ - - - - /** - * ### .compareByInspect(mixed, mixed) - * - * To be used as a compareFunction with Array.prototype.sort. Compares elements - * using inspect instead of default behavior of using toString so that Symbols - * and objects with irregular/missing toString can still be sorted without a - * TypeError. - * - * @param {Mixed} first element to compare - * @param {Mixed} second element to compare - * @returns {Number} -1 if 'a' should come before 'b'; otherwise 1 - * @name compareByInspect - * @namespace Utils - * @api public - */ - - var compareByInspect = function compareByInspect(a, b) { - return inspect_1(a) < inspect_1(b) ? -1 : 1; - }; - - /*! - * Chai - getOwnEnumerablePropertySymbols utility - * Copyright(c) 2011-2016 Jake Luer - * MIT Licensed - */ - - /** - * ### .getOwnEnumerablePropertySymbols(object) - * - * This allows the retrieval of directly-owned enumerable property symbols of an - * object. This function is necessary because Object.getOwnPropertySymbols - * returns both enumerable and non-enumerable property symbols. - * - * @param {Object} object - * @returns {Array} - * @namespace Utils - * @name getOwnEnumerablePropertySymbols - * @api public - */ - - var getOwnEnumerablePropertySymbols = function getOwnEnumerablePropertySymbols(obj) { - if (typeof Object.getOwnPropertySymbols !== 'function') return []; - - return Object.getOwnPropertySymbols(obj).filter(function (sym) { - return Object.getOwnPropertyDescriptor(obj, sym).enumerable; - }); - }; - - /*! - * Chai - getOwnEnumerableProperties utility - * Copyright(c) 2011-2016 Jake Luer - * MIT Licensed - */ - - /*! - * Module dependencies - */ - - - - /** - * ### .getOwnEnumerableProperties(object) - * - * This allows the retrieval of directly-owned enumerable property names and - * symbols of an object. This function is necessary because Object.keys only - * returns enumerable property names, not enumerable property symbols. - * - * @param {Object} object - * @returns {Array} - * @namespace Utils - * @name getOwnEnumerableProperties - * @api public - */ - - var getOwnEnumerableProperties = function getOwnEnumerableProperties(obj) { - return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj)); - }; - - /* ! - * Chai - checkError utility - * Copyright(c) 2012-2016 Jake Luer - * MIT Licensed - */ - - /** - * ### .checkError - * - * Checks that an error conforms to a given set of criteria and/or retrieves information about it. - * - * @api public - */ - - /** - * ### .compatibleInstance(thrown, errorLike) - * - * Checks if two instances are compatible (strict equal). - * Returns false if errorLike is not an instance of Error, because instances - * can only be compatible if they're both error instances. - * - * @name compatibleInstance - * @param {Error} thrown error - * @param {Error|ErrorConstructor} errorLike object to compare against - * @namespace Utils - * @api public - */ - - function compatibleInstance(thrown, errorLike) { - return errorLike instanceof Error && thrown === errorLike; - } - - /** - * ### .compatibleConstructor(thrown, errorLike) - * - * Checks if two constructors are compatible. - * This function can receive either an error constructor or - * an error instance as the `errorLike` argument. - * Constructors are compatible if they're the same or if one is - * an instance of another. - * - * @name compatibleConstructor - * @param {Error} thrown error - * @param {Error|ErrorConstructor} errorLike object to compare against - * @namespace Utils - * @api public - */ - - function compatibleConstructor(thrown, errorLike) { - if (errorLike instanceof Error) { - // If `errorLike` is an instance of any error we compare their constructors - return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor; - } else if (errorLike.prototype instanceof Error || errorLike === Error) { - // If `errorLike` is a constructor that inherits from Error, we compare `thrown` to `errorLike` directly - return thrown.constructor === errorLike || thrown instanceof errorLike; - } - - return false; - } - - /** - * ### .compatibleMessage(thrown, errMatcher) - * - * Checks if an error's message is compatible with a matcher (String or RegExp). - * If the message contains the String or passes the RegExp test, - * it is considered compatible. - * - * @name compatibleMessage - * @param {Error} thrown error - * @param {String|RegExp} errMatcher to look for into the message - * @namespace Utils - * @api public - */ - - function compatibleMessage(thrown, errMatcher) { - var comparisonString = typeof thrown === 'string' ? thrown : thrown.message; - if (errMatcher instanceof RegExp) { - return errMatcher.test(comparisonString); - } else if (typeof errMatcher === 'string') { - return comparisonString.indexOf(errMatcher) !== -1; // eslint-disable-line no-magic-numbers - } - - return false; - } - - /** - * ### .getFunctionName(constructorFn) - * - * Returns the name of a function. - * This also includes a polyfill function if `constructorFn.name` is not defined. - * - * @name getFunctionName - * @param {Function} constructorFn - * @namespace Utils - * @api private - */ - - var functionNameMatch$1 = /\s*function(?:\s|\s*\/\*[^(?:*\/)]+\*\/\s*)*([^\(\/]+)/; - function getFunctionName(constructorFn) { - var name = ''; - if (typeof constructorFn.name === 'undefined') { - // Here we run a polyfill if constructorFn.name is not defined - var match = String(constructorFn).match(functionNameMatch$1); - if (match) { - name = match[1]; - } - } else { - name = constructorFn.name; - } - - return name; - } - - /** - * ### .getConstructorName(errorLike) - * - * Gets the constructor name for an Error instance or constructor itself. - * - * @name getConstructorName - * @param {Error|ErrorConstructor} errorLike - * @namespace Utils - * @api public - */ - - function getConstructorName(errorLike) { - var constructorName = errorLike; - if (errorLike instanceof Error) { - constructorName = getFunctionName(errorLike.constructor); - } else if (typeof errorLike === 'function') { - // If `err` is not an instance of Error it is an error constructor itself or another function. - // If we've got a common function we get its name, otherwise we may need to create a new instance - // of the error just in case it's a poorly-constructed error. Please see chaijs/chai/issues/45 to know more. - constructorName = getFunctionName(errorLike).trim() || - getFunctionName(new errorLike()); // eslint-disable-line new-cap - } - - return constructorName; - } - - /** - * ### .getMessage(errorLike) - * - * Gets the error message from an error. - * If `err` is a String itself, we return it. - * If the error has no message, we return an empty string. - * - * @name getMessage - * @param {Error|String} errorLike - * @namespace Utils - * @api public - */ - - function getMessage$1(errorLike) { - var msg = ''; - if (errorLike && errorLike.message) { - msg = errorLike.message; - } else if (typeof errorLike === 'string') { - msg = errorLike; - } - - return msg; - } - - var checkError = { - compatibleInstance: compatibleInstance, - compatibleConstructor: compatibleConstructor, - compatibleMessage: compatibleMessage, - getMessage: getMessage$1, - getConstructorName: getConstructorName, - }; - - /*! - * Chai - isNaN utility - * Copyright(c) 2012-2015 Sakthipriyan Vairamani - * MIT Licensed - */ - - /** - * ### .isNaN(value) - * - * Checks if the given value is NaN or not. - * - * utils.isNaN(NaN); // true - * - * @param {Value} The value which has to be checked if it is NaN - * @name isNaN - * @api private - */ - - function isNaN$1(value) { - // Refer http://www.ecma-international.org/ecma-262/6.0/#sec-isnan-number - // section's NOTE. - return value !== value; - } - - // If ECMAScript 6's Number.isNaN is present, prefer that. - var _isNaN = Number.isNaN || isNaN$1; - - /*! - * chai - * Copyright(c) 2011 Jake Luer - * MIT Licensed - */ - - /*! - * Dependencies that are used for multiple exports are required here only once - */ - - - - /*! - * test utility - */ - - var test$1 = test; - - /*! - * type utility - */ - - var type = typeDetect; - - /*! - * expectTypes utility - */ - var expectTypes$1 = expectTypes; - - /*! - * message utility - */ - - var getMessage$2 = getMessage; - - /*! - * actual utility - */ - - var getActual$1 = getActual; - - /*! - * Inspect util - */ - - var inspect = inspect_1; - - /*! - * Object Display util - */ - - var objDisplay$1 = objDisplay; - - /*! - * Flag utility - */ - - var flag$1 = flag; - - /*! - * Flag transferring utility - */ - - var transferFlags$1 = transferFlags; - - /*! - * Deep equal utility - */ - - var eql = deepEql; - - /*! - * Deep path info - */ - - var getPathInfo$1 = pathval.getPathInfo; - - /*! - * Check if a property exists - */ - - var hasProperty$1 = pathval.hasProperty; - - /*! - * Function name - */ - - var getName = getFuncName_1; - - /*! - * add Property - */ - - var addProperty$1 = addProperty; - - /*! - * add Method - */ - - var addMethod$1 = addMethod; - - /*! - * overwrite Property - */ - - var overwriteProperty$1 = overwriteProperty; - - /*! - * overwrite Method - */ - - var overwriteMethod$1 = overwriteMethod; - - /*! - * Add a chainable method - */ - - var addChainableMethod$1 = addChainableMethod; - - /*! - * Overwrite chainable method - */ - - var overwriteChainableMethod$1 = overwriteChainableMethod; - - /*! - * Compare by inspect method - */ - - var compareByInspect$1 = compareByInspect; - - /*! - * Get own enumerable property symbols method - */ - - var getOwnEnumerablePropertySymbols$1 = getOwnEnumerablePropertySymbols; - - /*! - * Get own enumerable properties method - */ - - var getOwnEnumerableProperties$1 = getOwnEnumerableProperties; - - /*! - * Checks error against a given set of criteria - */ - - var checkError$1 = checkError; - - /*! - * Proxify util - */ - - var proxify$1 = proxify; - - /*! - * addLengthGuard util - */ - - var addLengthGuard$1 = addLengthGuard; - - /*! - * isProxyEnabled helper - */ - - var isProxyEnabled$1 = isProxyEnabled; - - /*! - * isNaN method - */ - - var isNaN$2 = _isNaN; - - var utils = { - test: test$1, - type: type, - expectTypes: expectTypes$1, - getMessage: getMessage$2, - getActual: getActual$1, - inspect: inspect, - objDisplay: objDisplay$1, - flag: flag$1, - transferFlags: transferFlags$1, - eql: eql, - getPathInfo: getPathInfo$1, - hasProperty: hasProperty$1, - getName: getName, - addProperty: addProperty$1, - addMethod: addMethod$1, - overwriteProperty: overwriteProperty$1, - overwriteMethod: overwriteMethod$1, - addChainableMethod: addChainableMethod$1, - overwriteChainableMethod: overwriteChainableMethod$1, - compareByInspect: compareByInspect$1, - getOwnEnumerablePropertySymbols: getOwnEnumerablePropertySymbols$1, - getOwnEnumerableProperties: getOwnEnumerableProperties$1, - checkError: checkError$1, - proxify: proxify$1, - addLengthGuard: addLengthGuard$1, - isProxyEnabled: isProxyEnabled$1, - isNaN: isNaN$2 - }; - - /*! - * chai - * http://chaijs.com - * Copyright(c) 2011-2014 Jake Luer - * MIT Licensed - */ - - - - var assertion = function (_chai, util) { - /*! - * Module dependencies. - */ - - var AssertionError = _chai.AssertionError - , flag = util.flag; - - /*! - * Module export. - */ - - _chai.Assertion = Assertion; - - /*! - * Assertion Constructor - * - * Creates object for chaining. - * - * `Assertion` objects contain metadata in the form of flags. Three flags can - * be assigned during instantiation by passing arguments to this constructor: - * - * - `object`: This flag contains the target of the assertion. For example, in - * the assertion `expect(numKittens).to.equal(7);`, the `object` flag will - * contain `numKittens` so that the `equal` assertion can reference it when - * needed. - * - * - `message`: This flag contains an optional custom error message to be - * prepended to the error message that's generated by the assertion when it - * fails. - * - * - `ssfi`: This flag stands for "start stack function indicator". It - * contains a function reference that serves as the starting point for - * removing frames from the stack trace of the error that's created by the - * assertion when it fails. The goal is to provide a cleaner stack trace to - * end users by removing Chai's internal functions. Note that it only works - * in environments that support `Error.captureStackTrace`, and only when - * `Chai.config.includeStack` hasn't been set to `false`. - * - * - `lockSsfi`: This flag controls whether or not the given `ssfi` flag - * should retain its current value, even as assertions are chained off of - * this object. This is usually set to `true` when creating a new assertion - * from within another assertion. It's also temporarily set to `true` before - * an overwritten assertion gets called by the overwriting assertion. - * - * @param {Mixed} obj target of the assertion - * @param {String} msg (optional) custom error message - * @param {Function} ssfi (optional) starting point for removing stack frames - * @param {Boolean} lockSsfi (optional) whether or not the ssfi flag is locked - * @api private - */ - - function Assertion (obj, msg, ssfi, lockSsfi) { - flag(this, 'ssfi', ssfi || Assertion); - flag(this, 'lockSsfi', lockSsfi); - flag(this, 'object', obj); - flag(this, 'message', msg); - - return util.proxify(this); - } - - Object.defineProperty(Assertion, 'includeStack', { - get: function() { - console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); - return config.includeStack; - }, - set: function(value) { - console.warn('Assertion.includeStack is deprecated, use chai.config.includeStack instead.'); - config.includeStack = value; - } - }); - - Object.defineProperty(Assertion, 'showDiff', { - get: function() { - console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); - return config.showDiff; - }, - set: function(value) { - console.warn('Assertion.showDiff is deprecated, use chai.config.showDiff instead.'); - config.showDiff = value; - } - }); - - Assertion.addProperty = function (name, fn) { - util.addProperty(this.prototype, name, fn); - }; - - Assertion.addMethod = function (name, fn) { - util.addMethod(this.prototype, name, fn); - }; - - Assertion.addChainableMethod = function (name, fn, chainingBehavior) { - util.addChainableMethod(this.prototype, name, fn, chainingBehavior); - }; - - Assertion.overwriteProperty = function (name, fn) { - util.overwriteProperty(this.prototype, name, fn); - }; - - Assertion.overwriteMethod = function (name, fn) { - util.overwriteMethod(this.prototype, name, fn); - }; - - Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) { - util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior); - }; - - /** - * ### .assert(expression, message, negateMessage, expected, actual, showDiff) - * - * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass. - * - * @name assert - * @param {Philosophical} expression to be tested - * @param {String|Function} message or function that returns message to display if expression fails - * @param {String|Function} negatedMessage or function that returns negatedMessage to display if negated expression fails - * @param {Mixed} expected value (remember to check for negation) - * @param {Mixed} actual (optional) will default to `this.obj` - * @param {Boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails - * @api private - */ - - Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) { - var ok = util.test(this, arguments); - if (false !== showDiff) showDiff = true; - if (undefined === expected && undefined === _actual) showDiff = false; - if (true !== config.showDiff) showDiff = false; - - if (!ok) { - msg = util.getMessage(this, arguments); - var actual = util.getActual(this, arguments); - throw new AssertionError(msg, { - actual: actual - , expected: expected - , showDiff: showDiff - }, (config.includeStack) ? this.assert : flag(this, 'ssfi')); - } - }; - - /*! - * ### ._obj - * - * Quick reference to stored `actual` value for plugin developers. - * - * @api private - */ - - Object.defineProperty(Assertion.prototype, '_obj', - { get: function () { - return flag(this, 'object'); - } - , set: function (val) { - flag(this, 'object', val); - } - }); - }; - - /*! - * chai - * http://chaijs.com - * Copyright(c) 2011-2014 Jake Luer - * MIT Licensed - */ - - var assertions = function (chai, _) { - var Assertion = chai.Assertion - , AssertionError = chai.AssertionError - , flag = _.flag; - - /** - * ### Language Chains - * - * The following are provided as chainable getters to improve the readability - * of your assertions. - * - * **Chains** - * - * - to - * - be - * - been - * - is - * - that - * - which - * - and - * - has - * - have - * - with - * - at - * - of - * - same - * - but - * - does - * - still - * - * @name language chains - * @namespace BDD - * @api public - */ - - [ 'to', 'be', 'been', 'is' - , 'and', 'has', 'have', 'with' - , 'that', 'which', 'at', 'of' - , 'same', 'but', 'does', 'still' ].forEach(function (chain) { - Assertion.addProperty(chain); - }); - - /** - * ### .not - * - * Negates all assertions that follow in the chain. - * - * expect(function () {}).to.not.throw(); - * expect({a: 1}).to.not.have.property('b'); - * expect([1, 2]).to.be.an('array').that.does.not.include(3); - * - * Just because you can negate any assertion with `.not` doesn't mean you - * should. With great power comes great responsibility. It's often best to - * assert that the one expected output was produced, rather than asserting - * that one of countless unexpected outputs wasn't produced. See individual - * assertions for specific guidance. - * - * expect(2).to.equal(2); // Recommended - * expect(2).to.not.equal(1); // Not recommended - * - * @name not - * @namespace BDD - * @api public - */ - - Assertion.addProperty('not', function () { - flag(this, 'negate', true); - }); - - /** - * ### .deep - * - * Causes all `.equal`, `.include`, `.members`, `.keys`, and `.property` - * assertions that follow in the chain to use deep equality instead of strict - * (`===`) equality. See the `deep-eql` project page for info on the deep - * equality algorithm: https://github.com/chaijs/deep-eql. - * - * // Target object deeply (but not strictly) equals `{a: 1}` - * expect({a: 1}).to.deep.equal({a: 1}); - * expect({a: 1}).to.not.equal({a: 1}); - * - * // Target array deeply (but not strictly) includes `{a: 1}` - * expect([{a: 1}]).to.deep.include({a: 1}); - * expect([{a: 1}]).to.not.include({a: 1}); - * - * // Target object deeply (but not strictly) includes `x: {a: 1}` - * expect({x: {a: 1}}).to.deep.include({x: {a: 1}}); - * expect({x: {a: 1}}).to.not.include({x: {a: 1}}); - * - * // Target array deeply (but not strictly) has member `{a: 1}` - * expect([{a: 1}]).to.have.deep.members([{a: 1}]); - * expect([{a: 1}]).to.not.have.members([{a: 1}]); - * - * // Target set deeply (but not strictly) has key `{a: 1}` - * expect(new Set([{a: 1}])).to.have.deep.keys([{a: 1}]); - * expect(new Set([{a: 1}])).to.not.have.keys([{a: 1}]); - * - * // Target object deeply (but not strictly) has property `x: {a: 1}` - * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1}); - * expect({x: {a: 1}}).to.not.have.property('x', {a: 1}); - * - * @name deep - * @namespace BDD - * @api public - */ - - Assertion.addProperty('deep', function () { - flag(this, 'deep', true); - }); - - /** - * ### .nested - * - * Enables dot- and bracket-notation in all `.property` and `.include` - * assertions that follow in the chain. - * - * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]'); - * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'}); - * - * If `.` or `[]` are part of an actual property name, they can be escaped by - * adding two backslashes before them. - * - * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\.a.\\[b\\]'); - * expect({'.a': {'[b]': 'x'}}).to.nested.include({'\\.a.\\[b\\]': 'x'}); - * - * `.nested` cannot be combined with `.own`. - * - * @name nested - * @namespace BDD - * @api public - */ - - Assertion.addProperty('nested', function () { - flag(this, 'nested', true); - }); - - /** - * ### .own - * - * Causes all `.property` and `.include` assertions that follow in the chain - * to ignore inherited properties. - * - * Object.prototype.b = 2; - * - * expect({a: 1}).to.have.own.property('a'); - * expect({a: 1}).to.have.property('b'); - * expect({a: 1}).to.not.have.own.property('b'); - * - * expect({a: 1}).to.own.include({a: 1}); - * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2}); - * - * `.own` cannot be combined with `.nested`. - * - * @name own - * @namespace BDD - * @api public - */ - - Assertion.addProperty('own', function () { - flag(this, 'own', true); - }); - - /** - * ### .ordered - * - * Causes all `.members` assertions that follow in the chain to require that - * members be in the same order. - * - * expect([1, 2]).to.have.ordered.members([1, 2]) - * .but.not.have.ordered.members([2, 1]); - * - * When `.include` and `.ordered` are combined, the ordering begins at the - * start of both arrays. - * - * expect([1, 2, 3]).to.include.ordered.members([1, 2]) - * .but.not.include.ordered.members([2, 3]); - * - * @name ordered - * @namespace BDD - * @api public - */ - - Assertion.addProperty('ordered', function () { - flag(this, 'ordered', true); - }); - - /** - * ### .any - * - * Causes all `.keys` assertions that follow in the chain to only require that - * the target have at least one of the given keys. This is the opposite of - * `.all`, which requires that the target have all of the given keys. - * - * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd'); - * - * See the `.keys` doc for guidance on when to use `.any` or `.all`. - * - * @name any - * @namespace BDD - * @api public - */ - - Assertion.addProperty('any', function () { - flag(this, 'any', true); - flag(this, 'all', false); - }); - - /** - * ### .all - * - * Causes all `.keys` assertions that follow in the chain to require that the - * target have all of the given keys. This is the opposite of `.any`, which - * only requires that the target have at least one of the given keys. - * - * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); - * - * Note that `.all` is used by default when neither `.all` nor `.any` are - * added earlier in the chain. However, it's often best to add `.all` anyway - * because it improves readability. - * - * See the `.keys` doc for guidance on when to use `.any` or `.all`. - * - * @name all - * @namespace BDD - * @api public - */ - - Assertion.addProperty('all', function () { - flag(this, 'all', true); - flag(this, 'any', false); - }); - - /** - * ### .a(type[, msg]) - * - * Asserts that the target's type is equal to the given string `type`. Types - * are case insensitive. See the `type-detect` project page for info on the - * type detection algorithm: https://github.com/chaijs/type-detect. - * - * expect('foo').to.be.a('string'); - * expect({a: 1}).to.be.an('object'); - * expect(null).to.be.a('null'); - * expect(undefined).to.be.an('undefined'); - * expect(new Error).to.be.an('error'); - * expect(Promise.resolve()).to.be.a('promise'); - * expect(new Float32Array).to.be.a('float32array'); - * expect(Symbol()).to.be.a('symbol'); - * - * `.a` supports objects that have a custom type set via `Symbol.toStringTag`. - * - * var myObj = { - * [Symbol.toStringTag]: 'myCustomType' - * }; - * - * expect(myObj).to.be.a('myCustomType').but.not.an('object'); - * - * It's often best to use `.a` to check a target's type before making more - * assertions on the same target. That way, you avoid unexpected behavior from - * any assertion that does different things based on the target's type. - * - * expect([1, 2, 3]).to.be.an('array').that.includes(2); - * expect([]).to.be.an('array').that.is.empty; - * - * Add `.not` earlier in the chain to negate `.a`. However, it's often best to - * assert that the target is the expected type, rather than asserting that it - * isn't one of many unexpected types. - * - * expect('foo').to.be.a('string'); // Recommended - * expect('foo').to.not.be.an('array'); // Not recommended - * - * `.a` accepts an optional `msg` argument which is a custom error message to - * show when the assertion fails. The message can also be given as the second - * argument to `expect`. - * - * expect(1).to.be.a('string', 'nooo why fail??'); - * expect(1, 'nooo why fail??').to.be.a('string'); - * - * `.a` can also be used as a language chain to improve the readability of - * your assertions. - * - * expect({b: 2}).to.have.a.property('b'); - * - * The alias `.an` can be used interchangeably with `.a`. - * - * @name a - * @alias an - * @param {String} type - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function an (type, msg) { - if (msg) flag(this, 'message', msg); - type = type.toLowerCase(); - var obj = flag(this, 'object') - , article = ~[ 'a', 'e', 'i', 'o', 'u' ].indexOf(type.charAt(0)) ? 'an ' : 'a '; - - this.assert( - type === _.type(obj).toLowerCase() - , 'expected #{this} to be ' + article + type - , 'expected #{this} not to be ' + article + type - ); - } - - Assertion.addChainableMethod('an', an); - Assertion.addChainableMethod('a', an); - - /** - * ### .include(val[, msg]) - * - * When the target is a string, `.include` asserts that the given string `val` - * is a substring of the target. - * - * expect('foobar').to.include('foo'); - * - * When the target is an array, `.include` asserts that the given `val` is a - * member of the target. - * - * expect([1, 2, 3]).to.include(2); - * - * When the target is an object, `.include` asserts that the given object - * `val`'s properties are a subset of the target's properties. - * - * expect({a: 1, b: 2, c: 3}).to.include({a: 1, b: 2}); - * - * When the target is a Set or WeakSet, `.include` asserts that the given `val` is a - * member of the target. SameValueZero equality algorithm is used. - * - * expect(new Set([1, 2])).to.include(2); - * - * When the target is a Map, `.include` asserts that the given `val` is one of - * the values of the target. SameValueZero equality algorithm is used. - * - * expect(new Map([['a', 1], ['b', 2]])).to.include(2); - * - * Because `.include` does different things based on the target's type, it's - * important to check the target's type before using `.include`. See the `.a` - * doc for info on testing a target's type. - * - * expect([1, 2, 3]).to.be.an('array').that.includes(2); - * - * By default, strict (`===`) equality is used to compare array members and - * object properties. Add `.deep` earlier in the chain to use deep equality - * instead (WeakSet targets are not supported). See the `deep-eql` project - * page for info on the deep equality algorithm: https://github.com/chaijs/deep-eql. - * - * // Target array deeply (but not strictly) includes `{a: 1}` - * expect([{a: 1}]).to.deep.include({a: 1}); - * expect([{a: 1}]).to.not.include({a: 1}); - * - * // Target object deeply (but not strictly) includes `x: {a: 1}` - * expect({x: {a: 1}}).to.deep.include({x: {a: 1}}); - * expect({x: {a: 1}}).to.not.include({x: {a: 1}}); - * - * By default, all of the target's properties are searched when working with - * objects. This includes properties that are inherited and/or non-enumerable. - * Add `.own` earlier in the chain to exclude the target's inherited - * properties from the search. - * - * Object.prototype.b = 2; - * - * expect({a: 1}).to.own.include({a: 1}); - * expect({a: 1}).to.include({b: 2}).but.not.own.include({b: 2}); - * - * Note that a target object is always only searched for `val`'s own - * enumerable properties. - * - * `.deep` and `.own` can be combined. - * - * expect({a: {b: 2}}).to.deep.own.include({a: {b: 2}}); - * - * Add `.nested` earlier in the chain to enable dot- and bracket-notation when - * referencing nested properties. - * - * expect({a: {b: ['x', 'y']}}).to.nested.include({'a.b[1]': 'y'}); - * - * If `.` or `[]` are part of an actual property name, they can be escaped by - * adding two backslashes before them. - * - * expect({'.a': {'[b]': 2}}).to.nested.include({'\\.a.\\[b\\]': 2}); - * - * `.deep` and `.nested` can be combined. - * - * expect({a: {b: [{c: 3}]}}).to.deep.nested.include({'a.b[0]': {c: 3}}); - * - * `.own` and `.nested` cannot be combined. - * - * Add `.not` earlier in the chain to negate `.include`. - * - * expect('foobar').to.not.include('taco'); - * expect([1, 2, 3]).to.not.include(4); - * - * However, it's dangerous to negate `.include` when the target is an object. - * The problem is that it creates uncertain expectations by asserting that the - * target object doesn't have all of `val`'s key/value pairs but may or may - * not have some of them. It's often best to identify the exact output that's - * expected, and then write an assertion that only accepts that exact output. - * - * When the target object isn't even expected to have `val`'s keys, it's - * often best to assert exactly that. - * - * expect({c: 3}).to.not.have.any.keys('a', 'b'); // Recommended - * expect({c: 3}).to.not.include({a: 1, b: 2}); // Not recommended - * - * When the target object is expected to have `val`'s keys, it's often best to - * assert that each of the properties has its expected value, rather than - * asserting that each property doesn't have one of many unexpected values. - * - * expect({a: 3, b: 4}).to.include({a: 3, b: 4}); // Recommended - * expect({a: 3, b: 4}).to.not.include({a: 1, b: 2}); // Not recommended - * - * `.include` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. - * - * expect([1, 2, 3]).to.include(4, 'nooo why fail??'); - * expect([1, 2, 3], 'nooo why fail??').to.include(4); - * - * `.include` can also be used as a language chain, causing all `.members` and - * `.keys` assertions that follow in the chain to require the target to be a - * superset of the expected set, rather than an identical set. Note that - * `.members` ignores duplicates in the subset when `.include` is added. - * - * // Target object's keys are a superset of ['a', 'b'] but not identical - * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b'); - * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b'); - * - * // Target array is a superset of [1, 2] but not identical - * expect([1, 2, 3]).to.include.members([1, 2]); - * expect([1, 2, 3]).to.not.have.members([1, 2]); - * - * // Duplicates in the subset are ignored - * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]); - * - * Note that adding `.any` earlier in the chain causes the `.keys` assertion - * to ignore `.include`. - * - * // Both assertions are identical - * expect({a: 1}).to.include.any.keys('a', 'b'); - * expect({a: 1}).to.have.any.keys('a', 'b'); - * - * The aliases `.includes`, `.contain`, and `.contains` can be used - * interchangeably with `.include`. - * - * @name include - * @alias contain - * @alias includes - * @alias contains - * @param {Mixed} val - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function SameValueZero(a, b) { - return (_.isNaN(a) && _.isNaN(b)) || a === b; - } - - function includeChainingBehavior () { - flag(this, 'contains', true); - } - - function include (val, msg) { - if (msg) flag(this, 'message', msg); - - var obj = flag(this, 'object') - , objType = _.type(obj).toLowerCase() - , flagMsg = flag(this, 'message') - , negate = flag(this, 'negate') - , ssfi = flag(this, 'ssfi') - , isDeep = flag(this, 'deep') - , descriptor = isDeep ? 'deep ' : ''; - - flagMsg = flagMsg ? flagMsg + ': ' : ''; - - var included = false; - - switch (objType) { - case 'string': - included = obj.indexOf(val) !== -1; - break; - - case 'weakset': - if (isDeep) { - throw new AssertionError( - flagMsg + 'unable to use .deep.include with WeakSet', - undefined, - ssfi - ); - } - - included = obj.has(val); - break; - - case 'map': - var isEql = isDeep ? _.eql : SameValueZero; - obj.forEach(function (item) { - included = included || isEql(item, val); - }); - break; - - case 'set': - if (isDeep) { - obj.forEach(function (item) { - included = included || _.eql(item, val); - }); - } else { - included = obj.has(val); - } - break; - - case 'array': - if (isDeep) { - included = obj.some(function (item) { - return _.eql(item, val); - }); - } else { - included = obj.indexOf(val) !== -1; - } - break; - - default: - // This block is for asserting a subset of properties in an object. - // `_.expectTypes` isn't used here because `.include` should work with - // objects with a custom `@@toStringTag`. - if (val !== Object(val)) { - throw new AssertionError( - flagMsg + 'object tested must be an array, a map, an object,' - + ' a set, a string, or a weakset, but ' + objType + ' given', - undefined, - ssfi - ); - } - - var props = Object.keys(val) - , firstErr = null - , numErrs = 0; - - props.forEach(function (prop) { - var propAssertion = new Assertion(obj); - _.transferFlags(this, propAssertion, true); - flag(propAssertion, 'lockSsfi', true); - - if (!negate || props.length === 1) { - propAssertion.property(prop, val[prop]); - return; - } - - try { - propAssertion.property(prop, val[prop]); - } catch (err) { - if (!_.checkError.compatibleConstructor(err, AssertionError)) { - throw err; - } - if (firstErr === null) firstErr = err; - numErrs++; - } - }, this); - - // When validating .not.include with multiple properties, we only want - // to throw an assertion error if all of the properties are included, - // in which case we throw the first property assertion error that we - // encountered. - if (negate && props.length > 1 && numErrs === props.length) { - throw firstErr; - } - return; - } - - // Assert inclusion in collection or substring in a string. - this.assert( - included - , 'expected #{this} to ' + descriptor + 'include ' + _.inspect(val) - , 'expected #{this} to not ' + descriptor + 'include ' + _.inspect(val)); - } - - Assertion.addChainableMethod('include', include, includeChainingBehavior); - Assertion.addChainableMethod('contain', include, includeChainingBehavior); - Assertion.addChainableMethod('contains', include, includeChainingBehavior); - Assertion.addChainableMethod('includes', include, includeChainingBehavior); - - /** - * ### .ok - * - * Asserts that the target is a truthy value (considered `true` in boolean context). - * However, it's often best to assert that the target is strictly (`===`) or - * deeply equal to its expected value. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.be.ok; // Not recommended - * - * expect(true).to.be.true; // Recommended - * expect(true).to.be.ok; // Not recommended - * - * Add `.not` earlier in the chain to negate `.ok`. - * - * expect(0).to.equal(0); // Recommended - * expect(0).to.not.be.ok; // Not recommended - * - * expect(false).to.be.false; // Recommended - * expect(false).to.not.be.ok; // Not recommended - * - * expect(null).to.be.null; // Recommended - * expect(null).to.not.be.ok; // Not recommended - * - * expect(undefined).to.be.undefined; // Recommended - * expect(undefined).to.not.be.ok; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect(false, 'nooo why fail??').to.be.ok; - * - * @name ok - * @namespace BDD - * @api public - */ - - Assertion.addProperty('ok', function () { - this.assert( - flag(this, 'object') - , 'expected #{this} to be truthy' - , 'expected #{this} to be falsy'); - }); - - /** - * ### .true - * - * Asserts that the target is strictly (`===`) equal to `true`. - * - * expect(true).to.be.true; - * - * Add `.not` earlier in the chain to negate `.true`. However, it's often best - * to assert that the target is equal to its expected value, rather than not - * equal to `true`. - * - * expect(false).to.be.false; // Recommended - * expect(false).to.not.be.true; // Not recommended - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.not.be.true; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect(false, 'nooo why fail??').to.be.true; - * - * @name true - * @namespace BDD - * @api public - */ - - Assertion.addProperty('true', function () { - this.assert( - true === flag(this, 'object') - , 'expected #{this} to be true' - , 'expected #{this} to be false' - , flag(this, 'negate') ? false : true - ); - }); - - /** - * ### .false - * - * Asserts that the target is strictly (`===`) equal to `false`. - * - * expect(false).to.be.false; - * - * Add `.not` earlier in the chain to negate `.false`. However, it's often - * best to assert that the target is equal to its expected value, rather than - * not equal to `false`. - * - * expect(true).to.be.true; // Recommended - * expect(true).to.not.be.false; // Not recommended - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.not.be.false; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect(true, 'nooo why fail??').to.be.false; - * - * @name false - * @namespace BDD - * @api public - */ - - Assertion.addProperty('false', function () { - this.assert( - false === flag(this, 'object') - , 'expected #{this} to be false' - , 'expected #{this} to be true' - , flag(this, 'negate') ? true : false - ); - }); - - /** - * ### .null - * - * Asserts that the target is strictly (`===`) equal to `null`. - * - * expect(null).to.be.null; - * - * Add `.not` earlier in the chain to negate `.null`. However, it's often best - * to assert that the target is equal to its expected value, rather than not - * equal to `null`. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.not.be.null; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect(42, 'nooo why fail??').to.be.null; - * - * @name null - * @namespace BDD - * @api public - */ - - Assertion.addProperty('null', function () { - this.assert( - null === flag(this, 'object') - , 'expected #{this} to be null' - , 'expected #{this} not to be null' - ); - }); - - /** - * ### .undefined - * - * Asserts that the target is strictly (`===`) equal to `undefined`. - * - * expect(undefined).to.be.undefined; - * - * Add `.not` earlier in the chain to negate `.undefined`. However, it's often - * best to assert that the target is equal to its expected value, rather than - * not equal to `undefined`. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.not.be.undefined; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect(42, 'nooo why fail??').to.be.undefined; - * - * @name undefined - * @namespace BDD - * @api public - */ - - Assertion.addProperty('undefined', function () { - this.assert( - undefined === flag(this, 'object') - , 'expected #{this} to be undefined' - , 'expected #{this} not to be undefined' - ); - }); - - /** - * ### .NaN - * - * Asserts that the target is exactly `NaN`. - * - * expect(NaN).to.be.NaN; - * - * Add `.not` earlier in the chain to negate `.NaN`. However, it's often best - * to assert that the target is equal to its expected value, rather than not - * equal to `NaN`. - * - * expect('foo').to.equal('foo'); // Recommended - * expect('foo').to.not.be.NaN; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect(42, 'nooo why fail??').to.be.NaN; - * - * @name NaN - * @namespace BDD - * @api public - */ - - Assertion.addProperty('NaN', function () { - this.assert( - _.isNaN(flag(this, 'object')) - , 'expected #{this} to be NaN' - , 'expected #{this} not to be NaN' - ); - }); - - /** - * ### .exist - * - * Asserts that the target is not strictly (`===`) equal to either `null` or - * `undefined`. However, it's often best to assert that the target is equal to - * its expected value. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.exist; // Not recommended - * - * expect(0).to.equal(0); // Recommended - * expect(0).to.exist; // Not recommended - * - * Add `.not` earlier in the chain to negate `.exist`. - * - * expect(null).to.be.null; // Recommended - * expect(null).to.not.exist; // Not recommended - * - * expect(undefined).to.be.undefined; // Recommended - * expect(undefined).to.not.exist; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect(null, 'nooo why fail??').to.exist; - * - * @name exist - * @namespace BDD - * @api public - */ - - Assertion.addProperty('exist', function () { - var val = flag(this, 'object'); - this.assert( - val !== null && val !== undefined - , 'expected #{this} to exist' - , 'expected #{this} to not exist' - ); - }); - - /** - * ### .empty - * - * When the target is a string or array, `.empty` asserts that the target's - * `length` property is strictly (`===`) equal to `0`. - * - * expect([]).to.be.empty; - * expect('').to.be.empty; - * - * When the target is a map or set, `.empty` asserts that the target's `size` - * property is strictly equal to `0`. - * - * expect(new Set()).to.be.empty; - * expect(new Map()).to.be.empty; - * - * When the target is a non-function object, `.empty` asserts that the target - * doesn't have any own enumerable properties. Properties with Symbol-based - * keys are excluded from the count. - * - * expect({}).to.be.empty; - * - * Because `.empty` does different things based on the target's type, it's - * important to check the target's type before using `.empty`. See the `.a` - * doc for info on testing a target's type. - * - * expect([]).to.be.an('array').that.is.empty; - * - * Add `.not` earlier in the chain to negate `.empty`. However, it's often - * best to assert that the target contains its expected number of values, - * rather than asserting that it's not empty. - * - * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended - * expect([1, 2, 3]).to.not.be.empty; // Not recommended - * - * expect(new Set([1, 2, 3])).to.have.property('size', 3); // Recommended - * expect(new Set([1, 2, 3])).to.not.be.empty; // Not recommended - * - * expect(Object.keys({a: 1})).to.have.lengthOf(1); // Recommended - * expect({a: 1}).to.not.be.empty; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect([1, 2, 3], 'nooo why fail??').to.be.empty; - * - * @name empty - * @namespace BDD - * @api public - */ - - Assertion.addProperty('empty', function () { - var val = flag(this, 'object') - , ssfi = flag(this, 'ssfi') - , flagMsg = flag(this, 'message') - , itemsCount; - - flagMsg = flagMsg ? flagMsg + ': ' : ''; - - switch (_.type(val).toLowerCase()) { - case 'array': - case 'string': - itemsCount = val.length; - break; - case 'map': - case 'set': - itemsCount = val.size; - break; - case 'weakmap': - case 'weakset': - throw new AssertionError( - flagMsg + '.empty was passed a weak collection', - undefined, - ssfi - ); - case 'function': - var msg = flagMsg + '.empty was passed a function ' + _.getName(val); - throw new AssertionError(msg.trim(), undefined, ssfi); - default: - if (val !== Object(val)) { - throw new AssertionError( - flagMsg + '.empty was passed non-string primitive ' + _.inspect(val), - undefined, - ssfi - ); - } - itemsCount = Object.keys(val).length; - } - - this.assert( - 0 === itemsCount - , 'expected #{this} to be empty' - , 'expected #{this} not to be empty' - ); - }); - - /** - * ### .arguments - * - * Asserts that the target is an `arguments` object. - * - * function test () { - * expect(arguments).to.be.arguments; - * } - * - * test(); - * - * Add `.not` earlier in the chain to negate `.arguments`. However, it's often - * best to assert which type the target is expected to be, rather than - * asserting that its not an `arguments` object. - * - * expect('foo').to.be.a('string'); // Recommended - * expect('foo').to.not.be.arguments; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect({}, 'nooo why fail??').to.be.arguments; - * - * The alias `.Arguments` can be used interchangeably with `.arguments`. - * - * @name arguments - * @alias Arguments - * @namespace BDD - * @api public - */ - - function checkArguments () { - var obj = flag(this, 'object') - , type = _.type(obj); - this.assert( - 'Arguments' === type - , 'expected #{this} to be arguments but got ' + type - , 'expected #{this} to not be arguments' - ); - } - - Assertion.addProperty('arguments', checkArguments); - Assertion.addProperty('Arguments', checkArguments); - - /** - * ### .equal(val[, msg]) - * - * Asserts that the target is strictly (`===`) equal to the given `val`. - * - * expect(1).to.equal(1); - * expect('foo').to.equal('foo'); - * - * Add `.deep` earlier in the chain to use deep equality instead. See the - * `deep-eql` project page for info on the deep equality algorithm: - * https://github.com/chaijs/deep-eql. - * - * // Target object deeply (but not strictly) equals `{a: 1}` - * expect({a: 1}).to.deep.equal({a: 1}); - * expect({a: 1}).to.not.equal({a: 1}); - * - * // Target array deeply (but not strictly) equals `[1, 2]` - * expect([1, 2]).to.deep.equal([1, 2]); - * expect([1, 2]).to.not.equal([1, 2]); - * - * Add `.not` earlier in the chain to negate `.equal`. However, it's often - * best to assert that the target is equal to its expected value, rather than - * not equal to one of countless unexpected values. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.not.equal(2); // Not recommended - * - * `.equal` accepts an optional `msg` argument which is a custom error message - * to show when the assertion fails. The message can also be given as the - * second argument to `expect`. - * - * expect(1).to.equal(2, 'nooo why fail??'); - * expect(1, 'nooo why fail??').to.equal(2); - * - * The aliases `.equals` and `eq` can be used interchangeably with `.equal`. - * - * @name equal - * @alias equals - * @alias eq - * @param {Mixed} val - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertEqual (val, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object'); - if (flag(this, 'deep')) { - var prevLockSsfi = flag(this, 'lockSsfi'); - flag(this, 'lockSsfi', true); - this.eql(val); - flag(this, 'lockSsfi', prevLockSsfi); - } else { - this.assert( - val === obj - , 'expected #{this} to equal #{exp}' - , 'expected #{this} to not equal #{exp}' - , val - , this._obj - , true - ); - } - } - - Assertion.addMethod('equal', assertEqual); - Assertion.addMethod('equals', assertEqual); - Assertion.addMethod('eq', assertEqual); - - /** - * ### .eql(obj[, msg]) - * - * Asserts that the target is deeply equal to the given `obj`. See the - * `deep-eql` project page for info on the deep equality algorithm: - * https://github.com/chaijs/deep-eql. - * - * // Target object is deeply (but not strictly) equal to {a: 1} - * expect({a: 1}).to.eql({a: 1}).but.not.equal({a: 1}); - * - * // Target array is deeply (but not strictly) equal to [1, 2] - * expect([1, 2]).to.eql([1, 2]).but.not.equal([1, 2]); - * - * Add `.not` earlier in the chain to negate `.eql`. However, it's often best - * to assert that the target is deeply equal to its expected value, rather - * than not deeply equal to one of countless unexpected values. - * - * expect({a: 1}).to.eql({a: 1}); // Recommended - * expect({a: 1}).to.not.eql({b: 2}); // Not recommended - * - * `.eql` accepts an optional `msg` argument which is a custom error message - * to show when the assertion fails. The message can also be given as the - * second argument to `expect`. - * - * expect({a: 1}).to.eql({b: 2}, 'nooo why fail??'); - * expect({a: 1}, 'nooo why fail??').to.eql({b: 2}); - * - * The alias `.eqls` can be used interchangeably with `.eql`. - * - * The `.deep.equal` assertion is almost identical to `.eql` but with one - * difference: `.deep.equal` causes deep equality comparisons to also be used - * for any other assertions that follow in the chain. - * - * @name eql - * @alias eqls - * @param {Mixed} obj - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertEql(obj, msg) { - if (msg) flag(this, 'message', msg); - this.assert( - _.eql(obj, flag(this, 'object')) - , 'expected #{this} to deeply equal #{exp}' - , 'expected #{this} to not deeply equal #{exp}' - , obj - , this._obj - , true - ); - } - - Assertion.addMethod('eql', assertEql); - Assertion.addMethod('eqls', assertEql); - - /** - * ### .above(n[, msg]) - * - * Asserts that the target is a number or a date greater than the given number or date `n` respectively. - * However, it's often best to assert that the target is equal to its expected - * value. - * - * expect(2).to.equal(2); // Recommended - * expect(2).to.be.above(1); // Not recommended - * - * Add `.lengthOf` earlier in the chain to assert that the target's `length` - * or `size` is greater than the given number `n`. - * - * expect('foo').to.have.lengthOf(3); // Recommended - * expect('foo').to.have.lengthOf.above(2); // Not recommended - * - * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended - * expect([1, 2, 3]).to.have.lengthOf.above(2); // Not recommended - * - * Add `.not` earlier in the chain to negate `.above`. - * - * expect(2).to.equal(2); // Recommended - * expect(1).to.not.be.above(2); // Not recommended - * - * `.above` accepts an optional `msg` argument which is a custom error message - * to show when the assertion fails. The message can also be given as the - * second argument to `expect`. - * - * expect(1).to.be.above(2, 'nooo why fail??'); - * expect(1, 'nooo why fail??').to.be.above(2); - * - * The aliases `.gt` and `.greaterThan` can be used interchangeably with - * `.above`. - * - * @name above - * @alias gt - * @alias greaterThan - * @param {Number} n - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertAbove (n, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , doLength = flag(this, 'doLength') - , flagMsg = flag(this, 'message') - , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') - , ssfi = flag(this, 'ssfi') - , objType = _.type(obj).toLowerCase() - , nType = _.type(n).toLowerCase() - , errorMessage - , shouldThrow = true; - - if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); - } - - if (!doLength && (objType === 'date' && nType !== 'date')) { - errorMessage = msgPrefix + 'the argument to above must be a date'; - } else if (nType !== 'number' && (doLength || objType === 'number')) { - errorMessage = msgPrefix + 'the argument to above must be a number'; - } else if (!doLength && (objType !== 'date' && objType !== 'number')) { - var printObj = (objType === 'string') ? "'" + obj + "'" : obj; - errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; - } else { - shouldThrow = false; - } - - if (shouldThrow) { - throw new AssertionError(errorMessage, undefined, ssfi); - } - - if (doLength) { - var descriptor = 'length' - , itemsCount; - if (objType === 'map' || objType === 'set') { - descriptor = 'size'; - itemsCount = obj.size; - } else { - itemsCount = obj.length; - } - this.assert( - itemsCount > n - , 'expected #{this} to have a ' + descriptor + ' above #{exp} but got #{act}' - , 'expected #{this} to not have a ' + descriptor + ' above #{exp}' - , n - , itemsCount - ); - } else { - this.assert( - obj > n - , 'expected #{this} to be above #{exp}' - , 'expected #{this} to be at most #{exp}' - , n - ); - } - } - - Assertion.addMethod('above', assertAbove); - Assertion.addMethod('gt', assertAbove); - Assertion.addMethod('greaterThan', assertAbove); - - /** - * ### .least(n[, msg]) - * - * Asserts that the target is a number or a date greater than or equal to the given - * number or date `n` respectively. However, it's often best to assert that the target is equal to - * its expected value. - * - * expect(2).to.equal(2); // Recommended - * expect(2).to.be.at.least(1); // Not recommended - * expect(2).to.be.at.least(2); // Not recommended - * - * Add `.lengthOf` earlier in the chain to assert that the target's `length` - * or `size` is greater than or equal to the given number `n`. - * - * expect('foo').to.have.lengthOf(3); // Recommended - * expect('foo').to.have.lengthOf.at.least(2); // Not recommended - * - * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended - * expect([1, 2, 3]).to.have.lengthOf.at.least(2); // Not recommended - * - * Add `.not` earlier in the chain to negate `.least`. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.not.be.at.least(2); // Not recommended - * - * `.least` accepts an optional `msg` argument which is a custom error message - * to show when the assertion fails. The message can also be given as the - * second argument to `expect`. - * - * expect(1).to.be.at.least(2, 'nooo why fail??'); - * expect(1, 'nooo why fail??').to.be.at.least(2); - * - * The alias `.gte` can be used interchangeably with `.least`. - * - * @name least - * @alias gte - * @param {Number} n - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertLeast (n, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , doLength = flag(this, 'doLength') - , flagMsg = flag(this, 'message') - , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') - , ssfi = flag(this, 'ssfi') - , objType = _.type(obj).toLowerCase() - , nType = _.type(n).toLowerCase() - , errorMessage - , shouldThrow = true; - - if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); - } - - if (!doLength && (objType === 'date' && nType !== 'date')) { - errorMessage = msgPrefix + 'the argument to least must be a date'; - } else if (nType !== 'number' && (doLength || objType === 'number')) { - errorMessage = msgPrefix + 'the argument to least must be a number'; - } else if (!doLength && (objType !== 'date' && objType !== 'number')) { - var printObj = (objType === 'string') ? "'" + obj + "'" : obj; - errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; - } else { - shouldThrow = false; - } - - if (shouldThrow) { - throw new AssertionError(errorMessage, undefined, ssfi); - } - - if (doLength) { - var descriptor = 'length' - , itemsCount; - if (objType === 'map' || objType === 'set') { - descriptor = 'size'; - itemsCount = obj.size; - } else { - itemsCount = obj.length; - } - this.assert( - itemsCount >= n - , 'expected #{this} to have a ' + descriptor + ' at least #{exp} but got #{act}' - , 'expected #{this} to have a ' + descriptor + ' below #{exp}' - , n - , itemsCount - ); - } else { - this.assert( - obj >= n - , 'expected #{this} to be at least #{exp}' - , 'expected #{this} to be below #{exp}' - , n - ); - } - } - - Assertion.addMethod('least', assertLeast); - Assertion.addMethod('gte', assertLeast); - - /** - * ### .below(n[, msg]) - * - * Asserts that the target is a number or a date less than the given number or date `n` respectively. - * However, it's often best to assert that the target is equal to its expected - * value. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.be.below(2); // Not recommended - * - * Add `.lengthOf` earlier in the chain to assert that the target's `length` - * or `size` is less than the given number `n`. - * - * expect('foo').to.have.lengthOf(3); // Recommended - * expect('foo').to.have.lengthOf.below(4); // Not recommended - * - * expect([1, 2, 3]).to.have.length(3); // Recommended - * expect([1, 2, 3]).to.have.lengthOf.below(4); // Not recommended - * - * Add `.not` earlier in the chain to negate `.below`. - * - * expect(2).to.equal(2); // Recommended - * expect(2).to.not.be.below(1); // Not recommended - * - * `.below` accepts an optional `msg` argument which is a custom error message - * to show when the assertion fails. The message can also be given as the - * second argument to `expect`. - * - * expect(2).to.be.below(1, 'nooo why fail??'); - * expect(2, 'nooo why fail??').to.be.below(1); - * - * The aliases `.lt` and `.lessThan` can be used interchangeably with - * `.below`. - * - * @name below - * @alias lt - * @alias lessThan - * @param {Number} n - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertBelow (n, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , doLength = flag(this, 'doLength') - , flagMsg = flag(this, 'message') - , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') - , ssfi = flag(this, 'ssfi') - , objType = _.type(obj).toLowerCase() - , nType = _.type(n).toLowerCase() - , errorMessage - , shouldThrow = true; - - if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); - } - - if (!doLength && (objType === 'date' && nType !== 'date')) { - errorMessage = msgPrefix + 'the argument to below must be a date'; - } else if (nType !== 'number' && (doLength || objType === 'number')) { - errorMessage = msgPrefix + 'the argument to below must be a number'; - } else if (!doLength && (objType !== 'date' && objType !== 'number')) { - var printObj = (objType === 'string') ? "'" + obj + "'" : obj; - errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; - } else { - shouldThrow = false; - } - - if (shouldThrow) { - throw new AssertionError(errorMessage, undefined, ssfi); - } - - if (doLength) { - var descriptor = 'length' - , itemsCount; - if (objType === 'map' || objType === 'set') { - descriptor = 'size'; - itemsCount = obj.size; - } else { - itemsCount = obj.length; - } - this.assert( - itemsCount < n - , 'expected #{this} to have a ' + descriptor + ' below #{exp} but got #{act}' - , 'expected #{this} to not have a ' + descriptor + ' below #{exp}' - , n - , itemsCount - ); - } else { - this.assert( - obj < n - , 'expected #{this} to be below #{exp}' - , 'expected #{this} to be at least #{exp}' - , n - ); - } - } - - Assertion.addMethod('below', assertBelow); - Assertion.addMethod('lt', assertBelow); - Assertion.addMethod('lessThan', assertBelow); - - /** - * ### .most(n[, msg]) - * - * Asserts that the target is a number or a date less than or equal to the given number - * or date `n` respectively. However, it's often best to assert that the target is equal to its - * expected value. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.be.at.most(2); // Not recommended - * expect(1).to.be.at.most(1); // Not recommended - * - * Add `.lengthOf` earlier in the chain to assert that the target's `length` - * or `size` is less than or equal to the given number `n`. - * - * expect('foo').to.have.lengthOf(3); // Recommended - * expect('foo').to.have.lengthOf.at.most(4); // Not recommended - * - * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended - * expect([1, 2, 3]).to.have.lengthOf.at.most(4); // Not recommended - * - * Add `.not` earlier in the chain to negate `.most`. - * - * expect(2).to.equal(2); // Recommended - * expect(2).to.not.be.at.most(1); // Not recommended - * - * `.most` accepts an optional `msg` argument which is a custom error message - * to show when the assertion fails. The message can also be given as the - * second argument to `expect`. - * - * expect(2).to.be.at.most(1, 'nooo why fail??'); - * expect(2, 'nooo why fail??').to.be.at.most(1); - * - * The alias `.lte` can be used interchangeably with `.most`. - * - * @name most - * @alias lte - * @param {Number} n - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertMost (n, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , doLength = flag(this, 'doLength') - , flagMsg = flag(this, 'message') - , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') - , ssfi = flag(this, 'ssfi') - , objType = _.type(obj).toLowerCase() - , nType = _.type(n).toLowerCase() - , errorMessage - , shouldThrow = true; - - if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); - } - - if (!doLength && (objType === 'date' && nType !== 'date')) { - errorMessage = msgPrefix + 'the argument to most must be a date'; - } else if (nType !== 'number' && (doLength || objType === 'number')) { - errorMessage = msgPrefix + 'the argument to most must be a number'; - } else if (!doLength && (objType !== 'date' && objType !== 'number')) { - var printObj = (objType === 'string') ? "'" + obj + "'" : obj; - errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; - } else { - shouldThrow = false; - } - - if (shouldThrow) { - throw new AssertionError(errorMessage, undefined, ssfi); - } - - if (doLength) { - var descriptor = 'length' - , itemsCount; - if (objType === 'map' || objType === 'set') { - descriptor = 'size'; - itemsCount = obj.size; - } else { - itemsCount = obj.length; - } - this.assert( - itemsCount <= n - , 'expected #{this} to have a ' + descriptor + ' at most #{exp} but got #{act}' - , 'expected #{this} to have a ' + descriptor + ' above #{exp}' - , n - , itemsCount - ); - } else { - this.assert( - obj <= n - , 'expected #{this} to be at most #{exp}' - , 'expected #{this} to be above #{exp}' - , n - ); - } - } - - Assertion.addMethod('most', assertMost); - Assertion.addMethod('lte', assertMost); - - /** - * ### .within(start, finish[, msg]) - * - * Asserts that the target is a number or a date greater than or equal to the given - * number or date `start`, and less than or equal to the given number or date `finish` respectively. - * However, it's often best to assert that the target is equal to its expected - * value. - * - * expect(2).to.equal(2); // Recommended - * expect(2).to.be.within(1, 3); // Not recommended - * expect(2).to.be.within(2, 3); // Not recommended - * expect(2).to.be.within(1, 2); // Not recommended - * - * Add `.lengthOf` earlier in the chain to assert that the target's `length` - * or `size` is greater than or equal to the given number `start`, and less - * than or equal to the given number `finish`. - * - * expect('foo').to.have.lengthOf(3); // Recommended - * expect('foo').to.have.lengthOf.within(2, 4); // Not recommended - * - * expect([1, 2, 3]).to.have.lengthOf(3); // Recommended - * expect([1, 2, 3]).to.have.lengthOf.within(2, 4); // Not recommended - * - * Add `.not` earlier in the chain to negate `.within`. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.not.be.within(2, 4); // Not recommended - * - * `.within` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. - * - * expect(4).to.be.within(1, 3, 'nooo why fail??'); - * expect(4, 'nooo why fail??').to.be.within(1, 3); - * - * @name within - * @param {Number} start lower bound inclusive - * @param {Number} finish upper bound inclusive - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - Assertion.addMethod('within', function (start, finish, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , doLength = flag(this, 'doLength') - , flagMsg = flag(this, 'message') - , msgPrefix = ((flagMsg) ? flagMsg + ': ' : '') - , ssfi = flag(this, 'ssfi') - , objType = _.type(obj).toLowerCase() - , startType = _.type(start).toLowerCase() - , finishType = _.type(finish).toLowerCase() - , errorMessage - , shouldThrow = true - , range = (startType === 'date' && finishType === 'date') - ? start.toUTCString() + '..' + finish.toUTCString() - : start + '..' + finish; - - if (doLength && objType !== 'map' && objType !== 'set') { - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); - } - - if (!doLength && (objType === 'date' && (startType !== 'date' || finishType !== 'date'))) { - errorMessage = msgPrefix + 'the arguments to within must be dates'; - } else if ((startType !== 'number' || finishType !== 'number') && (doLength || objType === 'number')) { - errorMessage = msgPrefix + 'the arguments to within must be numbers'; - } else if (!doLength && (objType !== 'date' && objType !== 'number')) { - var printObj = (objType === 'string') ? "'" + obj + "'" : obj; - errorMessage = msgPrefix + 'expected ' + printObj + ' to be a number or a date'; - } else { - shouldThrow = false; - } - - if (shouldThrow) { - throw new AssertionError(errorMessage, undefined, ssfi); - } - - if (doLength) { - var descriptor = 'length' - , itemsCount; - if (objType === 'map' || objType === 'set') { - descriptor = 'size'; - itemsCount = obj.size; - } else { - itemsCount = obj.length; - } - this.assert( - itemsCount >= start && itemsCount <= finish - , 'expected #{this} to have a ' + descriptor + ' within ' + range - , 'expected #{this} to not have a ' + descriptor + ' within ' + range - ); - } else { - this.assert( - obj >= start && obj <= finish - , 'expected #{this} to be within ' + range - , 'expected #{this} to not be within ' + range - ); - } - }); - - /** - * ### .instanceof(constructor[, msg]) - * - * Asserts that the target is an instance of the given `constructor`. - * - * function Cat () { } - * - * expect(new Cat()).to.be.an.instanceof(Cat); - * expect([1, 2]).to.be.an.instanceof(Array); - * - * Add `.not` earlier in the chain to negate `.instanceof`. - * - * expect({a: 1}).to.not.be.an.instanceof(Array); - * - * `.instanceof` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. - * - * expect(1).to.be.an.instanceof(Array, 'nooo why fail??'); - * expect(1, 'nooo why fail??').to.be.an.instanceof(Array); - * - * Due to limitations in ES5, `.instanceof` may not always work as expected - * when using a transpiler such as Babel or TypeScript. In particular, it may - * produce unexpected results when subclassing built-in object such as - * `Array`, `Error`, and `Map`. See your transpiler's docs for details: - * - * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes)) - * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work)) - * - * The alias `.instanceOf` can be used interchangeably with `.instanceof`. - * - * @name instanceof - * @param {Constructor} constructor - * @param {String} msg _optional_ - * @alias instanceOf - * @namespace BDD - * @api public - */ - - function assertInstanceOf (constructor, msg) { - if (msg) flag(this, 'message', msg); - - var target = flag(this, 'object'); - var ssfi = flag(this, 'ssfi'); - var flagMsg = flag(this, 'message'); - - try { - var isInstanceOf = target instanceof constructor; - } catch (err) { - if (err instanceof TypeError) { - flagMsg = flagMsg ? flagMsg + ': ' : ''; - throw new AssertionError( - flagMsg + 'The instanceof assertion needs a constructor but ' - + _.type(constructor) + ' was given.', - undefined, - ssfi - ); - } - throw err; - } - - var name = _.getName(constructor); - if (name === null) { - name = 'an unnamed constructor'; - } - - this.assert( - isInstanceOf - , 'expected #{this} to be an instance of ' + name - , 'expected #{this} to not be an instance of ' + name - ); - } - Assertion.addMethod('instanceof', assertInstanceOf); - Assertion.addMethod('instanceOf', assertInstanceOf); - - /** - * ### .property(name[, val[, msg]]) - * - * Asserts that the target has a property with the given key `name`. - * - * expect({a: 1}).to.have.property('a'); - * - * When `val` is provided, `.property` also asserts that the property's value - * is equal to the given `val`. - * - * expect({a: 1}).to.have.property('a', 1); - * - * By default, strict (`===`) equality is used. Add `.deep` earlier in the - * chain to use deep equality instead. See the `deep-eql` project page for - * info on the deep equality algorithm: https://github.com/chaijs/deep-eql. - * - * // Target object deeply (but not strictly) has property `x: {a: 1}` - * expect({x: {a: 1}}).to.have.deep.property('x', {a: 1}); - * expect({x: {a: 1}}).to.not.have.property('x', {a: 1}); - * - * The target's enumerable and non-enumerable properties are always included - * in the search. By default, both own and inherited properties are included. - * Add `.own` earlier in the chain to exclude inherited properties from the - * search. - * - * Object.prototype.b = 2; - * - * expect({a: 1}).to.have.own.property('a'); - * expect({a: 1}).to.have.own.property('a', 1); - * expect({a: 1}).to.have.property('b'); - * expect({a: 1}).to.not.have.own.property('b'); - * - * `.deep` and `.own` can be combined. - * - * expect({x: {a: 1}}).to.have.deep.own.property('x', {a: 1}); - * - * Add `.nested` earlier in the chain to enable dot- and bracket-notation when - * referencing nested properties. - * - * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]'); - * expect({a: {b: ['x', 'y']}}).to.have.nested.property('a.b[1]', 'y'); - * - * If `.` or `[]` are part of an actual property name, they can be escaped by - * adding two backslashes before them. - * - * expect({'.a': {'[b]': 'x'}}).to.have.nested.property('\\.a.\\[b\\]'); - * - * `.deep` and `.nested` can be combined. - * - * expect({a: {b: [{c: 3}]}}) - * .to.have.deep.nested.property('a.b[0]', {c: 3}); - * - * `.own` and `.nested` cannot be combined. - * - * Add `.not` earlier in the chain to negate `.property`. - * - * expect({a: 1}).to.not.have.property('b'); - * - * However, it's dangerous to negate `.property` when providing `val`. The - * problem is that it creates uncertain expectations by asserting that the - * target either doesn't have a property with the given key `name`, or that it - * does have a property with the given key `name` but its value isn't equal to - * the given `val`. It's often best to identify the exact output that's - * expected, and then write an assertion that only accepts that exact output. - * - * When the target isn't expected to have a property with the given key - * `name`, it's often best to assert exactly that. - * - * expect({b: 2}).to.not.have.property('a'); // Recommended - * expect({b: 2}).to.not.have.property('a', 1); // Not recommended - * - * When the target is expected to have a property with the given key `name`, - * it's often best to assert that the property has its expected value, rather - * than asserting that it doesn't have one of many unexpected values. - * - * expect({a: 3}).to.have.property('a', 3); // Recommended - * expect({a: 3}).to.not.have.property('a', 1); // Not recommended - * - * `.property` changes the target of any assertions that follow in the chain - * to be the value of the property from the original target object. - * - * expect({a: 1}).to.have.property('a').that.is.a('number'); - * - * `.property` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. When not providing `val`, only use the - * second form. - * - * // Recommended - * expect({a: 1}).to.have.property('a', 2, 'nooo why fail??'); - * expect({a: 1}, 'nooo why fail??').to.have.property('a', 2); - * expect({a: 1}, 'nooo why fail??').to.have.property('b'); - * - * // Not recommended - * expect({a: 1}).to.have.property('b', undefined, 'nooo why fail??'); - * - * The above assertion isn't the same thing as not providing `val`. Instead, - * it's asserting that the target object has a `b` property that's equal to - * `undefined`. - * - * The assertions `.ownProperty` and `.haveOwnProperty` can be used - * interchangeably with `.own.property`. - * - * @name property - * @param {String} name - * @param {Mixed} val (optional) - * @param {String} msg _optional_ - * @returns value of property for chaining - * @namespace BDD - * @api public - */ - - function assertProperty (name, val, msg) { - if (msg) flag(this, 'message', msg); - - var isNested = flag(this, 'nested') - , isOwn = flag(this, 'own') - , flagMsg = flag(this, 'message') - , obj = flag(this, 'object') - , ssfi = flag(this, 'ssfi') - , nameType = typeof name; - - flagMsg = flagMsg ? flagMsg + ': ' : ''; - - if (isNested) { - if (nameType !== 'string') { - throw new AssertionError( - flagMsg + 'the argument to property must be a string when using nested syntax', - undefined, - ssfi - ); - } - } else { - if (nameType !== 'string' && nameType !== 'number' && nameType !== 'symbol') { - throw new AssertionError( - flagMsg + 'the argument to property must be a string, number, or symbol', - undefined, - ssfi - ); - } - } - - if (isNested && isOwn) { - throw new AssertionError( - flagMsg + 'The "nested" and "own" flags cannot be combined.', - undefined, - ssfi - ); - } - - if (obj === null || obj === undefined) { - throw new AssertionError( - flagMsg + 'Target cannot be null or undefined.', - undefined, - ssfi - ); - } - - var isDeep = flag(this, 'deep') - , negate = flag(this, 'negate') - , pathInfo = isNested ? _.getPathInfo(obj, name) : null - , value = isNested ? pathInfo.value : obj[name]; - - var descriptor = ''; - if (isDeep) descriptor += 'deep '; - if (isOwn) descriptor += 'own '; - if (isNested) descriptor += 'nested '; - descriptor += 'property '; - - var hasProperty; - if (isOwn) hasProperty = Object.prototype.hasOwnProperty.call(obj, name); - else if (isNested) hasProperty = pathInfo.exists; - else hasProperty = _.hasProperty(obj, name); - - // When performing a negated assertion for both name and val, merely having - // a property with the given name isn't enough to cause the assertion to - // fail. It must both have a property with the given name, and the value of - // that property must equal the given val. Therefore, skip this assertion in - // favor of the next. - if (!negate || arguments.length === 1) { - this.assert( - hasProperty - , 'expected #{this} to have ' + descriptor + _.inspect(name) - , 'expected #{this} to not have ' + descriptor + _.inspect(name)); - } - - if (arguments.length > 1) { - this.assert( - hasProperty && (isDeep ? _.eql(val, value) : val === value) - , 'expected #{this} to have ' + descriptor + _.inspect(name) + ' of #{exp}, but got #{act}' - , 'expected #{this} to not have ' + descriptor + _.inspect(name) + ' of #{act}' - , val - , value - ); - } - - flag(this, 'object', value); - } - - Assertion.addMethod('property', assertProperty); - - function assertOwnProperty (name, value, msg) { - flag(this, 'own', true); - assertProperty.apply(this, arguments); - } - - Assertion.addMethod('ownProperty', assertOwnProperty); - Assertion.addMethod('haveOwnProperty', assertOwnProperty); - - /** - * ### .ownPropertyDescriptor(name[, descriptor[, msg]]) - * - * Asserts that the target has its own property descriptor with the given key - * `name`. Enumerable and non-enumerable properties are included in the - * search. - * - * expect({a: 1}).to.have.ownPropertyDescriptor('a'); - * - * When `descriptor` is provided, `.ownPropertyDescriptor` also asserts that - * the property's descriptor is deeply equal to the given `descriptor`. See - * the `deep-eql` project page for info on the deep equality algorithm: - * https://github.com/chaijs/deep-eql. - * - * expect({a: 1}).to.have.ownPropertyDescriptor('a', { - * configurable: true, - * enumerable: true, - * writable: true, - * value: 1, - * }); - * - * Add `.not` earlier in the chain to negate `.ownPropertyDescriptor`. - * - * expect({a: 1}).to.not.have.ownPropertyDescriptor('b'); - * - * However, it's dangerous to negate `.ownPropertyDescriptor` when providing - * a `descriptor`. The problem is that it creates uncertain expectations by - * asserting that the target either doesn't have a property descriptor with - * the given key `name`, or that it does have a property descriptor with the - * given key `name` but its not deeply equal to the given `descriptor`. It's - * often best to identify the exact output that's expected, and then write an - * assertion that only accepts that exact output. - * - * When the target isn't expected to have a property descriptor with the given - * key `name`, it's often best to assert exactly that. - * - * // Recommended - * expect({b: 2}).to.not.have.ownPropertyDescriptor('a'); - * - * // Not recommended - * expect({b: 2}).to.not.have.ownPropertyDescriptor('a', { - * configurable: true, - * enumerable: true, - * writable: true, - * value: 1, - * }); - * - * When the target is expected to have a property descriptor with the given - * key `name`, it's often best to assert that the property has its expected - * descriptor, rather than asserting that it doesn't have one of many - * unexpected descriptors. - * - * // Recommended - * expect({a: 3}).to.have.ownPropertyDescriptor('a', { - * configurable: true, - * enumerable: true, - * writable: true, - * value: 3, - * }); - * - * // Not recommended - * expect({a: 3}).to.not.have.ownPropertyDescriptor('a', { - * configurable: true, - * enumerable: true, - * writable: true, - * value: 1, - * }); - * - * `.ownPropertyDescriptor` changes the target of any assertions that follow - * in the chain to be the value of the property descriptor from the original - * target object. - * - * expect({a: 1}).to.have.ownPropertyDescriptor('a') - * .that.has.property('enumerable', true); - * - * `.ownPropertyDescriptor` accepts an optional `msg` argument which is a - * custom error message to show when the assertion fails. The message can also - * be given as the second argument to `expect`. When not providing - * `descriptor`, only use the second form. - * - * // Recommended - * expect({a: 1}).to.have.ownPropertyDescriptor('a', { - * configurable: true, - * enumerable: true, - * writable: true, - * value: 2, - * }, 'nooo why fail??'); - * - * // Recommended - * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('a', { - * configurable: true, - * enumerable: true, - * writable: true, - * value: 2, - * }); - * - * // Recommended - * expect({a: 1}, 'nooo why fail??').to.have.ownPropertyDescriptor('b'); - * - * // Not recommended - * expect({a: 1}) - * .to.have.ownPropertyDescriptor('b', undefined, 'nooo why fail??'); - * - * The above assertion isn't the same thing as not providing `descriptor`. - * Instead, it's asserting that the target object has a `b` property - * descriptor that's deeply equal to `undefined`. - * - * The alias `.haveOwnPropertyDescriptor` can be used interchangeably with - * `.ownPropertyDescriptor`. - * - * @name ownPropertyDescriptor - * @alias haveOwnPropertyDescriptor - * @param {String} name - * @param {Object} descriptor _optional_ - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertOwnPropertyDescriptor (name, descriptor, msg) { - if (typeof descriptor === 'string') { - msg = descriptor; - descriptor = null; - } - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object'); - var actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name); - if (actualDescriptor && descriptor) { - this.assert( - _.eql(descriptor, actualDescriptor) - , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to match ' + _.inspect(descriptor) + ', got ' + _.inspect(actualDescriptor) - , 'expected the own property descriptor for ' + _.inspect(name) + ' on #{this} to not match ' + _.inspect(descriptor) - , descriptor - , actualDescriptor - , true - ); - } else { - this.assert( - actualDescriptor - , 'expected #{this} to have an own property descriptor for ' + _.inspect(name) - , 'expected #{this} to not have an own property descriptor for ' + _.inspect(name) - ); - } - flag(this, 'object', actualDescriptor); - } - - Assertion.addMethod('ownPropertyDescriptor', assertOwnPropertyDescriptor); - Assertion.addMethod('haveOwnPropertyDescriptor', assertOwnPropertyDescriptor); - - /** - * ### .lengthOf(n[, msg]) - * - * Asserts that the target's `length` or `size` is equal to the given number - * `n`. - * - * expect([1, 2, 3]).to.have.lengthOf(3); - * expect('foo').to.have.lengthOf(3); - * expect(new Set([1, 2, 3])).to.have.lengthOf(3); - * expect(new Map([['a', 1], ['b', 2], ['c', 3]])).to.have.lengthOf(3); - * - * Add `.not` earlier in the chain to negate `.lengthOf`. However, it's often - * best to assert that the target's `length` property is equal to its expected - * value, rather than not equal to one of many unexpected values. - * - * expect('foo').to.have.lengthOf(3); // Recommended - * expect('foo').to.not.have.lengthOf(4); // Not recommended - * - * `.lengthOf` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. - * - * expect([1, 2, 3]).to.have.lengthOf(2, 'nooo why fail??'); - * expect([1, 2, 3], 'nooo why fail??').to.have.lengthOf(2); - * - * `.lengthOf` can also be used as a language chain, causing all `.above`, - * `.below`, `.least`, `.most`, and `.within` assertions that follow in the - * chain to use the target's `length` property as the target. However, it's - * often best to assert that the target's `length` property is equal to its - * expected length, rather than asserting that its `length` property falls - * within some range of values. - * - * // Recommended - * expect([1, 2, 3]).to.have.lengthOf(3); - * - * // Not recommended - * expect([1, 2, 3]).to.have.lengthOf.above(2); - * expect([1, 2, 3]).to.have.lengthOf.below(4); - * expect([1, 2, 3]).to.have.lengthOf.at.least(3); - * expect([1, 2, 3]).to.have.lengthOf.at.most(3); - * expect([1, 2, 3]).to.have.lengthOf.within(2,4); - * - * Due to a compatibility issue, the alias `.length` can't be chained directly - * off of an uninvoked method such as `.a`. Therefore, `.length` can't be used - * interchangeably with `.lengthOf` in every situation. It's recommended to - * always use `.lengthOf` instead of `.length`. - * - * expect([1, 2, 3]).to.have.a.length(3); // incompatible; throws error - * expect([1, 2, 3]).to.have.a.lengthOf(3); // passes as expected - * - * @name lengthOf - * @alias length - * @param {Number} n - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertLengthChain () { - flag(this, 'doLength', true); - } - - function assertLength (n, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , objType = _.type(obj).toLowerCase() - , flagMsg = flag(this, 'message') - , ssfi = flag(this, 'ssfi') - , descriptor = 'length' - , itemsCount; - - switch (objType) { - case 'map': - case 'set': - descriptor = 'size'; - itemsCount = obj.size; - break; - default: - new Assertion(obj, flagMsg, ssfi, true).to.have.property('length'); - itemsCount = obj.length; - } - - this.assert( - itemsCount == n - , 'expected #{this} to have a ' + descriptor + ' of #{exp} but got #{act}' - , 'expected #{this} to not have a ' + descriptor + ' of #{act}' - , n - , itemsCount - ); - } - - Assertion.addChainableMethod('length', assertLength, assertLengthChain); - Assertion.addChainableMethod('lengthOf', assertLength, assertLengthChain); - - /** - * ### .match(re[, msg]) - * - * Asserts that the target matches the given regular expression `re`. - * - * expect('foobar').to.match(/^foo/); - * - * Add `.not` earlier in the chain to negate `.match`. - * - * expect('foobar').to.not.match(/taco/); - * - * `.match` accepts an optional `msg` argument which is a custom error message - * to show when the assertion fails. The message can also be given as the - * second argument to `expect`. - * - * expect('foobar').to.match(/taco/, 'nooo why fail??'); - * expect('foobar', 'nooo why fail??').to.match(/taco/); - * - * The alias `.matches` can be used interchangeably with `.match`. - * - * @name match - * @alias matches - * @param {RegExp} re - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - function assertMatch(re, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object'); - this.assert( - re.exec(obj) - , 'expected #{this} to match ' + re - , 'expected #{this} not to match ' + re - ); - } - - Assertion.addMethod('match', assertMatch); - Assertion.addMethod('matches', assertMatch); - - /** - * ### .string(str[, msg]) - * - * Asserts that the target string contains the given substring `str`. - * - * expect('foobar').to.have.string('bar'); - * - * Add `.not` earlier in the chain to negate `.string`. - * - * expect('foobar').to.not.have.string('taco'); - * - * `.string` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. - * - * expect('foobar').to.have.string('taco', 'nooo why fail??'); - * expect('foobar', 'nooo why fail??').to.have.string('taco'); - * - * @name string - * @param {String} str - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - Assertion.addMethod('string', function (str, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , flagMsg = flag(this, 'message') - , ssfi = flag(this, 'ssfi'); - new Assertion(obj, flagMsg, ssfi, true).is.a('string'); - - this.assert( - ~obj.indexOf(str) - , 'expected #{this} to contain ' + _.inspect(str) - , 'expected #{this} to not contain ' + _.inspect(str) - ); - }); - - /** - * ### .keys(key1[, key2[, ...]]) - * - * Asserts that the target object, array, map, or set has the given keys. Only - * the target's own inherited properties are included in the search. - * - * When the target is an object or array, keys can be provided as one or more - * string arguments, a single array argument, or a single object argument. In - * the latter case, only the keys in the given object matter; the values are - * ignored. - * - * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); - * expect(['x', 'y']).to.have.all.keys(0, 1); - * - * expect({a: 1, b: 2}).to.have.all.keys(['a', 'b']); - * expect(['x', 'y']).to.have.all.keys([0, 1]); - * - * expect({a: 1, b: 2}).to.have.all.keys({a: 4, b: 5}); // ignore 4 and 5 - * expect(['x', 'y']).to.have.all.keys({0: 4, 1: 5}); // ignore 4 and 5 - * - * When the target is a map or set, each key must be provided as a separate - * argument. - * - * expect(new Map([['a', 1], ['b', 2]])).to.have.all.keys('a', 'b'); - * expect(new Set(['a', 'b'])).to.have.all.keys('a', 'b'); - * - * Because `.keys` does different things based on the target's type, it's - * important to check the target's type before using `.keys`. See the `.a` doc - * for info on testing a target's type. - * - * expect({a: 1, b: 2}).to.be.an('object').that.has.all.keys('a', 'b'); - * - * By default, strict (`===`) equality is used to compare keys of maps and - * sets. Add `.deep` earlier in the chain to use deep equality instead. See - * the `deep-eql` project page for info on the deep equality algorithm: - * https://github.com/chaijs/deep-eql. - * - * // Target set deeply (but not strictly) has key `{a: 1}` - * expect(new Set([{a: 1}])).to.have.all.deep.keys([{a: 1}]); - * expect(new Set([{a: 1}])).to.not.have.all.keys([{a: 1}]); - * - * By default, the target must have all of the given keys and no more. Add - * `.any` earlier in the chain to only require that the target have at least - * one of the given keys. Also, add `.not` earlier in the chain to negate - * `.keys`. It's often best to add `.any` when negating `.keys`, and to use - * `.all` when asserting `.keys` without negation. - * - * When negating `.keys`, `.any` is preferred because `.not.any.keys` asserts - * exactly what's expected of the output, whereas `.not.all.keys` creates - * uncertain expectations. - * - * // Recommended; asserts that target doesn't have any of the given keys - * expect({a: 1, b: 2}).to.not.have.any.keys('c', 'd'); - * - * // Not recommended; asserts that target doesn't have all of the given - * // keys but may or may not have some of them - * expect({a: 1, b: 2}).to.not.have.all.keys('c', 'd'); - * - * When asserting `.keys` without negation, `.all` is preferred because - * `.all.keys` asserts exactly what's expected of the output, whereas - * `.any.keys` creates uncertain expectations. - * - * // Recommended; asserts that target has all the given keys - * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); - * - * // Not recommended; asserts that target has at least one of the given - * // keys but may or may not have more of them - * expect({a: 1, b: 2}).to.have.any.keys('a', 'b'); - * - * Note that `.all` is used by default when neither `.all` nor `.any` appear - * earlier in the chain. However, it's often best to add `.all` anyway because - * it improves readability. - * - * // Both assertions are identical - * expect({a: 1, b: 2}).to.have.all.keys('a', 'b'); // Recommended - * expect({a: 1, b: 2}).to.have.keys('a', 'b'); // Not recommended - * - * Add `.include` earlier in the chain to require that the target's keys be a - * superset of the expected keys, rather than identical sets. - * - * // Target object's keys are a superset of ['a', 'b'] but not identical - * expect({a: 1, b: 2, c: 3}).to.include.all.keys('a', 'b'); - * expect({a: 1, b: 2, c: 3}).to.not.have.all.keys('a', 'b'); - * - * However, if `.any` and `.include` are combined, only the `.any` takes - * effect. The `.include` is ignored in this case. - * - * // Both assertions are identical - * expect({a: 1}).to.have.any.keys('a', 'b'); - * expect({a: 1}).to.include.any.keys('a', 'b'); - * - * A custom error message can be given as the second argument to `expect`. - * - * expect({a: 1}, 'nooo why fail??').to.have.key('b'); - * - * The alias `.key` can be used interchangeably with `.keys`. - * - * @name keys - * @alias key - * @param {...String|Array|Object} keys - * @namespace BDD - * @api public - */ - - function assertKeys (keys) { - var obj = flag(this, 'object') - , objType = _.type(obj) - , keysType = _.type(keys) - , ssfi = flag(this, 'ssfi') - , isDeep = flag(this, 'deep') - , str - , deepStr = '' - , actual - , ok = true - , flagMsg = flag(this, 'message'); - - flagMsg = flagMsg ? flagMsg + ': ' : ''; - var mixedArgsMsg = flagMsg + 'when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments'; - - if (objType === 'Map' || objType === 'Set') { - deepStr = isDeep ? 'deeply ' : ''; - actual = []; - - // Map and Set '.keys' aren't supported in IE 11. Therefore, use .forEach. - obj.forEach(function (val, key) { actual.push(key); }); - - if (keysType !== 'Array') { - keys = Array.prototype.slice.call(arguments); - } - } else { - actual = _.getOwnEnumerableProperties(obj); - - switch (keysType) { - case 'Array': - if (arguments.length > 1) { - throw new AssertionError(mixedArgsMsg, undefined, ssfi); - } - break; - case 'Object': - if (arguments.length > 1) { - throw new AssertionError(mixedArgsMsg, undefined, ssfi); - } - keys = Object.keys(keys); - break; - default: - keys = Array.prototype.slice.call(arguments); - } - - // Only stringify non-Symbols because Symbols would become "Symbol()" - keys = keys.map(function (val) { - return typeof val === 'symbol' ? val : String(val); - }); - } - - if (!keys.length) { - throw new AssertionError(flagMsg + 'keys required', undefined, ssfi); - } - - var len = keys.length - , any = flag(this, 'any') - , all = flag(this, 'all') - , expected = keys; - - if (!any && !all) { - all = true; - } - - // Has any - if (any) { - ok = expected.some(function(expectedKey) { - return actual.some(function(actualKey) { - if (isDeep) { - return _.eql(expectedKey, actualKey); - } else { - return expectedKey === actualKey; - } - }); - }); - } - - // Has all - if (all) { - ok = expected.every(function(expectedKey) { - return actual.some(function(actualKey) { - if (isDeep) { - return _.eql(expectedKey, actualKey); - } else { - return expectedKey === actualKey; - } - }); - }); - - if (!flag(this, 'contains')) { - ok = ok && keys.length == actual.length; - } - } - - // Key string - if (len > 1) { - keys = keys.map(function(key) { - return _.inspect(key); - }); - var last = keys.pop(); - if (all) { - str = keys.join(', ') + ', and ' + last; - } - if (any) { - str = keys.join(', ') + ', or ' + last; - } - } else { - str = _.inspect(keys[0]); - } - - // Form - str = (len > 1 ? 'keys ' : 'key ') + str; - - // Have / include - str = (flag(this, 'contains') ? 'contain ' : 'have ') + str; - - // Assertion - this.assert( - ok - , 'expected #{this} to ' + deepStr + str - , 'expected #{this} to not ' + deepStr + str - , expected.slice(0).sort(_.compareByInspect) - , actual.sort(_.compareByInspect) - , true - ); - } - - Assertion.addMethod('keys', assertKeys); - Assertion.addMethod('key', assertKeys); - - /** - * ### .throw([errorLike], [errMsgMatcher], [msg]) - * - * When no arguments are provided, `.throw` invokes the target function and - * asserts that an error is thrown. - * - * var badFn = function () { throw new TypeError('Illegal salmon!'); }; - * - * expect(badFn).to.throw(); - * - * When one argument is provided, and it's an error constructor, `.throw` - * invokes the target function and asserts that an error is thrown that's an - * instance of that error constructor. - * - * var badFn = function () { throw new TypeError('Illegal salmon!'); }; - * - * expect(badFn).to.throw(TypeError); - * - * When one argument is provided, and it's an error instance, `.throw` invokes - * the target function and asserts that an error is thrown that's strictly - * (`===`) equal to that error instance. - * - * var err = new TypeError('Illegal salmon!'); - * var badFn = function () { throw err; }; - * - * expect(badFn).to.throw(err); - * - * When one argument is provided, and it's a string, `.throw` invokes the - * target function and asserts that an error is thrown with a message that - * contains that string. - * - * var badFn = function () { throw new TypeError('Illegal salmon!'); }; - * - * expect(badFn).to.throw('salmon'); - * - * When one argument is provided, and it's a regular expression, `.throw` - * invokes the target function and asserts that an error is thrown with a - * message that matches that regular expression. - * - * var badFn = function () { throw new TypeError('Illegal salmon!'); }; - * - * expect(badFn).to.throw(/salmon/); - * - * When two arguments are provided, and the first is an error instance or - * constructor, and the second is a string or regular expression, `.throw` - * invokes the function and asserts that an error is thrown that fulfills both - * conditions as described above. - * - * var err = new TypeError('Illegal salmon!'); - * var badFn = function () { throw err; }; - * - * expect(badFn).to.throw(TypeError, 'salmon'); - * expect(badFn).to.throw(TypeError, /salmon/); - * expect(badFn).to.throw(err, 'salmon'); - * expect(badFn).to.throw(err, /salmon/); - * - * Add `.not` earlier in the chain to negate `.throw`. - * - * var goodFn = function () {}; - * - * expect(goodFn).to.not.throw(); - * - * However, it's dangerous to negate `.throw` when providing any arguments. - * The problem is that it creates uncertain expectations by asserting that the - * target either doesn't throw an error, or that it throws an error but of a - * different type than the given type, or that it throws an error of the given - * type but with a message that doesn't include the given string. It's often - * best to identify the exact output that's expected, and then write an - * assertion that only accepts that exact output. - * - * When the target isn't expected to throw an error, it's often best to assert - * exactly that. - * - * var goodFn = function () {}; - * - * expect(goodFn).to.not.throw(); // Recommended - * expect(goodFn).to.not.throw(ReferenceError, 'x'); // Not recommended - * - * When the target is expected to throw an error, it's often best to assert - * that the error is of its expected type, and has a message that includes an - * expected string, rather than asserting that it doesn't have one of many - * unexpected types, and doesn't have a message that includes some string. - * - * var badFn = function () { throw new TypeError('Illegal salmon!'); }; - * - * expect(badFn).to.throw(TypeError, 'salmon'); // Recommended - * expect(badFn).to.not.throw(ReferenceError, 'x'); // Not recommended - * - * `.throw` changes the target of any assertions that follow in the chain to - * be the error object that's thrown. - * - * var err = new TypeError('Illegal salmon!'); - * err.code = 42; - * var badFn = function () { throw err; }; - * - * expect(badFn).to.throw(TypeError).with.property('code', 42); - * - * `.throw` accepts an optional `msg` argument which is a custom error message - * to show when the assertion fails. The message can also be given as the - * second argument to `expect`. When not providing two arguments, always use - * the second form. - * - * var goodFn = function () {}; - * - * expect(goodFn).to.throw(TypeError, 'x', 'nooo why fail??'); - * expect(goodFn, 'nooo why fail??').to.throw(); - * - * Due to limitations in ES5, `.throw` may not always work as expected when - * using a transpiler such as Babel or TypeScript. In particular, it may - * produce unexpected results when subclassing the built-in `Error` object and - * then passing the subclassed constructor to `.throw`. See your transpiler's - * docs for details: - * - * - ([Babel](https://babeljs.io/docs/usage/caveats/#classes)) - * - ([TypeScript](https://github.com/Microsoft/TypeScript/wiki/Breaking-Changes#extending-built-ins-like-error-array-and-map-may-no-longer-work)) - * - * Beware of some common mistakes when using the `throw` assertion. One common - * mistake is to accidentally invoke the function yourself instead of letting - * the `throw` assertion invoke the function for you. For example, when - * testing if a function named `fn` throws, provide `fn` instead of `fn()` as - * the target for the assertion. - * - * expect(fn).to.throw(); // Good! Tests `fn` as desired - * expect(fn()).to.throw(); // Bad! Tests result of `fn()`, not `fn` - * - * If you need to assert that your function `fn` throws when passed certain - * arguments, then wrap a call to `fn` inside of another function. - * - * expect(function () { fn(42); }).to.throw(); // Function expression - * expect(() => fn(42)).to.throw(); // ES6 arrow function - * - * Another common mistake is to provide an object method (or any stand-alone - * function that relies on `this`) as the target of the assertion. Doing so is - * problematic because the `this` context will be lost when the function is - * invoked by `.throw`; there's no way for it to know what `this` is supposed - * to be. There are two ways around this problem. One solution is to wrap the - * method or function call inside of another function. Another solution is to - * use `bind`. - * - * expect(function () { cat.meow(); }).to.throw(); // Function expression - * expect(() => cat.meow()).to.throw(); // ES6 arrow function - * expect(cat.meow.bind(cat)).to.throw(); // Bind - * - * Finally, it's worth mentioning that it's a best practice in JavaScript to - * only throw `Error` and derivatives of `Error` such as `ReferenceError`, - * `TypeError`, and user-defined objects that extend `Error`. No other type of - * value will generate a stack trace when initialized. With that said, the - * `throw` assertion does technically support any type of value being thrown, - * not just `Error` and its derivatives. - * - * The aliases `.throws` and `.Throw` can be used interchangeably with - * `.throw`. - * - * @name throw - * @alias throws - * @alias Throw - * @param {Error|ErrorConstructor} errorLike - * @param {String|RegExp} errMsgMatcher error message - * @param {String} msg _optional_ - * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types - * @returns error for chaining (null if no error) - * @namespace BDD - * @api public - */ - - function assertThrows (errorLike, errMsgMatcher, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , ssfi = flag(this, 'ssfi') - , flagMsg = flag(this, 'message') - , negate = flag(this, 'negate') || false; - new Assertion(obj, flagMsg, ssfi, true).is.a('function'); - - if (errorLike instanceof RegExp || typeof errorLike === 'string') { - errMsgMatcher = errorLike; - errorLike = null; - } - - var caughtErr; - try { - obj(); - } catch (err) { - caughtErr = err; - } - - // If we have the negate flag enabled and at least one valid argument it means we do expect an error - // but we want it to match a given set of criteria - var everyArgIsUndefined = errorLike === undefined && errMsgMatcher === undefined; - - // If we've got the negate flag enabled and both args, we should only fail if both aren't compatible - // See Issue #551 and PR #683@GitHub - var everyArgIsDefined = Boolean(errorLike && errMsgMatcher); - var errorLikeFail = false; - var errMsgMatcherFail = false; - - // Checking if error was thrown - if (everyArgIsUndefined || !everyArgIsUndefined && !negate) { - // We need this to display results correctly according to their types - var errorLikeString = 'an error'; - if (errorLike instanceof Error) { - errorLikeString = '#{exp}'; - } else if (errorLike) { - errorLikeString = _.checkError.getConstructorName(errorLike); - } - - this.assert( - caughtErr - , 'expected #{this} to throw ' + errorLikeString - , 'expected #{this} to not throw an error but #{act} was thrown' - , errorLike && errorLike.toString() - , (caughtErr instanceof Error ? - caughtErr.toString() : (typeof caughtErr === 'string' ? caughtErr : caughtErr && - _.checkError.getConstructorName(caughtErr))) - ); - } - - if (errorLike && caughtErr) { - // We should compare instances only if `errorLike` is an instance of `Error` - if (errorLike instanceof Error) { - var isCompatibleInstance = _.checkError.compatibleInstance(caughtErr, errorLike); - - if (isCompatibleInstance === negate) { - // These checks were created to ensure we won't fail too soon when we've got both args and a negate - // See Issue #551 and PR #683@GitHub - if (everyArgIsDefined && negate) { - errorLikeFail = true; - } else { - this.assert( - negate - , 'expected #{this} to throw #{exp} but #{act} was thrown' - , 'expected #{this} to not throw #{exp}' + (caughtErr && !negate ? ' but #{act} was thrown' : '') - , errorLike.toString() - , caughtErr.toString() - ); - } - } - } - - var isCompatibleConstructor = _.checkError.compatibleConstructor(caughtErr, errorLike); - if (isCompatibleConstructor === negate) { - if (everyArgIsDefined && negate) { - errorLikeFail = true; - } else { - this.assert( - negate - , 'expected #{this} to throw #{exp} but #{act} was thrown' - , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') - , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) - , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) - ); - } - } - } - - if (caughtErr && errMsgMatcher !== undefined && errMsgMatcher !== null) { - // Here we check compatible messages - var placeholder = 'including'; - if (errMsgMatcher instanceof RegExp) { - placeholder = 'matching'; - } - - var isCompatibleMessage = _.checkError.compatibleMessage(caughtErr, errMsgMatcher); - if (isCompatibleMessage === negate) { - if (everyArgIsDefined && negate) { - errMsgMatcherFail = true; - } else { - this.assert( - negate - , 'expected #{this} to throw error ' + placeholder + ' #{exp} but got #{act}' - , 'expected #{this} to throw error not ' + placeholder + ' #{exp}' - , errMsgMatcher - , _.checkError.getMessage(caughtErr) - ); - } - } - } - - // If both assertions failed and both should've matched we throw an error - if (errorLikeFail && errMsgMatcherFail) { - this.assert( - negate - , 'expected #{this} to throw #{exp} but #{act} was thrown' - , 'expected #{this} to not throw #{exp}' + (caughtErr ? ' but #{act} was thrown' : '') - , (errorLike instanceof Error ? errorLike.toString() : errorLike && _.checkError.getConstructorName(errorLike)) - , (caughtErr instanceof Error ? caughtErr.toString() : caughtErr && _.checkError.getConstructorName(caughtErr)) - ); - } - - flag(this, 'object', caughtErr); - } - Assertion.addMethod('throw', assertThrows); - Assertion.addMethod('throws', assertThrows); - Assertion.addMethod('Throw', assertThrows); - - /** - * ### .respondTo(method[, msg]) - * - * When the target is a non-function object, `.respondTo` asserts that the - * target has a method with the given name `method`. The method can be own or - * inherited, and it can be enumerable or non-enumerable. - * - * function Cat () {} - * Cat.prototype.meow = function () {}; - * - * expect(new Cat()).to.respondTo('meow'); - * - * When the target is a function, `.respondTo` asserts that the target's - * `prototype` property has a method with the given name `method`. Again, the - * method can be own or inherited, and it can be enumerable or non-enumerable. - * - * function Cat () {} - * Cat.prototype.meow = function () {}; - * - * expect(Cat).to.respondTo('meow'); - * - * Add `.itself` earlier in the chain to force `.respondTo` to treat the - * target as a non-function object, even if it's a function. Thus, it asserts - * that the target has a method with the given name `method`, rather than - * asserting that the target's `prototype` property has a method with the - * given name `method`. - * - * function Cat () {} - * Cat.prototype.meow = function () {}; - * Cat.hiss = function () {}; - * - * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow'); - * - * When not adding `.itself`, it's important to check the target's type before - * using `.respondTo`. See the `.a` doc for info on checking a target's type. - * - * function Cat () {} - * Cat.prototype.meow = function () {}; - * - * expect(new Cat()).to.be.an('object').that.respondsTo('meow'); - * - * Add `.not` earlier in the chain to negate `.respondTo`. - * - * function Dog () {} - * Dog.prototype.bark = function () {}; - * - * expect(new Dog()).to.not.respondTo('meow'); - * - * `.respondTo` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. - * - * expect({}).to.respondTo('meow', 'nooo why fail??'); - * expect({}, 'nooo why fail??').to.respondTo('meow'); - * - * The alias `.respondsTo` can be used interchangeably with `.respondTo`. - * - * @name respondTo - * @alias respondsTo - * @param {String} method - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function respondTo (method, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , itself = flag(this, 'itself') - , context = ('function' === typeof obj && !itself) - ? obj.prototype[method] - : obj[method]; - - this.assert( - 'function' === typeof context - , 'expected #{this} to respond to ' + _.inspect(method) - , 'expected #{this} to not respond to ' + _.inspect(method) - ); - } - - Assertion.addMethod('respondTo', respondTo); - Assertion.addMethod('respondsTo', respondTo); - - /** - * ### .itself - * - * Forces all `.respondTo` assertions that follow in the chain to behave as if - * the target is a non-function object, even if it's a function. Thus, it - * causes `.respondTo` to assert that the target has a method with the given - * name, rather than asserting that the target's `prototype` property has a - * method with the given name. - * - * function Cat () {} - * Cat.prototype.meow = function () {}; - * Cat.hiss = function () {}; - * - * expect(Cat).itself.to.respondTo('hiss').but.not.respondTo('meow'); - * - * @name itself - * @namespace BDD - * @api public - */ - - Assertion.addProperty('itself', function () { - flag(this, 'itself', true); - }); - - /** - * ### .satisfy(matcher[, msg]) - * - * Invokes the given `matcher` function with the target being passed as the - * first argument, and asserts that the value returned is truthy. - * - * expect(1).to.satisfy(function(num) { - * return num > 0; - * }); - * - * Add `.not` earlier in the chain to negate `.satisfy`. - * - * expect(1).to.not.satisfy(function(num) { - * return num > 2; - * }); - * - * `.satisfy` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. - * - * expect(1).to.satisfy(function(num) { - * return num > 2; - * }, 'nooo why fail??'); - * - * expect(1, 'nooo why fail??').to.satisfy(function(num) { - * return num > 2; - * }); - * - * The alias `.satisfies` can be used interchangeably with `.satisfy`. - * - * @name satisfy - * @alias satisfies - * @param {Function} matcher - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function satisfy (matcher, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object'); - var result = matcher(obj); - this.assert( - result - , 'expected #{this} to satisfy ' + _.objDisplay(matcher) - , 'expected #{this} to not satisfy' + _.objDisplay(matcher) - , flag(this, 'negate') ? false : true - , result - ); - } - - Assertion.addMethod('satisfy', satisfy); - Assertion.addMethod('satisfies', satisfy); - - /** - * ### .closeTo(expected, delta[, msg]) - * - * Asserts that the target is a number that's within a given +/- `delta` range - * of the given number `expected`. However, it's often best to assert that the - * target is equal to its expected value. - * - * // Recommended - * expect(1.5).to.equal(1.5); - * - * // Not recommended - * expect(1.5).to.be.closeTo(1, 0.5); - * expect(1.5).to.be.closeTo(2, 0.5); - * expect(1.5).to.be.closeTo(1, 1); - * - * Add `.not` earlier in the chain to negate `.closeTo`. - * - * expect(1.5).to.equal(1.5); // Recommended - * expect(1.5).to.not.be.closeTo(3, 1); // Not recommended - * - * `.closeTo` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. - * - * expect(1.5).to.be.closeTo(3, 1, 'nooo why fail??'); - * expect(1.5, 'nooo why fail??').to.be.closeTo(3, 1); - * - * The alias `.approximately` can be used interchangeably with `.closeTo`. - * - * @name closeTo - * @alias approximately - * @param {Number} expected - * @param {Number} delta - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function closeTo(expected, delta, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , flagMsg = flag(this, 'message') - , ssfi = flag(this, 'ssfi'); - - new Assertion(obj, flagMsg, ssfi, true).is.a('number'); - if (typeof expected !== 'number' || typeof delta !== 'number') { - flagMsg = flagMsg ? flagMsg + ': ' : ''; - throw new AssertionError( - flagMsg + 'the arguments to closeTo or approximately must be numbers', - undefined, - ssfi - ); - } - - this.assert( - Math.abs(obj - expected) <= delta - , 'expected #{this} to be close to ' + expected + ' +/- ' + delta - , 'expected #{this} not to be close to ' + expected + ' +/- ' + delta - ); - } - - Assertion.addMethod('closeTo', closeTo); - Assertion.addMethod('approximately', closeTo); - - // Note: Duplicates are ignored if testing for inclusion instead of sameness. - function isSubsetOf(subset, superset, cmp, contains, ordered) { - if (!contains) { - if (subset.length !== superset.length) return false; - superset = superset.slice(); - } - - return subset.every(function(elem, idx) { - if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx]; - - if (!cmp) { - var matchIdx = superset.indexOf(elem); - if (matchIdx === -1) return false; - - // Remove match from superset so not counted twice if duplicate in subset. - if (!contains) superset.splice(matchIdx, 1); - return true; - } - - return superset.some(function(elem2, matchIdx) { - if (!cmp(elem, elem2)) return false; - - // Remove match from superset so not counted twice if duplicate in subset. - if (!contains) superset.splice(matchIdx, 1); - return true; - }); - }); - } - - /** - * ### .members(set[, msg]) - * - * Asserts that the target array has the same members as the given array - * `set`. - * - * expect([1, 2, 3]).to.have.members([2, 1, 3]); - * expect([1, 2, 2]).to.have.members([2, 1, 2]); - * - * By default, members are compared using strict (`===`) equality. Add `.deep` - * earlier in the chain to use deep equality instead. See the `deep-eql` - * project page for info on the deep equality algorithm: - * https://github.com/chaijs/deep-eql. - * - * // Target array deeply (but not strictly) has member `{a: 1}` - * expect([{a: 1}]).to.have.deep.members([{a: 1}]); - * expect([{a: 1}]).to.not.have.members([{a: 1}]); - * - * By default, order doesn't matter. Add `.ordered` earlier in the chain to - * require that members appear in the same order. - * - * expect([1, 2, 3]).to.have.ordered.members([1, 2, 3]); - * expect([1, 2, 3]).to.have.members([2, 1, 3]) - * .but.not.ordered.members([2, 1, 3]); - * - * By default, both arrays must be the same size. Add `.include` earlier in - * the chain to require that the target's members be a superset of the - * expected members. Note that duplicates are ignored in the subset when - * `.include` is added. - * - * // Target array is a superset of [1, 2] but not identical - * expect([1, 2, 3]).to.include.members([1, 2]); - * expect([1, 2, 3]).to.not.have.members([1, 2]); - * - * // Duplicates in the subset are ignored - * expect([1, 2, 3]).to.include.members([1, 2, 2, 2]); - * - * `.deep`, `.ordered`, and `.include` can all be combined. However, if - * `.include` and `.ordered` are combined, the ordering begins at the start of - * both arrays. - * - * expect([{a: 1}, {b: 2}, {c: 3}]) - * .to.include.deep.ordered.members([{a: 1}, {b: 2}]) - * .but.not.include.deep.ordered.members([{b: 2}, {c: 3}]); - * - * Add `.not` earlier in the chain to negate `.members`. However, it's - * dangerous to do so. The problem is that it creates uncertain expectations - * by asserting that the target array doesn't have all of the same members as - * the given array `set` but may or may not have some of them. It's often best - * to identify the exact output that's expected, and then write an assertion - * that only accepts that exact output. - * - * expect([1, 2]).to.not.include(3).and.not.include(4); // Recommended - * expect([1, 2]).to.not.have.members([3, 4]); // Not recommended - * - * `.members` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. - * - * expect([1, 2]).to.have.members([1, 2, 3], 'nooo why fail??'); - * expect([1, 2], 'nooo why fail??').to.have.members([1, 2, 3]); - * - * @name members - * @param {Array} set - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - Assertion.addMethod('members', function (subset, msg) { - if (msg) flag(this, 'message', msg); - var obj = flag(this, 'object') - , flagMsg = flag(this, 'message') - , ssfi = flag(this, 'ssfi'); - - new Assertion(obj, flagMsg, ssfi, true).to.be.an('array'); - new Assertion(subset, flagMsg, ssfi, true).to.be.an('array'); - - var contains = flag(this, 'contains'); - var ordered = flag(this, 'ordered'); - - var subject, failMsg, failNegateMsg; - - if (contains) { - subject = ordered ? 'an ordered superset' : 'a superset'; - failMsg = 'expected #{this} to be ' + subject + ' of #{exp}'; - failNegateMsg = 'expected #{this} to not be ' + subject + ' of #{exp}'; - } else { - subject = ordered ? 'ordered members' : 'members'; - failMsg = 'expected #{this} to have the same ' + subject + ' as #{exp}'; - failNegateMsg = 'expected #{this} to not have the same ' + subject + ' as #{exp}'; - } - - var cmp = flag(this, 'deep') ? _.eql : undefined; - - this.assert( - isSubsetOf(subset, obj, cmp, contains, ordered) - , failMsg - , failNegateMsg - , subset - , obj - , true - ); - }); - - /** - * ### .oneOf(list[, msg]) - * - * Asserts that the target is a member of the given array `list`. However, - * it's often best to assert that the target is equal to its expected value. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.be.oneOf([1, 2, 3]); // Not recommended - * - * Comparisons are performed using strict (`===`) equality. - * - * Add `.not` earlier in the chain to negate `.oneOf`. - * - * expect(1).to.equal(1); // Recommended - * expect(1).to.not.be.oneOf([2, 3, 4]); // Not recommended - * - * `.oneOf` accepts an optional `msg` argument which is a custom error message - * to show when the assertion fails. The message can also be given as the - * second argument to `expect`. - * - * expect(1).to.be.oneOf([2, 3, 4], 'nooo why fail??'); - * expect(1, 'nooo why fail??').to.be.oneOf([2, 3, 4]); - * - * @name oneOf - * @param {Array<*>} list - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function oneOf (list, msg) { - if (msg) flag(this, 'message', msg); - var expected = flag(this, 'object') - , flagMsg = flag(this, 'message') - , ssfi = flag(this, 'ssfi'); - new Assertion(list, flagMsg, ssfi, true).to.be.an('array'); - - this.assert( - list.indexOf(expected) > -1 - , 'expected #{this} to be one of #{exp}' - , 'expected #{this} to not be one of #{exp}' - , list - , expected - ); - } - - Assertion.addMethod('oneOf', oneOf); - - /** - * ### .change(subject[, prop[, msg]]) - * - * When one argument is provided, `.change` asserts that the given function - * `subject` returns a different value when it's invoked before the target - * function compared to when it's invoked afterward. However, it's often best - * to assert that `subject` is equal to its expected value. - * - * var dots = '' - * , addDot = function () { dots += '.'; } - * , getDots = function () { return dots; }; - * - * // Recommended - * expect(getDots()).to.equal(''); - * addDot(); - * expect(getDots()).to.equal('.'); - * - * // Not recommended - * expect(addDot).to.change(getDots); - * - * When two arguments are provided, `.change` asserts that the value of the - * given object `subject`'s `prop` property is different before invoking the - * target function compared to afterward. - * - * var myObj = {dots: ''} - * , addDot = function () { myObj.dots += '.'; }; - * - * // Recommended - * expect(myObj).to.have.property('dots', ''); - * addDot(); - * expect(myObj).to.have.property('dots', '.'); - * - * // Not recommended - * expect(addDot).to.change(myObj, 'dots'); - * - * Strict (`===`) equality is used to compare before and after values. - * - * Add `.not` earlier in the chain to negate `.change`. - * - * var dots = '' - * , noop = function () {} - * , getDots = function () { return dots; }; - * - * expect(noop).to.not.change(getDots); - * - * var myObj = {dots: ''} - * , noop = function () {}; - * - * expect(noop).to.not.change(myObj, 'dots'); - * - * `.change` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. When not providing two arguments, always - * use the second form. - * - * var myObj = {dots: ''} - * , addDot = function () { myObj.dots += '.'; }; - * - * expect(addDot).to.not.change(myObj, 'dots', 'nooo why fail??'); - * - * var dots = '' - * , addDot = function () { dots += '.'; } - * , getDots = function () { return dots; }; - * - * expect(addDot, 'nooo why fail??').to.not.change(getDots); - * - * `.change` also causes all `.by` assertions that follow in the chain to - * assert how much a numeric subject was increased or decreased by. However, - * it's dangerous to use `.change.by`. The problem is that it creates - * uncertain expectations by asserting that the subject either increases by - * the given delta, or that it decreases by the given delta. It's often best - * to identify the exact output that's expected, and then write an assertion - * that only accepts that exact output. - * - * var myObj = {val: 1} - * , addTwo = function () { myObj.val += 2; } - * , subtractTwo = function () { myObj.val -= 2; }; - * - * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended - * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended - * - * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended - * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended - * - * The alias `.changes` can be used interchangeably with `.change`. - * - * @name change - * @alias changes - * @param {String} subject - * @param {String} prop name _optional_ - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertChanges (subject, prop, msg) { - if (msg) flag(this, 'message', msg); - var fn = flag(this, 'object') - , flagMsg = flag(this, 'message') - , ssfi = flag(this, 'ssfi'); - new Assertion(fn, flagMsg, ssfi, true).is.a('function'); - - var initial; - if (!prop) { - new Assertion(subject, flagMsg, ssfi, true).is.a('function'); - initial = subject(); - } else { - new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); - initial = subject[prop]; - } - - fn(); - - var final = prop === undefined || prop === null ? subject() : subject[prop]; - var msgObj = prop === undefined || prop === null ? initial : '.' + prop; - - // This gets flagged because of the .by(delta) assertion - flag(this, 'deltaMsgObj', msgObj); - flag(this, 'initialDeltaValue', initial); - flag(this, 'finalDeltaValue', final); - flag(this, 'deltaBehavior', 'change'); - flag(this, 'realDelta', final !== initial); - - this.assert( - initial !== final - , 'expected ' + msgObj + ' to change' - , 'expected ' + msgObj + ' to not change' - ); - } - - Assertion.addMethod('change', assertChanges); - Assertion.addMethod('changes', assertChanges); - - /** - * ### .increase(subject[, prop[, msg]]) - * - * When one argument is provided, `.increase` asserts that the given function - * `subject` returns a greater number when it's invoked after invoking the - * target function compared to when it's invoked beforehand. `.increase` also - * causes all `.by` assertions that follow in the chain to assert how much - * greater of a number is returned. It's often best to assert that the return - * value increased by the expected amount, rather than asserting it increased - * by any amount. - * - * var val = 1 - * , addTwo = function () { val += 2; } - * , getVal = function () { return val; }; - * - * expect(addTwo).to.increase(getVal).by(2); // Recommended - * expect(addTwo).to.increase(getVal); // Not recommended - * - * When two arguments are provided, `.increase` asserts that the value of the - * given object `subject`'s `prop` property is greater after invoking the - * target function compared to beforehand. - * - * var myObj = {val: 1} - * , addTwo = function () { myObj.val += 2; }; - * - * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended - * expect(addTwo).to.increase(myObj, 'val'); // Not recommended - * - * Add `.not` earlier in the chain to negate `.increase`. However, it's - * dangerous to do so. The problem is that it creates uncertain expectations - * by asserting that the subject either decreases, or that it stays the same. - * It's often best to identify the exact output that's expected, and then - * write an assertion that only accepts that exact output. - * - * When the subject is expected to decrease, it's often best to assert that it - * decreased by the expected amount. - * - * var myObj = {val: 1} - * , subtractTwo = function () { myObj.val -= 2; }; - * - * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended - * expect(subtractTwo).to.not.increase(myObj, 'val'); // Not recommended - * - * When the subject is expected to stay the same, it's often best to assert - * exactly that. - * - * var myObj = {val: 1} - * , noop = function () {}; - * - * expect(noop).to.not.change(myObj, 'val'); // Recommended - * expect(noop).to.not.increase(myObj, 'val'); // Not recommended - * - * `.increase` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. When not providing two arguments, always - * use the second form. - * - * var myObj = {val: 1} - * , noop = function () {}; - * - * expect(noop).to.increase(myObj, 'val', 'nooo why fail??'); - * - * var val = 1 - * , noop = function () {} - * , getVal = function () { return val; }; - * - * expect(noop, 'nooo why fail??').to.increase(getVal); - * - * The alias `.increases` can be used interchangeably with `.increase`. - * - * @name increase - * @alias increases - * @param {String|Function} subject - * @param {String} prop name _optional_ - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertIncreases (subject, prop, msg) { - if (msg) flag(this, 'message', msg); - var fn = flag(this, 'object') - , flagMsg = flag(this, 'message') - , ssfi = flag(this, 'ssfi'); - new Assertion(fn, flagMsg, ssfi, true).is.a('function'); - - var initial; - if (!prop) { - new Assertion(subject, flagMsg, ssfi, true).is.a('function'); - initial = subject(); - } else { - new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); - initial = subject[prop]; - } - - // Make sure that the target is a number - new Assertion(initial, flagMsg, ssfi, true).is.a('number'); - - fn(); - - var final = prop === undefined || prop === null ? subject() : subject[prop]; - var msgObj = prop === undefined || prop === null ? initial : '.' + prop; - - flag(this, 'deltaMsgObj', msgObj); - flag(this, 'initialDeltaValue', initial); - flag(this, 'finalDeltaValue', final); - flag(this, 'deltaBehavior', 'increase'); - flag(this, 'realDelta', final - initial); - - this.assert( - final - initial > 0 - , 'expected ' + msgObj + ' to increase' - , 'expected ' + msgObj + ' to not increase' - ); - } - - Assertion.addMethod('increase', assertIncreases); - Assertion.addMethod('increases', assertIncreases); - - /** - * ### .decrease(subject[, prop[, msg]]) - * - * When one argument is provided, `.decrease` asserts that the given function - * `subject` returns a lesser number when it's invoked after invoking the - * target function compared to when it's invoked beforehand. `.decrease` also - * causes all `.by` assertions that follow in the chain to assert how much - * lesser of a number is returned. It's often best to assert that the return - * value decreased by the expected amount, rather than asserting it decreased - * by any amount. - * - * var val = 1 - * , subtractTwo = function () { val -= 2; } - * , getVal = function () { return val; }; - * - * expect(subtractTwo).to.decrease(getVal).by(2); // Recommended - * expect(subtractTwo).to.decrease(getVal); // Not recommended - * - * When two arguments are provided, `.decrease` asserts that the value of the - * given object `subject`'s `prop` property is lesser after invoking the - * target function compared to beforehand. - * - * var myObj = {val: 1} - * , subtractTwo = function () { myObj.val -= 2; }; - * - * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended - * expect(subtractTwo).to.decrease(myObj, 'val'); // Not recommended - * - * Add `.not` earlier in the chain to negate `.decrease`. However, it's - * dangerous to do so. The problem is that it creates uncertain expectations - * by asserting that the subject either increases, or that it stays the same. - * It's often best to identify the exact output that's expected, and then - * write an assertion that only accepts that exact output. - * - * When the subject is expected to increase, it's often best to assert that it - * increased by the expected amount. - * - * var myObj = {val: 1} - * , addTwo = function () { myObj.val += 2; }; - * - * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended - * expect(addTwo).to.not.decrease(myObj, 'val'); // Not recommended - * - * When the subject is expected to stay the same, it's often best to assert - * exactly that. - * - * var myObj = {val: 1} - * , noop = function () {}; - * - * expect(noop).to.not.change(myObj, 'val'); // Recommended - * expect(noop).to.not.decrease(myObj, 'val'); // Not recommended - * - * `.decrease` accepts an optional `msg` argument which is a custom error - * message to show when the assertion fails. The message can also be given as - * the second argument to `expect`. When not providing two arguments, always - * use the second form. - * - * var myObj = {val: 1} - * , noop = function () {}; - * - * expect(noop).to.decrease(myObj, 'val', 'nooo why fail??'); - * - * var val = 1 - * , noop = function () {} - * , getVal = function () { return val; }; - * - * expect(noop, 'nooo why fail??').to.decrease(getVal); - * - * The alias `.decreases` can be used interchangeably with `.decrease`. - * - * @name decrease - * @alias decreases - * @param {String|Function} subject - * @param {String} prop name _optional_ - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertDecreases (subject, prop, msg) { - if (msg) flag(this, 'message', msg); - var fn = flag(this, 'object') - , flagMsg = flag(this, 'message') - , ssfi = flag(this, 'ssfi'); - new Assertion(fn, flagMsg, ssfi, true).is.a('function'); - - var initial; - if (!prop) { - new Assertion(subject, flagMsg, ssfi, true).is.a('function'); - initial = subject(); - } else { - new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop); - initial = subject[prop]; - } - - // Make sure that the target is a number - new Assertion(initial, flagMsg, ssfi, true).is.a('number'); - - fn(); - - var final = prop === undefined || prop === null ? subject() : subject[prop]; - var msgObj = prop === undefined || prop === null ? initial : '.' + prop; - - flag(this, 'deltaMsgObj', msgObj); - flag(this, 'initialDeltaValue', initial); - flag(this, 'finalDeltaValue', final); - flag(this, 'deltaBehavior', 'decrease'); - flag(this, 'realDelta', initial - final); - - this.assert( - final - initial < 0 - , 'expected ' + msgObj + ' to decrease' - , 'expected ' + msgObj + ' to not decrease' - ); - } - - Assertion.addMethod('decrease', assertDecreases); - Assertion.addMethod('decreases', assertDecreases); - - /** - * ### .by(delta[, msg]) - * - * When following an `.increase` assertion in the chain, `.by` asserts that - * the subject of the `.increase` assertion increased by the given `delta`. - * - * var myObj = {val: 1} - * , addTwo = function () { myObj.val += 2; }; - * - * expect(addTwo).to.increase(myObj, 'val').by(2); - * - * When following a `.decrease` assertion in the chain, `.by` asserts that the - * subject of the `.decrease` assertion decreased by the given `delta`. - * - * var myObj = {val: 1} - * , subtractTwo = function () { myObj.val -= 2; }; - * - * expect(subtractTwo).to.decrease(myObj, 'val').by(2); - * - * When following a `.change` assertion in the chain, `.by` asserts that the - * subject of the `.change` assertion either increased or decreased by the - * given `delta`. However, it's dangerous to use `.change.by`. The problem is - * that it creates uncertain expectations. It's often best to identify the - * exact output that's expected, and then write an assertion that only accepts - * that exact output. - * - * var myObj = {val: 1} - * , addTwo = function () { myObj.val += 2; } - * , subtractTwo = function () { myObj.val -= 2; }; - * - * expect(addTwo).to.increase(myObj, 'val').by(2); // Recommended - * expect(addTwo).to.change(myObj, 'val').by(2); // Not recommended - * - * expect(subtractTwo).to.decrease(myObj, 'val').by(2); // Recommended - * expect(subtractTwo).to.change(myObj, 'val').by(2); // Not recommended - * - * Add `.not` earlier in the chain to negate `.by`. However, it's often best - * to assert that the subject changed by its expected delta, rather than - * asserting that it didn't change by one of countless unexpected deltas. - * - * var myObj = {val: 1} - * , addTwo = function () { myObj.val += 2; }; - * - * // Recommended - * expect(addTwo).to.increase(myObj, 'val').by(2); - * - * // Not recommended - * expect(addTwo).to.increase(myObj, 'val').but.not.by(3); - * - * `.by` accepts an optional `msg` argument which is a custom error message to - * show when the assertion fails. The message can also be given as the second - * argument to `expect`. - * - * var myObj = {val: 1} - * , addTwo = function () { myObj.val += 2; }; - * - * expect(addTwo).to.increase(myObj, 'val').by(3, 'nooo why fail??'); - * expect(addTwo, 'nooo why fail??').to.increase(myObj, 'val').by(3); - * - * @name by - * @param {Number} delta - * @param {String} msg _optional_ - * @namespace BDD - * @api public - */ - - function assertDelta(delta, msg) { - if (msg) flag(this, 'message', msg); - - var msgObj = flag(this, 'deltaMsgObj'); - var initial = flag(this, 'initialDeltaValue'); - var final = flag(this, 'finalDeltaValue'); - var behavior = flag(this, 'deltaBehavior'); - var realDelta = flag(this, 'realDelta'); - - var expression; - if (behavior === 'change') { - expression = Math.abs(final - initial) === Math.abs(delta); - } else { - expression = realDelta === Math.abs(delta); - } - - this.assert( - expression - , 'expected ' + msgObj + ' to ' + behavior + ' by ' + delta - , 'expected ' + msgObj + ' to not ' + behavior + ' by ' + delta - ); - } - - Assertion.addMethod('by', assertDelta); - - /** - * ### .extensible - * - * Asserts that the target is extensible, which means that new properties can - * be added to it. Primitives are never extensible. - * - * expect({a: 1}).to.be.extensible; - * - * Add `.not` earlier in the chain to negate `.extensible`. - * - * var nonExtensibleObject = Object.preventExtensions({}) - * , sealedObject = Object.seal({}) - * , frozenObject = Object.freeze({}); - * - * expect(nonExtensibleObject).to.not.be.extensible; - * expect(sealedObject).to.not.be.extensible; - * expect(frozenObject).to.not.be.extensible; - * expect(1).to.not.be.extensible; - * - * A custom error message can be given as the second argument to `expect`. - * - * expect(1, 'nooo why fail??').to.be.extensible; - * - * @name extensible - * @namespace BDD - * @api public - */ - - Assertion.addProperty('extensible', function() { - var obj = flag(this, 'object'); - - // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. - // In ES6, a non-object argument will be treated as if it was a non-extensible ordinary object, simply return false. - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible - // The following provides ES6 behavior for ES5 environments. - - var isExtensible = obj === Object(obj) && Object.isExtensible(obj); - - this.assert( - isExtensible - , 'expected #{this} to be extensible' - , 'expected #{this} to not be extensible' - ); - }); - - /** - * ### .sealed - * - * Asserts that the target is sealed, which means that new properties can't be - * added to it, and its existing properties can't be reconfigured or deleted. - * However, it's possible that its existing properties can still be reassigned - * to different values. Primitives are always sealed. - * - * var sealedObject = Object.seal({}); - * var frozenObject = Object.freeze({}); - * - * expect(sealedObject).to.be.sealed; - * expect(frozenObject).to.be.sealed; - * expect(1).to.be.sealed; - * - * Add `.not` earlier in the chain to negate `.sealed`. - * - * expect({a: 1}).to.not.be.sealed; - * - * A custom error message can be given as the second argument to `expect`. - * - * expect({a: 1}, 'nooo why fail??').to.be.sealed; - * - * @name sealed - * @namespace BDD - * @api public - */ - - Assertion.addProperty('sealed', function() { - var obj = flag(this, 'object'); - - // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. - // In ES6, a non-object argument will be treated as if it was a sealed ordinary object, simply return true. - // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed - // The following provides ES6 behavior for ES5 environments. - - var isSealed = obj === Object(obj) ? Object.isSealed(obj) : true; - - this.assert( - isSealed - , 'expected #{this} to be sealed' - , 'expected #{this} to not be sealed' - ); - }); - - /** - * ### .frozen - * - * Asserts that the target is frozen, which means that new properties can't be - * added to it, and its existing properties can't be reassigned to different - * values, reconfigured, or deleted. Primitives are always frozen. - * - * var frozenObject = Object.freeze({}); - * - * expect(frozenObject).to.be.frozen; - * expect(1).to.be.frozen; - * - * Add `.not` earlier in the chain to negate `.frozen`. - * - * expect({a: 1}).to.not.be.frozen; - * - * A custom error message can be given as the second argument to `expect`. - * - * expect({a: 1}, 'nooo why fail??').to.be.frozen; - * - * @name frozen - * @namespace BDD - * @api public - */ - - Assertion.addProperty('frozen', function() { - var obj = flag(this, 'object'); - - // In ES5, if the argument to this method is a primitive, then it will cause a TypeError. - // In ES6, a non-object argument will be treated as if it was a frozen ordinary object, simply return true. - // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen - // The following provides ES6 behavior for ES5 environments. - - var isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true; - - this.assert( - isFrozen - , 'expected #{this} to be frozen' - , 'expected #{this} to not be frozen' - ); - }); - - /** - * ### .finite - * - * Asserts that the target is a number, and isn't `NaN` or positive/negative - * `Infinity`. - * - * expect(1).to.be.finite; - * - * Add `.not` earlier in the chain to negate `.finite`. However, it's - * dangerous to do so. The problem is that it creates uncertain expectations - * by asserting that the subject either isn't a number, or that it's `NaN`, or - * that it's positive `Infinity`, or that it's negative `Infinity`. It's often - * best to identify the exact output that's expected, and then write an - * assertion that only accepts that exact output. - * - * When the target isn't expected to be a number, it's often best to assert - * that it's the expected type, rather than asserting that it isn't one of - * many unexpected types. - * - * expect('foo').to.be.a('string'); // Recommended - * expect('foo').to.not.be.finite; // Not recommended - * - * When the target is expected to be `NaN`, it's often best to assert exactly - * that. - * - * expect(NaN).to.be.NaN; // Recommended - * expect(NaN).to.not.be.finite; // Not recommended - * - * When the target is expected to be positive infinity, it's often best to - * assert exactly that. - * - * expect(Infinity).to.equal(Infinity); // Recommended - * expect(Infinity).to.not.be.finite; // Not recommended - * - * When the target is expected to be negative infinity, it's often best to - * assert exactly that. - * - * expect(-Infinity).to.equal(-Infinity); // Recommended - * expect(-Infinity).to.not.be.finite; // Not recommended - * - * A custom error message can be given as the second argument to `expect`. - * - * expect('foo', 'nooo why fail??').to.be.finite; - * - * @name finite - * @namespace BDD - * @api public - */ - - Assertion.addProperty('finite', function(msg) { - var obj = flag(this, 'object'); - - this.assert( - typeof obj === 'number' && isFinite(obj) - , 'expected #{this} to be a finite number' - , 'expected #{this} to not be a finite number' - ); - }); - }; - - /*! - * chai - * Copyright(c) 2011-2014 Jake Luer - * MIT Licensed - */ - - var expect = function (chai, util) { - chai.expect = function (val, message) { - return new chai.Assertion(val, message); - }; - - /** - * ### .fail([message]) - * ### .fail(actual, expected, [message], [operator]) - * - * Throw a failure. - * - * expect.fail(); - * expect.fail("custom error message"); - * expect.fail(1, 2); - * expect.fail(1, 2, "custom error message"); - * expect.fail(1, 2, "custom error message", ">"); - * expect.fail(1, 2, undefined, ">"); - * - * @name fail - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @param {String} operator - * @namespace BDD - * @api public - */ - - chai.expect.fail = function (actual, expected, message, operator) { - if (arguments.length < 2) { - message = actual; - actual = undefined; - } - - message = message || 'expect.fail()'; - throw new chai.AssertionError(message, { - actual: actual - , expected: expected - , operator: operator - }, chai.expect.fail); - }; - }; - - /*! - * chai - * Copyright(c) 2011-2014 Jake Luer - * MIT Licensed - */ - - var should = function (chai, util) { - var Assertion = chai.Assertion; - - function loadShould () { - // explicitly define this method as function as to have it's name to include as `ssfi` - function shouldGetter() { - if (this instanceof String - || this instanceof Number - || this instanceof Boolean - || typeof Symbol === 'function' && this instanceof Symbol) { - return new Assertion(this.valueOf(), null, shouldGetter); - } - return new Assertion(this, null, shouldGetter); - } - function shouldSetter(value) { - // See https://github.com/chaijs/chai/issues/86: this makes - // `whatever.should = someValue` actually set `someValue`, which is - // especially useful for `global.should = require('chai').should()`. - // - // Note that we have to use [[DefineProperty]] instead of [[Put]] - // since otherwise we would trigger this very setter! - Object.defineProperty(this, 'should', { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } - // modify Object.prototype to have `should` - Object.defineProperty(Object.prototype, 'should', { - set: shouldSetter - , get: shouldGetter - , configurable: true - }); - - var should = {}; - - /** - * ### .fail([message]) - * ### .fail(actual, expected, [message], [operator]) - * - * Throw a failure. - * - * should.fail(); - * should.fail("custom error message"); - * should.fail(1, 2); - * should.fail(1, 2, "custom error message"); - * should.fail(1, 2, "custom error message", ">"); - * should.fail(1, 2, undefined, ">"); - * - * - * @name fail - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @param {String} operator - * @namespace BDD - * @api public - */ - - should.fail = function (actual, expected, message, operator) { - if (arguments.length < 2) { - message = actual; - actual = undefined; - } - - message = message || 'should.fail()'; - throw new chai.AssertionError(message, { - actual: actual - , expected: expected - , operator: operator - }, should.fail); - }; - - /** - * ### .equal(actual, expected, [message]) - * - * Asserts non-strict equality (`==`) of `actual` and `expected`. - * - * should.equal(3, '3', '== coerces values to strings'); - * - * @name equal - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @namespace Should - * @api public - */ - - should.equal = function (val1, val2, msg) { - new Assertion(val1, msg).to.equal(val2); - }; - - /** - * ### .throw(function, [constructor/string/regexp], [string/regexp], [message]) - * - * Asserts that `function` will throw an error that is an instance of - * `constructor`, or alternately that it will throw an error with message - * matching `regexp`. - * - * should.throw(fn, 'function throws a reference error'); - * should.throw(fn, /function throws a reference error/); - * should.throw(fn, ReferenceError); - * should.throw(fn, ReferenceError, 'function throws a reference error'); - * should.throw(fn, ReferenceError, /function throws a reference error/); - * - * @name throw - * @alias Throw - * @param {Function} function - * @param {ErrorConstructor} constructor - * @param {RegExp} regexp - * @param {String} message - * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types - * @namespace Should - * @api public - */ - - should.Throw = function (fn, errt, errs, msg) { - new Assertion(fn, msg).to.Throw(errt, errs); - }; - - /** - * ### .exist - * - * Asserts that the target is neither `null` nor `undefined`. - * - * var foo = 'hi'; - * - * should.exist(foo, 'foo exists'); - * - * @name exist - * @namespace Should - * @api public - */ - - should.exist = function (val, msg) { - new Assertion(val, msg).to.exist; - }; - - // negation - should.not = {}; - - /** - * ### .not.equal(actual, expected, [message]) - * - * Asserts non-strict inequality (`!=`) of `actual` and `expected`. - * - * should.not.equal(3, 4, 'these numbers are not equal'); - * - * @name not.equal - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @namespace Should - * @api public - */ - - should.not.equal = function (val1, val2, msg) { - new Assertion(val1, msg).to.not.equal(val2); - }; - - /** - * ### .throw(function, [constructor/regexp], [message]) - * - * Asserts that `function` will _not_ throw an error that is an instance of - * `constructor`, or alternately that it will not throw an error with message - * matching `regexp`. - * - * should.not.throw(fn, Error, 'function does not throw'); - * - * @name not.throw - * @alias not.Throw - * @param {Function} function - * @param {ErrorConstructor} constructor - * @param {RegExp} regexp - * @param {String} message - * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types - * @namespace Should - * @api public - */ - - should.not.Throw = function (fn, errt, errs, msg) { - new Assertion(fn, msg).to.not.Throw(errt, errs); - }; - - /** - * ### .not.exist - * - * Asserts that the target is neither `null` nor `undefined`. - * - * var bar = null; - * - * should.not.exist(bar, 'bar does not exist'); - * - * @name not.exist - * @namespace Should - * @api public - */ - - should.not.exist = function (val, msg) { - new Assertion(val, msg).to.not.exist; - }; - - should['throw'] = should['Throw']; - should.not['throw'] = should.not['Throw']; - - return should; - } - chai.should = loadShould; - chai.Should = loadShould; - }; - - /*! - * chai - * Copyright(c) 2011-2014 Jake Luer - * MIT Licensed - */ - - var assert = function (chai, util) { - /*! - * Chai dependencies. - */ - - var Assertion = chai.Assertion - , flag = util.flag; - - /*! - * Module export. - */ - - /** - * ### assert(expression, message) - * - * Write your own test expressions. - * - * assert('foo' !== 'bar', 'foo is not bar'); - * assert(Array.isArray([]), 'empty arrays are arrays'); - * - * @param {Mixed} expression to test for truthiness - * @param {String} message to display on error - * @name assert - * @namespace Assert - * @api public - */ - - var assert = chai.assert = function (express, errmsg) { - var test = new Assertion(null, null, chai.assert, true); - test.assert( - express - , errmsg - , '[ negation message unavailable ]' - ); - }; - - /** - * ### .fail([message]) - * ### .fail(actual, expected, [message], [operator]) - * - * Throw a failure. Node.js `assert` module-compatible. - * - * assert.fail(); - * assert.fail("custom error message"); - * assert.fail(1, 2); - * assert.fail(1, 2, "custom error message"); - * assert.fail(1, 2, "custom error message", ">"); - * assert.fail(1, 2, undefined, ">"); - * - * @name fail - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @param {String} operator - * @namespace Assert - * @api public - */ - - assert.fail = function (actual, expected, message, operator) { - if (arguments.length < 2) { - // Comply with Node's fail([message]) interface - - message = actual; - actual = undefined; - } - - message = message || 'assert.fail()'; - throw new chai.AssertionError(message, { - actual: actual - , expected: expected - , operator: operator - }, assert.fail); - }; - - /** - * ### .isOk(object, [message]) - * - * Asserts that `object` is truthy. - * - * assert.isOk('everything', 'everything is ok'); - * assert.isOk(false, 'this will fail'); - * - * @name isOk - * @alias ok - * @param {Mixed} object to test - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isOk = function (val, msg) { - new Assertion(val, msg, assert.isOk, true).is.ok; - }; - - /** - * ### .isNotOk(object, [message]) - * - * Asserts that `object` is falsy. - * - * assert.isNotOk('everything', 'this will fail'); - * assert.isNotOk(false, 'this will pass'); - * - * @name isNotOk - * @alias notOk - * @param {Mixed} object to test - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotOk = function (val, msg) { - new Assertion(val, msg, assert.isNotOk, true).is.not.ok; - }; - - /** - * ### .equal(actual, expected, [message]) - * - * Asserts non-strict equality (`==`) of `actual` and `expected`. - * - * assert.equal(3, '3', '== coerces values to strings'); - * - * @name equal - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.equal = function (act, exp, msg) { - var test = new Assertion(act, msg, assert.equal, true); - - test.assert( - exp == flag(test, 'object') - , 'expected #{this} to equal #{exp}' - , 'expected #{this} to not equal #{act}' - , exp - , act - , true - ); - }; - - /** - * ### .notEqual(actual, expected, [message]) - * - * Asserts non-strict inequality (`!=`) of `actual` and `expected`. - * - * assert.notEqual(3, 4, 'these numbers are not equal'); - * - * @name notEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notEqual = function (act, exp, msg) { - var test = new Assertion(act, msg, assert.notEqual, true); - - test.assert( - exp != flag(test, 'object') - , 'expected #{this} to not equal #{exp}' - , 'expected #{this} to equal #{act}' - , exp - , act - , true - ); - }; - - /** - * ### .strictEqual(actual, expected, [message]) - * - * Asserts strict equality (`===`) of `actual` and `expected`. - * - * assert.strictEqual(true, true, 'these booleans are strictly equal'); - * - * @name strictEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.strictEqual = function (act, exp, msg) { - new Assertion(act, msg, assert.strictEqual, true).to.equal(exp); - }; - - /** - * ### .notStrictEqual(actual, expected, [message]) - * - * Asserts strict inequality (`!==`) of `actual` and `expected`. - * - * assert.notStrictEqual(3, '3', 'no coercion for strict equality'); - * - * @name notStrictEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notStrictEqual = function (act, exp, msg) { - new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp); - }; - - /** - * ### .deepEqual(actual, expected, [message]) - * - * Asserts that `actual` is deeply equal to `expected`. - * - * assert.deepEqual({ tea: 'green' }, { tea: 'green' }); - * - * @name deepEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @alias deepStrictEqual - * @namespace Assert - * @api public - */ - - assert.deepEqual = assert.deepStrictEqual = function (act, exp, msg) { - new Assertion(act, msg, assert.deepEqual, true).to.eql(exp); - }; - - /** - * ### .notDeepEqual(actual, expected, [message]) - * - * Assert that `actual` is not deeply equal to `expected`. - * - * assert.notDeepEqual({ tea: 'green' }, { tea: 'jasmine' }); - * - * @name notDeepEqual - * @param {Mixed} actual - * @param {Mixed} expected - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notDeepEqual = function (act, exp, msg) { - new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp); - }; - - /** - * ### .isAbove(valueToCheck, valueToBeAbove, [message]) - * - * Asserts `valueToCheck` is strictly greater than (>) `valueToBeAbove`. - * - * assert.isAbove(5, 2, '5 is strictly greater than 2'); - * - * @name isAbove - * @param {Mixed} valueToCheck - * @param {Mixed} valueToBeAbove - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isAbove = function (val, abv, msg) { - new Assertion(val, msg, assert.isAbove, true).to.be.above(abv); - }; - - /** - * ### .isAtLeast(valueToCheck, valueToBeAtLeast, [message]) - * - * Asserts `valueToCheck` is greater than or equal to (>=) `valueToBeAtLeast`. - * - * assert.isAtLeast(5, 2, '5 is greater or equal to 2'); - * assert.isAtLeast(3, 3, '3 is greater or equal to 3'); - * - * @name isAtLeast - * @param {Mixed} valueToCheck - * @param {Mixed} valueToBeAtLeast - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isAtLeast = function (val, atlst, msg) { - new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst); - }; - - /** - * ### .isBelow(valueToCheck, valueToBeBelow, [message]) - * - * Asserts `valueToCheck` is strictly less than (<) `valueToBeBelow`. - * - * assert.isBelow(3, 6, '3 is strictly less than 6'); - * - * @name isBelow - * @param {Mixed} valueToCheck - * @param {Mixed} valueToBeBelow - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isBelow = function (val, blw, msg) { - new Assertion(val, msg, assert.isBelow, true).to.be.below(blw); - }; - - /** - * ### .isAtMost(valueToCheck, valueToBeAtMost, [message]) - * - * Asserts `valueToCheck` is less than or equal to (<=) `valueToBeAtMost`. - * - * assert.isAtMost(3, 6, '3 is less than or equal to 6'); - * assert.isAtMost(4, 4, '4 is less than or equal to 4'); - * - * @name isAtMost - * @param {Mixed} valueToCheck - * @param {Mixed} valueToBeAtMost - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isAtMost = function (val, atmst, msg) { - new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst); - }; - - /** - * ### .isTrue(value, [message]) - * - * Asserts that `value` is true. - * - * var teaServed = true; - * assert.isTrue(teaServed, 'the tea has been served'); - * - * @name isTrue - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isTrue = function (val, msg) { - new Assertion(val, msg, assert.isTrue, true).is['true']; - }; - - /** - * ### .isNotTrue(value, [message]) - * - * Asserts that `value` is not true. - * - * var tea = 'tasty chai'; - * assert.isNotTrue(tea, 'great, time for tea!'); - * - * @name isNotTrue - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotTrue = function (val, msg) { - new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true); - }; - - /** - * ### .isFalse(value, [message]) - * - * Asserts that `value` is false. - * - * var teaServed = false; - * assert.isFalse(teaServed, 'no tea yet? hmm...'); - * - * @name isFalse - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isFalse = function (val, msg) { - new Assertion(val, msg, assert.isFalse, true).is['false']; - }; - - /** - * ### .isNotFalse(value, [message]) - * - * Asserts that `value` is not false. - * - * var tea = 'tasty chai'; - * assert.isNotFalse(tea, 'great, time for tea!'); - * - * @name isNotFalse - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotFalse = function (val, msg) { - new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false); - }; - - /** - * ### .isNull(value, [message]) - * - * Asserts that `value` is null. - * - * assert.isNull(err, 'there was no error'); - * - * @name isNull - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNull = function (val, msg) { - new Assertion(val, msg, assert.isNull, true).to.equal(null); - }; - - /** - * ### .isNotNull(value, [message]) - * - * Asserts that `value` is not null. - * - * var tea = 'tasty chai'; - * assert.isNotNull(tea, 'great, time for tea!'); - * - * @name isNotNull - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotNull = function (val, msg) { - new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null); - }; - - /** - * ### .isNaN - * - * Asserts that value is NaN. - * - * assert.isNaN(NaN, 'NaN is NaN'); - * - * @name isNaN - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNaN = function (val, msg) { - new Assertion(val, msg, assert.isNaN, true).to.be.NaN; - }; - - /** - * ### .isNotNaN - * - * Asserts that value is not NaN. - * - * assert.isNotNaN(4, '4 is not NaN'); - * - * @name isNotNaN - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - assert.isNotNaN = function (val, msg) { - new Assertion(val, msg, assert.isNotNaN, true).not.to.be.NaN; - }; - - /** - * ### .exists - * - * Asserts that the target is neither `null` nor `undefined`. - * - * var foo = 'hi'; - * - * assert.exists(foo, 'foo is neither `null` nor `undefined`'); - * - * @name exists - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.exists = function (val, msg) { - new Assertion(val, msg, assert.exists, true).to.exist; - }; - - /** - * ### .notExists - * - * Asserts that the target is either `null` or `undefined`. - * - * var bar = null - * , baz; - * - * assert.notExists(bar); - * assert.notExists(baz, 'baz is either null or undefined'); - * - * @name notExists - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notExists = function (val, msg) { - new Assertion(val, msg, assert.notExists, true).to.not.exist; - }; - - /** - * ### .isUndefined(value, [message]) - * - * Asserts that `value` is `undefined`. - * - * var tea; - * assert.isUndefined(tea, 'no tea defined'); - * - * @name isUndefined - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isUndefined = function (val, msg) { - new Assertion(val, msg, assert.isUndefined, true).to.equal(undefined); - }; - - /** - * ### .isDefined(value, [message]) - * - * Asserts that `value` is not `undefined`. - * - * var tea = 'cup of chai'; - * assert.isDefined(tea, 'tea has been defined'); - * - * @name isDefined - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isDefined = function (val, msg) { - new Assertion(val, msg, assert.isDefined, true).to.not.equal(undefined); - }; - - /** - * ### .isFunction(value, [message]) - * - * Asserts that `value` is a function. - * - * function serveTea() { return 'cup of tea'; }; - * assert.isFunction(serveTea, 'great, we can have tea now'); - * - * @name isFunction - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isFunction = function (val, msg) { - new Assertion(val, msg, assert.isFunction, true).to.be.a('function'); - }; - - /** - * ### .isNotFunction(value, [message]) - * - * Asserts that `value` is _not_ a function. - * - * var serveTea = [ 'heat', 'pour', 'sip' ]; - * assert.isNotFunction(serveTea, 'great, we have listed the steps'); - * - * @name isNotFunction - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotFunction = function (val, msg) { - new Assertion(val, msg, assert.isNotFunction, true).to.not.be.a('function'); - }; - - /** - * ### .isObject(value, [message]) - * - * Asserts that `value` is an object of type 'Object' (as revealed by `Object.prototype.toString`). - * _The assertion does not match subclassed objects._ - * - * var selection = { name: 'Chai', serve: 'with spices' }; - * assert.isObject(selection, 'tea selection is an object'); - * - * @name isObject - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isObject = function (val, msg) { - new Assertion(val, msg, assert.isObject, true).to.be.a('object'); - }; - - /** - * ### .isNotObject(value, [message]) - * - * Asserts that `value` is _not_ an object of type 'Object' (as revealed by `Object.prototype.toString`). - * - * var selection = 'chai' - * assert.isNotObject(selection, 'tea selection is not an object'); - * assert.isNotObject(null, 'null is not an object'); - * - * @name isNotObject - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotObject = function (val, msg) { - new Assertion(val, msg, assert.isNotObject, true).to.not.be.a('object'); - }; - - /** - * ### .isArray(value, [message]) - * - * Asserts that `value` is an array. - * - * var menu = [ 'green', 'chai', 'oolong' ]; - * assert.isArray(menu, 'what kind of tea do we want?'); - * - * @name isArray - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isArray = function (val, msg) { - new Assertion(val, msg, assert.isArray, true).to.be.an('array'); - }; - - /** - * ### .isNotArray(value, [message]) - * - * Asserts that `value` is _not_ an array. - * - * var menu = 'green|chai|oolong'; - * assert.isNotArray(menu, 'what kind of tea do we want?'); - * - * @name isNotArray - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotArray = function (val, msg) { - new Assertion(val, msg, assert.isNotArray, true).to.not.be.an('array'); - }; - - /** - * ### .isString(value, [message]) - * - * Asserts that `value` is a string. - * - * var teaOrder = 'chai'; - * assert.isString(teaOrder, 'order placed'); - * - * @name isString - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isString = function (val, msg) { - new Assertion(val, msg, assert.isString, true).to.be.a('string'); - }; - - /** - * ### .isNotString(value, [message]) - * - * Asserts that `value` is _not_ a string. - * - * var teaOrder = 4; - * assert.isNotString(teaOrder, 'order placed'); - * - * @name isNotString - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotString = function (val, msg) { - new Assertion(val, msg, assert.isNotString, true).to.not.be.a('string'); - }; - - /** - * ### .isNumber(value, [message]) - * - * Asserts that `value` is a number. - * - * var cups = 2; - * assert.isNumber(cups, 'how many cups'); - * - * @name isNumber - * @param {Number} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNumber = function (val, msg) { - new Assertion(val, msg, assert.isNumber, true).to.be.a('number'); - }; - - /** - * ### .isNotNumber(value, [message]) - * - * Asserts that `value` is _not_ a number. - * - * var cups = '2 cups please'; - * assert.isNotNumber(cups, 'how many cups'); - * - * @name isNotNumber - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotNumber = function (val, msg) { - new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a('number'); - }; - - /** - * ### .isFinite(value, [message]) - * - * Asserts that `value` is a finite number. Unlike `.isNumber`, this will fail for `NaN` and `Infinity`. - * - * var cups = 2; - * assert.isFinite(cups, 'how many cups'); - * - * assert.isFinite(NaN); // throws - * - * @name isFinite - * @param {Number} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isFinite = function (val, msg) { - new Assertion(val, msg, assert.isFinite, true).to.be.finite; - }; - - /** - * ### .isBoolean(value, [message]) - * - * Asserts that `value` is a boolean. - * - * var teaReady = true - * , teaServed = false; - * - * assert.isBoolean(teaReady, 'is the tea ready'); - * assert.isBoolean(teaServed, 'has tea been served'); - * - * @name isBoolean - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isBoolean = function (val, msg) { - new Assertion(val, msg, assert.isBoolean, true).to.be.a('boolean'); - }; - - /** - * ### .isNotBoolean(value, [message]) - * - * Asserts that `value` is _not_ a boolean. - * - * var teaReady = 'yep' - * , teaServed = 'nope'; - * - * assert.isNotBoolean(teaReady, 'is the tea ready'); - * assert.isNotBoolean(teaServed, 'has tea been served'); - * - * @name isNotBoolean - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.isNotBoolean = function (val, msg) { - new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a('boolean'); - }; - - /** - * ### .typeOf(value, name, [message]) - * - * Asserts that `value`'s type is `name`, as determined by - * `Object.prototype.toString`. - * - * assert.typeOf({ tea: 'chai' }, 'object', 'we have an object'); - * assert.typeOf(['chai', 'jasmine'], 'array', 'we have an array'); - * assert.typeOf('tea', 'string', 'we have a string'); - * assert.typeOf(/tea/, 'regexp', 'we have a regular expression'); - * assert.typeOf(null, 'null', 'we have a null'); - * assert.typeOf(undefined, 'undefined', 'we have an undefined'); - * - * @name typeOf - * @param {Mixed} value - * @param {String} name - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.typeOf = function (val, type, msg) { - new Assertion(val, msg, assert.typeOf, true).to.be.a(type); - }; - - /** - * ### .notTypeOf(value, name, [message]) - * - * Asserts that `value`'s type is _not_ `name`, as determined by - * `Object.prototype.toString`. - * - * assert.notTypeOf('tea', 'number', 'strings are not numbers'); - * - * @name notTypeOf - * @param {Mixed} value - * @param {String} typeof name - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notTypeOf = function (val, type, msg) { - new Assertion(val, msg, assert.notTypeOf, true).to.not.be.a(type); - }; - - /** - * ### .instanceOf(object, constructor, [message]) - * - * Asserts that `value` is an instance of `constructor`. - * - * var Tea = function (name) { this.name = name; } - * , chai = new Tea('chai'); - * - * assert.instanceOf(chai, Tea, 'chai is an instance of tea'); - * - * @name instanceOf - * @param {Object} object - * @param {Constructor} constructor - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.instanceOf = function (val, type, msg) { - new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type); - }; - - /** - * ### .notInstanceOf(object, constructor, [message]) - * - * Asserts `value` is not an instance of `constructor`. - * - * var Tea = function (name) { this.name = name; } - * , chai = new String('chai'); - * - * assert.notInstanceOf(chai, Tea, 'chai is not an instance of tea'); - * - * @name notInstanceOf - * @param {Object} object - * @param {Constructor} constructor - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notInstanceOf = function (val, type, msg) { - new Assertion(val, msg, assert.notInstanceOf, true) - .to.not.be.instanceOf(type); - }; - - /** - * ### .include(haystack, needle, [message]) - * - * Asserts that `haystack` includes `needle`. Can be used to assert the - * inclusion of a value in an array, a substring in a string, or a subset of - * properties in an object. - * - * assert.include([1,2,3], 2, 'array contains value'); - * assert.include('foobar', 'foo', 'string contains substring'); - * assert.include({ foo: 'bar', hello: 'universe' }, { foo: 'bar' }, 'object contains property'); - * - * Strict equality (===) is used. When asserting the inclusion of a value in - * an array, the array is searched for an element that's strictly equal to the - * given value. When asserting a subset of properties in an object, the object - * is searched for the given property keys, checking that each one is present - * and strictly equal to the given property value. For instance: - * - * var obj1 = {a: 1} - * , obj2 = {b: 2}; - * assert.include([obj1, obj2], obj1); - * assert.include({foo: obj1, bar: obj2}, {foo: obj1}); - * assert.include({foo: obj1, bar: obj2}, {foo: obj1, bar: obj2}); - * - * @name include - * @param {Array|String} haystack - * @param {Mixed} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.include = function (exp, inc, msg) { - new Assertion(exp, msg, assert.include, true).include(inc); - }; - - /** - * ### .notInclude(haystack, needle, [message]) - * - * Asserts that `haystack` does not include `needle`. Can be used to assert - * the absence of a value in an array, a substring in a string, or a subset of - * properties in an object. - * - * assert.notInclude([1,2,3], 4, "array doesn't contain value"); - * assert.notInclude('foobar', 'baz', "string doesn't contain substring"); - * assert.notInclude({ foo: 'bar', hello: 'universe' }, { foo: 'baz' }, 'object doesn't contain property'); - * - * Strict equality (===) is used. When asserting the absence of a value in an - * array, the array is searched to confirm the absence of an element that's - * strictly equal to the given value. When asserting a subset of properties in - * an object, the object is searched to confirm that at least one of the given - * property keys is either not present or not strictly equal to the given - * property value. For instance: - * - * var obj1 = {a: 1} - * , obj2 = {b: 2}; - * assert.notInclude([obj1, obj2], {a: 1}); - * assert.notInclude({foo: obj1, bar: obj2}, {foo: {a: 1}}); - * assert.notInclude({foo: obj1, bar: obj2}, {foo: obj1, bar: {b: 2}}); - * - * @name notInclude - * @param {Array|String} haystack - * @param {Mixed} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.notInclude, true).not.include(inc); - }; - - /** - * ### .deepInclude(haystack, needle, [message]) - * - * Asserts that `haystack` includes `needle`. Can be used to assert the - * inclusion of a value in an array or a subset of properties in an object. - * Deep equality is used. - * - * var obj1 = {a: 1} - * , obj2 = {b: 2}; - * assert.deepInclude([obj1, obj2], {a: 1}); - * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}}); - * assert.deepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 2}}); - * - * @name deepInclude - * @param {Array|String} haystack - * @param {Mixed} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.deepInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc); - }; - - /** - * ### .notDeepInclude(haystack, needle, [message]) - * - * Asserts that `haystack` does not include `needle`. Can be used to assert - * the absence of a value in an array or a subset of properties in an object. - * Deep equality is used. - * - * var obj1 = {a: 1} - * , obj2 = {b: 2}; - * assert.notDeepInclude([obj1, obj2], {a: 9}); - * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 9}}); - * assert.notDeepInclude({foo: obj1, bar: obj2}, {foo: {a: 1}, bar: {b: 9}}); - * - * @name notDeepInclude - * @param {Array|String} haystack - * @param {Mixed} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notDeepInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc); - }; - - /** - * ### .nestedInclude(haystack, needle, [message]) - * - * Asserts that 'haystack' includes 'needle'. - * Can be used to assert the inclusion of a subset of properties in an - * object. - * Enables the use of dot- and bracket-notation for referencing nested - * properties. - * '[]' and '.' in property names can be escaped using double backslashes. - * - * assert.nestedInclude({'.a': {'b': 'x'}}, {'\\.a.[b]': 'x'}); - * assert.nestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'x'}); - * - * @name nestedInclude - * @param {Object} haystack - * @param {Object} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.nestedInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc); - }; - - /** - * ### .notNestedInclude(haystack, needle, [message]) - * - * Asserts that 'haystack' does not include 'needle'. - * Can be used to assert the absence of a subset of properties in an - * object. - * Enables the use of dot- and bracket-notation for referencing nested - * properties. - * '[]' and '.' in property names can be escaped using double backslashes. - * - * assert.notNestedInclude({'.a': {'b': 'x'}}, {'\\.a.b': 'y'}); - * assert.notNestedInclude({'a': {'[b]': 'x'}}, {'a.\\[b\\]': 'y'}); - * - * @name notNestedInclude - * @param {Object} haystack - * @param {Object} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notNestedInclude = function (exp, inc, msg) { - new Assertion(exp, msg, assert.notNestedInclude, true) - .not.nested.include(inc); - }; - - /** - * ### .deepNestedInclude(haystack, needle, [message]) - * - * Asserts that 'haystack' includes 'needle'. - * Can be used to assert the inclusion of a subset of properties in an - * object while checking for deep equality. - * Enables the use of dot- and bracket-notation for referencing nested - * properties. - * '[]' and '.' in property names can be escaped using double backslashes. - * - * assert.deepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {x: 1}}); - * assert.deepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {x: 1}}); - * - * @name deepNestedInclude - * @param {Object} haystack - * @param {Object} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.deepNestedInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.deepNestedInclude, true) - .deep.nested.include(inc); - }; - - /** - * ### .notDeepNestedInclude(haystack, needle, [message]) - * - * Asserts that 'haystack' does not include 'needle'. - * Can be used to assert the absence of a subset of properties in an - * object while checking for deep equality. - * Enables the use of dot- and bracket-notation for referencing nested - * properties. - * '[]' and '.' in property names can be escaped using double backslashes. - * - * assert.notDeepNestedInclude({a: {b: [{x: 1}]}}, {'a.b[0]': {y: 1}}) - * assert.notDeepNestedInclude({'.a': {'[b]': {x: 1}}}, {'\\.a.\\[b\\]': {y: 2}}); - * - * @name notDeepNestedInclude - * @param {Object} haystack - * @param {Object} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notDeepNestedInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.notDeepNestedInclude, true) - .not.deep.nested.include(inc); - }; - - /** - * ### .ownInclude(haystack, needle, [message]) - * - * Asserts that 'haystack' includes 'needle'. - * Can be used to assert the inclusion of a subset of properties in an - * object while ignoring inherited properties. - * - * assert.ownInclude({ a: 1 }, { a: 1 }); - * - * @name ownInclude - * @param {Object} haystack - * @param {Object} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.ownInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.ownInclude, true).own.include(inc); - }; - - /** - * ### .notOwnInclude(haystack, needle, [message]) - * - * Asserts that 'haystack' includes 'needle'. - * Can be used to assert the absence of a subset of properties in an - * object while ignoring inherited properties. - * - * Object.prototype.b = 2; - * - * assert.notOwnInclude({ a: 1 }, { b: 2 }); - * - * @name notOwnInclude - * @param {Object} haystack - * @param {Object} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notOwnInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc); - }; - - /** - * ### .deepOwnInclude(haystack, needle, [message]) - * - * Asserts that 'haystack' includes 'needle'. - * Can be used to assert the inclusion of a subset of properties in an - * object while ignoring inherited properties and checking for deep equality. - * - * assert.deepOwnInclude({a: {b: 2}}, {a: {b: 2}}); - * - * @name deepOwnInclude - * @param {Object} haystack - * @param {Object} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.deepOwnInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.deepOwnInclude, true) - .deep.own.include(inc); - }; - - /** - * ### .notDeepOwnInclude(haystack, needle, [message]) - * - * Asserts that 'haystack' includes 'needle'. - * Can be used to assert the absence of a subset of properties in an - * object while ignoring inherited properties and checking for deep equality. - * - * assert.notDeepOwnInclude({a: {b: 2}}, {a: {c: 3}}); - * - * @name notDeepOwnInclude - * @param {Object} haystack - * @param {Object} needle - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notDeepOwnInclude = function(exp, inc, msg) { - new Assertion(exp, msg, assert.notDeepOwnInclude, true) - .not.deep.own.include(inc); - }; - - /** - * ### .match(value, regexp, [message]) - * - * Asserts that `value` matches the regular expression `regexp`. - * - * assert.match('foobar', /^foo/, 'regexp matches'); - * - * @name match - * @param {Mixed} value - * @param {RegExp} regexp - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.match = function (exp, re, msg) { - new Assertion(exp, msg, assert.match, true).to.match(re); - }; - - /** - * ### .notMatch(value, regexp, [message]) - * - * Asserts that `value` does not match the regular expression `regexp`. - * - * assert.notMatch('foobar', /^foo/, 'regexp does not match'); - * - * @name notMatch - * @param {Mixed} value - * @param {RegExp} regexp - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notMatch = function (exp, re, msg) { - new Assertion(exp, msg, assert.notMatch, true).to.not.match(re); - }; - - /** - * ### .property(object, property, [message]) - * - * Asserts that `object` has a direct or inherited property named by - * `property`. - * - * assert.property({ tea: { green: 'matcha' }}, 'tea'); - * assert.property({ tea: { green: 'matcha' }}, 'toString'); - * - * @name property - * @param {Object} object - * @param {String} property - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.property = function (obj, prop, msg) { - new Assertion(obj, msg, assert.property, true).to.have.property(prop); - }; - - /** - * ### .notProperty(object, property, [message]) - * - * Asserts that `object` does _not_ have a direct or inherited property named - * by `property`. - * - * assert.notProperty({ tea: { green: 'matcha' }}, 'coffee'); - * - * @name notProperty - * @param {Object} object - * @param {String} property - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.notProperty, true) - .to.not.have.property(prop); - }; - - /** - * ### .propertyVal(object, property, value, [message]) - * - * Asserts that `object` has a direct or inherited property named by - * `property` with a value given by `value`. Uses a strict equality check - * (===). - * - * assert.propertyVal({ tea: 'is good' }, 'tea', 'is good'); - * - * @name propertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.propertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.propertyVal, true) - .to.have.property(prop, val); - }; - - /** - * ### .notPropertyVal(object, property, value, [message]) - * - * Asserts that `object` does _not_ have a direct or inherited property named - * by `property` with value given by `value`. Uses a strict equality check - * (===). - * - * assert.notPropertyVal({ tea: 'is good' }, 'tea', 'is bad'); - * assert.notPropertyVal({ tea: 'is good' }, 'coffee', 'is good'); - * - * @name notPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.notPropertyVal, true) - .to.not.have.property(prop, val); - }; - - /** - * ### .deepPropertyVal(object, property, value, [message]) - * - * Asserts that `object` has a direct or inherited property named by - * `property` with a value given by `value`. Uses a deep equality check. - * - * assert.deepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' }); - * - * @name deepPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.deepPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.deepPropertyVal, true) - .to.have.deep.property(prop, val); - }; - - /** - * ### .notDeepPropertyVal(object, property, value, [message]) - * - * Asserts that `object` does _not_ have a direct or inherited property named - * by `property` with value given by `value`. Uses a deep equality check. - * - * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' }); - * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' }); - * assert.notDeepPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' }); - * - * @name notDeepPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notDeepPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.notDeepPropertyVal, true) - .to.not.have.deep.property(prop, val); - }; - - /** - * ### .ownProperty(object, property, [message]) - * - * Asserts that `object` has a direct property named by `property`. Inherited - * properties aren't checked. - * - * assert.ownProperty({ tea: { green: 'matcha' }}, 'tea'); - * - * @name ownProperty - * @param {Object} object - * @param {String} property - * @param {String} message - * @api public - */ - - assert.ownProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.ownProperty, true) - .to.have.own.property(prop); - }; - - /** - * ### .notOwnProperty(object, property, [message]) - * - * Asserts that `object` does _not_ have a direct property named by - * `property`. Inherited properties aren't checked. - * - * assert.notOwnProperty({ tea: { green: 'matcha' }}, 'coffee'); - * assert.notOwnProperty({}, 'toString'); - * - * @name notOwnProperty - * @param {Object} object - * @param {String} property - * @param {String} message - * @api public - */ - - assert.notOwnProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.notOwnProperty, true) - .to.not.have.own.property(prop); - }; - - /** - * ### .ownPropertyVal(object, property, value, [message]) - * - * Asserts that `object` has a direct property named by `property` and a value - * equal to the provided `value`. Uses a strict equality check (===). - * Inherited properties aren't checked. - * - * assert.ownPropertyVal({ coffee: 'is good'}, 'coffee', 'is good'); - * - * @name ownPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.ownPropertyVal = function (obj, prop, value, msg) { - new Assertion(obj, msg, assert.ownPropertyVal, true) - .to.have.own.property(prop, value); - }; - - /** - * ### .notOwnPropertyVal(object, property, value, [message]) - * - * Asserts that `object` does _not_ have a direct property named by `property` - * with a value equal to the provided `value`. Uses a strict equality check - * (===). Inherited properties aren't checked. - * - * assert.notOwnPropertyVal({ tea: 'is better'}, 'tea', 'is worse'); - * assert.notOwnPropertyVal({}, 'toString', Object.prototype.toString); - * - * @name notOwnPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.notOwnPropertyVal = function (obj, prop, value, msg) { - new Assertion(obj, msg, assert.notOwnPropertyVal, true) - .to.not.have.own.property(prop, value); - }; - - /** - * ### .deepOwnPropertyVal(object, property, value, [message]) - * - * Asserts that `object` has a direct property named by `property` and a value - * equal to the provided `value`. Uses a deep equality check. Inherited - * properties aren't checked. - * - * assert.deepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'matcha' }); - * - * @name deepOwnPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.deepOwnPropertyVal = function (obj, prop, value, msg) { - new Assertion(obj, msg, assert.deepOwnPropertyVal, true) - .to.have.deep.own.property(prop, value); - }; - - /** - * ### .notDeepOwnPropertyVal(object, property, value, [message]) - * - * Asserts that `object` does _not_ have a direct property named by `property` - * with a value equal to the provided `value`. Uses a deep equality check. - * Inherited properties aren't checked. - * - * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { black: 'matcha' }); - * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'tea', { green: 'oolong' }); - * assert.notDeepOwnPropertyVal({ tea: { green: 'matcha' } }, 'coffee', { green: 'matcha' }); - * assert.notDeepOwnPropertyVal({}, 'toString', Object.prototype.toString); - * - * @name notDeepOwnPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @api public - */ - - assert.notDeepOwnPropertyVal = function (obj, prop, value, msg) { - new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true) - .to.not.have.deep.own.property(prop, value); - }; - - /** - * ### .nestedProperty(object, property, [message]) - * - * Asserts that `object` has a direct or inherited property named by - * `property`, which can be a string using dot- and bracket-notation for - * nested reference. - * - * assert.nestedProperty({ tea: { green: 'matcha' }}, 'tea.green'); - * - * @name nestedProperty - * @param {Object} object - * @param {String} property - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.nestedProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.nestedProperty, true) - .to.have.nested.property(prop); - }; - - /** - * ### .notNestedProperty(object, property, [message]) - * - * Asserts that `object` does _not_ have a property named by `property`, which - * can be a string using dot- and bracket-notation for nested reference. The - * property cannot exist on the object nor anywhere in its prototype chain. - * - * assert.notNestedProperty({ tea: { green: 'matcha' }}, 'tea.oolong'); - * - * @name notNestedProperty - * @param {Object} object - * @param {String} property - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notNestedProperty = function (obj, prop, msg) { - new Assertion(obj, msg, assert.notNestedProperty, true) - .to.not.have.nested.property(prop); - }; - - /** - * ### .nestedPropertyVal(object, property, value, [message]) - * - * Asserts that `object` has a property named by `property` with value given - * by `value`. `property` can use dot- and bracket-notation for nested - * reference. Uses a strict equality check (===). - * - * assert.nestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'matcha'); - * - * @name nestedPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.nestedPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.nestedPropertyVal, true) - .to.have.nested.property(prop, val); - }; - - /** - * ### .notNestedPropertyVal(object, property, value, [message]) - * - * Asserts that `object` does _not_ have a property named by `property` with - * value given by `value`. `property` can use dot- and bracket-notation for - * nested reference. Uses a strict equality check (===). - * - * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'tea.green', 'konacha'); - * assert.notNestedPropertyVal({ tea: { green: 'matcha' }}, 'coffee.green', 'matcha'); - * - * @name notNestedPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notNestedPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.notNestedPropertyVal, true) - .to.not.have.nested.property(prop, val); - }; - - /** - * ### .deepNestedPropertyVal(object, property, value, [message]) - * - * Asserts that `object` has a property named by `property` with a value given - * by `value`. `property` can use dot- and bracket-notation for nested - * reference. Uses a deep equality check. - * - * assert.deepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yum' }); - * - * @name deepNestedPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.deepNestedPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.deepNestedPropertyVal, true) - .to.have.deep.nested.property(prop, val); - }; - - /** - * ### .notDeepNestedPropertyVal(object, property, value, [message]) - * - * Asserts that `object` does _not_ have a property named by `property` with - * value given by `value`. `property` can use dot- and bracket-notation for - * nested reference. Uses a deep equality check. - * - * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { oolong: 'yum' }); - * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.green', { matcha: 'yuck' }); - * assert.notDeepNestedPropertyVal({ tea: { green: { matcha: 'yum' } } }, 'tea.black', { matcha: 'yum' }); - * - * @name notDeepNestedPropertyVal - * @param {Object} object - * @param {String} property - * @param {Mixed} value - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notDeepNestedPropertyVal = function (obj, prop, val, msg) { - new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true) - .to.not.have.deep.nested.property(prop, val); - }; - - /** - * ### .lengthOf(object, length, [message]) - * - * Asserts that `object` has a `length` or `size` with the expected value. - * - * assert.lengthOf([1,2,3], 3, 'array has length of 3'); - * assert.lengthOf('foobar', 6, 'string has length of 6'); - * assert.lengthOf(new Set([1,2,3]), 3, 'set has size of 3'); - * assert.lengthOf(new Map([['a',1],['b',2],['c',3]]), 3, 'map has size of 3'); - * - * @name lengthOf - * @param {Mixed} object - * @param {Number} length - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.lengthOf = function (exp, len, msg) { - new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len); - }; - - /** - * ### .hasAnyKeys(object, [keys], [message]) - * - * Asserts that `object` has at least one of the `keys` provided. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'iDontExist', 'baz']); - * assert.hasAnyKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, iDontExist: 99, baz: 1337}); - * assert.hasAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); - * assert.hasAnyKeys(new Set([{foo: 'bar'}, 'anotherKey']), [{foo: 'bar'}, 'anotherKey']); - * - * @name hasAnyKeys - * @param {Mixed} object - * @param {Array|Object} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.hasAnyKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys); - }; - - /** - * ### .hasAllKeys(object, [keys], [message]) - * - * Asserts that `object` has all and only all of the `keys` provided. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']); - * assert.hasAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337]); - * assert.hasAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); - * assert.hasAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']); - * - * @name hasAllKeys - * @param {Mixed} object - * @param {String[]} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.hasAllKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys); - }; - - /** - * ### .containsAllKeys(object, [keys], [message]) - * - * Asserts that `object` has all of the `keys` provided but may have more keys not listed. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'baz']); - * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, ['foo', 'bar', 'baz']); - * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, baz: 1337}); - * assert.containsAllKeys({foo: 1, bar: 2, baz: 3}, {foo: 30, bar: 99, baz: 1337}); - * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}]); - * assert.containsAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{foo: 1}, 'key']); - * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}]); - * assert.containsAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{foo: 'bar'}, 'anotherKey']); - * - * @name containsAllKeys - * @param {Mixed} object - * @param {String[]} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.containsAllKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.containsAllKeys, true) - .to.contain.all.keys(keys); - }; - - /** - * ### .doesNotHaveAnyKeys(object, [keys], [message]) - * - * Asserts that `object` has none of the `keys` provided. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']); - * assert.doesNotHaveAnyKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'}); - * assert.doesNotHaveAnyKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']); - * assert.doesNotHaveAnyKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']); - * - * @name doesNotHaveAnyKeys - * @param {Mixed} object - * @param {String[]} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.doesNotHaveAnyKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true) - .to.not.have.any.keys(keys); - }; - - /** - * ### .doesNotHaveAllKeys(object, [keys], [message]) - * - * Asserts that `object` does not have at least one of the `keys` provided. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, ['one', 'two', 'example']); - * assert.doesNotHaveAllKeys({foo: 1, bar: 2, baz: 3}, {one: 1, two: 2, example: 'foo'}); - * assert.doesNotHaveAllKeys(new Map([[{foo: 1}, 'bar'], ['key', 'value']]), [{one: 'two'}, 'example']); - * assert.doesNotHaveAllKeys(new Set([{foo: 'bar'}, 'anotherKey'], [{one: 'two'}, 'example']); - * - * @name doesNotHaveAllKeys - * @param {Mixed} object - * @param {String[]} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.doesNotHaveAllKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.doesNotHaveAllKeys, true) - .to.not.have.all.keys(keys); - }; - - /** - * ### .hasAnyDeepKeys(object, [keys], [message]) - * - * Asserts that `object` has at least one of the `keys` provided. - * Since Sets and Maps can have objects as keys you can use this assertion to perform - * a deep comparison. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'}); - * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), [{one: 'one'}, {two: 'two'}]); - * assert.hasAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); - * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'}); - * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {three: 'three'}]); - * assert.hasAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); - * - * @name doesNotHaveAllKeys - * @param {Mixed} object - * @param {Array|Object} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.hasAnyDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.hasAnyDeepKeys, true) - .to.have.any.deep.keys(keys); - }; - - /** - * ### .hasAllDeepKeys(object, [keys], [message]) - * - * Asserts that `object` has all and only all of the `keys` provided. - * Since Sets and Maps can have objects as keys you can use this assertion to perform - * a deep comparison. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne']]), {one: 'one'}); - * assert.hasAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); - * assert.hasAllDeepKeys(new Set([{one: 'one'}]), {one: 'one'}); - * assert.hasAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); - * - * @name hasAllDeepKeys - * @param {Mixed} object - * @param {Array|Object} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.hasAllDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.hasAllDeepKeys, true) - .to.have.all.deep.keys(keys); - }; - - /** - * ### .containsAllDeepKeys(object, [keys], [message]) - * - * Asserts that `object` contains all of the `keys` provided. - * Since Sets and Maps can have objects as keys you can use this assertion to perform - * a deep comparison. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {one: 'one'}); - * assert.containsAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{one: 'one'}, {two: 'two'}]); - * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {one: 'one'}); - * assert.containsAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {two: 'two'}]); - * - * @name containsAllDeepKeys - * @param {Mixed} object - * @param {Array|Object} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.containsAllDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.containsAllDeepKeys, true) - .to.contain.all.deep.keys(keys); - }; - - /** - * ### .doesNotHaveAnyDeepKeys(object, [keys], [message]) - * - * Asserts that `object` has none of the `keys` provided. - * Since Sets and Maps can have objects as keys you can use this assertion to perform - * a deep comparison. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'}); - * assert.doesNotHaveAnyDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {fifty: 'fifty'}]); - * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'}); - * assert.doesNotHaveAnyDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{twenty: 'twenty'}, {fifty: 'fifty'}]); - * - * @name doesNotHaveAnyDeepKeys - * @param {Mixed} object - * @param {Array|Object} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.doesNotHaveAnyDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true) - .to.not.have.any.deep.keys(keys); - }; - - /** - * ### .doesNotHaveAllDeepKeys(object, [keys], [message]) - * - * Asserts that `object` does not have at least one of the `keys` provided. - * Since Sets and Maps can have objects as keys you can use this assertion to perform - * a deep comparison. - * You can also provide a single object instead of a `keys` array and its keys - * will be used as the expected set of keys. - * - * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [1, 2]]), {thisDoesNot: 'exist'}); - * assert.doesNotHaveAllDeepKeys(new Map([[{one: 'one'}, 'valueOne'], [{two: 'two'}, 'valueTwo']]), [{twenty: 'twenty'}, {one: 'one'}]); - * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), {twenty: 'twenty'}); - * assert.doesNotHaveAllDeepKeys(new Set([{one: 'one'}, {two: 'two'}]), [{one: 'one'}, {fifty: 'fifty'}]); - * - * @name doesNotHaveAllDeepKeys - * @param {Mixed} object - * @param {Array|Object} keys - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.doesNotHaveAllDeepKeys = function (obj, keys, msg) { - new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true) - .to.not.have.all.deep.keys(keys); - }; - - /** - * ### .throws(fn, [errorLike/string/regexp], [string/regexp], [message]) - * - * If `errorLike` is an `Error` constructor, asserts that `fn` will throw an error that is an - * instance of `errorLike`. - * If `errorLike` is an `Error` instance, asserts that the error thrown is the same - * instance as `errorLike`. - * If `errMsgMatcher` is provided, it also asserts that the error thrown will have a - * message matching `errMsgMatcher`. - * - * assert.throws(fn, 'Error thrown must have this msg'); - * assert.throws(fn, /Error thrown must have a msg that matches this/); - * assert.throws(fn, ReferenceError); - * assert.throws(fn, errorInstance); - * assert.throws(fn, ReferenceError, 'Error thrown must be a ReferenceError and have this msg'); - * assert.throws(fn, errorInstance, 'Error thrown must be the same errorInstance and have this msg'); - * assert.throws(fn, ReferenceError, /Error thrown must be a ReferenceError and match this/); - * assert.throws(fn, errorInstance, /Error thrown must be the same errorInstance and match this/); - * - * @name throws - * @alias throw - * @alias Throw - * @param {Function} fn - * @param {ErrorConstructor|Error} errorLike - * @param {RegExp|String} errMsgMatcher - * @param {String} message - * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types - * @namespace Assert - * @api public - */ - - assert.throws = function (fn, errorLike, errMsgMatcher, msg) { - if ('string' === typeof errorLike || errorLike instanceof RegExp) { - errMsgMatcher = errorLike; - errorLike = null; - } - - var assertErr = new Assertion(fn, msg, assert.throws, true) - .to.throw(errorLike, errMsgMatcher); - return flag(assertErr, 'object'); - }; - - /** - * ### .doesNotThrow(fn, [errorLike/string/regexp], [string/regexp], [message]) - * - * If `errorLike` is an `Error` constructor, asserts that `fn` will _not_ throw an error that is an - * instance of `errorLike`. - * If `errorLike` is an `Error` instance, asserts that the error thrown is _not_ the same - * instance as `errorLike`. - * If `errMsgMatcher` is provided, it also asserts that the error thrown will _not_ have a - * message matching `errMsgMatcher`. - * - * assert.doesNotThrow(fn, 'Any Error thrown must not have this message'); - * assert.doesNotThrow(fn, /Any Error thrown must not match this/); - * assert.doesNotThrow(fn, Error); - * assert.doesNotThrow(fn, errorInstance); - * assert.doesNotThrow(fn, Error, 'Error must not have this message'); - * assert.doesNotThrow(fn, errorInstance, 'Error must not have this message'); - * assert.doesNotThrow(fn, Error, /Error must not match this/); - * assert.doesNotThrow(fn, errorInstance, /Error must not match this/); - * - * @name doesNotThrow - * @param {Function} fn - * @param {ErrorConstructor} errorLike - * @param {RegExp|String} errMsgMatcher - * @param {String} message - * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types - * @namespace Assert - * @api public - */ - - assert.doesNotThrow = function (fn, errorLike, errMsgMatcher, msg) { - if ('string' === typeof errorLike || errorLike instanceof RegExp) { - errMsgMatcher = errorLike; - errorLike = null; - } - - new Assertion(fn, msg, assert.doesNotThrow, true) - .to.not.throw(errorLike, errMsgMatcher); - }; - - /** - * ### .operator(val1, operator, val2, [message]) - * - * Compares two values using `operator`. - * - * assert.operator(1, '<', 2, 'everything is ok'); - * assert.operator(1, '>', 2, 'this will fail'); - * - * @name operator - * @param {Mixed} val1 - * @param {String} operator - * @param {Mixed} val2 - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.operator = function (val, operator, val2, msg) { - var ok; - switch(operator) { - case '==': - ok = val == val2; - break; - case '===': - ok = val === val2; - break; - case '>': - ok = val > val2; - break; - case '>=': - ok = val >= val2; - break; - case '<': - ok = val < val2; - break; - case '<=': - ok = val <= val2; - break; - case '!=': - ok = val != val2; - break; - case '!==': - ok = val !== val2; - break; - default: - msg = msg ? msg + ': ' : msg; - throw new chai.AssertionError( - msg + 'Invalid operator "' + operator + '"', - undefined, - assert.operator - ); - } - var test = new Assertion(ok, msg, assert.operator, true); - test.assert( - true === flag(test, 'object') - , 'expected ' + util.inspect(val) + ' to be ' + operator + ' ' + util.inspect(val2) - , 'expected ' + util.inspect(val) + ' to not be ' + operator + ' ' + util.inspect(val2) ); - }; - - /** - * ### .closeTo(actual, expected, delta, [message]) - * - * Asserts that the target is equal `expected`, to within a +/- `delta` range. - * - * assert.closeTo(1.5, 1, 0.5, 'numbers are close'); - * - * @name closeTo - * @param {Number} actual - * @param {Number} expected - * @param {Number} delta - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.closeTo = function (act, exp, delta, msg) { - new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta); - }; - - /** - * ### .approximately(actual, expected, delta, [message]) - * - * Asserts that the target is equal `expected`, to within a +/- `delta` range. - * - * assert.approximately(1.5, 1, 0.5, 'numbers are close'); - * - * @name approximately - * @param {Number} actual - * @param {Number} expected - * @param {Number} delta - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.approximately = function (act, exp, delta, msg) { - new Assertion(act, msg, assert.approximately, true) - .to.be.approximately(exp, delta); - }; - - /** - * ### .sameMembers(set1, set2, [message]) - * - * Asserts that `set1` and `set2` have the same members in any order. Uses a - * strict equality check (===). - * - * assert.sameMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'same members'); - * - * @name sameMembers - * @param {Array} set1 - * @param {Array} set2 - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.sameMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.sameMembers, true) - .to.have.same.members(set2); - }; - - /** - * ### .notSameMembers(set1, set2, [message]) - * - * Asserts that `set1` and `set2` don't have the same members in any order. - * Uses a strict equality check (===). - * - * assert.notSameMembers([ 1, 2, 3 ], [ 5, 1, 3 ], 'not same members'); - * - * @name notSameMembers - * @param {Array} set1 - * @param {Array} set2 - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notSameMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.notSameMembers, true) - .to.not.have.same.members(set2); - }; - - /** - * ### .sameDeepMembers(set1, set2, [message]) - * - * Asserts that `set1` and `set2` have the same members in any order. Uses a - * deep equality check. - * - * assert.sameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { c: 3 }], 'same deep members'); - * - * @name sameDeepMembers - * @param {Array} set1 - * @param {Array} set2 - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.sameDeepMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.sameDeepMembers, true) - .to.have.same.deep.members(set2); - }; - - /** - * ### .notSameDeepMembers(set1, set2, [message]) - * - * Asserts that `set1` and `set2` don't have the same members in any order. - * Uses a deep equality check. - * - * assert.notSameDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [{ b: 2 }, { a: 1 }, { f: 5 }], 'not same deep members'); - * - * @name notSameDeepMembers - * @param {Array} set1 - * @param {Array} set2 - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notSameDeepMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.notSameDeepMembers, true) - .to.not.have.same.deep.members(set2); - }; - - /** - * ### .sameOrderedMembers(set1, set2, [message]) - * - * Asserts that `set1` and `set2` have the same members in the same order. - * Uses a strict equality check (===). - * - * assert.sameOrderedMembers([ 1, 2, 3 ], [ 1, 2, 3 ], 'same ordered members'); - * - * @name sameOrderedMembers - * @param {Array} set1 - * @param {Array} set2 - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.sameOrderedMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.sameOrderedMembers, true) - .to.have.same.ordered.members(set2); - }; - - /** - * ### .notSameOrderedMembers(set1, set2, [message]) - * - * Asserts that `set1` and `set2` don't have the same members in the same - * order. Uses a strict equality check (===). - * - * assert.notSameOrderedMembers([ 1, 2, 3 ], [ 2, 1, 3 ], 'not same ordered members'); - * - * @name notSameOrderedMembers - * @param {Array} set1 - * @param {Array} set2 - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notSameOrderedMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.notSameOrderedMembers, true) - .to.not.have.same.ordered.members(set2); - }; - - /** - * ### .sameDeepOrderedMembers(set1, set2, [message]) - * - * Asserts that `set1` and `set2` have the same members in the same order. - * Uses a deep equality check. - * - * assert.sameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { c: 3 } ], 'same deep ordered members'); - * - * @name sameDeepOrderedMembers - * @param {Array} set1 - * @param {Array} set2 - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.sameDeepOrderedMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.sameDeepOrderedMembers, true) - .to.have.same.deep.ordered.members(set2); - }; - - /** - * ### .notSameDeepOrderedMembers(set1, set2, [message]) - * - * Asserts that `set1` and `set2` don't have the same members in the same - * order. Uses a deep equality check. - * - * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 }, { z: 5 } ], 'not same deep ordered members'); - * assert.notSameDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { c: 3 } ], 'not same deep ordered members'); - * - * @name notSameDeepOrderedMembers - * @param {Array} set1 - * @param {Array} set2 - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notSameDeepOrderedMembers = function (set1, set2, msg) { - new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true) - .to.not.have.same.deep.ordered.members(set2); - }; - - /** - * ### .includeMembers(superset, subset, [message]) - * - * Asserts that `subset` is included in `superset` in any order. Uses a - * strict equality check (===). Duplicates are ignored. - * - * assert.includeMembers([ 1, 2, 3 ], [ 2, 1, 2 ], 'include members'); - * - * @name includeMembers - * @param {Array} superset - * @param {Array} subset - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.includeMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.includeMembers, true) - .to.include.members(subset); - }; - - /** - * ### .notIncludeMembers(superset, subset, [message]) - * - * Asserts that `subset` isn't included in `superset` in any order. Uses a - * strict equality check (===). Duplicates are ignored. - * - * assert.notIncludeMembers([ 1, 2, 3 ], [ 5, 1 ], 'not include members'); - * - * @name notIncludeMembers - * @param {Array} superset - * @param {Array} subset - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notIncludeMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.notIncludeMembers, true) - .to.not.include.members(subset); - }; - - /** - * ### .includeDeepMembers(superset, subset, [message]) - * - * Asserts that `subset` is included in `superset` in any order. Uses a deep - * equality check. Duplicates are ignored. - * - * assert.includeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 }, { b: 2 } ], 'include deep members'); - * - * @name includeDeepMembers - * @param {Array} superset - * @param {Array} subset - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.includeDeepMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.includeDeepMembers, true) - .to.include.deep.members(subset); - }; - - /** - * ### .notIncludeDeepMembers(superset, subset, [message]) - * - * Asserts that `subset` isn't included in `superset` in any order. Uses a - * deep equality check. Duplicates are ignored. - * - * assert.notIncludeDeepMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { f: 5 } ], 'not include deep members'); - * - * @name notIncludeDeepMembers - * @param {Array} superset - * @param {Array} subset - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notIncludeDeepMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.notIncludeDeepMembers, true) - .to.not.include.deep.members(subset); - }; - - /** - * ### .includeOrderedMembers(superset, subset, [message]) - * - * Asserts that `subset` is included in `superset` in the same order - * beginning with the first element in `superset`. Uses a strict equality - * check (===). - * - * assert.includeOrderedMembers([ 1, 2, 3 ], [ 1, 2 ], 'include ordered members'); - * - * @name includeOrderedMembers - * @param {Array} superset - * @param {Array} subset - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.includeOrderedMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.includeOrderedMembers, true) - .to.include.ordered.members(subset); - }; - - /** - * ### .notIncludeOrderedMembers(superset, subset, [message]) - * - * Asserts that `subset` isn't included in `superset` in the same order - * beginning with the first element in `superset`. Uses a strict equality - * check (===). - * - * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 1 ], 'not include ordered members'); - * assert.notIncludeOrderedMembers([ 1, 2, 3 ], [ 2, 3 ], 'not include ordered members'); - * - * @name notIncludeOrderedMembers - * @param {Array} superset - * @param {Array} subset - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notIncludeOrderedMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.notIncludeOrderedMembers, true) - .to.not.include.ordered.members(subset); - }; - - /** - * ### .includeDeepOrderedMembers(superset, subset, [message]) - * - * Asserts that `subset` is included in `superset` in the same order - * beginning with the first element in `superset`. Uses a deep equality - * check. - * - * assert.includeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { b: 2 } ], 'include deep ordered members'); - * - * @name includeDeepOrderedMembers - * @param {Array} superset - * @param {Array} subset - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.includeDeepOrderedMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.includeDeepOrderedMembers, true) - .to.include.deep.ordered.members(subset); - }; - - /** - * ### .notIncludeDeepOrderedMembers(superset, subset, [message]) - * - * Asserts that `subset` isn't included in `superset` in the same order - * beginning with the first element in `superset`. Uses a deep equality - * check. - * - * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { a: 1 }, { f: 5 } ], 'not include deep ordered members'); - * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { a: 1 } ], 'not include deep ordered members'); - * assert.notIncludeDeepOrderedMembers([ { a: 1 }, { b: 2 }, { c: 3 } ], [ { b: 2 }, { c: 3 } ], 'not include deep ordered members'); - * - * @name notIncludeDeepOrderedMembers - * @param {Array} superset - * @param {Array} subset - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.notIncludeDeepOrderedMembers = function (superset, subset, msg) { - new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true) - .to.not.include.deep.ordered.members(subset); - }; - - /** - * ### .oneOf(inList, list, [message]) - * - * Asserts that non-object, non-array value `inList` appears in the flat array `list`. - * - * assert.oneOf(1, [ 2, 1 ], 'Not found in list'); - * - * @name oneOf - * @param {*} inList - * @param {Array<*>} list - * @param {String} message - * @namespace Assert - * @api public - */ - - assert.oneOf = function (inList, list, msg) { - new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list); - }; - - /** - * ### .changes(function, object, property, [message]) - * - * Asserts that a function changes the value of a property. - * - * var obj = { val: 10 }; - * var fn = function() { obj.val = 22 }; - * assert.changes(fn, obj, 'val'); - * - * @name changes - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.changes = function (fn, obj, prop, msg) { - if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; - } - - new Assertion(fn, msg, assert.changes, true).to.change(obj, prop); - }; - - /** - * ### .changesBy(function, object, property, delta, [message]) - * - * Asserts that a function changes the value of a property by an amount (delta). - * - * var obj = { val: 10 }; - * var fn = function() { obj.val += 2 }; - * assert.changesBy(fn, obj, 'val', 2); - * - * @name changesBy - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {Number} change amount (delta) - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.changesBy = function (fn, obj, prop, delta, msg) { - if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; - } else if (arguments.length === 3) { - delta = prop; - prop = null; - } - - new Assertion(fn, msg, assert.changesBy, true) - .to.change(obj, prop).by(delta); - }; - - /** - * ### .doesNotChange(function, object, property, [message]) - * - * Asserts that a function does not change the value of a property. - * - * var obj = { val: 10 }; - * var fn = function() { console.log('foo'); }; - * assert.doesNotChange(fn, obj, 'val'); - * - * @name doesNotChange - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.doesNotChange = function (fn, obj, prop, msg) { - if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; - } - - return new Assertion(fn, msg, assert.doesNotChange, true) - .to.not.change(obj, prop); - }; - - /** - * ### .changesButNotBy(function, object, property, delta, [message]) - * - * Asserts that a function does not change the value of a property or of a function's return value by an amount (delta) - * - * var obj = { val: 10 }; - * var fn = function() { obj.val += 10 }; - * assert.changesButNotBy(fn, obj, 'val', 5); - * - * @name changesButNotBy - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {Number} change amount (delta) - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.changesButNotBy = function (fn, obj, prop, delta, msg) { - if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; - } else if (arguments.length === 3) { - delta = prop; - prop = null; - } - - new Assertion(fn, msg, assert.changesButNotBy, true) - .to.change(obj, prop).but.not.by(delta); - }; - - /** - * ### .increases(function, object, property, [message]) - * - * Asserts that a function increases a numeric object property. - * - * var obj = { val: 10 }; - * var fn = function() { obj.val = 13 }; - * assert.increases(fn, obj, 'val'); - * - * @name increases - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.increases = function (fn, obj, prop, msg) { - if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; - } - - return new Assertion(fn, msg, assert.increases, true) - .to.increase(obj, prop); - }; - - /** - * ### .increasesBy(function, object, property, delta, [message]) - * - * Asserts that a function increases a numeric object property or a function's return value by an amount (delta). - * - * var obj = { val: 10 }; - * var fn = function() { obj.val += 10 }; - * assert.increasesBy(fn, obj, 'val', 10); - * - * @name increasesBy - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {Number} change amount (delta) - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.increasesBy = function (fn, obj, prop, delta, msg) { - if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; - } else if (arguments.length === 3) { - delta = prop; - prop = null; - } - - new Assertion(fn, msg, assert.increasesBy, true) - .to.increase(obj, prop).by(delta); - }; - - /** - * ### .doesNotIncrease(function, object, property, [message]) - * - * Asserts that a function does not increase a numeric object property. - * - * var obj = { val: 10 }; - * var fn = function() { obj.val = 8 }; - * assert.doesNotIncrease(fn, obj, 'val'); - * - * @name doesNotIncrease - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.doesNotIncrease = function (fn, obj, prop, msg) { - if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; - } - - return new Assertion(fn, msg, assert.doesNotIncrease, true) - .to.not.increase(obj, prop); - }; - - /** - * ### .increasesButNotBy(function, object, property, [message]) - * - * Asserts that a function does not increase a numeric object property or function's return value by an amount (delta). - * - * var obj = { val: 10 }; - * var fn = function() { obj.val = 15 }; - * assert.increasesButNotBy(fn, obj, 'val', 10); - * - * @name increasesButNotBy - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {Number} change amount (delta) - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.increasesButNotBy = function (fn, obj, prop, delta, msg) { - if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; - } else if (arguments.length === 3) { - delta = prop; - prop = null; - } - - new Assertion(fn, msg, assert.increasesButNotBy, true) - .to.increase(obj, prop).but.not.by(delta); - }; - - /** - * ### .decreases(function, object, property, [message]) - * - * Asserts that a function decreases a numeric object property. - * - * var obj = { val: 10 }; - * var fn = function() { obj.val = 5 }; - * assert.decreases(fn, obj, 'val'); - * - * @name decreases - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.decreases = function (fn, obj, prop, msg) { - if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; - } - - return new Assertion(fn, msg, assert.decreases, true) - .to.decrease(obj, prop); - }; - - /** - * ### .decreasesBy(function, object, property, delta, [message]) - * - * Asserts that a function decreases a numeric object property or a function's return value by an amount (delta) - * - * var obj = { val: 10 }; - * var fn = function() { obj.val -= 5 }; - * assert.decreasesBy(fn, obj, 'val', 5); - * - * @name decreasesBy - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {Number} change amount (delta) - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.decreasesBy = function (fn, obj, prop, delta, msg) { - if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; - } else if (arguments.length === 3) { - delta = prop; - prop = null; - } - - new Assertion(fn, msg, assert.decreasesBy, true) - .to.decrease(obj, prop).by(delta); - }; - - /** - * ### .doesNotDecrease(function, object, property, [message]) - * - * Asserts that a function does not decreases a numeric object property. - * - * var obj = { val: 10 }; - * var fn = function() { obj.val = 15 }; - * assert.doesNotDecrease(fn, obj, 'val'); - * - * @name doesNotDecrease - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.doesNotDecrease = function (fn, obj, prop, msg) { - if (arguments.length === 3 && typeof obj === 'function') { - msg = prop; - prop = null; - } - - return new Assertion(fn, msg, assert.doesNotDecrease, true) - .to.not.decrease(obj, prop); - }; - - /** - * ### .doesNotDecreaseBy(function, object, property, delta, [message]) - * - * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta) - * - * var obj = { val: 10 }; - * var fn = function() { obj.val = 5 }; - * assert.doesNotDecreaseBy(fn, obj, 'val', 1); - * - * @name doesNotDecrease - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {Number} change amount (delta) - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.doesNotDecreaseBy = function (fn, obj, prop, delta, msg) { - if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; - } else if (arguments.length === 3) { - delta = prop; - prop = null; - } - - return new Assertion(fn, msg, assert.doesNotDecreaseBy, true) - .to.not.decrease(obj, prop).by(delta); - }; - - /** - * ### .decreasesButNotBy(function, object, property, delta, [message]) - * - * Asserts that a function does not decreases a numeric object property or a function's return value by an amount (delta) - * - * var obj = { val: 10 }; - * var fn = function() { obj.val = 5 }; - * assert.decreasesButNotBy(fn, obj, 'val', 1); - * - * @name decreasesButNotBy - * @param {Function} modifier function - * @param {Object} object or getter function - * @param {String} property name _optional_ - * @param {Number} change amount (delta) - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.decreasesButNotBy = function (fn, obj, prop, delta, msg) { - if (arguments.length === 4 && typeof obj === 'function') { - var tmpMsg = delta; - delta = prop; - msg = tmpMsg; - } else if (arguments.length === 3) { - delta = prop; - prop = null; - } - - new Assertion(fn, msg, assert.decreasesButNotBy, true) - .to.decrease(obj, prop).but.not.by(delta); - }; - - /*! - * ### .ifError(object) - * - * Asserts if value is not a false value, and throws if it is a true value. - * This is added to allow for chai to be a drop-in replacement for Node's - * assert class. - * - * var err = new Error('I am a custom error'); - * assert.ifError(err); // Rethrows err! - * - * @name ifError - * @param {Object} object - * @namespace Assert - * @api public - */ - - assert.ifError = function (val) { - if (val) { - throw(val); - } - }; - - /** - * ### .isExtensible(object) - * - * Asserts that `object` is extensible (can have new properties added to it). - * - * assert.isExtensible({}); - * - * @name isExtensible - * @alias extensible - * @param {Object} object - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.isExtensible = function (obj, msg) { - new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible; - }; - - /** - * ### .isNotExtensible(object) - * - * Asserts that `object` is _not_ extensible. - * - * var nonExtensibleObject = Object.preventExtensions({}); - * var sealedObject = Object.seal({}); - * var frozenObject = Object.freeze({}); - * - * assert.isNotExtensible(nonExtensibleObject); - * assert.isNotExtensible(sealedObject); - * assert.isNotExtensible(frozenObject); - * - * @name isNotExtensible - * @alias notExtensible - * @param {Object} object - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.isNotExtensible = function (obj, msg) { - new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible; - }; - - /** - * ### .isSealed(object) - * - * Asserts that `object` is sealed (cannot have new properties added to it - * and its existing properties cannot be removed). - * - * var sealedObject = Object.seal({}); - * var frozenObject = Object.seal({}); - * - * assert.isSealed(sealedObject); - * assert.isSealed(frozenObject); - * - * @name isSealed - * @alias sealed - * @param {Object} object - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.isSealed = function (obj, msg) { - new Assertion(obj, msg, assert.isSealed, true).to.be.sealed; - }; - - /** - * ### .isNotSealed(object) - * - * Asserts that `object` is _not_ sealed. - * - * assert.isNotSealed({}); - * - * @name isNotSealed - * @alias notSealed - * @param {Object} object - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.isNotSealed = function (obj, msg) { - new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed; - }; - - /** - * ### .isFrozen(object) - * - * Asserts that `object` is frozen (cannot have new properties added to it - * and its existing properties cannot be modified). - * - * var frozenObject = Object.freeze({}); - * assert.frozen(frozenObject); - * - * @name isFrozen - * @alias frozen - * @param {Object} object - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.isFrozen = function (obj, msg) { - new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen; - }; - - /** - * ### .isNotFrozen(object) - * - * Asserts that `object` is _not_ frozen. - * - * assert.isNotFrozen({}); - * - * @name isNotFrozen - * @alias notFrozen - * @param {Object} object - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.isNotFrozen = function (obj, msg) { - new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen; - }; - - /** - * ### .isEmpty(target) - * - * Asserts that the target does not contain any values. - * For arrays and strings, it checks the `length` property. - * For `Map` and `Set` instances, it checks the `size` property. - * For non-function objects, it gets the count of own - * enumerable string keys. - * - * assert.isEmpty([]); - * assert.isEmpty(''); - * assert.isEmpty(new Map); - * assert.isEmpty({}); - * - * @name isEmpty - * @alias empty - * @param {Object|Array|String|Map|Set} target - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.isEmpty = function(val, msg) { - new Assertion(val, msg, assert.isEmpty, true).to.be.empty; - }; - - /** - * ### .isNotEmpty(target) - * - * Asserts that the target contains values. - * For arrays and strings, it checks the `length` property. - * For `Map` and `Set` instances, it checks the `size` property. - * For non-function objects, it gets the count of own - * enumerable string keys. - * - * assert.isNotEmpty([1, 2]); - * assert.isNotEmpty('34'); - * assert.isNotEmpty(new Set([5, 6])); - * assert.isNotEmpty({ key: 7 }); - * - * @name isNotEmpty - * @alias notEmpty - * @param {Object|Array|String|Map|Set} target - * @param {String} message _optional_ - * @namespace Assert - * @api public - */ - - assert.isNotEmpty = function(val, msg) { - new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty; - }; - - /*! - * Aliases. - */ - - (function alias(name, as){ - assert[as] = assert[name]; - return alias; - }) - ('isOk', 'ok') - ('isNotOk', 'notOk') - ('throws', 'throw') - ('throws', 'Throw') - ('isExtensible', 'extensible') - ('isNotExtensible', 'notExtensible') - ('isSealed', 'sealed') - ('isNotSealed', 'notSealed') - ('isFrozen', 'frozen') - ('isNotFrozen', 'notFrozen') - ('isEmpty', 'empty') - ('isNotEmpty', 'notEmpty'); - }; - - var chai = createCommonjsModule(function (module, exports) { - /*! - * chai - * Copyright(c) 2011-2014 Jake Luer - * MIT Licensed - */ - - var used = []; - - /*! - * Chai version - */ - - exports.version = '4.2.0'; - - /*! - * Assertion Error - */ - - exports.AssertionError = assertionError; - - /*! - * Utils for plugins (not exported) - */ - - - - /** - * # .use(function) - * - * Provides a way to extend the internals of Chai. - * - * @param {Function} - * @returns {this} for chaining - * @api public - */ - - exports.use = function (fn) { - if (!~used.indexOf(fn)) { - fn(exports, utils); - used.push(fn); - } - - return exports; - }; - - /*! - * Utility Functions - */ - - exports.util = utils; - - /*! - * Configuration - */ - - - exports.config = config; - - /*! - * Primary `Assertion` prototype - */ - - - exports.use(assertion); - - /*! - * Core Assertions - */ - - - exports.use(assertions); - - /*! - * Expect interface - */ - - - exports.use(expect); - - /*! - * Should interface - */ - - - exports.use(should); - - /*! - * Assert interface - */ - - - exports.use(assert); - }); - var chai_1 = chai.version; - var chai_2 = chai.AssertionError; - var chai_3 = chai.use; - var chai_4 = chai.util; - var chai_5 = chai.config; - - var chai$1 = chai; - - var GrammarError = function GrammarError(message, location) { - _classCallCheck(this, GrammarError); - - this.name = "GrammarError"; - this.message = message; - this.location = location; - - if (typeof Error.captureStackTrace === "function") { - Error.captureStackTrace(this, GrammarError); - } - }; - - var grammarError = GrammarError; - - function findIndex(array, condition) { - for (var i = 0; i < array.length; ++i) { - if (condition(array[i], i)) return i; - } - - return -1; - } - - function find(array, condition) { - var index = findIndex(array, condition); - return index < 0 ? void 0 : array[index]; - } - - var arrays = { - findIndex: findIndex, - find: find - }; - - function hex(ch) { - return ch.charCodeAt(0).toString(16).toUpperCase(); - } - - function sourceEscape(s) { - return s.replace(/\0/g, "\\0").replace(/\x08/g, "\\b").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\v/g, "\\v").replace(/\f/g, "\\f").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { - return "\\x0" + hex(ch); - }).replace(/[\x10-\x1F\x7F-\xFF]/g, function (ch) { - return "\\x" + hex(ch); - }).replace(/[\u0100-\u0FFF]/g, function (ch) { - return "\\u0" + hex(ch); - }).replace(/[\u1000-\uFFFF]/g, function (ch) { - return "\\u" + hex(ch); - }); - } - - var js = { - stringEscape: function stringEscape(s) { - return sourceEscape(s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"")); - }, - regexpEscape: function regexpEscape(s) { - return sourceEscape(s.replace(/\\/g, "\\\\").replace(/\//g, "\\/").replace(/]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-")); - }, - reservedWords: ["break", "case", "catch", "continue", "debugger", "default", "delete", "do", "else", "finally", "for", "function", "if", "in", "instanceof", "new", "return", "switch", "this", "throw", "try", "typeof", "var", "void", "while", "with", "class", "const", "enum", "export", "extends", "implements", "import", "interface", "let", "package", "private", "protected", "public", "static", "super", "yield", "false", "null", "true"] - }; - var js_1 = js; - - var __hasOwnProperty = Object.prototype.hasOwnProperty; - var objects = { - clone: function clone(source) { - var target = {}; - - for (var key in source) { - if (!__hasOwnProperty.call(source, key)) continue; - target[key] = source[key]; - } - - return target; - }, - each: function each(object, iterator) { - for (var key in object) { - if (!__hasOwnProperty.call(object, key)) continue; - iterator(object[key], key); - } - }, - extend: function extend(target, source) { - for (var key in source) { - if (!__hasOwnProperty.call(source, key)) continue; - if (__hasOwnProperty.call(target, key)) continue; - target[key] = source[key]; - } - - return target; - }, - map: function map(object, transformer) { - var target = {}; - - for (var key in object) { - if (!__hasOwnProperty.call(object, key)) continue; - target[key] = transformer(object[key], key); - } - - return target; - }, - values: function values(object, transformer) { - var target = []; - var index = -1; - var key, value; - - for (key in object) { - if (!__hasOwnProperty.call(object, key)) continue; - value = object[key]; - target[++index] = transformer ? transformer(value, key) : value; - } - - return target; - }, - enforceFastProperties: function enforceFastProperties(o) { - function Sub() {} - - Sub.prototype = o; - var receiver = new Sub(); - - function ic() { - return _typeof(receiver.foo); - } - - ic(); - ic(); - return o; - eval("o" + o); - } - }; - var objects_1 = objects; - - function evalModule(source, context) { - var argumentKeys = Object.keys(context); - var argumentValues = argumentKeys.map(function (argument) { - return context[argument]; - }); - var sandbox = { - exports: {} - }; - argumentKeys.push("module", "exports", source); - argumentValues.push(sandbox, sandbox.exports); - Function.apply(void 0, _toConsumableArray(argumentKeys)).apply(void 0, _toConsumableArray(argumentValues)); - return sandbox.exports; - } - - var vm = { - evalModule: evalModule - }; - - var util = createCommonjsModule(function (module, exports) { - - objects_1.extend(exports, arrays); - objects_1.extend(exports, js_1); - objects_1.extend(exports, objects_1); - objects_1.extend(exports, vm); - - exports.noop = function noop() {}; - - exports.convertPasses = function () { - function convertStage(passes) { - return Array.isArray(passes) ? passes : objects_1.values(passes); - } - - function convertPasses(stages) { - return objects_1.map(stages, convertStage); - } - - return convertPasses; - }(); - - exports.processOptions = function processOptions(options, defaults) { - var processedOptions = {}; - objects_1.extend(processedOptions, options); - objects_1.extend(processedOptions, defaults); - return processedOptions; - }; - }); - var util_1 = util.noop; - var util_2 = util.convertPasses; - var util_3 = util.processOptions; - - var ASTVisitor = function () { - function ASTVisitor() { - _classCallCheck(this, ASTVisitor); - } - - _createClass(ASTVisitor, [{ - key: "visit", - value: function visit(node) { - if (!node) throw new Error("Visitor function called with no arguments or a `falsy` node"); - var fn = this[node.type]; - if (!fn) throw new Error("Visitor function for node type \"".concat(node.type, "\" not defined")); - return fn.apply(this, arguments); - } - }]); - - return ASTVisitor; - }(); - - var visitor = { - ASTVisitor: ASTVisitor, - build: function build(functions) { - var visitor = new ASTVisitor(); - util.extend(visitor, functions); - visitor = util.enforceFastProperties(visitor); - return visitor.visit.bind(visitor); - } - }; - var on = ASTVisitor.on = { - property: function property(name) { - return function visitProperty(node) { - var value = node[name]; - - for (var _len = arguments.length, extraArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - extraArgs[_key - 1] = arguments[_key]; - } - - if (extraArgs.length) this.visit.apply(this, [value].concat(extraArgs));else this.visit(value); - }; - }, - children: function children(name) { - return function visitProperty(node) { - for (var _len2 = arguments.length, extraArgs = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - extraArgs[_key2 - 1] = arguments[_key2]; - } - - var children = node[name]; - var visitor = this; - var cb = extraArgs.length < 1 ? function withoutArgs(child) { - visitor.visit(child); - } : function withArgs(child) { - visitor.visit.apply(visitor, [child].concat(extraArgs)); - }; - children.forEach(cb); - }; - } - }; - var visitNop = util.noop; - var visitExpression = on.property("expression"); - var DEFAULT_FUNCTIONS = { - grammar: function grammar(node) { - var _this = this; - - for (var _len3 = arguments.length, extraArgs = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { - extraArgs[_key3 - 1] = arguments[_key3]; - } - - if (node.initializer) { - this.visit.apply(this, [node.initializer].concat(extraArgs)); - } - - node.rules.forEach(function (rule) { - _this.visit.apply(_this, [rule].concat(extraArgs)); - }); - }, - initializer: visitNop, - rule: visitExpression, - named: visitExpression, - choice: on.children("alternatives"), - action: visitExpression, - sequence: on.children("elements"), - labeled: visitExpression, - text: visitExpression, - simple_and: visitExpression, - simple_not: visitExpression, - optional: visitExpression, - zero_or_more: visitExpression, - one_or_more: visitExpression, - group: visitExpression, - semantic_and: visitNop, - semantic_not: visitNop, - rule_ref: visitNop, - literal: visitNop, - class: visitNop, - any: visitNop - }; - util.each(DEFAULT_FUNCTIONS, function (fn, name) { - ASTVisitor.prototype[name] = fn; - }); - - var Node = function Node(type, location) { - _classCallCheck(this, Node); - - this.type = type; - this.location = location; - }; - - var Node_1 = Node; - - var Grammar = function (_Node) { - _inherits(Grammar, _Node); - - function Grammar(initializer, rules, comments, location) { - var _this; - - _classCallCheck(this, Grammar); - - _this = _possibleConstructorReturn(this, _getPrototypeOf(Grammar).call(this, "grammar", location)); - _this.initializer = initializer; - _this.comments = comments; - _this.rules = rules; - _this._alwaysConsumesOnSuccess = new AlwaysConsumesOnSuccess(_assertThisInitialized(_assertThisInitialized(_this))); - return _this; - } - - _createClass(Grammar, [{ - key: "alwaysConsumesOnSuccess", - value: function alwaysConsumesOnSuccess(node) { - return this._alwaysConsumesOnSuccess.visit(node); - } - }, { - key: "findRule", - value: function findRule(name) { - return util.find(this.rules, function (rule) { - return rule.name === name; - }); - } - }, { - key: "indexOfRule", - value: function indexOfRule(name) { - return util.findIndex(this.rules, function (rule) { - return rule.name === name; - }); - } - }]); - - return Grammar; - }(Node_1); - - var Grammar_1 = Grammar; - - var AlwaysConsumesOnSuccess = function (_visitor$ASTVisitor) { - _inherits(AlwaysConsumesOnSuccess, _visitor$ASTVisitor); - - function AlwaysConsumesOnSuccess(ast) { - var _this2; - - _classCallCheck(this, AlwaysConsumesOnSuccess); - - _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AlwaysConsumesOnSuccess).call(this)); - _this2.ast = ast; - return _this2; - } - - _createClass(AlwaysConsumesOnSuccess, [{ - key: "choice", - value: function choice(node) { - return node.alternatives.every(this.visit, this); - } - }, { - key: "sequence", - value: function sequence(node) { - return node.elements.some(this.visit, this); - } - }, { - key: "rule_ref", - value: function rule_ref(node) { - return this.visit(this.ast.findRule(node.name)); - } - }, { - key: "literal", - value: function literal(node) { - return node.value !== ""; - } - }]); - - return AlwaysConsumesOnSuccess; - }(visitor.ASTVisitor); - - function consumesTrue() { - return true; - } - - function consumesFalse() { - return false; - } - - function consumesExpression(node) { - return this.visit(node.expression); - } - - util.extend(AlwaysConsumesOnSuccess.prototype, { - rule: consumesExpression, - named: consumesExpression, - action: consumesExpression, - labeled: consumesExpression, - text: consumesExpression, - simple_and: consumesFalse, - simple_not: consumesFalse, - optional: consumesFalse, - zero_or_more: consumesFalse, - one_or_more: consumesExpression, - group: consumesExpression, - semantic_and: consumesFalse, - semantic_not: consumesFalse, - class: consumesTrue, - any: consumesTrue - }); - - var visitor$1 = visitor; - var Node$1 = Node_1; - var Grammar$1 = Grammar_1; - var ast = { - visitor: visitor$1, - Node: Node$1, - Grammar: Grammar$1 - }; - - function calcReportFailures(ast, session, options) { - ast.rules.forEach(function (rule) { - rule.reportFailures = false; - }); - var changedRules = options.allowedStartRules.map(function (name) { - var rule = ast.findRule(name); - rule.reportFailures = true; - return rule; - }); - var calc = session.buildVisitor({ - rule: function rule(node) { - calc(node.expression); - }, - named: function named() {}, - rule_ref: function rule_ref(node) { - var rule = ast.findRule(node.name); - - if (!rule.reportFailures) { - rule.reportFailures = true; - changedRules.push(rule); - } - } - }); - - while (changedRules.length > 0) { - calc(changedRules.pop()); - } - } - - var calcReportFailures_1 = calcReportFailures; - - function generateBytecode(ast, session) { - var op = session.opcodes; - var literals = []; - var classes = []; - var expectations = []; - var functions = []; - var generate; - - function addLiteralConst(value) { - var index = literals.indexOf(value); - return index === -1 ? literals.push(value) - 1 : index; - } - - function addClassConst(node) { - var cls = { - value: node.parts, - inverted: node.inverted, - ignoreCase: node.ignoreCase - }; - var pattern = JSON.stringify(cls); - var index = util.findIndex(classes, function (c) { - return JSON.stringify(c) === pattern; - }); - return index === -1 ? classes.push(cls) - 1 : index; - } - - function addExpectedConst(expected) { - var pattern = JSON.stringify(expected); - var index = util.findIndex(expectations, function (e) { - return JSON.stringify(e) === pattern; - }); - return index === -1 ? expectations.push(expected) - 1 : index; - } - - function addFunctionConst(predicate, params, code) { - var func = { - predicate: predicate, - params: params, - body: code - }; - var pattern = JSON.stringify(func); - var index = util.findIndex(functions, function (f) { - return JSON.stringify(f) === pattern; - }); - return index === -1 ? functions.push(func) - 1 : index; - } - - var buildSequence = function buildSequence() { - var _ref; - - return (_ref = []).concat.apply(_ref, arguments); - }; - - function buildCondition(match, condCode, thenCode, elseCode) { - if (match > 0) return thenCode; - if (match < 0) return elseCode; - return condCode.concat([thenCode.length, elseCode.length], thenCode, elseCode); - } - - function buildLoop(condCode, bodyCode) { - return condCode.concat([bodyCode.length], bodyCode); - } - - function buildCall(functionIndex, delta, env, sp) { - var params = util.values(env, function (value) { - return sp - value; - }); - return [op.CALL, functionIndex, delta, params.length].concat(params); - } - - function buildSimplePredicate(expression, negative, context) { - var match = expression.match | 0; - return buildSequence([op.PUSH_CURR_POS], [op.EXPECT_NS_BEGIN], generate(expression, { - sp: context.sp + 1, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }), [op.EXPECT_NS_END, negative ? 1 : 0], buildCondition(negative ? -match : match, [negative ? op.IF_ERROR : op.IF_NOT_ERROR], buildSequence([op.POP], [negative ? op.POP : op.POP_CURR_POS], [op.PUSH_UNDEFINED]), buildSequence([op.POP], [negative ? op.POP_CURR_POS : op.POP], [op.PUSH_FAILED]))); - } - - function buildSemanticPredicate(node, negative, context) { - var functionIndex = addFunctionConst(true, Object.keys(context.env), node.code); - return buildSequence([op.UPDATE_SAVED_POS], buildCall(functionIndex, 0, context.env, context.sp), buildCondition(node.match | 0, [op.IF], buildSequence([op.POP], negative ? [op.PUSH_FAILED] : [op.PUSH_UNDEFINED]), buildSequence([op.POP], negative ? [op.PUSH_UNDEFINED] : [op.PUSH_FAILED]))); - } - - function buildAppendLoop(expressionCode) { - return buildLoop([op.WHILE_NOT_ERROR], buildSequence([op.APPEND], expressionCode)); - } - - generate = session.buildVisitor({ - grammar: function grammar(node) { - node.rules.forEach(generate); - node.literals = literals; - node.classes = classes; - node.expectations = expectations; - node.functions = functions; - }, - rule: function rule(node) { - node.bytecode = generate(node.expression, { - sp: -1, - env: {}, - action: null, - reportFailures: node.reportFailures - }); - }, - named: function named(node, context) { - var nameIndex = context.reportFailures ? addExpectedConst({ - type: "rule", - value: node.name - }) : null; - var expressionCode = generate(node.expression, { - sp: context.sp, - env: context.env, - action: context.action, - reportFailures: false - }); - return context.reportFailures ? buildSequence([op.EXPECT, nameIndex], [op.SILENT_FAILS_ON], expressionCode, [op.SILENT_FAILS_OFF]) : expressionCode; - }, - choice: function choice(node, context) { - function buildAlternativesCode(alternatives, context) { - return buildSequence(generate(alternatives[0], { - sp: context.sp, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }), alternatives.length < 2 ? [] : buildCondition(-(alternatives[0].match | 0), [op.IF_ERROR], buildSequence([op.POP], buildAlternativesCode(alternatives.slice(1), context)), [])); - } - - return buildAlternativesCode(node.alternatives, context); - }, - action: function action(node, context) { - var env = util.clone(context.env); - var emitCall = node.expression.type !== "sequence" || node.expression.elements.length === 0; - var expressionCode = generate(node.expression, { - sp: context.sp + (emitCall ? 1 : 0), - env: env, - action: node, - reportFailures: context.reportFailures - }); - var match = node.expression.match | 0; - var functionIndex = emitCall && match >= 0 ? addFunctionConst(false, Object.keys(env), node.code) : null; - return emitCall === false ? expressionCode : buildSequence([op.PUSH_CURR_POS], expressionCode, buildCondition(match, [op.IF_NOT_ERROR], buildSequence([op.LOAD_SAVED_POS, 1], buildCall(functionIndex, 1, env, context.sp + 2)), []), [op.NIP]); - }, - sequence: function sequence(node, context) { - var TOTAL_ELEMENTS = node.elements.length; - - function buildElementsCode(elements, context) { - if (elements.length > 0) { - var processedCount = TOTAL_ELEMENTS - elements.slice(1).length; - return buildSequence(generate(elements[0], { - sp: context.sp, - env: context.env, - pluck: context.pluck, - action: null, - reportFailures: context.reportFailures - }), buildCondition(elements[0].match | 0, [op.IF_NOT_ERROR], buildElementsCode(elements.slice(1), { - sp: context.sp + 1, - env: context.env, - pluck: context.pluck, - action: context.action, - reportFailures: context.reportFailures - }), buildSequence(processedCount > 1 ? [op.POP_N, processedCount] : [op.POP], [op.POP_CURR_POS], [op.PUSH_FAILED]))); - } - - if (context.pluck.length > 0) return buildSequence([op.PLUCK, TOTAL_ELEMENTS + 1, context.pluck.length], context.pluck.map(function (eSP) { - return context.sp - eSP; - })); - if (context.action) return buildSequence([op.LOAD_SAVED_POS, TOTAL_ELEMENTS], buildCall(addFunctionConst(false, Object.keys(context.env), context.action.code), TOTAL_ELEMENTS + 1, context.env, context.sp)); - return buildSequence([op.WRAP, TOTAL_ELEMENTS], [op.NIP]); - } - - return buildSequence([op.PUSH_CURR_POS], buildElementsCode(node.elements, { - sp: context.sp + 1, - env: context.env, - pluck: [], - action: context.action, - reportFailures: context.reportFailures - })); - }, - labeled: function labeled(node, context) { - var env = context.env; - var label = node.label; - var sp = context.sp + 1; - - if (label !== null) { - env = util.clone(context.env); - context.env[label] = sp; - } - - if (context.pluck && node.pick) context.pluck.push(sp); - return generate(node.expression, { - sp: context.sp, - env: env, - action: null, - reportFailures: context.reportFailures - }); - }, - text: function text(node, context) { - return buildSequence([op.PUSH_CURR_POS], generate(node.expression, { - sp: context.sp + 1, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }), buildCondition(node.expression.match | 0, [op.IF_NOT_ERROR], buildSequence([op.POP], [op.TEXT]), [op.NIP])); - }, - simple_and: function simple_and(node, context) { - return buildSimplePredicate(node.expression, false, context); - }, - simple_not: function simple_not(node, context) { - return buildSimplePredicate(node.expression, true, context); - }, - optional: function optional(node, context) { - return buildSequence(generate(node.expression, { - sp: context.sp, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }), buildCondition(-(node.expression.match | 0), [op.IF_ERROR], buildSequence([op.POP], [op.PUSH_NULL]), [])); - }, - zero_or_more: function zero_or_more(node, context) { - var expressionCode = generate(node.expression, { - sp: context.sp + 1, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }); - return buildSequence([op.PUSH_EMPTY_ARRAY], expressionCode, buildAppendLoop(expressionCode), [op.POP]); - }, - one_or_more: function one_or_more(node, context) { - var expressionCode = generate(node.expression, { - sp: context.sp + 1, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }); - return buildSequence([op.PUSH_EMPTY_ARRAY], expressionCode, buildCondition(node.expression.match | 0, [op.IF_NOT_ERROR], buildSequence(buildAppendLoop(expressionCode), [op.POP]), buildSequence([op.POP], [op.POP], [op.PUSH_FAILED]))); - }, - group: function group(node, context) { - return generate(node.expression, { - sp: context.sp, - env: util.clone(context.env), - action: null, - reportFailures: context.reportFailures - }); - }, - semantic_and: function semantic_and(node, context) { - return buildSemanticPredicate(node, false, context); - }, - semantic_not: function semantic_not(node, context) { - return buildSemanticPredicate(node, true, context); - }, - rule_ref: function rule_ref(node) { - return [op.RULE, ast.indexOfRule(node.name)]; - }, - literal: function literal(node, context) { - if (node.value.length > 0) { - var match = node.match | 0; - var needConst = match === 0 || match > 0 && !node.ignoreCase; - var stringIndex = needConst ? addLiteralConst(node.ignoreCase ? node.value.toLowerCase() : node.value) : null; - var expectedIndex = context.reportFailures ? addExpectedConst({ - type: "literal", - value: node.value, - ignoreCase: node.ignoreCase - }) : null; - return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(match, node.ignoreCase ? [op.MATCH_STRING_IC, stringIndex] : [op.MATCH_STRING, stringIndex], node.ignoreCase ? [op.ACCEPT_N, node.value.length] : [op.ACCEPT_STRING, stringIndex], [op.PUSH_FAILED])); - } - - return [op.PUSH_EMPTY_STRING]; - }, - class: function _class(node, context) { - var match = node.match | 0; - var classIndex = match === 0 ? addClassConst(node) : null; - var expectedIndex = context.reportFailures ? addExpectedConst({ - type: "class", - value: node.parts, - inverted: node.inverted, - ignoreCase: node.ignoreCase - }) : null; - return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(match, [op.MATCH_CLASS, classIndex], [op.ACCEPT_N, 1], [op.PUSH_FAILED])); - }, - any: function any(node, context) { - var expectedIndex = context.reportFailures ? addExpectedConst({ - type: "any" - }) : null; - return buildSequence(context.reportFailures ? [op.EXPECT, expectedIndex] : [], buildCondition(node.match | 0, [op.MATCH_ANY], [op.ACCEPT_N, 1], [op.PUSH_FAILED])); - } - }); - generate(ast); - } - - var generateBytecode_1 = generateBytecode; - - var _package = { - name: "pegjs", - version: "0.11.0-dev", - description: "Parser generator for JavaScript", - keywords: [ - "PEG.js", - "pegjs", - "grammar", - "parser", - "generator", - "language", - "PEG" - ], - homepage: "https://pegjs.org/", - repository: "pegjs/pegjs", - license: "MIT", - contributors: [ - "David Majda (https://majda.cz/)", - "Futago-za Ryuu " - ], - types: "typings/pegjs.d.ts", - main: "lib/peg.js", - bin: "bin/peg.js", - engines: { - node: ">= 6" - } - }; - - var _package$1 = /*#__PURE__*/Object.freeze({ - default: _package - }); - - var require$$0 = getCjsExportFromNamespace(_package$1); - - var VERSION = require$$0.version; - - function generateJS(ast, session, options) { - var op = session.opcodes; - var features = options.features || {}; - - function use(feature, use) { - return feature in features ? !!features[feature] : use == null ? true : !!use; - } - - var lineMatchRE = /^([^`\r\n]+?(?:`[^`]*?`[^\r\n]*?)?)$/gm; - - function indent2(code) { - return code.replace(lineMatchRE, " $1"); - } - - function indent10(code) { - return code.replace(lineMatchRE, " $1"); - } - - var l = function l(i) { - return "peg$c" + i; - }; - - var r = function r(i) { - return "peg$r" + i; - }; - - var e = function e(i) { - return "peg$e" + i; - }; - - var f = function f(i) { - return "peg$f" + i; - }; - - function generateTables() { - function buildLiteral(literal) { - return "\"".concat(util.stringEscape(literal), "\""); - } - - function buildRegexp(cls) { - return "/^[" + (cls.inverted ? "^" : "") + cls.value.map(function (part) { - return Array.isArray(part) ? util.regexpEscape(part[0]) + "-" + util.regexpEscape(part[1]) : util.regexpEscape(part); - }).join("") + "]/" + (cls.ignoreCase ? "i" : ""); - } - - function buildExpectation(e) { - switch (e.type) { - case "rule": - return "peg$otherExpectation(\"".concat(util.stringEscape(e.value), "\")"); - - case "literal": - return "peg$literalExpectation(\"" + util.stringEscape(e.value) + "\", " + e.ignoreCase + ")"; - - case "class": - { - var parts = e.value.map(function (part) { - return Array.isArray(part) ? "[\"".concat(util.stringEscape(part[0]), "\", \"").concat(util.stringEscape(part[1]), "\"]") : "\"".concat(util.stringEscape(part), "\""); - }); - return "peg$classExpectation([" + parts.join(", ") + "], " + e.inverted + ", " + e.ignoreCase + ")"; - } - - case "any": - return "peg$anyExpectation()"; - - default: - session.fatal("Unknown expectation type (".concat(JSON.stringify(e), ")")); - } - } - - function buildFunc(f) { - return "function(".concat(f.params.join(", "), ") {").concat(f.body, "}"); - } - - if (options.optimize === "size") { - return ["var peg$literals = [", indent2(ast.literals.map(buildLiteral).join(",\n")), "];", "var peg$regexps = [", indent2(ast.classes.map(buildRegexp).join(",\n")), "];", "var peg$expectations = [", indent2(ast.expectations.map(buildExpectation).join(",\n")), "];", "var peg$functions = [", indent2(ast.functions.map(buildFunc).join(",\n")), "];", "", "var peg$bytecode = [", indent2(ast.rules.map(function (rule) { - return "peg$decode(\"".concat(util.stringEscape(rule.bytecode.map(function (b) { - return String.fromCharCode(b + 32); - }).join("")), "\")"); - }).join(",\n")), "];"].join("\n"); - } - - return ast.literals.map(function (c, i) { - return "var " + l(i) + " = " + buildLiteral(c) + ";"; - }).concat("", ast.classes.map(function (c, i) { - return "var " + r(i) + " = " + buildRegexp(c) + ";"; - })).concat("", ast.expectations.map(function (c, i) { - return "var " + e(i) + " = " + buildExpectation(c) + ";"; - })).concat("", ast.functions.map(function (c, i) { - return "var " + f(i) + " = " + buildFunc(c) + ";"; - })).join("\n"); - } - - function generateRuleHeader(ruleNameCode, ruleIndexCode) { - var parts = []; - parts.push(["", "var rule$expects = function (expected) {", " if (peg$silentFails === 0) peg$expect(expected);", "}", ""].join("\n")); - - if (options.trace) { - parts.push(["peg$tracer.trace({", " type: \"rule.enter\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", "});", ""].join("\n")); - } - - if (options.cache) { - parts.push(["var key = peg$currPos * " + ast.rules.length + " + " + ruleIndexCode + ";", "var cached = peg$resultsCache[key];", "var rule$expectations = [];", "", "rule$expects = function (expected) {", " if (peg$silentFails === 0) peg$expect(expected);", " rule$expectations.push(expected);", "}", "", "if (cached) {", " peg$currPos = cached.nextPos;", "", " rule$expectations = cached.expectations;", " if (peg$silentFails === 0) {", " rule$expectations.forEach(peg$expect);", " }", ""].join("\n")); - - if (options.trace) { - parts.push(["if (cached.result !== peg$FAILED) {", " peg$tracer.trace({", " type: \"rule.match\",", " rule: " + ruleNameCode + ",", " result: cached.result,", " location: peg$computeLocation(startPos, peg$currPos)", " });", "} else {", " peg$tracer.trace({", " type: \"rule.fail\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", " });", "}", ""].join("\n")); - } - - parts.push([" return cached.result;", "}", ""].join("\n")); - } - - return parts.join("\n"); - } - - function generateRuleFooter(ruleNameCode, resultCode) { - var parts = []; - - if (options.cache) { - parts.push(["", "peg$resultsCache[key] = {", " nextPos: peg$currPos,", " result: " + resultCode + ",", " expectations: rule$expectations", "};"].join("\n")); - } - - if (options.trace) { - parts.push(["", "if (" + resultCode + " !== peg$FAILED) {", " peg$tracer.trace({", " type: \"rule.match\",", " rule: " + ruleNameCode + ",", " result: " + resultCode + ",", " location: peg$computeLocation(startPos, peg$currPos)", " });", "} else {", " peg$tracer.trace({", " type: \"rule.fail\",", " rule: " + ruleNameCode + ",", " location: peg$computeLocation(startPos, startPos)", " });", "}"].join("\n")); - } - - parts.push(["", "return " + resultCode + ";"].join("\n")); - return parts.join("\n"); - } - - function generateInterpreter() { - var parts = []; - - function generateCondition(cond, argsLength) { - var baseLength = argsLength + 3; - var thenLengthCode = "bc[ip + " + (baseLength - 2) + "]"; - var elseLengthCode = "bc[ip + " + (baseLength - 1) + "]"; - return ["ends.push(end);", "ips.push(ip + " + baseLength + " + " + thenLengthCode + " + " + elseLengthCode + ");", "", "if (" + cond + ") {", " end = ip + " + baseLength + " + " + thenLengthCode + ";", " ip += " + baseLength + ";", "} else {", " end = ip + " + baseLength + " + " + thenLengthCode + " + " + elseLengthCode + ";", " ip += " + baseLength + " + " + thenLengthCode + ";", "}", "", "break;"].join("\n"); - } - - function generateLoop(cond) { - var baseLength = 2; - var bodyLengthCode = "bc[ip + " + (baseLength - 1) + "]"; - return ["if (" + cond + ") {", " ends.push(end);", " ips.push(ip);", "", " end = ip + " + baseLength + " + " + bodyLengthCode + ";", " ip += " + baseLength + ";", "} else {", " ip += " + baseLength + " + " + bodyLengthCode + ";", "}", "", "break;"].join("\n"); - } - - function generateCall() { - var baseLength = 4; - var paramsLengthCode = "bc[ip + " + (baseLength - 1) + "]"; - return ["params = bc.slice(ip + " + baseLength + ", ip + " + baseLength + " + " + paramsLengthCode + ")", " .map(function(p) { return stack[stack.length - 1 - p]; });", "", "stack.splice(", " stack.length - bc[ip + 2],", " bc[ip + 2],", " peg$functions[bc[ip + 1]].apply(null, params)", ");", "", "ip += " + baseLength + " + " + paramsLengthCode + ";", "break;"].join("\n"); - } - - parts.push(["function peg$decode(s) {", " return s.split(\"\").map(function(ch) { return ch.charCodeAt(0) - 32; });", "}", "", "function peg$parseRule(index) {"].join("\n")); - - if (options.trace) { - parts.push([" var bc = peg$bytecode[index];", " var ip = 0;", " var ips = [];", " var end = bc.length;", " var ends = [];", " var stack = [];", " var startPos = peg$currPos;", " var params, paramsLength, paramsN;"].join("\n")); - } else { - parts.push([" var bc = peg$bytecode[index];", " var ip = 0;", " var ips = [];", " var end = bc.length;", " var ends = [];", " var stack = [];", " var params, paramsLength, paramsN;"].join("\n")); - } - - parts.push(indent2(generateRuleHeader("peg$ruleNames[index]", "index"))); - parts.push([" while (true) {", " while (ip < end) {", " switch (bc[ip]) {", " case " + op.PUSH_EMPTY_STRING + ":", " stack.push('');", " ip++;", " break;", "", " case " + op.PUSH_UNDEFINED + ":", " stack.push(undefined);", " ip++;", " break;", "", " case " + op.PUSH_NULL + ":", " stack.push(null);", " ip++;", " break;", "", " case " + op.PUSH_FAILED + ":", " stack.push(peg$FAILED);", " ip++;", " break;", "", " case " + op.PUSH_EMPTY_ARRAY + ":", " stack.push([]);", " ip++;", " break;", "", " case " + op.PUSH_CURR_POS + ":", " stack.push(peg$currPos);", " ip++;", " break;", "", " case " + op.POP + ":", " stack.pop();", " ip++;", " break;", "", " case " + op.POP_CURR_POS + ":", " peg$currPos = stack.pop();", " ip++;", " break;", "", " case " + op.POP_N + ":", " stack.length -= bc[ip + 1];", " ip += 2;", " break;", "", " case " + op.NIP + ":", " stack.splice(-2, 1);", " ip++;", " break;", "", " case " + op.APPEND + ":", " stack[stack.length - 2].push(stack.pop());", " ip++;", " break;", "", " case " + op.WRAP + ":", " stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1]));", " ip += 2;", " break;", "", " case " + op.TEXT + ":", " stack.push(input.substring(stack.pop(), peg$currPos));", " ip++;", " break;", "", " case " + op.PLUCK + ":", " paramsLength = bc[ip + 2];", " paramsN = 3 + paramsLength", "", " params = bc.slice(ip + 3, ip + paramsN);", " params = paramsLength === 1", " ? stack[stack.length - 1 - params[ 0 ]]", " : params.map(function(p) { return stack[stack.length - 1 - p]; });", "", " stack.splice(", " stack.length - bc[ip + 1],", " bc[ip + 1],", " params", " );", "", " ip += paramsN;", " break;", "", " case " + op.IF + ":", indent10(generateCondition("stack[stack.length - 1]", 0)), "", " case " + op.IF_ERROR + ":", indent10(generateCondition("stack[stack.length - 1] === peg$FAILED", 0)), "", " case " + op.IF_NOT_ERROR + ":", indent10(generateCondition("stack[stack.length - 1] !== peg$FAILED", 0)), "", " case " + op.WHILE_NOT_ERROR + ":", indent10(generateLoop("stack[stack.length - 1] !== peg$FAILED")), "", " case " + op.MATCH_ANY + ":", indent10(generateCondition("input.length > peg$currPos", 0)), "", " case " + op.MATCH_STRING + ":", indent10(generateCondition("input.substr(peg$currPos, peg$literals[bc[ip + 1]].length) === peg$literals[bc[ip + 1]]", 1)), "", " case " + op.MATCH_STRING_IC + ":", indent10(generateCondition("input.substr(peg$currPos, peg$literals[bc[ip + 1]].length).toLowerCase() === peg$literals[bc[ip + 1]]", 1)), "", " case " + op.MATCH_CLASS + ":", indent10(generateCondition("peg$regexps[bc[ip + 1]].test(input.charAt(peg$currPos))", 1)), "", " case " + op.ACCEPT_N + ":", " stack.push(input.substr(peg$currPos, bc[ip + 1]));", " peg$currPos += bc[ip + 1];", " ip += 2;", " break;", "", " case " + op.ACCEPT_STRING + ":", " stack.push(peg$literals[bc[ip + 1]]);", " peg$currPos += peg$literals[bc[ip + 1]].length;", " ip += 2;", " break;", "", " case " + op.EXPECT + ":", " rule$expects(peg$expectations[bc[ip + 1]]);", " ip += 2;", " break;", "", " case " + op.LOAD_SAVED_POS + ":", " peg$savedPos = stack[stack.length - 1 - bc[ip + 1]];", " ip += 2;", " break;", "", " case " + op.UPDATE_SAVED_POS + ":", " peg$savedPos = peg$currPos;", " ip++;", " break;", "", " case " + op.CALL + ":", indent10(generateCall()), "", " case " + op.RULE + ":", " stack.push(peg$parseRule(bc[ip + 1]));", " ip += 2;", " break;", "", " case " + op.SILENT_FAILS_ON + ":", " peg$silentFails++;", " ip++;", " break;", "", " case " + op.SILENT_FAILS_OFF + ":", " peg$silentFails--;", " ip++;", " break;", "", " case " + op.EXPECT_NS_BEGIN + ":", " peg$begin();", " ip++;", " break;", "", " case " + op.EXPECT_NS_END + ":", " peg$end(bc[ip + 1]);", " ip += 2;", " break;", "", " // istanbul ignore next", " default:", " throw new Error(", " \"Rule #\" + index + \"" + (options.trace ? " ('\" + peg$ruleNames[ index ] + \"')" : "") + ", position \" + ip + \": \"", " + \"Invalid opcode \" + bc[ip] + \".\"", " );", " }", " }", "", " if (ends.length > 0) {", " end = ends.pop();", " ip = ips.pop();", " } else {", " break;", " }", " }"].join("\n")); - parts.push(indent2(generateRuleFooter("peg$ruleNames[index]", "stack[0]"))); - parts.push("}"); - return parts.join("\n"); - } - - function generateRuleFunction(rule) { - var parts = []; - var stackVars = []; - - function s(i) { - if (i < 0) session.fatal("Rule '" + rule.name + "': Var stack underflow: attempt to use var at index " + i); - return "s" + i; - } - - var stack = { - sp: -1, - maxSp: -1, - push: function push(exprCode) { - var code = s(++this.sp) + " = " + exprCode + ";"; - if (this.sp > this.maxSp) this.maxSp = this.sp; - return code; - }, - pop: function pop(n) { - if (typeof n === "undefined") return s(this.sp--); - var values = Array(n); - - for (var i = 0; i < n; i++) { - values[i] = s(this.sp - n + 1 + i); - } - - this.sp -= n; - return values; - }, - top: function top() { - return s(this.sp); - }, - index: function index(i) { - return s(this.sp - i); - } - }; - - function compile(bc) { - var ip = 0; - var end = bc.length; - var parts = []; - var value; - - function compileCondition(cond, argCount) { - var pos = ip; - var baseLength = argCount + 3; - var thenLength = bc[ip + baseLength - 2]; - var elseLength = bc[ip + baseLength - 1]; - var baseSp = stack.sp; - var thenCode, elseCode, thenSp, elseSp; - ip += baseLength; - thenCode = compile(bc.slice(ip, ip + thenLength)); - thenSp = stack.sp; - ip += thenLength; - - if (elseLength > 0) { - stack.sp = baseSp; - elseCode = compile(bc.slice(ip, ip + elseLength)); - elseSp = stack.sp; - ip += elseLength; - - if (thenSp !== elseSp) { - session.fatal("Rule '" + rule.name + "', position " + pos + ": " + "Branches of a condition can't move the stack pointer differently " + "(before: " + baseSp + ", after then: " + thenSp + ", after else: " + elseSp + ")."); - } - } - - parts.push("if (" + cond + ") {"); - parts.push(indent2(thenCode)); - - if (elseLength > 0) { - parts.push("} else {"); - parts.push(indent2(elseCode)); - } - - parts.push("}"); - } - - function compileLoop(cond) { - var pos = ip; - var baseLength = 2; - var bodyLength = bc[ip + baseLength - 1]; - var baseSp = stack.sp; - var bodyCode, bodySp; - ip += baseLength; - bodyCode = compile(bc.slice(ip, ip + bodyLength)); - bodySp = stack.sp; - ip += bodyLength; - - if (bodySp !== baseSp) { - session.fatal("Rule '" + rule.name + "', position " + pos + ": " + "Body of a loop can't move the stack pointer " + "(before: " + baseSp + ", after: " + bodySp + ")."); - } - - parts.push("while (" + cond + ") {"); - parts.push(indent2(bodyCode)); - parts.push("}"); - } - - function compileCall() { - var baseLength = 4; - var paramsLength = bc[ip + baseLength - 1]; - var value = f(bc[ip + 1]) + "(" + bc.slice(ip + baseLength, ip + baseLength + paramsLength).map(function (p) { - return stack.index(p); - }).join(", ") + ")"; - stack.pop(bc[ip + 2]); - parts.push(stack.push(value)); - ip += baseLength + paramsLength; - } - - while (ip < end) { - switch (bc[ip]) { - case op.PUSH_EMPTY_STRING: - parts.push(stack.push("''")); - ip++; - break; - - case op.PUSH_CURR_POS: - parts.push(stack.push("peg$currPos")); - ip++; - break; - - case op.PUSH_UNDEFINED: - parts.push(stack.push("undefined")); - ip++; - break; - - case op.PUSH_NULL: - parts.push(stack.push("null")); - ip++; - break; - - case op.PUSH_FAILED: - parts.push(stack.push("peg$FAILED")); - ip++; - break; - - case op.PUSH_EMPTY_ARRAY: - parts.push(stack.push("[]")); - ip++; - break; - - case op.POP: - stack.pop(); - ip++; - break; - - case op.POP_CURR_POS: - parts.push("peg$currPos = " + stack.pop() + ";"); - ip++; - break; - - case op.POP_N: - stack.pop(bc[ip + 1]); - ip += 2; - break; - - case op.NIP: - value = stack.pop(); - stack.pop(); - parts.push(stack.push(value)); - ip++; - break; - - case op.APPEND: - value = stack.pop(); - parts.push(stack.top() + ".push(" + value + ");"); - ip++; - break; - - case op.WRAP: - parts.push(stack.push("[" + stack.pop(bc[ip + 1]).join(", ") + "]")); - ip += 2; - break; - - case op.TEXT: - parts.push(stack.push("input.substring(" + stack.pop() + ", peg$currPos)")); - ip++; - break; - - case op.PLUCK: - var baseLength = 3; - var paramsLength = bc[ip + baseLength - 1]; - var n = baseLength + paramsLength; - value = bc.slice(ip + baseLength, ip + n); - value = paramsLength === 1 ? stack.index(value[0]) : "[ ".concat(value.map(function (p) { - return stack.index(p); - }).join(", "), " ]"); - stack.pop(bc[ip + 1]); - parts.push(stack.push(value)); - ip += n; - break; - - case op.IF: - compileCondition(stack.top(), 0); - break; - - case op.IF_ERROR: - compileCondition(stack.top() + " === peg$FAILED", 0); - break; - - case op.IF_NOT_ERROR: - compileCondition(stack.top() + " !== peg$FAILED", 0); - break; - - case op.WHILE_NOT_ERROR: - compileLoop(stack.top() + " !== peg$FAILED", 0); - break; - - case op.MATCH_ANY: - compileCondition("input.length > peg$currPos", 0); - break; - - case op.MATCH_STRING: - compileCondition(ast.literals[bc[ip + 1]].length > 1 ? "input.substr(peg$currPos, " + ast.literals[bc[ip + 1]].length + ") === " + l(bc[ip + 1]) : "input.charCodeAt(peg$currPos) === " + ast.literals[bc[ip + 1]].charCodeAt(0), 1); - break; - - case op.MATCH_STRING_IC: - compileCondition("input.substr(peg$currPos, " + ast.literals[bc[ip + 1]].length + ").toLowerCase() === " + l(bc[ip + 1]), 1); - break; - - case op.MATCH_CLASS: - compileCondition(r(bc[ip + 1]) + ".test(input.charAt(peg$currPos))", 1); - break; - - case op.ACCEPT_N: - parts.push(stack.push(bc[ip + 1] > 1 ? "input.substr(peg$currPos, " + bc[ip + 1] + ")" : "input.charAt(peg$currPos)")); - parts.push(bc[ip + 1] > 1 ? "peg$currPos += " + bc[ip + 1] + ";" : "peg$currPos++;"); - ip += 2; - break; - - case op.ACCEPT_STRING: - parts.push(stack.push(l(bc[ip + 1]))); - parts.push(ast.literals[bc[ip + 1]].length > 1 ? "peg$currPos += " + ast.literals[bc[ip + 1]].length + ";" : "peg$currPos++;"); - ip += 2; - break; - - case op.EXPECT: - parts.push("rule$expects(" + e(bc[ip + 1]) + ");"); - ip += 2; - break; - - case op.LOAD_SAVED_POS: - parts.push("peg$savedPos = " + stack.index(bc[ip + 1]) + ";"); - ip += 2; - break; - - case op.UPDATE_SAVED_POS: - parts.push("peg$savedPos = peg$currPos;"); - ip++; - break; - - case op.CALL: - compileCall(); - break; - - case op.RULE: - parts.push(stack.push("peg$parse" + ast.rules[bc[ip + 1]].name + "()")); - ip += 2; - break; - - case op.SILENT_FAILS_ON: - parts.push("peg$silentFails++;"); - ip++; - break; - - case op.SILENT_FAILS_OFF: - parts.push("peg$silentFails--;"); - ip++; - break; - - case op.EXPECT_NS_BEGIN: - parts.push("peg$begin();"); - ip++; - break; - - case op.EXPECT_NS_END: - parts.push("peg$end(" + (bc[ip + 1] !== 0) + ");"); - ip += 2; - break; - - default: - session.fatal("Rule '" + rule.name + "', position " + ip + ": " + "Invalid opcode " + bc[ip] + "."); - } - } - - return parts.join("\n"); - } - - var code = compile(rule.bytecode); - parts.push("function peg$parse" + rule.name + "() {"); - - if (options.trace) { - parts.push(" var startPos = peg$currPos;"); - } - - for (var i = 0; i <= stack.maxSp; i++) { - stackVars[i] = s(i); - } - - parts.push(" var " + stackVars.join(", ") + ";"); - parts.push(indent2(generateRuleHeader("\"" + util.stringEscape(rule.name) + "\"", ast.indexOfRule(rule.name)))); - parts.push(indent2(code)); - parts.push(indent2(generateRuleFooter("\"" + util.stringEscape(rule.name) + "\"", s(0)))); - parts.push("}"); - return parts.join("\n"); - } - - function generateToplevel() { - var parts = []; - parts.push(["function peg$subclass(child, parent) {", " function C() { this.constructor = child; }", " C.prototype = parent.prototype;", " child.prototype = new C();", "}", "", "function peg$SyntaxError(message, expected, found, location) {", " this.message = message;", " this.expected = expected;", " this.found = found;", " this.location = location;", " this.name = \"SyntaxError\";", "", " // istanbul ignore next", " if (typeof Error.captureStackTrace === \"function\") {", " Error.captureStackTrace(this, peg$SyntaxError);", " }", "}", "", "peg$subclass(peg$SyntaxError, Error);", "", "peg$SyntaxError.buildMessage = function(expected, found) {", " var DESCRIBE_EXPECTATION_FNS = {", " literal: function(expectation) {", " return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";", " },", "", " class: function(expectation) {", " var escapedParts = expectation.parts.map(function(part) {", " return Array.isArray(part)", " ? classEscape(part[0]) + \"-\" + classEscape(part[1])", " : classEscape(part);", " });", "", " return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";", " },", "", " any: function() {", " return \"any character\";", " },", "", " end: function() {", " return \"end of input\";", " },", "", " other: function(expectation) {", " return expectation.description;", " },", "", " not: function(expectation) {", " return \"not \" + describeExpectation(expectation.expected);", " }", " };", "", " function hex(ch) {", " return ch.charCodeAt(0).toString(16).toUpperCase();", " }", "", " function literalEscape(s) {", " return s", " .replace(/\\\\/g, \"\\\\\\\\\")", " .replace(/\"/g, \"\\\\\\\"\")", " .replace(/\\0/g, \"\\\\0\")", " .replace(/\\t/g, \"\\\\t\")", " .replace(/\\n/g, \"\\\\n\")", " .replace(/\\r/g, \"\\\\r\")", " .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })", " .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });", " }", "", " function classEscape(s) {", " return s", " .replace(/\\\\/g, \"\\\\\\\\\")", " .replace(/\\]/g, \"\\\\]\")", " .replace(/\\^/g, \"\\\\^\")", " .replace(/-/g, \"\\\\-\")", " .replace(/\\0/g, \"\\\\0\")", " .replace(/\\t/g, \"\\\\t\")", " .replace(/\\n/g, \"\\\\n\")", " .replace(/\\r/g, \"\\\\r\")", " .replace(/[\\x00-\\x0F]/g, function(ch) { return \"\\\\x0\" + hex(ch); })", " .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return \"\\\\x\" + hex(ch); });", " }", "", " function describeExpectation(expectation) {", " return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);", " }", "", " function describeExpected(expected) {", " var descriptions = expected.map(describeExpectation);", " var i, j;", "", " descriptions.sort();", "", " if (descriptions.length > 0) {", " for (i = 1, j = 1; i < descriptions.length; i++) {", " if (descriptions[i - 1] !== descriptions[i]) {", " descriptions[j] = descriptions[i];", " j++;", " }", " }", " descriptions.length = j;", " }", "", " switch (descriptions.length) {", " case 1:", " return descriptions[0];", "", " case 2:", " return descriptions[0] + \" or \" + descriptions[1];", "", " default:", " return descriptions.slice(0, -1).join(\", \")", " + \", or \"", " + descriptions[descriptions.length - 1];", " }", " }", "", " function describeFound(found) {", " return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";", " }", "", " return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";", "};", ""].join("\n")); - - if (options.trace) { - if (use("DefaultTracer")) parts.push(["function peg$DefaultTracer() {", " this.indentLevel = 0;", "}", "", "peg$DefaultTracer.prototype.trace = function(event) {", " var that = this;", "", " function log(event) {", " function repeat(string, n) {", " var result = \"\", i;", "", " for (i = 0; i < n; i++) {", " result += string;", " }", "", " return result;", " }", "", " function pad(string, length) {", " return string + repeat(\" \", length - string.length);", " }", "", " if (typeof console === \"object\") {", " console.log(", " event.location.start.line + \":\" + event.location.start.column + \"-\"", " + event.location.end.line + \":\" + event.location.end.column + \" \"", " + pad(event.type, 10) + \" \"", " + repeat(\" \", that.indentLevel) + event.rule", " );", " }", " }", "", " switch (event.type) {", " case \"rule.enter\":", " log(event);", " this.indentLevel++;", " break;", "", " case \"rule.match\":", " this.indentLevel--;", " log(event);", " break;", "", " case \"rule.fail\":", " this.indentLevel--;", " log(event);", " break;", "", " // istanbul ignore next", " default:", " throw new Error(\"Invalid event type: \" + event.type + \".\");", " }", "};", ""].join("\n"));else parts.push(["var peg$FauxTracer = {", " trace: function(event) { }", "};", ""].join("\n")); - } - - parts.push(["function peg$parse(input, options) {", " options = options !== undefined ? options : {};", "", " var peg$FAILED = {};", ""].join("\n")); - - if (options.optimize === "size") { - var startRuleIndices = "{ " + options.allowedStartRules.map(function (r) { - return r + ": " + ast.indexOfRule(r); - }).join(", ") + " }"; - var startRuleIndex = ast.indexOfRule(options.allowedStartRules[0]); - parts.push([" var peg$startRuleIndices = " + startRuleIndices + ";", " var peg$startRuleIndex = " + startRuleIndex + ";"].join("\n")); - } else { - var startRuleFunctions = "{ " + options.allowedStartRules.map(function (r) { - return r + ": peg$parse" + r; - }).join(", ") + " }"; - var startRuleFunction = "peg$parse" + options.allowedStartRules[0]; - parts.push([" var peg$startRuleFunctions = " + startRuleFunctions + ";", " var peg$startRuleFunction = " + startRuleFunction + ";"].join("\n")); - } - - parts.push(""); - parts.push(indent2(generateTables())); - parts.push(["", " var peg$currPos = 0;", " var peg$savedPos = 0;", " var peg$posDetailsCache = [{ line: 1, column: 1 }];", " var peg$expected = [];", " var peg$silentFails = 0;", ""].join("\n")); - - if (options.cache) { - parts.push([" var peg$resultsCache = {};", ""].join("\n")); - } - - if (options.trace) { - if (options.optimize === "size") { - var ruleNames = "[" + ast.rules.map(function (r) { - return "\"".concat(util.stringEscape(r.name), "\""); - }).join(", ") + "]"; - parts.push([" var peg$ruleNames = " + ruleNames + ";", ""].join("\n")); - } - - if (use("DefaultTracer")) parts.push([" var peg$tracer = \"tracer\" in options ? options.tracer : new peg$DefaultTracer();", ""].join("\n"));else parts.push([" var peg$tracer = \"tracer\" in options ? options.tracer : peg$FauxTracer;", ""].join("\n")); - } - - parts.push([" var peg$result;", ""].join("\n")); - - if (options.optimize === "size") { - parts.push([" if (\"startRule\" in options) {", " if (!(options.startRule in peg$startRuleIndices)) {", " throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");", " }", "", " peg$startRuleIndex = peg$startRuleIndices[options.startRule];", " }"].join("\n")); - } else { - parts.push([" if (\"startRule\" in options) {", " if (!(options.startRule in peg$startRuleFunctions)) {", " throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");", " }", "", " peg$startRuleFunction = peg$startRuleFunctions[options.startRule];", " }"].join("\n")); - } - - if (use("text")) { - parts.push(["", " function text() {", " return input.substring(peg$savedPos, peg$currPos);", " }"].join("\n")); - } - - if (use("offset")) { - parts.push(["", " function offset() {", " return peg$savedPos;", " }"].join("\n")); - } - - if (use("range")) { - parts.push(["", " function range() {", " return [peg$savedPos, peg$currPos];", " }"].join("\n")); - } - - if (use("location")) { - parts.push(["", " function location() {", " return peg$computeLocation(peg$savedPos, peg$currPos);", " }"].join("\n")); - } - - if (use("expected")) { - parts.push(["", " function expected(description, location) {", " location = location !== undefined", " ? location", " : peg$computeLocation(peg$savedPos, peg$currPos);", "", " throw peg$buildStructuredError(", " [peg$otherExpectation(description)],", " input.substring(peg$savedPos, peg$currPos),", " location", " );", " }"].join("\n")); - } - - if (use("error")) { - parts.push(["", " function error(message, location) {", " location = location !== undefined", " ? location", " : peg$computeLocation(peg$savedPos, peg$currPos);", "", " throw peg$buildSimpleError(message, location);", " }"].join("\n")); - } - - parts.push(["", " function peg$literalExpectation(text, ignoreCase) {", " return { type: \"literal\", text: text, ignoreCase: ignoreCase };", " }", "", " function peg$classExpectation(parts, inverted, ignoreCase) {", " return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };", " }", "", " function peg$anyExpectation() {", " return { type: \"any\" };", " }", "", " function peg$endExpectation() {", " return { type: \"end\" };", " }", "", " function peg$otherExpectation(description) {", " return { type: \"other\", description: description };", " }", "", " function peg$computePosDetails(pos) {", " var details = peg$posDetailsCache[pos];", " var p;", "", " if (details) {", " return details;", " } else {", " p = pos - 1;", " while (!peg$posDetailsCache[p]) {", " p--;", " }", "", " details = peg$posDetailsCache[p];", " details = {", " line: details.line,", " column: details.column", " };", "", " while (p < pos) {", " if (input.charCodeAt(p) === 10) {", " details.line++;", " details.column = 1;", " } else {", " details.column++;", " }", "", " p++;", " }", "", " peg$posDetailsCache[pos] = details;", "", " return details;", " }", " }", "", use("filename") ? " var peg$VALIDFILENAME = typeof options.filename === \"string\" && options.filename.length > 0;" : "", " function peg$computeLocation(startPos, endPos) {", " var loc = {};", "", use("filename") ? " if ( peg$VALIDFILENAME ) loc.filename = options.filename;" : "", "", " var startPosDetails = peg$computePosDetails(startPos);", " loc.start = {", " offset: startPos,", " line: startPosDetails.line,", " column: startPosDetails.column", " };", "", " var endPosDetails = peg$computePosDetails(endPos);", " loc.end = {", " offset: endPos,", " line: endPosDetails.line,", " column: endPosDetails.column", " };", "", " return loc;", " }", "", " function peg$begin() {", " peg$expected.push({ pos: peg$currPos, variants: [] });", " }", "", " function peg$expect(expected) {", " var top = peg$expected[peg$expected.length - 1];", "", " if (peg$currPos < top.pos) { return; }", "", " if (peg$currPos > top.pos) {", " top.pos = peg$currPos;", " top.variants = [];", " }", "", " top.variants.push(expected);", " }", "", " function peg$end(invert) {", " var expected = peg$expected.pop();", " var top = peg$expected[peg$expected.length - 1];", " var variants = expected.variants;", "", " if (top.pos !== expected.pos) { return; }", "", " if (invert) {", " variants = variants.map(function(e) {", " return e.type === \"not\" ? e.expected : { type: \"not\", expected: e };", " });", " }", "", " Array.prototype.push.apply(top.variants, variants);", " }", "", " function peg$buildSimpleError(message, location) {", " return new peg$SyntaxError(message, null, null, location);", " }", "", " function peg$buildStructuredError(expected, found, location) {", " return new peg$SyntaxError(", " peg$SyntaxError.buildMessage(expected, found),", " expected,", " found,", " location", " );", " }", "", " function peg$buildError() {", " var expected = peg$expected[0];", " var failPos = expected.pos;", "", " return peg$buildStructuredError(", " expected.variants,", " failPos < input.length ? input.charAt(failPos) : null,", " failPos < input.length", " ? peg$computeLocation(failPos, failPos + 1)", " : peg$computeLocation(failPos, failPos)", " );", " }", ""].join("\n")); - - if (options.optimize === "size") { - parts.push(indent2(generateInterpreter())); - parts.push(""); - } else { - ast.rules.forEach(function (rule) { - parts.push(indent2(generateRuleFunction(rule))); - parts.push(""); - }); - } - - if (ast.initializer) { - parts.push(indent2(ast.initializer.code)); - parts.push(""); - } - - parts.push(" peg$begin();"); - - if (options.optimize === "size") { - parts.push(" peg$result = peg$parseRule(peg$startRuleIndex);"); - } else { - parts.push(" peg$result = peg$startRuleFunction();"); - } - - parts.push(["", " if (peg$result !== peg$FAILED && peg$currPos === input.length) {", " return peg$result;", " } else {", " if (peg$result !== peg$FAILED && peg$currPos < input.length) {", " peg$expect(peg$endExpectation());", " }", "", " throw peg$buildError();", " }", "}"].join("\n")); - return parts.join("\n"); - } - - function generateWrapper(toplevelCode) { - function generateHeaderComment() { - var comment = "// Generated by PEG.js v".concat(VERSION, ", https://pegjs.org/"); - var header = options.header; - - if (typeof header === "string") { - comment += "\n\n" + header; - } else if (Array.isArray(header)) { - comment += "\n\n"; - header.forEach(function (data) { - comment += "// " + data; - }); - } - - return comment; - } - - function generateParserObject() { - return options.trace && use("DefaultTracer") ? ["{", " SyntaxError: peg$SyntaxError,", " DefaultTracer: peg$DefaultTracer,", " parse: peg$parse", "}"].join("\n") : ["{", " SyntaxError: peg$SyntaxError,", " parse: peg$parse", "}"].join("\n"); - } - - function generateParserExports() { - return options.trace && use("DefaultTracer") ? ["{", " peg$SyntaxError as SyntaxError,", " peg$DefaultTracer as DefaultTracer,", " peg$parse as parse", "}"].join("\n") : ["{", " peg$SyntaxError as SyntaxError,", " peg$parse as parse", "}"].join("\n"); - } - - var generators = { - bare: function bare() { - return [generateHeaderComment(), "(function() {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "})()"].join("\n"); - }, - commonjs: function commonjs() { - var parts = []; - var dependencyVars = Object.keys(options.dependencies); - parts.push([generateHeaderComment(), "", "\"use strict\";", ""].join("\n")); - - if (dependencyVars.length > 0) { - dependencyVars.forEach(function (variable) { - parts.push("var " + variable + " = require(\"" + util.stringEscape(options.dependencies[variable]) + "\");"); - }); - parts.push(""); - } - - parts.push([toplevelCode, "", "module.exports = " + generateParserObject() + ";", ""].join("\n")); - return parts.join("\n"); - }, - es: function es() { - var parts = []; - var dependencyVars = Object.keys(options.dependencies); - parts.push(generateHeaderComment(), ""); - - if (dependencyVars.length > 0) { - dependencyVars.forEach(function (variable) { - parts.push("import " + variable + " from \"" + util.stringEscape(options.dependencies[variable]) + "\";"); - }); - parts.push(""); - } - - parts.push(toplevelCode, "", "export " + generateParserExports() + ";", "", "export default " + generateParserObject() + ";", ""); - return parts.join("\n"); - }, - amd: function amd() { - var dependencyVars = Object.keys(options.dependencies); - var dependencyIds = dependencyVars.map(function (v) { - return options.dependencies[v]; - }); - var dependencies = "[" + dependencyIds.map(function (id) { - return "\"".concat(util.stringEscape(id), "\""); - }).join(", ") + "]"; - var params = dependencyVars.join(", "); - return [generateHeaderComment(), "define(" + dependencies + ", function(" + params + ") {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "});", ""].join("\n"); - }, - globals: function globals() { - return [generateHeaderComment(), "(function(root) {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("root." + options.exportVar + " = " + generateParserObject() + ";"), "})(this);", ""].join("\n"); - }, - umd: function umd() { - var parts = []; - var dependencyVars = Object.keys(options.dependencies); - var dependencyIds = dependencyVars.map(function (v) { - return options.dependencies[v]; - }); - var dependencies = "[" + dependencyIds.map(function (id) { - return "\"".concat(util.stringEscape(id), "\""); - }).join(", ") + "]"; - var requires = dependencyIds.map(function (id) { - return "require(\"".concat(util.stringEscape(id), "\")"); - }).join(", "); - var args = dependencyVars.map(function (v) { - return "root." + v; - }).join(", "); - var params = dependencyVars.join(", "); - parts.push([generateHeaderComment(), "(function(root, factory) {", " if (typeof define === \"function\" && define.amd) {", " define(" + dependencies + ", factory);", " } else if (typeof module === \"object\" && module.exports) {", " module.exports = factory(" + requires + ");"].join("\n")); - - if (options.exportVar !== null) { - parts.push([" } else {", " root." + options.exportVar + " = factory(" + args + ");"].join("\n")); - } - - parts.push([" }", "})(this, function(" + params + ") {", " \"use strict\";", "", indent2(toplevelCode), "", indent2("return " + generateParserObject() + ";"), "});", ""].join("\n")); - return parts.join("\n"); - } - }; - return generators[options.format](); - } - - ast.code = generateWrapper(generateToplevel()); - } - - var generateJs = generateJS; - - function removeProxyRules(ast, session, options) { - function isProxyRule(node) { - return node.type === "rule" && node.expression.type === "rule_ref"; - } - - var replaceRuleRefs = session.buildVisitor({ - rule_ref: function rule_ref(node, proxy, real) { - if (node.name === proxy) node.name = real; - } - }); - var allowedStartRules = options.allowedStartRules; - var rules = []; - ast.rules.forEach(function (rule) { - if (isProxyRule(rule)) { - replaceRuleRefs(ast, rule.name, rule.expression.name); - if (allowedStartRules.indexOf(rule.name) < 0) return; - } - - rules.push(rule); - }); - ast.rules = rules; - } - - var removeProxyRules_1 = removeProxyRules; - - var __hasOwnProperty$1 = Object.prototype.hasOwnProperty; - - function reportDuplicateLabels(ast, session) { - var check; - - function checkExpressionWithClonedEnv(node, env) { - check(node.expression, util.clone(env)); - } - - check = session.buildVisitor({ - rule: function rule(node) { - check(node.expression, {}); - }, - choice: function choice(node, env) { - node.alternatives.forEach(function (alternative) { - check(alternative, util.clone(env)); - }); - }, - action: checkExpressionWithClonedEnv, - labeled: function labeled(node, env) { - var label = node.label; - - if (label && __hasOwnProperty$1.call(env, label)) { - var start = env[label].start; - session.error("Label \"".concat(label, "\" is already defined at line ").concat(start.line, ", column ").concat(start.column, "."), node.location); - } - - check(node.expression, env); - if (label) env[label] = node.location; - }, - text: checkExpressionWithClonedEnv, - simple_and: checkExpressionWithClonedEnv, - simple_not: checkExpressionWithClonedEnv, - optional: checkExpressionWithClonedEnv, - zero_or_more: checkExpressionWithClonedEnv, - one_or_more: checkExpressionWithClonedEnv, - group: checkExpressionWithClonedEnv - }); - check(ast); - } - - var reportDuplicateLabels_1 = reportDuplicateLabels; - - var __hasOwnProperty$2 = Object.prototype.hasOwnProperty; - - function reportDuplicateRules(ast, session) { - var rules = {}; - var check = session.buildVisitor({ - rule: function rule(node) { - var name = node.name; - - if (__hasOwnProperty$2.call(rules, name)) { - var start = rules[name].start; - session.error("Rule \"".concat(name, "\" is already defined at line ").concat(start.line, ", column ").concat(start.column, "."), node.location); - } - - rules[node.name] = node.location; - } - }); - check(ast); - } - - var reportDuplicateRules_1 = reportDuplicateRules; - - function reportUnusedRules(ast, session, options) { - var used = {}; - - function yes(node) { - used[node.name || node] = true; - } - - options.allowedStartRules.forEach(yes); - session.buildVisitor({ - rule_ref: yes - })(ast); - ast.rules.forEach(function (rule) { - if (used[rule.name] !== true) { - session.warn("Rule \"".concat(rule.name, "\" is not referenced."), rule.location); - } - }); - } - - var reportUnusedRules_1 = reportUnusedRules; - - function reportInfiniteRecursion(ast, session) { - var visitedRules = []; - var check = session.buildVisitor({ - rule: function rule(node) { - visitedRules.push(node.name); - check(node.expression); - visitedRules.pop(node.name); - }, - sequence: function sequence(node) { - node.elements.every(function (element) { - check(element); - return !ast.alwaysConsumesOnSuccess(element); - }); - }, - rule_ref: function rule_ref(node) { - if (visitedRules.indexOf(node.name) !== -1) { - visitedRules.push(node.name); - var rulePath = visitedRules.join(" -> "); - session.error("Possible infinite loop when parsing (left recursion: ".concat(rulePath, ")."), node.location); - } - - check(ast.findRule(node.name)); - } - }); - check(ast); - } - - var reportInfiniteRecursion_1 = reportInfiniteRecursion; - - function reportInfiniteRepetition(ast, session) { - var check = session.buildVisitor({ - zero_or_more: function zero_or_more(node) { - if (!ast.alwaysConsumesOnSuccess(node.expression)) { - session.error("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", node.location); - } - }, - one_or_more: function one_or_more(node) { - if (!ast.alwaysConsumesOnSuccess(node.expression)) { - session.error("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", node.location); - } - } - }); - check(ast); - } - - var reportInfiniteRepetition_1 = reportInfiniteRepetition; - - function reportUndefinedRules(ast, session, options) { - var check = session.buildVisitor({ - rule_ref: function rule_ref(node) { - if (!ast.findRule(node.name)) { - session.error("Rule \"".concat(node.name, "\" is not defined."), node.location); - } - } - }); - check(ast); - options.allowedStartRules.forEach(function (rule) { - if (!ast.findRule(rule)) { - session.error("Start rule \"".concat(rule, "\" is not defined.")); - } - }); - } - - var reportUndefinedRules_1 = reportUndefinedRules; - - function inferenceMatchResult(ast, session) { - var inference; - - function sometimesMatch(node) { - node.match = 0; - return node.match; - } - - function alwaysMatch(node) { - inference(node.expression); - node.match = 1; - return node.match; - } - - function inferenceExpression(node) { - node.match = inference(node.expression); - return node.match; - } - - function inferenceElements(elements, forChoice) { - var length = elements.length; - var always = 0; - var never = 0; - - for (var i = 0; i < length; ++i) { - var result = inference(elements[i]); - - if (result > 0) { - ++always; - } - - if (result < 0) { - ++never; - } - } - - if (always === length) { - return 1; - } - - if (forChoice) { - return never === length ? -1 : 0; - } - - return never > 0 ? -1 : 0; - } - - inference = session.buildVisitor({ - rule: function rule(node) { - var oldResult; - var count = 0; - - if (typeof node.match === "undefined") { - node.match = 0; - - do { - oldResult = node.match; - node.match = inference(node.expression); - - if (++count > 6) { - session.error("Infinity cycle detected when trying to evaluate node match result", node.location); - } - } while (oldResult !== node.match); - } - - return node.match; - }, - named: inferenceExpression, - choice: function choice(node) { - node.match = inferenceElements(node.alternatives, true); - return node.match; - }, - action: inferenceExpression, - sequence: function sequence(node) { - node.match = inferenceElements(node.elements, false); - return node.match; - }, - labeled: inferenceExpression, - text: inferenceExpression, - simple_and: inferenceExpression, - simple_not: function simple_not(node) { - node.match = -inference(node.expression); - return node.match; - }, - optional: alwaysMatch, - zero_or_more: alwaysMatch, - one_or_more: inferenceExpression, - group: inferenceExpression, - semantic_and: sometimesMatch, - semantic_not: sometimesMatch, - rule_ref: function rule_ref(node) { - var rule = ast.findRule(node.name); - node.match = inference(rule); - return node.match; - }, - literal: function literal(node) { - node.match = node.value.length === 0 ? 1 : 0; - return node.match; - }, - class: function _class(node) { - node.match = node.parts.length === 0 ? -1 : 0; - return node.match; - }, - any: sometimesMatch - }); - inference(ast); - } - - var inferenceMatchResult_1 = inferenceMatchResult; - - function isSemanticPredicate(element) { - var type = element.expression.type; - if (type === "semantic_and") return true; - if (type === "semantic_not") return true; - return false; - } - - function reportIncorrectPlucking(ast, session) { - session.buildVisitor({ - action: function action(node) { - this.visit(node.expression, true); - }, - labeled: function labeled(node, action) { - if (node.pick !== true) return void 0; - if (action === true) session.error("\"@\" cannot be used with an action block.", node.location); - if (isSemanticPredicate(node)) session.error("\"@\" cannot be used on a semantic predicate.", node.location); - this.visit(node.expression); - } - })(ast); - } - - var reportIncorrectPlucking_1 = reportIncorrectPlucking; - - var opcodes = { - PUSH_EMPTY_STRING: 0, - PUSH_UNDEFINED: 1, - PUSH_NULL: 2, - PUSH_FAILED: 3, - PUSH_EMPTY_ARRAY: 4, - PUSH_CURR_POS: 5, - POP: 6, - POP_CURR_POS: 7, - POP_N: 8, - NIP: 9, - APPEND: 10, - WRAP: 11, - TEXT: 12, - PLUCK: 41, - IF: 13, - IF_ERROR: 14, - IF_NOT_ERROR: 15, - WHILE_NOT_ERROR: 16, - MATCH_ANY: 17, - MATCH_STRING: 18, - MATCH_STRING_IC: 19, - MATCH_CLASS: 20, - ACCEPT_N: 21, - ACCEPT_STRING: 22, - EXPECT: 23, - LOAD_SAVED_POS: 24, - UPDATE_SAVED_POS: 25, - CALL: 26, - RULE: 27, - SILENT_FAILS_ON: 28, - SILENT_FAILS_OFF: 29, - EXPECT_NS_BEGIN: 38, - EXPECT_NS_END: 39 - }; - var opcodes_1 = opcodes; - - function peg$subclass(child, parent) { - function C() { - this.constructor = child; - } - - C.prototype = parent.prototype; - child.prototype = new C(); - } - - function peg$SyntaxError(message, expected, found, location) { - this.message = message; - this.expected = expected; - this.found = found; - this.location = location; - this.name = "SyntaxError"; - - if (typeof Error.captureStackTrace === "function") { - Error.captureStackTrace(this, peg$SyntaxError); - } - } - - peg$subclass(peg$SyntaxError, Error); - - peg$SyntaxError.buildMessage = function (expected, found) { - var DESCRIBE_EXPECTATION_FNS = { - literal: function literal(expectation) { - return "\"" + literalEscape(expectation.text) + "\""; - }, - class: function _class(expectation) { - var escapedParts = expectation.parts.map(function (part) { - return Array.isArray(part) ? classEscape(part[0]) + "-" + classEscape(part[1]) : classEscape(part); - }); - return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]"; - }, - any: function any() { - return "any character"; - }, - end: function end() { - return "end of input"; - }, - other: function other(expectation) { - return expectation.description; - }, - not: function not(expectation) { - return "not " + describeExpectation(expectation.expected); - } - }; - - function hex(ch) { - return ch.charCodeAt(0).toString(16).toUpperCase(); - } - - function literalEscape(s) { - return s.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { - return "\\x0" + hex(ch); - }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { - return "\\x" + hex(ch); - }); - } - - function classEscape(s) { - return s.replace(/\\/g, "\\\\").replace(/\]/g, "\\]").replace(/\^/g, "\\^").replace(/-/g, "\\-").replace(/\0/g, "\\0").replace(/\t/g, "\\t").replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/[\x00-\x0F]/g, function (ch) { - return "\\x0" + hex(ch); - }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) { - return "\\x" + hex(ch); - }); - } - - function describeExpectation(expectation) { - return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); - } - - function describeExpected(expected) { - var descriptions = expected.map(describeExpectation); - var i, j; - descriptions.sort(); - - if (descriptions.length > 0) { - for (i = 1, j = 1; i < descriptions.length; i++) { - if (descriptions[i - 1] !== descriptions[i]) { - descriptions[j] = descriptions[i]; - j++; - } - } - - descriptions.length = j; - } - - switch (descriptions.length) { - case 1: - return descriptions[0]; - - case 2: - return descriptions[0] + " or " + descriptions[1]; - - default: - return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1]; - } - } - - function describeFound(found) { - return found ? "\"" + literalEscape(found) + "\"" : "end of input"; - } - - return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found."; - }; - - function peg$parse(input, options) { - options = options !== undefined ? options : {}; - var peg$FAILED = {}; - var peg$startRuleFunctions = { - Grammar: peg$parseGrammar - }; - var peg$startRuleFunction = peg$parseGrammar; - var peg$c0 = "="; - var peg$c1 = "/"; - var peg$c2 = "@"; - var peg$c3 = ":"; - var peg$c4 = "$"; - var peg$c5 = "&"; - var peg$c6 = "!"; - var peg$c7 = "?"; - var peg$c8 = "*"; - var peg$c9 = "+"; - var peg$c10 = "("; - var peg$c11 = ")"; - var peg$c12 = "\t"; - var peg$c13 = "\v"; - var peg$c14 = "\f"; - var peg$c15 = " "; - var peg$c16 = "\xA0"; - var peg$c17 = "\uFEFF"; - var peg$c18 = "\n"; - var peg$c19 = "\r\n"; - var peg$c20 = "\r"; - var peg$c21 = "\u2028"; - var peg$c22 = "\u2029"; - var peg$c23 = "/*"; - var peg$c24 = "*/"; - var peg$c25 = "//"; - var peg$c26 = "_"; - var peg$c27 = "\\"; - var peg$c28 = "\u200C"; - var peg$c29 = "\u200D"; - var peg$c30 = "i"; - var peg$c31 = "\""; - var peg$c32 = "'"; - var peg$c33 = "["; - var peg$c34 = "^"; - var peg$c35 = "]"; - var peg$c36 = "-"; - var peg$c37 = "0"; - var peg$c38 = "b"; - var peg$c39 = "f"; - var peg$c40 = "n"; - var peg$c41 = "r"; - var peg$c42 = "t"; - var peg$c43 = "v"; - var peg$c44 = "x"; - var peg$c45 = "u"; - var peg$c46 = "."; - var peg$c47 = "{"; - var peg$c48 = "}"; - var peg$c49 = ";"; - var peg$r0 = /^[\n\r\u2028\u2029]/; - var peg$r1 = /^[0-9]/; - var peg$r2 = /^[0-9a-f]/i; - var peg$r3 = /^[{}]/; - var peg$r4 = /^[a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0560-\u0588\u10D0-\u10FA\u10FD-\u10FF\u13F8-\u13FD\u1C80-\u1C88\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7AF\uA7B5\uA7B7\uA7B9\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A]/; - var peg$r5 = /^[\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C-\uA69D\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3-\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E-\uFF9F]/; - var peg$r6 = /^[\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05EF-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u09FC\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u1100-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD-\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/; - var peg$r7 = /^[\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]/; - var peg$r8 = /^[A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1C90-\u1CBA\u1CBD-\u1CBF\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AE\uA7B0-\uA7B4\uA7B6\uA7B8\uFF21-\uFF3A]/; - var peg$r9 = /^[\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E-\u094F\u0982-\u0983\u09BE-\u09C0\u09C7-\u09C8\u09CB-\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB-\u0ACC\u0B02-\u0B03\u0B3E\u0B40\u0B47-\u0B48\u0B4B-\u0B4C\u0B57\u0BBE-\u0BBF\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82-\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CD5-\u0CD6\u0D02-\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82-\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2-\u0DF3\u0F3E-\u0F3F\u0F7F\u102B-\u102C\u1031\u1038\u103B-\u103C\u1056-\u1057\u1062-\u1064\u1067-\u106D\u1083-\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7-\u17C8\u1923-\u1926\u1929-\u192B\u1930-\u1931\u1933-\u1938\u1A19-\u1A1A\u1A55\u1A57\u1A61\u1A63-\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43-\u1B44\u1B82\u1BA1\u1BA6-\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2-\u1BF3\u1C24-\u1C2B\u1C34-\u1C35\u1CE1\u1CF2-\u1CF3\u1CF7\u302E-\u302F\uA823-\uA824\uA827\uA880-\uA881\uA8B4-\uA8C3\uA952-\uA953\uA983\uA9B4-\uA9B5\uA9BA-\uA9BB\uA9BD-\uA9C0\uAA2F-\uAA30\uAA33-\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE-\uAAEF\uAAF5\uABE3-\uABE4\uABE6-\uABE7\uABE9-\uABEA\uABEC]/; - var peg$r10 = /^[\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u07FD\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08D3-\u08E1\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962-\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2-\u09E3\u09FE\u0A01-\u0A02\u0A3C\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A51\u0A70-\u0A71\u0A75\u0A81-\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7-\u0AC8\u0ACD\u0AE2-\u0AE3\u0AFA-\u0AFF\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62-\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C04\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C62-\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC-\u0CCD\u0CE2-\u0CE3\u0D00-\u0D01\u0D3B-\u0D3C\u0D41-\u0D44\u0D4D\u0D62-\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86-\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039-\u103A\u103D-\u103E\u1058-\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17B4-\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u1885-\u1886\u18A9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193B\u1A17-\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80-\u1B81\u1BA2-\u1BA5\u1BA8-\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8-\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8-\u1CF9\u1DC0-\u1DF9\u1DFB-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099-\u309A\uA66F\uA674-\uA67D\uA69E-\uA69F\uA6F0-\uA6F1\uA802\uA806\uA80B\uA825-\uA826\uA8C4-\uA8C5\uA8E0-\uA8F1\uA8FF\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31-\uAA32\uAA35-\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7-\uAAB8\uAABE-\uAABF\uAAC1\uAAEC-\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/; - var peg$r11 = /^[0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]/; - var peg$r12 = /^[\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]/; - var peg$r13 = /^[_\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F]/; - var peg$r14 = /^[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/; - var peg$e0 = peg$literalExpectation("=", false); - var peg$e1 = peg$literalExpectation("/", false); - var peg$e2 = peg$literalExpectation("@", false); - var peg$e3 = peg$literalExpectation(":", false); - var peg$e4 = peg$literalExpectation("$", false); - var peg$e5 = peg$literalExpectation("&", false); - var peg$e6 = peg$literalExpectation("!", false); - var peg$e7 = peg$literalExpectation("?", false); - var peg$e8 = peg$literalExpectation("*", false); - var peg$e9 = peg$literalExpectation("+", false); - var peg$e10 = peg$literalExpectation("(", false); - var peg$e11 = peg$literalExpectation(")", false); - var peg$e12 = peg$anyExpectation(); - var peg$e13 = peg$otherExpectation("whitespace"); - var peg$e14 = peg$classExpectation(["\n", "\r", "\u2028", "\u2029"], false, false); - var peg$e15 = peg$otherExpectation("end of line"); - var peg$e16 = peg$otherExpectation("comment"); - var peg$e17 = peg$literalExpectation("/*", false); - var peg$e18 = peg$literalExpectation("*/", false); - var peg$e19 = peg$literalExpectation("//", false); - var peg$e20 = peg$otherExpectation("identifier"); - var peg$e21 = peg$otherExpectation("literal"); - var peg$e22 = peg$otherExpectation("string"); - var peg$e23 = peg$otherExpectation("character class"); - var peg$e24 = peg$literalExpectation(".", false); - var peg$e25 = peg$otherExpectation("code block"); - var peg$e26 = peg$literalExpectation(";", false); - - var peg$f0 = function peg$f0(initializer, rules) { - return new ast.Grammar(initializer, rules, comments, location()); - }; - - var peg$f1 = function peg$f1(code) { - return createNode("initializer", { - code: code - }); - }; - - var peg$f2 = function peg$f2(name, displayName, expression) { - if (displayName) expression = createNode("named", { - name: displayName, - expression: expression - }); - return createNode("rule", { - name: name, - expression: expression - }); - }; - - var peg$f3 = function peg$f3(head, tail) { - if (tail.length === 0) return head; - return createNode("choice", { - alternatives: [head].concat(tail) - }); - }; - - var peg$f4 = function peg$f4(expression, code) { - if (code === null) return expression; - return createNode("action", { - expression: expression, - code: code - }); - }; - - var peg$f5 = function peg$f5(head, tail) { - var elements = [head]; - - if (tail.length === 0) { - if (head.type !== "labeled" || !head.pick) return head; - } else { - elements = elements.concat(tail); - } - - return createNode("sequence", { - elements: elements - }); - }; - - var peg$f6 = function peg$f6(label, expression) { - return createNode("labeled", { - pick: pick, - label: label, - expression: expression - }); - }; - - var peg$f7 = function peg$f7(label, expression) { - return createNode("labeled", { - label: label, - expression: expression - }); - }; - - var peg$f8 = function peg$f8(name) { - if (RESERVED_WORDS[name] !== true) return name; - error("Label can't be a reserved word \"".concat(name, "\"."), location()); - }; - - var peg$f9 = function peg$f9(operator, expression) { - return createNode(operator, { - expression: expression - }); - }; - - var peg$f10 = function peg$f10() { - return "text"; - }; - - var peg$f11 = function peg$f11() { - return "simple_and"; - }; - - var peg$f12 = function peg$f12() { - return "simple_not"; - }; - - var peg$f13 = function peg$f13(expression, operator) { - return createNode(operator, { - expression: expression - }); - }; - - var peg$f14 = function peg$f14() { - return "optional"; - }; - - var peg$f15 = function peg$f15() { - return "zero_or_more"; - }; - - var peg$f16 = function peg$f16() { - return "one_or_more"; - }; - - var peg$f17 = function peg$f17(e) { - if (e.type !== "labeled" && e.type !== "sequence") return e; - return createNode("group", { - expression: e - }); - }; - - var peg$f18 = function peg$f18(name) { - return createNode("rule_ref", { - name: name - }); - }; - - var peg$f19 = function peg$f19(operator, code) { - return createNode(operator, { - code: code - }); - }; - - var peg$f20 = function peg$f20() { - return "semantic_and"; - }; - - var peg$f21 = function peg$f21() { - return "semantic_not"; - }; - - var peg$f22 = function peg$f22(comment) { - return addComment(comment, true); - }; - - var peg$f23 = function peg$f23(comment) { - return addComment(comment, false); - }; - - var peg$f24 = function peg$f24(head, tail) { - return head + tail.join(""); - }; - - var peg$f25 = function peg$f25(value, ignoreCase) { - return createNode("literal", { - value: value, - ignoreCase: ignoreCase !== null - }); - }; - - var peg$f26 = function peg$f26(chars) { - return chars.join(""); - }; - - var peg$f27 = function peg$f27(inverted, parts, ignoreCase) { - return createNode("class", { - parts: parts.filter(function (part) { - return part !== ""; - }), - inverted: inverted !== null, - ignoreCase: ignoreCase !== null - }); - }; - - var peg$f28 = function peg$f28(begin, end) { - if (begin.charCodeAt(0) > end.charCodeAt(0)) error("Invalid character range: " + text() + "."); - return [begin, end]; - }; - - var peg$f29 = function peg$f29() { - return ""; - }; - - var peg$f30 = function peg$f30() { - return "\0"; - }; - - var peg$f31 = function peg$f31() { - return "\b"; - }; - - var peg$f32 = function peg$f32() { - return "\f"; - }; - - var peg$f33 = function peg$f33() { - return "\n"; - }; - - var peg$f34 = function peg$f34() { - return "\r"; - }; - - var peg$f35 = function peg$f35() { - return "\t"; - }; - - var peg$f36 = function peg$f36() { - return "\v"; - }; - - var peg$f37 = function peg$f37(digits) { - return String.fromCharCode(parseInt(digits, 16)); - }; - - var peg$f38 = function peg$f38() { - return createNode("any"); - }; - - var peg$f39 = function peg$f39() { - error("Unbalanced brace."); - }; - - var peg$currPos = 0; - var peg$savedPos = 0; - var peg$posDetailsCache = [{ - line: 1, - column: 1 - }]; - var peg$expected = []; - var peg$silentFails = 0; - var peg$result; - - if ("startRule" in options) { - if (!(options.startRule in peg$startRuleFunctions)) { - throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); - } - - peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; - } - - function text() { - return input.substring(peg$savedPos, peg$currPos); - } - - function location() { - return peg$computeLocation(peg$savedPos, peg$currPos); - } - - function error(message, location) { - location = location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos); - throw peg$buildSimpleError(message, location); - } - - function peg$literalExpectation(text, ignoreCase) { - return { - type: "literal", - text: text, - ignoreCase: ignoreCase - }; - } - - function peg$classExpectation(parts, inverted, ignoreCase) { - return { - type: "class", - parts: parts, - inverted: inverted, - ignoreCase: ignoreCase - }; - } - - function peg$anyExpectation() { - return { - type: "any" - }; - } - - function peg$endExpectation() { - return { - type: "end" - }; - } - - function peg$otherExpectation(description) { - return { - type: "other", - description: description - }; - } - - function peg$computePosDetails(pos) { - var details = peg$posDetailsCache[pos]; - var p; - - if (details) { - return details; - } else { - p = pos - 1; - - while (!peg$posDetailsCache[p]) { - p--; - } - - details = peg$posDetailsCache[p]; - details = { - line: details.line, - column: details.column - }; - - while (p < pos) { - if (input.charCodeAt(p) === 10) { - details.line++; - details.column = 1; - } else { - details.column++; - } - - p++; - } - - peg$posDetailsCache[pos] = details; - return details; - } - } - - var peg$VALIDFILENAME = typeof options.filename === "string" && options.filename.length > 0; - - function peg$computeLocation(startPos, endPos) { - var loc = {}; - if (peg$VALIDFILENAME) loc.filename = options.filename; - var startPosDetails = peg$computePosDetails(startPos); - loc.start = { - offset: startPos, - line: startPosDetails.line, - column: startPosDetails.column - }; - var endPosDetails = peg$computePosDetails(endPos); - loc.end = { - offset: endPos, - line: endPosDetails.line, - column: endPosDetails.column - }; - return loc; - } - - function peg$begin() { - peg$expected.push({ - pos: peg$currPos, - variants: [] - }); - } - - function peg$expect(expected) { - var top = peg$expected[peg$expected.length - 1]; - - if (peg$currPos < top.pos) { - return; - } - - if (peg$currPos > top.pos) { - top.pos = peg$currPos; - top.variants = []; - } - - top.variants.push(expected); - } - - function peg$end(invert) { - var expected = peg$expected.pop(); - var top = peg$expected[peg$expected.length - 1]; - var variants = expected.variants; - - if (top.pos !== expected.pos) { - return; - } - - if (invert) { - variants = variants.map(function (e) { - return e.type === "not" ? e.expected : { - type: "not", - expected: e - }; - }); - } - - Array.prototype.push.apply(top.variants, variants); - } - - function peg$buildSimpleError(message, location) { - return new peg$SyntaxError(message, null, null, location); - } - - function peg$buildStructuredError(expected, found, location) { - return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected, found), expected, found, location); - } - - function peg$buildError() { - var expected = peg$expected[0]; - var failPos = expected.pos; - return peg$buildStructuredError(expected.variants, failPos < input.length ? input.charAt(failPos) : null, failPos < input.length ? peg$computeLocation(failPos, failPos + 1) : peg$computeLocation(failPos, failPos)); - } - - function peg$parseGrammar() { - var s0, s1, s2, s3, s4, s5, s6; - - s0 = peg$currPos; - s1 = peg$parse__(); - s2 = peg$currPos; - s3 = peg$parseInitializer(); - - if (s3 !== peg$FAILED) { - s4 = peg$parse__(); - s2 = s3; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = null; - } - - s3 = []; - s4 = peg$currPos; - s5 = peg$parseRule(); - - if (s5 !== peg$FAILED) { - s6 = peg$parse__(); - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$currPos; - s5 = peg$parseRule(); - - if (s5 !== peg$FAILED) { - s6 = peg$parse__(); - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f0(s2, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseInitializer() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$parseCodeBlock(); - - if (s1 !== peg$FAILED) { - s2 = peg$parseEOS(); - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f1(s1); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseRule() { - var s0, s1, s2, s3, s4, s5, s6, s7; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parseIdentifier(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$currPos; - s4 = peg$parseStringLiteral(); - - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 === peg$FAILED) { - s3 = null; - } - - rule$expects(peg$e0); - - if (input.charCodeAt(peg$currPos) === 61) { - s4 = peg$c0; - peg$currPos++; - } else { - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parse__(); - s6 = peg$parseChoiceExpression(); - - if (s6 !== peg$FAILED) { - s7 = peg$parseEOS(); - - if (s7 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f2(s1, s3, s6); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseChoiceExpression() { - var s0, s1, s2, s3, s4, s5, s6, s7; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parseActionExpression(); - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$currPos; - s4 = peg$parse__(); - rule$expects(peg$e1); - - if (input.charCodeAt(peg$currPos) === 47) { - s5 = peg$c1; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parse__(); - s7 = peg$parseActionExpression(); - - if (s7 !== peg$FAILED) { - s3 = s7; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$parse__(); - rule$expects(peg$e1); - - if (input.charCodeAt(peg$currPos) === 47) { - s5 = peg$c1; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parse__(); - s7 = peg$parseActionExpression(); - - if (s7 !== peg$FAILED) { - s3 = s7; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - - peg$savedPos = s0; - s0 = peg$f3(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseActionExpression() { - var s0, s1, s2, s3, s4; - - s0 = peg$currPos; - s1 = peg$parseSequenceExpression(); - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = peg$parse__(); - s4 = peg$parseCodeBlock(); - - if (s4 !== peg$FAILED) { - s2 = s4; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = null; - } - - peg$savedPos = s0; - s0 = peg$f4(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseSequenceExpression() { - var s0, s1, s2, s3, s4, s5; - - s0 = peg$currPos; - s1 = peg$parseLabeledExpression(); - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$currPos; - s4 = peg$parse__(); - s5 = peg$parseLabeledExpression(); - - if (s5 !== peg$FAILED) { - s3 = s5; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$parse__(); - s5 = peg$parseLabeledExpression(); - - if (s5 !== peg$FAILED) { - s3 = s5; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - - peg$savedPos = s0; - s0 = peg$f5(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLabeledExpression() { - var s0, s1, s2, s3, s4; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e2); - - if (input.charCodeAt(peg$currPos) === 64) { - s1 = peg$c2; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseLabelIdentifier(); - - if (s2 === peg$FAILED) { - s2 = null; - } - - s3 = peg$parse__(); - s4 = peg$parsePrefixedExpression(); - - if (s4 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f6(s2, s4); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parseLabelIdentifier(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parsePrefixedExpression(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f7(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parsePrefixedExpression(); - } - } - - return s0; - } - - function peg$parseLabelIdentifier() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parseIdentifier(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - rule$expects(peg$e3); - - if (input.charCodeAt(peg$currPos) === 58) { - s3 = peg$c3; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f8(s1); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parsePrefixedExpression() { - var s0, s1, s2, s3; - - s0 = peg$currPos; - s1 = peg$parsePrefixedOperator(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parseSuffixedExpression(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f9(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseSuffixedExpression(); - } - - return s0; - } - - function peg$parsePrefixedOperator() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e4); - - if (input.charCodeAt(peg$currPos) === 36) { - s1 = peg$c4; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f10(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e5); - - if (input.charCodeAt(peg$currPos) === 38) { - s1 = peg$c5; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f11(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e6); - - if (input.charCodeAt(peg$currPos) === 33) { - s1 = peg$c6; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f12(); - } - - s0 = s1; - } - } - - return s0; - } - - function peg$parseSuffixedExpression() { - var s0, s1, s2, s3; - - s0 = peg$currPos; - s1 = peg$parsePrimaryExpression(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parseSuffixedOperator(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f13(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parsePrimaryExpression(); - } - - return s0; - } - - function peg$parseSuffixedOperator() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e7); - - if (input.charCodeAt(peg$currPos) === 63) { - s1 = peg$c7; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f14(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e8); - - if (input.charCodeAt(peg$currPos) === 42) { - s1 = peg$c8; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f15(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e9); - - if (input.charCodeAt(peg$currPos) === 43) { - s1 = peg$c9; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f16(); - } - - s0 = s1; - } - } - - return s0; - } - - function peg$parsePrimaryExpression() { - var s0, s1, s2, s3, s4, s5; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$parseLiteralMatcher(); - - if (s0 === peg$FAILED) { - s0 = peg$parseCharacterClassMatcher(); - - if (s0 === peg$FAILED) { - s0 = peg$parseAnyMatcher(); - - if (s0 === peg$FAILED) { - s0 = peg$parseRuleReferenceExpression(); - - if (s0 === peg$FAILED) { - s0 = peg$parseSemanticPredicateExpression(); - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e10); - - if (input.charCodeAt(peg$currPos) === 40) { - s1 = peg$c10; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parseChoiceExpression(); - - if (s3 !== peg$FAILED) { - s4 = peg$parse__(); - rule$expects(peg$e11); - - if (input.charCodeAt(peg$currPos) === 41) { - s5 = peg$c11; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f17(s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } - } - } - } - } - - return s0; - } - - function peg$parseRuleReferenceExpression() { - var s0, s1, s2, s3, s4, s5, s6, s7; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parseIdentifier(); - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - peg$begin(); - s3 = peg$currPos; - s4 = peg$parse__(); - s5 = peg$currPos; - s6 = peg$parseStringLiteral(); - - if (s6 !== peg$FAILED) { - s7 = peg$parse__(); - s6 = [s6, s7]; - s5 = s6; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 === peg$FAILED) { - s5 = null; - } - - rule$expects(peg$e0); - - if (input.charCodeAt(peg$currPos) === 61) { - s6 = peg$c0; - peg$currPos++; - } else { - s6 = peg$FAILED; - } - - if (s6 !== peg$FAILED) { - s4 = [s4, s5, s6]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - peg$end(true); - - if (s3 === peg$FAILED) { - s2 = undefined; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f18(s1); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseSemanticPredicateExpression() { - var s0, s1, s2, s3; - - s0 = peg$currPos; - s1 = peg$parseSemanticPredicateOperator(); - - if (s1 !== peg$FAILED) { - s2 = peg$parse__(); - s3 = peg$parseCodeBlock(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f19(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseSemanticPredicateOperator() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e5); - - if (input.charCodeAt(peg$currPos) === 38) { - s1 = peg$c5; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f20(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - rule$expects(peg$e6); - - if (input.charCodeAt(peg$currPos) === 33) { - s1 = peg$c6; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f21(); - } - - s0 = s1; - } - - return s0; - } - - function peg$parseSourceCharacter() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e12); - - if (input.length > peg$currPos) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseWhiteSpace() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e13); - peg$silentFails++; - - if (input.charCodeAt(peg$currPos) === 9) { - s0 = peg$c12; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 11) { - s0 = peg$c13; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 12) { - s0 = peg$c14; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 32) { - s0 = peg$c15; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 160) { - s0 = peg$c16; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 65279) { - s0 = peg$c17; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseZs(); - } - } - } - } - } - } - - peg$silentFails--; - return s0; - } - - function peg$parseLineTerminator() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e14); - - if (peg$r0.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLineTerminatorSequence() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e15); - peg$silentFails++; - - if (input.charCodeAt(peg$currPos) === 10) { - s0 = peg$c18; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.substr(peg$currPos, 2) === peg$c19) { - s0 = peg$c19; - peg$currPos += 2; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 13) { - s0 = peg$c20; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 8232) { - s0 = peg$c21; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 8233) { - s0 = peg$c22; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - } - } - } - } - - peg$silentFails--; - return s0; - } - - function peg$parseComment() { - var s0; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e16); - peg$silentFails++; - s0 = peg$parseMultiLineComment(); - - if (s0 === peg$FAILED) { - s0 = peg$parseSingleLineComment(); - } - - peg$silentFails--; - return s0; - } - - function peg$parseMultiLineComment() { - var s0, s1, s2, s3, s4, s5, s6; - - s0 = peg$currPos; - - if (input.substr(peg$currPos, 2) === peg$c23) { - s1 = peg$c23; - peg$currPos += 2; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = []; - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s6 = peg$c24; - peg$currPos += 2; - } else { - s6 = peg$FAILED; - } - - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s6 = peg$c24; - peg$currPos += 2; - } else { - s6 = peg$FAILED; - } - - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } - - s2 = input.substring(s2, peg$currPos); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s3 = peg$c24; - peg$currPos += 2; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f22(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseMultiLineCommentNoLineTerminator() { - var s0, s1, s2, s3, s4, s5, s6; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e17); - - if (input.substr(peg$currPos, 2) === peg$c23) { - s1 = peg$c23; - peg$currPos += 2; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = []; - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - rule$expects(peg$e18); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s6 = peg$c24; - peg$currPos += 2; - } else { - s6 = peg$FAILED; - } - - if (s6 === peg$FAILED) { - s6 = peg$parseLineTerminator(); - } - - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - rule$expects(peg$e18); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s6 = peg$c24; - peg$currPos += 2; - } else { - s6 = peg$FAILED; - } - - if (s6 === peg$FAILED) { - s6 = peg$parseLineTerminator(); - } - - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } - - s2 = input.substring(s2, peg$currPos); - rule$expects(peg$e18); - - if (input.substr(peg$currPos, 2) === peg$c24) { - s3 = peg$c24; - peg$currPos += 2; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f22(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseSingleLineComment() { - var s0, s1, s2, s3, s4, s5, s6; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e19); - - if (input.substr(peg$currPos, 2) === peg$c25) { - s1 = peg$c25; - peg$currPos += 2; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = []; - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - s6 = peg$parseLineTerminator(); - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$currPos; - s5 = peg$currPos; - peg$begin(); - s6 = peg$parseLineTerminator(); - peg$end(true); - - if (s6 === peg$FAILED) { - s5 = undefined; - } else { - peg$currPos = s5; - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s6 = peg$parseSourceCharacter(); - - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } - - s2 = input.substring(s2, peg$currPos); - peg$savedPos = s0; - s0 = peg$f23(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseIdentifier() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e20); - peg$silentFails++; - s0 = peg$currPos; - s1 = peg$parseIdentifierStart(); - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$parseIdentifierPart(); - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$parseIdentifierPart(); - } - - peg$savedPos = s0; - s0 = peg$f24(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - peg$silentFails--; - return s0; - } - - function peg$parseIdentifierStart() { - var s0, s1, s2; - - s0 = peg$parseUnicodeLetter(); - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 36) { - s0 = peg$c4; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 95) { - s0 = peg$c26; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseUnicodeEscapeSequence(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } - } - } - - return s0; - } - - function peg$parseIdentifierPart() { - var s0; - - s0 = peg$parseIdentifierStart(); - - if (s0 === peg$FAILED) { - s0 = peg$parseUnicodeCombiningMark(); - - if (s0 === peg$FAILED) { - s0 = peg$parseNd(); - - if (s0 === peg$FAILED) { - s0 = peg$parsePc(); - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 8204) { - s0 = peg$c28; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 8205) { - s0 = peg$c29; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - } - } - } - } - } - - return s0; - } - - function peg$parseUnicodeLetter() { - var s0; - - s0 = peg$parseLu(); - - if (s0 === peg$FAILED) { - s0 = peg$parseLl(); - - if (s0 === peg$FAILED) { - s0 = peg$parseLt(); - - if (s0 === peg$FAILED) { - s0 = peg$parseLm(); - - if (s0 === peg$FAILED) { - s0 = peg$parseLo(); - - if (s0 === peg$FAILED) { - s0 = peg$parseNl(); - } - } - } - } - } - - return s0; - } - - function peg$parseUnicodeCombiningMark() { - var s0; - - s0 = peg$parseMn(); - - if (s0 === peg$FAILED) { - s0 = peg$parseMc(); - } - - return s0; - } - - function peg$parseLiteralMatcher() { - var s0, s1, s2; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e21); - peg$silentFails++; - s0 = peg$currPos; - s1 = peg$parseStringLiteral(); - - if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 105) { - s2 = peg$c30; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = null; - } - - peg$savedPos = s0; - s0 = peg$f25(s1, s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - peg$silentFails--; - return s0; - } - - function peg$parseStringLiteral() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e22); - peg$silentFails++; - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 34) { - s1 = peg$c31; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$parseDoubleStringCharacter(); - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$parseDoubleStringCharacter(); - } - - if (input.charCodeAt(peg$currPos) === 34) { - s3 = peg$c31; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f26(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 39) { - s1 = peg$c32; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = []; - s3 = peg$parseSingleStringCharacter(); - - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$parseSingleStringCharacter(); - } - - if (input.charCodeAt(peg$currPos) === 39) { - s3 = peg$c32; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f26(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } - - peg$silentFails--; - return s0; - } - - function peg$parseDoubleStringCharacter() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$currPos; - peg$begin(); - - if (input.charCodeAt(peg$currPos) === 34) { - s2 = peg$c31; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 92) { - s2 = peg$c27; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$parseLineTerminator(); - } - } - - peg$end(true); - - if (s2 === peg$FAILED) { - s1 = undefined; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseSourceCharacter(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseEscapeSequence(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseLineContinuation(); - } - } - - return s0; - } - - function peg$parseSingleStringCharacter() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$currPos; - peg$begin(); - - if (input.charCodeAt(peg$currPos) === 39) { - s2 = peg$c32; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 92) { - s2 = peg$c27; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$parseLineTerminator(); - } - } - - peg$end(true); - - if (s2 === peg$FAILED) { - s1 = undefined; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseSourceCharacter(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseEscapeSequence(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseLineContinuation(); - } - } - - return s0; - } - - function peg$parseCharacterClassMatcher() { - var s0, s1, s2, s3, s4, s5; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e23); - peg$silentFails++; - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 91) { - s1 = peg$c33; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 94) { - s2 = peg$c34; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = null; - } - - s3 = []; - s4 = peg$parseCharacterPart(); - - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$parseCharacterPart(); - } - - if (input.charCodeAt(peg$currPos) === 93) { - s4 = peg$c35; - peg$currPos++; - } else { - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 105) { - s5 = peg$c30; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 === peg$FAILED) { - s5 = null; - } - - peg$savedPos = s0; - s0 = peg$f27(s2, s3, s5); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - peg$silentFails--; - return s0; - } - - function peg$parseCharacterPart() { - var s0; - - s0 = peg$parseClassCharacterRange(); - - if (s0 === peg$FAILED) { - s0 = peg$parseClassCharacter(); - } - - return s0; - } - - function peg$parseClassCharacterRange() { - var s0, s1, s2, s3; - - s0 = peg$currPos; - s1 = peg$parseClassCharacter(); - - if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 45) { - s2 = peg$c36; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 !== peg$FAILED) { - s3 = peg$parseClassCharacter(); - - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f28(s1, s3); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseClassCharacter() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$currPos; - peg$begin(); - - if (input.charCodeAt(peg$currPos) === 93) { - s2 = peg$c35; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 92) { - s2 = peg$c27; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$parseLineTerminator(); - } - } - - peg$end(true); - - if (s2 === peg$FAILED) { - s1 = undefined; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseSourceCharacter(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseEscapeSequence(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseLineContinuation(); - } - } - - return s0; - } - - function peg$parseLineContinuation() { - var s0, s1, s2; - - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c27; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseLineTerminatorSequence(); - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f29(); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseEscapeSequence() { - var s0, s1, s2, s3; - - s0 = peg$parseCharacterEscapeSequence(); - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 48) { - s1 = peg$c37; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - peg$begin(); - s3 = peg$parseDecimalDigit(); - peg$end(true); - - if (s3 === peg$FAILED) { - s2 = undefined; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f30(); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$parseHexEscapeSequence(); - - if (s0 === peg$FAILED) { - s0 = peg$parseUnicodeEscapeSequence(); - } - } - } - - return s0; - } - - function peg$parseCharacterEscapeSequence() { - var s0; - - s0 = peg$parseSingleEscapeCharacter(); - - if (s0 === peg$FAILED) { - s0 = peg$parseNonEscapeCharacter(); - } - - return s0; - } - - function peg$parseSingleEscapeCharacter() { - var s0, s1; - - if (input.charCodeAt(peg$currPos) === 39) { - s0 = peg$c32; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 34) { - s0 = peg$c31; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 92) { - s0 = peg$c27; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 98) { - s1 = peg$c38; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f31(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 102) { - s1 = peg$c39; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f32(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 110) { - s1 = peg$c40; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f33(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 114) { - s1 = peg$c41; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f34(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 116) { - s1 = peg$c42; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f35(); - } - - s0 = s1; - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 118) { - s1 = peg$c43; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f36(); - } - - s0 = s1; - } - } - } - } - } - } - } - } - - return s0; - } - - function peg$parseNonEscapeCharacter() { - var s0, s1, s2; - - s0 = peg$currPos; - s1 = peg$currPos; - peg$begin(); - s2 = peg$parseEscapeCharacter(); - - if (s2 === peg$FAILED) { - s2 = peg$parseLineTerminator(); - } - - peg$end(true); - - if (s2 === peg$FAILED) { - s1 = undefined; - } else { - peg$currPos = s1; - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseSourceCharacter(); - - if (s2 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseEscapeCharacter() { - var s0; - - s0 = peg$parseSingleEscapeCharacter(); - - if (s0 === peg$FAILED) { - s0 = peg$parseDecimalDigit(); - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 120) { - s0 = peg$c44; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 117) { - s0 = peg$c45; - peg$currPos++; - } else { - s0 = peg$FAILED; - } - } - } - } - - return s0; - } - - function peg$parseHexEscapeSequence() { - var s0, s1, s2, s3, s4, s5; - - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 120) { - s1 = peg$c44; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = peg$currPos; - s4 = peg$parseHexDigit(); - - if (s4 !== peg$FAILED) { - s5 = peg$parseHexDigit(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s2 = input.substring(s2, peg$currPos); - } else { - s2 = s3; - } - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f37(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseUnicodeEscapeSequence() { - var s0, s1, s2, s3, s4, s5, s6, s7; - - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 117) { - s1 = peg$c45; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - s3 = peg$currPos; - s4 = peg$parseHexDigit(); - - if (s4 !== peg$FAILED) { - s5 = peg$parseHexDigit(); - - if (s5 !== peg$FAILED) { - s6 = peg$parseHexDigit(); - - if (s6 !== peg$FAILED) { - s7 = peg$parseHexDigit(); - - if (s7 !== peg$FAILED) { - s4 = [s4, s5, s6, s7]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s2 = input.substring(s2, peg$currPos); - } else { - s2 = s3; - } - - if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s0 = peg$f37(s2); - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseDecimalDigit() { - var s0; - - if (peg$r1.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseHexDigit() { - var s0; - - if (peg$r2.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseAnyMatcher() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - rule$expects(peg$e24); - - if (input.charCodeAt(peg$currPos) === 46) { - s1 = peg$c46; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f38(); - } - - s0 = s1; - return s0; - } - - function peg$parseCodeBlock() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - rule$expects(peg$e25); - peg$silentFails++; - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 123) { - s1 = peg$c47; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - s2 = peg$parseCode(); - - if (input.charCodeAt(peg$currPos) === 125) { - s3 = peg$c48; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s0 = s2; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 123) { - s1 = peg$c47; - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - if (s1 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$f39(); - } - - s0 = s1; - } - - peg$silentFails--; - return s0; - } - - function peg$parseCode() { - var s0, s1, s2, s3, s4, s5; - - s0 = peg$currPos; - s1 = []; - s2 = []; - s3 = peg$currPos; - s4 = peg$currPos; - peg$begin(); - - if (peg$r3.test(input.charAt(peg$currPos))) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - peg$end(true); - - if (s5 === peg$FAILED) { - s4 = undefined; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parseSourceCharacter(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$currPos; - peg$begin(); - - if (peg$r3.test(input.charAt(peg$currPos))) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - peg$end(true); - - if (s5 === peg$FAILED) { - s4 = undefined; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parseSourceCharacter(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 123) { - s3 = peg$c47; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s4 = peg$parseCode(); - - if (input.charCodeAt(peg$currPos) === 125) { - s5 = peg$c48; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s3 = [s3, s4, s5]; - s2 = s3; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } - - while (s2 !== peg$FAILED) { - s1.push(s2); - s2 = []; - s3 = peg$currPos; - s4 = peg$currPos; - peg$begin(); - - if (peg$r3.test(input.charAt(peg$currPos))) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - peg$end(true); - - if (s5 === peg$FAILED) { - s4 = undefined; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parseSourceCharacter(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - while (s3 !== peg$FAILED) { - s2.push(s3); - s3 = peg$currPos; - s4 = peg$currPos; - peg$begin(); - - if (peg$r3.test(input.charAt(peg$currPos))) { - s5 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - peg$end(true); - - if (s5 === peg$FAILED) { - s4 = undefined; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - - if (s4 !== peg$FAILED) { - s5 = peg$parseSourceCharacter(); - - if (s5 !== peg$FAILED) { - s4 = [s4, s5]; - s3 = s4; - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } else { - peg$currPos = s3; - s3 = peg$FAILED; - } - } - } else { - s2 = peg$FAILED; - } - - if (s2 === peg$FAILED) { - s2 = peg$currPos; - - if (input.charCodeAt(peg$currPos) === 123) { - s3 = peg$c47; - peg$currPos++; - } else { - s3 = peg$FAILED; - } - - if (s3 !== peg$FAILED) { - s4 = peg$parseCode(); - - if (input.charCodeAt(peg$currPos) === 125) { - s5 = peg$c48; - peg$currPos++; - } else { - s5 = peg$FAILED; - } - - if (s5 !== peg$FAILED) { - s3 = [s3, s4, s5]; - s2 = s3; - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } else { - peg$currPos = s2; - s2 = peg$FAILED; - } - } - } - - s0 = input.substring(s0, peg$currPos); - return s0; - } - - function peg$parseLl() { - var s0; - - if (peg$r4.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLm() { - var s0; - - if (peg$r5.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLo() { - var s0; - - if (peg$r6.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLt() { - var s0; - - if (peg$r7.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseLu() { - var s0; - - if (peg$r8.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseMc() { - var s0; - - if (peg$r9.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseMn() { - var s0; - - if (peg$r10.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseNd() { - var s0; - - if (peg$r11.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseNl() { - var s0; - - if (peg$r12.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parsePc() { - var s0; - - if (peg$r13.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parseZs() { - var s0; - - if (peg$r14.test(input.charAt(peg$currPos))) { - s0 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s0 = peg$FAILED; - } - - return s0; - } - - function peg$parse__() { - var s0, s1; - - s0 = []; - s1 = peg$parseWhiteSpace(); - - if (s1 === peg$FAILED) { - s1 = peg$parseLineTerminatorSequence(); - - if (s1 === peg$FAILED) { - s1 = peg$parseComment(); - } - } - - while (s1 !== peg$FAILED) { - s0.push(s1); - s1 = peg$parseWhiteSpace(); - - if (s1 === peg$FAILED) { - s1 = peg$parseLineTerminatorSequence(); - - if (s1 === peg$FAILED) { - s1 = peg$parseComment(); - } - } - } - - return s0; - } - - function peg$parse_() { - var s0, s1; - - s0 = []; - s1 = peg$parseWhiteSpace(); - - if (s1 === peg$FAILED) { - s1 = peg$parseMultiLineCommentNoLineTerminator(); - } - - while (s1 !== peg$FAILED) { - s0.push(s1); - s1 = peg$parseWhiteSpace(); - - if (s1 === peg$FAILED) { - s1 = peg$parseMultiLineCommentNoLineTerminator(); - } - } - - return s0; - } - - function peg$parseEOS() { - var s0, s1, s2, s3; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - s1 = peg$parse__(); - rule$expects(peg$e26); - - if (input.charCodeAt(peg$currPos) === 59) { - s2 = peg$c49; - peg$currPos++; - } else { - s2 = peg$FAILED; - } - - if (s2 !== peg$FAILED) { - s1 = [s1, s2]; - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parse_(); - s2 = peg$parseSingleLineComment(); - - if (s2 === peg$FAILED) { - s2 = null; - } - - s3 = peg$parseLineTerminatorSequence(); - - if (s3 !== peg$FAILED) { - s1 = [s1, s2, s3]; - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parse__(); - s2 = peg$parseEOF(); - - if (s2 !== peg$FAILED) { - s1 = [s1, s2]; - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } - } - - return s0; - } - - function peg$parseEOF() { - var s0, s1; - - var rule$expects = function rule$expects(expected) { - if (peg$silentFails === 0) peg$expect(expected); - }; - - s0 = peg$currPos; - peg$begin(); - rule$expects(peg$e12); - - if (input.length > peg$currPos) { - s1 = input.charAt(peg$currPos); - peg$currPos++; - } else { - s1 = peg$FAILED; - } - - peg$end(true); - - if (s1 === peg$FAILED) { - s0 = undefined; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - - return s0; - } - - var pick = true; - var RESERVED_WORDS = {}; - var reservedWords = options.reservedWords || util.reservedWords; - if (Array.isArray(reservedWords)) reservedWords.forEach(function (word) { - RESERVED_WORDS[word] = true; - }); - - function createNode(type, details) { - var node = new ast.Node(type, location()); - if (details === null) return node; - util.extend(node, details); - return util.enforceFastProperties(node); - } - - var comments = options.extractComments ? {} : null; - - function addComment(text, multiline) { - if (options.extractComments) { - var loc = location(); - comments[loc.start.offset] = { - text: text, - multiline: multiline, - location: loc - }; - } - - return text; - } - - peg$begin(); - peg$result = peg$startRuleFunction(); - - if (peg$result !== peg$FAILED && peg$currPos === input.length) { - return peg$result; - } else { - if (peg$result !== peg$FAILED && peg$currPos < input.length) { - peg$expect(peg$endExpectation()); - } - - throw peg$buildError(); - } - } - - var parser = { - SyntaxError: peg$SyntaxError, - parse: peg$parse - }; - - function fatal(message, location) { - if (typeof location !== "undefined") throw new grammarError(message, location); - throw new Error(message); - } - - var Session = function () { - function Session(config) { - _classCallCheck(this, Session); - - config = typeof config !== "undefined" ? config : {}; - this.opcodes = config.opcodes || opcodes_1; - this.parser = config.parser || parser; - this.passes = config.passes || {}; - this.visitor = config.visitor || ast.visitor; - this.vm = config.vm || vm; - if (typeof config.warn === "function") this.warn = config.warn; - if (typeof config.error === "function") this.error = config.error; - Object.defineProperty(this, "fatal", { - value: fatal - }); - } - - _createClass(Session, [{ - key: "parse", - value: function parse(input, options) { - return this.parser.parse(input, options); - } - }, { - key: "buildVisitor", - value: function buildVisitor(functions) { - return this.visitor.build(functions); - } - }, { - key: "warn", - value: function warn(_message, _location) {} - }, { - key: "error", - value: function error(message, location) { - fatal(message, location); - } - }]); - - return Session; - }(); - - var session = Session; - - var compiler = { - Session: session, - passes: { - check: { - reportUndefinedRules: reportUndefinedRules_1, - reportDuplicateRules: reportDuplicateRules_1, - reportUnusedRules: reportUnusedRules_1, - reportDuplicateLabels: reportDuplicateLabels_1, - reportInfiniteRecursion: reportInfiniteRecursion_1, - reportInfiniteRepetition: reportInfiniteRepetition_1, - reportIncorrectPlucking: reportIncorrectPlucking_1 - }, - transform: { - removeProxyRules: removeProxyRules_1 - }, - generate: { - calcReportFailures: calcReportFailures_1, - inferenceMatchResult: inferenceMatchResult_1, - generateBytecode: generateBytecode_1, - generateJS: generateJs - } - }, - compile: function compile(ast, session$$1, options) { - options = typeof options !== "undefined" ? options : {}; - options = util.processOptions(options, { - allowedStartRules: [ast.rules[0].name], - cache: false, - context: {}, - dependencies: {}, - exportVar: null, - features: null, - format: "bare", - header: null, - optimize: "speed", - output: "parser", - trace: false - }); - if (options.output === "parser") options.format = "umd"; - util.each(session$$1.passes, function (stage) { - stage.forEach(function (pass) { - pass(ast, session$$1, options); - }); - }); - - switch (options.output) { - case "parser": - return session$$1.vm.evalModule(ast.code, options.context); - - case "source": - return ast.code; - - default: - session$$1.error("Invalid output format: ".concat(options.output, ".")); - } - } - }; - var compiler_1 = compiler; - - var peg = { - VERSION: require$$0.version, - GrammarError: grammarError, - ast: ast, - parser: parser, - compiler: compiler_1, - util: util, - generate: function generate(grammar, options) { - options = typeof options !== "undefined" ? options : {}; - var session = new compiler_1.Session({ - passes: util.convertPasses(compiler_1.passes) - }); - if (Array.isArray(options.plugins)) options.plugins.forEach(function (p) { - if (typeof p.use !== "function") return; - p.use(session, options); - }); - return compiler_1.compile(session.parse(grammar, options.parser || {}), session, options); - } - }; - var peg_1 = peg; - - // This is an `every` implementation that works for all iterables - var every = function every(obj, fn) { - var pass = true; - - try { - /* eslint-disable-next-line local-rules/no-prototype-methods */ - obj.forEach(function() { - if (!fn.apply(this, arguments)) { - // Throwing an error is the only way to break `forEach` - throw new Error(); - } - }); - } catch (e) { - pass = false; - } - - return pass; - }; - - var functionName = function functionName(func) { - return ( - func.displayName || - func.name || - // Use function decomposition as a last resort to get function - // name. Does not rely on function decomposition to work - if it - // doesn't debugging will be slightly less informative - // (i.e. toString will say 'spy' rather than 'myFunc'). - (String(func).match(/function ([^\s\(]+)/) || [])[1] - ); - }; - - var call$1 = Function.call; - - var copyPrototype = function copyPrototypeMethods(prototype) { - /* eslint-disable local-rules/no-prototype-methods */ - return Object.getOwnPropertyNames(prototype).reduce(function(result, name) { - // ignore size because it throws from Map - if ( - name !== "size" && - name !== "caller" && - name !== "callee" && - name !== "arguments" && - typeof prototype[name] === "function" - ) { - result[name] = call$1.bind(prototype[name]); - } - - return result; - }, Object.create(null)); - }; - - var array = copyPrototype(Array.prototype); - - var _function = copyPrototype(Function.prototype); - - var object = copyPrototype(Object.prototype); - - var string = copyPrototype(String.prototype); - - var prototypes = { - array: array, - function: _function, - object: object, - string: string - }; - - var commonjsGlobal$1 = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; - - function commonjsRequire$1 () { - throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); - } - - function unwrapExports$1 (x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; - } - - function createCommonjsModule$1(fn, module) { - return module = { exports: {} }, fn(module, module.exports), module.exports; - } - - var typeDetect$1 = createCommonjsModule$1(function (module, exports) { - (function (global, factory) { - module.exports = factory(); - }(commonjsGlobal$1, (function () { - /* ! - * type-detect - * Copyright(c) 2013 jake luer - * MIT Licensed - */ - var promiseExists = typeof Promise === 'function'; - - /* eslint-disable no-undef */ - var globalObject = typeof self === 'object' ? self : commonjsGlobal$1; // eslint-disable-line id-blacklist - - var symbolExists = typeof Symbol !== 'undefined'; - var mapExists = typeof Map !== 'undefined'; - var setExists = typeof Set !== 'undefined'; - var weakMapExists = typeof WeakMap !== 'undefined'; - var weakSetExists = typeof WeakSet !== 'undefined'; - var dataViewExists = typeof DataView !== 'undefined'; - var symbolIteratorExists = symbolExists && typeof Symbol.iterator !== 'undefined'; - var symbolToStringTagExists = symbolExists && typeof Symbol.toStringTag !== 'undefined'; - var setEntriesExists = setExists && typeof Set.prototype.entries === 'function'; - var mapEntriesExists = mapExists && typeof Map.prototype.entries === 'function'; - var setIteratorPrototype = setEntriesExists && Object.getPrototypeOf(new Set().entries()); - var mapIteratorPrototype = mapEntriesExists && Object.getPrototypeOf(new Map().entries()); - var arrayIteratorExists = symbolIteratorExists && typeof Array.prototype[Symbol.iterator] === 'function'; - var arrayIteratorPrototype = arrayIteratorExists && Object.getPrototypeOf([][Symbol.iterator]()); - var stringIteratorExists = symbolIteratorExists && typeof String.prototype[Symbol.iterator] === 'function'; - var stringIteratorPrototype = stringIteratorExists && Object.getPrototypeOf(''[Symbol.iterator]()); - var toStringLeftSliceLength = 8; - var toStringRightSliceLength = -1; - /** - * ### typeOf (obj) - * - * Uses `Object.prototype.toString` to determine the type of an object, - * normalising behaviour across engine versions & well optimised. - * - * @param {Mixed} object - * @return {String} object type - * @api public - */ - function typeDetect(obj) { - /* ! Speed optimisation - * Pre: - * string literal x 3,039,035 ops/sec ±1.62% (78 runs sampled) - * boolean literal x 1,424,138 ops/sec ±4.54% (75 runs sampled) - * number literal x 1,653,153 ops/sec ±1.91% (82 runs sampled) - * undefined x 9,978,660 ops/sec ±1.92% (75 runs sampled) - * function x 2,556,769 ops/sec ±1.73% (77 runs sampled) - * Post: - * string literal x 38,564,796 ops/sec ±1.15% (79 runs sampled) - * boolean literal x 31,148,940 ops/sec ±1.10% (79 runs sampled) - * number literal x 32,679,330 ops/sec ±1.90% (78 runs sampled) - * undefined x 32,363,368 ops/sec ±1.07% (82 runs sampled) - * function x 31,296,870 ops/sec ±0.96% (83 runs sampled) - */ - var typeofObj = typeof obj; - if (typeofObj !== 'object') { - return typeofObj; - } - - /* ! Speed optimisation - * Pre: - * null x 28,645,765 ops/sec ±1.17% (82 runs sampled) - * Post: - * null x 36,428,962 ops/sec ±1.37% (84 runs sampled) - */ - if (obj === null) { - return 'null'; - } - - /* ! Spec Conformance - * Test: `Object.prototype.toString.call(window)`` - * - Node === "[object global]" - * - Chrome === "[object global]" - * - Firefox === "[object Window]" - * - PhantomJS === "[object Window]" - * - Safari === "[object Window]" - * - IE 11 === "[object Window]" - * - IE Edge === "[object Window]" - * Test: `Object.prototype.toString.call(this)`` - * - Chrome Worker === "[object global]" - * - Firefox Worker === "[object DedicatedWorkerGlobalScope]" - * - Safari Worker === "[object DedicatedWorkerGlobalScope]" - * - IE 11 Worker === "[object WorkerGlobalScope]" - * - IE Edge Worker === "[object WorkerGlobalScope]" - */ - if (obj === globalObject) { - return 'global'; - } - - /* ! Speed optimisation - * Pre: - * array literal x 2,888,352 ops/sec ±0.67% (82 runs sampled) - * Post: - * array literal x 22,479,650 ops/sec ±0.96% (81 runs sampled) - */ - if ( - Array.isArray(obj) && - (symbolToStringTagExists === false || !(Symbol.toStringTag in obj)) - ) { - return 'Array'; - } - - // Not caching existence of `window` and related properties due to potential - // for `window` to be unset before tests in quasi-browser environments. - if (typeof window === 'object' && window !== null) { - /* ! Spec Conformance - * (https://html.spec.whatwg.org/multipage/browsers.html#location) - * WhatWG HTML$7.7.3 - The `Location` interface - * Test: `Object.prototype.toString.call(window.location)`` - * - IE <=11 === "[object Object]" - * - IE Edge <=13 === "[object Object]" - */ - if (typeof window.location === 'object' && obj === window.location) { - return 'Location'; - } - - /* ! Spec Conformance - * (https://html.spec.whatwg.org/#document) - * WhatWG HTML$3.1.1 - The `Document` object - * Note: Most browsers currently adher to the W3C DOM Level 2 spec - * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-26809268) - * which suggests that browsers should use HTMLTableCellElement for - * both TD and TH elements. WhatWG separates these. - * WhatWG HTML states: - * > For historical reasons, Window objects must also have a - * > writable, configurable, non-enumerable property named - * > HTMLDocument whose value is the Document interface object. - * Test: `Object.prototype.toString.call(document)`` - * - Chrome === "[object HTMLDocument]" - * - Firefox === "[object HTMLDocument]" - * - Safari === "[object HTMLDocument]" - * - IE <=10 === "[object Document]" - * - IE 11 === "[object HTMLDocument]" - * - IE Edge <=13 === "[object HTMLDocument]" - */ - if (typeof window.document === 'object' && obj === window.document) { - return 'Document'; - } - - if (typeof window.navigator === 'object') { - /* ! Spec Conformance - * (https://html.spec.whatwg.org/multipage/webappapis.html#mimetypearray) - * WhatWG HTML$8.6.1.5 - Plugins - Interface MimeTypeArray - * Test: `Object.prototype.toString.call(navigator.mimeTypes)`` - * - IE <=10 === "[object MSMimeTypesCollection]" - */ - if (typeof window.navigator.mimeTypes === 'object' && - obj === window.navigator.mimeTypes) { - return 'MimeTypeArray'; - } - - /* ! Spec Conformance - * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) - * WhatWG HTML$8.6.1.5 - Plugins - Interface PluginArray - * Test: `Object.prototype.toString.call(navigator.plugins)`` - * - IE <=10 === "[object MSPluginsCollection]" - */ - if (typeof window.navigator.plugins === 'object' && - obj === window.navigator.plugins) { - return 'PluginArray'; - } - } - - if ((typeof window.HTMLElement === 'function' || - typeof window.HTMLElement === 'object') && - obj instanceof window.HTMLElement) { - /* ! Spec Conformance - * (https://html.spec.whatwg.org/multipage/webappapis.html#pluginarray) - * WhatWG HTML$4.4.4 - The `blockquote` element - Interface `HTMLQuoteElement` - * Test: `Object.prototype.toString.call(document.createElement('blockquote'))`` - * - IE <=10 === "[object HTMLBlockElement]" - */ - if (obj.tagName === 'BLOCKQUOTE') { - return 'HTMLQuoteElement'; - } - - /* ! Spec Conformance - * (https://html.spec.whatwg.org/#htmltabledatacellelement) - * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableDataCellElement` - * Note: Most browsers currently adher to the W3C DOM Level 2 spec - * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) - * which suggests that browsers should use HTMLTableCellElement for - * both TD and TH elements. WhatWG separates these. - * Test: Object.prototype.toString.call(document.createElement('td')) - * - Chrome === "[object HTMLTableCellElement]" - * - Firefox === "[object HTMLTableCellElement]" - * - Safari === "[object HTMLTableCellElement]" - */ - if (obj.tagName === 'TD') { - return 'HTMLTableDataCellElement'; - } - - /* ! Spec Conformance - * (https://html.spec.whatwg.org/#htmltableheadercellelement) - * WhatWG HTML$4.9.9 - The `td` element - Interface `HTMLTableHeaderCellElement` - * Note: Most browsers currently adher to the W3C DOM Level 2 spec - * (https://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-82915075) - * which suggests that browsers should use HTMLTableCellElement for - * both TD and TH elements. WhatWG separates these. - * Test: Object.prototype.toString.call(document.createElement('th')) - * - Chrome === "[object HTMLTableCellElement]" - * - Firefox === "[object HTMLTableCellElement]" - * - Safari === "[object HTMLTableCellElement]" - */ - if (obj.tagName === 'TH') { - return 'HTMLTableHeaderCellElement'; - } - } - } - - /* ! Speed optimisation - * Pre: - * Float64Array x 625,644 ops/sec ±1.58% (80 runs sampled) - * Float32Array x 1,279,852 ops/sec ±2.91% (77 runs sampled) - * Uint32Array x 1,178,185 ops/sec ±1.95% (83 runs sampled) - * Uint16Array x 1,008,380 ops/sec ±2.25% (80 runs sampled) - * Uint8Array x 1,128,040 ops/sec ±2.11% (81 runs sampled) - * Int32Array x 1,170,119 ops/sec ±2.88% (80 runs sampled) - * Int16Array x 1,176,348 ops/sec ±5.79% (86 runs sampled) - * Int8Array x 1,058,707 ops/sec ±4.94% (77 runs sampled) - * Uint8ClampedArray x 1,110,633 ops/sec ±4.20% (80 runs sampled) - * Post: - * Float64Array x 7,105,671 ops/sec ±13.47% (64 runs sampled) - * Float32Array x 5,887,912 ops/sec ±1.46% (82 runs sampled) - * Uint32Array x 6,491,661 ops/sec ±1.76% (79 runs sampled) - * Uint16Array x 6,559,795 ops/sec ±1.67% (82 runs sampled) - * Uint8Array x 6,463,966 ops/sec ±1.43% (85 runs sampled) - * Int32Array x 5,641,841 ops/sec ±3.49% (81 runs sampled) - * Int16Array x 6,583,511 ops/sec ±1.98% (80 runs sampled) - * Int8Array x 6,606,078 ops/sec ±1.74% (81 runs sampled) - * Uint8ClampedArray x 6,602,224 ops/sec ±1.77% (83 runs sampled) - */ - var stringTag = (symbolToStringTagExists && obj[Symbol.toStringTag]); - if (typeof stringTag === 'string') { - return stringTag; - } - - var objPrototype = Object.getPrototypeOf(obj); - /* ! Speed optimisation - * Pre: - * regex literal x 1,772,385 ops/sec ±1.85% (77 runs sampled) - * regex constructor x 2,143,634 ops/sec ±2.46% (78 runs sampled) - * Post: - * regex literal x 3,928,009 ops/sec ±0.65% (78 runs sampled) - * regex constructor x 3,931,108 ops/sec ±0.58% (84 runs sampled) - */ - if (objPrototype === RegExp.prototype) { - return 'RegExp'; - } - - /* ! Speed optimisation - * Pre: - * date x 2,130,074 ops/sec ±4.42% (68 runs sampled) - * Post: - * date x 3,953,779 ops/sec ±1.35% (77 runs sampled) - */ - if (objPrototype === Date.prototype) { - return 'Date'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-promise.prototype-@@tostringtag) - * ES6$25.4.5.4 - Promise.prototype[@@toStringTag] should be "Promise": - * Test: `Object.prototype.toString.call(Promise.resolve())`` - * - Chrome <=47 === "[object Object]" - * - Edge <=20 === "[object Object]" - * - Firefox 29-Latest === "[object Promise]" - * - Safari 7.1-Latest === "[object Promise]" - */ - if (promiseExists && objPrototype === Promise.prototype) { - return 'Promise'; - } - - /* ! Speed optimisation - * Pre: - * set x 2,222,186 ops/sec ±1.31% (82 runs sampled) - * Post: - * set x 4,545,879 ops/sec ±1.13% (83 runs sampled) - */ - if (setExists && objPrototype === Set.prototype) { - return 'Set'; - } - - /* ! Speed optimisation - * Pre: - * map x 2,396,842 ops/sec ±1.59% (81 runs sampled) - * Post: - * map x 4,183,945 ops/sec ±6.59% (82 runs sampled) - */ - if (mapExists && objPrototype === Map.prototype) { - return 'Map'; - } - - /* ! Speed optimisation - * Pre: - * weakset x 1,323,220 ops/sec ±2.17% (76 runs sampled) - * Post: - * weakset x 4,237,510 ops/sec ±2.01% (77 runs sampled) - */ - if (weakSetExists && objPrototype === WeakSet.prototype) { - return 'WeakSet'; - } - - /* ! Speed optimisation - * Pre: - * weakmap x 1,500,260 ops/sec ±2.02% (78 runs sampled) - * Post: - * weakmap x 3,881,384 ops/sec ±1.45% (82 runs sampled) - */ - if (weakMapExists && objPrototype === WeakMap.prototype) { - return 'WeakMap'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-dataview.prototype-@@tostringtag) - * ES6$24.2.4.21 - DataView.prototype[@@toStringTag] should be "DataView": - * Test: `Object.prototype.toString.call(new DataView(new ArrayBuffer(1)))`` - * - Edge <=13 === "[object Object]" - */ - if (dataViewExists && objPrototype === DataView.prototype) { - return 'DataView'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%mapiteratorprototype%-@@tostringtag) - * ES6$23.1.5.2.2 - %MapIteratorPrototype%[@@toStringTag] should be "Map Iterator": - * Test: `Object.prototype.toString.call(new Map().entries())`` - * - Edge <=13 === "[object Object]" - */ - if (mapExists && objPrototype === mapIteratorPrototype) { - return 'Map Iterator'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%setiteratorprototype%-@@tostringtag) - * ES6$23.2.5.2.2 - %SetIteratorPrototype%[@@toStringTag] should be "Set Iterator": - * Test: `Object.prototype.toString.call(new Set().entries())`` - * - Edge <=13 === "[object Object]" - */ - if (setExists && objPrototype === setIteratorPrototype) { - return 'Set Iterator'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%arrayiteratorprototype%-@@tostringtag) - * ES6$22.1.5.2.2 - %ArrayIteratorPrototype%[@@toStringTag] should be "Array Iterator": - * Test: `Object.prototype.toString.call([][Symbol.iterator]())`` - * - Edge <=13 === "[object Object]" - */ - if (arrayIteratorExists && objPrototype === arrayIteratorPrototype) { - return 'Array Iterator'; - } - - /* ! Spec Conformance - * (http://www.ecma-international.org/ecma-262/6.0/index.html#sec-%stringiteratorprototype%-@@tostringtag) - * ES6$21.1.5.2.2 - %StringIteratorPrototype%[@@toStringTag] should be "String Iterator": - * Test: `Object.prototype.toString.call(''[Symbol.iterator]())`` - * - Edge <=13 === "[object Object]" - */ - if (stringIteratorExists && objPrototype === stringIteratorPrototype) { - return 'String Iterator'; - } - - /* ! Speed optimisation - * Pre: - * object from null x 2,424,320 ops/sec ±1.67% (76 runs sampled) - * Post: - * object from null x 5,838,000 ops/sec ±0.99% (84 runs sampled) - */ - if (objPrototype === null) { - return 'Object'; - } - - return Object - .prototype - .toString - .call(obj) - .slice(toStringLeftSliceLength, toStringRightSliceLength); - } - - return typeDetect; - - }))); - }); - - var typeOf = function typeOf(value) { - return typeDetect$1(value).toLowerCase(); - }; - - function valueToString(value) { - if (value && value.toString) { - /* eslint-disable-next-line local-rules/no-prototype-methods */ - return value.toString(); - } - return String(value); - } - - var valueToString_1 = valueToString; - - var lib = { - every: every, - functionName: functionName, - prototypes: prototypes, - typeOf: typeOf, - valueToString: valueToString_1 - }; - - var arrayProto = lib.prototypes.array; - var hasOwnProperty = lib.prototypes.object.hasOwnProperty; - - var join = arrayProto.join; - var push = arrayProto.push; - var slice = arrayProto.slice; - - // Adapted from https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug - var hasDontEnumBug = (function() { - var obj = { - constructor: function() { - return "0"; - }, - toString: function() { - return "1"; - }, - valueOf: function() { - return "2"; - }, - toLocaleString: function() { - return "3"; - }, - prototype: function() { - return "4"; - }, - isPrototypeOf: function() { - return "5"; - }, - propertyIsEnumerable: function() { - return "6"; - }, - hasOwnProperty: function() { - return "7"; - }, - length: function() { - return "8"; - }, - unique: function() { - return "9"; - } - }; - - var result = []; - for (var prop in obj) { - if (hasOwnProperty(obj, prop)) { - push(result, obj[prop]()); - } - } - return join(result, "") !== "0123456789"; - })(); - - /* Public: Extend target in place with all (own) properties from sources in-order. Thus, last source will - * override properties in previous sources. - * - * target - The Object to extend - * sources - Objects to copy properties from. - * - * Returns the extended target - */ - var extend = function extend(target /*, sources */) { - var sources = slice(arguments, 1); - var source, i, prop; - - for (i = 0; i < sources.length; i++) { - source = sources[i]; - - for (prop in source) { - if (hasOwnProperty(source, prop)) { - target[prop] = source[prop]; - } - } - - // Make sure we copy (own) toString method even when in JScript with DontEnum bug - // See https://developer.mozilla.org/en/docs/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug - if (hasDontEnumBug && hasOwnProperty(source, "toString") && source.toString !== target.toString) { - target.toString = source.toString; - } - } - - return target; - }; - - /* istanbul ignore next : not testing that setTimeout works */ - function nextTick(callback) { - setTimeout(callback, 0); - } - - var getNextTick = function getNextTick(process, setImmediate) { - if (typeof process === "object" && typeof process.nextTick === "function") { - return process.nextTick; - } - - if (typeof setImmediate === "function") { - return setImmediate; - } - - return nextTick; - }; - - /* istanbul ignore next */ - var root = typeof window !== "undefined" ? window : commonjsGlobal$1; - - var nextTick$1 = getNextTick(root.process, root.setImmediate); - - var arrayProto$1 = lib.prototypes.array; - - var functionName$1 = lib.functionName; - - var valueToString$1 = lib.valueToString; - - var concat = arrayProto$1.concat; - var forEach = arrayProto$1.forEach; - var join$1 = arrayProto$1.join; - var reverse = arrayProto$1.reverse; - var slice$1 = arrayProto$1.slice; - - var useLeftMostCallback = -1; - var useRightMostCallback = -2; - - function getCallback(behavior, args) { - var callArgAt = behavior.callArgAt; - - if (callArgAt >= 0) { - return args[callArgAt]; - } - - var argumentList; - - if (callArgAt === useLeftMostCallback) { - argumentList = args; - } - - if (callArgAt === useRightMostCallback) { - argumentList = reverse(slice$1(args)); - } - - var callArgProp = behavior.callArgProp; - - for (var i = 0, l = argumentList.length; i < l; ++i) { - if (!callArgProp && typeof argumentList[i] === "function") { - return argumentList[i]; - } - - if (callArgProp && argumentList[i] && typeof argumentList[i][callArgProp] === "function") { - return argumentList[i][callArgProp]; - } - } - - return null; - } - - function getCallbackError(behavior, func, args) { - if (behavior.callArgAt < 0) { - var msg; - - if (behavior.callArgProp) { - msg = - functionName$1(behavior.stub) + - " expected to yield to '" + - valueToString$1(behavior.callArgProp) + - "', but no object with such a property was passed."; - } else { - msg = functionName$1(behavior.stub) + " expected to yield, but no callback was passed."; - } - - if (args.length > 0) { - msg += " Received [" + join$1(args, ", ") + "]"; - } - - return msg; - } - - return "argument at index " + behavior.callArgAt + " is not a function: " + func; - } - - function ensureArgs(name, behavior, args) { - // map function name to internal property - // callsArg => callArgAt - var property = name.replace(/sArg/, "ArgAt"); - var index = behavior[property]; - - if (index >= args.length) { - throw new TypeError( - name + " failed: " + (index + 1) + " arguments required but only " + args.length + " present" - ); - } - } - - function callCallback(behavior, args) { - if (typeof behavior.callArgAt === "number") { - ensureArgs("callsArg", behavior, args); - var func = getCallback(behavior, args); - - if (typeof func !== "function") { - throw new TypeError(getCallbackError(behavior, func, args)); - } - - if (behavior.callbackAsync) { - nextTick$1(function() { - func.apply(behavior.callbackContext, behavior.callbackArguments); - }); - } else { - return func.apply(behavior.callbackContext, behavior.callbackArguments); - } - } - - return undefined; - } - - var proto = { - create: function create(stub) { - var behavior = extend({}, proto); - delete behavior.create; - delete behavior.addBehavior; - delete behavior.createBehavior; - behavior.stub = stub; - - if (stub.defaultBehavior && stub.defaultBehavior.promiseLibrary) { - behavior.promiseLibrary = stub.defaultBehavior.promiseLibrary; - } - - return behavior; - }, - - isPresent: function isPresent() { - return ( - typeof this.callArgAt === "number" || - this.exception || - this.exceptionCreator || - typeof this.returnArgAt === "number" || - this.returnThis || - typeof this.resolveArgAt === "number" || - this.resolveThis || - typeof this.throwArgAt === "number" || - this.fakeFn || - this.returnValueDefined - ); - }, - - invoke: function invoke(context, args) { - /* - * callCallback (conditionally) calls ensureArgs - * - * Note: callCallback intentionally happens before - * everything else and cannot be moved lower - */ - var returnValue = callCallback(this, args); - - if (this.exception) { - throw this.exception; - } else if (this.exceptionCreator) { - this.exception = this.exceptionCreator(); - this.exceptionCreator = undefined; - throw this.exception; - } else if (typeof this.returnArgAt === "number") { - ensureArgs("returnsArg", this, args); - return args[this.returnArgAt]; - } else if (this.returnThis) { - return context; - } else if (typeof this.throwArgAt === "number") { - ensureArgs("throwsArg", this, args); - throw args[this.throwArgAt]; - } else if (this.fakeFn) { - return this.fakeFn.apply(context, args); - } else if (typeof this.resolveArgAt === "number") { - ensureArgs("resolvesArg", this, args); - return (this.promiseLibrary || Promise).resolve(args[this.resolveArgAt]); - } else if (this.resolveThis) { - return (this.promiseLibrary || Promise).resolve(context); - } else if (this.resolve) { - return (this.promiseLibrary || Promise).resolve(this.returnValue); - } else if (this.reject) { - return (this.promiseLibrary || Promise).reject(this.returnValue); - } else if (this.callsThrough) { - return this.stub.wrappedMethod.apply(context, args); - } else if (typeof this.returnValue !== "undefined") { - return this.returnValue; - } else if (typeof this.callArgAt === "number") { - return returnValue; - } - - return this.returnValue; - }, - - onCall: function onCall(index) { - return this.stub.onCall(index); - }, - - onFirstCall: function onFirstCall() { - return this.stub.onFirstCall(); - }, - - onSecondCall: function onSecondCall() { - return this.stub.onSecondCall(); - }, - - onThirdCall: function onThirdCall() { - return this.stub.onThirdCall(); - }, - - withArgs: function withArgs(/* arguments */) { - throw new Error( - 'Defining a stub by invoking "stub.onCall(...).withArgs(...)" ' + - 'is not supported. Use "stub.withArgs(...).onCall(...)" ' + - "to define sequential behavior for calls with certain arguments." - ); - } - }; - - function createAsyncVersion(syncFnName) { - return function() { - var result = this[syncFnName].apply(this, arguments); - this.callbackAsync = true; - return result; - }; - } - - // create asynchronous versions of callsArg* and yields* methods - forEach(Object.keys(proto), function(method) { - // need to avoid creating anotherasync versions of the newly added async methods - if (method.match(/^(callsArg|yields)/) && !method.match(/Async/)) { - proto[method + "Async"] = createAsyncVersion(method); - } - }); - - function createBehavior(behaviorMethod) { - return function() { - this.defaultBehavior = this.defaultBehavior || proto.create(this); - this.defaultBehavior[behaviorMethod].apply(this.defaultBehavior, arguments); - return this; - }; - } - - function addBehavior(stub, name, fn) { - proto[name] = function() { - fn.apply(this, concat([this], slice$1(arguments))); - return this.stub || this; - }; - - stub[name] = createBehavior(name); - } - - proto.addBehavior = addBehavior; - proto.createBehavior = createBehavior; - var behavior = proto; - - var forEach$1 = lib.prototypes.array.forEach; - - function walkInternal(obj, iterator, context, originalObj, seen) { - var proto, prop; - - if (typeof Object.getOwnPropertyNames !== "function") { - // We explicitly want to enumerate through all of the prototype's properties - // in this case, therefore we deliberately leave out an own property check. - /* eslint-disable-next-line guard-for-in */ - for (prop in obj) { - iterator.call(context, obj[prop], prop, obj); - } - - return; - } - - forEach$1(Object.getOwnPropertyNames(obj), function(k) { - if (seen[k] !== true) { - seen[k] = true; - var target = typeof Object.getOwnPropertyDescriptor(obj, k).get === "function" ? originalObj : obj; - iterator.call(context, k, target); - } - }); - - proto = Object.getPrototypeOf(obj); - if (proto) { - walkInternal(proto, iterator, context, originalObj, seen); - } - } - - /* Walks the prototype chain of an object and iterates over every own property - * name encountered. The iterator is called in the same fashion that Array.prototype.forEach - * works, where it is passed the value, key, and own object as the 1st, 2nd, and 3rd positional - * argument, respectively. In cases where Object.getOwnPropertyNames is not available, walk will - * default to using a simple for..in loop. - * - * obj - The object to walk the prototype chain for. - * iterator - The function to be called on each pass of the walk. - * context - (Optional) When given, the iterator will be called with this object as the receiver. - */ - var walk = function walk(obj, iterator, context) { - return walkInternal(obj, iterator, context, obj, {}); - }; - - var getPropertyDescriptor = function getPropertyDescriptor(object, property) { - var proto = object; - var descriptor; - - while (proto && !(descriptor = Object.getOwnPropertyDescriptor(proto, property))) { - proto = Object.getPrototypeOf(proto); - } - return descriptor; - }; - - var hasOwnProperty$1 = lib.prototypes.object.hasOwnProperty; - var push$1 = lib.prototypes.array.push; - - function collectMethod(methods, object, prop, propOwner) { - if (typeof getPropertyDescriptor(propOwner, prop).value === "function" && hasOwnProperty$1(object, prop)) { - push$1(methods, object[prop]); - } - } - - // This function returns an array of all the own methods on the passed object - function collectOwnMethods(object) { - var methods = []; - - walk(object, collectMethod.bind(null, methods, object)); - - return methods; - } - - var collectOwnMethods_1 = collectOwnMethods; - - /** - * Verify if an object is a ECMAScript Module - * - * As the exports from a module is immutable we cannot alter the exports - * using spies or stubs. Let the consumer know this to avoid bug reports - * on weird error messages. - * - * @param {Object} object The object to examine - * - * @returns {Boolean} true when the object is a module - */ - var isEsModule = function(object) { - return ( - object && typeof Symbol !== "undefined" && object[Symbol.toStringTag] === "Module" && Object.isSealed(object) - ); - }; - - function isPropertyConfigurable(obj, propName) { - var propertyDescriptor = getPropertyDescriptor(obj, propName); - - return propertyDescriptor ? propertyDescriptor.configurable : true; - } - - var isPropertyConfigurable_1 = isPropertyConfigurable; - - function isNonExistentOwnProperty(object, property) { - return object && typeof property !== "undefined" && !(property in object); - } - - var isNonExistentOwnProperty_1 = isNonExistentOwnProperty; - - var o = Object.prototype; - - function getClass(value) { - // Returns the internal [[Class]] by calling Object.prototype.toString - // with the provided value as this. Return value is a string, naming the - // internal class, e.g. "Array" - return o.toString.call(value).split(/[ \]]/)[1]; - } - - var getClass_1 = getClass; - - function isNaN$1$1(value) { - // Unlike global isNaN, this avoids type coercion - // typeof check avoids IE host object issues, hat tip to - // lodash - var val = value; // JsLint thinks value !== value is "weird" - return typeof value === "number" && value !== val; - } - - var isNan = isNaN$1$1; - - /** - * @name samsam.isNegZero - * @param Object value - * - * Returns ``true`` if ``value`` is ``-0``. - */ - function isNegZero(value) { - return value === 0 && 1 / value === -Infinity; - } - - var isNegZero_1 = isNegZero; - - /** - * @name samsam.equal - * @param Object obj1 - * @param Object obj2 - * - * Returns ``true`` if two objects are strictly equal. Compared to - * ``===`` there are two exceptions: - * - * - NaN is considered equal to NaN - * - -0 and +0 are not considered equal - */ - function identical(obj1, obj2) { - if (obj1 === obj2 || (isNan(obj1) && isNan(obj2))) { - return obj1 !== 0 || isNegZero_1(obj1) === isNegZero_1(obj2); - } - - return false; - } - - var identical_1 = identical; - - /** - * @name samsam.isArguments - * @param Object object - * - * Returns ``true`` if ``object`` is an ``arguments`` object, - * ``false`` otherwise. - */ - function isArguments(object) { - if (getClass_1(object) === "Arguments") { - return true; - } - if ( - typeof object !== "object" || - typeof object.length !== "number" || - getClass_1(object) === "Array" - ) { - return false; - } - if (typeof object.callee === "function") { - return true; - } - try { - object[object.length] = 6; - delete object[object.length]; - } catch (e) { - return true; - } - return false; - } - - var isArguments_1 = isArguments; - - function isDate(value) { - return value instanceof Date; - } - - var isDate_1 = isDate; - - var div = typeof document !== "undefined" && document.createElement("div"); - - /** - * @name samsam.isElement - * @param Object object - * - * Returns ``true`` if ``object`` is a DOM element node. Unlike - * Underscore.js/lodash, this function will return ``false`` if ``object`` - * is an *element-like* object, i.e. a regular object with a ``nodeType`` - * property that holds the value ``1``. - */ - function isElement(object) { - if (!object || object.nodeType !== 1 || !div) { - return false; - } - try { - object.appendChild(div); - object.removeChild(div); - } catch (e) { - return false; - } - return true; - } - - var isElement_1 = isElement; - - // Returns true when the value is a regular Object and not a specialized Object - // - // This helps speeding up deepEqual cyclic checks - // The premise is that only Objects are stored in the visited array. - // So if this function returns false, we don't have to do the - // expensive operation of searching for the value in the the array of already - // visited objects - function isObject(value) { - return ( - typeof value === "object" && - value !== null && - // none of these are collection objects, so we can return false - !(value instanceof Boolean) && - !(value instanceof Date) && - !(value instanceof Error) && - !(value instanceof Number) && - !(value instanceof RegExp) && - !(value instanceof String) - ); - } - - var isObject_1 = isObject; - - function isSet(val) { - return (typeof Set !== "undefined" && val instanceof Set) || false; - } - - var isSet_1 = isSet; - - function isSubset(s1, s2, compare) { - var allContained = true; - s1.forEach(function(v1) { - var includes = false; - s2.forEach(function(v2) { - if (compare(v2, v1)) { - includes = true; - } - }); - allContained = allContained && includes; - }); - - return allContained; - } - - var isSubset_1 = isSubset; - - var re = /function (\w+)\s*\(/; - - function getClassName(value) { - if (value.constructor && "name" in value.constructor) { - return value.constructor.name; - } - - if (typeof value.constructor === "function") { - var match = value.constructor.toString().match(re); - if (match.length > 1) { - return match[1]; - } - } - - return null; - } - - var getClassName_1 = getClassName; - - var every$1 = Array.prototype.every; - var getTime = Date.prototype.getTime; - var hasOwnProperty$2 = Object.prototype.hasOwnProperty; - var indexOf = Array.prototype.indexOf; - var keys = Object.keys; - - /** - * @name samsam.deepEqual - * @param Object first - * @param Object second - * - * Deep equal comparison. Two values are "deep equal" if: - * - * - They are equal, according to samsam.identical - * - They are both date objects representing the same time - * - They are both arrays containing elements that are all deepEqual - * - They are objects with the same set of properties, and each property - * in ``first`` is deepEqual to the corresponding property in ``second`` - * - * Supports cyclic objects. - */ - function deepEqualCyclic(first, second) { - // used for cyclic comparison - // contain already visited objects - var objects1 = []; - var objects2 = []; - // contain pathes (position in the object structure) - // of the already visited objects - // indexes same as in objects arrays - var paths1 = []; - var paths2 = []; - // contains combinations of already compared objects - // in the manner: { "$1['ref']$2['ref']": true } - var compared = {}; - - // does the recursion for the deep equal check - return (function deepEqual(obj1, obj2, path1, path2) { - var type1 = typeof obj1; - var type2 = typeof obj2; - - // == null also matches undefined - if ( - obj1 === obj2 || - isNan(obj1) || - isNan(obj2) || - obj1 == null || - obj2 == null || - type1 !== "object" || - type2 !== "object" - ) { - return identical_1(obj1, obj2); - } - - // Elements are only equal if identical(expected, actual) - if (isElement_1(obj1) || isElement_1(obj2)) { - return false; - } - - var isDate1 = isDate_1(obj1); - var isDate2 = isDate_1(obj2); - if (isDate1 || isDate2) { - if ( - !isDate1 || - !isDate2 || - getTime.call(obj1) !== getTime.call(obj2) - ) { - return false; - } - } - - if (obj1 instanceof RegExp && obj2 instanceof RegExp) { - if (obj1.toString() !== obj2.toString()) { - return false; - } - } - - if (obj1 instanceof Error && obj2 instanceof Error) { - if ( - obj1.constructor !== obj2.constructor || - obj1.message !== obj2.message || - obj1.stack !== obj2.stack - ) { - return false; - } - } - - var class1 = getClass_1(obj1); - var class2 = getClass_1(obj2); - var keys1 = keys(obj1); - var keys2 = keys(obj2); - var name1 = getClassName_1(obj1); - var name2 = getClassName_1(obj2); - - if (isArguments_1(obj1) || isArguments_1(obj2)) { - if (obj1.length !== obj2.length) { - return false; - } - } else { - if ( - type1 !== type2 || - class1 !== class2 || - keys1.length !== keys2.length || - (name1 && name2 && name1 !== name2) - ) { - return false; - } - } - - if (isSet_1(obj1) || isSet_1(obj2)) { - if (!isSet_1(obj1) || !isSet_1(obj2) || obj1.size !== obj2.size) { - return false; - } - - return isSubset_1(obj1, obj2, deepEqual); - } - - return every$1.call(keys1, function(key) { - if (!hasOwnProperty$2.call(obj2, key)) { - return false; - } - - var value1 = obj1[key]; - var value2 = obj2[key]; - var isObject1 = isObject_1(value1); - var isObject2 = isObject_1(value2); - // determines, if the objects were already visited - // (it's faster to check for isObject first, than to - // get -1 from getIndex for non objects) - var index1 = isObject1 ? indexOf.call(objects1, value1) : -1; - var index2 = isObject2 ? indexOf.call(objects2, value2) : -1; - // determines the new paths of the objects - // - for non cyclic objects the current path will be extended - // by current property name - // - for cyclic objects the stored path is taken - var newPath1 = - index1 !== -1 - ? paths1[index1] - : path1 + "[" + JSON.stringify(key) + "]"; - var newPath2 = - index2 !== -1 - ? paths2[index2] - : path2 + "[" + JSON.stringify(key) + "]"; - var combinedPath = newPath1 + newPath2; - - // stop recursion if current objects are already compared - if (compared[combinedPath]) { - return true; - } - - // remember the current objects and their paths - if (index1 === -1 && isObject1) { - objects1.push(value1); - paths1.push(newPath1); - } - if (index2 === -1 && isObject2) { - objects2.push(value2); - paths2.push(newPath2); - } - - // remember that the current objects are already compared - if (isObject1 && isObject2) { - compared[combinedPath] = true; - } - - // End of cyclic logic - - // neither value1 nor value2 is a cycle - // continue with next level - return deepEqual(value1, value2, newPath1, newPath2); - }); - })(first, second, "$1", "$2"); - } - - var deepEqual$1 = deepEqualCyclic; - - function arrayContains(array, subset, compare) { - if (subset.length === 0) { - return true; - } - var i, l, j, k; - for (i = 0, l = array.length; i < l; ++i) { - if (compare(array[i], subset[0])) { - for (j = 0, k = subset.length; j < k; ++j) { - if (i + j >= l) { - return false; - } - if (!compare(array[i + j], subset[j])) { - return false; - } - } - return true; - } - } - return false; - } - - /** - * @name samsam.match - * @param Object object - * @param Object matcher - * - * Compare arbitrary value ``object`` with matcher. - */ - function match(object, matcher) { - if (matcher && typeof matcher.test === "function") { - return matcher.test(object); - } - - if (typeof matcher === "function") { - return matcher(object) === true; - } - - if (typeof matcher === "string") { - matcher = matcher.toLowerCase(); - var notNull = typeof object === "string" || !!object; - return ( - notNull && - String(object) - .toLowerCase() - .indexOf(matcher) >= 0 - ); - } - - if (typeof matcher === "number") { - return matcher === object; - } - - if (typeof matcher === "boolean") { - return matcher === object; - } - - if (typeof matcher === "undefined") { - return typeof object === "undefined"; - } - - if (matcher === null) { - return object === null; - } - - if (isSet_1(object)) { - return isSubset_1(matcher, object, match); - } - - if (getClass_1(object) === "Array" && getClass_1(matcher) === "Array") { - return arrayContains(object, matcher, match); - } - - if (isDate_1(matcher)) { - return isDate_1(object) && object.getTime() === matcher.getTime(); - } - - if (matcher && typeof matcher === "object") { - if (matcher === object) { - return true; - } - var prop; - // eslint-disable-next-line guard-for-in - for (prop in matcher) { - var value = object[prop]; - if ( - typeof value === "undefined" && - typeof object.getAttribute === "function" - ) { - value = object.getAttribute(prop); - } - if ( - matcher[prop] === null || - typeof matcher[prop] === "undefined" - ) { - if (value !== matcher[prop]) { - return false; - } - } else if ( - typeof value === "undefined" || - !match(value, matcher[prop]) - ) { - return false; - } - } - return true; - } - - throw new Error( - "Matcher was not a string, a number, a " + - "function, a boolean or an object" - ); - } - - var match_1 = match; - - var samsam = { - isArguments: isArguments_1, - isElement: isElement_1, - isNegZero: isNegZero_1, - identical: identical_1, - deepEqual: deepEqual$1, - match: match_1 - }; - - var deepEqual_1 = createCommonjsModule$1(function (module) { - - var arrayProto = lib.prototypes.array; - var toString = lib.prototypes.object.toString; - - - var every = arrayProto.every; - var join = arrayProto.join; - var sort = arrayProto.sort; - - function isReallyNaN(val) { - // eslint-disable-next-line no-self-compare - return val !== val; - } - - var deepEqual = (module.exports = function deepEqual(a, b, matcher) { - if (a === null && b === null) { - return true; - } - - if (typeof a !== "object" || typeof b !== "object") { - return (isReallyNaN(a) && isReallyNaN(b)) || a === b; - } - - if (a instanceof Error && b instanceof Error) { - return a === b; - } - - if (toString(a) !== toString(b)) { - return false; - } - - if (join(sort(Object.keys(a))) !== join(sort(Object.keys(b)))) { - return false; - } - - if (samsam.deepEqual(a, b)) { - return true; - } - - if (matcher) { - var keys = Object.keys(a); - var allKeysMatch = every(keys, function(key) { - return matcher(a[key], b[key]); - }); - - return keys.length > 0 && allKeysMatch; - } - - return false; - }); - - deepEqual.use = function(match) { - return function deepEqual$matcher(a, b) { - // If both are matchers they must be the same instance in order to be considered equal - // If we didn't do that we would end up running one matcher against the other - if (match.isMatcher(a)) { - if (match.isMatcher(b)) { - return a === b; - } - return a.test(b); - } - - return deepEqual(a, b, deepEqual$matcher); - }; - }; - }); - - // This is an `every` implementation that works for all iterables - var every$2 = function every(obj, fn) { - var pass = true; - - try { - /* eslint-disable-next-line local-rules/no-prototype-methods */ - obj.forEach(function() { - if (!fn.apply(this, arguments)) { - // Throwing an error is the only way to break `forEach` - throw new Error(); - } - }); - } catch (e) { - pass = false; - } - - return pass; - }; - - /** - * lodash (Custom Build) - * Build: `lodash modularize exports="npm" -o ./` - * Copyright jQuery Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ - - /** Used as the `TypeError` message for "Functions" methods. */ - var FUNC_ERROR_TEXT = 'Expected a function'; - - /** Used to stand-in for `undefined` hash values. */ - var HASH_UNDEFINED = '__lodash_hash_undefined__'; - - /** Used as references for various `Number` constants. */ - var INFINITY = 1 / 0; - - /** `Object#toString` result references. */ - var funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - symbolTag = '[object Symbol]'; - - /** Used to match property names within property paths. */ - var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, - reIsPlainProp = /^\w*$/, - reLeadingDot = /^\./, - rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; - - /** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ - var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; - - /** Used to match backslashes in property paths. */ - var reEscapeChar = /\\(\\)?/g; - - /** Used to detect host constructors (Safari). */ - var reIsHostCtor = /^\[object .+?Constructor\]$/; - - /** Detect free variable `global` from Node.js. */ - var freeGlobal = typeof commonjsGlobal$1 == 'object' && commonjsGlobal$1 && commonjsGlobal$1.Object === Object && commonjsGlobal$1; - - /** Detect free variable `self`. */ - var freeSelf = typeof self == 'object' && self && self.Object === Object && self; - - /** Used as a reference to the global object. */ - var root$1 = freeGlobal || freeSelf || Function('return this')(); - - /** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ - function getValue(object, key) { - return object == null ? undefined : object[key]; - } - - /** - * Checks if `value` is a host object in IE < 9. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a host object, else `false`. - */ - function isHostObject(value) { - // Many host objects are `Object` objects that can coerce to strings - // despite having improperly defined `toString` methods. - var result = false; - if (value != null && typeof value.toString != 'function') { - try { - result = !!(value + ''); - } catch (e) {} - } - return result; - } - - /** Used for built-in method references. */ - var arrayProto$2 = Array.prototype, - funcProto = Function.prototype, - objectProto = Object.prototype; - - /** Used to detect overreaching core-js shims. */ - var coreJsData = root$1['__core-js_shared__']; - - /** Used to detect methods masquerading as native. */ - var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; - }()); - - /** Used to resolve the decompiled source of functions. */ - var funcToString = funcProto.toString; - - /** Used to check objects for own properties. */ - var hasOwnProperty$3 = objectProto.hasOwnProperty; - - /** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ - var objectToString = objectProto.toString; - - /** Used to detect if a method is native. */ - var reIsNative = RegExp('^' + - funcToString.call(hasOwnProperty$3).replace(reRegExpChar, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' - ); - - /** Built-in value references. */ - var Symbol$1 = root$1.Symbol, - splice = arrayProto$2.splice; - - /* Built-in method references that are verified to be native. */ - var Map$1 = getNative(root$1, 'Map'), - nativeCreate = getNative(Object, 'create'); - - /** Used to convert symbols to primitives and strings. */ - var symbolProto = Symbol$1 ? Symbol$1.prototype : undefined, - symbolToString = symbolProto ? symbolProto.toString : undefined; - - /** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function Hash(entries) { - var index = -1, - length = entries ? entries.length : 0; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ - function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; - } - - /** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @param {Object} hash The hash to modify. - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function hashDelete(key) { - return this.has(key) && delete this.__data__[key]; - } - - /** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function hashGet(key) { - var data = this.__data__; - if (nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; - } - return hasOwnProperty$3.call(data, key) ? data[key] : undefined; - } - - /** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function hashHas(key) { - var data = this.__data__; - return nativeCreate ? data[key] !== undefined : hasOwnProperty$3.call(data, key); - } - - /** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. - */ - function hashSet(key, value) { - var data = this.__data__; - data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; - return this; - } - - // Add methods to `Hash`. - Hash.prototype.clear = hashClear; - Hash.prototype['delete'] = hashDelete; - Hash.prototype.get = hashGet; - Hash.prototype.has = hashHas; - Hash.prototype.set = hashSet; - - /** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function ListCache(entries) { - var index = -1, - length = entries ? entries.length : 0; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ - function listCacheClear() { - this.__data__ = []; - } - - /** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function listCacheDelete(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); - } - return true; - } - - /** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function listCacheGet(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - return index < 0 ? undefined : data[index][1]; - } - - /** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; - } - - /** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ - function listCacheSet(key, value) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - data.push([key, value]); - } else { - data[index][1] = value; - } - return this; - } - - // Add methods to `ListCache`. - ListCache.prototype.clear = listCacheClear; - ListCache.prototype['delete'] = listCacheDelete; - ListCache.prototype.get = listCacheGet; - ListCache.prototype.has = listCacheHas; - ListCache.prototype.set = listCacheSet; - - /** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ - function MapCache(entries) { - var index = -1, - length = entries ? entries.length : 0; - - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } - } - - /** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ - function mapCacheClear() { - this.__data__ = { - 'hash': new Hash, - 'map': new (Map$1 || ListCache), - 'string': new Hash - }; - } - - /** - * Removes `key` and its value from the map. - * - * @private - * @name delete - * @memberOf MapCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ - function mapCacheDelete(key) { - return getMapData(this, key)['delete'](key); - } - - /** - * Gets the map value for `key`. - * - * @private - * @name get - * @memberOf MapCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ - function mapCacheGet(key) { - return getMapData(this, key).get(key); - } - - /** - * Checks if a map value for `key` exists. - * - * @private - * @name has - * @memberOf MapCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ - function mapCacheHas(key) { - return getMapData(this, key).has(key); - } - - /** - * Sets the map `key` to `value`. - * - * @private - * @name set - * @memberOf MapCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the map cache instance. - */ - function mapCacheSet(key, value) { - getMapData(this, key).set(key, value); - return this; - } - - // Add methods to `MapCache`. - MapCache.prototype.clear = mapCacheClear; - MapCache.prototype['delete'] = mapCacheDelete; - MapCache.prototype.get = mapCacheGet; - MapCache.prototype.has = mapCacheHas; - MapCache.prototype.set = mapCacheSet; - - /** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ - function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; - } - } - return -1; - } - - /** - * The base implementation of `_.get` without support for default values. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @returns {*} Returns the resolved value. - */ - function baseGet(object, path) { - path = isKey(path, object) ? [path] : castPath(path); - - var index = 0, - length = path.length; - - while (object != null && index < length) { - object = object[toKey(path[index++])]; - } - return (index && index == length) ? object : undefined; - } - - /** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ - function baseIsNative(value) { - if (!isObject$1(value) || isMasked(value)) { - return false; - } - var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); - } - - /** - * The base implementation of `_.toString` which doesn't convert nullish - * values to empty strings. - * - * @private - * @param {*} value The value to process. - * @returns {string} Returns the string. - */ - function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - if (isSymbol(value)) { - return symbolToString ? symbolToString.call(value) : ''; - } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; - } - - /** - * Casts `value` to a path array if it's not one. - * - * @private - * @param {*} value The value to inspect. - * @returns {Array} Returns the cast property path array. - */ - function castPath(value) { - return isArray(value) ? value : stringToPath(value); - } - - /** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ - function getMapData(map, key) { - var data = map.__data__; - return isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; - } - - /** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ - function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined; - } - - /** - * Checks if `value` is a property name and not a property path. - * - * @private - * @param {*} value The value to check. - * @param {Object} [object] The object to query keys on. - * @returns {boolean} Returns `true` if `value` is a property name, else `false`. - */ - function isKey(value, object) { - if (isArray(value)) { - return false; - } - var type = typeof value; - if (type == 'number' || type == 'symbol' || type == 'boolean' || - value == null || isSymbol(value)) { - return true; - } - return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || - (object != null && value in Object(object)); - } - - /** - * Checks if `value` is suitable for use as unique object key. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is suitable, else `false`. - */ - function isKeyable(value) { - var type = typeof value; - return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') - ? (value !== '__proto__') - : (value === null); - } - - /** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ - function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); - } - - /** - * Converts `string` to a property path array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the property path array. - */ - var stringToPath = memoize(function(string) { - string = toString$1(string); - - var result = []; - if (reLeadingDot.test(string)) { - result.push(''); - } - string.replace(rePropName, function(match, number, quote, string) { - result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); - }); - return result; - }); - - /** - * Converts `value` to a string key if it's not a string or symbol. - * - * @private - * @param {*} value The value to inspect. - * @returns {string|symbol} Returns the key. - */ - function toKey(value) { - if (typeof value == 'string' || isSymbol(value)) { - return value; - } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; - } - - /** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to process. - * @returns {string} Returns the source code. - */ - function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} - } - return ''; - } - - /** - * Creates a function that memoizes the result of `func`. If `resolver` is - * provided, it determines the cache key for storing the result based on the - * arguments provided to the memoized function. By default, the first argument - * provided to the memoized function is used as the map cache key. The `func` - * is invoked with the `this` binding of the memoized function. - * - * **Note:** The cache is exposed as the `cache` property on the memoized - * function. Its creation may be customized by replacing the `_.memoize.Cache` - * constructor with one whose instances implement the - * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) - * method interface of `delete`, `get`, `has`, and `set`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to have its output memoized. - * @param {Function} [resolver] The function to resolve the cache key. - * @returns {Function} Returns the new memoized function. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * var other = { 'c': 3, 'd': 4 }; - * - * var values = _.memoize(_.values); - * values(object); - * // => [1, 2] - * - * values(other); - * // => [3, 4] - * - * object.a = 2; - * values(object); - * // => [1, 2] - * - * // Modify the result cache. - * values.cache.set(object, ['a', 'b']); - * values(object); - * // => ['a', 'b'] - * - * // Replace `_.memoize.Cache`. - * _.memoize.Cache = WeakMap; - */ - function memoize(func, resolver) { - if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { - throw new TypeError(FUNC_ERROR_TEXT); - } - var memoized = function() { - var args = arguments, - key = resolver ? resolver.apply(this, args) : args[0], - cache = memoized.cache; - - if (cache.has(key)) { - return cache.get(key); - } - var result = func.apply(this, args); - memoized.cache = cache.set(key, result); - return result; - }; - memoized.cache = new (memoize.Cache || MapCache); - return memoized; - } - - // Assign cache to `_.memoize`. - memoize.Cache = MapCache; - - /** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true - */ - function eq(value, other) { - return value === other || (value !== value && other !== other); - } - - /** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false - * - * _.isArray(_.noop); - * // => false - */ - var isArray = Array.isArray; - - /** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ - function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 8-9 which returns 'object' for typed array and other constructors. - var tag = isObject$1(value) ? objectToString.call(value) : ''; - return tag == funcTag || tag == genTag; - } - - /** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ - function isObject$1(value) { - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); - } - - /** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ - function isObjectLike(value) { - return !!value && typeof value == 'object'; - } - - /** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ - function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && objectToString.call(value) == symbolTag); - } - - /** - * Converts `value` to a string. An empty string is returned for `null` - * and `undefined` values. The sign of `-0` is preserved. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {string} Returns the string. - * @example - * - * _.toString(null); - * // => '' - * - * _.toString(-0); - * // => '-0' - * - * _.toString([1, 2, 3]); - * // => '1,2,3' - */ - function toString$1(value) { - return value == null ? '' : baseToString(value); - } - - /** - * Gets the value at `path` of `object`. If the resolved value is - * `undefined`, the `defaultValue` is returned in its place. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.get(object, 'a[0].b.c'); - * // => 3 - * - * _.get(object, ['a', '0', 'b', 'c']); - * // => 3 - * - * _.get(object, 'a.b.c', 'default'); - * // => 'default' - */ - function get(object, path, defaultValue) { - var result = object == null ? undefined : baseGet(object, path); - return result === undefined ? defaultValue : result; - } - - var lodash_get = get; - - var typeOf$1 = function typeOf(value) { - return typeDetect$1(value).toLowerCase(); - }; - - var slice$2 = lib.prototypes.string.slice; - - - var iterableToString = function iterableToString(obj) { - var representation = ""; - - function stringify(item) { - return typeof item === "string" ? "'" + item + "'" : String(item); - } - - function mapToString(map) { - /* eslint-disable-next-line local-rules/no-prototype-methods */ - map.forEach(function(value, key) { - representation += "[" + stringify(key) + "," + stringify(value) + "],"; - }); - - representation = slice$2(representation, 0, -1); - return representation; - } - - function genericIterableToString(iterable) { - /* eslint-disable-next-line local-rules/no-prototype-methods */ - iterable.forEach(function(value) { - representation += stringify(value) + ","; - }); - - representation = slice$2(representation, 0, -1); - return representation; - } - - if (typeOf$1(obj) === "map") { - return mapToString(obj); - } - - return genericIterableToString(obj); - }; - - var arrayProto$3 = lib.prototypes.array; - var deepEqual$1$1 = deepEqual_1.use(match$1); // eslint-disable-line no-use-before-define - - var functionName$2 = lib.functionName; - - - var objectProto$1 = lib.prototypes.object; - var stringProto = lib.prototypes.string; - - var valueToString$2 = lib.valueToString; - - var arrayIndexOf = arrayProto$3.indexOf; - var arrayEvery = arrayProto$3.every; - var join$2 = arrayProto$3.join; - var map = arrayProto$3.map; - var some = arrayProto$3.some; - - var hasOwnProperty$4 = objectProto$1.hasOwnProperty; - var isPrototypeOf = objectProto$1.isPrototypeOf; - - var stringIndexOf = stringProto.indexOf; - - function assertType(value, type, name) { - var actual = typeOf$1(value); - if (actual !== type) { - throw new TypeError("Expected type of " + name + " to be " + type + ", but was " + actual); - } - } - - function assertMethodExists(value, method, name, methodPath) { - if (typeof value[method] === "undefined") { - throw new TypeError("Expected " + name + " to have method " + methodPath); - } - } - - var matcher = { - toString: function() { - return this.message; - } - }; - - function isMatcher(object) { - return isPrototypeOf(matcher, object); - } - - function matchObject(expectation, actual) { - if (actual === null || actual === undefined) { - return false; - } - - return arrayEvery(Object.keys(expectation), function(key) { - var exp = expectation[key]; - var act = actual[key]; - - if (isMatcher(exp)) { - if (!exp.test(act)) { - return false; - } - } else if (typeOf$1(exp) === "object") { - if (!matchObject(exp, act)) { - return false; - } - } else if (!deepEqual$1$1(exp, act)) { - return false; - } - - return true; - }); - } - - var TYPE_MAP = { - function: function(m, expectation, message) { - m.test = expectation; - m.message = message || "match(" + functionName$2(expectation) + ")"; - }, - number: function(m, expectation) { - m.test = function(actual) { - // we need type coercion here - return expectation == actual; // eslint-disable-line eqeqeq - }; - }, - object: function(m, expectation) { - var array = []; - - if (typeof expectation.test === "function") { - m.test = function(actual) { - return expectation.test(actual) === true; - }; - m.message = "match(" + functionName$2(expectation.test) + ")"; - return m; - } - - array = map(Object.keys(expectation), function(key) { - return key + ": " + valueToString$2(expectation[key]); - }); - - m.test = function(actual) { - return matchObject(expectation, actual); - }; - m.message = "match(" + join$2(array, ", ") + ")"; - - return m; - }, - regexp: function(m, expectation) { - m.test = function(actual) { - return typeof actual === "string" && expectation.test(actual); - }; - }, - string: function(m, expectation) { - m.test = function(actual) { - return typeof actual === "string" && stringIndexOf(actual, expectation) !== -1; - }; - m.message = 'match("' + expectation + '")'; - } - }; - - function match$1(expectation, message) { - var m = Object.create(matcher); - var type = typeOf$1(expectation); - - if (type in TYPE_MAP) { - TYPE_MAP[type](m, expectation, message); - } else { - m.test = function(actual) { - return deepEqual$1$1(expectation, actual); - }; - } - - if (!m.message) { - m.message = "match(" + valueToString$2(expectation) + ")"; - } - - return m; - } - - matcher.or = function(m2) { - var matcher2 = m2; - if (!arguments.length) { - throw new TypeError("Matcher expected"); - } else if (!isMatcher(m2)) { - matcher2 = match$1(m2); - } - var m1 = this; - var or = Object.create(matcher); - or.test = function(actual) { - return m1.test(actual) || matcher2.test(actual); - }; - or.message = m1.message + ".or(" + matcher2.message + ")"; - return or; - }; - - matcher.and = function(m2) { - var matcher2 = m2; - if (!arguments.length) { - throw new TypeError("Matcher expected"); - } else if (!isMatcher(m2)) { - matcher2 = match$1(m2); - } - var m1 = this; - var and = Object.create(matcher); - and.test = function(actual) { - return m1.test(actual) && matcher2.test(actual); - }; - and.message = m1.message + ".and(" + matcher2.message + ")"; - return and; - }; - - match$1.isMatcher = isMatcher; - - match$1.any = match$1(function() { - return true; - }, "any"); - - match$1.defined = match$1(function(actual) { - return actual !== null && actual !== undefined; - }, "defined"); - - match$1.truthy = match$1(function(actual) { - return Boolean(actual); - }, "truthy"); - - match$1.falsy = match$1(function(actual) { - return !actual; - }, "falsy"); - - match$1.same = function(expectation) { - return match$1(function(actual) { - return expectation === actual; - }, "same(" + valueToString$2(expectation) + ")"); - }; - - match$1.in = function(arrayOfExpectations) { - if (!Array.isArray(arrayOfExpectations)) { - throw new TypeError("array expected"); - } - - return match$1(function(actual) { - return some(arrayOfExpectations, function(expectation) { - return expectation === actual; - }); - }, "in(" + valueToString$2(arrayOfExpectations) + ")"); - }; - - match$1.typeOf = function(type) { - assertType(type, "string", "type"); - return match$1(function(actual) { - return typeOf$1(actual) === type; - }, 'typeOf("' + type + '")'); - }; - - match$1.instanceOf = function(type) { - if (typeof Symbol === "undefined" || typeof Symbol.hasInstance === "undefined") { - assertType(type, "function", "type"); - } else { - assertMethodExists(type, Symbol.hasInstance, "type", "[Symbol.hasInstance]"); - } - return match$1(function(actual) { - return actual instanceof type; - }, "instanceOf(" + (functionName$2(type) || Object.prototype.toString.call(type)) + ")"); - }; - - function createPropertyMatcher(propertyTest, messagePrefix) { - return function(property, value) { - assertType(property, "string", "property"); - var onlyProperty = arguments.length === 1; - var message = messagePrefix + '("' + property + '"'; - if (!onlyProperty) { - message += ", " + valueToString$2(value); - } - message += ")"; - return match$1(function(actual) { - if (actual === undefined || actual === null || !propertyTest(actual, property)) { - return false; - } - return onlyProperty || deepEqual$1$1(value, actual[property]); - }, message); - }; - } - - match$1.has = createPropertyMatcher(function(actual, property) { - if (typeof actual === "object") { - return property in actual; - } - return actual[property] !== undefined; - }, "has"); - - match$1.hasOwn = createPropertyMatcher(function(actual, property) { - return hasOwnProperty$4(actual, property); - }, "hasOwn"); - - match$1.hasNested = function(property, value) { - assertType(property, "string", "property"); - var onlyProperty = arguments.length === 1; - var message = 'hasNested("' + property + '"'; - if (!onlyProperty) { - message += ", " + valueToString$2(value); - } - message += ")"; - return match$1(function(actual) { - if (actual === undefined || actual === null || lodash_get(actual, property) === undefined) { - return false; - } - return onlyProperty || deepEqual$1$1(value, lodash_get(actual, property)); - }, message); - }; - - match$1.every = function(predicate) { - if (!isMatcher(predicate)) { - throw new TypeError("Matcher expected"); - } - - return match$1(function(actual) { - if (typeOf$1(actual) === "object") { - return every$2(Object.keys(actual), function(key) { - return predicate.test(actual[key]); - }); - } - - return ( - Boolean(actual) && - typeOf$1(actual.forEach) === "function" && - every$2(actual, function(element) { - return predicate.test(element); - }) - ); - }, "every(" + predicate.message + ")"); - }; - - match$1.some = function(predicate) { - if (!isMatcher(predicate)) { - throw new TypeError("Matcher expected"); - } - - return match$1(function(actual) { - if (typeOf$1(actual) === "object") { - return !every$2(Object.keys(actual), function(key) { - return !predicate.test(actual[key]); - }); - } - - return ( - Boolean(actual) && - typeOf$1(actual.forEach) === "function" && - !every$2(actual, function(element) { - return !predicate.test(element); - }) - ); - }, "some(" + predicate.message + ")"); - }; - - match$1.array = match$1.typeOf("array"); - - match$1.array.deepEquals = function(expectation) { - return match$1(function(actual) { - // Comparing lengths is the fastest way to spot a difference before iterating through every item - var sameLength = actual.length === expectation.length; - return ( - typeOf$1(actual) === "array" && - sameLength && - every$2(actual, function(element, index) { - return expectation[index] === element; - }) - ); - }, "deepEquals([" + iterableToString(expectation) + "])"); - }; - - match$1.array.startsWith = function(expectation) { - return match$1(function(actual) { - return ( - typeOf$1(actual) === "array" && - every$2(expectation, function(expectedElement, index) { - return actual[index] === expectedElement; - }) - ); - }, "startsWith([" + iterableToString(expectation) + "])"); - }; - - match$1.array.endsWith = function(expectation) { - return match$1(function(actual) { - // This indicates the index in which we should start matching - var offset = actual.length - expectation.length; - - return ( - typeOf$1(actual) === "array" && - every$2(expectation, function(expectedElement, index) { - return actual[offset + index] === expectedElement; - }) - ); - }, "endsWith([" + iterableToString(expectation) + "])"); - }; - - match$1.array.contains = function(expectation) { - return match$1(function(actual) { - return ( - typeOf$1(actual) === "array" && - every$2(expectation, function(expectedElement) { - return arrayIndexOf(actual, expectedElement) !== -1; - }) - ); - }, "contains([" + iterableToString(expectation) + "])"); - }; - - match$1.map = match$1.typeOf("map"); - - match$1.map.deepEquals = function mapDeepEquals(expectation) { - return match$1(function(actual) { - // Comparing lengths is the fastest way to spot a difference before iterating through every item - var sameLength = actual.size === expectation.size; - return ( - typeOf$1(actual) === "map" && - sameLength && - every$2(actual, function(element, key) { - return expectation.has(key) && expectation.get(key) === element; - }) - ); - }, "deepEquals(Map[" + iterableToString(expectation) + "])"); - }; - - match$1.map.contains = function mapContains(expectation) { - return match$1(function(actual) { - return ( - typeOf$1(actual) === "map" && - every$2(expectation, function(element, key) { - return actual.has(key) && actual.get(key) === element; - }) - ); - }, "contains(Map[" + iterableToString(expectation) + "])"); - }; - - match$1.set = match$1.typeOf("set"); - - match$1.set.deepEquals = function setDeepEquals(expectation) { - return match$1(function(actual) { - // Comparing lengths is the fastest way to spot a difference before iterating through every item - var sameLength = actual.size === expectation.size; - return ( - typeOf$1(actual) === "set" && - sameLength && - every$2(actual, function(element) { - return expectation.has(element); - }) - ); - }, "deepEquals(Set[" + iterableToString(expectation) + "])"); - }; - - match$1.set.contains = function setContains(expectation) { - return match$1(function(actual) { - return ( - typeOf$1(actual) === "set" && - every$2(expectation, function(element) { - return actual.has(element); - }) - ); - }, "contains(Set[" + iterableToString(expectation) + "])"); - }; - - match$1.bool = match$1.typeOf("boolean"); - match$1.number = match$1.typeOf("number"); - match$1.string = match$1.typeOf("string"); - match$1.object = match$1.typeOf("object"); - match$1.func = match$1.typeOf("function"); - match$1.regexp = match$1.typeOf("regexp"); - match$1.date = match$1.typeOf("date"); - match$1.symbol = match$1.typeOf("symbol"); - - var match_1$1 = match$1; - - var every$3 = Array.prototype.every; - - var calledInOrder = function calledInOrder(spies) { - var callMap = {}; - // eslint-disable-next-line no-underscore-dangle - var _spies = arguments.length > 1 ? arguments : spies; - - function hasCallsLeft(spy) { - if (callMap[spy.id] === undefined) { - callMap[spy.id] = 0; - } - - return callMap[spy.id] < spy.callCount; - } - - return every$3.call(_spies, function checkAdjacentCalls(spy, i) { - var calledBeforeNext = true; - - if (i !== _spies.length - 1) { - calledBeforeNext = spy.calledBefore(_spies[i + 1]); - } - - if (hasCallsLeft(spy) && calledBeforeNext) { - callMap[spy.id] += 1; - return true; - } - - return false; - }); - }; - - var sort = lib.prototypes.array.sort; - - var orderByFirstCall = function orderByFirstCall(spies) { - return sort(spies, function(a, b) { - // uuid, won't ever be equal - var aCall = a.getCall(0); - var bCall = b.getCall(0); - var aId = (aCall && aCall.callId) || -1; - var bId = (bCall && bCall.callId) || -1; - - return aId < bId ? -1 : 1; - }); - }; - - var array$1 = [null, "once", "twice", "thrice"]; - - var timesInWords = function timesInWords(count) { - return array$1[count] || (count || 0) + " times"; - }; - - var o$1 = Object.prototype; - - function getClass$1(value) { - // Returns the internal [[Class]] by calling Object.prototype.toString - // with the provided value as this. Return value is a string, naming the - // internal class, e.g. "Array" - return o$1.toString.call(value).split(/[ \]]/)[1]; - } - - var getClass_1$1 = getClass$1; - - function isNaN$2$1(value) { - // Unlike global isNaN, this avoids type coercion - // typeof check avoids IE host object issues, hat tip to - // lodash - var val = value; // JsLint thinks value !== value is "weird" - return typeof value === "number" && value !== val; - } - - var isNan$1 = isNaN$2$1; - - /** - * @name samsam.isNegZero - * @param Object value - * - * Returns ``true`` if ``value`` is ``-0``. - */ - function isNegZero$1(value) { - return value === 0 && 1 / value === -Infinity; - } - - var isNegZero_1$1 = isNegZero$1; - - /** - * @name samsam.equal - * @param Object obj1 - * @param Object obj2 - * - * Returns ``true`` if two objects are strictly equal. Compared to - * ``===`` there are two exceptions: - * - * - NaN is considered equal to NaN - * - -0 and +0 are not considered equal - */ - function identical$1(obj1, obj2) { - if (obj1 === obj2 || (isNan$1(obj1) && isNan$1(obj2))) { - return obj1 !== 0 || isNegZero_1$1(obj1) === isNegZero_1$1(obj2); - } - - return false; - } - - var identical_1$1 = identical$1; - - /** - * @name samsam.isArguments - * @param Object object - * - * Returns ``true`` if ``object`` is an ``arguments`` object, - * ``false`` otherwise. - */ - function isArguments$1(object) { - if (getClass_1$1(object) === "Arguments") { - return true; - } - if ( - typeof object !== "object" || - typeof object.length !== "number" || - getClass_1$1(object) === "Array" - ) { - return false; - } - if (typeof object.callee === "function") { - return true; - } - try { - object[object.length] = 6; - delete object[object.length]; - } catch (e) { - return true; - } - return false; - } - - var isArguments_1$1 = isArguments$1; - - function isDate$1(value) { - return value instanceof Date; - } - - var isDate_1$1 = isDate$1; - - var div$1 = typeof document !== "undefined" && document.createElement("div"); - - /** - * @name samsam.isElement - * @param Object object - * - * Returns ``true`` if ``object`` is a DOM element node. Unlike - * Underscore.js/lodash, this function will return ``false`` if ``object`` - * is an *element-like* object, i.e. a regular object with a ``nodeType`` - * property that holds the value ``1``. - */ - function isElement$1(object) { - if (!object || object.nodeType !== 1 || !div$1) { - return false; - } - try { - object.appendChild(div$1); - object.removeChild(div$1); - } catch (e) { - return false; - } - return true; - } - - var isElement_1$1 = isElement$1; - - // Returns true when the value is a regular Object and not a specialized Object - // - // This helps speeding up deepEqual cyclic checks - // The premise is that only Objects are stored in the visited array. - // So if this function returns false, we don't have to do the - // expensive operation of searching for the value in the the array of already - // visited objects - function isObject$2(value) { - return ( - typeof value === "object" && - value !== null && - // none of these are collection objects, so we can return false - !(value instanceof Boolean) && - !(value instanceof Date) && - !(value instanceof Error) && - !(value instanceof Number) && - !(value instanceof RegExp) && - !(value instanceof String) - ); - } - - var isObject_1$1 = isObject$2; - - function isSet$1(val) { - return (typeof Set !== "undefined" && val instanceof Set) || false; - } - - var isSet_1$1 = isSet$1; - - // Production steps of ECMA-262, Edition 6, 22.1.2.1 - // Reference: http://www.ecma-international.org/ecma-262/6.0/#sec-array.from - var polyfill = (function() { - var isCallable = function(fn) { - return typeof fn === 'function'; - }; - var toInteger = function (value) { - var number = Number(value); - if (isNaN(number)) { return 0; } - if (number === 0 || !isFinite(number)) { return number; } - return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); - }; - var maxSafeInteger = Math.pow(2, 53) - 1; - var toLength = function (value) { - var len = toInteger(value); - return Math.min(Math.max(len, 0), maxSafeInteger); - }; - var iteratorProp = function(value) { - if(value != null) { - if(['string','number','boolean','symbol'].indexOf(typeof value) > -1){ - return Symbol.iterator; - } else if ( - (typeof Symbol !== 'undefined') && - ('iterator' in Symbol) && - (Symbol.iterator in value) - ) { - return Symbol.iterator; - } - // Support "@@iterator" placeholder, Gecko 27 to Gecko 35 - else if ('@@iterator' in value) { - return '@@iterator'; - } - } - }; - var getMethod = function(O, P) { - // Assert: IsPropertyKey(P) is true. - if (O != null && P != null) { - // Let func be GetV(O, P). - var func = O[P]; - // ReturnIfAbrupt(func). - // If func is either undefined or null, return undefined. - if(func == null) { - return void 0; - } - // If IsCallable(func) is false, throw a TypeError exception. - if (!isCallable(func)) { - throw new TypeError(func + ' is not a function'); - } - return func; - } - }; - var iteratorStep = function(iterator) { - // Let result be IteratorNext(iterator). - // ReturnIfAbrupt(result). - var result = iterator.next(); - // Let done be IteratorComplete(result). - // ReturnIfAbrupt(done). - var done = Boolean(result.done); - // If done is true, return false. - if(done) { - return false; - } - // Return result. - return result; - }; - - // The length property of the from method is 1. - return function from(items /*, mapFn, thisArg */ ) { - - // 1. Let C be the this value. - var C = this; - - // 2. If mapfn is undefined, let mapping be false. - var mapFn = arguments.length > 1 ? arguments[1] : void 0; - - var T; - if (typeof mapFn !== 'undefined') { - // 3. else - // a. If IsCallable(mapfn) is false, throw a TypeError exception. - if (!isCallable(mapFn)) { - throw new TypeError( - 'Array.from: when provided, the second argument must be a function' - ); - } - - // b. If thisArg was supplied, let T be thisArg; else let T - // be undefined. - if (arguments.length > 2) { - T = arguments[2]; - } - // c. Let mapping be true (implied by mapFn) - } - - var A, k; - - // 4. Let usingIterator be GetMethod(items, @@iterator). - // 5. ReturnIfAbrupt(usingIterator). - var usingIterator = getMethod(items, iteratorProp(items)); - - // 6. If usingIterator is not undefined, then - if (usingIterator !== void 0) { - // a. If IsConstructor(C) is true, then - // i. Let A be the result of calling the [[Construct]] - // internal method of C with an empty argument list. - // b. Else, - // i. Let A be the result of the abstract operation ArrayCreate - // with argument 0. - // c. ReturnIfAbrupt(A). - A = isCallable(C) ? Object(new C()) : []; - - // d. Let iterator be GetIterator(items, usingIterator). - var iterator = usingIterator.call(items); - - // e. ReturnIfAbrupt(iterator). - if (iterator == null) { - throw new TypeError( - 'Array.from requires an array-like or iterable object' - ); - } - - // f. Let k be 0. - k = 0; - - // g. Repeat - var next, nextValue; - while (true) { - // i. Let Pk be ToString(k). - // ii. Let next be IteratorStep(iterator). - // iii. ReturnIfAbrupt(next). - next = iteratorStep(iterator); - - // iv. If next is false, then - if (!next) { - - // 1. Let setStatus be Set(A, "length", k, true). - // 2. ReturnIfAbrupt(setStatus). - A.length = k; - - // 3. Return A. - return A; - } - // v. Let nextValue be IteratorValue(next). - // vi. ReturnIfAbrupt(nextValue) - nextValue = next.value; - - // vii. If mapping is true, then - // 1. Let mappedValue be Call(mapfn, T, «nextValue, k»). - // 2. If mappedValue is an abrupt completion, return - // IteratorClose(iterator, mappedValue). - // 3. Let mappedValue be mappedValue.[[value]]. - // viii. Else, let mappedValue be nextValue. - // ix. Let defineStatus be the result of - // CreateDataPropertyOrThrow(A, Pk, mappedValue). - // x. [TODO] If defineStatus is an abrupt completion, return - // IteratorClose(iterator, defineStatus). - if (mapFn) { - A[k] = mapFn.call(T, nextValue, k); - } - else { - A[k] = nextValue; - } - // xi. Increase k by 1. - k++; - } - // 7. Assert: items is not an Iterable so assume it is - // an array-like object. - } else { - - // 8. Let arrayLike be ToObject(items). - var arrayLike = Object(items); - - // 9. ReturnIfAbrupt(items). - if (items == null) { - throw new TypeError( - 'Array.from requires an array-like object - not null or undefined' - ); - } - - // 10. Let len be ToLength(Get(arrayLike, "length")). - // 11. ReturnIfAbrupt(len). - var len = toLength(arrayLike.length); - - // 12. If IsConstructor(C) is true, then - // a. Let A be Construct(C, «len»). - // 13. Else - // a. Let A be ArrayCreate(len). - // 14. ReturnIfAbrupt(A). - A = isCallable(C) ? Object(new C(len)) : new Array(len); - - // 15. Let k be 0. - k = 0; - // 16. Repeat, while k < len… (also steps a - h) - var kValue; - while (k < len) { - kValue = arrayLike[k]; - if (mapFn) { - A[k] = mapFn.call(T, kValue, k); - } - else { - A[k] = kValue; - } - k++; - } - // 17. Let setStatus be Set(A, "length", len, true). - // 18. ReturnIfAbrupt(setStatus). - A.length = len; - // 19. Return A. - } - return A; - }; - })(); - - var arrayFrom = (typeof Array.from === 'function' ? - Array.from : - polyfill - ); - - function isSubset$1(s1, s2, compare) { - // FIXME: IE11 doesn't support Array.from - // Potential solutions: - // - contribute a patch to https://github.com/Volox/eslint-plugin-ie11#readme - // - https://github.com/mathiasbynens/Array.from (doesn't work with matchers) - var values1 = arrayFrom(s1); - var values2 = arrayFrom(s2); - - for (var i = 0; i < values1.length; i++) { - var includes = false; - - for (var j = 0; j < values2.length; j++) { - if (compare(values2[j], values1[i])) { - includes = true; - break; - } - } - - if (!includes) { - return false; - } - } - - return true; - } - - var isSubset_1$1 = isSubset$1; - - function getClassName$1(value) { - return Object.getPrototypeOf(value) ? value.constructor.name : null; - } - - var getClassName_1$1 = getClassName$1; - - var every$4 = Array.prototype.every; - var getTime$1 = Date.prototype.getTime; - var hasOwnProperty$5 = Object.prototype.hasOwnProperty; - var indexOf$1 = Array.prototype.indexOf; - var keys$1 = Object.keys; - - /** - * @name samsam.deepEqual - * @param Object first - * @param Object second - * - * Deep equal comparison. Two values are "deep equal" if: - * - * - They are equal, according to samsam.identical - * - They are both date objects representing the same time - * - They are both arrays containing elements that are all deepEqual - * - They are objects with the same set of properties, and each property - * in ``first`` is deepEqual to the corresponding property in ``second`` - * - * Supports cyclic objects. - */ - function deepEqualCyclic$1(first, second) { - // used for cyclic comparison - // contain already visited objects - var objects1 = []; - var objects2 = []; - // contain pathes (position in the object structure) - // of the already visited objects - // indexes same as in objects arrays - var paths1 = []; - var paths2 = []; - // contains combinations of already compared objects - // in the manner: { "$1['ref']$2['ref']": true } - var compared = {}; - - // does the recursion for the deep equal check - return (function deepEqual(obj1, obj2, path1, path2) { - var type1 = typeof obj1; - var type2 = typeof obj2; - - // == null also matches undefined - if ( - obj1 === obj2 || - isNan$1(obj1) || - isNan$1(obj2) || - obj1 == null || - obj2 == null || - type1 !== "object" || - type2 !== "object" - ) { - return identical_1$1(obj1, obj2); - } - - // Elements are only equal if identical(expected, actual) - if (isElement_1$1(obj1) || isElement_1$1(obj2)) { - return false; - } - - var isDate1 = isDate_1$1(obj1); - var isDate2 = isDate_1$1(obj2); - if (isDate1 || isDate2) { - if ( - !isDate1 || - !isDate2 || - getTime$1.call(obj1) !== getTime$1.call(obj2) - ) { - return false; - } - } - - if (obj1 instanceof RegExp && obj2 instanceof RegExp) { - if (obj1.toString() !== obj2.toString()) { - return false; - } - } - - if (obj1 instanceof Error && obj2 instanceof Error) { - if (obj1.stack !== obj2.stack) { - return false; - } - } - - var class1 = getClass_1$1(obj1); - var class2 = getClass_1$1(obj2); - var keys1 = keys$1(obj1); - var keys2 = keys$1(obj2); - var name1 = getClassName_1$1(obj1); - var name2 = getClassName_1$1(obj2); - - if (isArguments_1$1(obj1) || isArguments_1$1(obj2)) { - if (obj1.length !== obj2.length) { - return false; - } - } else { - if ( - type1 !== type2 || - class1 !== class2 || - keys1.length !== keys2.length || - (name1 && name2 && name1 !== name2) - ) { - return false; - } - } - - if (isSet_1$1(obj1) || isSet_1$1(obj2)) { - if (!isSet_1$1(obj1) || !isSet_1$1(obj2) || obj1.size !== obj2.size) { - return false; - } - - return isSubset_1$1(obj1, obj2, deepEqual); - } - - return every$4.call(keys1, function(key) { - if (!hasOwnProperty$5.call(obj2, key)) { - return false; - } - - var value1 = obj1[key]; - var value2 = obj2[key]; - var isObject1 = isObject_1$1(value1); - var isObject2 = isObject_1$1(value2); - // determines, if the objects were already visited - // (it's faster to check for isObject first, than to - // get -1 from getIndex for non objects) - var index1 = isObject1 ? indexOf$1.call(objects1, value1) : -1; - var index2 = isObject2 ? indexOf$1.call(objects2, value2) : -1; - // determines the new paths of the objects - // - for non cyclic objects the current path will be extended - // by current property name - // - for cyclic objects the stored path is taken - var newPath1 = - index1 !== -1 - ? paths1[index1] - : path1 + "[" + JSON.stringify(key) + "]"; - var newPath2 = - index2 !== -1 - ? paths2[index2] - : path2 + "[" + JSON.stringify(key) + "]"; - var combinedPath = newPath1 + newPath2; - - // stop recursion if current objects are already compared - if (compared[combinedPath]) { - return true; - } - - // remember the current objects and their paths - if (index1 === -1 && isObject1) { - objects1.push(value1); - paths1.push(newPath1); - } - if (index2 === -1 && isObject2) { - objects2.push(value2); - paths2.push(newPath2); - } - - // remember that the current objects are already compared - if (isObject1 && isObject2) { - compared[combinedPath] = true; - } - - // End of cyclic logic - - // neither value1 nor value2 is a cycle - // continue with next level - return deepEqual(value1, value2, newPath1, newPath2); - }); - })(first, second, "$1", "$2"); - } - - var deepEqual$2 = deepEqualCyclic$1; - - function arrayContains$1(array, subset, compare) { - if (subset.length === 0) { - return true; - } - var i, l, j, k; - for (i = 0, l = array.length; i < l; ++i) { - if (compare(array[i], subset[0])) { - for (j = 0, k = subset.length; j < k; ++j) { - if (i + j >= l) { - return false; - } - if (!compare(array[i + j], subset[j])) { - return false; - } - } - return true; - } - } - return false; - } - - /** - * @name samsam.match - * @param Object object - * @param Object matcher - * - * Compare arbitrary value ``object`` with matcher. - */ - function match$2(object, matcher) { - if (matcher && typeof matcher.test === "function") { - return matcher.test(object); - } - - if (typeof matcher === "function") { - return matcher(object) === true; - } - - if (typeof matcher === "string") { - matcher = matcher.toLowerCase(); - var notNull = typeof object === "string" || !!object; - return ( - notNull && - String(object) - .toLowerCase() - .indexOf(matcher) >= 0 - ); - } - - if (typeof matcher === "number") { - return matcher === object; - } - - if (typeof matcher === "boolean") { - return matcher === object; - } - - if (typeof matcher === "undefined") { - return typeof object === "undefined"; - } - - if (matcher === null) { - return object === null; - } - - if (isSet_1$1(object)) { - return isSubset_1$1(matcher, object, match$2); - } - - if (getClass_1$1(object) === "Array" && getClass_1$1(matcher) === "Array") { - return arrayContains$1(object, matcher, match$2); - } - - if (isDate_1$1(matcher)) { - return isDate_1$1(object) && object.getTime() === matcher.getTime(); - } - - if (matcher && typeof matcher === "object") { - if (matcher === object) { - return true; - } - var prop; - // eslint-disable-next-line guard-for-in - for (prop in matcher) { - var value = object[prop]; - if ( - typeof value === "undefined" && - typeof object.getAttribute === "function" - ) { - value = object.getAttribute(prop); - } - if ( - matcher[prop] === null || - typeof matcher[prop] === "undefined" - ) { - if (value !== matcher[prop]) { - return false; - } - } else if ( - typeof value === "undefined" || - !match$2(value, matcher[prop]) - ) { - return false; - } - } - return true; - } - - throw new Error( - "Matcher was not a string, a number, a " + - "function, a boolean or an object" - ); - } - - var match_1$2 = match$2; - - var samsam$1 = { - isArguments: isArguments_1$1, - isElement: isElement_1$1, - isNegZero: isNegZero_1$1, - identical: identical_1$1, - deepEqual: deepEqual$2, - match: match_1$2 - }; - - var formatio = { - excludeConstructors: ["Object", /^.$/], - quoteStrings: true, - limitChildrenCount: 0 - }; - - var specialObjects = []; - if (typeof commonjsGlobal$1 !== "undefined") { - specialObjects.push({ object: commonjsGlobal$1, value: "[object global]" }); - } - if (typeof document !== "undefined") { - specialObjects.push({ - object: document, - value: "[object HTMLDocument]" - }); - } - if (typeof window !== "undefined") { - specialObjects.push({ object: window, value: "[object Window]" }); - } - - function functionName$3(func) { - if (!func) { return ""; } - if (func.displayName) { return func.displayName; } - if (func.name) { return func.name; } - var matches = func.toString().match(/function\s+([^\(]+)/m); - return (matches && matches[1]) || ""; - } - - function constructorName(f, object) { - var name = functionName$3(object && object.constructor); - var excludes = f.excludeConstructors || - formatio.excludeConstructors || []; - - var i, l; - for (i = 0, l = excludes.length; i < l; ++i) { - if (typeof excludes[i] === "string" && excludes[i] === name) { - return ""; - } else if (excludes[i].test && excludes[i].test(name)) { - return ""; - } - } - - return name; - } - - function isCircular(object, objects) { - if (typeof object !== "object") { return false; } - var i, l; - for (i = 0, l = objects.length; i < l; ++i) { - if (objects[i] === object) { return true; } - } - return false; - } - - function ascii(f, object, processed, indent) { - if (typeof object === "string") { - if (object.length === 0) { return "(empty string)"; } - var qs = f.quoteStrings; - var quote = typeof qs !== "boolean" || qs; - return processed || quote ? "\"" + object + "\"" : object; - } - - if (typeof object === "function" && !(object instanceof RegExp)) { - return ascii.func(object); - } - - processed = processed || []; - - if (isCircular(object, processed)) { return "[Circular]"; } - - if (Object.prototype.toString.call(object) === "[object Array]") { - return ascii.array.call(f, object, processed); - } - - if (!object) { return String((1 / object) === -Infinity ? "-0" : object); } - if (samsam$1.isElement(object)) { return ascii.element(object); } - - if (typeof object.toString === "function" && - object.toString !== Object.prototype.toString) { - return object.toString(); - } - - var i, l; - for (i = 0, l = specialObjects.length; i < l; i++) { - if (object === specialObjects[i].object) { - return specialObjects[i].value; - } - } - - if (typeof Set !== "undefined" && object instanceof Set) { - return ascii.set.call(f, object, processed); - } - - return ascii.object.call(f, object, processed, indent); - } - - ascii.func = function (func) { - return "function " + functionName$3(func) + "() {}"; - }; - - function delimit(str, delimiters) { - delimiters = delimiters || ["[", "]"]; - return delimiters[0] + str + delimiters[1]; - } - - ascii.array = function (array, processed, delimiters) { - processed = processed || []; - processed.push(array); - var pieces = []; - var i, l; - l = (this.limitChildrenCount > 0) ? - Math.min(this.limitChildrenCount, array.length) : array.length; - - for (i = 0; i < l; ++i) { - pieces.push(ascii(this, array[i], processed)); - } - - if (l < array.length) { - pieces.push("[... " + (array.length - l) + " more elements]"); - } - - return delimit(pieces.join(", "), delimiters); - }; - - ascii.set = function (set, processed) { - return ascii.array.call(this, Array.from(set), processed, ["Set {", "}"]); - }; - - ascii.object = function (object, processed, indent) { - processed = processed || []; - processed.push(object); - indent = indent || 0; - var pieces = []; - var properties = Object.keys(object).sort(); - var length = 3; - var prop, str, obj, i, k, l; - l = (this.limitChildrenCount > 0) ? - Math.min(this.limitChildrenCount, properties.length) : properties.length; - - for (i = 0; i < l; ++i) { - prop = properties[i]; - obj = object[prop]; - - if (isCircular(obj, processed)) { - str = "[Circular]"; - } else { - str = ascii(this, obj, processed, indent + 2); - } - - str = (/\s/.test(prop) ? "\"" + prop + "\"" : prop) + ": " + str; - length += str.length; - pieces.push(str); - } - - var cons = constructorName(this, object); - var prefix = cons ? "[" + cons + "] " : ""; - var is = ""; - for (i = 0, k = indent; i < k; ++i) { is += " "; } - - if (l < properties.length) - {pieces.push("[... " + (properties.length - l) + " more elements]");} - - if (length + indent > 80) { - return prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" + - is + "}"; - } - return prefix + "{ " + pieces.join(", ") + " }"; - }; - - ascii.element = function (element) { - var tagName = element.tagName.toLowerCase(); - var attrs = element.attributes; - var pairs = []; - var attr, attrName, i, l, val; - - for (i = 0, l = attrs.length; i < l; ++i) { - attr = attrs.item(i); - attrName = attr.nodeName.toLowerCase().replace("html:", ""); - val = attr.nodeValue; - if (attrName !== "contenteditable" || val !== "inherit") { - if (val) { pairs.push(attrName + "=\"" + val + "\""); } - } - } - - var formatted = "<" + tagName + (pairs.length > 0 ? " " : ""); - // SVG elements have undefined innerHTML - var content = element.innerHTML || ""; - - if (content.length > 20) { - content = content.substr(0, 20) + "[...]"; - } - - var res = formatted + pairs.join(" ") + ">" + content + - ""; - - return res.replace(/ contentEditable="inherit"/, ""); - }; - - function Formatio(options) { - // eslint-disable-next-line guard-for-in - for (var opt in options) { - this[opt] = options[opt]; - } - } - - Formatio.prototype = { - functionName: functionName$3, - - configure: function (options) { - return new Formatio(options); - }, - - constructorName: function (object) { - return constructorName(this, object); - }, - - ascii: function (object, processed, indent) { - return ascii(this, object, processed, indent); - } - }; - - var formatio_1 = Formatio.prototype; - - var formatter = formatio_1.configure({ - quoteStrings: false, - limitChildrenCount: 250 - }); - - var customFormatter; - - function format() { - if (customFormatter) { - return customFormatter.apply(null, arguments); - } - - return formatter.ascii.apply(formatter, arguments); - } - - format.setFormatter = function(aCustomFormatter) { - if (typeof aCustomFormatter !== "function") { - throw new Error("format.setFormatter must be called with a function"); - } - - customFormatter = aCustomFormatter; - }; - - var format_1 = format; - - var arrayProto$4 = lib.prototypes.array; - - - - - - var stringSlice = lib.prototypes.string.slice; - - var arraySlice = arrayProto$4.slice; - var concat$1 = arrayProto$4.concat; - var forEach$2 = arrayProto$4.forEach; - var join$3 = arrayProto$4.join; - var splice$1 = arrayProto$4.splice; - - var assert$1; - - function verifyIsStub() { - var args = arraySlice(arguments); - - forEach$2(args, function(method) { - if (!method) { - assert$1.fail("fake is not a spy"); - } - - if (method.proxy && method.proxy.isSinonProxy) { - verifyIsStub(method.proxy); - } else { - if (typeof method !== "function") { - assert$1.fail(method + " is not a function"); - } - - if (typeof method.getCall !== "function") { - assert$1.fail(method + " is not stubbed"); - } - } - }); - } - - function verifyIsValidAssertion(assertionMethod, assertionArgs) { - switch (assertionMethod) { - case "notCalled": - case "called": - case "calledOnce": - case "calledTwice": - case "calledThrice": - if (assertionArgs.length !== 0) { - assert$1.fail( - assertionMethod + - " takes 1 argument but was called with " + - (assertionArgs.length + 1) + - " arguments" - ); - } - break; - default: - break; - } - } - - function failAssertion(object, msg) { - var obj = object || commonjsGlobal$1; - var failMethod = obj.fail || assert$1.fail; - failMethod.call(obj, msg); - } - - function mirrorPropAsAssertion(name, method, message) { - var msg = message; - var meth = method; - if (arguments.length === 2) { - msg = method; - meth = name; - } - - assert$1[name] = function(fake) { - verifyIsStub(fake); - - var args = arraySlice(arguments, 1); - var failed = false; - - verifyIsValidAssertion(name, args); - - if (typeof meth === "function") { - failed = !meth(fake); - } else { - failed = typeof fake[meth] === "function" ? !fake[meth].apply(fake, args) : !fake[meth]; - } - - if (failed) { - failAssertion(this, (fake.printf || fake.proxy.printf).apply(fake, concat$1([msg], args))); - } else { - assert$1.pass(name); - } - }; - } - - function exposedName(prefix, prop) { - return !prefix || /^fail/.test(prop) ? prop : prefix + stringSlice(prop, 0, 1).toUpperCase() + stringSlice(prop, 1); - } - - assert$1 = { - failException: "AssertError", - - fail: function fail(message) { - var error = new Error(message); - error.name = this.failException || assert$1.failException; - - throw error; - }, - - pass: function pass() { - return; - }, - - callOrder: function assertCallOrder() { - verifyIsStub.apply(null, arguments); - var expected = ""; - var actual = ""; - - if (!calledInOrder(arguments)) { - try { - expected = join$3(arguments, ", "); - var calls = arraySlice(arguments); - var i = calls.length; - while (i) { - if (!calls[--i].called) { - splice$1(calls, i, 1); - } - } - actual = join$3(orderByFirstCall(calls), ", "); - } catch (e) { - // If this fails, we'll just fall back to the blank string - } - - failAssertion(this, "expected " + expected + " to be called in order but were called as " + actual); - } else { - assert$1.pass("callOrder"); - } - }, - - callCount: function assertCallCount(method, count) { - verifyIsStub(method); - - if (method.callCount !== count) { - var msg = "expected %n to be called " + timesInWords(count) + " but was called %c%C"; - failAssertion(this, method.printf(msg)); - } else { - assert$1.pass("callCount"); - } - }, - - expose: function expose(target, options) { - if (!target) { - throw new TypeError("target is null or undefined"); - } - - var o = options || {}; - var prefix = (typeof o.prefix === "undefined" && "assert") || o.prefix; - var includeFail = typeof o.includeFail === "undefined" || Boolean(o.includeFail); - var instance = this; - - forEach$2(Object.keys(instance), function(method) { - if (method !== "expose" && (includeFail || !/^(fail)/.test(method))) { - target[exposedName(prefix, method)] = instance[method]; - } - }); - - return target; - }, - - match: function match(actual, expectation) { - var matcher = match_1$1(expectation); - if (matcher.test(actual)) { - assert$1.pass("match"); - } else { - var formatted = [ - "expected value to match", - " expected = " + format_1(expectation), - " actual = " + format_1(actual) - ]; - - failAssertion(this, join$3(formatted, "\n")); - } - } - }; - - mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called"); - mirrorPropAsAssertion( - "notCalled", - function(spy) { - return !spy.called; - }, - "expected %n to not have been called but was called %c%C" - ); - mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C"); - mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C"); - mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C"); - mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t"); - mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t"); - mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new"); - mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new"); - mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %D"); - mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %D"); - mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %D"); - mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %D"); - mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %D"); - mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %D"); - mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C"); - mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C"); - mirrorPropAsAssertion("threw", "%n did not throw exception%C"); - mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C"); - - var assert_1 = assert$1; - - var lolex = createCommonjsModule$1(function (module, exports) { - (function(f){{module.exports=f();}})(function(){return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof commonjsRequire$1&&commonjsRequire$1;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t);}return n[i].exports}for(var u="function"==typeof commonjsRequire$1&&commonjsRequire$1,i=0;i -1; - var maxTimeout = Math.pow(2, 31) - 1; //see https://heycam.github.io/webidl/#abstract-opdef-converttoint - - // Make properties writable in IE, as per - // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html - if (isRunningInIE) { - _global.setTimeout = _global.setTimeout; - _global.clearTimeout = _global.clearTimeout; - _global.setInterval = _global.setInterval; - _global.clearInterval = _global.clearInterval; - _global.Date = _global.Date; - } - - // setImmediate is not a standard function - // avoid adding the prop to the window object if not present - if (_global.setImmediate !== undefined) { - _global.setImmediate = _global.setImmediate; - _global.clearImmediate = _global.clearImmediate; - } - - // node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref() - // browsers, a number. - // see https://github.com/cjohansen/Sinon.JS/pull/436 - - var NOOP = function () { return undefined; }; - var timeoutResult = _global.setTimeout(NOOP, 0); - var addTimerReturnsObject = typeof timeoutResult === "object"; - var hrtimePresent = (_global.process && typeof _global.process.hrtime === "function"); - var nextTickPresent = (_global.process && typeof _global.process.nextTick === "function"); - var performancePresent = (_global.performance && typeof _global.performance.now === "function"); - var hasPerformancePrototype = (_global.Performance && (typeof _global.Performance).match(/^(function|object)$/)); - var requestAnimationFramePresent = ( - _global.requestAnimationFrame && typeof _global.requestAnimationFrame === "function" - ); - var cancelAnimationFramePresent = ( - _global.cancelAnimationFrame && typeof _global.cancelAnimationFrame === "function" - ); - - _global.clearTimeout(timeoutResult); - - var NativeDate = _global.Date; - var uniqueTimerId = 1; - - function isNumberFinite(num) { - if (Number.isFinite) { - return Number.isFinite(num); - } - - if (typeof num !== "number") { - return false; - } - - return isFinite(num); - } - - /** - * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into - * number of milliseconds. This is used to support human-readable strings passed - * to clock.tick() - */ - function parseTime(str) { - if (!str) { - return 0; - } - - var strings = str.split(":"); - var l = strings.length; - var i = l; - var ms = 0; - var parsed; - - if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { - throw new Error("tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits"); - } - - while (i--) { - parsed = parseInt(strings[i], 10); - - if (parsed >= 60) { - throw new Error("Invalid time " + str); - } - - ms += parsed * Math.pow(60, (l - i - 1)); - } - - return ms * 1000; - } - - /** - * Get the decimal part of the millisecond value as nanoseconds - * - * @param {Number} msFloat the number of milliseconds - * @returns {Number} an integer number of nanoseconds in the range [0,1e6) - * - * Example: nanoRemainer(123.456789) -> 456789 - */ - function nanoRemainder(msFloat) { - var modulo = 1e6; - var remainder = (msFloat * 1e6) % modulo; - var positiveRemainder = remainder < 0 ? remainder + modulo : remainder; - - return Math.floor(positiveRemainder); - } - - /** - * Used to grok the `now` parameter to createClock. - * @param epoch {Date|number} the system time - */ - function getEpoch(epoch) { - if (!epoch) { return 0; } - if (typeof epoch.getTime === "function") { return epoch.getTime(); } - if (typeof epoch === "number") { return epoch; } - throw new TypeError("now should be milliseconds since UNIX epoch"); - } - - function inRange(from, to, timer) { - return timer && timer.callAt >= from && timer.callAt <= to; - } - - function mirrorDateProperties(target, source) { - var prop; - for (prop in source) { - if (source.hasOwnProperty(prop)) { - target[prop] = source[prop]; - } - } - - // set special now implementation - if (source.now) { - target.now = function now() { - return target.clock.now; - }; - } else { - delete target.now; - } - - // set special toSource implementation - if (source.toSource) { - target.toSource = function toSource() { - return source.toSource(); - }; - } else { - delete target.toSource; - } - - // set special toString implementation - target.toString = function toString() { - return source.toString(); - }; - - target.prototype = source.prototype; - target.parse = source.parse; - target.UTC = source.UTC; - target.prototype.toUTCString = source.prototype.toUTCString; - - return target; - } - - function createDate() { - function ClockDate(year, month, date, hour, minute, second, ms) { - // Defensive and verbose to avoid potential harm in passing - // explicit undefined when user does not pass argument - switch (arguments.length) { - case 0: - return new NativeDate(ClockDate.clock.now); - case 1: - return new NativeDate(year); - case 2: - return new NativeDate(year, month); - case 3: - return new NativeDate(year, month, date); - case 4: - return new NativeDate(year, month, date, hour); - case 5: - return new NativeDate(year, month, date, hour, minute); - case 6: - return new NativeDate(year, month, date, hour, minute, second); - default: - return new NativeDate(year, month, date, hour, minute, second, ms); - } - } - - return mirrorDateProperties(ClockDate, NativeDate); - } - - - function enqueueJob(clock, job) { - // enqueues a microtick-deferred task - ecma262/#sec-enqueuejob - if (!clock.jobs) { - clock.jobs = []; - } - clock.jobs.push(job); - } - - function runJobs(clock) { - // runs all microtick-deferred tasks - ecma262/#sec-runjobs - if (!clock.jobs) { - return; - } - for (var i = 0; i < clock.jobs.length; i++) { - var job = clock.jobs[i]; - job.func.apply(null, job.args); - if (clock.loopLimit && i > clock.loopLimit) { - throw new Error("Aborting after running " + clock.loopLimit + " timers, assuming an infinite loop!"); - } - } - clock.jobs = []; - } - - function addTimer(clock, timer) { - if (timer.func === undefined) { - throw new Error("Callback must be provided to timer calls"); - } - - timer.type = timer.immediate ? "Immediate" : "Timeout"; - - if (timer.hasOwnProperty("delay")) { - if (!isNumberFinite(timer.delay)) { - timer.delay = 0; - } - timer.delay = timer.delay > maxTimeout ? 1 : timer.delay; - timer.delay = Math.max(0, timer.delay); - } - - if (timer.hasOwnProperty("interval")) { - timer.type = "Interval"; - timer.interval = timer.interval > maxTimeout ? 1 : timer.interval; - } - - if (timer.hasOwnProperty("animation")) { - timer.type = "AnimationFrame"; - timer.animation = true; - } - - if (!clock.timers) { - clock.timers = {}; - } - - timer.id = uniqueTimerId++; - timer.createdAt = clock.now; - timer.callAt = clock.now + (parseInt(timer.delay) || (clock.duringTick ? 1 : 0)); - - clock.timers[timer.id] = timer; - - if (addTimerReturnsObject) { - var res = { - id: timer.id, - ref: function () { return res; }, - unref: function () { return res; }, - refresh: function () { return res; } - }; - return res; - } - - return timer.id; - } - - /* eslint consistent-return: "off" */ - function compareTimers(a, b) { - // Sort first by absolute timing - if (a.callAt < b.callAt) { - return -1; - } - if (a.callAt > b.callAt) { - return 1; - } - - // Sort next by immediate, immediate timers take precedence - if (a.immediate && !b.immediate) { - return -1; - } - if (!a.immediate && b.immediate) { - return 1; - } - - // Sort next by creation time, earlier-created timers take precedence - if (a.createdAt < b.createdAt) { - return -1; - } - if (a.createdAt > b.createdAt) { - return 1; - } - - // Sort next by id, lower-id timers take precedence - if (a.id < b.id) { - return -1; - } - if (a.id > b.id) { - return 1; - } - - // As timer ids are unique, no fallback `0` is necessary - } - - function firstTimerInRange(clock, from, to) { - var timers = clock.timers; - var timer = null; - var id, isInRange; - - for (id in timers) { - if (timers.hasOwnProperty(id)) { - isInRange = inRange(from, to, timers[id]); - - if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) { - timer = timers[id]; - } - } - } - - return timer; - } - - function firstTimer(clock) { - var timers = clock.timers; - var timer = null; - var id; - - for (id in timers) { - if (timers.hasOwnProperty(id)) { - if (!timer || compareTimers(timer, timers[id]) === 1) { - timer = timers[id]; - } - } - } - - return timer; - } - - function lastTimer(clock) { - var timers = clock.timers; - var timer = null; - var id; - - for (id in timers) { - if (timers.hasOwnProperty(id)) { - if (!timer || compareTimers(timer, timers[id]) === -1) { - timer = timers[id]; - } - } - } - - return timer; - } - - function callTimer(clock, timer) { - if (typeof timer.interval === "number") { - clock.timers[timer.id].callAt += timer.interval; - } else { - delete clock.timers[timer.id]; - } - - if (typeof timer.func === "function") { - timer.func.apply(null, timer.args); - } else { - /* eslint no-eval: "off" */ - eval(timer.func); - } - } - - function clearTimer(clock, timerId, ttype) { - if (!timerId) { - // null appears to be allowed in most browsers, and appears to be - // relied upon by some libraries, like Bootstrap carousel - return; - } - - if (!clock.timers) { - clock.timers = {}; - } - - // in Node, timerId is an object with .ref()/.unref(), and - // its .id field is the actual timer id. - if (typeof timerId === "object") { - timerId = timerId.id; - } - - if (clock.timers.hasOwnProperty(timerId)) { - // check that the ID matches a timer of the correct type - var timer = clock.timers[timerId]; - if (timer.type === ttype) { - delete clock.timers[timerId]; - } else { - var clear = ttype === "AnimationFrame" ? "cancelAnimationFrame" : "clear" + ttype; - var schedule = timer.type === "AnimationFrame" ? "requestAnimationFrame" : "set" + timer.type; - throw new Error("Cannot clear timer: timer created with " + schedule - + "() but cleared with " + clear + "()"); - } - } - } - - function uninstall(clock, target, config) { - var method, - i, - l; - var installedHrTime = "_hrtime"; - var installedNextTick = "_nextTick"; - - for (i = 0, l = clock.methods.length; i < l; i++) { - method = clock.methods[i]; - if (method === "hrtime" && target.process) { - target.process.hrtime = clock[installedHrTime]; - } else if (method === "nextTick" && target.process) { - target.process.nextTick = clock[installedNextTick]; - } else if (method === "performance") { - target[method] = clock["_" + method]; - } else { - if (target[method] && target[method].hadOwnProperty) { - target[method] = clock["_" + method]; - if (method === "clearInterval" && config.shouldAdvanceTime === true) { - target[method](clock.attachedInterval); - } - } else { - try { - delete target[method]; - } catch (ignore) { /* eslint empty-block: "off" */ } - } - } - } - - // Prevent multiple executions which will completely remove these props - clock.methods = []; - - // return pending timers, to enable checking what timers remained on uninstall - if (!clock.timers) { - return []; - } - return Object.keys(clock.timers).map(function mapper(key) { - return clock.timers[key]; - }); - } - - function hijackMethod(target, method, clock) { - var prop; - clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method); - clock["_" + method] = target[method]; - - if (method === "Date") { - var date = mirrorDateProperties(clock[method], target[method]); - target[method] = date; - } else if (method === "performance") { - target[method] = clock[method]; - } else { - target[method] = function () { - return clock[method].apply(clock, arguments); - }; - - for (prop in clock[method]) { - if (clock[method].hasOwnProperty(prop)) { - target[method][prop] = clock[method][prop]; - } - } - } - - target[method].clock = clock; - } - - function doIntervalTick(clock, advanceTimeDelta) { - clock.tick(advanceTimeDelta); - } - - var timers = { - setTimeout: _global.setTimeout, - clearTimeout: _global.clearTimeout, - setImmediate: _global.setImmediate, - clearImmediate: _global.clearImmediate, - setInterval: _global.setInterval, - clearInterval: _global.clearInterval, - Date: _global.Date - }; - - if (hrtimePresent) { - timers.hrtime = _global.process.hrtime; - } - - if (nextTickPresent) { - timers.nextTick = _global.process.nextTick; - } - - if (performancePresent) { - timers.performance = _global.performance; - } - - if (requestAnimationFramePresent) { - timers.requestAnimationFrame = _global.requestAnimationFrame; - } - - if (cancelAnimationFramePresent) { - timers.cancelAnimationFrame = _global.cancelAnimationFrame; - } - - var keys = Object.keys || function (obj) { - var ks = []; - var key; - - for (key in obj) { - if (obj.hasOwnProperty(key)) { - ks.push(key); - } - } - - return ks; - }; - - /** - * @param start {Date|number} the system time - non-integer values are floored - * @param loopLimit {number} maximum number of timers that will be run when calling runAll() - */ - function createClock(start, loopLimit) { - start = Math.floor(getEpoch(start)); - loopLimit = loopLimit || 1000; - var nanos = 0; - var adjustedSystemTime = [0, 0]; // [millis, nanoremainder] - - if (NativeDate === undefined) { - throw new Error("The global scope doesn't have a `Date` object" - + " (see https://github.com/sinonjs/sinon/issues/1852#issuecomment-419622780)"); - } - - var clock = { - now: start, - timeouts: {}, - Date: createDate(), - loopLimit: loopLimit - }; - - clock.Date.clock = clock; - - function getTimeToNextFrame() { - return 16 - ((clock.now - start) % 16); - } - - function hrtime(prev) { - var millisSinceStart = clock.now - adjustedSystemTime[0] - start; - var secsSinceStart = Math.floor( millisSinceStart / 1000); - var remainderInNanos = (millisSinceStart - secsSinceStart * 1e3 ) * 1e6 + nanos - adjustedSystemTime[1]; - - if (Array.isArray(prev)) { - if ( prev[1] > 1e9 ) { - throw new TypeError("Number of nanoseconds can't exceed a billion"); - } - - var oldSecs = prev[0]; - var nanoDiff = remainderInNanos - prev[1]; - var secDiff = secsSinceStart - oldSecs; - - if (nanoDiff < 0) { - nanoDiff += 1e9; - secDiff -= 1; - } - - return [secDiff, nanoDiff]; - } - return [secsSinceStart, remainderInNanos]; - } - - clock.setTimeout = function setTimeout(func, timeout) { - return addTimer(clock, { - func: func, - args: Array.prototype.slice.call(arguments, 2), - delay: timeout - }); - }; - - clock.clearTimeout = function clearTimeout(timerId) { - return clearTimer(clock, timerId, "Timeout"); - }; - clock.nextTick = function nextTick(func) { - return enqueueJob(clock, { - func: func, - args: Array.prototype.slice.call(arguments, 1) - }); - }; - clock.setInterval = function setInterval(func, timeout) { - timeout = parseInt(timeout, 10); - return addTimer(clock, { - func: func, - args: Array.prototype.slice.call(arguments, 2), - delay: timeout, - interval: timeout - }); - }; - - clock.clearInterval = function clearInterval(timerId) { - return clearTimer(clock, timerId, "Interval"); - }; - - clock.setImmediate = function setImmediate(func) { - return addTimer(clock, { - func: func, - args: Array.prototype.slice.call(arguments, 1), - immediate: true - }); - }; - - clock.clearImmediate = function clearImmediate(timerId) { - return clearTimer(clock, timerId, "Immediate"); - }; - - clock.countTimers = function countTimers() { - return Object.keys(clock.timers || {}).length; - }; - - clock.requestAnimationFrame = function requestAnimationFrame(func) { - var result = addTimer(clock, { - func: func, - delay: getTimeToNextFrame(), - args: [clock.now + getTimeToNextFrame()], - animation: true - }); - - return result.id || result; - }; - - clock.cancelAnimationFrame = function cancelAnimationFrame(timerId) { - return clearTimer(clock, timerId, "AnimationFrame"); - }; - - clock.runMicrotasks = function runMicrotasks() { - runJobs(clock); - }; - - /** - * @param {tickValue} {String|Number} number of milliseconds or a human-readable value like "01:11:15" - */ - clock.tick = function tick(tickValue) { - var msFloat = typeof tickValue === "number" ? tickValue : parseTime(tickValue); - var ms = Math.floor(msFloat); - var remainder = nanoRemainder(msFloat); - var nanosTotal = nanos + remainder; - var tickTo = clock.now + ms; - - if (msFloat < 0) { - throw new TypeError("Negative ticks are not supported"); - } - - // adjust for positive overflow - if (nanosTotal >= 1e6) { - tickTo += 1; - nanosTotal -= 1e6; - } - - nanos = nanosTotal; - var tickFrom = clock.now; - var previous = clock.now; - var timer, firstException, oldNow; - - clock.duringTick = true; - - // perform process.nextTick()s - oldNow = clock.now; - runJobs(clock); - if (oldNow !== clock.now) { - // compensate for any setSystemTime() call during process.nextTick() callback - tickFrom += clock.now - oldNow; - tickTo += clock.now - oldNow; - } - - // perform each timer in the requested range - timer = firstTimerInRange(clock, tickFrom, tickTo); - while (timer && tickFrom <= tickTo) { - if (clock.timers[timer.id]) { - tickFrom = timer.callAt; - clock.now = timer.callAt; - oldNow = clock.now; - try { - runJobs(clock); - callTimer(clock, timer); - } catch (e) { - firstException = firstException || e; - } - - // compensate for any setSystemTime() call during timer callback - if (oldNow !== clock.now) { - tickFrom += clock.now - oldNow; - tickTo += clock.now - oldNow; - previous += clock.now - oldNow; - } - } - - timer = firstTimerInRange(clock, previous, tickTo); - previous = tickFrom; - } - - // perform process.nextTick()s again - oldNow = clock.now; - runJobs(clock); - if (oldNow !== clock.now) { - // compensate for any setSystemTime() call during process.nextTick() callback - tickFrom += clock.now - oldNow; - tickTo += clock.now - oldNow; - } - clock.duringTick = false; - - // corner case: during runJobs, new timers were scheduled which could be in the range [clock.now, tickTo] - timer = firstTimerInRange(clock, tickFrom, tickTo); - if (timer) { - try { - clock.tick(tickTo - clock.now); // do it all again - for the remainder of the requested range - } catch (e) { - firstException = firstException || e; - } - } else { - // no timers remaining in the requested range: move the clock all the way to the end - clock.now = tickTo; - - // update nanos - nanos = nanosTotal; - } - if (firstException) { - throw firstException; - } - return clock.now; - }; - - clock.next = function next() { - runJobs(clock); - var timer = firstTimer(clock); - if (!timer) { - return clock.now; - } - - clock.duringTick = true; - try { - clock.now = timer.callAt; - callTimer(clock, timer); - runJobs(clock); - return clock.now; - } finally { - clock.duringTick = false; - } - }; - - clock.runAll = function runAll() { - var numTimers, i; - runJobs(clock); - for (i = 0; i < clock.loopLimit; i++) { - if (!clock.timers) { - return clock.now; - } - - numTimers = keys(clock.timers).length; - if (numTimers === 0) { - return clock.now; - } - - clock.next(); - } - - throw new Error("Aborting after running " + clock.loopLimit + " timers, assuming an infinite loop!"); - }; - - clock.runToFrame = function runToFrame() { - return clock.tick(getTimeToNextFrame()); - }; - - clock.runToLast = function runToLast() { - var timer = lastTimer(clock); - if (!timer) { - runJobs(clock); - return clock.now; - } - - return clock.tick(timer.callAt - clock.now); - }; - - clock.reset = function reset() { - nanos = 0; - clock.timers = {}; - clock.jobs = []; - clock.now = start; - }; - - clock.setSystemTime = function setSystemTime(systemTime) { - // determine time difference - var newNow = getEpoch(systemTime); - var difference = newNow - clock.now; - var id, timer; - - adjustedSystemTime[0] = difference; - adjustedSystemTime[1] = nanos; - // update 'system clock' - clock.now = newNow; - nanos = 0; - - // update timers and intervals to keep them stable - for (id in clock.timers) { - if (clock.timers.hasOwnProperty(id)) { - timer = clock.timers[id]; - timer.createdAt += difference; - timer.callAt += difference; - } - } - }; - - if (performancePresent) { - clock.performance = Object.create(null); - - if (hasPerformancePrototype) { - var proto = _global.Performance.prototype; - - Object - .getOwnPropertyNames(proto) - .forEach(function (name) { - clock.performance[name] = NOOP; - }); - } - - clock.performance.now = function lolexNow() { - var hrt = hrtime(); - var millis = (hrt[0] * 1000 + hrt[1] / 1e6); - return millis; - }; - } - - - if (hrtimePresent) { - clock.hrtime = hrtime; - } - - return clock; - } - - /** - * @param config {Object} optional config - * @param config.target {Object} the target to install timers in (default `window`) - * @param config.now {number|Date} a number (in milliseconds) or a Date object (default epoch) - * @param config.toFake {string[]} names of the methods that should be faked. - * @param config.loopLimit {number} the maximum number of timers that will be run when calling runAll() - * @param config.shouldAdvanceTime {Boolean} tells lolex to increment mocked time automatically (default false) - * @param config.advanceTimeDelta {Number} increment mocked time every <> ms (default: 20ms) - */ - function install(config) { - if ( arguments.length > 1 || config instanceof Date || Array.isArray(config) || typeof config === "number") { - throw new TypeError("lolex.install called with " + String(config) + - " lolex 2.0+ requires an object parameter - see https://github.com/sinonjs/lolex"); - } - config = typeof config !== "undefined" ? config : {}; - config.shouldAdvanceTime = config.shouldAdvanceTime || false; - config.advanceTimeDelta = config.advanceTimeDelta || 20; - - var i, l; - var target = config.target || _global; - var clock = createClock(config.now, config.loopLimit); - - clock.uninstall = function () { - return uninstall(clock, target, config); - }; - - clock.methods = config.toFake || []; - - if (clock.methods.length === 0) { - // do not fake nextTick by default - GitHub#126 - clock.methods = keys(timers).filter(function (key) {return key !== "nextTick";}); - } - - for (i = 0, l = clock.methods.length; i < l; i++) { - if (clock.methods[i] === "hrtime") { - if (target.process && typeof target.process.hrtime === "function") { - hijackMethod(target.process, clock.methods[i], clock); - } - } else if (clock.methods[i] === "nextTick") { - if (target.process && typeof target.process.nextTick === "function") { - hijackMethod(target.process, clock.methods[i], clock); - } - } else { - if (clock.methods[i] === "setInterval" && config.shouldAdvanceTime === true) { - var intervalTick = doIntervalTick.bind(null, clock, config.advanceTimeDelta); - var intervalId = target[clock.methods[i]]( - intervalTick, - config.advanceTimeDelta); - clock.attachedInterval = intervalId; - } - hijackMethod(target, clock.methods[i], clock); - } - } - - return clock; - } - - return { - timers: timers, - createClock: createClock, - install: install, - withGlobal: withGlobal - }; - } - - var defaultImplementation = withGlobal(global || window); - - exports.timers = defaultImplementation.timers; - exports.createClock = defaultImplementation.createClock; - exports.install = defaultImplementation.install; - exports.withGlobal = withGlobal; - - }).call(this,typeof commonjsGlobal$1 !== "undefined" ? commonjsGlobal$1 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); - },{}]},{},[1])(1) - }); - }); - - function createClock(config, globalCtx) { - var llxCtx = lolex; - if (globalCtx !== null && typeof globalCtx === "object") { - llxCtx = lolex.withGlobal(globalCtx); - } - var clock = llxCtx.install(config); - clock.restore = clock.uninstall; - return clock; - } - - /** - * @param {number|Date|Object} dateOrConfig The unix epoch value to install with (default 0) - * @returns {Object} Returns a lolex clock instance - */ - var useFakeTimers = function(dateOrConfig) { - var hasArguments = typeof dateOrConfig !== "undefined"; - var argumentIsDateLike = - (typeof dateOrConfig === "number" || dateOrConfig instanceof Date) && arguments.length === 1; - var argumentIsObject = dateOrConfig !== null && typeof dateOrConfig === "object" && arguments.length === 1; - - if (!hasArguments) { - return createClock({ - now: 0 - }); - } - - if (argumentIsDateLike) { - return createClock({ - now: dateOrConfig - }); - } - - if (argumentIsObject) { - var config = extend({}, dateOrConfig); - var globalCtx = config.global; - delete config.global; - return createClock(config, globalCtx); - } - - throw new TypeError("useFakeTimers expected epoch or config object. See https://github.com/sinonjs/sinon"); - }; - - var clock = { - create: function(now) { - return lolex.createClock(now); - } - }; - - var timers = { - setTimeout: setTimeout, - clearTimeout: clearTimeout, - setImmediate: typeof setImmediate !== "undefined" ? setImmediate : undefined, - clearImmediate: typeof clearImmediate !== "undefined" ? clearImmediate : undefined, - setInterval: setInterval, - clearInterval: clearInterval, - Date: Date - }; - - var fakeTimers = { - useFakeTimers: useFakeTimers, - clock: clock, - timers: timers - }; - - var functionToString = function toString() { - var i, prop, thisValue; - if (this.getCall && this.callCount) { - i = this.callCount; - - while (i--) { - thisValue = this.getCall(i).thisValue; - - for (prop in thisValue) { - if (thisValue[prop] === this) { - return prop; - } - } - } - } - - return this.displayName || "sinon fake"; - }; - - var arrayProto$5 = lib.prototypes.array; - - var deepEqual$3 = deepEqual_1.use(match_1$1); - var functionName$4 = lib.functionName; - - var valueToString$3 = lib.valueToString; - - var concat$2 = arrayProto$5.concat; - var filter = arrayProto$5.filter; - var join$4 = arrayProto$5.join; - var map$1 = arrayProto$5.map; - var reduce = arrayProto$5.reduce; - var slice$3 = arrayProto$5.slice; - - function throwYieldError(proxy, text, args) { - var msg = functionName$4(proxy) + text; - if (args.length) { - msg += " Received [" + join$4(slice$3(args), ", ") + "]"; - } - throw new Error(msg); - } - - var callProto = { - calledOn: function calledOn(thisValue) { - if (match_1$1 && match_1$1.isMatcher(thisValue)) { - return thisValue.test(this.thisValue); - } - return this.thisValue === thisValue; - }, - - calledWith: function calledWith() { - var self = this; - var calledWithArgs = slice$3(arguments); - - if (calledWithArgs.length > self.args.length) { - return false; - } - - return reduce( - calledWithArgs, - function(prev, arg, i) { - return prev && deepEqual$3(arg, self.args[i]); - }, - true - ); - }, - - calledWithMatch: function calledWithMatch() { - var self = this; - var calledWithMatchArgs = slice$3(arguments); - - if (calledWithMatchArgs.length > self.args.length) { - return false; - } - - return reduce( - calledWithMatchArgs, - function(prev, expectation, i) { - var actual = self.args[i]; - - return prev && (match_1$1 && match_1$1(expectation).test(actual)); - }, - true - ); - }, - - calledWithExactly: function calledWithExactly() { - return arguments.length === this.args.length && this.calledWith.apply(this, arguments); - }, - - notCalledWith: function notCalledWith() { - return !this.calledWith.apply(this, arguments); - }, - - notCalledWithMatch: function notCalledWithMatch() { - return !this.calledWithMatch.apply(this, arguments); - }, - - returned: function returned(value) { - return deepEqual$3(value, this.returnValue); - }, - - threw: function threw(error) { - if (typeof error === "undefined" || !this.exception) { - return Boolean(this.exception); - } - - return this.exception === error || this.exception.name === error; - }, - - calledWithNew: function calledWithNew() { - return this.proxy.prototype && this.thisValue instanceof this.proxy; - }, - - calledBefore: function(other) { - return this.callId < other.callId; - }, - - calledAfter: function(other) { - return this.callId > other.callId; - }, - - calledImmediatelyBefore: function(other) { - return this.callId === other.callId - 1; - }, - - calledImmediatelyAfter: function(other) { - return this.callId === other.callId + 1; - }, - - callArg: function(pos) { - this.ensureArgIsAFunction(pos); - return this.args[pos](); - }, - - callArgOn: function(pos, thisValue) { - this.ensureArgIsAFunction(pos); - return this.args[pos].apply(thisValue); - }, - - callArgWith: function(pos) { - return this.callArgOnWith.apply(this, concat$2([pos, null], slice$3(arguments, 1))); - }, - - callArgOnWith: function(pos, thisValue) { - this.ensureArgIsAFunction(pos); - var args = slice$3(arguments, 2); - return this.args[pos].apply(thisValue, args); - }, - - throwArg: function(pos) { - if (pos > this.args.length) { - throw new TypeError("Not enough arguments: " + pos + " required but only " + this.args.length + " present"); - } - - throw this.args[pos]; - }, - - yield: function() { - return this.yieldOn.apply(this, concat$2([null], slice$3(arguments, 0))); - }, - - yieldOn: function(thisValue) { - var args = slice$3(this.args); - var yieldFn = filter(args, function(arg) { - return typeof arg === "function"; - })[0]; - - if (!yieldFn) { - throwYieldError(this.proxy, " cannot yield since no callback was passed.", args); - } - - return yieldFn.apply(thisValue, slice$3(arguments, 1)); - }, - - yieldTo: function(prop) { - return this.yieldToOn.apply(this, concat$2([prop, null], slice$3(arguments, 1))); - }, - - yieldToOn: function(prop, thisValue) { - var args = slice$3(this.args); - var yieldArg = filter(args, function(arg) { - return arg && typeof arg[prop] === "function"; - })[0]; - var yieldFn = yieldArg && yieldArg[prop]; - - if (!yieldFn) { - throwYieldError( - this.proxy, - " cannot yield to '" + valueToString$3(prop) + "' since no callback was passed.", - args - ); - } - - return yieldFn.apply(thisValue, slice$3(arguments, 2)); - }, - - toString: function() { - var callStr = this.proxy ? String(this.proxy) + "(" : ""; - var formattedArgs; - - if (!this.args) { - return ":("; - } - - formattedArgs = map$1(this.args, function(arg) { - return format_1(arg); - }); - - callStr = callStr + join$4(formattedArgs, ", ") + ")"; - - if (typeof this.returnValue !== "undefined") { - callStr += " => " + format_1(this.returnValue); - } - - if (this.exception) { - callStr += " !" + this.exception.name; - - if (this.exception.message) { - callStr += "(" + this.exception.message + ")"; - } - } - if (this.stack) { - // Omit the error message and the two top stack frames in sinon itself: - callStr += (this.stack.split("\n")[3] || "unknown").replace(/^\s*(?:at\s+|@)?/, " at "); - } - - return callStr; - }, - - ensureArgIsAFunction: function(pos) { - if (typeof this.args[pos] !== "function") { - throw new TypeError( - "Expected argument at position " + pos + " to be a Function, but was " + typeof this.args[pos] - ); - } - } - }; - Object.defineProperty(callProto, "stack", { - enumerable: true, - configurable: true, - get: function() { - return (this.errorWithCallStack && this.errorWithCallStack.stack) || ""; - } - }); - - callProto.invokeCallback = callProto.yield; - - function createSpyCall(spy, thisValue, args, returnValue, exception, id, errorWithCallStack) { - if (typeof id !== "number") { - throw new TypeError("Call id is not a number"); - } - - var proxyCall = Object.create(callProto); - var lastArg = (args.length > 0 && args[args.length - 1]) || undefined; - var callback = lastArg && typeof lastArg === "function" ? lastArg : undefined; - - proxyCall.proxy = spy; - proxyCall.thisValue = thisValue; - proxyCall.args = args; - proxyCall.lastArg = lastArg; - proxyCall.callback = callback; - proxyCall.returnValue = returnValue; - proxyCall.exception = exception; - proxyCall.callId = id; - proxyCall.errorWithCallStack = errorWithCallStack; - - return proxyCall; - } - createSpyCall.toString = callProto.toString; // used by mocks - - var call$1$1 = createSpyCall; - - var hasOwnProperty$6 = lib.prototypes.object.hasOwnProperty; - var valueToString$4 = lib.valueToString; - - function isFunction$1(obj) { - return typeof obj === "function" || Boolean(obj && obj.constructor && obj.call && obj.apply); - } - - function mirrorProperties(target, source) { - for (var prop in source) { - if (!hasOwnProperty$6(target, prop)) { - target[prop] = source[prop]; - } - } - } - - // Cheap way to detect if we have ES5 support. - var hasES5Support = "keys" in Object; - - var wrapMethod = function wrapMethod(object, property, method) { - if (!object) { - throw new TypeError("Should wrap property of object"); - } - - if (typeof method !== "function" && typeof method !== "object") { - throw new TypeError("Method wrapper should be a function or a property descriptor"); - } - - function checkWrappedMethod(wrappedMethod) { - var error; - - if (!isFunction$1(wrappedMethod)) { - error = new TypeError( - "Attempted to wrap " + typeof wrappedMethod + " property " + valueToString$4(property) + " as function" - ); - } else if (wrappedMethod.restore && wrappedMethod.restore.sinon) { - error = new TypeError("Attempted to wrap " + valueToString$4(property) + " which is already wrapped"); - } else if (wrappedMethod.calledBefore) { - var verb = wrappedMethod.returns ? "stubbed" : "spied on"; - error = new TypeError("Attempted to wrap " + valueToString$4(property) + " which is already " + verb); - } - - if (error) { - if (wrappedMethod && wrappedMethod.stackTraceError) { - error.stack += "\n--------------\n" + wrappedMethod.stackTraceError.stack; - } - throw error; - } - } - - var error, wrappedMethod, i, wrappedMethodDesc; - - function simplePropertyAssignment() { - wrappedMethod = object[property]; - checkWrappedMethod(wrappedMethod); - object[property] = method; - method.displayName = property; - } - - // Firefox has a problem when using hasOwn.call on objects from other frames. - /* eslint-disable-next-line local-rules/no-prototype-methods */ - var owned = object.hasOwnProperty ? object.hasOwnProperty(property) : hasOwnProperty$6(object, property); - - if (hasES5Support) { - var methodDesc = typeof method === "function" ? { value: method } : method; - wrappedMethodDesc = getPropertyDescriptor(object, property); - - if (!wrappedMethodDesc) { - error = new TypeError( - "Attempted to wrap " + typeof wrappedMethod + " property " + property + " as function" - ); - } else if (wrappedMethodDesc.restore && wrappedMethodDesc.restore.sinon) { - error = new TypeError("Attempted to wrap " + property + " which is already wrapped"); - } - if (error) { - if (wrappedMethodDesc && wrappedMethodDesc.stackTraceError) { - error.stack += "\n--------------\n" + wrappedMethodDesc.stackTraceError.stack; - } - throw error; - } - - var types = Object.keys(methodDesc); - for (i = 0; i < types.length; i++) { - wrappedMethod = wrappedMethodDesc[types[i]]; - checkWrappedMethod(wrappedMethod); - } - - mirrorProperties(methodDesc, wrappedMethodDesc); - for (i = 0; i < types.length; i++) { - mirrorProperties(methodDesc[types[i]], wrappedMethodDesc[types[i]]); - } - Object.defineProperty(object, property, methodDesc); - - // catch failing assignment - // this is the converse of the check in `.restore` below - if (typeof method === "function" && object[property] !== method) { - // correct any wrongdoings caused by the defineProperty call above, - // such as adding new items (if object was a Storage object) - delete object[property]; - simplePropertyAssignment(); - } - } else { - simplePropertyAssignment(); - } - - method.displayName = property; - - // Set up an Error object for a stack trace which can be used later to find what line of - // code the original method was created on. - method.stackTraceError = new Error("Stack Trace for original"); - - method.restore = function() { - // For prototype properties try to reset by delete first. - // If this fails (ex: localStorage on mobile safari) then force a reset - // via direct assignment. - if (!owned) { - // In some cases `delete` may throw an error - try { - delete object[property]; - } catch (e) {} // eslint-disable-line no-empty - // For native code functions `delete` fails without throwing an error - // on Chrome < 43, PhantomJS, etc. - } else if (hasES5Support) { - Object.defineProperty(object, property, wrappedMethodDesc); - } - - if (hasES5Support) { - var descriptor = getPropertyDescriptor(object, property); - if (descriptor && descriptor.value === method) { - object[property] = wrappedMethod; - } - } else { - // Use strict equality comparison to check failures then force a reset - // via direct assignment. - if (object[property] === method) { - object[property] = wrappedMethod; - } - } - }; - - method.wrappedMethod = wrappedMethod; - - method.restore.sinon = true; - - if (!hasES5Support) { - mirrorProperties(method, wrappedMethod); - } - - return method; - }; - - var global$1 = (typeof global !== "undefined" ? global : - typeof self !== "undefined" ? self : - typeof window !== "undefined" ? window : {}); - - // shim for using process in browser - // based off https://github.com/defunctzombie/node-process/blob/master/browser.js - - function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); - } - function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); - } - var cachedSetTimeout = defaultSetTimout; - var cachedClearTimeout = defaultClearTimeout; - if (typeof global$1.setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } - if (typeof global$1.clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } - - function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - - } - function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - - } - var queue = []; - var draining = false; - var currentQueue; - var queueIndex = -1; - - function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } - } - - function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); - } - function nextTick$2(fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } - } - // v8 likes predictible objects - function Item(fun, array) { - this.fun = fun; - this.array = array; - } - Item.prototype.run = function () { - this.fun.apply(null, this.array); - }; - var title = 'browser'; - var platform = 'browser'; - var browser = true; - var env = {}; - var argv = []; - var version = ''; // empty string to avoid regexp issues - var versions = {}; - var release = {}; - var config$1 = {}; - - function noop() {} - - var on$1 = noop; - var addListener = noop; - var once = noop; - var off = noop; - var removeListener = noop; - var removeAllListeners = noop; - var emit = noop; - - function binding(name) { - throw new Error('process.binding is not supported'); - } - - function cwd () { return '/' } - function chdir (dir) { - throw new Error('process.chdir is not supported'); - }function umask() { return 0; } - - // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js - var performance = global$1.performance || {}; - var performanceNow = - performance.now || - performance.mozNow || - performance.msNow || - performance.oNow || - performance.webkitNow || - function(){ return (new Date()).getTime() }; - - // generate timestamp or delta - // see http://nodejs.org/api/process.html#process_process_hrtime - function hrtime(previousTimestamp){ - var clocktime = performanceNow.call(performance)*1e-3; - var seconds = Math.floor(clocktime); - var nanoseconds = Math.floor((clocktime%1)*1e9); - if (previousTimestamp) { - seconds = seconds - previousTimestamp[0]; - nanoseconds = nanoseconds - previousTimestamp[1]; - if (nanoseconds<0) { - seconds--; - nanoseconds += 1e9; - } - } - return [seconds,nanoseconds] - } - - var startTime = new Date(); - function uptime() { - var currentTime = new Date(); - var dif = currentTime - startTime; - return dif / 1000; - } - - var process = { - nextTick: nextTick$2, - title: title, - browser: browser, - env: env, - argv: argv, - version: version, - versions: versions, - on: on$1, - addListener: addListener, - once: once, - off: off, - removeListener: removeListener, - removeAllListeners: removeAllListeners, - emit: emit, - binding: binding, - cwd: cwd, - chdir: chdir, - umask: umask, - hrtime: hrtime, - platform: platform, - release: release, - config: config$1, - uptime: uptime - }; - - var hasFlag = (flag, argv$$1) => { - argv$$1 = argv$$1 || process.argv; - const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); - const pos = argv$$1.indexOf(prefix + flag); - const terminatorPos = argv$$1.indexOf('--'); - return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos); - }; - - const env$1 = process.env; - - let forceColor; - if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; - } else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; - } - if ('FORCE_COLOR' in env$1) { - forceColor = env$1.FORCE_COLOR.length === 0 || parseInt(env$1.FORCE_COLOR, 10) !== 0; - } - - function translateLevel(level) { - if (level === 0) { - return false; - } - - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; - } - - function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } - - if (hasFlag('color=256')) { - return 2; - } - - if (stream && !stream.isTTY && forceColor !== true) { - return 0; - } - - const min = forceColor ? 1 : 0; - - if ('CI' in env$1) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env$1) || env$1.CI_NAME === 'codeship') { - return 1; - } - - return min; - } - - if ('TEAMCITY_VERSION' in env$1) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env$1.TEAMCITY_VERSION) ? 1 : 0; - } - - if ('TERM_PROGRAM' in env$1) { - const version$$1 = parseInt(('').split('.')[0], 10); - - switch (env$1.TERM_PROGRAM) { - case 'iTerm.app': - return version$$1 >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } - - if (/-256(color)?$/i.test(env$1.TERM)) { - return 2; - } - - if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env$1.TERM)) { - return 1; - } - - if ('COLORTERM' in env$1) { - return 1; - } - - return min; - } - - function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); - } - - var supportsColor_1 = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) - }; - - function colorize(str, color) { - if (supportsColor_1.stdout === false) { - return str; - } - - return "\x1b[" + color + "m" + str + "\x1b[0m"; - } - - var red = function(str) { - return colorize(str, 31); - }; - - var green = function(str) { - return colorize(str, 32); - }; - - var cyan = function(str) { - return colorize(str, 96); - }; - - var white = function(str) { - return colorize(str, 39); - }; - - var bold = function(str) { - return colorize(str, 1); - }; - - var color = { - red: red, - green: green, - cyan: cyan, - white: white, - bold: bold - }; - - var base = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports['default'] = /*istanbul ignore end*/Diff; - function Diff() {} - - Diff.prototype = { - /*istanbul ignore start*/ /*istanbul ignore end*/diff: function diff(oldString, newString) { - /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - var callback = options.callback; - if (typeof options === 'function') { - callback = options; - options = {}; - } - this.options = options; - - var self = this; - - function done(value) { - if (callback) { - setTimeout(function () { - callback(undefined, value); - }, 0); - return true; - } else { - return value; - } - } - - // Allow subclasses to massage the input prior to running - oldString = this.castInput(oldString); - newString = this.castInput(newString); - - oldString = this.removeEmpty(this.tokenize(oldString)); - newString = this.removeEmpty(this.tokenize(newString)); - - var newLen = newString.length, - oldLen = oldString.length; - var editLength = 1; - var maxEditLength = newLen + oldLen; - var bestPath = [{ newPos: -1, components: [] }]; - - // Seed editLength = 0, i.e. the content starts with the same values - var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); - if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { - // Identity per the equality and tokenizer - return done([{ value: this.join(newString), count: newString.length }]); - } - - // Main worker method. checks all permutations of a given edit length for acceptance. - function execEditLength() { - for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { - var basePath = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - var addPath = bestPath[diagonalPath - 1], - removePath = bestPath[diagonalPath + 1], - _oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; - if (addPath) { - // No one else is going to attempt to use this value, clear it - bestPath[diagonalPath - 1] = undefined; - } - - var canAdd = addPath && addPath.newPos + 1 < newLen, - canRemove = removePath && 0 <= _oldPos && _oldPos < oldLen; - if (!canAdd && !canRemove) { - // If this path is a terminal then prune - bestPath[diagonalPath] = undefined; - continue; - } - - // Select the diagonal that we want to branch from. We select the prior - // path whose position in the new string is the farthest from the origin - // and does not pass the bounds of the diff graph - if (!canAdd || canRemove && addPath.newPos < removePath.newPos) { - basePath = clonePath(removePath); - self.pushComponent(basePath.components, undefined, true); - } else { - basePath = addPath; // No need to clone, we've pulled it from the list - basePath.newPos++; - self.pushComponent(basePath.components, true, undefined); - } - - _oldPos = self.extractCommon(basePath, newString, oldString, diagonalPath); - - // If we have hit the end of both strings, then we are done - if (basePath.newPos + 1 >= newLen && _oldPos + 1 >= oldLen) { - return done(buildValues(self, basePath.components, newString, oldString, self.useLongestToken)); - } else { - // Otherwise track this path as a potential candidate and continue. - bestPath[diagonalPath] = basePath; - } - } - - editLength++; - } - - // Performs the length of edit iteration. Is a bit fugly as this has to support the - // sync and async mode which is never fun. Loops over execEditLength until a value - // is produced. - if (callback) { - (function exec() { - setTimeout(function () { - // This should not happen, but we want to be safe. - /* istanbul ignore next */ - if (editLength > maxEditLength) { - return callback(); - } - - if (!execEditLength()) { - exec(); - } - }, 0); - })(); - } else { - while (editLength <= maxEditLength) { - var ret = execEditLength(); - if (ret) { - return ret; - } - } - } - }, - /*istanbul ignore start*/ /*istanbul ignore end*/pushComponent: function pushComponent(components, added, removed) { - var last = components[components.length - 1]; - if (last && last.added === added && last.removed === removed) { - // We need to clone here as the component clone operation is just - // as shallow array clone - components[components.length - 1] = { count: last.count + 1, added: added, removed: removed }; - } else { - components.push({ count: 1, added: added, removed: removed }); - } - }, - /*istanbul ignore start*/ /*istanbul ignore end*/extractCommon: function extractCommon(basePath, newString, oldString, diagonalPath) { - var newLen = newString.length, - oldLen = oldString.length, - newPos = basePath.newPos, - oldPos = newPos - diagonalPath, - commonCount = 0; - while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newString[newPos + 1], oldString[oldPos + 1])) { - newPos++; - oldPos++; - commonCount++; - } - - if (commonCount) { - basePath.components.push({ count: commonCount }); - } - - basePath.newPos = newPos; - return oldPos; - }, - /*istanbul ignore start*/ /*istanbul ignore end*/equals: function equals(left, right) { - if (this.options.comparator) { - return this.options.comparator(left, right); - } else { - return left === right || this.options.ignoreCase && left.toLowerCase() === right.toLowerCase(); - } - }, - /*istanbul ignore start*/ /*istanbul ignore end*/removeEmpty: function removeEmpty(array) { - var ret = []; - for (var i = 0; i < array.length; i++) { - if (array[i]) { - ret.push(array[i]); - } - } - return ret; - }, - /*istanbul ignore start*/ /*istanbul ignore end*/castInput: function castInput(value) { - return value; - }, - /*istanbul ignore start*/ /*istanbul ignore end*/tokenize: function tokenize(value) { - return value.split(''); - }, - /*istanbul ignore start*/ /*istanbul ignore end*/join: function join(chars) { - return chars.join(''); - } - }; - - function buildValues(diff, components, newString, oldString, useLongestToken) { - var componentPos = 0, - componentLen = components.length, - newPos = 0, - oldPos = 0; - - for (; componentPos < componentLen; componentPos++) { - var component = components[componentPos]; - if (!component.removed) { - if (!component.added && useLongestToken) { - var value = newString.slice(newPos, newPos + component.count); - value = value.map(function (value, i) { - var oldValue = oldString[oldPos + i]; - return oldValue.length > value.length ? oldValue : value; - }); - - component.value = diff.join(value); - } else { - component.value = diff.join(newString.slice(newPos, newPos + component.count)); - } - newPos += component.count; - - // Common case - if (!component.added) { - oldPos += component.count; - } - } else { - component.value = diff.join(oldString.slice(oldPos, oldPos + component.count)); - oldPos += component.count; - - // Reverse add and remove so removes are output first to match common convention - // The diffing algorithm is tied to add then remove output and this is the simplest - // route to get the desired output with minimal overhead. - if (componentPos && components[componentPos - 1].added) { - var tmp = components[componentPos - 1]; - components[componentPos - 1] = components[componentPos]; - components[componentPos] = tmp; - } - } - } - - // Special case handle for when one terminal is ignored (i.e. whitespace). - // For this case we merge the terminal into the prior string and drop the change. - // This is only available for string mode. - var lastComponent = components[componentLen - 1]; - if (componentLen > 1 && typeof lastComponent.value === 'string' && (lastComponent.added || lastComponent.removed) && diff.equals('', lastComponent.value)) { - components[componentLen - 2].value += lastComponent.value; - components.pop(); - } - - return components; - } - - function clonePath(path) { - return { newPos: path.newPos, components: path.components.slice(0) }; - } - - }); - - unwrapExports$1(base); - - var character = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports.characterDiff = undefined; - exports. /*istanbul ignore end*/diffChars = diffChars; - - - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var characterDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/characterDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - function diffChars(oldStr, newStr, options) { - return characterDiff.diff(oldStr, newStr, options); - } - - }); - - unwrapExports$1(character); - var character_1 = character.characterDiff; - var character_2 = character.diffChars; - - var params = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports. /*istanbul ignore end*/generateOptions = generateOptions; - function generateOptions(options, defaults) { - if (typeof options === 'function') { - defaults.callback = options; - } else if (options) { - for (var name in options) { - /* istanbul ignore else */ - if (options.hasOwnProperty(name)) { - defaults[name] = options[name]; - } - } - } - return defaults; - } - - }); - - unwrapExports$1(params); - var params_1 = params.generateOptions; - - var word = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports.wordDiff = undefined; - exports. /*istanbul ignore end*/diffWords = diffWords; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = diffWordsWithSpace; - - - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); - - /*istanbul ignore end*/ - - /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/ // Based on https://en.wikipedia.org/wiki/Latin_script_in_Unicode - // - // Ranges and exceptions: - // Latin-1 Supplement, 0080–00FF - // - U+00D7 × Multiplication sign - // - U+00F7 ÷ Division sign - // Latin Extended-A, 0100–017F - // Latin Extended-B, 0180–024F - // IPA Extensions, 0250–02AF - // Spacing Modifier Letters, 02B0–02FF - // - U+02C7 ˇ ˇ Caron - // - U+02D8 ˘ ˘ Breve - // - U+02D9 ˙ ˙ Dot Above - // - U+02DA ˚ ˚ Ring Above - // - U+02DB ˛ ˛ Ogonek - // - U+02DC ˜ ˜ Small Tilde - // - U+02DD ˝ ˝ Double Acute Accent - // Latin Extended Additional, 1E00–1EFF - var extendedWordChars = /^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/; - - var reWhitespace = /\S/; - - var wordDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/wordDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - wordDiff.equals = function (left, right) { - if (this.options.ignoreCase) { - left = left.toLowerCase(); - right = right.toLowerCase(); - } - return left === right || this.options.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right); - }; - wordDiff.tokenize = function (value) { - var tokens = value.split(/(\s+|\b)/); - - // Join the boundary splits that we do not consider to be boundaries. This is primarily the extended Latin character set. - for (var i = 0; i < tokens.length - 1; i++) { - // If we have an empty string in the next field and we have only word chars before and after, merge - if (!tokens[i + 1] && tokens[i + 2] && extendedWordChars.test(tokens[i]) && extendedWordChars.test(tokens[i + 2])) { - tokens[i] += tokens[i + 2]; - tokens.splice(i + 1, 2); - i--; - } - } - - return tokens; - }; - - function diffWords(oldStr, newStr, options) { - options = /*istanbul ignore start*/(0, params.generateOptions) /*istanbul ignore end*/(options, { ignoreWhitespace: true }); - return wordDiff.diff(oldStr, newStr, options); - } - - function diffWordsWithSpace(oldStr, newStr, options) { - return wordDiff.diff(oldStr, newStr, options); - } - - }); - - unwrapExports$1(word); - var word_1 = word.wordDiff; - var word_2 = word.diffWords; - var word_3 = word.diffWordsWithSpace; - - var line = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports.lineDiff = undefined; - exports. /*istanbul ignore end*/diffLines = diffLines; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = diffTrimmedLines; - - - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); - - /*istanbul ignore end*/ - - /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var lineDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/lineDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - lineDiff.tokenize = function (value) { - var retLines = [], - linesAndNewlines = value.split(/(\n|\r\n)/); - - // Ignore the final empty token that occurs if the string ends with a new line - if (!linesAndNewlines[linesAndNewlines.length - 1]) { - linesAndNewlines.pop(); - } - - // Merge the content and line separators into single tokens - for (var i = 0; i < linesAndNewlines.length; i++) { - var line = linesAndNewlines[i]; - - if (i % 2 && !this.options.newlineIsToken) { - retLines[retLines.length - 1] += line; - } else { - if (this.options.ignoreWhitespace) { - line = line.trim(); - } - retLines.push(line); - } - } - - return retLines; - }; - - function diffLines(oldStr, newStr, callback) { - return lineDiff.diff(oldStr, newStr, callback); - } - function diffTrimmedLines(oldStr, newStr, callback) { - var options = /*istanbul ignore start*/(0, params.generateOptions) /*istanbul ignore end*/(callback, { ignoreWhitespace: true }); - return lineDiff.diff(oldStr, newStr, options); - } - - }); - - unwrapExports$1(line); - var line_1 = line.lineDiff; - var line_2 = line.diffLines; - var line_3 = line.diffTrimmedLines; - - var sentence = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports.sentenceDiff = undefined; - exports. /*istanbul ignore end*/diffSentences = diffSentences; - - - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var sentenceDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/sentenceDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - sentenceDiff.tokenize = function (value) { - return value.split(/(\S.+?[.!?])(?=\s+|$)/); - }; - - function diffSentences(oldStr, newStr, callback) { - return sentenceDiff.diff(oldStr, newStr, callback); - } - - }); - - unwrapExports$1(sentence); - var sentence_1 = sentence.sentenceDiff; - var sentence_2 = sentence.diffSentences; - - var css = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports.cssDiff = undefined; - exports. /*istanbul ignore end*/diffCss = diffCss; - - - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var cssDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/cssDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - cssDiff.tokenize = function (value) { - return value.split(/([{}:;,]|\s+)/); - }; - - function diffCss(oldStr, newStr, callback) { - return cssDiff.diff(oldStr, newStr, callback); - } - - }); - - unwrapExports$1(css); - var css_1 = css.cssDiff; - var css_2 = css.diffCss; - - var json = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports.jsonDiff = undefined; - - var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; - - exports. /*istanbul ignore end*/diffJson = diffJson; - /*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = canonicalize; - - - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); - - /*istanbul ignore end*/ - - /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var objectPrototypeToString = Object.prototype.toString; - - var jsonDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/jsonDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - // Discriminate between two lines of pretty-printed, serialized JSON where one of them has a - // dangling comma and the other doesn't. Turns out including the dangling comma yields the nicest output: - jsonDiff.useLongestToken = true; - - jsonDiff.tokenize = /*istanbul ignore start*/line.lineDiff /*istanbul ignore end*/.tokenize; - jsonDiff.castInput = function (value) { - /*istanbul ignore start*/var _options = /*istanbul ignore end*/this.options, - undefinedReplacement = _options.undefinedReplacement, - _options$stringifyRep = _options.stringifyReplacer, - stringifyReplacer = _options$stringifyRep === undefined ? function (k, v) /*istanbul ignore start*/{ - return (/*istanbul ignore end*/typeof v === 'undefined' ? undefinedReplacement : v - ); - } : _options$stringifyRep; - - - return typeof value === 'string' ? value : JSON.stringify(canonicalize(value, null, null, stringifyReplacer), stringifyReplacer, ' '); - }; - jsonDiff.equals = function (left, right) { - return (/*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/.prototype.equals.call(jsonDiff, left.replace(/,([\r\n])/g, '$1'), right.replace(/,([\r\n])/g, '$1')) - ); - }; - - function diffJson(oldObj, newObj, options) { - return jsonDiff.diff(oldObj, newObj, options); - } - - // This function handles the presence of circular references by bailing out when encountering an - // object that is already on the "stack" of items being processed. Accepts an optional replacer - function canonicalize(obj, stack, replacementStack, replacer, key) { - stack = stack || []; - replacementStack = replacementStack || []; - - if (replacer) { - obj = replacer(key, obj); - } - - var i = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - - for (i = 0; i < stack.length; i += 1) { - if (stack[i] === obj) { - return replacementStack[i]; - } - } - - var canonicalizedObj = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - - if ('[object Array]' === objectPrototypeToString.call(obj)) { - stack.push(obj); - canonicalizedObj = new Array(obj.length); - replacementStack.push(canonicalizedObj); - for (i = 0; i < obj.length; i += 1) { - canonicalizedObj[i] = canonicalize(obj[i], stack, replacementStack, replacer, key); - } - stack.pop(); - replacementStack.pop(); - return canonicalizedObj; - } - - if (obj && obj.toJSON) { - obj = obj.toJSON(); - } - - if ( /*istanbul ignore start*/(typeof /*istanbul ignore end*/obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj !== null) { - stack.push(obj); - canonicalizedObj = {}; - replacementStack.push(canonicalizedObj); - var sortedKeys = [], - _key = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - for (_key in obj) { - /* istanbul ignore else */ - if (obj.hasOwnProperty(_key)) { - sortedKeys.push(_key); - } - } - sortedKeys.sort(); - for (i = 0; i < sortedKeys.length; i += 1) { - _key = sortedKeys[i]; - canonicalizedObj[_key] = canonicalize(obj[_key], stack, replacementStack, replacer, _key); - } - stack.pop(); - replacementStack.pop(); - } else { - canonicalizedObj = obj; - } - return canonicalizedObj; - } - - }); - - unwrapExports$1(json); - var json_1 = json.jsonDiff; - var json_2 = json.diffJson; - var json_3 = json.canonicalize; - - var array$2 = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports.arrayDiff = undefined; - exports. /*istanbul ignore end*/diffArrays = diffArrays; - - - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/var arrayDiff = /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayDiff = new /*istanbul ignore start*/_base2['default'] /*istanbul ignore end*/(); - arrayDiff.tokenize = function (value) { - return value.slice(); - }; - arrayDiff.join = arrayDiff.removeEmpty = function (value) { - return value; - }; - - function diffArrays(oldArr, newArr, callback) { - return arrayDiff.diff(oldArr, newArr, callback); - } - - }); - - unwrapExports$1(array$2); - var array_1 = array$2.arrayDiff; - var array_2 = array$2.diffArrays; - - var parse = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports. /*istanbul ignore end*/parsePatch = parsePatch; - function parsePatch(uniDiff) { - /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - var diffstr = uniDiff.split(/\r\n|[\n\v\f\r\x85]/), - delimiters = uniDiff.match(/\r\n|[\n\v\f\r\x85]/g) || [], - list = [], - i = 0; - - function parseIndex() { - var index = {}; - list.push(index); - - // Parse diff metadata - while (i < diffstr.length) { - var line = diffstr[i]; - - // File header found, end parsing diff metadata - if (/^(\-\-\-|\+\+\+|@@)\s/.test(line)) { - break; - } - - // Diff index - var header = /^(?:Index:|diff(?: -r \w+)+)\s+(.+?)\s*$/.exec(line); - if (header) { - index.index = header[1]; - } - - i++; - } - - // Parse file headers if they are defined. Unified diff requires them, but - // there's no technical issues to have an isolated hunk without file header - parseFileHeader(index); - parseFileHeader(index); - - // Parse hunks - index.hunks = []; - - while (i < diffstr.length) { - var _line = diffstr[i]; - - if (/^(Index:|diff|\-\-\-|\+\+\+)\s/.test(_line)) { - break; - } else if (/^@@/.test(_line)) { - index.hunks.push(parseHunk()); - } else if (_line && options.strict) { - // Ignore unexpected content unless in strict mode - throw new Error('Unknown line ' + (i + 1) + ' ' + JSON.stringify(_line)); - } else { - i++; - } - } - } - - // Parses the --- and +++ headers, if none are found, no lines - // are consumed. - function parseFileHeader(index) { - var fileHeader = /^(---|\+\+\+)\s+(.*)$/.exec(diffstr[i]); - if (fileHeader) { - var keyPrefix = fileHeader[1] === '---' ? 'old' : 'new'; - var data = fileHeader[2].split('\t', 2); - var fileName = data[0].replace(/\\\\/g, '\\'); - if (/^".*"$/.test(fileName)) { - fileName = fileName.substr(1, fileName.length - 2); - } - index[keyPrefix + 'FileName'] = fileName; - index[keyPrefix + 'Header'] = (data[1] || '').trim(); - - i++; - } - } - - // Parses a hunk - // This assumes that we are at the start of a hunk. - function parseHunk() { - var chunkHeaderIndex = i, - chunkHeaderLine = diffstr[i++], - chunkHeader = chunkHeaderLine.split(/@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/); - - var hunk = { - oldStart: +chunkHeader[1], - oldLines: +chunkHeader[2] || 1, - newStart: +chunkHeader[3], - newLines: +chunkHeader[4] || 1, - lines: [], - linedelimiters: [] - }; - - var addCount = 0, - removeCount = 0; - for (; i < diffstr.length; i++) { - // Lines starting with '---' could be mistaken for the "remove line" operation - // But they could be the header for the next file. Therefore prune such cases out. - if (diffstr[i].indexOf('--- ') === 0 && i + 2 < diffstr.length && diffstr[i + 1].indexOf('+++ ') === 0 && diffstr[i + 2].indexOf('@@') === 0) { - break; - } - var operation = diffstr[i].length == 0 && i != diffstr.length - 1 ? ' ' : diffstr[i][0]; - - if (operation === '+' || operation === '-' || operation === ' ' || operation === '\\') { - hunk.lines.push(diffstr[i]); - hunk.linedelimiters.push(delimiters[i] || '\n'); - - if (operation === '+') { - addCount++; - } else if (operation === '-') { - removeCount++; - } else if (operation === ' ') { - addCount++; - removeCount++; - } - } else { - break; - } - } - - // Handle the empty block count case - if (!addCount && hunk.newLines === 1) { - hunk.newLines = 0; - } - if (!removeCount && hunk.oldLines === 1) { - hunk.oldLines = 0; - } - - // Perform optional sanity checking - if (options.strict) { - if (addCount !== hunk.newLines) { - throw new Error('Added line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); - } - if (removeCount !== hunk.oldLines) { - throw new Error('Removed line count did not match for hunk at line ' + (chunkHeaderIndex + 1)); - } - } - - return hunk; - } - - while (i < diffstr.length) { - parseIndex(); - } - - return list; - } - - }); - - unwrapExports$1(parse); - var parse_1 = parse.parsePatch; - - var distanceIterator = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - - exports["default"] = /*istanbul ignore end*/function (start, minLine, maxLine) { - var wantForward = true, - backwardExhausted = false, - forwardExhausted = false, - localOffset = 1; - - return function iterator() { - if (wantForward && !forwardExhausted) { - if (backwardExhausted) { - localOffset++; - } else { - wantForward = false; - } - - // Check if trying to fit beyond text length, and if not, check it fits - // after offset location (or desired location on first iteration) - if (start + localOffset <= maxLine) { - return localOffset; - } - - forwardExhausted = true; - } - - if (!backwardExhausted) { - if (!forwardExhausted) { - wantForward = true; - } - - // Check if trying to fit before text beginning, and if not, check it fits - // before offset location - if (minLine <= start - localOffset) { - return -localOffset++; - } - - backwardExhausted = true; - return iterator(); - } - - // We tried to fit hunk before text beginning and beyond text length, then - // hunk can't fit on the text. Return undefined - }; - }; - - }); - - unwrapExports$1(distanceIterator); - - var apply$1 = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports. /*istanbul ignore end*/applyPatch = applyPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = applyPatches; - - - - - - /*istanbul ignore start*/var _distanceIterator2 = _interopRequireDefault(distanceIterator); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /*istanbul ignore end*/function applyPatch(source, uniDiff) { - /*istanbul ignore start*/var /*istanbul ignore end*/options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - - if (typeof uniDiff === 'string') { - uniDiff = /*istanbul ignore start*/(0, parse.parsePatch) /*istanbul ignore end*/(uniDiff); - } - - if (Array.isArray(uniDiff)) { - if (uniDiff.length > 1) { - throw new Error('applyPatch only works with a single input.'); - } - - uniDiff = uniDiff[0]; - } - - // Apply the diff to the input - var lines = source.split(/\r\n|[\n\v\f\r\x85]/), - delimiters = source.match(/\r\n|[\n\v\f\r\x85]/g) || [], - hunks = uniDiff.hunks, - compareLine = options.compareLine || function (lineNumber, line, operation, patchContent) /*istanbul ignore start*/{ - return (/*istanbul ignore end*/line === patchContent - ); - }, - errorCount = 0, - fuzzFactor = options.fuzzFactor || 0, - minLine = 0, - offset = 0, - removeEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/, - addEOFNL = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - - /** - * Checks if the hunk exactly fits on the provided location - */ - function hunkFits(hunk, toPos) { - for (var j = 0; j < hunk.lines.length; j++) { - var line = hunk.lines[j], - operation = line.length > 0 ? line[0] : ' ', - content = line.length > 0 ? line.substr(1) : line; - - if (operation === ' ' || operation === '-') { - // Context sanity check - if (!compareLine(toPos + 1, lines[toPos], operation, content)) { - errorCount++; - - if (errorCount > fuzzFactor) { - return false; - } - } - toPos++; - } - } - - return true; - } - - // Search best fit offsets for each hunk based on the previous ones - for (var i = 0; i < hunks.length; i++) { - var hunk = hunks[i], - maxLine = lines.length - hunk.oldLines, - localOffset = 0, - toPos = offset + hunk.oldStart - 1; - - var iterator = /*istanbul ignore start*/(0, _distanceIterator2['default']) /*istanbul ignore end*/(toPos, minLine, maxLine); - - for (; localOffset !== undefined; localOffset = iterator()) { - if (hunkFits(hunk, toPos + localOffset)) { - hunk.offset = offset += localOffset; - break; - } - } - - if (localOffset === undefined) { - return false; - } - - // Set lower text limit to end of the current hunk, so next ones don't try - // to fit over already patched text - minLine = hunk.offset + hunk.oldStart + hunk.oldLines; - } - - // Apply patch hunks - var diffOffset = 0; - for (var _i = 0; _i < hunks.length; _i++) { - var _hunk = hunks[_i], - _toPos = _hunk.oldStart + _hunk.offset + diffOffset - 1; - diffOffset += _hunk.newLines - _hunk.oldLines; - - if (_toPos < 0) { - // Creating a new file - _toPos = 0; - } - - for (var j = 0; j < _hunk.lines.length; j++) { - var line = _hunk.lines[j], - operation = line.length > 0 ? line[0] : ' ', - content = line.length > 0 ? line.substr(1) : line, - delimiter = _hunk.linedelimiters[j]; - - if (operation === ' ') { - _toPos++; - } else if (operation === '-') { - lines.splice(_toPos, 1); - delimiters.splice(_toPos, 1); - /* istanbul ignore else */ - } else if (operation === '+') { - lines.splice(_toPos, 0, content); - delimiters.splice(_toPos, 0, delimiter); - _toPos++; - } else if (operation === '\\') { - var previousOperation = _hunk.lines[j - 1] ? _hunk.lines[j - 1][0] : null; - if (previousOperation === '+') { - removeEOFNL = true; - } else if (previousOperation === '-') { - addEOFNL = true; - } - } - } - } - - // Handle EOFNL insertion/removal - if (removeEOFNL) { - while (!lines[lines.length - 1]) { - lines.pop(); - delimiters.pop(); - } - } else if (addEOFNL) { - lines.push(''); - delimiters.push('\n'); - } - for (var _k = 0; _k < lines.length - 1; _k++) { - lines[_k] = lines[_k] + delimiters[_k]; - } - return lines.join(''); - } - - // Wrapper that supports multiple file patches via callbacks. - function applyPatches(uniDiff, options) { - if (typeof uniDiff === 'string') { - uniDiff = /*istanbul ignore start*/(0, parse.parsePatch) /*istanbul ignore end*/(uniDiff); - } - - var currentIndex = 0; - function processIndex() { - var index = uniDiff[currentIndex++]; - if (!index) { - return options.complete(); - } - - options.loadFile(index, function (err, data) { - if (err) { - return options.complete(err); - } - - var updatedContent = applyPatch(data, index, options); - options.patched(index, updatedContent, function (err) { - if (err) { - return options.complete(err); - } - - processIndex(); - }); - }); - } - processIndex(); - } - - }); - - unwrapExports$1(apply$1); - var apply_1 = apply$1.applyPatch; - var apply_2 = apply$1.applyPatches; - - var create = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports. /*istanbul ignore end*/structuredPatch = structuredPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = createTwoFilesPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = createPatch; - - - - /*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - - /*istanbul ignore end*/function structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { - if (!options) { - options = {}; - } - if (typeof options.context === 'undefined') { - options.context = 4; - } - - var diff = /*istanbul ignore start*/(0, line.diffLines) /*istanbul ignore end*/(oldStr, newStr, options); - diff.push({ value: '', lines: [] }); // Append an empty value to make cleanup easier - - function contextLines(lines) { - return lines.map(function (entry) { - return ' ' + entry; - }); - } - - var hunks = []; - var oldRangeStart = 0, - newRangeStart = 0, - curRange = [], - oldLine = 1, - newLine = 1; - - /*istanbul ignore start*/var _loop = function _loop( /*istanbul ignore end*/i) { - var current = diff[i], - lines = current.lines || current.value.replace(/\n$/, '').split('\n'); - current.lines = lines; - - if (current.added || current.removed) { - /*istanbul ignore start*/var _curRange; - - /*istanbul ignore end*/ // If we have previous context, start with that - if (!oldRangeStart) { - var prev = diff[i - 1]; - oldRangeStart = oldLine; - newRangeStart = newLine; - - if (prev) { - curRange = options.context > 0 ? contextLines(prev.lines.slice(-options.context)) : []; - oldRangeStart -= curRange.length; - newRangeStart -= curRange.length; - } - } - - // Output our changes - /*istanbul ignore start*/(_curRange = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/lines.map(function (entry) { - return (current.added ? '+' : '-') + entry; - }))); - - // Track the updated file position - if (current.added) { - newLine += lines.length; - } else { - oldLine += lines.length; - } - } else { - // Identical context lines. Track line changes - if (oldRangeStart) { - // Close out any changes that have been output (or join overlapping) - if (lines.length <= options.context * 2 && i < diff.length - 2) { - /*istanbul ignore start*/var _curRange2; - - /*istanbul ignore end*/ // Overlapping - /*istanbul ignore start*/(_curRange2 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines))); - } else { - /*istanbul ignore start*/var _curRange3; - - /*istanbul ignore end*/ // end the range and output - var contextSize = Math.min(lines.length, options.context); - /*istanbul ignore start*/(_curRange3 = /*istanbul ignore end*/curRange).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_curRange3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/contextLines(lines.slice(0, contextSize)))); - - var hunk = { - oldStart: oldRangeStart, - oldLines: oldLine - oldRangeStart + contextSize, - newStart: newRangeStart, - newLines: newLine - newRangeStart + contextSize, - lines: curRange - }; - if (i >= diff.length - 2 && lines.length <= options.context) { - // EOF is inside this hunk - var oldEOFNewline = /\n$/.test(oldStr); - var newEOFNewline = /\n$/.test(newStr); - if (lines.length == 0 && !oldEOFNewline) { - // special case: old has no eol and no trailing context; no-nl can end up before adds - curRange.splice(hunk.oldLines, 0, '\\ No newline at end of file'); - } else if (!oldEOFNewline || !newEOFNewline) { - curRange.push('\\ No newline at end of file'); - } - } - hunks.push(hunk); - - oldRangeStart = 0; - newRangeStart = 0; - curRange = []; - } - } - oldLine += lines.length; - newLine += lines.length; - } - }; - - for (var i = 0; i < diff.length; i++) { - /*istanbul ignore start*/_loop( /*istanbul ignore end*/i); - } - - return { - oldFileName: oldFileName, newFileName: newFileName, - oldHeader: oldHeader, newHeader: newHeader, - hunks: hunks - }; - } - - function createTwoFilesPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options) { - var diff = structuredPatch(oldFileName, newFileName, oldStr, newStr, oldHeader, newHeader, options); - - var ret = []; - if (oldFileName == newFileName) { - ret.push('Index: ' + oldFileName); - } - ret.push('==================================================================='); - ret.push('--- ' + diff.oldFileName + (typeof diff.oldHeader === 'undefined' ? '' : '\t' + diff.oldHeader)); - ret.push('+++ ' + diff.newFileName + (typeof diff.newHeader === 'undefined' ? '' : '\t' + diff.newHeader)); - - for (var i = 0; i < diff.hunks.length; i++) { - var hunk = diff.hunks[i]; - ret.push('@@ -' + hunk.oldStart + ',' + hunk.oldLines + ' +' + hunk.newStart + ',' + hunk.newLines + ' @@'); - ret.push.apply(ret, hunk.lines); - } - - return ret.join('\n') + '\n'; - } - - function createPatch(fileName, oldStr, newStr, oldHeader, newHeader, options) { - return createTwoFilesPatch(fileName, fileName, oldStr, newStr, oldHeader, newHeader, options); - } - - }); - - unwrapExports$1(create); - var create_1 = create.structuredPatch; - var create_2 = create.createTwoFilesPatch; - var create_3 = create.createPatch; - - var array$4 = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports. /*istanbul ignore end*/arrayEqual = arrayEqual; - /*istanbul ignore start*/exports. /*istanbul ignore end*/arrayStartsWith = arrayStartsWith; - function arrayEqual(a, b) { - if (a.length !== b.length) { - return false; - } - - return arrayStartsWith(a, b); - } - - function arrayStartsWith(array, start) { - if (start.length > array.length) { - return false; - } - - for (var i = 0; i < start.length; i++) { - if (start[i] !== array[i]) { - return false; - } - } - - return true; - } - - }); - - unwrapExports$1(array$4); - var array_1$1 = array$4.arrayEqual; - var array_2$1 = array$4.arrayStartsWith; - - var merge_1 = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports. /*istanbul ignore end*/calcLineCount = calcLineCount; - /*istanbul ignore start*/exports. /*istanbul ignore end*/merge = merge; - - - - - - - - /*istanbul ignore start*/function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - - /*istanbul ignore end*/function calcLineCount(hunk) { - /*istanbul ignore start*/var _calcOldNewLineCount = /*istanbul ignore end*/calcOldNewLineCount(hunk.lines), - oldLines = _calcOldNewLineCount.oldLines, - newLines = _calcOldNewLineCount.newLines; - - if (oldLines !== undefined) { - hunk.oldLines = oldLines; - } else { - delete hunk.oldLines; - } - - if (newLines !== undefined) { - hunk.newLines = newLines; - } else { - delete hunk.newLines; - } - } - - function merge(mine, theirs, base) { - mine = loadPatch(mine, base); - theirs = loadPatch(theirs, base); - - var ret = {}; - - // For index we just let it pass through as it doesn't have any necessary meaning. - // Leaving sanity checks on this to the API consumer that may know more about the - // meaning in their own context. - if (mine.index || theirs.index) { - ret.index = mine.index || theirs.index; - } - - if (mine.newFileName || theirs.newFileName) { - if (!fileNameChanged(mine)) { - // No header or no change in ours, use theirs (and ours if theirs does not exist) - ret.oldFileName = theirs.oldFileName || mine.oldFileName; - ret.newFileName = theirs.newFileName || mine.newFileName; - ret.oldHeader = theirs.oldHeader || mine.oldHeader; - ret.newHeader = theirs.newHeader || mine.newHeader; - } else if (!fileNameChanged(theirs)) { - // No header or no change in theirs, use ours - ret.oldFileName = mine.oldFileName; - ret.newFileName = mine.newFileName; - ret.oldHeader = mine.oldHeader; - ret.newHeader = mine.newHeader; - } else { - // Both changed... figure it out - ret.oldFileName = selectField(ret, mine.oldFileName, theirs.oldFileName); - ret.newFileName = selectField(ret, mine.newFileName, theirs.newFileName); - ret.oldHeader = selectField(ret, mine.oldHeader, theirs.oldHeader); - ret.newHeader = selectField(ret, mine.newHeader, theirs.newHeader); - } - } - - ret.hunks = []; - - var mineIndex = 0, - theirsIndex = 0, - mineOffset = 0, - theirsOffset = 0; - - while (mineIndex < mine.hunks.length || theirsIndex < theirs.hunks.length) { - var mineCurrent = mine.hunks[mineIndex] || { oldStart: Infinity }, - theirsCurrent = theirs.hunks[theirsIndex] || { oldStart: Infinity }; - - if (hunkBefore(mineCurrent, theirsCurrent)) { - // This patch does not overlap with any of the others, yay. - ret.hunks.push(cloneHunk(mineCurrent, mineOffset)); - mineIndex++; - theirsOffset += mineCurrent.newLines - mineCurrent.oldLines; - } else if (hunkBefore(theirsCurrent, mineCurrent)) { - // This patch does not overlap with any of the others, yay. - ret.hunks.push(cloneHunk(theirsCurrent, theirsOffset)); - theirsIndex++; - mineOffset += theirsCurrent.newLines - theirsCurrent.oldLines; - } else { - // Overlap, merge as best we can - var mergedHunk = { - oldStart: Math.min(mineCurrent.oldStart, theirsCurrent.oldStart), - oldLines: 0, - newStart: Math.min(mineCurrent.newStart + mineOffset, theirsCurrent.oldStart + theirsOffset), - newLines: 0, - lines: [] - }; - mergeLines(mergedHunk, mineCurrent.oldStart, mineCurrent.lines, theirsCurrent.oldStart, theirsCurrent.lines); - theirsIndex++; - mineIndex++; - - ret.hunks.push(mergedHunk); - } - } - - return ret; - } - - function loadPatch(param, base) { - if (typeof param === 'string') { - if (/^@@/m.test(param) || /^Index:/m.test(param)) { - return (/*istanbul ignore start*/(0, parse.parsePatch) /*istanbul ignore end*/(param)[0] - ); - } - - if (!base) { - throw new Error('Must provide a base reference or pass in a patch'); - } - return (/*istanbul ignore start*/(0, create.structuredPatch) /*istanbul ignore end*/(undefined, undefined, base, param) - ); - } - - return param; - } - - function fileNameChanged(patch) { - return patch.newFileName && patch.newFileName !== patch.oldFileName; - } - - function selectField(index, mine, theirs) { - if (mine === theirs) { - return mine; - } else { - index.conflict = true; - return { mine: mine, theirs: theirs }; - } - } - - function hunkBefore(test, check) { - return test.oldStart < check.oldStart && test.oldStart + test.oldLines < check.oldStart; - } - - function cloneHunk(hunk, offset) { - return { - oldStart: hunk.oldStart, oldLines: hunk.oldLines, - newStart: hunk.newStart + offset, newLines: hunk.newLines, - lines: hunk.lines - }; - } - - function mergeLines(hunk, mineOffset, mineLines, theirOffset, theirLines) { - // This will generally result in a conflicted hunk, but there are cases where the context - // is the only overlap where we can successfully merge the content here. - var mine = { offset: mineOffset, lines: mineLines, index: 0 }, - their = { offset: theirOffset, lines: theirLines, index: 0 }; - - // Handle any leading content - insertLeading(hunk, mine, their); - insertLeading(hunk, their, mine); - - // Now in the overlap content. Scan through and select the best changes from each. - while (mine.index < mine.lines.length && their.index < their.lines.length) { - var mineCurrent = mine.lines[mine.index], - theirCurrent = their.lines[their.index]; - - if ((mineCurrent[0] === '-' || mineCurrent[0] === '+') && (theirCurrent[0] === '-' || theirCurrent[0] === '+')) { - // Both modified ... - mutualChange(hunk, mine, their); - } else if (mineCurrent[0] === '+' && theirCurrent[0] === ' ') { - /*istanbul ignore start*/var _hunk$lines; - - /*istanbul ignore end*/ // Mine inserted - /*istanbul ignore start*/(_hunk$lines = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(mine))); - } else if (theirCurrent[0] === '+' && mineCurrent[0] === ' ') { - /*istanbul ignore start*/var _hunk$lines2; - - /*istanbul ignore end*/ // Theirs inserted - /*istanbul ignore start*/(_hunk$lines2 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines2 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/collectChange(their))); - } else if (mineCurrent[0] === '-' && theirCurrent[0] === ' ') { - // Mine removed or edited - removal(hunk, mine, their); - } else if (theirCurrent[0] === '-' && mineCurrent[0] === ' ') { - // Their removed or edited - removal(hunk, their, mine, true); - } else if (mineCurrent === theirCurrent) { - // Context identity - hunk.lines.push(mineCurrent); - mine.index++; - their.index++; - } else { - // Context mismatch - conflict(hunk, collectChange(mine), collectChange(their)); - } - } - - // Now push anything that may be remaining - insertTrailing(hunk, mine); - insertTrailing(hunk, their); - - calcLineCount(hunk); - } - - function mutualChange(hunk, mine, their) { - var myChanges = collectChange(mine), - theirChanges = collectChange(their); - - if (allRemoves(myChanges) && allRemoves(theirChanges)) { - // Special case for remove changes that are supersets of one another - if ( /*istanbul ignore start*/(0, array$4.arrayStartsWith) /*istanbul ignore end*/(myChanges, theirChanges) && skipRemoveSuperset(their, myChanges, myChanges.length - theirChanges.length)) { - /*istanbul ignore start*/var _hunk$lines3; - - /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines3 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines3 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges)); - return; - } else if ( /*istanbul ignore start*/(0, array$4.arrayStartsWith) /*istanbul ignore end*/(theirChanges, myChanges) && skipRemoveSuperset(mine, theirChanges, theirChanges.length - myChanges.length)) { - /*istanbul ignore start*/var _hunk$lines4; - - /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines4 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines4 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges)); - return; - } - } else if ( /*istanbul ignore start*/(0, array$4.arrayEqual) /*istanbul ignore end*/(myChanges, theirChanges)) { - /*istanbul ignore start*/var _hunk$lines5; - - /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines5 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines5 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/myChanges)); - return; - } - - conflict(hunk, myChanges, theirChanges); - } - - function removal(hunk, mine, their, swap) { - var myChanges = collectChange(mine), - theirChanges = collectContext(their, myChanges); - if (theirChanges.merged) { - /*istanbul ignore start*/var _hunk$lines6; - - /*istanbul ignore end*/ /*istanbul ignore start*/(_hunk$lines6 = /*istanbul ignore end*/hunk.lines).push. /*istanbul ignore start*/apply /*istanbul ignore end*/( /*istanbul ignore start*/_hunk$lines6 /*istanbul ignore end*/, /*istanbul ignore start*/_toConsumableArray( /*istanbul ignore end*/theirChanges.merged)); - } else { - conflict(hunk, swap ? theirChanges : myChanges, swap ? myChanges : theirChanges); - } - } - - function conflict(hunk, mine, their) { - hunk.conflict = true; - hunk.lines.push({ - conflict: true, - mine: mine, - theirs: their - }); - } - - function insertLeading(hunk, insert, their) { - while (insert.offset < their.offset && insert.index < insert.lines.length) { - var line = insert.lines[insert.index++]; - hunk.lines.push(line); - insert.offset++; - } - } - function insertTrailing(hunk, insert) { - while (insert.index < insert.lines.length) { - var line = insert.lines[insert.index++]; - hunk.lines.push(line); - } - } - - function collectChange(state) { - var ret = [], - operation = state.lines[state.index][0]; - while (state.index < state.lines.length) { - var line = state.lines[state.index]; - - // Group additions that are immediately after subtractions and treat them as one "atomic" modify change. - if (operation === '-' && line[0] === '+') { - operation = '+'; - } - - if (operation === line[0]) { - ret.push(line); - state.index++; - } else { - break; - } - } - - return ret; - } - function collectContext(state, matchChanges) { - var changes = [], - merged = [], - matchIndex = 0, - contextChanges = false, - conflicted = false; - while (matchIndex < matchChanges.length && state.index < state.lines.length) { - var change = state.lines[state.index], - match = matchChanges[matchIndex]; - - // Once we've hit our add, then we are done - if (match[0] === '+') { - break; - } - - contextChanges = contextChanges || change[0] !== ' '; - - merged.push(match); - matchIndex++; - - // Consume any additions in the other block as a conflict to attempt - // to pull in the remaining context after this - if (change[0] === '+') { - conflicted = true; - - while (change[0] === '+') { - changes.push(change); - change = state.lines[++state.index]; - } - } - - if (match.substr(1) === change.substr(1)) { - changes.push(change); - state.index++; - } else { - conflicted = true; - } - } - - if ((matchChanges[matchIndex] || '')[0] === '+' && contextChanges) { - conflicted = true; - } - - if (conflicted) { - return changes; - } - - while (matchIndex < matchChanges.length) { - merged.push(matchChanges[matchIndex++]); - } - - return { - merged: merged, - changes: changes - }; - } - - function allRemoves(changes) { - return changes.reduce(function (prev, change) { - return prev && change[0] === '-'; - }, true); - } - function skipRemoveSuperset(state, removeChanges, delta) { - for (var i = 0; i < delta; i++) { - var changeContent = removeChanges[removeChanges.length - delta + i].substr(1); - if (state.lines[state.index + i] !== ' ' + changeContent) { - return false; - } - } - - state.index += delta; - return true; - } - - function calcOldNewLineCount(lines) { - var oldLines = 0; - var newLines = 0; - - lines.forEach(function (line) { - if (typeof line !== 'string') { - var myCount = calcOldNewLineCount(line.mine); - var theirCount = calcOldNewLineCount(line.theirs); - - if (oldLines !== undefined) { - if (myCount.oldLines === theirCount.oldLines) { - oldLines += myCount.oldLines; - } else { - oldLines = undefined; - } - } - - if (newLines !== undefined) { - if (myCount.newLines === theirCount.newLines) { - newLines += myCount.newLines; - } else { - newLines = undefined; - } - } - } else { - if (newLines !== undefined && (line[0] === '+' || line[0] === ' ')) { - newLines++; - } - if (oldLines !== undefined && (line[0] === '-' || line[0] === ' ')) { - oldLines++; - } - } - }); - - return { oldLines: oldLines, newLines: newLines }; - } - - }); - - unwrapExports$1(merge_1); - var merge_2 = merge_1.calcLineCount; - var merge_3 = merge_1.merge; - - var dmp = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports. /*istanbul ignore end*/convertChangesToDMP = convertChangesToDMP; - // See: http://code.google.com/p/google-diff-match-patch/wiki/API - function convertChangesToDMP(changes) { - var ret = [], - change = /*istanbul ignore start*/void 0 /*istanbul ignore end*/, - operation = /*istanbul ignore start*/void 0 /*istanbul ignore end*/; - for (var i = 0; i < changes.length; i++) { - change = changes[i]; - if (change.added) { - operation = 1; - } else if (change.removed) { - operation = -1; - } else { - operation = 0; - } - - ret.push([operation, change.value]); - } - return ret; - } - - }); - - unwrapExports$1(dmp); - var dmp_1 = dmp.convertChangesToDMP; - - var xml = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports. /*istanbul ignore end*/convertChangesToXML = convertChangesToXML; - function convertChangesToXML(changes) { - var ret = []; - for (var i = 0; i < changes.length; i++) { - var change = changes[i]; - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); - } - - ret.push(escapeHTML(change.value)); - - if (change.added) { - ret.push(''); - } else if (change.removed) { - ret.push(''); - } - } - return ret.join(''); - } - - function escapeHTML(s) { - var n = s; - n = n.replace(/&/g, '&'); - n = n.replace(//g, '>'); - n = n.replace(/"/g, '"'); - - return n; - } - - }); - - unwrapExports$1(xml); - var xml_1 = xml.convertChangesToXML; - - var lib$1 = createCommonjsModule$1(function (module, exports) { - - exports.__esModule = true; - exports.canonicalize = exports.convertChangesToXML = exports.convertChangesToDMP = exports.merge = exports.parsePatch = exports.applyPatches = exports.applyPatch = exports.createPatch = exports.createTwoFilesPatch = exports.structuredPatch = exports.diffArrays = exports.diffJson = exports.diffCss = exports.diffSentences = exports.diffTrimmedLines = exports.diffLines = exports.diffWordsWithSpace = exports.diffWords = exports.diffChars = exports.Diff = undefined; - - /*istanbul ignore end*/ - - /*istanbul ignore start*/var _base2 = _interopRequireDefault(base); - - /*istanbul ignore end*/ - - - - - - - - - - - - - - - - - - - - - - - - - - /*istanbul ignore start*/function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } - - /* See LICENSE file for terms of use */ - - /* - * Text diff implementation. - * - * This library supports the following APIS: - * JsDiff.diffChars: Character by character diff - * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace - * JsDiff.diffLines: Line based diff - * - * JsDiff.diffCss: Diff targeted at CSS content - * - * These methods are based on the implementation proposed in - * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). - * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 - */ - exports. /*istanbul ignore end*/Diff = _base2['default']; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffChars = character.diffChars; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffWords = word.diffWords; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffWordsWithSpace = word.diffWordsWithSpace; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffLines = line.diffLines; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffTrimmedLines = line.diffTrimmedLines; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffSentences = sentence.diffSentences; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffCss = css.diffCss; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffJson = json.diffJson; - /*istanbul ignore start*/exports. /*istanbul ignore end*/diffArrays = array$2.diffArrays; - /*istanbul ignore start*/exports. /*istanbul ignore end*/structuredPatch = create.structuredPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/createTwoFilesPatch = create.createTwoFilesPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/createPatch = create.createPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatch = apply$1.applyPatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/applyPatches = apply$1.applyPatches; - /*istanbul ignore start*/exports. /*istanbul ignore end*/parsePatch = parse.parsePatch; - /*istanbul ignore start*/exports. /*istanbul ignore end*/merge = merge_1.merge; - /*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToDMP = dmp.convertChangesToDMP; - /*istanbul ignore start*/exports. /*istanbul ignore end*/convertChangesToXML = xml.convertChangesToXML; - /*istanbul ignore start*/exports. /*istanbul ignore end*/canonicalize = json.canonicalize; - - }); - - unwrapExports$1(lib$1); - var lib_1$1 = lib$1.canonicalize; - var lib_2$1 = lib$1.convertChangesToXML; - var lib_3$1 = lib$1.convertChangesToDMP; - var lib_4$1 = lib$1.merge; - var lib_5$1 = lib$1.parsePatch; - var lib_6 = lib$1.applyPatches; - var lib_7 = lib$1.applyPatch; - var lib_8 = lib$1.createPatch; - var lib_9 = lib$1.createTwoFilesPatch; - var lib_10 = lib$1.structuredPatch; - var lib_11 = lib$1.diffArrays; - var lib_12 = lib$1.diffJson; - var lib_13 = lib$1.diffCss; - var lib_14 = lib$1.diffSentences; - var lib_15 = lib$1.diffTrimmedLines; - var lib_16 = lib$1.diffLines; - var lib_17 = lib$1.diffWordsWithSpace; - var lib_18 = lib$1.diffWords; - var lib_19 = lib$1.diffChars; - var lib_20 = lib$1.Diff; - - var arrayProto$6 = lib.prototypes.array; - - - - - - - var join$5 = arrayProto$6.join; - var map$2 = arrayProto$6.map; - var push$2 = arrayProto$6.push; - - function colorSinonMatchText(matcher, calledArg, calledArgMessage) { - var calledArgumentMessage = calledArgMessage; - if (!matcher.test(calledArg)) { - matcher.message = color.red(matcher.message); - if (calledArgumentMessage) { - calledArgumentMessage = color.green(calledArgumentMessage); - } - } - return calledArgumentMessage + " " + matcher.message; - } - - function colorDiffText(diff) { - var objects = map$2(diff, function(part) { - var text = part.value; - if (part.added) { - text = color.green(text); - } else if (part.removed) { - text = color.red(text); - } - if (diff.length === 2) { - text += " "; // format simple diffs - } - return text; - }); - return join$5(objects, ""); - } - - var spyFormatters = { - c: function(spyInstance) { - return timesInWords(spyInstance.callCount); - }, - - n: function(spyInstance) { - // eslint-disable-next-line local-rules/no-prototype-methods - return spyInstance.toString(); - }, - - D: function(spyInstance, args) { - var message = ""; - - for (var i = 0, l = spyInstance.callCount; i < l; ++i) { - // describe multiple calls - if (l > 1) { - message += "\nCall " + (i + 1) + ":"; - } - var calledArgs = spyInstance.getCall(i).args; - for (var j = 0; j < calledArgs.length || j < args.length; ++j) { - message += "\n"; - var calledArgMessage = j < calledArgs.length ? format_1(calledArgs[j]) : ""; - if (match_1$1.isMatcher(args[j])) { - message += colorSinonMatchText(args[j], calledArgs[j], calledArgMessage); - } else { - var expectedArgMessage = j < args.length ? format_1(args[j]) : ""; - var diff = lib$1.diffJson(calledArgMessage, expectedArgMessage); - message += colorDiffText(diff); - } - } - } - - return message; - }, - - C: function(spyInstance) { - var calls = []; - - for (var i = 0, l = spyInstance.callCount; i < l; ++i) { - // eslint-disable-next-line local-rules/no-prototype-methods - var stringifiedCall = " " + spyInstance.getCall(i).toString(); - if (/\n/.test(calls[i - 1])) { - stringifiedCall = "\n" + stringifiedCall; - } - push$2(calls, stringifiedCall); - } - - return calls.length > 0 ? "\n" + join$5(calls, "\n") : ""; - }, - - t: function(spyInstance) { - var objects = []; - - for (var i = 0, l = spyInstance.callCount; i < l; ++i) { - push$2(objects, format_1(spyInstance.thisValues[i])); - } - - return join$5(objects, ", "); - }, - - "*": function(spyInstance, args) { - return join$5( - map$2(args, function(arg) { - return format_1(arg); - }), - ", " - ); - } - }; - - var arrayProto$7 = lib.prototypes.array; - var createBehavior$1 = behavior.create; - - var functionName$5 = lib.functionName; - - - - var deepEqual$4 = deepEqual_1.use(match_1$1); - - - - - var valueToString$5 = lib.valueToString; - - /* cache references to library methods so that they also can be stubbed without problems */ - var concat$3 = arrayProto$7.concat; - var forEach$3 = arrayProto$7.forEach; - var pop = arrayProto$7.pop; - var push$3 = arrayProto$7.push; - var slice$4 = arrayProto$7.slice; - var filter$1 = Array.prototype.filter; - var ErrorConstructor = Error.prototype.constructor; - var bind = Function.prototype.bind; - - var callId = 0; - - function spy(object, property, types) { - var descriptor, methodDesc; - - if (isEsModule(object)) { - throw new TypeError("ES Modules cannot be spied"); - } - - if (!property && typeof object === "function") { - return spy.create(object); - } - - if (!object && !property) { - return spy.create(function() { - return; - }); - } - - if (!types) { - return wrapMethod(object, property, spy.create(object[property])); - } - - descriptor = {}; - methodDesc = getPropertyDescriptor(object, property); - - forEach$3(types, function(type) { - descriptor[type] = spy.create(methodDesc[type]); - }); - - return wrapMethod(object, property, descriptor); - } - - function incrementCallCount() { - this.called = true; - this.callCount += 1; - this.notCalled = false; - this.calledOnce = this.callCount === 1; - this.calledTwice = this.callCount === 2; - this.calledThrice = this.callCount === 3; - } - - function createCallProperties() { - this.firstCall = this.getCall(0); - this.secondCall = this.getCall(1); - this.thirdCall = this.getCall(2); - this.lastCall = this.getCall(this.callCount - 1); - } - - function createProxy(func, proxyLength) { - // Retain the function length: - var p; - if (proxyLength) { - // Do not change this to use an eval. Projects that depend on sinon block the use of eval. - // ref: https://github.com/sinonjs/sinon/issues/710 - switch (proxyLength) { - /*eslint-disable no-unused-vars, max-len*/ - case 1: - p = function proxy(a) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 2: - p = function proxy(a, b) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 3: - p = function proxy(a, b, c) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 4: - p = function proxy(a, b, c, d) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 5: - p = function proxy(a, b, c, d, e) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 6: - p = function proxy(a, b, c, d, e, f) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 7: - p = function proxy(a, b, c, d, e, f, g) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 8: - p = function proxy(a, b, c, d, e, f, g, h) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 9: - p = function proxy(a, b, c, d, e, f, g, h, i) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 10: - p = function proxy(a, b, c, d, e, f, g, h, i, j) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 11: - p = function proxy(a, b, c, d, e, f, g, h, i, j, k) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - case 12: - p = function proxy(a, b, c, d, e, f, g, h, i, j, k, l) { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - default: - p = function proxy() { - return p.invoke(func, this, slice$4(arguments)); - }; - break; - /*eslint-enable*/ - } - } else { - p = function proxy() { - return p.invoke(func, this, slice$4(arguments)); - }; - } - p.isSinonProxy = true; - return p; - } - - var uuid = 0; - - // Public API - var spyApi = { - formatters: spyFormatters, - - resetHistory: function() { - if (this.invoking) { - var err = new Error( - "Cannot reset Sinon function while invoking it. " + - "Move the call to .resetHistory outside of the callback." - ); - err.name = "InvalidResetException"; - throw err; - } - - this.called = false; - this.notCalled = true; - this.calledOnce = false; - this.calledTwice = false; - this.calledThrice = false; - this.callCount = 0; - this.firstCall = null; - this.secondCall = null; - this.thirdCall = null; - this.lastCall = null; - this.args = []; - this.returnValues = []; - this.thisValues = []; - this.exceptions = []; - this.callIds = []; - this.errorsWithCallStack = []; - if (this.fakes) { - forEach$3(this.fakes, function(fake) { - if (fake.resetHistory) { - fake.resetHistory(); - } else { - fake.reset(); - } - }); - } - - return this; - }, - - create: function create(func, spyLength) { - var name; - var funk = func; - - if (typeof funk !== "function") { - funk = function() { - return; - }; - } else { - name = functionName$5(funk); - } - - var length = spyLength || funk.length; - var proxy = createProxy(funk, length); - - extend(proxy, spy); - delete proxy.create; - extend(proxy, funk); - - proxy.resetHistory(); - proxy.prototype = funk.prototype; - proxy.displayName = name || "spy"; - proxy.toString = functionToString; - proxy.instantiateFake = spy.create; - proxy.id = "spy#" + uuid++; - - return proxy; - }, - - invoke: function invoke(func, thisValue, args) { - var matchings = this.matchingFakes(args); - var currentCallId = callId++; - var exception, returnValue; - - incrementCallCount.call(this); - push$3(this.thisValues, thisValue); - push$3(this.args, args); - push$3(this.callIds, currentCallId); - forEach$3(matchings, function(matching) { - incrementCallCount.call(matching); - push$3(matching.thisValues, thisValue); - push$3(matching.args, args); - push$3(matching.callIds, currentCallId); - }); - - // Make call properties available from within the spied function: - createCallProperties.call(this); - forEach$3(matchings, function(matching) { - createCallProperties.call(matching); - }); - - try { - this.invoking = true; - - var thisCall = this.getCall(this.callCount - 1); - - if (thisCall.calledWithNew()) { - // Call through with `new` - returnValue = new (bind.apply(this.func || func, concat$3([thisValue], args)))(); - - if (typeof returnValue !== "object") { - returnValue = thisValue; - } - } else { - returnValue = (this.func || func).apply(thisValue, args); - } - } catch (e) { - exception = e; - } finally { - delete this.invoking; - } - - push$3(this.exceptions, exception); - push$3(this.returnValues, returnValue); - forEach$3(matchings, function(matching) { - push$3(matching.exceptions, exception); - push$3(matching.returnValues, returnValue); - }); - - var err = new ErrorConstructor(); - // 1. Please do not get stack at this point. It may be so very slow, and not actually used - // 2. PhantomJS does not serialize the stack trace until the error has been thrown: - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack - try { - throw err; - } catch (e) { - /* empty */ - } - push$3(this.errorsWithCallStack, err); - forEach$3(matchings, function(matching) { - push$3(matching.errorsWithCallStack, err); - }); - - // Make return value and exception available in the calls: - createCallProperties.call(this); - forEach$3(matchings, function(matching) { - createCallProperties.call(matching); - }); - - if (exception !== undefined) { - throw exception; - } - - return returnValue; - }, - - named: function named(name) { - this.displayName = name; - return this; - }, - - getCall: function getCall(i) { - if (i < 0 || i >= this.callCount) { - return null; - } - - return call$1$1( - this, - this.thisValues[i], - this.args[i], - this.returnValues[i], - this.exceptions[i], - this.callIds[i], - this.errorsWithCallStack[i] - ); - }, - - getCalls: function() { - var calls = []; - var i; - - for (i = 0; i < this.callCount; i++) { - push$3(calls, this.getCall(i)); - } - - return calls; - }, - - calledBefore: function calledBefore(spyFn) { - if (!this.called) { - return false; - } - - if (!spyFn.called) { - return true; - } - - return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1]; - }, - - calledAfter: function calledAfter(spyFn) { - if (!this.called || !spyFn.called) { - return false; - } - - return this.callIds[this.callCount - 1] > spyFn.callIds[0]; - }, - - calledImmediatelyBefore: function calledImmediatelyBefore(spyFn) { - if (!this.called || !spyFn.called) { - return false; - } - - return this.callIds[this.callCount - 1] === spyFn.callIds[spyFn.callCount - 1] - 1; - }, - - calledImmediatelyAfter: function calledImmediatelyAfter(spyFn) { - if (!this.called || !spyFn.called) { - return false; - } - - return this.callIds[this.callCount - 1] === spyFn.callIds[spyFn.callCount - 1] + 1; - }, - - withArgs: function() { - var args = slice$4(arguments); - - if (this.fakes) { - var matching = pop(this.matchingFakes(args, true)); - - if (matching) { - return matching; - } - } else { - this.fakes = []; - } - - var original = this; - var fake = this.instantiateFake(); - fake.matchingArguments = args; - fake.parent = this; - push$3(this.fakes, fake); - - if (original.defaultBehavior && original.defaultBehavior.promiseLibrary) { - fake.defaultBehavior = fake.defaultBehavior || createBehavior$1(fake); - fake.defaultBehavior.promiseLibrary = original.defaultBehavior.promiseLibrary; - } - - fake.withArgs = function() { - return original.withArgs.apply(original, arguments); - }; - - forEach$3(original.args, function(arg, i) { - if (!fake.matches(arg)) { - return; - } - - incrementCallCount.call(fake); - push$3(fake.thisValues, original.thisValues[i]); - push$3(fake.args, arg); - push$3(fake.returnValues, original.returnValues[i]); - push$3(fake.exceptions, original.exceptions[i]); - push$3(fake.callIds, original.callIds[i]); - }); - - createCallProperties.call(fake); - - return fake; - }, - - matchingFakes: function(args, strict) { - return filter$1.call(this.fakes || [], function(fake) { - return fake.matches(args, strict); - }); - }, - - matches: function(args, strict) { - var margs = this.matchingArguments; - - if (margs.length <= args.length && deepEqual$4(margs, slice$4(args, 0, margs.length))) { - return !strict || margs.length === args.length; - } - - return undefined; - }, - - printf: function(format) { - var spyInstance = this; - var args = slice$4(arguments, 1); - var formatter; - - return (format || "").replace(/%(.)/g, function(match, specifyer) { - formatter = spyApi.formatters[specifyer]; - - if (typeof formatter === "function") { - return String(formatter(spyInstance, args)); - } else if (!isNaN(parseInt(specifyer, 10))) { - return format_1(args[specifyer - 1]); - } - - return "%" + specifyer; - }); - } - }; - - function delegateToCalls(method, matchAny, actual, returnsValues, notCalled, totalCallCount) { - spyApi[method] = function() { - if (!this.called) { - if (notCalled) { - return notCalled.apply(this, arguments); - } - return false; - } - - if (totalCallCount !== undefined && this.callCount !== totalCallCount) { - return false; - } - - var currentCall; - var matches = 0; - var returnValues = []; - - for (var i = 0, l = this.callCount; i < l; i += 1) { - currentCall = this.getCall(i); - var returnValue = currentCall[actual || method].apply(currentCall, arguments); - push$3(returnValues, returnValue); - if (returnValue) { - matches += 1; - - if (matchAny) { - return true; - } - } - } - - if (returnsValues) { - return returnValues; - } - return matches === this.callCount; - }; - } - - delegateToCalls("calledOn", true); - delegateToCalls("alwaysCalledOn", false, "calledOn"); - delegateToCalls("calledWith", true); - delegateToCalls("calledOnceWith", true, "calledWith", false, undefined, 1); - delegateToCalls("calledWithMatch", true); - delegateToCalls("alwaysCalledWith", false, "calledWith"); - delegateToCalls("alwaysCalledWithMatch", false, "calledWithMatch"); - delegateToCalls("calledWithExactly", true); - delegateToCalls("calledOnceWithExactly", true, "calledWithExactly", false, undefined, 1); - delegateToCalls("alwaysCalledWithExactly", false, "calledWithExactly"); - delegateToCalls("neverCalledWith", false, "notCalledWith", false, function() { - return true; - }); - delegateToCalls("neverCalledWithMatch", false, "notCalledWithMatch", false, function() { - return true; - }); - delegateToCalls("threw", true); - delegateToCalls("alwaysThrew", false, "threw"); - delegateToCalls("returned", true); - delegateToCalls("alwaysReturned", false, "returned"); - delegateToCalls("calledWithNew", true); - delegateToCalls("alwaysCalledWithNew", false, "calledWithNew"); - /* eslint-disable local-rules/no-prototype-methods */ - delegateToCalls("callArg", false, "callArgWith", true, function() { - throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); - }); - spyApi.callArgWith = spyApi.callArg; - delegateToCalls("callArgOn", false, "callArgOnWith", true, function() { - throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); - }); - spyApi.callArgOnWith = spyApi.callArgOn; - delegateToCalls("throwArg", false, "throwArg", false, function() { - throw new Error(this.toString() + " cannot throw arg since it was not yet invoked."); - }); - delegateToCalls("yield", false, "yield", true, function() { - throw new Error(this.toString() + " cannot yield since it was not yet invoked."); - }); - // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode. - spyApi.invokeCallback = spyApi.yield; - delegateToCalls("yieldOn", false, "yieldOn", true, function() { - throw new Error(this.toString() + " cannot yield since it was not yet invoked."); - }); - delegateToCalls("yieldTo", false, "yieldTo", true, function(property) { - throw new Error( - this.toString() + " cannot yield to '" + valueToString$5(property) + "' since it was not yet invoked." - ); - }); - delegateToCalls("yieldToOn", false, "yieldToOn", true, function(property) { - throw new Error( - this.toString() + " cannot yield to '" + valueToString$5(property) + "' since it was not yet invoked." - ); - }); - /* eslint-enable local-rules/no-prototype-methods */ - - extend(spy, spyApi); - spy.spyCall = call$1$1; - var spy_1 = spy; - - var defaultBehaviors = createCommonjsModule$1(function (module) { - - var arrayProto = lib.prototypes.array; - - - var forEach = arrayProto.forEach; - var slice = arrayProto.slice; - - var useLeftMostCallback = -1; - var useRightMostCallback = -2; - - function throwsException(fake, error, message) { - if (typeof error === "function") { - fake.exceptionCreator = error; - } else if (typeof error === "string") { - fake.exceptionCreator = function() { - var newException = new Error(message || ""); - newException.name = error; - return newException; - }; - } else if (!error) { - fake.exceptionCreator = function() { - return new Error("Error"); - }; - } else { - fake.exception = error; - } - } - - module.exports = { - callsFake: function callsFake(fake, fn) { - fake.fakeFn = fn; - }, - - callsArg: function callsArg(fake, index) { - if (typeof index !== "number") { - throw new TypeError("argument index is not number"); - } - - fake.callArgAt = index; - fake.callbackArguments = []; - fake.callbackContext = undefined; - fake.callArgProp = undefined; - fake.callbackAsync = false; - }, - - callsArgOn: function callsArgOn(fake, index, context) { - if (typeof index !== "number") { - throw new TypeError("argument index is not number"); - } - - fake.callArgAt = index; - fake.callbackArguments = []; - fake.callbackContext = context; - fake.callArgProp = undefined; - fake.callbackAsync = false; - }, - - callsArgWith: function callsArgWith(fake, index) { - if (typeof index !== "number") { - throw new TypeError("argument index is not number"); - } - - fake.callArgAt = index; - fake.callbackArguments = slice(arguments, 2); - fake.callbackContext = undefined; - fake.callArgProp = undefined; - fake.callbackAsync = false; - }, - - callsArgOnWith: function callsArgWith(fake, index, context) { - if (typeof index !== "number") { - throw new TypeError("argument index is not number"); - } - - fake.callArgAt = index; - fake.callbackArguments = slice(arguments, 3); - fake.callbackContext = context; - fake.callArgProp = undefined; - fake.callbackAsync = false; - }, - - usingPromise: function usingPromise(fake, promiseLibrary) { - fake.promiseLibrary = promiseLibrary; - }, - - yields: function(fake) { - fake.callArgAt = useLeftMostCallback; - fake.callbackArguments = slice(arguments, 1); - fake.callbackContext = undefined; - fake.callArgProp = undefined; - fake.callbackAsync = false; - }, - - yieldsRight: function(fake) { - fake.callArgAt = useRightMostCallback; - fake.callbackArguments = slice(arguments, 1); - fake.callbackContext = undefined; - fake.callArgProp = undefined; - fake.callbackAsync = false; - }, - - yieldsOn: function(fake, context) { - fake.callArgAt = useLeftMostCallback; - fake.callbackArguments = slice(arguments, 2); - fake.callbackContext = context; - fake.callArgProp = undefined; - fake.callbackAsync = false; - }, - - yieldsTo: function(fake, prop) { - fake.callArgAt = useLeftMostCallback; - fake.callbackArguments = slice(arguments, 2); - fake.callbackContext = undefined; - fake.callArgProp = prop; - fake.callbackAsync = false; - }, - - yieldsToOn: function(fake, prop, context) { - fake.callArgAt = useLeftMostCallback; - fake.callbackArguments = slice(arguments, 3); - fake.callbackContext = context; - fake.callArgProp = prop; - fake.callbackAsync = false; - }, - - throws: throwsException, - throwsException: throwsException, - - returns: function returns(fake, value) { - fake.returnValue = value; - fake.resolve = false; - fake.reject = false; - fake.returnValueDefined = true; - fake.exception = undefined; - fake.exceptionCreator = undefined; - fake.fakeFn = undefined; - }, - - returnsArg: function returnsArg(fake, index) { - if (typeof index !== "number") { - throw new TypeError("argument index is not number"); - } - - fake.returnArgAt = index; - }, - - throwsArg: function throwsArg(fake, index) { - if (typeof index !== "number") { - throw new TypeError("argument index is not number"); - } - - fake.throwArgAt = index; - }, - - returnsThis: function returnsThis(fake) { - fake.returnThis = true; - }, - - resolves: function resolves(fake, value) { - fake.returnValue = value; - fake.resolve = true; - fake.resolveThis = false; - fake.reject = false; - fake.returnValueDefined = true; - fake.exception = undefined; - fake.exceptionCreator = undefined; - fake.fakeFn = undefined; - }, - - resolvesArg: function resolvesArg(fake, index) { - if (typeof index !== "number") { - throw new TypeError("argument index is not number"); - } - fake.resolveArgAt = index; - fake.returnValue = undefined; - fake.resolve = true; - fake.resolveThis = false; - fake.reject = false; - fake.returnValueDefined = false; - fake.exception = undefined; - fake.exceptionCreator = undefined; - fake.fakeFn = undefined; - }, - - rejects: function rejects(fake, error, message) { - var reason; - if (typeof error === "string") { - reason = new Error(message || ""); - reason.name = error; - } else if (!error) { - reason = new Error("Error"); - } else { - reason = error; - } - fake.returnValue = reason; - fake.resolve = false; - fake.resolveThis = false; - fake.reject = true; - fake.returnValueDefined = true; - fake.exception = undefined; - fake.exceptionCreator = undefined; - fake.fakeFn = undefined; - - return fake; - }, - - resolvesThis: function resolvesThis(fake) { - fake.returnValue = undefined; - fake.resolve = false; - fake.resolveThis = true; - fake.reject = false; - fake.returnValueDefined = false; - fake.exception = undefined; - fake.exceptionCreator = undefined; - fake.fakeFn = undefined; - }, - - callThrough: function callThrough(fake) { - fake.callsThrough = true; - }, - - get: function get(fake, getterFunction) { - var rootStub = fake.stub || fake; - - Object.defineProperty(rootStub.rootObj, rootStub.propName, { - get: getterFunction, - configurable: isPropertyConfigurable_1(rootStub.rootObj, rootStub.propName) - }); - - return fake; - }, - - set: function set(fake, setterFunction) { - var rootStub = fake.stub || fake; - - Object.defineProperty( - rootStub.rootObj, - rootStub.propName, - // eslint-disable-next-line accessor-pairs - { - set: setterFunction, - configurable: isPropertyConfigurable_1(rootStub.rootObj, rootStub.propName) - } - ); - - return fake; - }, - - value: function value(fake, newVal) { - var rootStub = fake.stub || fake; - - Object.defineProperty(rootStub.rootObj, rootStub.propName, { - value: newVal, - enumerable: true, - configurable: isPropertyConfigurable_1(rootStub.rootObj, rootStub.propName) - }); - - return fake; - } - }; - - function createAsyncVersion(syncFnName) { - return function() { - var result = module.exports[syncFnName].apply(this, arguments); - this.callbackAsync = true; - return result; - }; - } - - // create asynchronous versions of callsArg* and yields* methods - forEach(Object.keys(module.exports), function(method) { - // need to avoid creating anotherasync versions of the newly added async methods - if (method.match(/^(callsArg|yields)/) && !method.match(/Async/)) { - module.exports[method + "Async"] = createAsyncVersion(method); - } - }); - }); - var defaultBehaviors_1 = defaultBehaviors.callsFake; - var defaultBehaviors_2 = defaultBehaviors.callsArg; - var defaultBehaviors_3 = defaultBehaviors.callsArgOn; - var defaultBehaviors_4 = defaultBehaviors.callsArgWith; - var defaultBehaviors_5 = defaultBehaviors.callsArgOnWith; - var defaultBehaviors_6 = defaultBehaviors.usingPromise; - var defaultBehaviors_7 = defaultBehaviors.yields; - var defaultBehaviors_8 = defaultBehaviors.yieldsRight; - var defaultBehaviors_9 = defaultBehaviors.yieldsOn; - var defaultBehaviors_10 = defaultBehaviors.yieldsTo; - var defaultBehaviors_11 = defaultBehaviors.yieldsToOn; - var defaultBehaviors_12 = defaultBehaviors.throwsException; - var defaultBehaviors_13 = defaultBehaviors.returns; - var defaultBehaviors_14 = defaultBehaviors.returnsArg; - var defaultBehaviors_15 = defaultBehaviors.throwsArg; - var defaultBehaviors_16 = defaultBehaviors.returnsThis; - var defaultBehaviors_17 = defaultBehaviors.resolves; - var defaultBehaviors_18 = defaultBehaviors.resolvesArg; - var defaultBehaviors_19 = defaultBehaviors.rejects; - var defaultBehaviors_20 = defaultBehaviors.resolvesThis; - var defaultBehaviors_21 = defaultBehaviors.callThrough; - var defaultBehaviors_22 = defaultBehaviors.get; - var defaultBehaviors_23 = defaultBehaviors.set; - var defaultBehaviors_24 = defaultBehaviors.value; - - function stubEntireObject(stub, object) { - walk(object || {}, function(prop, propOwner) { - // we don't want to stub things like toString(), valueOf(), etc. so we only stub if the object - // is not Object.prototype - if ( - propOwner !== Object.prototype && - prop !== "constructor" && - typeof getPropertyDescriptor(propOwner, prop).value === "function" - ) { - stub(object, prop); - } - }); - - return object; - } - - var stubEntireObject_1 = stubEntireObject; - - var valueToString$6 = lib.valueToString; - - function throwOnFalsyObject(object, property) { - if (property && !object) { - var type = object === null ? "null" : "undefined"; - throw new Error("Trying to stub property '" + valueToString$6(property) + "' of " + type); - } - } - - var throwOnFalsyObject_1 = throwOnFalsyObject; - - var arrayProto$8 = lib.prototypes.array; - - - var hasOwnProperty$7 = lib.prototypes.object.hasOwnProperty; - - - - - - - - - - var valueToString$7 = lib.valueToString; - - var forEach$4 = arrayProto$8.forEach; - var pop$1 = arrayProto$8.pop; - var slice$5 = arrayProto$8.slice; - var sort$1 = arrayProto$8.sort; - - function stub(object, property) { - if (arguments.length > 2) { - throw new TypeError("stub(obj, 'meth', fn) has been removed, see documentation"); - } - - if (isEsModule(object)) { - throw new TypeError("ES Modules cannot be stubbed"); - } - - throwOnFalsyObject_1.apply(null, arguments); - - if (isNonExistentOwnProperty_1(object, property)) { - throw new TypeError("Cannot stub non-existent own property " + valueToString$7(property)); - } - - var actualDescriptor = getPropertyDescriptor(object, property); - var isStubbingEntireObject = typeof property === "undefined" && typeof object === "object"; - var isCreatingNewStub = !object && typeof property === "undefined"; - var isStubbingNonFuncProperty = - (typeof object === "object" || typeof object === "function") && - typeof property !== "undefined" && - (typeof actualDescriptor === "undefined" || typeof actualDescriptor.value !== "function") && - typeof descriptor === "undefined"; - var isStubbingExistingMethod = - typeof object === "object" && - typeof actualDescriptor !== "undefined" && - typeof actualDescriptor.value === "function"; - var arity = isStubbingExistingMethod ? object[property].length : 0; - - if (isStubbingEntireObject) { - return stubEntireObject_1(stub, object); - } - - if (isCreatingNewStub) { - return stub.create(); - } - - var s = stub.create(arity); - s.rootObj = object; - s.propName = property; - s.restore = function restore() { - if (actualDescriptor !== undefined) { - Object.defineProperty(object, property, actualDescriptor); - return; - } - - delete object[property]; - }; - - return isStubbingNonFuncProperty ? s : wrapMethod(object, property, s); - } - - stub.createStubInstance = function(constructor, overrides) { - if (typeof constructor !== "function") { - throw new TypeError("The constructor should be a function."); - } - - var stubbedObject = stub(Object.create(constructor.prototype)); - - forEach$4(Object.keys(overrides || {}), function(propertyName) { - if (propertyName in stubbedObject) { - var value = overrides[propertyName]; - if (value.createStubInstance) { - stubbedObject[propertyName] = value; - } else { - stubbedObject[propertyName].returns(value); - } - } else { - throw new Error("Cannot stub " + propertyName + ". Property does not exist!"); - } - }); - return stubbedObject; - }; - - /*eslint-disable no-use-before-define*/ - function getParentBehaviour(stubInstance) { - return stubInstance.parent && getCurrentBehavior(stubInstance.parent); - } - - function getDefaultBehavior(stubInstance) { - return stubInstance.defaultBehavior || getParentBehaviour(stubInstance) || behavior.create(stubInstance); - } - - function getCurrentBehavior(stubInstance) { - var currentBehavior = stubInstance.behaviors[stubInstance.callCount - 1]; - return currentBehavior && currentBehavior.isPresent() ? currentBehavior : getDefaultBehavior(stubInstance); - } - /*eslint-enable no-use-before-define*/ - - var uuid$1 = 0; - - var proto$1 = { - create: function create(stubLength) { - var functionStub = function() { - var args = slice$5(arguments); - var matchings = functionStub.matchingFakes(args); - - var fnStub = - pop$1( - sort$1(matchings, function(a, b) { - return a.matchingArguments.length - b.matchingArguments.length; - }) - ) || functionStub; - return getCurrentBehavior(fnStub).invoke(this, arguments); - }; - - var orig = functionStub; - functionStub = spy_1.create(functionStub, stubLength); - functionStub.id = "stub#" + uuid$1++; - functionStub.func = orig; - - extend(functionStub, stub); - functionStub.instantiateFake = stub.create; - functionStub.displayName = "stub"; - functionStub.toString = functionToString; - - functionStub.defaultBehavior = null; - functionStub.behaviors = []; - - return functionStub; - }, - - resetBehavior: function() { - var fakes = this.fakes || []; - - this.defaultBehavior = null; - this.behaviors = []; - - delete this.returnValue; - delete this.returnArgAt; - delete this.throwArgAt; - delete this.resolveArgAt; - delete this.fakeFn; - this.returnThis = false; - this.resolveThis = false; - - forEach$4(fakes, function(fake) { - fake.resetBehavior(); - }); - }, - - resetHistory: spy_1.resetHistory, - - reset: function() { - this.resetHistory(); - this.resetBehavior(); - }, - - onCall: function onCall(index) { - if (!this.behaviors[index]) { - this.behaviors[index] = behavior.create(this); - } - - return this.behaviors[index]; - }, - - onFirstCall: function onFirstCall() { - return this.onCall(0); - }, - - onSecondCall: function onSecondCall() { - return this.onCall(1); - }, - - onThirdCall: function onThirdCall() { - return this.onCall(2); - } - }; - - forEach$4(Object.keys(behavior), function(method) { - if ( - hasOwnProperty$7(behavior, method) && - !hasOwnProperty$7(proto$1, method) && - method !== "create" && - method !== "withArgs" && - method !== "invoke" - ) { - proto$1[method] = behavior.createBehavior(method); - } - }); - - forEach$4(Object.keys(defaultBehaviors), function(method) { - if (hasOwnProperty$7(defaultBehaviors, method) && !hasOwnProperty$7(proto$1, method)) { - behavior.addBehavior(stub, method, defaultBehaviors[method]); - } - }); - - extend(stub, proto$1); - var stub_1 = stub; - - var arrayProto$9 = lib.prototypes.array; - var spyInvoke = spy_1.invoke; - var spyCallToString = call$1$1.toString; - - - - - - var deepEqual$5 = deepEqual_1.use(match_1$1); - - var valueToString$8 = lib.valueToString; - - var every$5 = arrayProto$9.every; - var forEach$5 = arrayProto$9.forEach; - var push$4 = arrayProto$9.push; - var slice$6 = arrayProto$9.slice; - - function callCountInWords(callCount) { - if (callCount === 0) { - return "never called"; - } - - return "called " + timesInWords(callCount); - } - - function expectedCallCountInWords(expectation) { - var min = expectation.minCalls; - var max = expectation.maxCalls; - - if (typeof min === "number" && typeof max === "number") { - var str = timesInWords(min); - - if (min !== max) { - str = "at least " + str + " and at most " + timesInWords(max); - } - - return str; - } - - if (typeof min === "number") { - return "at least " + timesInWords(min); - } - - return "at most " + timesInWords(max); - } - - function receivedMinCalls(expectation) { - var hasMinLimit = typeof expectation.minCalls === "number"; - return !hasMinLimit || expectation.callCount >= expectation.minCalls; - } - - function receivedMaxCalls(expectation) { - if (typeof expectation.maxCalls !== "number") { - return false; - } - - return expectation.callCount === expectation.maxCalls; - } - - function verifyMatcher(possibleMatcher, arg) { - var isMatcher = match_1$1 && match_1$1.isMatcher(possibleMatcher); - - return (isMatcher && possibleMatcher.test(arg)) || true; - } - - var mockExpectation = { - minCalls: 1, - maxCalls: 1, - - create: function create(methodName) { - var expectation = extend(stub_1.create(), mockExpectation); - delete expectation.create; - expectation.method = methodName; - - return expectation; - }, - - invoke: function invoke(func, thisValue, args) { - this.verifyCallAllowed(thisValue, args); - - return spyInvoke.apply(this, arguments); - }, - - atLeast: function atLeast(num) { - if (typeof num !== "number") { - throw new TypeError("'" + valueToString$8(num) + "' is not number"); - } - - if (!this.limitsSet) { - this.maxCalls = null; - this.limitsSet = true; - } - - this.minCalls = num; - - return this; - }, - - atMost: function atMost(num) { - if (typeof num !== "number") { - throw new TypeError("'" + valueToString$8(num) + "' is not number"); - } - - if (!this.limitsSet) { - this.minCalls = null; - this.limitsSet = true; - } - - this.maxCalls = num; - - return this; - }, - - never: function never() { - return this.exactly(0); - }, - - once: function once() { - return this.exactly(1); - }, - - twice: function twice() { - return this.exactly(2); - }, - - thrice: function thrice() { - return this.exactly(3); - }, - - exactly: function exactly(num) { - if (typeof num !== "number") { - throw new TypeError("'" + valueToString$8(num) + "' is not a number"); - } - - this.atLeast(num); - return this.atMost(num); - }, - - met: function met() { - return !this.failed && receivedMinCalls(this); - }, - - verifyCallAllowed: function verifyCallAllowed(thisValue, args) { - var expectedArguments = this.expectedArguments; - - if (receivedMaxCalls(this)) { - this.failed = true; - mockExpectation.fail(this.method + " already called " + timesInWords(this.maxCalls)); - } - - if ("expectedThis" in this && this.expectedThis !== thisValue) { - mockExpectation.fail( - this.method + - " called with " + - valueToString$8(thisValue) + - " as thisValue, expected " + - valueToString$8(this.expectedThis) - ); - } - - if (!("expectedArguments" in this)) { - return; - } - - if (!args) { - mockExpectation.fail(this.method + " received no arguments, expected " + format_1(expectedArguments)); - } - - if (args.length < expectedArguments.length) { - mockExpectation.fail( - this.method + - " received too few arguments (" + - format_1(args) + - "), expected " + - format_1(expectedArguments) - ); - } - - if (this.expectsExactArgCount && args.length !== expectedArguments.length) { - mockExpectation.fail( - this.method + - " received too many arguments (" + - format_1(args) + - "), expected " + - format_1(expectedArguments) - ); - } - - forEach$5( - expectedArguments, - function(expectedArgument, i) { - if (!verifyMatcher(expectedArgument, args[i])) { - mockExpectation.fail( - this.method + - " received wrong arguments " + - format_1(args) + - ", didn't match " + - String(expectedArguments) - ); - } - - if (!deepEqual$5(expectedArgument, args[i])) { - mockExpectation.fail( - this.method + - " received wrong arguments " + - format_1(args) + - ", expected " + - format_1(expectedArguments) - ); - } - }, - this - ); - }, - - allowsCall: function allowsCall(thisValue, args) { - var expectedArguments = this.expectedArguments; - - if (this.met() && receivedMaxCalls(this)) { - return false; - } - - if ("expectedThis" in this && this.expectedThis !== thisValue) { - return false; - } - - if (!("expectedArguments" in this)) { - return true; - } - - // eslint-disable-next-line no-underscore-dangle - var _args = args || []; - - if (_args.length < expectedArguments.length) { - return false; - } - - if (this.expectsExactArgCount && _args.length !== expectedArguments.length) { - return false; - } - - return every$5(expectedArguments, function(expectedArgument, i) { - if (!verifyMatcher(expectedArgument, _args[i])) { - return false; - } - - if (!deepEqual$5(expectedArgument, _args[i])) { - return false; - } - - return true; - }); - }, - - withArgs: function withArgs() { - this.expectedArguments = slice$6(arguments); - return this; - }, - - withExactArgs: function withExactArgs() { - this.withArgs.apply(this, arguments); - this.expectsExactArgCount = true; - return this; - }, - - on: function on(thisValue) { - this.expectedThis = thisValue; - return this; - }, - - toString: function() { - var args = slice$6(this.expectedArguments || []); - - if (!this.expectsExactArgCount) { - push$4(args, "[...]"); - } - - var callStr = spyCallToString.call({ - proxy: this.method || "anonymous mock expectation", - args: args - }); - - var message = callStr.replace(", [...", "[, ...") + " " + expectedCallCountInWords(this); - - if (this.met()) { - return "Expectation met: " + message; - } - - return "Expected " + message + " (" + callCountInWords(this.callCount) + ")"; - }, - - verify: function verify() { - if (!this.met()) { - mockExpectation.fail(String(this)); - } else { - mockExpectation.pass(String(this)); - } - - return true; - }, - - pass: function pass(message) { - assert_1.pass(message); - }, - - fail: function fail(message) { - var exception = new Error(message); - exception.name = "ExpectationError"; - - throw exception; - } - }; - - var mockExpectation_1 = mockExpectation; - - var forEach$6 = Array.prototype.forEach; - - function usePromiseLibrary(library, fakes) { - if (typeof library === "undefined") { - return; - } - - if (Array.isArray(fakes)) { - forEach$6.call(fakes, usePromiseLibrary.bind(null, library)); - - return; - } - - if (typeof fakes.usingPromise === "function") { - fakes.usingPromise(library); - } - } - - var usePromiseLibrary_1 = usePromiseLibrary; - - var arrayProto$a = lib.prototypes.array; - - var spyCallToString$1 = call$1$1.toString; - - - var deepEqual$6 = deepEqual_1.use(match_1$1); - - - - var concat$4 = arrayProto$a.concat; - var filter$2 = arrayProto$a.filter; - var forEach$7 = arrayProto$a.forEach; - var every$6 = arrayProto$a.every; - var join$6 = arrayProto$a.join; - var push$5 = arrayProto$a.push; - var slice$7 = arrayProto$a.slice; - var unshift = arrayProto$a.unshift; - - function mock(object) { - if (!object || typeof object === "string") { - return mockExpectation_1.create(object ? object : "Anonymous mock"); - } - - return mock.create(object); - } - - function each(collection, callback) { - var col = collection || []; - - forEach$7(col, callback); - } - - function arrayEquals(arr1, arr2, compareLength) { - if (compareLength && arr1.length !== arr2.length) { - return false; - } - - return every$6(arr1, function(element, i) { - return deepEqual$6(element, arr2[i]); - }); - } - - extend(mock, { - create: function create(object) { - if (!object) { - throw new TypeError("object is null"); - } - - var mockObject = extend({}, mock); - mockObject.object = object; - delete mockObject.create; - - return mockObject; - }, - - expects: function expects(method) { - if (!method) { - throw new TypeError("method is falsy"); - } - - if (!this.expectations) { - this.expectations = {}; - this.proxies = []; - this.failures = []; - } - - if (!this.expectations[method]) { - this.expectations[method] = []; - var mockObject = this; - - wrapMethod(this.object, method, function() { - return mockObject.invokeMethod(method, this, arguments); - }); - - push$5(this.proxies, method); - } - - var expectation = mockExpectation_1.create(method); - extend(expectation, this.object[method]); - push$5(this.expectations[method], expectation); - usePromiseLibrary_1(this.promiseLibrary, expectation); - - return expectation; - }, - - restore: function restore() { - var object = this.object; - - each(this.proxies, function(proxy) { - if (typeof object[proxy].restore === "function") { - object[proxy].restore(); - } - }); - }, - - verify: function verify() { - var expectations = this.expectations || {}; - var messages = this.failures ? slice$7(this.failures) : []; - var met = []; - - each(this.proxies, function(proxy) { - each(expectations[proxy], function(expectation) { - if (!expectation.met()) { - push$5(messages, String(expectation)); - } else { - push$5(met, String(expectation)); - } - }); - }); - - this.restore(); - - if (messages.length > 0) { - mockExpectation_1.fail(join$6(concat$4(messages, met), "\n")); - } else if (met.length > 0) { - mockExpectation_1.pass(join$6(concat$4(messages, met), "\n")); - } - - return true; - }, - - usingPromise: function usingPromise(promiseLibrary) { - this.promiseLibrary = promiseLibrary; - - return this; - }, - - invokeMethod: function invokeMethod(method, thisValue, args) { - /* if we cannot find any matching files we will explicitly call mockExpection#fail with error messages */ - /* eslint consistent-return: "off" */ - var expectations = this.expectations && this.expectations[method] ? this.expectations[method] : []; - var currentArgs = args || []; - var available; - - var expectationsWithMatchingArgs = filter$2(expectations, function(expectation) { - var expectedArgs = expectation.expectedArguments || []; - - return arrayEquals(expectedArgs, currentArgs, expectation.expectsExactArgCount); - }); - - var expectationsToApply = filter$2(expectationsWithMatchingArgs, function(expectation) { - return !expectation.met() && expectation.allowsCall(thisValue, args); - }); - - if (expectationsToApply.length > 0) { - return expectationsToApply[0].apply(thisValue, args); - } - - var messages = []; - var exhausted = 0; - - forEach$7(expectationsWithMatchingArgs, function(expectation) { - if (expectation.allowsCall(thisValue, args)) { - available = available || expectation; - } else { - exhausted += 1; - } - }); - - if (available && exhausted === 0) { - return available.apply(thisValue, args); - } - - forEach$7(expectations, function(expectation) { - push$5(messages, " " + String(expectation)); - }); - - unshift( - messages, - "Unexpected call: " + - spyCallToString$1.call({ - proxy: method, - args: args - }) - ); - - var err = new Error(); - if (!err.stack) { - // PhantomJS does not serialize the stack trace until the error has been thrown - try { - throw err; - } catch (e) { - /* empty */ - } - } - push$5( - this.failures, - "Unexpected call: " + - spyCallToString$1.call({ - proxy: method, - args: args, - stack: err.stack - }) - ); - - mockExpectation_1.fail(join$6(messages, "\n")); - } - }); - - var mock_1 = mock; - - var arrayProto$b = lib.prototypes.array; - - - - var forEach$8 = arrayProto$b.forEach; - var slice$8 = arrayProto$b.slice; - - function getError(value) { - return value instanceof Error ? value : new Error(value); - } - - function cleanProxy(f) { - var undesirableProperties = [ - "instantiateFake", - "callArg", - "callArgOn", - "callArgOnWith", - "callArgWith", - "invokeCallback", - "throwArg", - "withArgs", - "yield", - "yieldOn", - "yieldTo", - "yieldToOn" - ]; - - forEach$8(undesirableProperties, function(key) { - delete f[key]; - }); - - return f; - } - - var uuid$2 = 0; - function wrapFunc(f) { - var fakeInstance = function() { - var lastArg = (arguments.length > 0 && arguments[arguments.length - 1]) || undefined; - var callback = lastArg && typeof lastArg === "function" ? lastArg : undefined; - - /* eslint-disable no-use-before-define */ - p.lastArg = lastArg; - p.callback = callback; - /* eslint-enable no-use-before-define */ - - return f && f.apply(this, arguments); - }; - var p = cleanProxy(spy_1(fakeInstance)); - - p.displayName = "fake"; - p.id = "fake#" + uuid$2++; - - return p; - } - - function fake(f) { - if (arguments.length > 0 && typeof f !== "function") { - throw new TypeError("Expected f argument to be a Function"); - } - - return wrapFunc(f); - } - - fake.returns = function returns(value) { - function f() { - return value; - } - - return wrapFunc(f); - }; - - fake.throws = function throws(value) { - function f() { - throw getError(value); - } - - return wrapFunc(f); - }; - - fake.resolves = function resolves(value) { - function f() { - return Promise.resolve(value); - } - - return wrapFunc(f); - }; - - fake.rejects = function rejects(value) { - function f() { - return Promise.reject(getError(value)); - } - - return wrapFunc(f); - }; - - function yieldInternal(async, values) { - function f() { - var callback = arguments[arguments.length - 1]; - if (typeof callback !== "function") { - throw new TypeError("Expected last argument to be a function"); - } - if (async) { - nextTick$1(function() { - callback.apply(null, values); - }); - } else { - callback.apply(null, values); - } - } - - return wrapFunc(f); - } - - fake.yields = function yields() { - return yieldInternal(false, slice$8(arguments)); - }; - - fake.yieldsAsync = function yieldsAsync() { - return yieldInternal(true, slice$8(arguments)); - }; - - var fake_1 = fake; - - var nise = createCommonjsModule$1(function (module, exports) { - (function(f){{module.exports=f();}})(function(){return (function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof commonjsRequire$1=="function"&&commonjsRequire$1;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r);}return n[o].exports}var i=typeof commonjsRequire$1=="function"&&commonjsRequire$1;for(var o=0;o {}, { - // get once() { supportsOnce = true; } - // }); - var options = flattenOptions(providedOptions); - - // 2. If callback is null, then return. - if (listener == null) { - return; - } - - this.eventListeners = this.eventListeners || {}; - this.eventListeners[event] = this.eventListeners[event] || []; - - // 4. If context object’s associated list of event listener - // does not contain an event listener whose type is type, - // callback is callback, and capture is capture, then append - // a new event listener to it, whose type is type, callback is - // callback, capture is capture, passive is passive, and once is once. - if (!this.eventListeners[event].some(hasListenerFilter(listener, options.capture))) { - this.eventListeners[event].push({ - listener: listener, - capture: options.capture, - once: options.once - }); - } - }, - - // https://dom.spec.whatwg.org/#dom-eventtarget-removeeventlistener - removeEventListener: function removeEventListener(event, listener, providedOptions) { - if (!this.eventListeners || !this.eventListeners[event]) { - return; - } - - // 2. Let capture be the result of flattening options. - var options = flattenOptions(providedOptions); - - // 3. If there is an event listener in the associated list of - // event listeners whose type is type, callback is callback, - // and capture is capture, then set that event listener’s - // removed to true and remove it from the associated list of event listeners. - this.eventListeners[event] = this.eventListeners[event] - .filter(not(hasListenerFilter(listener, options.capture))); - }, - - dispatchEvent: function dispatchEvent(event) { - if (!this.eventListeners || !this.eventListeners[event.type]) { - return Boolean(event.defaultPrevented); - } - - var self = this; - var type = event.type; - var listeners = self.eventListeners[type]; - - // Remove listeners, that should be dispatched once - // before running dispatch loop to avoid nested dispatch issues - self.eventListeners[type] = listeners.filter(function (listenerSpec) { - return !listenerSpec.once; - }); - listeners.forEach(function (listenerSpec) { - var listener = listenerSpec.listener; - if (typeof listener === "function") { - listener.call(self, event); - } else { - listener.handleEvent(event); - } - }); - - return Boolean(event.defaultPrevented); - } - }; - - module.exports = EventTarget; - - },{}],4:[function(require,module,exports){ - - function Event(type, bubbles, cancelable, target) { - this.initEvent(type, bubbles, cancelable, target); - } - - Event.prototype = { - initEvent: function (type, bubbles, cancelable, target) { - this.type = type; - this.bubbles = bubbles; - this.cancelable = cancelable; - this.target = target; - this.currentTarget = target; - }, - - stopPropagation: function () {}, - - preventDefault: function () { - this.defaultPrevented = true; - } - }; - - module.exports = Event; - - },{}],5:[function(require,module,exports){ - - module.exports = { - Event: require("./event"), - ProgressEvent: require("./progress-event"), - CustomEvent: require("./custom-event"), - EventTarget: require("./event-target") - }; - - },{"./custom-event":2,"./event":4,"./event-target":3,"./progress-event":6}],6:[function(require,module,exports){ - - var Event = require("./event"); - - function ProgressEvent(type, progressEventRaw, target) { - this.initEvent(type, false, false, target); - this.loaded = typeof progressEventRaw.loaded === "number" ? progressEventRaw.loaded : null; - this.total = typeof progressEventRaw.total === "number" ? progressEventRaw.total : null; - this.lengthComputable = !!progressEventRaw.total; - } - - ProgressEvent.prototype = new Event(); - - ProgressEvent.prototype.constructor = ProgressEvent; - - module.exports = ProgressEvent; - - },{"./event":4}],7:[function(require,module,exports){ - - var lolex = require("lolex"); - var fakeServer = require("./index"); - - function Server() {} - Server.prototype = fakeServer; - - var fakeServerWithClock = new Server(); - - fakeServerWithClock.addRequest = function addRequest(xhr) { - if (xhr.async) { - if (typeof setTimeout.clock === "object") { - this.clock = setTimeout.clock; - } else { - this.clock = lolex.install(); - this.resetClock = true; - } - - if (!this.longestTimeout) { - var clockSetTimeout = this.clock.setTimeout; - var clockSetInterval = this.clock.setInterval; - var server = this; - - this.clock.setTimeout = function (fn, timeout) { - server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); - - return clockSetTimeout.apply(this, arguments); - }; - - this.clock.setInterval = function (fn, timeout) { - server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); - - return clockSetInterval.apply(this, arguments); - }; - } - } - - return fakeServer.addRequest.call(this, xhr); - }; - - fakeServerWithClock.respond = function respond() { - var returnVal = fakeServer.respond.apply(this, arguments); - - if (this.clock) { - this.clock.tick(this.longestTimeout || 0); - this.longestTimeout = 0; - - if (this.resetClock) { - this.clock.uninstall(); - this.resetClock = false; - } - } - - return returnVal; - }; - - fakeServerWithClock.restore = function restore() { - if (this.clock) { - this.clock.uninstall(); - } - - return fakeServer.restore.apply(this, arguments); - }; - - module.exports = fakeServerWithClock; - - },{"./index":9,"lolex":32}],8:[function(require,module,exports){ - - var formatio = require("@sinonjs/formatio"); - - var formatter = formatio.configure({ - quoteStrings: false, - limitChildrenCount: 250 - }); - - module.exports = function format() { - return formatter.ascii.apply(formatter, arguments); - }; - - },{"@sinonjs/formatio":13}],9:[function(require,module,exports){ - - var fakeXhr = require("../fake-xhr"); - var push = [].push; - var format = require("./format"); - var configureLogError = require("../configure-logger"); - var pathToRegexp = require("path-to-regexp"); - - var supportsArrayBuffer = typeof ArrayBuffer !== "undefined"; - - function responseArray(handler) { - var response = handler; - - if (Object.prototype.toString.call(handler) !== "[object Array]") { - response = [200, {}, handler]; - } - - if (typeof response[2] !== "string") { - if (!supportsArrayBuffer) { - throw new TypeError("Fake server response body should be a string, but was " + - typeof response[2]); - } - else if (!(response[2] instanceof ArrayBuffer)) { - throw new TypeError("Fake server response body should be a string or ArrayBuffer, but was " + - typeof response[2]); - } - } - - return response; - } - - function getDefaultWindowLocation() { - return { "host": "localhost", "protocol": "http" }; - } - - function getWindowLocation() { - if (typeof window === "undefined") { - // Fallback - return getDefaultWindowLocation(); - } - - if (typeof window.location !== "undefined") { - // Browsers place location on window - return window.location; - } - - if ((typeof window.window !== "undefined") && (typeof window.window.location !== "undefined")) { - // React Native on Android places location on window.window - return window.window.location; - } - - return getDefaultWindowLocation(); - } - - function matchOne(response, reqMethod, reqUrl) { - var rmeth = response.method; - var matchMethod = !rmeth || rmeth.toLowerCase() === reqMethod.toLowerCase(); - var url = response.url; - var matchUrl = !url || url === reqUrl || (typeof url.test === "function" && url.test(reqUrl)); - - return matchMethod && matchUrl; - } - - function match(response, request) { - var wloc = getWindowLocation(); - - var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host); - - var requestUrl = request.url; - - if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) { - requestUrl = requestUrl.replace(rCurrLoc, ""); - } - - if (matchOne(response, this.getHTTPMethod(request), requestUrl)) { - if (typeof response.response === "function") { - var ru = response.url; - var args = [request].concat(ru && typeof ru.exec === "function" ? ru.exec(requestUrl).slice(1) : []); - return response.response.apply(response, args); - } - - return true; - } - - return false; - } - - function incrementRequestCount() { - var count = ++this.requestCount; - - this.requested = true; - - this.requestedOnce = count === 1; - this.requestedTwice = count === 2; - this.requestedThrice = count === 3; - - this.firstRequest = this.getRequest(0); - this.secondRequest = this.getRequest(1); - this.thirdRequest = this.getRequest(2); - - this.lastRequest = this.getRequest(count - 1); - } - - var fakeServer = { - create: function (config) { - var server = Object.create(this); - server.configure(config); - this.xhr = fakeXhr.useFakeXMLHttpRequest(); - server.requests = []; - server.requestCount = 0; - server.queue = []; - server.responses = []; - - - this.xhr.onCreate = function (xhrObj) { - xhrObj.unsafeHeadersEnabled = function () { - return !(server.unsafeHeadersEnabled === false); - }; - server.addRequest(xhrObj); - }; - - return server; - }, - - configure: function (config) { - var self = this; - var whitelist = { - "autoRespond": true, - "autoRespondAfter": true, - "respondImmediately": true, - "fakeHTTPMethods": true, - "logger": true, - "unsafeHeadersEnabled": true - }; - - config = config || {}; - - Object.keys(config).forEach(function (setting) { - if (setting in whitelist) { - self[setting] = config[setting]; - } - }); - - self.logError = configureLogError(config); - }, - - addRequest: function addRequest(xhrObj) { - var server = this; - push.call(this.requests, xhrObj); - - incrementRequestCount.call(this); - - xhrObj.onSend = function () { - server.handleRequest(this); - - if (server.respondImmediately) { - server.respond(); - } else if (server.autoRespond && !server.responding) { - setTimeout(function () { - server.responding = false; - server.respond(); - }, server.autoRespondAfter || 10); - - server.responding = true; - } - }; - }, - - getHTTPMethod: function getHTTPMethod(request) { - if (this.fakeHTTPMethods && /post/i.test(request.method)) { - var matches = (request.requestBody || "").match(/_method=([^\b;]+)/); - return matches ? matches[1] : request.method; - } - - return request.method; - }, - - handleRequest: function handleRequest(xhr) { - if (xhr.async) { - push.call(this.queue, xhr); - } else { - this.processRequest(xhr); - } - }, - - logger: function () { - // no-op; override via configure() - }, - - logError: configureLogError({}), - - log: function log(response, request) { - var str; - - str = "Request:\n" + format(request) + "\n\n"; - str += "Response:\n" + format(response) + "\n\n"; - - if (typeof this.logger === "function") { - this.logger(str); - } - }, - - respondWith: function respondWith(method, url, body) { - if (arguments.length === 1 && typeof method !== "function") { - this.response = responseArray(method); - return; - } - - if (arguments.length === 1) { - body = method; - url = method = null; - } - - if (arguments.length === 2) { - body = url; - url = method; - method = null; - } - - push.call(this.responses, { - method: method, - url: typeof url === "string" && url !== "" ? pathToRegexp(url) : url, - response: typeof body === "function" ? body : responseArray(body) - }); - }, - - respond: function respond() { - if (arguments.length > 0) { - this.respondWith.apply(this, arguments); - } - - var queue = this.queue || []; - var requests = queue.splice(0, queue.length); - var self = this; - - requests.forEach(function (request) { - self.processRequest(request); - }); - }, - - processRequest: function processRequest(request) { - try { - if (request.aborted) { - return; - } - - var response = this.response || [404, {}, ""]; - - if (this.responses) { - for (var l = this.responses.length, i = l - 1; i >= 0; i--) { - if (match.call(this, this.responses[i], request)) { - response = this.responses[i].response; - break; - } - } - } - - if (request.readyState !== 4) { - this.log(response, request); - - request.respond(response[0], response[1], response[2]); - } - } catch (e) { - this.logError("Fake server request processing", e); - } - }, - - restore: function restore() { - return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments); - }, - - getRequest: function getRequest(index) { - return this.requests[index] || null; - }, - - reset: function reset() { - this.resetBehavior(); - this.resetHistory(); - }, - - resetBehavior: function resetBehavior() { - this.responses.length = this.queue.length = 0; - }, - - resetHistory: function resetHistory() { - this.requests.length = this.requestCount = 0; - - this.requestedOnce = this.requestedTwice = this.requestedThrice = this.requested = false; - - this.firstRequest = this.secondRequest = this.thirdRequest = this.lastRequest = null; - } - }; - - module.exports = fakeServer; - - },{"../configure-logger":1,"../fake-xhr":11,"./format":8,"path-to-regexp":33}],10:[function(require,module,exports){ - - exports.isSupported = (function () { - try { - return !!new Blob(); - } catch (e) { - return false; - } - }()); - - },{}],11:[function(require,module,exports){ - (function (global){ - - var TextEncoder = require("text-encoding").TextEncoder; - - var configureLogError = require("../configure-logger"); - var sinonEvent = require("../event"); - var extend = require("just-extend"); - - function getWorkingXHR(globalScope) { - var supportsXHR = typeof globalScope.XMLHttpRequest !== "undefined"; - if (supportsXHR) { - return globalScope.XMLHttpRequest; - } - - var supportsActiveX = typeof globalScope.ActiveXObject !== "undefined"; - if (supportsActiveX) { - return function () { - return new globalScope.ActiveXObject("MSXML2.XMLHTTP.3.0"); - }; - } - - return false; - } - - var supportsProgress = typeof ProgressEvent !== "undefined"; - var supportsCustomEvent = typeof CustomEvent !== "undefined"; - var supportsFormData = typeof FormData !== "undefined"; - var supportsArrayBuffer = typeof ArrayBuffer !== "undefined"; - var supportsBlob = require("./blob").isSupported; - var isReactNative = global.navigator && global.navigator.product === "ReactNative"; - var sinonXhr = { XMLHttpRequest: global.XMLHttpRequest }; - sinonXhr.GlobalXMLHttpRequest = global.XMLHttpRequest; - sinonXhr.GlobalActiveXObject = global.ActiveXObject; - sinonXhr.supportsActiveX = typeof sinonXhr.GlobalActiveXObject !== "undefined"; - sinonXhr.supportsXHR = typeof sinonXhr.GlobalXMLHttpRequest !== "undefined"; - sinonXhr.workingXHR = getWorkingXHR(global); - sinonXhr.supportsTimeout = - (sinonXhr.supportsXHR && "timeout" in (new sinonXhr.GlobalXMLHttpRequest())); - sinonXhr.supportsCORS = isReactNative || - (sinonXhr.supportsXHR && "withCredentials" in (new sinonXhr.GlobalXMLHttpRequest())); - - // Ref: https://fetch.spec.whatwg.org/#forbidden-header-name - var unsafeHeaders = { - "Accept-Charset": true, - "Access-Control-Request-Headers": true, - "Access-Control-Request-Method": true, - "Accept-Encoding": true, - "Connection": true, - "Content-Length": true, - "Cookie": true, - "Cookie2": true, - "Content-Transfer-Encoding": true, - "Date": true, - "DNT": true, - "Expect": true, - "Host": true, - "Keep-Alive": true, - "Origin": true, - "Referer": true, - "TE": true, - "Trailer": true, - "Transfer-Encoding": true, - "Upgrade": true, - "User-Agent": true, - "Via": true - }; - - - function EventTargetHandler() { - var self = this; - var events = ["loadstart", "progress", "abort", "error", "load", "timeout", "loadend"]; - - function addEventListener(eventName) { - self.addEventListener(eventName, function (event) { - var listener = self["on" + eventName]; - - if (listener && typeof listener === "function") { - listener.call(this, event); - } - }); - } - - events.forEach(addEventListener); - } - - EventTargetHandler.prototype = sinonEvent.EventTarget; - - // Note that for FakeXMLHttpRequest to work pre ES5 - // we lose some of the alignment with the spec. - // To ensure as close a match as possible, - // set responseType before calling open, send or respond; - function FakeXMLHttpRequest(config) { - EventTargetHandler.call(this); - this.readyState = FakeXMLHttpRequest.UNSENT; - this.requestHeaders = {}; - this.requestBody = null; - this.status = 0; - this.statusText = ""; - this.upload = new EventTargetHandler(); - this.responseType = ""; - this.response = ""; - this.logError = configureLogError(config); - - if (sinonXhr.supportsTimeout) { - this.timeout = 0; - } - - if (sinonXhr.supportsCORS) { - this.withCredentials = false; - } - - if (typeof FakeXMLHttpRequest.onCreate === "function") { - FakeXMLHttpRequest.onCreate(this); - } - } - - function verifyState(xhr) { - if (xhr.readyState !== FakeXMLHttpRequest.OPENED) { - throw new Error("INVALID_STATE_ERR"); - } - - if (xhr.sendFlag) { - throw new Error("INVALID_STATE_ERR"); - } - } - - function normalizeHeaderValue(value) { - // Ref: https://fetch.spec.whatwg.org/#http-whitespace-bytes - /*eslint no-control-regex: "off"*/ - return value.replace(/^[\x09\x0A\x0D\x20]+|[\x09\x0A\x0D\x20]+$/g, ""); - } - - function getHeader(headers, header) { - var foundHeader = Object.keys(headers).filter(function (h) { - return h.toLowerCase() === header.toLowerCase(); - }); - - return foundHeader[0] || null; - } - - function excludeSetCookie2Header(header) { - return !/^Set-Cookie2?$/i.test(header); - } - - // largest arity in XHR is 5 - XHR#open - var apply = function (obj, method, args) { - switch (args.length) { - case 0: return obj[method](); - case 1: return obj[method](args[0]); - case 2: return obj[method](args[0], args[1]); - case 3: return obj[method](args[0], args[1], args[2]); - case 4: return obj[method](args[0], args[1], args[2], args[3]); - case 5: return obj[method](args[0], args[1], args[2], args[3], args[4]); - default: throw new Error("Unhandled case"); - } - }; - - FakeXMLHttpRequest.filters = []; - FakeXMLHttpRequest.addFilter = function addFilter(fn) { - this.filters.push(fn); - }; - FakeXMLHttpRequest.defake = function defake(fakeXhr, xhrArgs) { - var xhr = new sinonXhr.workingXHR(); // eslint-disable-line new-cap - - [ - "open", - "setRequestHeader", - "abort", - "getResponseHeader", - "getAllResponseHeaders", - "addEventListener", - "overrideMimeType", - "removeEventListener" - ].forEach(function (method) { - fakeXhr[method] = function () { - return apply(xhr, method, arguments); - }; - }); - - fakeXhr.send = function () { - // Ref: https://xhr.spec.whatwg.org/#the-responsetype-attribute - if (xhr.responseType !== fakeXhr.responseType) { - xhr.responseType = fakeXhr.responseType; - } - return apply(xhr, "send", arguments); - }; - - var copyAttrs = function (args) { - args.forEach(function (attr) { - fakeXhr[attr] = xhr[attr]; - }); - }; - - var stateChangeStart = function () { - fakeXhr.readyState = xhr.readyState; - if (xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) { - copyAttrs(["status", "statusText"]); - } - if (xhr.readyState >= FakeXMLHttpRequest.LOADING) { - copyAttrs(["response"]); - if (xhr.responseType === "" || xhr.responseType === "text") { - copyAttrs(["responseText"]); - } - } - if ( - xhr.readyState === FakeXMLHttpRequest.DONE && - (xhr.responseType === "" || xhr.responseType === "document") - ) { - copyAttrs(["responseXML"]); - } - }; - - var stateChangeEnd = function () { - if (fakeXhr.onreadystatechange) { - fakeXhr.onreadystatechange.call(fakeXhr, { target: fakeXhr, currentTarget: fakeXhr }); - } - }; - - var stateChange = function stateChange() { - stateChangeStart(); - stateChangeEnd(); - }; - - if (xhr.addEventListener) { - xhr.addEventListener("readystatechange", stateChangeStart); - - Object.keys(fakeXhr.eventListeners).forEach(function (event) { - /*eslint-disable no-loop-func*/ - fakeXhr.eventListeners[event].forEach(function (handler) { - xhr.addEventListener(event, handler.listener, { - capture: handler.capture, - once: handler.once - }); - }); - /*eslint-enable no-loop-func*/ - }); - - xhr.addEventListener("readystatechange", stateChangeEnd); - } else { - xhr.onreadystatechange = stateChange; - } - apply(xhr, "open", xhrArgs); - }; - FakeXMLHttpRequest.useFilters = false; - - function verifyRequestOpened(xhr) { - if (xhr.readyState !== FakeXMLHttpRequest.OPENED) { - throw new Error("INVALID_STATE_ERR - " + xhr.readyState); - } - } - - function verifyRequestSent(xhr) { - if (xhr.readyState === FakeXMLHttpRequest.DONE) { - throw new Error("Request done"); - } - } - - function verifyHeadersReceived(xhr) { - if (xhr.async && xhr.readyState !== FakeXMLHttpRequest.HEADERS_RECEIVED) { - throw new Error("No headers received"); - } - } - - function verifyResponseBodyType(body, responseType) { - var error = null; - var isString = typeof body === "string"; - - if (responseType === "arraybuffer") { - - if (!isString && !(body instanceof ArrayBuffer)) { - error = new Error("Attempted to respond to fake XMLHttpRequest with " + - body + ", which is not a string or ArrayBuffer."); - error.name = "InvalidBodyException"; - } - } - else if (!isString) { - error = new Error("Attempted to respond to fake XMLHttpRequest with " + - body + ", which is not a string."); - error.name = "InvalidBodyException"; - } - - if (error) { - throw error; - } - } - - function convertToArrayBuffer(body, encoding) { - if (body instanceof ArrayBuffer) { - return body; - } - - return new TextEncoder(encoding || "utf-8").encode(body).buffer; - } - - function isXmlContentType(contentType) { - return !contentType || /(text\/xml)|(application\/xml)|(\+xml)/.test(contentType); - } - - function convertResponseBody(responseType, contentType, body) { - if (responseType === "" || responseType === "text") { - return body; - } else if (supportsArrayBuffer && responseType === "arraybuffer") { - return convertToArrayBuffer(body); - } else if (responseType === "json") { - try { - return JSON.parse(body); - } catch (e) { - // Return parsing failure as null - return null; - } - } else if (supportsBlob && responseType === "blob") { - var blobOptions = {}; - if (contentType) { - blobOptions.type = contentType; - } - return new Blob([convertToArrayBuffer(body)], blobOptions); - } else if (responseType === "document") { - if (isXmlContentType(contentType)) { - return FakeXMLHttpRequest.parseXML(body); - } - return null; - } - throw new Error("Invalid responseType " + responseType); - } - - function clearResponse(xhr) { - if (xhr.responseType === "" || xhr.responseType === "text") { - xhr.response = xhr.responseText = ""; - } else { - xhr.response = xhr.responseText = null; - } - xhr.responseXML = null; - } - - /** - * Steps to follow when there is an error, according to: - * https://xhr.spec.whatwg.org/#request-error-steps - */ - function requestErrorSteps(xhr) { - clearResponse(xhr); - xhr.errorFlag = true; - xhr.requestHeaders = {}; - xhr.responseHeaders = {}; - - if (xhr.readyState !== FakeXMLHttpRequest.UNSENT && xhr.sendFlag - && xhr.readyState !== FakeXMLHttpRequest.DONE) { - xhr.readyStateChange(FakeXMLHttpRequest.DONE); - xhr.sendFlag = false; - } - } - - FakeXMLHttpRequest.parseXML = function parseXML(text) { - // Treat empty string as parsing failure - if (text !== "") { - try { - if (typeof DOMParser !== "undefined") { - var parser = new DOMParser(); - var parsererrorNS = ""; - - try { - var parsererrors = parser - .parseFromString("INVALID", "text/xml") - .getElementsByTagName("parsererror"); - if (parsererrors.length) { - parsererrorNS = parsererrors[0].namespaceURI; - } - } catch (e) { - // passing invalid XML makes IE11 throw - // so no namespace needs to be determined - } - - var result; - try { - result = parser.parseFromString(text, "text/xml"); - } catch (err) { - return null; - } - - return result.getElementsByTagNameNS(parsererrorNS, "parsererror").length - ? null : result; - } - var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.async = "false"; - xmlDoc.loadXML(text); - return xmlDoc.parseError.errorCode !== 0 - ? null : xmlDoc; - } catch (e) { - // Unable to parse XML - no biggie - } - } - - return null; - }; - - FakeXMLHttpRequest.statusCodes = { - 100: "Continue", - 101: "Switching Protocols", - 200: "OK", - 201: "Created", - 202: "Accepted", - 203: "Non-Authoritative Information", - 204: "No Content", - 205: "Reset Content", - 206: "Partial Content", - 207: "Multi-Status", - 300: "Multiple Choice", - 301: "Moved Permanently", - 302: "Found", - 303: "See Other", - 304: "Not Modified", - 305: "Use Proxy", - 307: "Temporary Redirect", - 400: "Bad Request", - 401: "Unauthorized", - 402: "Payment Required", - 403: "Forbidden", - 404: "Not Found", - 405: "Method Not Allowed", - 406: "Not Acceptable", - 407: "Proxy Authentication Required", - 408: "Request Timeout", - 409: "Conflict", - 410: "Gone", - 411: "Length Required", - 412: "Precondition Failed", - 413: "Request Entity Too Large", - 414: "Request-URI Too Long", - 415: "Unsupported Media Type", - 416: "Requested Range Not Satisfiable", - 417: "Expectation Failed", - 422: "Unprocessable Entity", - 500: "Internal Server Error", - 501: "Not Implemented", - 502: "Bad Gateway", - 503: "Service Unavailable", - 504: "Gateway Timeout", - 505: "HTTP Version Not Supported" - }; - - extend(FakeXMLHttpRequest.prototype, sinonEvent.EventTarget, { - async: true, - - open: function open(method, url, async, username, password) { - this.method = method; - this.url = url; - this.async = typeof async === "boolean" ? async : true; - this.username = username; - this.password = password; - clearResponse(this); - this.requestHeaders = {}; - this.sendFlag = false; - - if (FakeXMLHttpRequest.useFilters === true) { - var xhrArgs = arguments; - var defake = FakeXMLHttpRequest.filters.some(function (filter) { - return filter.apply(this, xhrArgs); - }); - if (defake) { - FakeXMLHttpRequest.defake(this, arguments); - return; - } - } - this.readyStateChange(FakeXMLHttpRequest.OPENED); - }, - - readyStateChange: function readyStateChange(state) { - this.readyState = state; - - var readyStateChangeEvent = new sinonEvent.Event("readystatechange", false, false, this); - var event, progress; - - if (typeof this.onreadystatechange === "function") { - try { - this.onreadystatechange(readyStateChangeEvent); - } catch (e) { - this.logError("Fake XHR onreadystatechange handler", e); - } - } - - if (this.readyState === FakeXMLHttpRequest.DONE) { - if (this.timedOut || this.aborted || this.status === 0) { - progress = {loaded: 0, total: 0}; - event = (this.timedOut && "timeout") || (this.aborted && "abort") || "error"; - } else { - progress = {loaded: 100, total: 100}; - event = "load"; - } - - if (supportsProgress) { - this.upload.dispatchEvent(new sinonEvent.ProgressEvent("progress", progress, this)); - this.upload.dispatchEvent(new sinonEvent.ProgressEvent(event, progress, this)); - this.upload.dispatchEvent(new sinonEvent.ProgressEvent("loadend", progress, this)); - } - - this.dispatchEvent(new sinonEvent.ProgressEvent("progress", progress, this)); - this.dispatchEvent(new sinonEvent.ProgressEvent(event, progress, this)); - this.dispatchEvent(new sinonEvent.ProgressEvent("loadend", progress, this)); - } - - this.dispatchEvent(readyStateChangeEvent); - }, - - // Ref https://xhr.spec.whatwg.org/#the-setrequestheader()-method - setRequestHeader: function setRequestHeader(header, value) { - if (typeof value !== "string") { - throw new TypeError("By RFC7230, section 3.2.4, header values should be strings. Got " + typeof value); - } - verifyState(this); - - var checkUnsafeHeaders = true; - if (typeof this.unsafeHeadersEnabled === "function") { - checkUnsafeHeaders = this.unsafeHeadersEnabled(); - } - - if (checkUnsafeHeaders && (getHeader(unsafeHeaders, header) !== null || /^(Sec-|Proxy-)/i.test(header))) { - throw new Error("Refused to set unsafe header \"" + header + "\""); - } - - value = normalizeHeaderValue(value); - - var existingHeader = getHeader(this.requestHeaders, header); - if (existingHeader) { - this.requestHeaders[existingHeader] += ", " + value; - } else { - this.requestHeaders[header] = value; - } - }, - - setStatus: function setStatus(status) { - var sanitizedStatus = typeof status === "number" ? status : 200; - - verifyRequestOpened(this); - this.status = sanitizedStatus; - this.statusText = FakeXMLHttpRequest.statusCodes[sanitizedStatus]; - }, - - // Helps testing - setResponseHeaders: function setResponseHeaders(headers) { - verifyRequestOpened(this); - - var responseHeaders = this.responseHeaders = {}; - - Object.keys(headers).forEach(function (header) { - responseHeaders[header] = headers[header]; - }); - - if (this.async) { - this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED); - } else { - this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED; - } - }, - - // Currently treats ALL data as a DOMString (i.e. no Document) - send: function send(data) { - verifyState(this); - - if (!/^(head)$/i.test(this.method)) { - var contentType = getHeader(this.requestHeaders, "Content-Type"); - if (this.requestHeaders[contentType]) { - var value = this.requestHeaders[contentType].split(";"); - this.requestHeaders[contentType] = value[0] + ";charset=utf-8"; - } else if (supportsFormData && !(data instanceof FormData)) { - this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8"; - } - - this.requestBody = data; - } - - this.errorFlag = false; - this.sendFlag = this.async; - clearResponse(this); - this.readyStateChange(FakeXMLHttpRequest.OPENED); - - if (typeof this.onSend === "function") { - this.onSend(this); - } - - // Only listen if setInterval and Date are a stubbed. - if (sinonXhr.supportsTimeout && typeof setInterval.clock === "object" && typeof Date.clock === "object") { - var initiatedTime = Date.now(); - var self = this; - - // Listen to any possible tick by fake timers and check to see if timeout has - // been exceeded. It's important to note that timeout can be changed while a request - // is in flight, so we must check anytime the end user forces a clock tick to make - // sure timeout hasn't changed. - // https://xhr.spec.whatwg.org/#dfnReturnLink-2 - var clearIntervalId = setInterval(function () { - // Check if the readyState has been reset or is done. If this is the case, there - // should be no timeout. This will also prevent aborted requests and - // fakeServerWithClock from triggering unnecessary responses. - if (self.readyState === FakeXMLHttpRequest.UNSENT - || self.readyState === FakeXMLHttpRequest.DONE) { - clearInterval(clearIntervalId); - } else if (typeof self.timeout === "number" && self.timeout > 0) { - if (Date.now() >= (initiatedTime + self.timeout)) { - self.triggerTimeout(); - clearInterval(clearIntervalId); - } - } - }, 1); - } - - this.dispatchEvent(new sinonEvent.Event("loadstart", false, false, this)); - }, - - abort: function abort() { - this.aborted = true; - requestErrorSteps(this); - this.readyState = FakeXMLHttpRequest.UNSENT; - }, - - error: function () { - clearResponse(this); - this.errorFlag = true; - this.requestHeaders = {}; - this.responseHeaders = {}; - - this.readyStateChange(FakeXMLHttpRequest.DONE); - }, - - triggerTimeout: function triggerTimeout() { - if (sinonXhr.supportsTimeout) { - this.timedOut = true; - requestErrorSteps(this); - } - }, - - getResponseHeader: function getResponseHeader(header) { - if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { - return null; - } - - if (/^Set-Cookie2?$/i.test(header)) { - return null; - } - - header = getHeader(this.responseHeaders, header); - - return this.responseHeaders[header] || null; - }, - - getAllResponseHeaders: function getAllResponseHeaders() { - if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { - return ""; - } - - var responseHeaders = this.responseHeaders; - var headers = Object.keys(responseHeaders) - .filter(excludeSetCookie2Header) - .reduce(function (prev, header) { - var value = responseHeaders[header]; - - return prev + (header + ": " + value + "\r\n"); - }, ""); - - return headers; - }, - - setResponseBody: function setResponseBody(body) { - verifyRequestSent(this); - verifyHeadersReceived(this); - verifyResponseBodyType(body, this.responseType); - var contentType = this.overriddenMimeType || this.getResponseHeader("Content-Type"); - - var isTextResponse = this.responseType === "" || this.responseType === "text"; - clearResponse(this); - if (this.async) { - var chunkSize = this.chunkSize || 10; - var index = 0; - - do { - this.readyStateChange(FakeXMLHttpRequest.LOADING); - - if (isTextResponse) { - this.responseText = this.response += body.substring(index, index + chunkSize); - } - index += chunkSize; - } while (index < body.length); - } - - this.response = convertResponseBody(this.responseType, contentType, body); - if (isTextResponse) { - this.responseText = this.response; - } - - if (this.responseType === "document") { - this.responseXML = this.response; - } else if (this.responseType === "" && isXmlContentType(contentType)) { - this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText); - } - this.readyStateChange(FakeXMLHttpRequest.DONE); - }, - - respond: function respond(status, headers, body) { - this.setStatus(status); - this.setResponseHeaders(headers || {}); - this.setResponseBody(body || ""); - }, - - uploadProgress: function uploadProgress(progressEventRaw) { - if (supportsProgress) { - this.upload.dispatchEvent(new sinonEvent.ProgressEvent("progress", progressEventRaw, this.upload)); - } - }, - - downloadProgress: function downloadProgress(progressEventRaw) { - if (supportsProgress) { - this.dispatchEvent(new sinonEvent.ProgressEvent("progress", progressEventRaw, this)); - } - }, - - uploadError: function uploadError(error) { - if (supportsCustomEvent) { - this.upload.dispatchEvent(new sinonEvent.CustomEvent("error", {detail: error})); - } - }, - - overrideMimeType: function overrideMimeType(type) { - if (this.readyState >= FakeXMLHttpRequest.LOADING) { - throw new Error("INVALID_STATE_ERR"); - } - this.overriddenMimeType = type; - } - }); - - var states = { - UNSENT: 0, - OPENED: 1, - HEADERS_RECEIVED: 2, - LOADING: 3, - DONE: 4 - }; - - extend(FakeXMLHttpRequest, states); - extend(FakeXMLHttpRequest.prototype, states); - - function useFakeXMLHttpRequest() { - FakeXMLHttpRequest.restore = function restore(keepOnCreate) { - if (sinonXhr.supportsXHR) { - global.XMLHttpRequest = sinonXhr.GlobalXMLHttpRequest; - } - - if (sinonXhr.supportsActiveX) { - global.ActiveXObject = sinonXhr.GlobalActiveXObject; - } - - delete FakeXMLHttpRequest.restore; - - if (keepOnCreate !== true) { - delete FakeXMLHttpRequest.onCreate; - } - }; - if (sinonXhr.supportsXHR) { - global.XMLHttpRequest = FakeXMLHttpRequest; - } - - if (sinonXhr.supportsActiveX) { - global.ActiveXObject = function ActiveXObject(objId) { - if (objId === "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) { - - return new FakeXMLHttpRequest(); - } - - return new sinonXhr.GlobalActiveXObject(objId); - }; - } - - return FakeXMLHttpRequest; - } - - module.exports = { - xhr: sinonXhr, - FakeXMLHttpRequest: FakeXMLHttpRequest, - useFakeXMLHttpRequest: useFakeXMLHttpRequest - }; - - }).call(this,typeof commonjsGlobal$1 !== "undefined" ? commonjsGlobal$1 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); - },{"../configure-logger":1,"../event":5,"./blob":10,"just-extend":31,"text-encoding":34}],12:[function(require,module,exports){ - - module.exports = { - fakeServer: require("./fake-server"), - fakeServerWithClock: require("./fake-server/fake-server-with-clock"), - fakeXhr: require("./fake-xhr") - }; - - },{"./fake-server":9,"./fake-server/fake-server-with-clock":7,"./fake-xhr":11}],13:[function(require,module,exports){ - (function (global){ - - var samsam = require("@sinonjs/samsam"); - var formatio = { - excludeConstructors: ["Object", /^.$/], - quoteStrings: true, - limitChildrenCount: 0 - }; - - var specialObjects = []; - if (typeof global !== "undefined") { - specialObjects.push({ object: global, value: "[object global]" }); - } - if (typeof document !== "undefined") { - specialObjects.push({ - object: document, - value: "[object HTMLDocument]" - }); - } - if (typeof window !== "undefined") { - specialObjects.push({ object: window, value: "[object Window]" }); - } - - function functionName(func) { - if (!func) { return ""; } - if (func.displayName) { return func.displayName; } - if (func.name) { return func.name; } - var matches = func.toString().match(/function\s+([^\(]+)/m); - return (matches && matches[1]) || ""; - } - - function constructorName(f, object) { - var name = functionName(object && object.constructor); - var excludes = f.excludeConstructors || - formatio.excludeConstructors || []; - - var i, l; - for (i = 0, l = excludes.length; i < l; ++i) { - if (typeof excludes[i] === "string" && excludes[i] === name) { - return ""; - } else if (excludes[i].test && excludes[i].test(name)) { - return ""; - } - } - - return name; - } - - function isCircular(object, objects) { - if (typeof object !== "object") { return false; } - var i, l; - for (i = 0, l = objects.length; i < l; ++i) { - if (objects[i] === object) { return true; } - } - return false; - } - - function ascii(f, object, processed, indent) { - if (typeof object === "string") { - if (object.length === 0) { return "(empty string)"; } - var qs = f.quoteStrings; - var quote = typeof qs !== "boolean" || qs; - return processed || quote ? "\"" + object + "\"" : object; - } - - if (typeof object === "function" && !(object instanceof RegExp)) { - return ascii.func(object); - } - - processed = processed || []; - - if (isCircular(object, processed)) { return "[Circular]"; } - - if (Object.prototype.toString.call(object) === "[object Array]") { - return ascii.array.call(f, object, processed); - } - - if (!object) { return String((1 / object) === -Infinity ? "-0" : object); } - if (samsam.isElement(object)) { return ascii.element(object); } - - if (typeof object.toString === "function" && - object.toString !== Object.prototype.toString) { - return object.toString(); - } - - var i, l; - for (i = 0, l = specialObjects.length; i < l; i++) { - if (object === specialObjects[i].object) { - return specialObjects[i].value; - } - } - - if (typeof Set !== "undefined" && object instanceof Set) { - return ascii.set.call(f, object, processed); - } - - return ascii.object.call(f, object, processed, indent); - } - - ascii.func = function (func) { - return "function " + functionName(func) + "() {}"; - }; - - function delimit(str, delimiters) { - delimiters = delimiters || ["[", "]"]; - return delimiters[0] + str + delimiters[1]; - } - - ascii.array = function (array, processed, delimiters) { - processed = processed || []; - processed.push(array); - var pieces = []; - var i, l; - l = (this.limitChildrenCount > 0) ? - Math.min(this.limitChildrenCount, array.length) : array.length; - - for (i = 0; i < l; ++i) { - pieces.push(ascii(this, array[i], processed)); - } - - if (l < array.length) { - pieces.push("[... " + (array.length - l) + " more elements]"); - } - - return delimit(pieces.join(", "), delimiters); - }; - - ascii.set = function (set, processed) { - return ascii.array.call(this, Array.from(set), processed, ["Set {", "}"]); - }; - - ascii.object = function (object, processed, indent) { - processed = processed || []; - processed.push(object); - indent = indent || 0; - var pieces = []; - var properties = Object.keys(object).sort(); - var length = 3; - var prop, str, obj, i, k, l; - l = (this.limitChildrenCount > 0) ? - Math.min(this.limitChildrenCount, properties.length) : properties.length; - - for (i = 0; i < l; ++i) { - prop = properties[i]; - obj = object[prop]; - - if (isCircular(obj, processed)) { - str = "[Circular]"; - } else { - str = ascii(this, obj, processed, indent + 2); - } - - str = (/\s/.test(prop) ? "\"" + prop + "\"" : prop) + ": " + str; - length += str.length; - pieces.push(str); - } - - var cons = constructorName(this, object); - var prefix = cons ? "[" + cons + "] " : ""; - var is = ""; - for (i = 0, k = indent; i < k; ++i) { is += " "; } - - if (l < properties.length) - {pieces.push("[... " + (properties.length - l) + " more elements]");} - - if (length + indent > 80) { - return prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" + - is + "}"; - } - return prefix + "{ " + pieces.join(", ") + " }"; - }; - - ascii.element = function (element) { - var tagName = element.tagName.toLowerCase(); - var attrs = element.attributes; - var pairs = []; - var attr, attrName, i, l, val; - - for (i = 0, l = attrs.length; i < l; ++i) { - attr = attrs.item(i); - attrName = attr.nodeName.toLowerCase().replace("html:", ""); - val = attr.nodeValue; - if (attrName !== "contenteditable" || val !== "inherit") { - if (val) { pairs.push(attrName + "=\"" + val + "\""); } - } - } - - var formatted = "<" + tagName + (pairs.length > 0 ? " " : ""); - // SVG elements have undefined innerHTML - var content = element.innerHTML || ""; - - if (content.length > 20) { - content = content.substr(0, 20) + "[...]"; - } - - var res = formatted + pairs.join(" ") + ">" + content + - ""; - - return res.replace(/ contentEditable="inherit"/, ""); - }; - - function Formatio(options) { - // eslint-disable-next-line guard-for-in - for (var opt in options) { - this[opt] = options[opt]; - } - } - - Formatio.prototype = { - functionName: functionName, - - configure: function (options) { - return new Formatio(options); - }, - - constructorName: function (object) { - return constructorName(this, object); - }, - - ascii: function (object, processed, indent) { - return ascii(this, object, processed, indent); - } - }; - - module.exports = Formatio.prototype; - - }).call(this,typeof commonjsGlobal$1 !== "undefined" ? commonjsGlobal$1 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); - },{"@sinonjs/samsam":27}],14:[function(require,module,exports){ - - var getClass = require("./get-class"); - var identical = require("./identical"); - var isArguments = require("./is-arguments"); - var isDate = require("./is-date"); - var isElement = require("./is-element"); - var isNaN = require("./is-nan"); - var isObject = require("./is-object"); - var isSet = require("./is-set"); - var isSubset = require("./is-subset"); - var getClassName = require("./get-class-name"); - - var every = Array.prototype.every; - var getTime = Date.prototype.getTime; - var hasOwnProperty = Object.prototype.hasOwnProperty; - var indexOf = Array.prototype.indexOf; - var keys = Object.keys; - - /** - * @name samsam.deepEqual - * @param Object first - * @param Object second - * - * Deep equal comparison. Two values are "deep equal" if: - * - * - They are equal, according to samsam.identical - * - They are both date objects representing the same time - * - They are both arrays containing elements that are all deepEqual - * - They are objects with the same set of properties, and each property - * in ``first`` is deepEqual to the corresponding property in ``second`` - * - * Supports cyclic objects. - */ - function deepEqualCyclic(first, second) { - // used for cyclic comparison - // contain already visited objects - var objects1 = []; - var objects2 = []; - // contain pathes (position in the object structure) - // of the already visited objects - // indexes same as in objects arrays - var paths1 = []; - var paths2 = []; - // contains combinations of already compared objects - // in the manner: { "$1['ref']$2['ref']": true } - var compared = {}; - - // does the recursion for the deep equal check - return (function deepEqual(obj1, obj2, path1, path2) { - var type1 = typeof obj1; - var type2 = typeof obj2; - - // == null also matches undefined - if ( - obj1 === obj2 || - isNaN(obj1) || - isNaN(obj2) || - obj1 == null || - obj2 == null || - type1 !== "object" || - type2 !== "object" - ) { - return identical(obj1, obj2); - } - - // Elements are only equal if identical(expected, actual) - if (isElement(obj1) || isElement(obj2)) { - return false; - } - - var isDate1 = isDate(obj1); - var isDate2 = isDate(obj2); - if (isDate1 || isDate2) { - if ( - !isDate1 || - !isDate2 || - getTime.call(obj1) !== getTime.call(obj2) - ) { - return false; - } - } - - if (obj1 instanceof RegExp && obj2 instanceof RegExp) { - if (obj1.toString() !== obj2.toString()) { - return false; - } - } - - if (obj1 instanceof Error && obj2 instanceof Error) { - if (obj1.stack !== obj2.stack) { - return false; - } - } - - var class1 = getClass(obj1); - var class2 = getClass(obj2); - var keys1 = keys(obj1); - var keys2 = keys(obj2); - var name1 = getClassName(obj1); - var name2 = getClassName(obj2); - - if (isArguments(obj1) || isArguments(obj2)) { - if (obj1.length !== obj2.length) { - return false; - } - } else { - if ( - type1 !== type2 || - class1 !== class2 || - keys1.length !== keys2.length || - (name1 && name2 && name1 !== name2) - ) { - return false; - } - } - - if (isSet(obj1) || isSet(obj2)) { - if (!isSet(obj1) || !isSet(obj2) || obj1.size !== obj2.size) { - return false; - } - - return isSubset(obj1, obj2, deepEqual); - } - - return every.call(keys1, function(key) { - if (!hasOwnProperty.call(obj2, key)) { - return false; - } - - var value1 = obj1[key]; - var value2 = obj2[key]; - var isObject1 = isObject(value1); - var isObject2 = isObject(value2); - // determines, if the objects were already visited - // (it's faster to check for isObject first, than to - // get -1 from getIndex for non objects) - var index1 = isObject1 ? indexOf.call(objects1, value1) : -1; - var index2 = isObject2 ? indexOf.call(objects2, value2) : -1; - // determines the new paths of the objects - // - for non cyclic objects the current path will be extended - // by current property name - // - for cyclic objects the stored path is taken - var newPath1 = - index1 !== -1 - ? paths1[index1] - : path1 + "[" + JSON.stringify(key) + "]"; - var newPath2 = - index2 !== -1 - ? paths2[index2] - : path2 + "[" + JSON.stringify(key) + "]"; - var combinedPath = newPath1 + newPath2; - - // stop recursion if current objects are already compared - if (compared[combinedPath]) { - return true; - } - - // remember the current objects and their paths - if (index1 === -1 && isObject1) { - objects1.push(value1); - paths1.push(newPath1); - } - if (index2 === -1 && isObject2) { - objects2.push(value2); - paths2.push(newPath2); - } - - // remember that the current objects are already compared - if (isObject1 && isObject2) { - compared[combinedPath] = true; - } - - // End of cyclic logic - - // neither value1 nor value2 is a cycle - // continue with next level - return deepEqual(value1, value2, newPath1, newPath2); - }); - })(first, second, "$1", "$2"); - } - - module.exports = deepEqualCyclic; - - },{"./get-class":16,"./get-class-name":15,"./identical":17,"./is-arguments":18,"./is-date":19,"./is-element":20,"./is-nan":21,"./is-object":23,"./is-set":24,"./is-subset":25}],15:[function(require,module,exports){ - - function getClassName(value) { - return Object.getPrototypeOf(value) ? value.constructor.name : null; - } - - module.exports = getClassName; - - },{}],16:[function(require,module,exports){ - - var o = Object.prototype; - - function getClass(value) { - // Returns the internal [[Class]] by calling Object.prototype.toString - // with the provided value as this. Return value is a string, naming the - // internal class, e.g. "Array" - return o.toString.call(value).split(/[ \]]/)[1]; - } - - module.exports = getClass; - - },{}],17:[function(require,module,exports){ - - var isNaN = require("./is-nan"); - var isNegZero = require("./is-neg-zero"); - - /** - * @name samsam.equal - * @param Object obj1 - * @param Object obj2 - * - * Returns ``true`` if two objects are strictly equal. Compared to - * ``===`` there are two exceptions: - * - * - NaN is considered equal to NaN - * - -0 and +0 are not considered equal - */ - function identical(obj1, obj2) { - if (obj1 === obj2 || (isNaN(obj1) && isNaN(obj2))) { - return obj1 !== 0 || isNegZero(obj1) === isNegZero(obj2); - } - - return false; - } - - module.exports = identical; - - },{"./is-nan":21,"./is-neg-zero":22}],18:[function(require,module,exports){ - - var getClass = require("./get-class"); - - /** - * @name samsam.isArguments - * @param Object object - * - * Returns ``true`` if ``object`` is an ``arguments`` object, - * ``false`` otherwise. - */ - function isArguments(object) { - if (getClass(object) === "Arguments") { - return true; - } - if ( - typeof object !== "object" || - typeof object.length !== "number" || - getClass(object) === "Array" - ) { - return false; - } - if (typeof object.callee === "function") { - return true; - } - try { - object[object.length] = 6; - delete object[object.length]; - } catch (e) { - return true; - } - return false; - } - - module.exports = isArguments; - - },{"./get-class":16}],19:[function(require,module,exports){ - - function isDate(value) { - return value instanceof Date; - } - - module.exports = isDate; - - },{}],20:[function(require,module,exports){ - - var div = typeof document !== "undefined" && document.createElement("div"); - - /** - * @name samsam.isElement - * @param Object object - * - * Returns ``true`` if ``object`` is a DOM element node. Unlike - * Underscore.js/lodash, this function will return ``false`` if ``object`` - * is an *element-like* object, i.e. a regular object with a ``nodeType`` - * property that holds the value ``1``. - */ - function isElement(object) { - if (!object || object.nodeType !== 1 || !div) { - return false; - } - try { - object.appendChild(div); - object.removeChild(div); - } catch (e) { - return false; - } - return true; - } - - module.exports = isElement; - - },{}],21:[function(require,module,exports){ - - function isNaN(value) { - // Unlike global isNaN, this avoids type coercion - // typeof check avoids IE host object issues, hat tip to - // lodash - var val = value; // JsLint thinks value !== value is "weird" - return typeof value === "number" && value !== val; - } - - module.exports = isNaN; - - },{}],22:[function(require,module,exports){ - - /** - * @name samsam.isNegZero - * @param Object value - * - * Returns ``true`` if ``value`` is ``-0``. - */ - function isNegZero(value) { - return value === 0 && 1 / value === -Infinity; - } - - module.exports = isNegZero; - - },{}],23:[function(require,module,exports){ - - // Returns true when the value is a regular Object and not a specialized Object - // - // This helps speeding up deepEqual cyclic checks - // The premise is that only Objects are stored in the visited array. - // So if this function returns false, we don't have to do the - // expensive operation of searching for the value in the the array of already - // visited objects - function isObject(value) { - return ( - typeof value === "object" && - value !== null && - // none of these are collection objects, so we can return false - !(value instanceof Boolean) && - !(value instanceof Date) && - !(value instanceof Error) && - !(value instanceof Number) && - !(value instanceof RegExp) && - !(value instanceof String) - ); - } - - module.exports = isObject; - - },{}],24:[function(require,module,exports){ - - function isSet(val) { - return (typeof Set !== "undefined" && val instanceof Set) || false; - } - - module.exports = isSet; - - },{}],25:[function(require,module,exports){ - - var from = require("array-from"); - - function isSubset(s1, s2, compare) { - // FIXME: IE11 doesn't support Array.from - // Potential solutions: - // - contribute a patch to https://github.com/Volox/eslint-plugin-ie11#readme - // - https://github.com/mathiasbynens/Array.from (doesn't work with matchers) - var values1 = from(s1); - var values2 = from(s2); - - for (var i = 0; i < values1.length; i++) { - var includes = false; - - for (var j = 0; j < values2.length; j++) { - if (compare(values2[j], values1[i])) { - includes = true; - break; - } - } - - if (!includes) { - return false; - } - } - - return true; - } - - module.exports = isSubset; - - },{"array-from":28}],26:[function(require,module,exports){ - - var getClass = require("./get-class"); - var isDate = require("./is-date"); - var isSet = require("./is-set"); - var isSubset = require("./is-subset"); - - function arrayContains(array, subset, compare) { - if (subset.length === 0) { - return true; - } - var i, l, j, k; - for (i = 0, l = array.length; i < l; ++i) { - if (compare(array[i], subset[0])) { - for (j = 0, k = subset.length; j < k; ++j) { - if (i + j >= l) { - return false; - } - if (!compare(array[i + j], subset[j])) { - return false; - } - } - return true; - } - } - return false; - } - - /** - * @name samsam.match - * @param Object object - * @param Object matcher - * - * Compare arbitrary value ``object`` with matcher. - */ - function match(object, matcher) { - if (matcher && typeof matcher.test === "function") { - return matcher.test(object); - } - - if (typeof matcher === "function") { - return matcher(object) === true; - } - - if (typeof matcher === "string") { - matcher = matcher.toLowerCase(); - var notNull = typeof object === "string" || !!object; - return ( - notNull && - String(object) - .toLowerCase() - .indexOf(matcher) >= 0 - ); - } - - if (typeof matcher === "number") { - return matcher === object; - } - - if (typeof matcher === "boolean") { - return matcher === object; - } - - if (typeof matcher === "undefined") { - return typeof object === "undefined"; - } - - if (matcher === null) { - return object === null; - } - - if (isSet(object)) { - return isSubset(matcher, object, match); - } - - if (getClass(object) === "Array" && getClass(matcher) === "Array") { - return arrayContains(object, matcher, match); - } - - if (isDate(matcher)) { - return isDate(object) && object.getTime() === matcher.getTime(); - } - - if (matcher && typeof matcher === "object") { - if (matcher === object) { - return true; - } - var prop; - // eslint-disable-next-line guard-for-in - for (prop in matcher) { - var value = object[prop]; - if ( - typeof value === "undefined" && - typeof object.getAttribute === "function" - ) { - value = object.getAttribute(prop); - } - if ( - matcher[prop] === null || - typeof matcher[prop] === "undefined" - ) { - if (value !== matcher[prop]) { - return false; - } - } else if ( - typeof value === "undefined" || - !match(value, matcher[prop]) - ) { - return false; - } - } - return true; - } - - throw new Error( - "Matcher was not a string, a number, a " + - "function, a boolean or an object" - ); - } - - module.exports = match; - - },{"./get-class":16,"./is-date":19,"./is-set":24,"./is-subset":25}],27:[function(require,module,exports){ - - var deepEqualCyclic = require("./deep-equal"); - var identical = require("./identical"); - var isArguments = require("./is-arguments"); - var isElement = require("./is-element"); - var isNegZero = require("./is-neg-zero"); - var match = require("./match"); - - module.exports = { - isArguments: isArguments, - isElement: isElement, - isNegZero: isNegZero, - identical: identical, - deepEqual: deepEqualCyclic, - match: match - }; - - },{"./deep-equal":14,"./identical":17,"./is-arguments":18,"./is-element":20,"./is-neg-zero":22,"./match":26}],28:[function(require,module,exports){ - module.exports = (typeof Array.from === 'function' ? - Array.from : - require('./polyfill') - ); - - },{"./polyfill":29}],29:[function(require,module,exports){ - // Production steps of ECMA-262, Edition 6, 22.1.2.1 - // Reference: http://www.ecma-international.org/ecma-262/6.0/#sec-array.from - module.exports = (function() { - var isCallable = function(fn) { - return typeof fn === 'function'; - }; - var toInteger = function (value) { - var number = Number(value); - if (isNaN(number)) { return 0; } - if (number === 0 || !isFinite(number)) { return number; } - return (number > 0 ? 1 : -1) * Math.floor(Math.abs(number)); - }; - var maxSafeInteger = Math.pow(2, 53) - 1; - var toLength = function (value) { - var len = toInteger(value); - return Math.min(Math.max(len, 0), maxSafeInteger); - }; - var iteratorProp = function(value) { - if(value != null) { - if(['string','number','boolean','symbol'].indexOf(typeof value) > -1){ - return Symbol.iterator; - } else if ( - (typeof Symbol !== 'undefined') && - ('iterator' in Symbol) && - (Symbol.iterator in value) - ) { - return Symbol.iterator; - } - // Support "@@iterator" placeholder, Gecko 27 to Gecko 35 - else if ('@@iterator' in value) { - return '@@iterator'; - } - } - }; - var getMethod = function(O, P) { - // Assert: IsPropertyKey(P) is true. - if (O != null && P != null) { - // Let func be GetV(O, P). - var func = O[P]; - // ReturnIfAbrupt(func). - // If func is either undefined or null, return undefined. - if(func == null) { - return void 0; - } - // If IsCallable(func) is false, throw a TypeError exception. - if (!isCallable(func)) { - throw new TypeError(func + ' is not a function'); - } - return func; - } - }; - var iteratorStep = function(iterator) { - // Let result be IteratorNext(iterator). - // ReturnIfAbrupt(result). - var result = iterator.next(); - // Let done be IteratorComplete(result). - // ReturnIfAbrupt(done). - var done = Boolean(result.done); - // If done is true, return false. - if(done) { - return false; - } - // Return result. - return result; - }; - - // The length property of the from method is 1. - return function from(items /*, mapFn, thisArg */ ) { - - // 1. Let C be the this value. - var C = this; - - // 2. If mapfn is undefined, let mapping be false. - var mapFn = arguments.length > 1 ? arguments[1] : void 0; - - var T; - if (typeof mapFn !== 'undefined') { - // 3. else - // a. If IsCallable(mapfn) is false, throw a TypeError exception. - if (!isCallable(mapFn)) { - throw new TypeError( - 'Array.from: when provided, the second argument must be a function' - ); - } - - // b. If thisArg was supplied, let T be thisArg; else let T - // be undefined. - if (arguments.length > 2) { - T = arguments[2]; - } - // c. Let mapping be true (implied by mapFn) - } - - var A, k; - - // 4. Let usingIterator be GetMethod(items, @@iterator). - // 5. ReturnIfAbrupt(usingIterator). - var usingIterator = getMethod(items, iteratorProp(items)); - - // 6. If usingIterator is not undefined, then - if (usingIterator !== void 0) { - // a. If IsConstructor(C) is true, then - // i. Let A be the result of calling the [[Construct]] - // internal method of C with an empty argument list. - // b. Else, - // i. Let A be the result of the abstract operation ArrayCreate - // with argument 0. - // c. ReturnIfAbrupt(A). - A = isCallable(C) ? Object(new C()) : []; - - // d. Let iterator be GetIterator(items, usingIterator). - var iterator = usingIterator.call(items); - - // e. ReturnIfAbrupt(iterator). - if (iterator == null) { - throw new TypeError( - 'Array.from requires an array-like or iterable object' - ); - } - - // f. Let k be 0. - k = 0; - - // g. Repeat - var next, nextValue; - while (true) { - // i. Let Pk be ToString(k). - // ii. Let next be IteratorStep(iterator). - // iii. ReturnIfAbrupt(next). - next = iteratorStep(iterator); - - // iv. If next is false, then - if (!next) { - - // 1. Let setStatus be Set(A, "length", k, true). - // 2. ReturnIfAbrupt(setStatus). - A.length = k; - - // 3. Return A. - return A; - } - // v. Let nextValue be IteratorValue(next). - // vi. ReturnIfAbrupt(nextValue) - nextValue = next.value; - - // vii. If mapping is true, then - // 1. Let mappedValue be Call(mapfn, T, «nextValue, k»). - // 2. If mappedValue is an abrupt completion, return - // IteratorClose(iterator, mappedValue). - // 3. Let mappedValue be mappedValue.[[value]]. - // viii. Else, let mappedValue be nextValue. - // ix. Let defineStatus be the result of - // CreateDataPropertyOrThrow(A, Pk, mappedValue). - // x. [TODO] If defineStatus is an abrupt completion, return - // IteratorClose(iterator, defineStatus). - if (mapFn) { - A[k] = mapFn.call(T, nextValue, k); - } - else { - A[k] = nextValue; - } - // xi. Increase k by 1. - k++; - } - // 7. Assert: items is not an Iterable so assume it is - // an array-like object. - } else { - - // 8. Let arrayLike be ToObject(items). - var arrayLike = Object(items); - - // 9. ReturnIfAbrupt(items). - if (items == null) { - throw new TypeError( - 'Array.from requires an array-like object - not null or undefined' - ); - } - - // 10. Let len be ToLength(Get(arrayLike, "length")). - // 11. ReturnIfAbrupt(len). - var len = toLength(arrayLike.length); - - // 12. If IsConstructor(C) is true, then - // a. Let A be Construct(C, «len»). - // 13. Else - // a. Let A be ArrayCreate(len). - // 14. ReturnIfAbrupt(A). - A = isCallable(C) ? Object(new C(len)) : new Array(len); - - // 15. Let k be 0. - k = 0; - // 16. Repeat, while k < len… (also steps a - h) - var kValue; - while (k < len) { - kValue = arrayLike[k]; - if (mapFn) { - A[k] = mapFn.call(T, kValue, k); - } - else { - A[k] = kValue; - } - k++; - } - // 17. Let setStatus be Set(A, "length", len, true). - // 18. ReturnIfAbrupt(setStatus). - A.length = len; - // 19. Return A. - } - return A; - }; - })(); - - },{}],30:[function(require,module,exports){ - module.exports = Array.isArray || function (arr) { - return Object.prototype.toString.call(arr) == '[object Array]'; - }; - - },{}],31:[function(require,module,exports){ - module.exports = extend; - - /* - var obj = {a: 3, b: 5}; - extend(obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8} - obj; // {a: 4, b: 5, c: 8} - - var obj = {a: 3, b: 5}; - extend({}, obj, {a: 4, c: 8}); // {a: 4, b: 5, c: 8} - obj; // {a: 3, b: 5} - - var arr = [1, 2, 3]; - var obj = {a: 3, b: 5}; - extend(obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]} - arr.push(4); - obj; // {a: 3, b: 5, c: [1, 2, 3, 4]} - - var arr = [1, 2, 3]; - var obj = {a: 3, b: 5}; - extend(true, obj, {c: arr}); // {a: 3, b: 5, c: [1, 2, 3]} - arr.push(4); - obj; // {a: 3, b: 5, c: [1, 2, 3]} - - extend({a: 4, b: 5}); // {a: 4, b: 5} - extend({a: 4, b: 5}, 3); {a: 4, b: 5} - extend({a: 4, b: 5}, true); {a: 4, b: 5} - extend('hello', {a: 4, b: 5}); // throws - extend(3, {a: 4, b: 5}); // throws - */ - - function extend(/* [deep], obj1, obj2, [objn] */) { - var args = [].slice.call(arguments); - var deep = false; - if (typeof args[0] == 'boolean') { - deep = args.shift(); - } - var result = args[0]; - if (!result || (typeof result != 'object' && typeof result != 'function')) { - throw new Error('extendee must be an object'); - } - var extenders = args.slice(1); - var len = extenders.length; - for (var i = 0; i < len; i++) { - var extender = extenders[i]; - for (var key in extender) { - if (extender.hasOwnProperty(key)) { - var value = extender[key]; - if (deep && isCloneable(value)) { - var base = Array.isArray(value) ? [] : {}; - result[key] = extend(true, result[key] || base, value); - } else { - result[key] = value; - } - } - } - } - return result; - } - - function isCloneable(obj) { - return Array.isArray(obj) || {}.toString.call(obj) == '[object Object]'; - } - - },{}],32:[function(require,module,exports){ - (function (global){ - - var userAgent = global.navigator && global.navigator.userAgent; - var isRunningInIE = userAgent && userAgent.indexOf("MSIE ") > -1; - var maxTimeout = Math.pow(2, 31) - 1; //see https://heycam.github.io/webidl/#abstract-opdef-converttoint - - // Make properties writable in IE, as per - // http://www.adequatelygood.com/Replacing-setTimeout-Globally.html - if (isRunningInIE) { - global.setTimeout = global.setTimeout; - global.clearTimeout = global.clearTimeout; - global.setInterval = global.setInterval; - global.clearInterval = global.clearInterval; - global.Date = global.Date; - } - - // setImmediate is not a standard function - // avoid adding the prop to the window object if not present - if (global.setImmediate !== undefined) { - global.setImmediate = global.setImmediate; - global.clearImmediate = global.clearImmediate; - } - - // node expects setTimeout/setInterval to return a fn object w/ .ref()/.unref() - // browsers, a number. - // see https://github.com/cjohansen/Sinon.JS/pull/436 - - var NOOP = function () { return undefined; }; - var timeoutResult = setTimeout(NOOP, 0); - var addTimerReturnsObject = typeof timeoutResult === "object"; - var hrtimePresent = (global.process && typeof global.process.hrtime === "function"); - var nextTickPresent = (global.process && typeof global.process.nextTick === "function"); - var performancePresent = (global.performance && typeof global.performance.now === "function"); - var requestAnimationFramePresent = (global.requestAnimationFrame && typeof global.requestAnimationFrame === "function"); - var cancelAnimationFramePresent = (global.cancelAnimationFrame && typeof global.cancelAnimationFrame === "function"); - - clearTimeout(timeoutResult); - - var NativeDate = Date; - var uniqueTimerId = 1; - - /** - * Parse strings like "01:10:00" (meaning 1 hour, 10 minutes, 0 seconds) into - * number of milliseconds. This is used to support human-readable strings passed - * to clock.tick() - */ - function parseTime(str) { - if (!str) { - return 0; - } - - var strings = str.split(":"); - var l = strings.length; - var i = l; - var ms = 0; - var parsed; - - if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { - throw new Error("tick only understands numbers, 'm:s' and 'h:m:s'. Each part must be two digits"); - } - - while (i--) { - parsed = parseInt(strings[i], 10); - - if (parsed >= 60) { - throw new Error("Invalid time " + str); - } - - ms += parsed * Math.pow(60, (l - i - 1)); - } - - return ms * 1000; - } - - /** - * Floor function that also works for negative numbers - */ - function fixedFloor(n) { - return (n >= 0 ? Math.floor(n) : Math.ceil(n)); - } - - /** - * % operator that also works for negative numbers - */ - function fixedModulo(n, m) { - return ((n % m) + m) % m; - } - - /** - * Used to grok the `now` parameter to createClock. - * @param epoch {Date|number} the system time - */ - function getEpoch(epoch) { - if (!epoch) { return 0; } - if (typeof epoch.getTime === "function") { return epoch.getTime(); } - if (typeof epoch === "number") { return epoch; } - throw new TypeError("now should be milliseconds since UNIX epoch"); - } - - function inRange(from, to, timer) { - return timer && timer.callAt >= from && timer.callAt <= to; - } - - function mirrorDateProperties(target, source) { - var prop; - for (prop in source) { - if (source.hasOwnProperty(prop)) { - target[prop] = source[prop]; - } - } - - // set special now implementation - if (source.now) { - target.now = function now() { - return target.clock.now; - }; - } else { - delete target.now; - } - - // set special toSource implementation - if (source.toSource) { - target.toSource = function toSource() { - return source.toSource(); - }; - } else { - delete target.toSource; - } - - // set special toString implementation - target.toString = function toString() { - return source.toString(); - }; - - target.prototype = source.prototype; - target.parse = source.parse; - target.UTC = source.UTC; - target.prototype.toUTCString = source.prototype.toUTCString; - - return target; - } - - function createDate() { - function ClockDate(year, month, date, hour, minute, second, ms) { - // Defensive and verbose to avoid potential harm in passing - // explicit undefined when user does not pass argument - switch (arguments.length) { - case 0: - return new NativeDate(ClockDate.clock.now); - case 1: - return new NativeDate(year); - case 2: - return new NativeDate(year, month); - case 3: - return new NativeDate(year, month, date); - case 4: - return new NativeDate(year, month, date, hour); - case 5: - return new NativeDate(year, month, date, hour, minute); - case 6: - return new NativeDate(year, month, date, hour, minute, second); - default: - return new NativeDate(year, month, date, hour, minute, second, ms); - } - } - - return mirrorDateProperties(ClockDate, NativeDate); - } - - - function enqueueJob(clock, job) { - // enqueues a microtick-deferred task - ecma262/#sec-enqueuejob - if (!clock.jobs) { - clock.jobs = []; - } - clock.jobs.push(job); - } - - function runJobs(clock) { - // runs all microtick-deferred tasks - ecma262/#sec-runjobs - if (!clock.jobs) { - return; - } - for (var i = 0; i < clock.jobs.length; i++) { - var job = clock.jobs[i]; - job.func.apply(null, job.args); - } - clock.jobs = []; - } - - function addTimer(clock, timer) { - if (timer.func === undefined) { - throw new Error("Callback must be provided to timer calls"); - } - - timer.type = timer.immediate ? "Immediate" : "Timeout"; - - if (timer.hasOwnProperty("delay")) { - timer.delay = timer.delay > maxTimeout ? 1 : timer.delay; - timer.delay = Math.max(0, timer.delay); - } - - if (timer.hasOwnProperty("interval")) { - timer.type = "Interval"; - timer.interval = timer.interval > maxTimeout ? 1 : timer.interval; - } - - if (timer.hasOwnProperty("animation")) { - timer.type = "AnimationFrame"; - timer.animation = true; - } - - if (!clock.timers) { - clock.timers = {}; - } - - timer.id = uniqueTimerId++; - timer.createdAt = clock.now; - timer.callAt = clock.now + (parseInt(timer.delay) || (clock.duringTick ? 1 : 0)); - - clock.timers[timer.id] = timer; - - if (addTimerReturnsObject) { - return { - id: timer.id, - ref: NOOP, - unref: NOOP - }; - } - - return timer.id; - } - - - /* eslint consistent-return: "off" */ - function compareTimers(a, b) { - // Sort first by absolute timing - if (a.callAt < b.callAt) { - return -1; - } - if (a.callAt > b.callAt) { - return 1; - } - - // Sort next by immediate, immediate timers take precedence - if (a.immediate && !b.immediate) { - return -1; - } - if (!a.immediate && b.immediate) { - return 1; - } - - // Sort next by creation time, earlier-created timers take precedence - if (a.createdAt < b.createdAt) { - return -1; - } - if (a.createdAt > b.createdAt) { - return 1; - } - - // Sort next by id, lower-id timers take precedence - if (a.id < b.id) { - return -1; - } - if (a.id > b.id) { - return 1; - } - - // As timer ids are unique, no fallback `0` is necessary - } - - function firstTimerInRange(clock, from, to) { - var timers = clock.timers; - var timer = null; - var id, isInRange; - - for (id in timers) { - if (timers.hasOwnProperty(id)) { - isInRange = inRange(from, to, timers[id]); - - if (isInRange && (!timer || compareTimers(timer, timers[id]) === 1)) { - timer = timers[id]; - } - } - } - - return timer; - } - - function firstTimer(clock) { - var timers = clock.timers; - var timer = null; - var id; - - for (id in timers) { - if (timers.hasOwnProperty(id)) { - if (!timer || compareTimers(timer, timers[id]) === 1) { - timer = timers[id]; - } - } - } - - return timer; - } - - function lastTimer(clock) { - var timers = clock.timers; - var timer = null; - var id; - - for (id in timers) { - if (timers.hasOwnProperty(id)) { - if (!timer || compareTimers(timer, timers[id]) === -1) { - timer = timers[id]; - } - } - } - - return timer; - } - - function callTimer(clock, timer) { - if (typeof timer.interval === "number") { - clock.timers[timer.id].callAt += timer.interval; - } else { - delete clock.timers[timer.id]; - } - - if (typeof timer.func === "function") { - timer.func.apply(null, timer.args); - } else { - /* eslint no-eval: "off" */ - eval(timer.func); - } - } - - function clearTimer(clock, timerId, ttype) { - if (!timerId) { - // null appears to be allowed in most browsers, and appears to be - // relied upon by some libraries, like Bootstrap carousel - return; - } - - if (!clock.timers) { - clock.timers = []; - } - - // in Node, timerId is an object with .ref()/.unref(), and - // its .id field is the actual timer id. - if (typeof timerId === "object") { - timerId = timerId.id; - } - - if (clock.timers.hasOwnProperty(timerId)) { - // check that the ID matches a timer of the correct type - var timer = clock.timers[timerId]; - if (timer.type === ttype) { - delete clock.timers[timerId]; - } else { - var clear = ttype === "AnimationFrame" ? "cancelAnimationFrame" : "clear" + ttype; - var schedule = timer.type === "AnimationFrame" ? "requestAnimationFrame" : "set" + timer.type; - throw new Error("Cannot clear timer: timer created with " + schedule - + "() but cleared with " + clear + "()"); - } - } - } - - function uninstall(clock, target, config) { - var method, - i, - l; - var installedHrTime = "_hrtime"; - var installedNextTick = "_nextTick"; - - for (i = 0, l = clock.methods.length; i < l; i++) { - method = clock.methods[i]; - if (method === "hrtime" && target.process) { - target.process.hrtime = clock[installedHrTime]; - } else if (method === "nextTick" && target.process) { - target.process.nextTick = clock[installedNextTick]; - } else { - if (target[method] && target[method].hadOwnProperty) { - target[method] = clock["_" + method]; - if (method === "clearInterval" && config.shouldAdvanceTime === true) { - target[method](clock.attachedInterval); - } - } else { - try { - delete target[method]; - } catch (ignore) { /* eslint empty-block: "off" */ } - } - } - } - - // Prevent multiple executions which will completely remove these props - clock.methods = []; - - // return pending timers, to enable checking what timers remained on uninstall - if (!clock.timers) { - return []; - } - return Object.keys(clock.timers).map(function mapper(key) { - return clock.timers[key]; - }); - } - - function hijackMethod(target, method, clock) { - var prop; - clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(target, method); - clock["_" + method] = target[method]; - - if (method === "Date") { - var date = mirrorDateProperties(clock[method], target[method]); - target[method] = date; - } else { - target[method] = function () { - return clock[method].apply(clock, arguments); - }; - - for (prop in clock[method]) { - if (clock[method].hasOwnProperty(prop)) { - target[method][prop] = clock[method][prop]; - } - } - } - - target[method].clock = clock; - } - - function doIntervalTick(clock, advanceTimeDelta) { - clock.tick(advanceTimeDelta); - } - - var timers = { - setTimeout: setTimeout, - clearTimeout: clearTimeout, - setImmediate: global.setImmediate, - clearImmediate: global.clearImmediate, - setInterval: setInterval, - clearInterval: clearInterval, - Date: Date - }; - - if (hrtimePresent) { - timers.hrtime = global.process.hrtime; - } - - if (nextTickPresent) { - timers.nextTick = global.process.nextTick; - } - - if (performancePresent) { - timers.performance = global.performance; - } - - if (requestAnimationFramePresent) { - timers.requestAnimationFrame = global.requestAnimationFrame; - } - - if (cancelAnimationFramePresent) { - timers.cancelAnimationFrame = global.cancelAnimationFrame; - } - - var keys = Object.keys || function (obj) { - var ks = []; - var key; - - for (key in obj) { - if (obj.hasOwnProperty(key)) { - ks.push(key); - } - } - - return ks; - }; - - exports.timers = timers; - - /** - * @param start {Date|number} the system time - * @param loopLimit {number} maximum number of timers that will be run when calling runAll() - */ - function createClock(start, loopLimit) { - start = start || 0; - loopLimit = loopLimit || 1000; - - var clock = { - now: getEpoch(start), - hrNow: 0, - timeouts: {}, - Date: createDate(), - loopLimit: loopLimit - }; - - clock.Date.clock = clock; - - function getTimeToNextFrame() { - return 16 - ((clock.now - start) % 16); - } - - clock.setTimeout = function setTimeout(func, timeout) { - return addTimer(clock, { - func: func, - args: Array.prototype.slice.call(arguments, 2), - delay: timeout - }); - }; - - clock.clearTimeout = function clearTimeout(timerId) { - return clearTimer(clock, timerId, "Timeout"); - }; - clock.nextTick = function nextTick(func) { - return enqueueJob(clock, { - func: func, - args: Array.prototype.slice.call(arguments, 1) - }); - }; - clock.setInterval = function setInterval(func, timeout) { - return addTimer(clock, { - func: func, - args: Array.prototype.slice.call(arguments, 2), - delay: timeout, - interval: timeout - }); - }; - - clock.clearInterval = function clearInterval(timerId) { - return clearTimer(clock, timerId, "Interval"); - }; - - clock.setImmediate = function setImmediate(func) { - return addTimer(clock, { - func: func, - args: Array.prototype.slice.call(arguments, 1), - immediate: true - }); - }; - - clock.clearImmediate = function clearImmediate(timerId) { - return clearTimer(clock, timerId, "Immediate"); - }; - - clock.requestAnimationFrame = function requestAnimationFrame(func) { - var result = addTimer(clock, { - func: func, - delay: getTimeToNextFrame(), - args: [clock.now + getTimeToNextFrame()], - animation: true - }); - - return result.id || result; - }; - - clock.cancelAnimationFrame = function cancelAnimationFrame(timerId) { - return clearTimer(clock, timerId, "AnimationFrame"); - }; - - function updateHrTime(newNow) { - clock.hrNow += (newNow - clock.now); - } - - clock.tick = function tick(ms) { - ms = typeof ms === "number" ? ms : parseTime(ms); - var tickFrom = clock.now; - var tickTo = clock.now + ms; - var previous = clock.now; - var timer, firstException, oldNow; - - clock.duringTick = true; - - // perform process.nextTick()s - oldNow = clock.now; - runJobs(clock); - if (oldNow !== clock.now) { - // compensate for any setSystemTime() call during process.nextTick() callback - tickFrom += clock.now - oldNow; - tickTo += clock.now - oldNow; - } - - // perform each timer in the requested range - timer = firstTimerInRange(clock, tickFrom, tickTo); - while (timer && tickFrom <= tickTo) { - if (clock.timers[timer.id]) { - updateHrTime(timer.callAt); - tickFrom = timer.callAt; - clock.now = timer.callAt; - oldNow = clock.now; - try { - runJobs(clock); - callTimer(clock, timer); - } catch (e) { - firstException = firstException || e; - } - - // compensate for any setSystemTime() call during timer callback - if (oldNow !== clock.now) { - tickFrom += clock.now - oldNow; - tickTo += clock.now - oldNow; - previous += clock.now - oldNow; - } - } - - timer = firstTimerInRange(clock, previous, tickTo); - previous = tickFrom; - } - - // perform process.nextTick()s again - oldNow = clock.now; - runJobs(clock); - if (oldNow !== clock.now) { - // compensate for any setSystemTime() call during process.nextTick() callback - tickFrom += clock.now - oldNow; - tickTo += clock.now - oldNow; - } - clock.duringTick = false; - - // corner case: during runJobs, new timers were scheduled which could be in the range [clock.now, tickTo] - timer = firstTimerInRange(clock, tickFrom, tickTo); - if (timer) { - try { - clock.tick(tickTo - clock.now); // do it all again - for the remainder of the requested range - } catch (e) { - firstException = firstException || e; - } - } else { - // no timers remaining in the requested range: move the clock all the way to the end - updateHrTime(tickTo); - clock.now = tickTo; - } - if (firstException) { - throw firstException; - } - return clock.now; - }; - - clock.next = function next() { - runJobs(clock); - var timer = firstTimer(clock); - if (!timer) { - return clock.now; - } - - clock.duringTick = true; - try { - updateHrTime(timer.callAt); - clock.now = timer.callAt; - callTimer(clock, timer); - runJobs(clock); - return clock.now; - } finally { - clock.duringTick = false; - } - }; - - clock.runAll = function runAll() { - var numTimers, i; - runJobs(clock); - for (i = 0; i < clock.loopLimit; i++) { - if (!clock.timers) { - return clock.now; - } - - numTimers = keys(clock.timers).length; - if (numTimers === 0) { - return clock.now; - } - - clock.next(); - } - - throw new Error("Aborting after running " + clock.loopLimit + " timers, assuming an infinite loop!"); - }; - - clock.runToFrame = function runToFrame() { - return clock.tick(getTimeToNextFrame()); - }; - - clock.runToLast = function runToLast() { - var timer = lastTimer(clock); - if (!timer) { - runJobs(clock); - return clock.now; - } - - return clock.tick(timer.callAt); - }; - - clock.reset = function reset() { - clock.timers = {}; - }; - - clock.setSystemTime = function setSystemTime(systemTime) { - // determine time difference - var newNow = getEpoch(systemTime); - var difference = newNow - clock.now; - var id, timer; - - // update 'system clock' - clock.now = newNow; - - // update timers and intervals to keep them stable - for (id in clock.timers) { - if (clock.timers.hasOwnProperty(id)) { - timer = clock.timers[id]; - timer.createdAt += difference; - timer.callAt += difference; - } - } - }; - - if (performancePresent) { - clock.performance = Object.create(global.performance); - clock.performance.now = function lolexNow() { - return clock.hrNow; - }; - } - if (hrtimePresent) { - clock.hrtime = function (prev) { - if (Array.isArray(prev)) { - var oldSecs = (prev[0] + prev[1] / 1e9); - var newSecs = (clock.hrNow / 1000); - var difference = (newSecs - oldSecs); - var secs = fixedFloor(difference); - var nanosecs = fixedModulo(difference * 1e9, 1e9); - return [ - secs, - nanosecs - ]; - } - return [ - fixedFloor(clock.hrNow / 1000), - fixedModulo(clock.hrNow * 1e6, 1e9) - ]; - }; - } - - return clock; - } - exports.createClock = createClock; - - /** - * @param config {Object} optional config - * @param config.target {Object} the target to install timers in (default `window`) - * @param config.now {number|Date} a number (in milliseconds) or a Date object (default epoch) - * @param config.toFake {string[]} names of the methods that should be faked. - * @param config.loopLimit {number} the maximum number of timers that will be run when calling runAll() - * @param config.shouldAdvanceTime {Boolean} tells lolex to increment mocked time automatically (default false) - * @param config.advanceTimeDelta {Number} increment mocked time every <> ms (default: 20ms) - */ - exports.install = function install(config) { - if ( arguments.length > 1 || config instanceof Date || Array.isArray(config) || typeof config === "number") { - throw new TypeError("lolex.install called with " + String(config) + - " lolex 2.0+ requires an object parameter - see https://github.com/sinonjs/lolex"); - } - config = typeof config !== "undefined" ? config : {}; - config.shouldAdvanceTime = config.shouldAdvanceTime || false; - config.advanceTimeDelta = config.advanceTimeDelta || 20; - - var i, l; - var target = config.target || global; - var clock = createClock(config.now, config.loopLimit); - - clock.uninstall = function () { - return uninstall(clock, target, config); - }; - - clock.methods = config.toFake || []; - - if (clock.methods.length === 0) { - // do not fake nextTick by default - GitHub#126 - clock.methods = keys(timers).filter(function (key) {return key !== "nextTick";}); - } - - for (i = 0, l = clock.methods.length; i < l; i++) { - if (clock.methods[i] === "hrtime") { - if (target.process && typeof target.process.hrtime === "function") { - hijackMethod(target.process, clock.methods[i], clock); - } - } else if (clock.methods[i] === "nextTick") { - if (target.process && typeof target.process.nextTick === "function") { - hijackMethod(target.process, clock.methods[i], clock); - } - } else { - if (clock.methods[i] === "setInterval" && config.shouldAdvanceTime === true) { - var intervalTick = doIntervalTick.bind(null, clock, config.advanceTimeDelta); - var intervalId = target[clock.methods[i]]( - intervalTick, - config.advanceTimeDelta); - clock.attachedInterval = intervalId; - } - hijackMethod(target, clock.methods[i], clock); - } - } - - return clock; - }; - - }).call(this,typeof commonjsGlobal$1 !== "undefined" ? commonjsGlobal$1 : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); - },{}],33:[function(require,module,exports){ - var isarray = require('isarray'); - - /** - * Expose `pathToRegexp`. - */ - module.exports = pathToRegexp; - module.exports.parse = parse; - module.exports.compile = compile; - module.exports.tokensToFunction = tokensToFunction; - module.exports.tokensToRegExp = tokensToRegExp; - - /** - * The main path matching regexp utility. - * - * @type {RegExp} - */ - var PATH_REGEXP = new RegExp([ - // Match escaped characters that would otherwise appear in future matches. - // This allows the user to escape special characters that won't transform. - '(\\\\.)', - // Match Express-style parameters and un-named parameters with a prefix - // and optional suffixes. Matches appear as: - // - // "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined] - // "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined] - // "/*" => ["/", undefined, undefined, undefined, undefined, "*"] - '([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))' - ].join('|'), 'g'); - - /** - * Parse a string for the raw tokens. - * - * @param {string} str - * @param {Object=} options - * @return {!Array} - */ - function parse (str, options) { - var tokens = []; - var key = 0; - var index = 0; - var path = ''; - var defaultDelimiter = options && options.delimiter || '/'; - var res; - - while ((res = PATH_REGEXP.exec(str)) != null) { - var m = res[0]; - var escaped = res[1]; - var offset = res.index; - path += str.slice(index, offset); - index = offset + m.length; - - // Ignore already escaped sequences. - if (escaped) { - path += escaped[1]; - continue - } - - var next = str[index]; - var prefix = res[2]; - var name = res[3]; - var capture = res[4]; - var group = res[5]; - var modifier = res[6]; - var asterisk = res[7]; - - // Push the current path onto the tokens. - if (path) { - tokens.push(path); - path = ''; - } - - var partial = prefix != null && next != null && next !== prefix; - var repeat = modifier === '+' || modifier === '*'; - var optional = modifier === '?' || modifier === '*'; - var delimiter = res[2] || defaultDelimiter; - var pattern = capture || group; - - tokens.push({ - name: name || key++, - prefix: prefix || '', - delimiter: delimiter, - optional: optional, - repeat: repeat, - partial: partial, - asterisk: !!asterisk, - pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?') - }); - } - - // Match any characters still remaining. - if (index < str.length) { - path += str.substr(index); - } - - // If the path exists, push it onto the end. - if (path) { - tokens.push(path); - } - - return tokens - } - - /** - * Compile a string to a template function for the path. - * - * @param {string} str - * @param {Object=} options - * @return {!function(Object=, Object=)} - */ - function compile (str, options) { - return tokensToFunction(parse(str, options)) - } - - /** - * Prettier encoding of URI path segments. - * - * @param {string} - * @return {string} - */ - function encodeURIComponentPretty (str) { - return encodeURI(str).replace(/[\/?#]/g, function (c) { - return '%' + c.charCodeAt(0).toString(16).toUpperCase() - }) - } - - /** - * Encode the asterisk parameter. Similar to `pretty`, but allows slashes. - * - * @param {string} - * @return {string} - */ - function encodeAsterisk (str) { - return encodeURI(str).replace(/[?#]/g, function (c) { - return '%' + c.charCodeAt(0).toString(16).toUpperCase() - }) - } - - /** - * Expose a method for transforming tokens into the path function. - */ - function tokensToFunction (tokens) { - // Compile all the tokens into regexps. - var matches = new Array(tokens.length); - - // Compile all the patterns before compilation. - for (var i = 0; i < tokens.length; i++) { - if (typeof tokens[i] === 'object') { - matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$'); - } - } - - return function (obj, opts) { - var path = ''; - var data = obj || {}; - var options = opts || {}; - var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent; - - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - - if (typeof token === 'string') { - path += token; - - continue - } - - var value = data[token.name]; - var segment; - - if (value == null) { - if (token.optional) { - // Prepend partial segment prefixes. - if (token.partial) { - path += token.prefix; - } - - continue - } else { - throw new TypeError('Expected "' + token.name + '" to be defined') - } - } - - if (isarray(value)) { - if (!token.repeat) { - throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`') - } - - if (value.length === 0) { - if (token.optional) { - continue - } else { - throw new TypeError('Expected "' + token.name + '" to not be empty') - } - } - - for (var j = 0; j < value.length; j++) { - segment = encode(value[j]); - - if (!matches[i].test(segment)) { - throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`') - } - - path += (j === 0 ? token.prefix : token.delimiter) + segment; - } - - continue - } - - segment = token.asterisk ? encodeAsterisk(value) : encode(value); - - if (!matches[i].test(segment)) { - throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"') - } - - path += token.prefix + segment; - } - - return path - } - } - - /** - * Escape a regular expression string. - * - * @param {string} str - * @return {string} - */ - function escapeString (str) { - return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1') - } - - /** - * Escape the capturing group by escaping special characters and meaning. - * - * @param {string} group - * @return {string} - */ - function escapeGroup (group) { - return group.replace(/([=!:$\/()])/g, '\\$1') - } - - /** - * Attach the keys as a property of the regexp. - * - * @param {!RegExp} re - * @param {Array} keys - * @return {!RegExp} - */ - function attachKeys (re, keys) { - re.keys = keys; - return re - } - - /** - * Get the flags for a regexp from the options. - * - * @param {Object} options - * @return {string} - */ - function flags (options) { - return options.sensitive ? '' : 'i' - } - - /** - * Pull out keys from a regexp. - * - * @param {!RegExp} path - * @param {!Array} keys - * @return {!RegExp} - */ - function regexpToRegexp (path, keys) { - // Use a negative lookahead to match only capturing groups. - var groups = path.source.match(/\((?!\?)/g); - - if (groups) { - for (var i = 0; i < groups.length; i++) { - keys.push({ - name: i, - prefix: null, - delimiter: null, - optional: false, - repeat: false, - partial: false, - asterisk: false, - pattern: null - }); - } - } - - return attachKeys(path, keys) - } - - /** - * Transform an array into a regexp. - * - * @param {!Array} path - * @param {Array} keys - * @param {!Object} options - * @return {!RegExp} - */ - function arrayToRegexp (path, keys, options) { - var parts = []; - - for (var i = 0; i < path.length; i++) { - parts.push(pathToRegexp(path[i], keys, options).source); - } - - var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options)); - - return attachKeys(regexp, keys) - } - - /** - * Create a path regexp from string input. - * - * @param {string} path - * @param {!Array} keys - * @param {!Object} options - * @return {!RegExp} - */ - function stringToRegexp (path, keys, options) { - return tokensToRegExp(parse(path, options), keys, options) - } - - /** - * Expose a function for taking tokens and returning a RegExp. - * - * @param {!Array} tokens - * @param {(Array|Object)=} keys - * @param {Object=} options - * @return {!RegExp} - */ - function tokensToRegExp (tokens, keys, options) { - if (!isarray(keys)) { - options = /** @type {!Object} */ (keys || options); - keys = []; - } - - options = options || {}; - - var strict = options.strict; - var end = options.end !== false; - var route = ''; - - // Iterate over the tokens and create our regexp string. - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - - if (typeof token === 'string') { - route += escapeString(token); - } else { - var prefix = escapeString(token.prefix); - var capture = '(?:' + token.pattern + ')'; - - keys.push(token); - - if (token.repeat) { - capture += '(?:' + prefix + capture + ')*'; - } - - if (token.optional) { - if (!token.partial) { - capture = '(?:' + prefix + '(' + capture + '))?'; - } else { - capture = prefix + '(' + capture + ')?'; - } - } else { - capture = prefix + '(' + capture + ')'; - } - - route += capture; - } - } - - var delimiter = escapeString(options.delimiter || '/'); - var endsWithDelimiter = route.slice(-delimiter.length) === delimiter; - - // In non-strict mode we allow a slash at the end of match. If the path to - // match already ends with a slash, we remove it for consistency. The slash - // is valid at the end of a path match, not in the middle. This is important - // in non-ending mode, where "/test/" shouldn't match "/test//route". - if (!strict) { - route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'; - } - - if (end) { - route += '$'; - } else { - // In non-ending mode, we need the capturing groups to match as much as - // possible by using a positive lookahead to the end or next path segment. - route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'; - } - - return attachKeys(new RegExp('^' + route, flags(options)), keys) - } - - /** - * Normalize the given path string, returning a regular expression. - * - * An empty array can be passed in for the keys, which will hold the - * placeholder key descriptions. For example, using `/user/:id`, `keys` will - * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. - * - * @param {(string|RegExp|Array)} path - * @param {(Array|Object)=} keys - * @param {Object=} options - * @return {!RegExp} - */ - function pathToRegexp (path, keys, options) { - if (!isarray(keys)) { - options = /** @type {!Object} */ (keys || options); - keys = []; - } - - options = options || {}; - - if (path instanceof RegExp) { - return regexpToRegexp(path, /** @type {!Array} */ (keys)) - } - - if (isarray(path)) { - return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options) - } - - return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options) - } - - },{"isarray":30}],34:[function(require,module,exports){ - // This is free and unencumbered software released into the public domain. - // See LICENSE.md for more information. - - var encoding = require("./lib/encoding.js"); - - module.exports = { - TextEncoder: encoding.TextEncoder, - TextDecoder: encoding.TextDecoder, - }; - - },{"./lib/encoding.js":36}],35:[function(require,module,exports){ - (function(global) { - - if (typeof module !== "undefined" && module.exports) { - module.exports = global; - } - - global["encoding-indexes"] = - { - "big5":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188], - "euc-kr":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], - "gb18030":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565], - "gb18030-ranges":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]], - "jis0208":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], - "jis0212":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null], - "ibm866":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160], - "iso-8859-2":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], - "iso-8859-3":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729], - "iso-8859-4":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729], - "iso-8859-5":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119], - "iso-8859-6":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null], - "iso-8859-7":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], - "iso-8859-8":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], - "iso-8859-10":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312], - "iso-8859-13":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217], - "iso-8859-14":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255], - "iso-8859-15":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], - "iso-8859-16":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255], - "koi8-r":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], - "koi8-u":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066], - "macintosh":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711], - "windows-874":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null], - "windows-1250":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729], - "windows-1251":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103], - "windows-1252":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255], - "windows-1253":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null], - "windows-1254":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255], - "windows-1255":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null], - "windows-1256":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746], - "windows-1257":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729], - "windows-1258":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255], - "x-mac-cyrillic":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364] - }; - - // For strict environments where `this` inside the global scope - // is `undefined`, take a pure object instead - }(this || {})); - },{}],36:[function(require,module,exports){ - // This is free and unencumbered software released into the public domain. - // See LICENSE.md for more information. - - /** - * @fileoverview Global |this| required for resolving indexes in node. - * @suppress {globalThis} - */ - (function(global) { - - // If we're in node require encoding-indexes and attach it to the global. - if (typeof module !== "undefined" && module.exports && - !global["encoding-indexes"]) { - global["encoding-indexes"] = - require("./encoding-indexes.js")["encoding-indexes"]; - } - - // - // Utilities - // - - /** - * @param {number} a The number to test. - * @param {number} min The minimum value in the range, inclusive. - * @param {number} max The maximum value in the range, inclusive. - * @return {boolean} True if a >= min and a <= max. - */ - function inRange(a, min, max) { - return min <= a && a <= max; - } - - /** - * @param {!Array.<*>} array The array to check. - * @param {*} item The item to look for in the array. - * @return {boolean} True if the item appears in the array. - */ - function includes(array, item) { - return array.indexOf(item) !== -1; - } - - var floor = Math.floor; - - /** - * @param {*} o - * @return {Object} - */ - function ToDictionary(o) { - if (o === undefined) return {}; - if (o === Object(o)) return o; - throw TypeError('Could not convert argument to dictionary'); - } - - /** - * @param {string} string Input string of UTF-16 code units. - * @return {!Array.} Code points. - */ - function stringToCodePoints(string) { - // https://heycam.github.io/webidl/#dfn-obtain-unicode - - // 1. Let S be the DOMString value. - var s = String(string); - - // 2. Let n be the length of S. - var n = s.length; - - // 3. Initialize i to 0. - var i = 0; - - // 4. Initialize U to be an empty sequence of Unicode characters. - var u = []; - - // 5. While i < n: - while (i < n) { - - // 1. Let c be the code unit in S at index i. - var c = s.charCodeAt(i); - - // 2. Depending on the value of c: - - // c < 0xD800 or c > 0xDFFF - if (c < 0xD800 || c > 0xDFFF) { - // Append to U the Unicode character with code point c. - u.push(c); - } - - // 0xDC00 ≤ c ≤ 0xDFFF - else if (0xDC00 <= c && c <= 0xDFFF) { - // Append to U a U+FFFD REPLACEMENT CHARACTER. - u.push(0xFFFD); - } - - // 0xD800 ≤ c ≤ 0xDBFF - else if (0xD800 <= c && c <= 0xDBFF) { - // 1. If i = n−1, then append to U a U+FFFD REPLACEMENT - // CHARACTER. - if (i === n - 1) { - u.push(0xFFFD); - } - // 2. Otherwise, i < n−1: - else { - // 1. Let d be the code unit in S at index i+1. - var d = s.charCodeAt(i + 1); - - // 2. If 0xDC00 ≤ d ≤ 0xDFFF, then: - if (0xDC00 <= d && d <= 0xDFFF) { - // 1. Let a be c & 0x3FF. - var a = c & 0x3FF; - - // 2. Let b be d & 0x3FF. - var b = d & 0x3FF; - - // 3. Append to U the Unicode character with code point - // 2^16+2^10*a+b. - u.push(0x10000 + (a << 10) + b); - - // 4. Set i to i+1. - i += 1; - } - - // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a - // U+FFFD REPLACEMENT CHARACTER. - else { - u.push(0xFFFD); - } - } - } - - // 3. Set i to i+1. - i += 1; - } - - // 6. Return U. - return u; - } - - /** - * @param {!Array.} code_points Array of code points. - * @return {string} string String of UTF-16 code units. - */ - function codePointsToString(code_points) { - var s = ''; - for (var i = 0; i < code_points.length; ++i) { - var cp = code_points[i]; - if (cp <= 0xFFFF) { - s += String.fromCharCode(cp); - } else { - cp -= 0x10000; - s += String.fromCharCode((cp >> 10) + 0xD800, - (cp & 0x3FF) + 0xDC00); - } - } - return s; - } - - - // - // Implementation of Encoding specification - // https://encoding.spec.whatwg.org/ - // - - // - // 4. Terminology - // - - /** - * An ASCII byte is a byte in the range 0x00 to 0x7F, inclusive. - * @param {number} a The number to test. - * @return {boolean} True if a is in the range 0x00 to 0x7F, inclusive. - */ - function isASCIIByte(a) { - return 0x00 <= a && a <= 0x7F; - } - - /** - * An ASCII code point is a code point in the range U+0000 to - * U+007F, inclusive. - */ - var isASCIICodePoint = isASCIIByte; - - - /** - * End-of-stream is a special token that signifies no more tokens - * are in the stream. - * @const - */ var end_of_stream = -1; - - /** - * A stream represents an ordered sequence of tokens. - * - * @constructor - * @param {!(Array.|Uint8Array)} tokens Array of tokens that provide - * the stream. - */ - function Stream(tokens) { - /** @type {!Array.} */ - this.tokens = [].slice.call(tokens); - // Reversed as push/pop is more efficient than shift/unshift. - this.tokens.reverse(); - } - - Stream.prototype = { - /** - * @return {boolean} True if end-of-stream has been hit. - */ - endOfStream: function() { - return !this.tokens.length; - }, - - /** - * When a token is read from a stream, the first token in the - * stream must be returned and subsequently removed, and - * end-of-stream must be returned otherwise. - * - * @return {number} Get the next token from the stream, or - * end_of_stream. - */ - read: function() { - if (!this.tokens.length) - return end_of_stream; - return this.tokens.pop(); - }, - - /** - * When one or more tokens are prepended to a stream, those tokens - * must be inserted, in given order, before the first token in the - * stream. - * - * @param {(number|!Array.)} token The token(s) to prepend to the - * stream. - */ - prepend: function(token) { - if (Array.isArray(token)) { - var tokens = /**@type {!Array.}*/(token); - while (tokens.length) - this.tokens.push(tokens.pop()); - } else { - this.tokens.push(token); - } - }, - - /** - * When one or more tokens are pushed to a stream, those tokens - * must be inserted, in given order, after the last token in the - * stream. - * - * @param {(number|!Array.)} token The tokens(s) to push to the - * stream. - */ - push: function(token) { - if (Array.isArray(token)) { - var tokens = /**@type {!Array.}*/(token); - while (tokens.length) - this.tokens.unshift(tokens.shift()); - } else { - this.tokens.unshift(token); - } - } - }; - - // - // 5. Encodings - // - - // 5.1 Encoders and decoders - - /** @const */ - var finished = -1; - - /** - * @param {boolean} fatal If true, decoding errors raise an exception. - * @param {number=} opt_code_point Override the standard fallback code point. - * @return {number} The code point to insert on a decoding error. - */ - function decoderError(fatal, opt_code_point) { - if (fatal) - throw TypeError('Decoder error'); - return opt_code_point || 0xFFFD; - } - - /** - * @param {number} code_point The code point that could not be encoded. - * @return {number} Always throws, no value is actually returned. - */ - function encoderError(code_point) { - throw TypeError('The code point ' + code_point + ' could not be encoded.'); - } - - // 5.2 Names and labels - - // TODO: Define @typedef for Encoding: {name:string,labels:Array.} - // https://github.com/google/closure-compiler/issues/247 - - /** - * @param {string} label The encoding label. - * @return {?{name:string,labels:Array.}} - */ - function getEncoding(label) { - // 1. Remove any leading and trailing ASCII whitespace from label. - label = String(label).trim().toLowerCase(); - - // 2. If label is an ASCII case-insensitive match for any of the - // labels listed in the table below, return the corresponding - // encoding, and failure otherwise. - if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) { - return label_to_encoding[label]; - } - return null; - } - - /** - * Encodings table: https://encoding.spec.whatwg.org/encodings.json - * @const - * @type {!Array.<{ - * heading: string, - * encodings: Array.<{name:string,labels:Array.}> - * }>} - */ - var encodings = [ - { - "encodings": [ - { - "labels": [ - "unicode-1-1-utf-8", - "utf-8", - "utf8" - ], - "name": "UTF-8" - } - ], - "heading": "The Encoding" - }, - { - "encodings": [ - { - "labels": [ - "866", - "cp866", - "csibm866", - "ibm866" - ], - "name": "IBM866" - }, - { - "labels": [ - "csisolatin2", - "iso-8859-2", - "iso-ir-101", - "iso8859-2", - "iso88592", - "iso_8859-2", - "iso_8859-2:1987", - "l2", - "latin2" - ], - "name": "ISO-8859-2" - }, - { - "labels": [ - "csisolatin3", - "iso-8859-3", - "iso-ir-109", - "iso8859-3", - "iso88593", - "iso_8859-3", - "iso_8859-3:1988", - "l3", - "latin3" - ], - "name": "ISO-8859-3" - }, - { - "labels": [ - "csisolatin4", - "iso-8859-4", - "iso-ir-110", - "iso8859-4", - "iso88594", - "iso_8859-4", - "iso_8859-4:1988", - "l4", - "latin4" - ], - "name": "ISO-8859-4" - }, - { - "labels": [ - "csisolatincyrillic", - "cyrillic", - "iso-8859-5", - "iso-ir-144", - "iso8859-5", - "iso88595", - "iso_8859-5", - "iso_8859-5:1988" - ], - "name": "ISO-8859-5" - }, - { - "labels": [ - "arabic", - "asmo-708", - "csiso88596e", - "csiso88596i", - "csisolatinarabic", - "ecma-114", - "iso-8859-6", - "iso-8859-6-e", - "iso-8859-6-i", - "iso-ir-127", - "iso8859-6", - "iso88596", - "iso_8859-6", - "iso_8859-6:1987" - ], - "name": "ISO-8859-6" - }, - { - "labels": [ - "csisolatingreek", - "ecma-118", - "elot_928", - "greek", - "greek8", - "iso-8859-7", - "iso-ir-126", - "iso8859-7", - "iso88597", - "iso_8859-7", - "iso_8859-7:1987", - "sun_eu_greek" - ], - "name": "ISO-8859-7" - }, - { - "labels": [ - "csiso88598e", - "csisolatinhebrew", - "hebrew", - "iso-8859-8", - "iso-8859-8-e", - "iso-ir-138", - "iso8859-8", - "iso88598", - "iso_8859-8", - "iso_8859-8:1988", - "visual" - ], - "name": "ISO-8859-8" - }, - { - "labels": [ - "csiso88598i", - "iso-8859-8-i", - "logical" - ], - "name": "ISO-8859-8-I" - }, - { - "labels": [ - "csisolatin6", - "iso-8859-10", - "iso-ir-157", - "iso8859-10", - "iso885910", - "l6", - "latin6" - ], - "name": "ISO-8859-10" - }, - { - "labels": [ - "iso-8859-13", - "iso8859-13", - "iso885913" - ], - "name": "ISO-8859-13" - }, - { - "labels": [ - "iso-8859-14", - "iso8859-14", - "iso885914" - ], - "name": "ISO-8859-14" - }, - { - "labels": [ - "csisolatin9", - "iso-8859-15", - "iso8859-15", - "iso885915", - "iso_8859-15", - "l9" - ], - "name": "ISO-8859-15" - }, - { - "labels": [ - "iso-8859-16" - ], - "name": "ISO-8859-16" - }, - { - "labels": [ - "cskoi8r", - "koi", - "koi8", - "koi8-r", - "koi8_r" - ], - "name": "KOI8-R" - }, - { - "labels": [ - "koi8-ru", - "koi8-u" - ], - "name": "KOI8-U" - }, - { - "labels": [ - "csmacintosh", - "mac", - "macintosh", - "x-mac-roman" - ], - "name": "macintosh" - }, - { - "labels": [ - "dos-874", - "iso-8859-11", - "iso8859-11", - "iso885911", - "tis-620", - "windows-874" - ], - "name": "windows-874" - }, - { - "labels": [ - "cp1250", - "windows-1250", - "x-cp1250" - ], - "name": "windows-1250" - }, - { - "labels": [ - "cp1251", - "windows-1251", - "x-cp1251" - ], - "name": "windows-1251" - }, - { - "labels": [ - "ansi_x3.4-1968", - "ascii", - "cp1252", - "cp819", - "csisolatin1", - "ibm819", - "iso-8859-1", - "iso-ir-100", - "iso8859-1", - "iso88591", - "iso_8859-1", - "iso_8859-1:1987", - "l1", - "latin1", - "us-ascii", - "windows-1252", - "x-cp1252" - ], - "name": "windows-1252" - }, - { - "labels": [ - "cp1253", - "windows-1253", - "x-cp1253" - ], - "name": "windows-1253" - }, - { - "labels": [ - "cp1254", - "csisolatin5", - "iso-8859-9", - "iso-ir-148", - "iso8859-9", - "iso88599", - "iso_8859-9", - "iso_8859-9:1989", - "l5", - "latin5", - "windows-1254", - "x-cp1254" - ], - "name": "windows-1254" - }, - { - "labels": [ - "cp1255", - "windows-1255", - "x-cp1255" - ], - "name": "windows-1255" - }, - { - "labels": [ - "cp1256", - "windows-1256", - "x-cp1256" - ], - "name": "windows-1256" - }, - { - "labels": [ - "cp1257", - "windows-1257", - "x-cp1257" - ], - "name": "windows-1257" - }, - { - "labels": [ - "cp1258", - "windows-1258", - "x-cp1258" - ], - "name": "windows-1258" - }, - { - "labels": [ - "x-mac-cyrillic", - "x-mac-ukrainian" - ], - "name": "x-mac-cyrillic" - } - ], - "heading": "Legacy single-byte encodings" - }, - { - "encodings": [ - { - "labels": [ - "chinese", - "csgb2312", - "csiso58gb231280", - "gb2312", - "gb_2312", - "gb_2312-80", - "gbk", - "iso-ir-58", - "x-gbk" - ], - "name": "GBK" - }, - { - "labels": [ - "gb18030" - ], - "name": "gb18030" - } - ], - "heading": "Legacy multi-byte Chinese (simplified) encodings" - }, - { - "encodings": [ - { - "labels": [ - "big5", - "big5-hkscs", - "cn-big5", - "csbig5", - "x-x-big5" - ], - "name": "Big5" - } - ], - "heading": "Legacy multi-byte Chinese (traditional) encodings" - }, - { - "encodings": [ - { - "labels": [ - "cseucpkdfmtjapanese", - "euc-jp", - "x-euc-jp" - ], - "name": "EUC-JP" - }, - { - "labels": [ - "csiso2022jp", - "iso-2022-jp" - ], - "name": "ISO-2022-JP" - }, - { - "labels": [ - "csshiftjis", - "ms932", - "ms_kanji", - "shift-jis", - "shift_jis", - "sjis", - "windows-31j", - "x-sjis" - ], - "name": "Shift_JIS" - } - ], - "heading": "Legacy multi-byte Japanese encodings" - }, - { - "encodings": [ - { - "labels": [ - "cseuckr", - "csksc56011987", - "euc-kr", - "iso-ir-149", - "korean", - "ks_c_5601-1987", - "ks_c_5601-1989", - "ksc5601", - "ksc_5601", - "windows-949" - ], - "name": "EUC-KR" - } - ], - "heading": "Legacy multi-byte Korean encodings" - }, - { - "encodings": [ - { - "labels": [ - "csiso2022kr", - "hz-gb-2312", - "iso-2022-cn", - "iso-2022-cn-ext", - "iso-2022-kr" - ], - "name": "replacement" - }, - { - "labels": [ - "utf-16be" - ], - "name": "UTF-16BE" - }, - { - "labels": [ - "utf-16", - "utf-16le" - ], - "name": "UTF-16LE" - }, - { - "labels": [ - "x-user-defined" - ], - "name": "x-user-defined" - } - ], - "heading": "Legacy miscellaneous encodings" - } - ]; - - // Label to encoding registry. - /** @type {Object.}>} */ - var label_to_encoding = {}; - encodings.forEach(function(category) { - category.encodings.forEach(function(encoding) { - encoding.labels.forEach(function(label) { - label_to_encoding[label] = encoding; - }); - }); - }); - - // Registry of of encoder/decoder factories, by encoding name. - /** @type {Object.} */ - var encoders = {}; - /** @type {Object.} */ - var decoders = {}; - - // - // 6. Indexes - // - - /** - * @param {number} pointer The |pointer| to search for. - * @param {(!Array.|undefined)} index The |index| to search within. - * @return {?number} The code point corresponding to |pointer| in |index|, - * or null if |code point| is not in |index|. - */ - function indexCodePointFor(pointer, index) { - if (!index) return null; - return index[pointer] || null; - } - - /** - * @param {number} code_point The |code point| to search for. - * @param {!Array.} index The |index| to search within. - * @return {?number} The first pointer corresponding to |code point| in - * |index|, or null if |code point| is not in |index|. - */ - function indexPointerFor(code_point, index) { - var pointer = index.indexOf(code_point); - return pointer === -1 ? null : pointer; - } - - /** - * @param {string} name Name of the index. - * @return {(!Array.|!Array.>)} - * */ - function index(name) { - if (!('encoding-indexes' in global)) { - throw Error("Indexes missing." + - " Did you forget to include encoding-indexes.js first?"); - } - return global['encoding-indexes'][name]; - } - - /** - * @param {number} pointer The |pointer| to search for in the gb18030 index. - * @return {?number} The code point corresponding to |pointer| in |index|, - * or null if |code point| is not in the gb18030 index. - */ - function indexGB18030RangesCodePointFor(pointer) { - // 1. If pointer is greater than 39419 and less than 189000, or - // pointer is greater than 1237575, return null. - if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575)) - return null; - - // 2. If pointer is 7457, return code point U+E7C7. - if (pointer === 7457) return 0xE7C7; - - // 3. Let offset be the last pointer in index gb18030 ranges that - // is equal to or less than pointer and let code point offset be - // its corresponding code point. - var offset = 0; - var code_point_offset = 0; - var idx = index('gb18030-ranges'); - var i; - for (i = 0; i < idx.length; ++i) { - /** @type {!Array.} */ - var entry = idx[i]; - if (entry[0] <= pointer) { - offset = entry[0]; - code_point_offset = entry[1]; - } else { - break; - } - } - - // 4. Return a code point whose value is code point offset + - // pointer − offset. - return code_point_offset + pointer - offset; - } - - /** - * @param {number} code_point The |code point| to locate in the gb18030 index. - * @return {number} The first pointer corresponding to |code point| in the - * gb18030 index. - */ - function indexGB18030RangesPointerFor(code_point) { - // 1. If code point is U+E7C7, return pointer 7457. - if (code_point === 0xE7C7) return 7457; - - // 2. Let offset be the last code point in index gb18030 ranges - // that is equal to or less than code point and let pointer offset - // be its corresponding pointer. - var offset = 0; - var pointer_offset = 0; - var idx = index('gb18030-ranges'); - var i; - for (i = 0; i < idx.length; ++i) { - /** @type {!Array.} */ - var entry = idx[i]; - if (entry[1] <= code_point) { - offset = entry[1]; - pointer_offset = entry[0]; - } else { - break; - } - } - - // 3. Return a pointer whose value is pointer offset + code point - // − offset. - return pointer_offset + code_point - offset; - } - - /** - * @param {number} code_point The |code_point| to search for in the Shift_JIS - * index. - * @return {?number} The code point corresponding to |pointer| in |index|, - * or null if |code point| is not in the Shift_JIS index. - */ - function indexShiftJISPointerFor(code_point) { - // 1. Let index be index jis0208 excluding all entries whose - // pointer is in the range 8272 to 8835, inclusive. - shift_jis_index = shift_jis_index || - index('jis0208').map(function(code_point, pointer) { - return inRange(pointer, 8272, 8835) ? null : code_point; - }); - var index_ = shift_jis_index; - - // 2. Return the index pointer for code point in index. - return index_.indexOf(code_point); - } - var shift_jis_index; - - /** - * @param {number} code_point The |code_point| to search for in the big5 - * index. - * @return {?number} The code point corresponding to |pointer| in |index|, - * or null if |code point| is not in the big5 index. - */ - function indexBig5PointerFor(code_point) { - // 1. Let index be index Big5 excluding all entries whose pointer - big5_index_no_hkscs = big5_index_no_hkscs || - index('big5').map(function(code_point, pointer) { - return (pointer < (0xA1 - 0x81) * 157) ? null : code_point; - }); - var index_ = big5_index_no_hkscs; - - // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or - // U+5345, return the last pointer corresponding to code point in - // index. - if (code_point === 0x2550 || code_point === 0x255E || - code_point === 0x2561 || code_point === 0x256A || - code_point === 0x5341 || code_point === 0x5345) { - return index_.lastIndexOf(code_point); - } - - // 3. Return the index pointer for code point in index. - return indexPointerFor(code_point, index_); - } - var big5_index_no_hkscs; - - // - // 8. API - // - - /** @const */ var DEFAULT_ENCODING = 'utf-8'; - - // 8.1 Interface TextDecoder - - /** - * @constructor - * @param {string=} label The label of the encoding; - * defaults to 'utf-8'. - * @param {Object=} options - */ - function TextDecoder(label, options) { - // Web IDL conventions - if (!(this instanceof TextDecoder)) - throw TypeError('Called as a function. Did you forget \'new\'?'); - label = label !== undefined ? String(label) : DEFAULT_ENCODING; - options = ToDictionary(options); - - // A TextDecoder object has an associated encoding, decoder, - // stream, ignore BOM flag (initially unset), BOM seen flag - // (initially unset), error mode (initially replacement), and do - // not flush flag (initially unset). - - /** @private */ - this._encoding = null; - /** @private @type {?Decoder} */ - this._decoder = null; - /** @private @type {boolean} */ - this._ignoreBOM = false; - /** @private @type {boolean} */ - this._BOMseen = false; - /** @private @type {string} */ - this._error_mode = 'replacement'; - /** @private @type {boolean} */ - this._do_not_flush = false; - - - // 1. Let encoding be the result of getting an encoding from - // label. - var encoding = getEncoding(label); - - // 2. If encoding is failure or replacement, throw a RangeError. - if (encoding === null || encoding.name === 'replacement') - throw RangeError('Unknown encoding: ' + label); - if (!decoders[encoding.name]) { - throw Error('Decoder not present.' + - ' Did you forget to include encoding-indexes.js first?'); - } - - // 3. Let dec be a new TextDecoder object. - var dec = this; - - // 4. Set dec's encoding to encoding. - dec._encoding = encoding; - - // 5. If options's fatal member is true, set dec's error mode to - // fatal. - if (Boolean(options['fatal'])) - dec._error_mode = 'fatal'; - - // 6. If options's ignoreBOM member is true, set dec's ignore BOM - // flag. - if (Boolean(options['ignoreBOM'])) - dec._ignoreBOM = true; - - // For pre-ES5 runtimes: - if (!Object.defineProperty) { - this.encoding = dec._encoding.name.toLowerCase(); - this.fatal = dec._error_mode === 'fatal'; - this.ignoreBOM = dec._ignoreBOM; - } - - // 7. Return dec. - return dec; - } - - if (Object.defineProperty) { - // The encoding attribute's getter must return encoding's name. - Object.defineProperty(TextDecoder.prototype, 'encoding', { - /** @this {TextDecoder} */ - get: function() { return this._encoding.name.toLowerCase(); } - }); - - // The fatal attribute's getter must return true if error mode - // is fatal, and false otherwise. - Object.defineProperty(TextDecoder.prototype, 'fatal', { - /** @this {TextDecoder} */ - get: function() { return this._error_mode === 'fatal'; } - }); - - // The ignoreBOM attribute's getter must return true if ignore - // BOM flag is set, and false otherwise. - Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', { - /** @this {TextDecoder} */ - get: function() { return this._ignoreBOM; } - }); - } - - /** - * @param {BufferSource=} input The buffer of bytes to decode. - * @param {Object=} options - * @return {string} The decoded string. - */ - TextDecoder.prototype.decode = function decode(input, options) { - var bytes; - if (typeof input === 'object' && input instanceof ArrayBuffer) { - bytes = new Uint8Array(input); - } else if (typeof input === 'object' && 'buffer' in input && - input.buffer instanceof ArrayBuffer) { - bytes = new Uint8Array(input.buffer, - input.byteOffset, - input.byteLength); - } else { - bytes = new Uint8Array(0); - } - - options = ToDictionary(options); - - // 1. If the do not flush flag is unset, set decoder to a new - // encoding's decoder, set stream to a new stream, and unset the - // BOM seen flag. - if (!this._do_not_flush) { - this._decoder = decoders[this._encoding.name]({ - fatal: this._error_mode === 'fatal'}); - this._BOMseen = false; - } - - // 2. If options's stream is true, set the do not flush flag, and - // unset the do not flush flag otherwise. - this._do_not_flush = Boolean(options['stream']); - - // 3. If input is given, push a copy of input to stream. - // TODO: Align with spec algorithm - maintain stream on instance. - var input_stream = new Stream(bytes); - - // 4. Let output be a new stream. - var output = []; - - /** @type {?(number|!Array.)} */ - var result; - - // 5. While true: - while (true) { - // 1. Let token be the result of reading from stream. - var token = input_stream.read(); - - // 2. If token is end-of-stream and the do not flush flag is - // set, return output, serialized. - // TODO: Align with spec algorithm. - if (token === end_of_stream) - break; - - // 3. Otherwise, run these subsubsteps: - - // 1. Let result be the result of processing token for decoder, - // stream, output, and error mode. - result = this._decoder.handler(input_stream, token); - - // 2. If result is finished, return output, serialized. - if (result === finished) - break; - - if (result !== null) { - if (Array.isArray(result)) - output.push.apply(output, /**@type {!Array.}*/(result)); - else - output.push(result); - } - - // 3. Otherwise, if result is error, throw a TypeError. - // (Thrown in handler) - - // 4. Otherwise, do nothing. - } - // TODO: Align with spec algorithm. - if (!this._do_not_flush) { - do { - result = this._decoder.handler(input_stream, input_stream.read()); - if (result === finished) - break; - if (result === null) - continue; - if (Array.isArray(result)) - output.push.apply(output, /**@type {!Array.}*/(result)); - else - output.push(result); - } while (!input_stream.endOfStream()); - this._decoder = null; - } - - // A TextDecoder object also has an associated serialize stream - // algorithm... - /** - * @param {!Array.} stream - * @return {string} - * @this {TextDecoder} - */ - function serializeStream(stream) { - // 1. Let token be the result of reading from stream. - // (Done in-place on array, rather than as a stream) - - // 2. If encoding is UTF-8, UTF-16BE, or UTF-16LE, and ignore - // BOM flag and BOM seen flag are unset, run these subsubsteps: - if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) && - !this._ignoreBOM && !this._BOMseen) { - if (stream.length > 0 && stream[0] === 0xFEFF) { - // 1. If token is U+FEFF, set BOM seen flag. - this._BOMseen = true; - stream.shift(); - } else if (stream.length > 0) { - // 2. Otherwise, if token is not end-of-stream, set BOM seen - // flag and append token to stream. - this._BOMseen = true; - } - } - // 4. Otherwise, return output. - return codePointsToString(stream); - } - - return serializeStream.call(this, output); - }; - - // 8.2 Interface TextEncoder - - /** - * @constructor - * @param {string=} label The label of the encoding. NONSTANDARD. - * @param {Object=} options NONSTANDARD. - */ - function TextEncoder(label, options) { - // Web IDL conventions - if (!(this instanceof TextEncoder)) - throw TypeError('Called as a function. Did you forget \'new\'?'); - options = ToDictionary(options); - - // A TextEncoder object has an associated encoding and encoder. - - /** @private */ - this._encoding = null; - /** @private @type {?Encoder} */ - this._encoder = null; - - // Non-standard - /** @private @type {boolean} */ - this._do_not_flush = false; - /** @private @type {string} */ - this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement'; - - // 1. Let enc be a new TextEncoder object. - var enc = this; - - // 2. Set enc's encoding to UTF-8's encoder. - if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) { - // NONSTANDARD behavior. - label = label !== undefined ? String(label) : DEFAULT_ENCODING; - var encoding = getEncoding(label); - if (encoding === null || encoding.name === 'replacement') - throw RangeError('Unknown encoding: ' + label); - if (!encoders[encoding.name]) { - throw Error('Encoder not present.' + - ' Did you forget to include encoding-indexes.js first?'); - } - enc._encoding = encoding; - } else { - // Standard behavior. - enc._encoding = getEncoding('utf-8'); - - if (label !== undefined && 'console' in global) { - console.warn('TextEncoder constructor called with encoding label, ' - + 'which is ignored.'); - } - } - - // For pre-ES5 runtimes: - if (!Object.defineProperty) - this.encoding = enc._encoding.name.toLowerCase(); - - // 3. Return enc. - return enc; - } - - if (Object.defineProperty) { - // The encoding attribute's getter must return encoding's name. - Object.defineProperty(TextEncoder.prototype, 'encoding', { - /** @this {TextEncoder} */ - get: function() { return this._encoding.name.toLowerCase(); } - }); - } - - /** - * @param {string=} opt_string The string to encode. - * @param {Object=} options - * @return {!Uint8Array} Encoded bytes, as a Uint8Array. - */ - TextEncoder.prototype.encode = function encode(opt_string, options) { - opt_string = opt_string === undefined ? '' : String(opt_string); - options = ToDictionary(options); - - // NOTE: This option is nonstandard. None of the encodings - // permitted for encoding (i.e. UTF-8, UTF-16) are stateful when - // the input is a USVString so streaming is not necessary. - if (!this._do_not_flush) - this._encoder = encoders[this._encoding.name]({ - fatal: this._fatal === 'fatal'}); - this._do_not_flush = Boolean(options['stream']); - - // 1. Convert input to a stream. - var input = new Stream(stringToCodePoints(opt_string)); - - // 2. Let output be a new stream - var output = []; - - /** @type {?(number|!Array.)} */ - var result; - // 3. While true, run these substeps: - while (true) { - // 1. Let token be the result of reading from input. - var token = input.read(); - if (token === end_of_stream) - break; - // 2. Let result be the result of processing token for encoder, - // input, output. - result = this._encoder.handler(input, token); - if (result === finished) - break; - if (Array.isArray(result)) - output.push.apply(output, /**@type {!Array.}*/(result)); - else - output.push(result); - } - // TODO: Align with spec algorithm. - if (!this._do_not_flush) { - while (true) { - result = this._encoder.handler(input, input.read()); - if (result === finished) - break; - if (Array.isArray(result)) - output.push.apply(output, /**@type {!Array.}*/(result)); - else - output.push(result); - } - this._encoder = null; - } - // 3. If result is finished, convert output into a byte sequence, - // and then return a Uint8Array object wrapping an ArrayBuffer - // containing output. - return new Uint8Array(output); - }; - - - // - // 9. The encoding - // - - // 9.1 utf-8 - - // 9.1.1 utf-8 decoder - /** - * @constructor - * @implements {Decoder} - * @param {{fatal: boolean}} options - */ - function UTF8Decoder(options) { - var fatal = options.fatal; - - // utf-8's decoder's has an associated utf-8 code point, utf-8 - // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8 - // lower boundary (initially 0x80), and a utf-8 upper boundary - // (initially 0xBF). - var /** @type {number} */ utf8_code_point = 0, - /** @type {number} */ utf8_bytes_seen = 0, - /** @type {number} */ utf8_bytes_needed = 0, - /** @type {number} */ utf8_lower_boundary = 0x80, - /** @type {number} */ utf8_upper_boundary = 0xBF; - - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // 1. If byte is end-of-stream and utf-8 bytes needed is not 0, - // set utf-8 bytes needed to 0 and return error. - if (bite === end_of_stream && utf8_bytes_needed !== 0) { - utf8_bytes_needed = 0; - return decoderError(fatal); - } - - // 2. If byte is end-of-stream, return finished. - if (bite === end_of_stream) - return finished; - - // 3. If utf-8 bytes needed is 0, based on byte: - if (utf8_bytes_needed === 0) { - - // 0x00 to 0x7F - if (inRange(bite, 0x00, 0x7F)) { - // Return a code point whose value is byte. - return bite; - } - - // 0xC2 to 0xDF - else if (inRange(bite, 0xC2, 0xDF)) { - // 1. Set utf-8 bytes needed to 1. - utf8_bytes_needed = 1; - - // 2. Set UTF-8 code point to byte & 0x1F. - utf8_code_point = bite & 0x1F; - } - - // 0xE0 to 0xEF - else if (inRange(bite, 0xE0, 0xEF)) { - // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0. - if (bite === 0xE0) - utf8_lower_boundary = 0xA0; - // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F. - if (bite === 0xED) - utf8_upper_boundary = 0x9F; - // 3. Set utf-8 bytes needed to 2. - utf8_bytes_needed = 2; - // 4. Set UTF-8 code point to byte & 0xF. - utf8_code_point = bite & 0xF; - } - - // 0xF0 to 0xF4 - else if (inRange(bite, 0xF0, 0xF4)) { - // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90. - if (bite === 0xF0) - utf8_lower_boundary = 0x90; - // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F. - if (bite === 0xF4) - utf8_upper_boundary = 0x8F; - // 3. Set utf-8 bytes needed to 3. - utf8_bytes_needed = 3; - // 4. Set UTF-8 code point to byte & 0x7. - utf8_code_point = bite & 0x7; - } - - // Otherwise - else { - // Return error. - return decoderError(fatal); - } - - // Return continue. - return null; - } - - // 4. If byte is not in the range utf-8 lower boundary to utf-8 - // upper boundary, inclusive, run these substeps: - if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) { - - // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8 - // bytes seen to 0, set utf-8 lower boundary to 0x80, and set - // utf-8 upper boundary to 0xBF. - utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; - utf8_lower_boundary = 0x80; - utf8_upper_boundary = 0xBF; - - // 2. Prepend byte to stream. - stream.prepend(bite); - - // 3. Return error. - return decoderError(fatal); - } - - // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary - // to 0xBF. - utf8_lower_boundary = 0x80; - utf8_upper_boundary = 0xBF; - - // 6. Set UTF-8 code point to (UTF-8 code point << 6) | (byte & - // 0x3F) - utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F); - - // 7. Increase utf-8 bytes seen by one. - utf8_bytes_seen += 1; - - // 8. If utf-8 bytes seen is not equal to utf-8 bytes needed, - // continue. - if (utf8_bytes_seen !== utf8_bytes_needed) - return null; - - // 9. Let code point be utf-8 code point. - var code_point = utf8_code_point; - - // 10. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes - // seen to 0. - utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0; - - // 11. Return a code point whose value is code point. - return code_point; - }; - } - - // 9.1.2 utf-8 encoder - /** - * @constructor - * @implements {Encoder} - * @param {{fatal: boolean}} options - */ - function UTF8Encoder(options) { - var fatal = options.fatal; - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1. If code point is end-of-stream, return finished. - if (code_point === end_of_stream) - return finished; - - // 2. If code point is an ASCII code point, return a byte whose - // value is code point. - if (isASCIICodePoint(code_point)) - return code_point; - - // 3. Set count and offset based on the range code point is in: - var count, offset; - // U+0080 to U+07FF, inclusive: - if (inRange(code_point, 0x0080, 0x07FF)) { - // 1 and 0xC0 - count = 1; - offset = 0xC0; - } - // U+0800 to U+FFFF, inclusive: - else if (inRange(code_point, 0x0800, 0xFFFF)) { - // 2 and 0xE0 - count = 2; - offset = 0xE0; - } - // U+10000 to U+10FFFF, inclusive: - else if (inRange(code_point, 0x10000, 0x10FFFF)) { - // 3 and 0xF0 - count = 3; - offset = 0xF0; - } - - // 4. Let bytes be a byte sequence whose first byte is (code - // point >> (6 × count)) + offset. - var bytes = [(code_point >> (6 * count)) + offset]; - - // 5. Run these substeps while count is greater than 0: - while (count > 0) { - - // 1. Set temp to code point >> (6 × (count − 1)). - var temp = code_point >> (6 * (count - 1)); - - // 2. Append to bytes 0x80 | (temp & 0x3F). - bytes.push(0x80 | (temp & 0x3F)); - - // 3. Decrease count by one. - count -= 1; - } - - // 6. Return bytes bytes, in order. - return bytes; - }; - } - - /** @param {{fatal: boolean}} options */ - encoders['UTF-8'] = function(options) { - return new UTF8Encoder(options); - }; - /** @param {{fatal: boolean}} options */ - decoders['UTF-8'] = function(options) { - return new UTF8Decoder(options); - }; - - // - // 10. Legacy single-byte encodings - // - - // 10.1 single-byte decoder - /** - * @constructor - * @implements {Decoder} - * @param {!Array.} index The encoding index. - * @param {{fatal: boolean}} options - */ - function SingleByteDecoder(index, options) { - var fatal = options.fatal; - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // 1. If byte is end-of-stream, return finished. - if (bite === end_of_stream) - return finished; - - // 2. If byte is an ASCII byte, return a code point whose value - // is byte. - if (isASCIIByte(bite)) - return bite; - - // 3. Let code point be the index code point for byte − 0x80 in - // index single-byte. - var code_point = index[bite - 0x80]; - - // 4. If code point is null, return error. - if (code_point === null) - return decoderError(fatal); - - // 5. Return a code point whose value is code point. - return code_point; - }; - } - - // 10.2 single-byte encoder - /** - * @constructor - * @implements {Encoder} - * @param {!Array.} index The encoding index. - * @param {{fatal: boolean}} options - */ - function SingleByteEncoder(index, options) { - var fatal = options.fatal; - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1. If code point is end-of-stream, return finished. - if (code_point === end_of_stream) - return finished; - - // 2. If code point is an ASCII code point, return a byte whose - // value is code point. - if (isASCIICodePoint(code_point)) - return code_point; - - // 3. Let pointer be the index pointer for code point in index - // single-byte. - var pointer = indexPointerFor(code_point, index); - - // 4. If pointer is null, return error with code point. - if (pointer === null) - encoderError(code_point); - - // 5. Return a byte whose value is pointer + 0x80. - return pointer + 0x80; - }; - } - - (function() { - if (!('encoding-indexes' in global)) - return; - encodings.forEach(function(category) { - if (category.heading !== 'Legacy single-byte encodings') - return; - category.encodings.forEach(function(encoding) { - var name = encoding.name; - var idx = index(name.toLowerCase()); - /** @param {{fatal: boolean}} options */ - decoders[name] = function(options) { - return new SingleByteDecoder(idx, options); - }; - /** @param {{fatal: boolean}} options */ - encoders[name] = function(options) { - return new SingleByteEncoder(idx, options); - }; - }); - }); - }()); - - // - // 11. Legacy multi-byte Chinese (simplified) encodings - // - - // 11.1 gbk - - // 11.1.1 gbk decoder - // gbk's decoder is gb18030's decoder. - /** @param {{fatal: boolean}} options */ - decoders['GBK'] = function(options) { - return new GB18030Decoder(options); - }; - - // 11.1.2 gbk encoder - // gbk's encoder is gb18030's encoder with its gbk flag set. - /** @param {{fatal: boolean}} options */ - encoders['GBK'] = function(options) { - return new GB18030Encoder(options, true); - }; - - // 11.2 gb18030 - - // 11.2.1 gb18030 decoder - /** - * @constructor - * @implements {Decoder} - * @param {{fatal: boolean}} options - */ - function GB18030Decoder(options) { - var fatal = options.fatal; - // gb18030's decoder has an associated gb18030 first, gb18030 - // second, and gb18030 third (all initially 0x00). - var /** @type {number} */ gb18030_first = 0x00, - /** @type {number} */ gb18030_second = 0x00, - /** @type {number} */ gb18030_third = 0x00; - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // 1. If byte is end-of-stream and gb18030 first, gb18030 - // second, and gb18030 third are 0x00, return finished. - if (bite === end_of_stream && gb18030_first === 0x00 && - gb18030_second === 0x00 && gb18030_third === 0x00) { - return finished; - } - // 2. If byte is end-of-stream, and gb18030 first, gb18030 - // second, or gb18030 third is not 0x00, set gb18030 first, - // gb18030 second, and gb18030 third to 0x00, and return error. - if (bite === end_of_stream && - (gb18030_first !== 0x00 || gb18030_second !== 0x00 || - gb18030_third !== 0x00)) { - gb18030_first = 0x00; - gb18030_second = 0x00; - gb18030_third = 0x00; - decoderError(fatal); - } - var code_point; - // 3. If gb18030 third is not 0x00, run these substeps: - if (gb18030_third !== 0x00) { - // 1. Let code point be null. - code_point = null; - // 2. If byte is in the range 0x30 to 0x39, inclusive, set - // code point to the index gb18030 ranges code point for - // (((gb18030 first − 0x81) × 10 + gb18030 second − 0x30) × - // 126 + gb18030 third − 0x81) × 10 + byte − 0x30. - if (inRange(bite, 0x30, 0x39)) { - code_point = indexGB18030RangesCodePointFor( - (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 + - gb18030_third - 0x81) * 10 + bite - 0x30); - } - - // 3. Let buffer be a byte sequence consisting of gb18030 - // second, gb18030 third, and byte, in order. - var buffer = [gb18030_second, gb18030_third, bite]; - - // 4. Set gb18030 first, gb18030 second, and gb18030 third to - // 0x00. - gb18030_first = 0x00; - gb18030_second = 0x00; - gb18030_third = 0x00; - - // 5. If code point is null, prepend buffer to stream and - // return error. - if (code_point === null) { - stream.prepend(buffer); - return decoderError(fatal); - } - - // 6. Return a code point whose value is code point. - return code_point; - } - - // 4. If gb18030 second is not 0x00, run these substeps: - if (gb18030_second !== 0x00) { - - // 1. If byte is in the range 0x81 to 0xFE, inclusive, set - // gb18030 third to byte and return continue. - if (inRange(bite, 0x81, 0xFE)) { - gb18030_third = bite; - return null; - } - - // 2. Prepend gb18030 second followed by byte to stream, set - // gb18030 first and gb18030 second to 0x00, and return error. - stream.prepend([gb18030_second, bite]); - gb18030_first = 0x00; - gb18030_second = 0x00; - return decoderError(fatal); - } - - // 5. If gb18030 first is not 0x00, run these substeps: - if (gb18030_first !== 0x00) { - - // 1. If byte is in the range 0x30 to 0x39, inclusive, set - // gb18030 second to byte and return continue. - if (inRange(bite, 0x30, 0x39)) { - gb18030_second = bite; - return null; - } - - // 2. Let lead be gb18030 first, let pointer be null, and set - // gb18030 first to 0x00. - var lead = gb18030_first; - var pointer = null; - gb18030_first = 0x00; - - // 3. Let offset be 0x40 if byte is less than 0x7F and 0x41 - // otherwise. - var offset = bite < 0x7F ? 0x40 : 0x41; - - // 4. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 - // to 0xFE, inclusive, set pointer to (lead − 0x81) × 190 + - // (byte − offset). - if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE)) - pointer = (lead - 0x81) * 190 + (bite - offset); - - // 5. Let code point be null if pointer is null and the index - // code point for pointer in index gb18030 otherwise. - code_point = pointer === null ? null : - indexCodePointFor(pointer, index('gb18030')); - - // 6. If code point is null and byte is an ASCII byte, prepend - // byte to stream. - if (code_point === null && isASCIIByte(bite)) - stream.prepend(bite); - - // 7. If code point is null, return error. - if (code_point === null) - return decoderError(fatal); - - // 8. Return a code point whose value is code point. - return code_point; - } - - // 6. If byte is an ASCII byte, return a code point whose value - // is byte. - if (isASCIIByte(bite)) - return bite; - - // 7. If byte is 0x80, return code point U+20AC. - if (bite === 0x80) - return 0x20AC; - - // 8. If byte is in the range 0x81 to 0xFE, inclusive, set - // gb18030 first to byte and return continue. - if (inRange(bite, 0x81, 0xFE)) { - gb18030_first = bite; - return null; - } - - // 9. Return error. - return decoderError(fatal); - }; - } - - // 11.2.2 gb18030 encoder - /** - * @constructor - * @implements {Encoder} - * @param {{fatal: boolean}} options - * @param {boolean=} gbk_flag - */ - function GB18030Encoder(options, gbk_flag) { - var fatal = options.fatal; - // gb18030's decoder has an associated gbk flag (initially unset). - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1. If code point is end-of-stream, return finished. - if (code_point === end_of_stream) - return finished; - - // 2. If code point is an ASCII code point, return a byte whose - // value is code point. - if (isASCIICodePoint(code_point)) - return code_point; - - // 3. If code point is U+E5E5, return error with code point. - if (code_point === 0xE5E5) - return encoderError(code_point); - - // 4. If the gbk flag is set and code point is U+20AC, return - // byte 0x80. - if (gbk_flag && code_point === 0x20AC) - return 0x80; - - // 5. Let pointer be the index pointer for code point in index - // gb18030. - var pointer = indexPointerFor(code_point, index('gb18030')); - - // 6. If pointer is not null, run these substeps: - if (pointer !== null) { - - // 1. Let lead be floor(pointer / 190) + 0x81. - var lead = floor(pointer / 190) + 0x81; - - // 2. Let trail be pointer % 190. - var trail = pointer % 190; - - // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise. - var offset = trail < 0x3F ? 0x40 : 0x41; - - // 4. Return two bytes whose values are lead and trail + offset. - return [lead, trail + offset]; - } - - // 7. If gbk flag is set, return error with code point. - if (gbk_flag) - return encoderError(code_point); - - // 8. Set pointer to the index gb18030 ranges pointer for code - // point. - pointer = indexGB18030RangesPointerFor(code_point); - - // 9. Let byte1 be floor(pointer / 10 / 126 / 10). - var byte1 = floor(pointer / 10 / 126 / 10); - - // 10. Set pointer to pointer − byte1 × 10 × 126 × 10. - pointer = pointer - byte1 * 10 * 126 * 10; - - // 11. Let byte2 be floor(pointer / 10 / 126). - var byte2 = floor(pointer / 10 / 126); - - // 12. Set pointer to pointer − byte2 × 10 × 126. - pointer = pointer - byte2 * 10 * 126; - - // 13. Let byte3 be floor(pointer / 10). - var byte3 = floor(pointer / 10); - - // 14. Let byte4 be pointer − byte3 × 10. - var byte4 = pointer - byte3 * 10; - - // 15. Return four bytes whose values are byte1 + 0x81, byte2 + - // 0x30, byte3 + 0x81, byte4 + 0x30. - return [byte1 + 0x81, - byte2 + 0x30, - byte3 + 0x81, - byte4 + 0x30]; - }; - } - - /** @param {{fatal: boolean}} options */ - encoders['gb18030'] = function(options) { - return new GB18030Encoder(options); - }; - /** @param {{fatal: boolean}} options */ - decoders['gb18030'] = function(options) { - return new GB18030Decoder(options); - }; - - - // - // 12. Legacy multi-byte Chinese (traditional) encodings - // - - // 12.1 Big5 - - // 12.1.1 Big5 decoder - /** - * @constructor - * @implements {Decoder} - * @param {{fatal: boolean}} options - */ - function Big5Decoder(options) { - var fatal = options.fatal; - // Big5's decoder has an associated Big5 lead (initially 0x00). - var /** @type {number} */ Big5_lead = 0x00; - - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // 1. If byte is end-of-stream and Big5 lead is not 0x00, set - // Big5 lead to 0x00 and return error. - if (bite === end_of_stream && Big5_lead !== 0x00) { - Big5_lead = 0x00; - return decoderError(fatal); - } - - // 2. If byte is end-of-stream and Big5 lead is 0x00, return - // finished. - if (bite === end_of_stream && Big5_lead === 0x00) - return finished; - - // 3. If Big5 lead is not 0x00, let lead be Big5 lead, let - // pointer be null, set Big5 lead to 0x00, and then run these - // substeps: - if (Big5_lead !== 0x00) { - var lead = Big5_lead; - var pointer = null; - Big5_lead = 0x00; - - // 1. Let offset be 0x40 if byte is less than 0x7F and 0x62 - // otherwise. - var offset = bite < 0x7F ? 0x40 : 0x62; - - // 2. If byte is in the range 0x40 to 0x7E, inclusive, or 0xA1 - // to 0xFE, inclusive, set pointer to (lead − 0x81) × 157 + - // (byte − offset). - if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE)) - pointer = (lead - 0x81) * 157 + (bite - offset); - - // 3. If there is a row in the table below whose first column - // is pointer, return the two code points listed in its second - // column - // Pointer | Code points - // --------+-------------- - // 1133 | U+00CA U+0304 - // 1135 | U+00CA U+030C - // 1164 | U+00EA U+0304 - // 1166 | U+00EA U+030C - switch (pointer) { - case 1133: return [0x00CA, 0x0304]; - case 1135: return [0x00CA, 0x030C]; - case 1164: return [0x00EA, 0x0304]; - case 1166: return [0x00EA, 0x030C]; - } - - // 4. Let code point be null if pointer is null and the index - // code point for pointer in index Big5 otherwise. - var code_point = (pointer === null) ? null : - indexCodePointFor(pointer, index('big5')); - - // 5. If code point is null and byte is an ASCII byte, prepend - // byte to stream. - if (code_point === null && isASCIIByte(bite)) - stream.prepend(bite); - - // 6. If code point is null, return error. - if (code_point === null) - return decoderError(fatal); - - // 7. Return a code point whose value is code point. - return code_point; - } - - // 4. If byte is an ASCII byte, return a code point whose value - // is byte. - if (isASCIIByte(bite)) - return bite; - - // 5. If byte is in the range 0x81 to 0xFE, inclusive, set Big5 - // lead to byte and return continue. - if (inRange(bite, 0x81, 0xFE)) { - Big5_lead = bite; - return null; - } - - // 6. Return error. - return decoderError(fatal); - }; - } - - // 12.1.2 Big5 encoder - /** - * @constructor - * @implements {Encoder} - * @param {{fatal: boolean}} options - */ - function Big5Encoder(options) { - var fatal = options.fatal; - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1. If code point is end-of-stream, return finished. - if (code_point === end_of_stream) - return finished; - - // 2. If code point is an ASCII code point, return a byte whose - // value is code point. - if (isASCIICodePoint(code_point)) - return code_point; - - // 3. Let pointer be the index Big5 pointer for code point. - var pointer = indexBig5PointerFor(code_point); - - // 4. If pointer is null, return error with code point. - if (pointer === null) - return encoderError(code_point); - - // 5. Let lead be floor(pointer / 157) + 0x81. - var lead = floor(pointer / 157) + 0x81; - - // 6. If lead is less than 0xA1, return error with code point. - if (lead < 0xA1) - return encoderError(code_point); - - // 7. Let trail be pointer % 157. - var trail = pointer % 157; - - // 8. Let offset be 0x40 if trail is less than 0x3F and 0x62 - // otherwise. - var offset = trail < 0x3F ? 0x40 : 0x62; - - // Return two bytes whose values are lead and trail + offset. - return [lead, trail + offset]; - }; - } - - /** @param {{fatal: boolean}} options */ - encoders['Big5'] = function(options) { - return new Big5Encoder(options); - }; - /** @param {{fatal: boolean}} options */ - decoders['Big5'] = function(options) { - return new Big5Decoder(options); - }; - - - // - // 13. Legacy multi-byte Japanese encodings - // - - // 13.1 euc-jp - - // 13.1.1 euc-jp decoder - /** - * @constructor - * @implements {Decoder} - * @param {{fatal: boolean}} options - */ - function EUCJPDecoder(options) { - var fatal = options.fatal; - - // euc-jp's decoder has an associated euc-jp jis0212 flag - // (initially unset) and euc-jp lead (initially 0x00). - var /** @type {boolean} */ eucjp_jis0212_flag = false, - /** @type {number} */ eucjp_lead = 0x00; - - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // 1. If byte is end-of-stream and euc-jp lead is not 0x00, set - // euc-jp lead to 0x00, and return error. - if (bite === end_of_stream && eucjp_lead !== 0x00) { - eucjp_lead = 0x00; - return decoderError(fatal); - } - - // 2. If byte is end-of-stream and euc-jp lead is 0x00, return - // finished. - if (bite === end_of_stream && eucjp_lead === 0x00) - return finished; - - // 3. If euc-jp lead is 0x8E and byte is in the range 0xA1 to - // 0xDF, inclusive, set euc-jp lead to 0x00 and return a code - // point whose value is 0xFF61 − 0xA1 + byte. - if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) { - eucjp_lead = 0x00; - return 0xFF61 - 0xA1 + bite; - } - - // 4. If euc-jp lead is 0x8F and byte is in the range 0xA1 to - // 0xFE, inclusive, set the euc-jp jis0212 flag, set euc-jp lead - // to byte, and return continue. - if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) { - eucjp_jis0212_flag = true; - eucjp_lead = bite; - return null; - } - - // 5. If euc-jp lead is not 0x00, let lead be euc-jp lead, set - // euc-jp lead to 0x00, and run these substeps: - if (eucjp_lead !== 0x00) { - var lead = eucjp_lead; - eucjp_lead = 0x00; - - // 1. Let code point be null. - var code_point = null; - - // 2. If lead and byte are both in the range 0xA1 to 0xFE, - // inclusive, set code point to the index code point for (lead - // − 0xA1) × 94 + byte − 0xA1 in index jis0208 if the euc-jp - // jis0212 flag is unset and in index jis0212 otherwise. - if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) { - code_point = indexCodePointFor( - (lead - 0xA1) * 94 + (bite - 0xA1), - index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212')); - } - - // 3. Unset the euc-jp jis0212 flag. - eucjp_jis0212_flag = false; - - // 4. If byte is not in the range 0xA1 to 0xFE, inclusive, - // prepend byte to stream. - if (!inRange(bite, 0xA1, 0xFE)) - stream.prepend(bite); - - // 5. If code point is null, return error. - if (code_point === null) - return decoderError(fatal); - - // 6. Return a code point whose value is code point. - return code_point; - } - - // 6. If byte is an ASCII byte, return a code point whose value - // is byte. - if (isASCIIByte(bite)) - return bite; - - // 7. If byte is 0x8E, 0x8F, or in the range 0xA1 to 0xFE, - // inclusive, set euc-jp lead to byte and return continue. - if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) { - eucjp_lead = bite; - return null; - } - - // 8. Return error. - return decoderError(fatal); - }; - } - - // 13.1.2 euc-jp encoder - /** - * @constructor - * @implements {Encoder} - * @param {{fatal: boolean}} options - */ - function EUCJPEncoder(options) { - var fatal = options.fatal; - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1. If code point is end-of-stream, return finished. - if (code_point === end_of_stream) - return finished; - - // 2. If code point is an ASCII code point, return a byte whose - // value is code point. - if (isASCIICodePoint(code_point)) - return code_point; - - // 3. If code point is U+00A5, return byte 0x5C. - if (code_point === 0x00A5) - return 0x5C; - - // 4. If code point is U+203E, return byte 0x7E. - if (code_point === 0x203E) - return 0x7E; - - // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, - // return two bytes whose values are 0x8E and code point − - // 0xFF61 + 0xA1. - if (inRange(code_point, 0xFF61, 0xFF9F)) - return [0x8E, code_point - 0xFF61 + 0xA1]; - - // 6. If code point is U+2212, set it to U+FF0D. - if (code_point === 0x2212) - code_point = 0xFF0D; - - // 7. Let pointer be the index pointer for code point in index - // jis0208. - var pointer = indexPointerFor(code_point, index('jis0208')); - - // 8. If pointer is null, return error with code point. - if (pointer === null) - return encoderError(code_point); - - // 9. Let lead be floor(pointer / 94) + 0xA1. - var lead = floor(pointer / 94) + 0xA1; - - // 10. Let trail be pointer % 94 + 0xA1. - var trail = pointer % 94 + 0xA1; - - // 11. Return two bytes whose values are lead and trail. - return [lead, trail]; - }; - } - - /** @param {{fatal: boolean}} options */ - encoders['EUC-JP'] = function(options) { - return new EUCJPEncoder(options); - }; - /** @param {{fatal: boolean}} options */ - decoders['EUC-JP'] = function(options) { - return new EUCJPDecoder(options); - }; - - // 13.2 iso-2022-jp - - // 13.2.1 iso-2022-jp decoder - /** - * @constructor - * @implements {Decoder} - * @param {{fatal: boolean}} options - */ - function ISO2022JPDecoder(options) { - var fatal = options.fatal; - /** @enum */ - var states = { - ASCII: 0, - Roman: 1, - Katakana: 2, - LeadByte: 3, - TrailByte: 4, - EscapeStart: 5, - Escape: 6 - }; - // iso-2022-jp's decoder has an associated iso-2022-jp decoder - // state (initially ASCII), iso-2022-jp decoder output state - // (initially ASCII), iso-2022-jp lead (initially 0x00), and - // iso-2022-jp output flag (initially unset). - var /** @type {number} */ iso2022jp_decoder_state = states.ASCII, - /** @type {number} */ iso2022jp_decoder_output_state = states.ASCII, - /** @type {number} */ iso2022jp_lead = 0x00, - /** @type {boolean} */ iso2022jp_output_flag = false; - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // switching on iso-2022-jp decoder state: - switch (iso2022jp_decoder_state) { - default: - case states.ASCII: - // ASCII - // Based on byte: - - // 0x1B - if (bite === 0x1B) { - // Set iso-2022-jp decoder state to escape start and return - // continue. - iso2022jp_decoder_state = states.EscapeStart; - return null; - } - - // 0x00 to 0x7F, excluding 0x0E, 0x0F, and 0x1B - if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E - && bite !== 0x0F && bite !== 0x1B) { - // Unset the iso-2022-jp output flag and return a code point - // whose value is byte. - iso2022jp_output_flag = false; - return bite; - } - - // end-of-stream - if (bite === end_of_stream) { - // Return finished. - return finished; - } - - // Otherwise - // Unset the iso-2022-jp output flag and return error. - iso2022jp_output_flag = false; - return decoderError(fatal); - - case states.Roman: - // Roman - // Based on byte: - - // 0x1B - if (bite === 0x1B) { - // Set iso-2022-jp decoder state to escape start and return - // continue. - iso2022jp_decoder_state = states.EscapeStart; - return null; - } - - // 0x5C - if (bite === 0x5C) { - // Unset the iso-2022-jp output flag and return code point - // U+00A5. - iso2022jp_output_flag = false; - return 0x00A5; - } - - // 0x7E - if (bite === 0x7E) { - // Unset the iso-2022-jp output flag and return code point - // U+203E. - iso2022jp_output_flag = false; - return 0x203E; - } - - // 0x00 to 0x7F, excluding 0x0E, 0x0F, 0x1B, 0x5C, and 0x7E - if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F - && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) { - // Unset the iso-2022-jp output flag and return a code point - // whose value is byte. - iso2022jp_output_flag = false; - return bite; - } - - // end-of-stream - if (bite === end_of_stream) { - // Return finished. - return finished; - } - - // Otherwise - // Unset the iso-2022-jp output flag and return error. - iso2022jp_output_flag = false; - return decoderError(fatal); - - case states.Katakana: - // Katakana - // Based on byte: - - // 0x1B - if (bite === 0x1B) { - // Set iso-2022-jp decoder state to escape start and return - // continue. - iso2022jp_decoder_state = states.EscapeStart; - return null; - } - - // 0x21 to 0x5F - if (inRange(bite, 0x21, 0x5F)) { - // Unset the iso-2022-jp output flag and return a code point - // whose value is 0xFF61 − 0x21 + byte. - iso2022jp_output_flag = false; - return 0xFF61 - 0x21 + bite; - } - - // end-of-stream - if (bite === end_of_stream) { - // Return finished. - return finished; - } - - // Otherwise - // Unset the iso-2022-jp output flag and return error. - iso2022jp_output_flag = false; - return decoderError(fatal); - - case states.LeadByte: - // Lead byte - // Based on byte: - - // 0x1B - if (bite === 0x1B) { - // Set iso-2022-jp decoder state to escape start and return - // continue. - iso2022jp_decoder_state = states.EscapeStart; - return null; - } - - // 0x21 to 0x7E - if (inRange(bite, 0x21, 0x7E)) { - // Unset the iso-2022-jp output flag, set iso-2022-jp lead - // to byte, iso-2022-jp decoder state to trail byte, and - // return continue. - iso2022jp_output_flag = false; - iso2022jp_lead = bite; - iso2022jp_decoder_state = states.TrailByte; - return null; - } - - // end-of-stream - if (bite === end_of_stream) { - // Return finished. - return finished; - } - - // Otherwise - // Unset the iso-2022-jp output flag and return error. - iso2022jp_output_flag = false; - return decoderError(fatal); - - case states.TrailByte: - // Trail byte - // Based on byte: - - // 0x1B - if (bite === 0x1B) { - // Set iso-2022-jp decoder state to escape start and return - // continue. - iso2022jp_decoder_state = states.EscapeStart; - return decoderError(fatal); - } - - // 0x21 to 0x7E - if (inRange(bite, 0x21, 0x7E)) { - // 1. Set the iso-2022-jp decoder state to lead byte. - iso2022jp_decoder_state = states.LeadByte; - - // 2. Let pointer be (iso-2022-jp lead − 0x21) × 94 + byte − 0x21. - var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21; - - // 3. Let code point be the index code point for pointer in - // index jis0208. - var code_point = indexCodePointFor(pointer, index('jis0208')); - - // 4. If code point is null, return error. - if (code_point === null) - return decoderError(fatal); - - // 5. Return a code point whose value is code point. - return code_point; - } - - // end-of-stream - if (bite === end_of_stream) { - // Set the iso-2022-jp decoder state to lead byte, prepend - // byte to stream, and return error. - iso2022jp_decoder_state = states.LeadByte; - stream.prepend(bite); - return decoderError(fatal); - } - - // Otherwise - // Set iso-2022-jp decoder state to lead byte and return - // error. - iso2022jp_decoder_state = states.LeadByte; - return decoderError(fatal); - - case states.EscapeStart: - // Escape start - - // 1. If byte is either 0x24 or 0x28, set iso-2022-jp lead to - // byte, iso-2022-jp decoder state to escape, and return - // continue. - if (bite === 0x24 || bite === 0x28) { - iso2022jp_lead = bite; - iso2022jp_decoder_state = states.Escape; - return null; - } - - // 2. Prepend byte to stream. - stream.prepend(bite); - - // 3. Unset the iso-2022-jp output flag, set iso-2022-jp - // decoder state to iso-2022-jp decoder output state, and - // return error. - iso2022jp_output_flag = false; - iso2022jp_decoder_state = iso2022jp_decoder_output_state; - return decoderError(fatal); - - case states.Escape: - // Escape - - // 1. Let lead be iso-2022-jp lead and set iso-2022-jp lead to - // 0x00. - var lead = iso2022jp_lead; - iso2022jp_lead = 0x00; - - // 2. Let state be null. - var state = null; - - // 3. If lead is 0x28 and byte is 0x42, set state to ASCII. - if (lead === 0x28 && bite === 0x42) - state = states.ASCII; - - // 4. If lead is 0x28 and byte is 0x4A, set state to Roman. - if (lead === 0x28 && bite === 0x4A) - state = states.Roman; - - // 5. If lead is 0x28 and byte is 0x49, set state to Katakana. - if (lead === 0x28 && bite === 0x49) - state = states.Katakana; - - // 6. If lead is 0x24 and byte is either 0x40 or 0x42, set - // state to lead byte. - if (lead === 0x24 && (bite === 0x40 || bite === 0x42)) - state = states.LeadByte; - - // 7. If state is non-null, run these substeps: - if (state !== null) { - // 1. Set iso-2022-jp decoder state and iso-2022-jp decoder - // output state to states. - iso2022jp_decoder_state = iso2022jp_decoder_state = state; - - // 2. Let output flag be the iso-2022-jp output flag. - var output_flag = iso2022jp_output_flag; - - // 3. Set the iso-2022-jp output flag. - iso2022jp_output_flag = true; - - // 4. Return continue, if output flag is unset, and error - // otherwise. - return !output_flag ? null : decoderError(fatal); - } - - // 8. Prepend lead and byte to stream. - stream.prepend([lead, bite]); - - // 9. Unset the iso-2022-jp output flag, set iso-2022-jp - // decoder state to iso-2022-jp decoder output state and - // return error. - iso2022jp_output_flag = false; - iso2022jp_decoder_state = iso2022jp_decoder_output_state; - return decoderError(fatal); - } - }; - } - - // 13.2.2 iso-2022-jp encoder - /** - * @constructor - * @implements {Encoder} - * @param {{fatal: boolean}} options - */ - function ISO2022JPEncoder(options) { - var fatal = options.fatal; - // iso-2022-jp's encoder has an associated iso-2022-jp encoder - // state which is one of ASCII, Roman, and jis0208 (initially - // ASCII). - /** @enum */ - var states = { - ASCII: 0, - Roman: 1, - jis0208: 2 - }; - var /** @type {number} */ iso2022jp_state = states.ASCII; - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1. If code point is end-of-stream and iso-2022-jp encoder - // state is not ASCII, prepend code point to stream, set - // iso-2022-jp encoder state to ASCII, and return three bytes - // 0x1B 0x28 0x42. - if (code_point === end_of_stream && - iso2022jp_state !== states.ASCII) { - stream.prepend(code_point); - iso2022jp_state = states.ASCII; - return [0x1B, 0x28, 0x42]; - } - - // 2. If code point is end-of-stream and iso-2022-jp encoder - // state is ASCII, return finished. - if (code_point === end_of_stream && iso2022jp_state === states.ASCII) - return finished; - - // 3. If ISO-2022-JP encoder state is ASCII or Roman, and code - // point is U+000E, U+000F, or U+001B, return error with U+FFFD. - if ((iso2022jp_state === states.ASCII || - iso2022jp_state === states.Roman) && - (code_point === 0x000E || code_point === 0x000F || - code_point === 0x001B)) { - return encoderError(0xFFFD); - } - - // 4. If iso-2022-jp encoder state is ASCII and code point is an - // ASCII code point, return a byte whose value is code point. - if (iso2022jp_state === states.ASCII && - isASCIICodePoint(code_point)) - return code_point; - - // 5. If iso-2022-jp encoder state is Roman and code point is an - // ASCII code point, excluding U+005C and U+007E, or is U+00A5 - // or U+203E, run these substeps: - if (iso2022jp_state === states.Roman && - ((isASCIICodePoint(code_point) && - code_point !== 0x005C && code_point !== 0x007E) || - (code_point == 0x00A5 || code_point == 0x203E))) { - - // 1. If code point is an ASCII code point, return a byte - // whose value is code point. - if (isASCIICodePoint(code_point)) - return code_point; - - // 2. If code point is U+00A5, return byte 0x5C. - if (code_point === 0x00A5) - return 0x5C; - - // 3. If code point is U+203E, return byte 0x7E. - if (code_point === 0x203E) - return 0x7E; - } - - // 6. If code point is an ASCII code point, and iso-2022-jp - // encoder state is not ASCII, prepend code point to stream, set - // iso-2022-jp encoder state to ASCII, and return three bytes - // 0x1B 0x28 0x42. - if (isASCIICodePoint(code_point) && - iso2022jp_state !== states.ASCII) { - stream.prepend(code_point); - iso2022jp_state = states.ASCII; - return [0x1B, 0x28, 0x42]; - } - - // 7. If code point is either U+00A5 or U+203E, and iso-2022-jp - // encoder state is not Roman, prepend code point to stream, set - // iso-2022-jp encoder state to Roman, and return three bytes - // 0x1B 0x28 0x4A. - if ((code_point === 0x00A5 || code_point === 0x203E) && - iso2022jp_state !== states.Roman) { - stream.prepend(code_point); - iso2022jp_state = states.Roman; - return [0x1B, 0x28, 0x4A]; - } - - // 8. If code point is U+2212, set it to U+FF0D. - if (code_point === 0x2212) - code_point = 0xFF0D; - - // 9. Let pointer be the index pointer for code point in index - // jis0208. - var pointer = indexPointerFor(code_point, index('jis0208')); - - // 10. If pointer is null, return error with code point. - if (pointer === null) - return encoderError(code_point); - - // 11. If iso-2022-jp encoder state is not jis0208, prepend code - // point to stream, set iso-2022-jp encoder state to jis0208, - // and return three bytes 0x1B 0x24 0x42. - if (iso2022jp_state !== states.jis0208) { - stream.prepend(code_point); - iso2022jp_state = states.jis0208; - return [0x1B, 0x24, 0x42]; - } - - // 12. Let lead be floor(pointer / 94) + 0x21. - var lead = floor(pointer / 94) + 0x21; - - // 13. Let trail be pointer % 94 + 0x21. - var trail = pointer % 94 + 0x21; - - // 14. Return two bytes whose values are lead and trail. - return [lead, trail]; - }; - } - - /** @param {{fatal: boolean}} options */ - encoders['ISO-2022-JP'] = function(options) { - return new ISO2022JPEncoder(options); - }; - /** @param {{fatal: boolean}} options */ - decoders['ISO-2022-JP'] = function(options) { - return new ISO2022JPDecoder(options); - }; - - // 13.3 Shift_JIS - - // 13.3.1 Shift_JIS decoder - /** - * @constructor - * @implements {Decoder} - * @param {{fatal: boolean}} options - */ - function ShiftJISDecoder(options) { - var fatal = options.fatal; - // Shift_JIS's decoder has an associated Shift_JIS lead (initially - // 0x00). - var /** @type {number} */ Shift_JIS_lead = 0x00; - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // 1. If byte is end-of-stream and Shift_JIS lead is not 0x00, - // set Shift_JIS lead to 0x00 and return error. - if (bite === end_of_stream && Shift_JIS_lead !== 0x00) { - Shift_JIS_lead = 0x00; - return decoderError(fatal); - } - - // 2. If byte is end-of-stream and Shift_JIS lead is 0x00, - // return finished. - if (bite === end_of_stream && Shift_JIS_lead === 0x00) - return finished; - - // 3. If Shift_JIS lead is not 0x00, let lead be Shift_JIS lead, - // let pointer be null, set Shift_JIS lead to 0x00, and then run - // these substeps: - if (Shift_JIS_lead !== 0x00) { - var lead = Shift_JIS_lead; - var pointer = null; - Shift_JIS_lead = 0x00; - - // 1. Let offset be 0x40, if byte is less than 0x7F, and 0x41 - // otherwise. - var offset = (bite < 0x7F) ? 0x40 : 0x41; - - // 2. Let lead offset be 0x81, if lead is less than 0xA0, and - // 0xC1 otherwise. - var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1; - - // 3. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80 - // to 0xFC, inclusive, set pointer to (lead − lead offset) × - // 188 + byte − offset. - if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC)) - pointer = (lead - lead_offset) * 188 + bite - offset; - - // 4. If pointer is in the range 8836 to 10715, inclusive, - // return a code point whose value is 0xE000 − 8836 + pointer. - if (inRange(pointer, 8836, 10715)) - return 0xE000 - 8836 + pointer; - - // 5. Let code point be null, if pointer is null, and the - // index code point for pointer in index jis0208 otherwise. - var code_point = (pointer === null) ? null : - indexCodePointFor(pointer, index('jis0208')); - - // 6. If code point is null and byte is an ASCII byte, prepend - // byte to stream. - if (code_point === null && isASCIIByte(bite)) - stream.prepend(bite); - - // 7. If code point is null, return error. - if (code_point === null) - return decoderError(fatal); - - // 8. Return a code point whose value is code point. - return code_point; - } - - // 4. If byte is an ASCII byte or 0x80, return a code point - // whose value is byte. - if (isASCIIByte(bite) || bite === 0x80) - return bite; - - // 5. If byte is in the range 0xA1 to 0xDF, inclusive, return a - // code point whose value is 0xFF61 − 0xA1 + byte. - if (inRange(bite, 0xA1, 0xDF)) - return 0xFF61 - 0xA1 + bite; - - // 6. If byte is in the range 0x81 to 0x9F, inclusive, or 0xE0 - // to 0xFC, inclusive, set Shift_JIS lead to byte and return - // continue. - if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) { - Shift_JIS_lead = bite; - return null; - } - - // 7. Return error. - return decoderError(fatal); - }; - } - - // 13.3.2 Shift_JIS encoder - /** - * @constructor - * @implements {Encoder} - * @param {{fatal: boolean}} options - */ - function ShiftJISEncoder(options) { - var fatal = options.fatal; - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1. If code point is end-of-stream, return finished. - if (code_point === end_of_stream) - return finished; - - // 2. If code point is an ASCII code point or U+0080, return a - // byte whose value is code point. - if (isASCIICodePoint(code_point) || code_point === 0x0080) - return code_point; - - // 3. If code point is U+00A5, return byte 0x5C. - if (code_point === 0x00A5) - return 0x5C; - - // 4. If code point is U+203E, return byte 0x7E. - if (code_point === 0x203E) - return 0x7E; - - // 5. If code point is in the range U+FF61 to U+FF9F, inclusive, - // return a byte whose value is code point − 0xFF61 + 0xA1. - if (inRange(code_point, 0xFF61, 0xFF9F)) - return code_point - 0xFF61 + 0xA1; - - // 6. If code point is U+2212, set it to U+FF0D. - if (code_point === 0x2212) - code_point = 0xFF0D; - - // 7. Let pointer be the index Shift_JIS pointer for code point. - var pointer = indexShiftJISPointerFor(code_point); - - // 8. If pointer is null, return error with code point. - if (pointer === null) - return encoderError(code_point); - - // 9. Let lead be floor(pointer / 188). - var lead = floor(pointer / 188); - - // 10. Let lead offset be 0x81, if lead is less than 0x1F, and - // 0xC1 otherwise. - var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1; - - // 11. Let trail be pointer % 188. - var trail = pointer % 188; - - // 12. Let offset be 0x40, if trail is less than 0x3F, and 0x41 - // otherwise. - var offset = (trail < 0x3F) ? 0x40 : 0x41; - - // 13. Return two bytes whose values are lead + lead offset and - // trail + offset. - return [lead + lead_offset, trail + offset]; - }; - } - - /** @param {{fatal: boolean}} options */ - encoders['Shift_JIS'] = function(options) { - return new ShiftJISEncoder(options); - }; - /** @param {{fatal: boolean}} options */ - decoders['Shift_JIS'] = function(options) { - return new ShiftJISDecoder(options); - }; - - // - // 14. Legacy multi-byte Korean encodings - // - - // 14.1 euc-kr - - // 14.1.1 euc-kr decoder - /** - * @constructor - * @implements {Decoder} - * @param {{fatal: boolean}} options - */ - function EUCKRDecoder(options) { - var fatal = options.fatal; - - // euc-kr's decoder has an associated euc-kr lead (initially 0x00). - var /** @type {number} */ euckr_lead = 0x00; - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // 1. If byte is end-of-stream and euc-kr lead is not 0x00, set - // euc-kr lead to 0x00 and return error. - if (bite === end_of_stream && euckr_lead !== 0) { - euckr_lead = 0x00; - return decoderError(fatal); - } - - // 2. If byte is end-of-stream and euc-kr lead is 0x00, return - // finished. - if (bite === end_of_stream && euckr_lead === 0) - return finished; - - // 3. If euc-kr lead is not 0x00, let lead be euc-kr lead, let - // pointer be null, set euc-kr lead to 0x00, and then run these - // substeps: - if (euckr_lead !== 0x00) { - var lead = euckr_lead; - var pointer = null; - euckr_lead = 0x00; - - // 1. If byte is in the range 0x41 to 0xFE, inclusive, set - // pointer to (lead − 0x81) × 190 + (byte − 0x41). - if (inRange(bite, 0x41, 0xFE)) - pointer = (lead - 0x81) * 190 + (bite - 0x41); - - // 2. Let code point be null, if pointer is null, and the - // index code point for pointer in index euc-kr otherwise. - var code_point = (pointer === null) - ? null : indexCodePointFor(pointer, index('euc-kr')); - - // 3. If code point is null and byte is an ASCII byte, prepend - // byte to stream. - if (pointer === null && isASCIIByte(bite)) - stream.prepend(bite); - - // 4. If code point is null, return error. - if (code_point === null) - return decoderError(fatal); - - // 5. Return a code point whose value is code point. - return code_point; - } - - // 4. If byte is an ASCII byte, return a code point whose value - // is byte. - if (isASCIIByte(bite)) - return bite; - - // 5. If byte is in the range 0x81 to 0xFE, inclusive, set - // euc-kr lead to byte and return continue. - if (inRange(bite, 0x81, 0xFE)) { - euckr_lead = bite; - return null; - } - - // 6. Return error. - return decoderError(fatal); - }; - } - - // 14.1.2 euc-kr encoder - /** - * @constructor - * @implements {Encoder} - * @param {{fatal: boolean}} options - */ - function EUCKREncoder(options) { - var fatal = options.fatal; - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1. If code point is end-of-stream, return finished. - if (code_point === end_of_stream) - return finished; - - // 2. If code point is an ASCII code point, return a byte whose - // value is code point. - if (isASCIICodePoint(code_point)) - return code_point; - - // 3. Let pointer be the index pointer for code point in index - // euc-kr. - var pointer = indexPointerFor(code_point, index('euc-kr')); - - // 4. If pointer is null, return error with code point. - if (pointer === null) - return encoderError(code_point); - - // 5. Let lead be floor(pointer / 190) + 0x81. - var lead = floor(pointer / 190) + 0x81; - - // 6. Let trail be pointer % 190 + 0x41. - var trail = (pointer % 190) + 0x41; - - // 7. Return two bytes whose values are lead and trail. - return [lead, trail]; - }; - } - - /** @param {{fatal: boolean}} options */ - encoders['EUC-KR'] = function(options) { - return new EUCKREncoder(options); - }; - /** @param {{fatal: boolean}} options */ - decoders['EUC-KR'] = function(options) { - return new EUCKRDecoder(options); - }; - - - // - // 15. Legacy miscellaneous encodings - // - - // 15.1 replacement - - // Not needed - API throws RangeError - - // 15.2 Common infrastructure for utf-16be and utf-16le - - /** - * @param {number} code_unit - * @param {boolean} utf16be - * @return {!Array.} bytes - */ - function convertCodeUnitToBytes(code_unit, utf16be) { - // 1. Let byte1 be code unit >> 8. - var byte1 = code_unit >> 8; - - // 2. Let byte2 be code unit & 0x00FF. - var byte2 = code_unit & 0x00FF; - - // 3. Then return the bytes in order: - // utf-16be flag is set: byte1, then byte2. - if (utf16be) - return [byte1, byte2]; - // utf-16be flag is unset: byte2, then byte1. - return [byte2, byte1]; - } - - // 15.2.1 shared utf-16 decoder - /** - * @constructor - * @implements {Decoder} - * @param {boolean} utf16_be True if big-endian, false if little-endian. - * @param {{fatal: boolean}} options - */ - function UTF16Decoder(utf16_be, options) { - var fatal = options.fatal; - var /** @type {?number} */ utf16_lead_byte = null, - /** @type {?number} */ utf16_lead_surrogate = null; - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // 1. If byte is end-of-stream and either utf-16 lead byte or - // utf-16 lead surrogate is not null, set utf-16 lead byte and - // utf-16 lead surrogate to null, and return error. - if (bite === end_of_stream && (utf16_lead_byte !== null || - utf16_lead_surrogate !== null)) { - return decoderError(fatal); - } - - // 2. If byte is end-of-stream and utf-16 lead byte and utf-16 - // lead surrogate are null, return finished. - if (bite === end_of_stream && utf16_lead_byte === null && - utf16_lead_surrogate === null) { - return finished; - } - - // 3. If utf-16 lead byte is null, set utf-16 lead byte to byte - // and return continue. - if (utf16_lead_byte === null) { - utf16_lead_byte = bite; - return null; - } - - // 4. Let code unit be the result of: - var code_unit; - if (utf16_be) { - // utf-16be decoder flag is set - // (utf-16 lead byte << 8) + byte. - code_unit = (utf16_lead_byte << 8) + bite; - } else { - // utf-16be decoder flag is unset - // (byte << 8) + utf-16 lead byte. - code_unit = (bite << 8) + utf16_lead_byte; - } - // Then set utf-16 lead byte to null. - utf16_lead_byte = null; - - // 5. If utf-16 lead surrogate is not null, let lead surrogate - // be utf-16 lead surrogate, set utf-16 lead surrogate to null, - // and then run these substeps: - if (utf16_lead_surrogate !== null) { - var lead_surrogate = utf16_lead_surrogate; - utf16_lead_surrogate = null; - - // 1. If code unit is in the range U+DC00 to U+DFFF, - // inclusive, return a code point whose value is 0x10000 + - // ((lead surrogate − 0xD800) << 10) + (code unit − 0xDC00). - if (inRange(code_unit, 0xDC00, 0xDFFF)) { - return 0x10000 + (lead_surrogate - 0xD800) * 0x400 + - (code_unit - 0xDC00); - } - - // 2. Prepend the sequence resulting of converting code unit - // to bytes using utf-16be decoder flag to stream and return - // error. - stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be)); - return decoderError(fatal); - } - - // 6. If code unit is in the range U+D800 to U+DBFF, inclusive, - // set utf-16 lead surrogate to code unit and return continue. - if (inRange(code_unit, 0xD800, 0xDBFF)) { - utf16_lead_surrogate = code_unit; - return null; - } - - // 7. If code unit is in the range U+DC00 to U+DFFF, inclusive, - // return error. - if (inRange(code_unit, 0xDC00, 0xDFFF)) - return decoderError(fatal); - - // 8. Return code point code unit. - return code_unit; - }; - } - - // 15.2.2 shared utf-16 encoder - /** - * @constructor - * @implements {Encoder} - * @param {boolean} utf16_be True if big-endian, false if little-endian. - * @param {{fatal: boolean}} options - */ - function UTF16Encoder(utf16_be, options) { - var fatal = options.fatal; - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1. If code point is end-of-stream, return finished. - if (code_point === end_of_stream) - return finished; - - // 2. If code point is in the range U+0000 to U+FFFF, inclusive, - // return the sequence resulting of converting code point to - // bytes using utf-16be encoder flag. - if (inRange(code_point, 0x0000, 0xFFFF)) - return convertCodeUnitToBytes(code_point, utf16_be); - - // 3. Let lead be ((code point − 0x10000) >> 10) + 0xD800, - // converted to bytes using utf-16be encoder flag. - var lead = convertCodeUnitToBytes( - ((code_point - 0x10000) >> 10) + 0xD800, utf16_be); - - // 4. Let trail be ((code point − 0x10000) & 0x3FF) + 0xDC00, - // converted to bytes using utf-16be encoder flag. - var trail = convertCodeUnitToBytes( - ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be); - - // 5. Return a byte sequence of lead followed by trail. - return lead.concat(trail); - }; - } - - // 15.3 utf-16be - // 15.3.1 utf-16be decoder - /** @param {{fatal: boolean}} options */ - encoders['UTF-16BE'] = function(options) { - return new UTF16Encoder(true, options); - }; - // 15.3.2 utf-16be encoder - /** @param {{fatal: boolean}} options */ - decoders['UTF-16BE'] = function(options) { - return new UTF16Decoder(true, options); - }; - - // 15.4 utf-16le - // 15.4.1 utf-16le decoder - /** @param {{fatal: boolean}} options */ - encoders['UTF-16LE'] = function(options) { - return new UTF16Encoder(false, options); - }; - // 15.4.2 utf-16le encoder - /** @param {{fatal: boolean}} options */ - decoders['UTF-16LE'] = function(options) { - return new UTF16Decoder(false, options); - }; - - // 15.5 x-user-defined - - // 15.5.1 x-user-defined decoder - /** - * @constructor - * @implements {Decoder} - * @param {{fatal: boolean}} options - */ - function XUserDefinedDecoder(options) { - var fatal = options.fatal; - /** - * @param {Stream} stream The stream of bytes being decoded. - * @param {number} bite The next byte read from the stream. - * @return {?(number|!Array.)} The next code point(s) - * decoded, or null if not enough data exists in the input - * stream to decode a complete code point. - */ - this.handler = function(stream, bite) { - // 1. If byte is end-of-stream, return finished. - if (bite === end_of_stream) - return finished; - - // 2. If byte is an ASCII byte, return a code point whose value - // is byte. - if (isASCIIByte(bite)) - return bite; - - // 3. Return a code point whose value is 0xF780 + byte − 0x80. - return 0xF780 + bite - 0x80; - }; - } - - // 15.5.2 x-user-defined encoder - /** - * @constructor - * @implements {Encoder} - * @param {{fatal: boolean}} options - */ - function XUserDefinedEncoder(options) { - var fatal = options.fatal; - /** - * @param {Stream} stream Input stream. - * @param {number} code_point Next code point read from the stream. - * @return {(number|!Array.)} Byte(s) to emit. - */ - this.handler = function(stream, code_point) { - // 1.If code point is end-of-stream, return finished. - if (code_point === end_of_stream) - return finished; - - // 2. If code point is an ASCII code point, return a byte whose - // value is code point. - if (isASCIICodePoint(code_point)) - return code_point; - - // 3. If code point is in the range U+F780 to U+F7FF, inclusive, - // return a byte whose value is code point − 0xF780 + 0x80. - if (inRange(code_point, 0xF780, 0xF7FF)) - return code_point - 0xF780 + 0x80; - - // 4. Return error with code point. - return encoderError(code_point); - }; - } - - /** @param {{fatal: boolean}} options */ - encoders['x-user-defined'] = function(options) { - return new XUserDefinedEncoder(options); - }; - /** @param {{fatal: boolean}} options */ - decoders['x-user-defined'] = function(options) { - return new XUserDefinedDecoder(options); - }; - - if (!global['TextEncoder']) - global['TextEncoder'] = TextEncoder; - if (!global['TextDecoder']) - global['TextDecoder'] = TextDecoder; - - if (typeof module !== "undefined" && module.exports) { - module.exports = { - TextEncoder: global['TextEncoder'], - TextDecoder: global['TextDecoder'], - EncodingIndexes: global["encoding-indexes"] - }; - } - - // For strict environments where `this` inside the global scope - // is `undefined`, take a pure object instead - }(this || {})); - },{"./encoding-indexes.js":35}]},{},[12])(12) - }); - }); - - var arrayProto$c = lib.prototypes.array; - - - - - - - - - - - - - var valueToString$9 = lib.valueToString; - var fakeServer = nise.fakeServer; - var fakeXhr = nise.fakeXhr; - - - var filter$3 = arrayProto$c.filter; - var forEach$9 = arrayProto$c.filter; - var push$6 = arrayProto$c.push; - var reverse$1 = arrayProto$c.reverse; - - function applyOnEach(fakes, method) { - var matchingFakes = filter$3(fakes, function(fake) { - return typeof fake[method] === "function"; - }); - - forEach$9(matchingFakes, function(fake) { - fake[method](); - }); - } - - function Sandbox() { - var sandbox = this; - var collection = []; - var fakeRestorers = []; - var promiseLib; - - sandbox.serverPrototype = fakeServer; - - // this is for testing only - sandbox.getFakes = function getFakes() { - return collection; - }; - - // this is for testing only - sandbox.getRestorers = function() { - return fakeRestorers; - }; - - sandbox.createStubInstance = function createStubInstance(constructor) { - if (typeof constructor !== "function") { - throw new TypeError("The constructor should be a function."); - } - return this.stub(Object.create(constructor.prototype)); - }; - - sandbox.inject = function inject(obj) { - obj.spy = function() { - return sandbox.spy.apply(null, arguments); - }; - - obj.stub = function() { - return sandbox.stub.apply(null, arguments); - }; - - obj.mock = function() { - return sandbox.mock.apply(null, arguments); - }; - - if (sandbox.clock) { - obj.clock = sandbox.clock; - } - - if (sandbox.server) { - obj.server = sandbox.server; - obj.requests = sandbox.server.requests; - } - - obj.match = match_1$1; - - return obj; - }; - - sandbox.mock = function mock() { - var m = mock_1.apply(null, arguments); - - push$6(collection, m); - usePromiseLibrary_1(promiseLib, m); - - return m; - }; - - sandbox.reset = function reset() { - applyOnEach(collection, "reset"); - applyOnEach(collection, "resetHistory"); - }; - - sandbox.resetBehavior = function resetBehavior() { - applyOnEach(collection, "resetBehavior"); - }; - - sandbox.resetHistory = function resetHistory() { - function privateResetHistory(f) { - var method = f.resetHistory || f.reset; - if (method) { - method.call(f); - } - } - - forEach$9(collection, function(fake) { - if (typeof fake === "function") { - privateResetHistory(fake); - return; - } - - var methods = []; - if (fake.get) { - push$6(methods, fake.get); - } - - if (fake.set) { - push$6(methods, fake.set); - } - - forEach$9(methods, privateResetHistory); - }); - }; - - sandbox.restore = function restore() { - if (arguments.length) { - throw new Error("sandbox.restore() does not take any parameters. Perhaps you meant stub.restore()"); - } - - reverse$1(collection); - applyOnEach(collection, "restore"); - collection = []; - - forEach$9(fakeRestorers, function(restorer) { - restorer(); - }); - fakeRestorers = []; - - sandbox.restoreContext(); - }; - - sandbox.restoreContext = function restoreContext() { - var injectedKeys = sandbox.injectedKeys; - var injectInto = sandbox.injectInto; - - if (!injectedKeys) { - return; - } - - forEach$9(injectedKeys, function(injectedKey) { - delete injectInto[injectedKey]; - }); - - injectedKeys = []; - }; - - function getFakeRestorer(object, property) { - var descriptor = getPropertyDescriptor(object, property); - - function restorer() { - Object.defineProperty(object, property, descriptor); - } - restorer.object = object; - restorer.property = property; - return restorer; - } - - function verifyNotReplaced(object, property) { - forEach$9(fakeRestorers, function(fakeRestorer) { - if (fakeRestorer.object === object && fakeRestorer.property === property) { - throw new TypeError("Attempted to replace " + property + " which is already replaced"); - } - }); - } - - sandbox.replace = function replace(object, property, replacement) { - var descriptor = getPropertyDescriptor(object, property); - - if (typeof descriptor === "undefined") { - throw new TypeError("Cannot replace non-existent own property " + valueToString$9(property)); - } - - if (typeof replacement === "undefined") { - throw new TypeError("Expected replacement argument to be defined"); - } - - if (typeof descriptor.get === "function") { - throw new Error("Use sandbox.replaceGetter for replacing getters"); - } - - if (typeof descriptor.set === "function") { - throw new Error("Use sandbox.replaceSetter for replacing setters"); - } - - if (typeof object[property] !== typeof replacement) { - throw new TypeError("Cannot replace " + typeof object[property] + " with " + typeof replacement); - } - - verifyNotReplaced(object, property); - - // store a function for restoring the replaced property - push$6(fakeRestorers, getFakeRestorer(object, property)); - - object[property] = replacement; - - return replacement; - }; - - sandbox.replaceGetter = function replaceGetter(object, property, replacement) { - var descriptor = getPropertyDescriptor(object, property); - - if (typeof descriptor === "undefined") { - throw new TypeError("Cannot replace non-existent own property " + valueToString$9(property)); - } - - if (typeof replacement !== "function") { - throw new TypeError("Expected replacement argument to be a function"); - } - - if (typeof descriptor.get !== "function") { - throw new Error("`object.property` is not a getter"); - } - - verifyNotReplaced(object, property); - - // store a function for restoring the replaced property - push$6(fakeRestorers, getFakeRestorer(object, property)); - - Object.defineProperty(object, property, { - get: replacement, - configurable: isPropertyConfigurable_1(object, property) - }); - - return replacement; - }; - - sandbox.replaceSetter = function replaceSetter(object, property, replacement) { - var descriptor = getPropertyDescriptor(object, property); - - if (typeof descriptor === "undefined") { - throw new TypeError("Cannot replace non-existent own property " + valueToString$9(property)); - } - - if (typeof replacement !== "function") { - throw new TypeError("Expected replacement argument to be a function"); - } - - if (typeof descriptor.set !== "function") { - throw new Error("`object.property` is not a setter"); - } - - verifyNotReplaced(object, property); - - // store a function for restoring the replaced property - push$6(fakeRestorers, getFakeRestorer(object, property)); - - // eslint-disable-next-line accessor-pairs - Object.defineProperty(object, property, { - set: replacement, - configurable: isPropertyConfigurable_1(object, property) - }); - - return replacement; - }; - - sandbox.spy = function spy() { - var s = spy_1.apply(spy_1, arguments); - - push$6(collection, s); - - return s; - }; - - sandbox.stub = function stub(object, property) { - if (isEsModule(object)) { - throw new TypeError("ES Modules cannot be stubbed"); - } - - if (isNonExistentOwnProperty_1(object, property)) { - throw new TypeError("Cannot stub non-existent own property " + valueToString$9(property)); - } - - var stubbed = stub_1.apply(null, arguments); - var isStubbingEntireObject = typeof property === "undefined" && typeof object === "object"; - - if (isStubbingEntireObject) { - var ownMethods = collectOwnMethods_1(stubbed); - - forEach$9(ownMethods, function(method) { - push$6(collection, method); - }); - - usePromiseLibrary_1(promiseLib, ownMethods); - } else { - push$6(collection, stubbed); - usePromiseLibrary_1(promiseLib, stubbed); - } - - return stubbed; - }; - - // eslint-disable-next-line no-unused-vars - sandbox.fake = function fake(f) { - var s = fake_1.apply(fake_1, arguments); - - push$6(collection, s); - - return s; - }; - - forEach$9(Object.keys(fake_1), function(key) { - var fakeBehavior = fake_1[key]; - if (typeof fakeBehavior === "function") { - sandbox.fake[key] = function() { - var s = fakeBehavior.apply(fakeBehavior, arguments); - - push$6(collection, s); - - return s; - }; - } - }); - - sandbox.useFakeTimers = function useFakeTimers(args) { - var clock = fakeTimers.useFakeTimers.call(null, args); - - sandbox.clock = clock; - push$6(collection, clock); - - return clock; - }; - - sandbox.verify = function verify() { - applyOnEach(collection, "verify"); - }; - - sandbox.verifyAndRestore = function verifyAndRestore() { - var exception; - - try { - sandbox.verify(); - } catch (e) { - exception = e; - } - - sandbox.restore(); - - if (exception) { - throw exception; - } - }; - - sandbox.useFakeServer = function useFakeServer() { - var proto = sandbox.serverPrototype || fakeServer; - - if (!proto || !proto.create) { - return null; - } - - sandbox.server = proto.create(); - push$6(collection, sandbox.server); - - return sandbox.server; - }; - - sandbox.useFakeXMLHttpRequest = function useFakeXMLHttpRequest() { - var xhr = fakeXhr.useFakeXMLHttpRequest(); - push$6(collection, xhr); - return xhr; - }; - - sandbox.usingPromise = function usingPromise(promiseLibrary) { - promiseLib = promiseLibrary; - collection.promiseLibrary = promiseLibrary; - - return sandbox; - }; - } - - Sandbox.prototype.assert = assert_1; - Sandbox.prototype.match = match_1$1; - - var sandbox = Sandbox; - - var arrayProto$d = lib.prototypes.array; - - - var forEach$a = arrayProto$d.forEach; - var push$7 = arrayProto$d.push; - - function prepareSandboxFromConfig(config) { - var sandbox$$1 = new sandbox(); - - if (config.useFakeServer) { - if (typeof config.useFakeServer === "object") { - sandbox$$1.serverPrototype = config.useFakeServer; - } - - sandbox$$1.useFakeServer(); - } - - if (config.useFakeTimers) { - if (typeof config.useFakeTimers === "object") { - sandbox$$1.useFakeTimers(config.useFakeTimers); - } else { - sandbox$$1.useFakeTimers(); - } - } - - return sandbox$$1; - } - - function exposeValue(sandbox$$1, config, key, value) { - if (!value) { - return; - } - - if (config.injectInto && !(key in config.injectInto)) { - config.injectInto[key] = value; - push$7(sandbox$$1.injectedKeys, key); - } else { - push$7(sandbox$$1.args, value); - } - } - - function createSandbox(config) { - if (!config) { - return new sandbox(); - } - - var configuredSandbox = prepareSandboxFromConfig(config); - configuredSandbox.args = configuredSandbox.args || []; - configuredSandbox.injectedKeys = []; - configuredSandbox.injectInto = config.injectInto; - var exposed = configuredSandbox.inject({}); - - if (config.properties) { - forEach$a(config.properties, function(prop) { - var value = exposed[prop] || (prop === "sandbox" && configuredSandbox); - exposeValue(configuredSandbox, config, prop, value); - }); - } else { - exposeValue(configuredSandbox, config, "sandbox"); - } - - return configuredSandbox; - } - - var createSandbox_1 = createSandbox; - - var deprecated = createCommonjsModule$1(function (module, exports) { - - // wrap returns a function that will invoke the supplied function and print a deprecation warning to the console each - // time it is called. - exports.wrap = function(func, msg) { - var wrapped = function() { - exports.printWarning(msg); - return func.apply(this, arguments); - }; - if (func.prototype) { - wrapped.prototype = func.prototype; - } - return wrapped; - }; - - // defaultMsg returns a string which can be supplied to `wrap()` to notify the user that a particular part of the - // sinon API has been deprecated. - /* istanbul ignore next */ - exports.defaultMsg = function(funcName) { - return "sinon." + funcName + " is deprecated and will be removed from the public API in a future version of sinon."; - }; - - exports.printWarning = function(msg) { - // Watch out for IE7 and below! :( - if (typeof console !== "undefined") { - /* istanbul ignore else */ - if (console.info) { - console.info(msg); - } else { - console.log(msg); - } - } - }; - }); - var deprecated_1 = deprecated.wrap; - var deprecated_2 = deprecated.defaultMsg; - var deprecated_3 = deprecated.printWarning; - - var defaultConfig = { - injectIntoThis: true, - injectInto: null, - properties: ["spy", "stub", "mock", "clock", "server", "requests"], - useFakeTimers: true, - useFakeServer: true - }; - - var apiMethods = { - createSandbox: createSandbox_1, - assert: assert_1, - match: match_1$1, - spyCall: call$1$1, - - expectation: mockExpectation_1, - createStubInstance: stub_1.createStubInstance, - defaultConfig: defaultConfig, - - setFormatter: format_1.setFormatter, - - // fake timers - timers: fakeTimers.timers, - - // fake XHR - xhr: nise.fakeXhr.xhr, - FakeXMLHttpRequest: nise.fakeXhr.FakeXMLHttpRequest, - - // fake server - fakeServer: nise.fakeServer, - fakeServerWithClock: nise.fakeServerWithClock, - createFakeServer: nise.fakeServer.create.bind(nise.fakeServer), - createFakeServerWithClock: nise.fakeServerWithClock.create.bind(nise.fakeServerWithClock), - - addBehavior: function(name, fn) { - behavior.addBehavior(stub_1, name, fn); - } - }; - - var legacySandboxAPI = { - sandbox: { - create: deprecated.wrap( - createSandbox_1, - // eslint-disable-next-line max-len - "`sandbox.create()` is deprecated. Use default sandbox at `sinon.sandbox` or create new sandboxes with `sinon.createSandbox()`" - ) - } - }; - - var sandbox$1 = new sandbox(); - - var api = extend(sandbox$1, legacySandboxAPI, apiMethods); - - var sinon = api; - - const _serverPrototype = sinon.serverPrototype; - const _getFakes = sinon.getFakes; - const _getRestorers = sinon.getRestorers; - const _createStubInstance = sinon.createStubInstance; - const _inject = sinon.inject; - const _mock = sinon.mock; - const _reset = sinon.reset; - const _resetBehavior = sinon.resetBehavior; - const _resetHistory = sinon.resetHistory; - const _restore = sinon.restore; - const _restoreContext = sinon.restoreContext; - const _replace = sinon.replace; - const _replaceGetter = sinon.replaceGetter; - const _replaceSetter = sinon.replaceSetter; - const _spy = sinon.spy; - const _stub = sinon.stub; - const _fake = sinon.fake; - const _useFakeTimers = sinon.useFakeTimers; - const _verify = sinon.verify; - const _verifyAndRestore = sinon.verifyAndRestore; - const _useFakeServer = sinon.useFakeServer; - const _useFakeXMLHttpRequest = sinon.useFakeXMLHttpRequest; - const _usingPromise = sinon.usingPromise; - const _sandbox = sinon.sandbox; - const _createSandbox = sinon.createSandbox; - const _assert = sinon.assert; - const _match = sinon.match; - const _spyCall = sinon.spyCall; - const _expectation = sinon.expectation; - const _defaultConfig = sinon.defaultConfig; - const _setFormatter = sinon.setFormatter; - const _timers = sinon.timers; - const _xhr = sinon.xhr; - const _FakeXMLHttpRequest = sinon.FakeXMLHttpRequest; - const _fakeServer = sinon.fakeServer; - const _fakeServerWithClock = sinon.fakeServerWithClock; - const _createFakeServer = sinon.createFakeServer; - const _createFakeServerWithClock = sinon.createFakeServerWithClock; - const _addBehavior = sinon.addBehavior; - - var expect$1 = chai$1.expect; - describe("generated parser API", function () { - describe("parse", function () { - it("parses input", function () { - var parser = peg_1.generate("start = 'a'"); - expect$1(parser.parse("a")).to.equal("a"); - }); - it("throws an exception on syntax error", function () { - var parser = peg_1.generate("start = 'a'"); - expect$1(function () { - parser.parse("b"); - }).to.throw(); - }); - describe("start rule", function () { - var parser = peg_1.generate("\n\n a = 'x' { return 'a'; }\n b = 'x' { return 'b'; }\n c = 'x' { return 'c'; }\n\n ", { - allowedStartRules: ["b", "c"] - }); - describe("when |startRule| is not set", function () { - it("starts parsing from the first allowed rule", function () { - expect$1(parser.parse("x")).to.equal("b"); - }); - }); - describe("when |startRule| is set to an allowed rule", function () { - it("starts parsing from specified rule", function () { - expect$1(parser.parse("x", { - startRule: "b" - })).to.equal("b"); - expect$1(parser.parse("x", { - startRule: "c" - })).to.equal("c"); - }); - }); - describe("when |startRule| is set to a disallowed start rule", function () { - it("throws an exception", function () { - expect$1(function () { - parser.parse("x", { - startRule: "a" - }); - }).to.throw(); - }); - }); - }); - describe("tracing", function () { - var parser = peg_1.generate("\n\n start = a / b\n a = 'a'\n b = 'b'\n\n ", { - trace: true - }); - describe("default tracer", function () { - it("traces using console.log (if console is defined)", function () { - var messages = ["1:1-1:1 rule.enter start", "1:1-1:1 rule.enter a", "1:1-1:1 rule.fail a", "1:1-1:1 rule.enter b", "1:1-1:2 rule.match b", "1:1-1:2 rule.match start"]; - if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") sinon.stub(console, "log"); - - try { - parser.parse("b"); - - if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") { - expect$1(console.log.callCount).to.equal(messages.length); - messages.forEach(function (message, index) { - var call = console.log.getCall(index); - expect$1(call.calledWithExactly(message)).to.equal(true); - }); - } - } finally { - if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") console.log.restore(); - } - }); - }); - describe("custom tracers", function () { - describe("trace", function () { - it("receives tracing events", function () { - var events = [{ - type: "rule.enter", - rule: "start", - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 0, - line: 1, - column: 1 - } - } - }, { - type: "rule.enter", - rule: "a", - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 0, - line: 1, - column: 1 - } - } - }, { - type: "rule.fail", - rule: "a", - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 0, - line: 1, - column: 1 - } - } - }, { - type: "rule.enter", - rule: "b", - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 0, - line: 1, - column: 1 - } - } - }, { - type: "rule.match", - rule: "b", - result: "b", - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 1, - line: 1, - column: 2 - } - } - }, { - type: "rule.match", - rule: "start", - result: "b", - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 1, - line: 1, - column: 2 - } - } - }]; - var tracer = { - trace: sinon.spy() - }; - parser.parse("b", { - tracer: tracer - }); - expect$1(tracer.trace.callCount).to.equal(events.length); - events.forEach(function (event, index) { - var call = tracer.trace.getCall(index); - expect$1(call.calledWithExactly(event)).to.equal(true); - }); - }); - }); - }); - }); - it("accepts custom options", function () { - var parser = peg_1.generate("start = 'a'"); - parser.parse("a", { - foo: 42 - }); - }); - }); - }); - var generatedParserApi_spec = {}; - - var expect$2 = chai$1.expect; - describe("PEG.js API", function () { - describe("generate", function () { - it("generates a parser", function () { - var parser = peg_1.generate("start = 'a'"); - expect$2(parser).to.be.an("object"); - expect$2(parser.parse("a")).to.equal("a"); - }); - it("throws an exception on syntax error", function () { - expect$2(function () { - peg_1.generate("start = @"); - }).to.throw(); - }); - it("throws an exception on semantic error", function () { - expect$2(function () { - peg_1.generate("start = undefined"); - }).to.throw(); - }); - describe("allowed start rules", function () { - var grammar = "\n\n a = 'x'\n b = 'x'\n c = 'x'\n\n "; - it("throws an error on missing rule", function () { - expect$2(function () { - peg_1.generate(grammar, { - allowedStartRules: ["missing"] - }); - }).to.throw(); - }); - describe("when optimizing for parsing speed", function () { - describe("when |allowedStartRules| is not set", function () { - it("generated parser can start only from the first rule", function () { - var parser = peg_1.generate(grammar, { - optimize: "speed" - }); - expect$2(parser.parse("x", { - startRule: "a" - })).to.equal("x"); - expect$2(function () { - parser.parse("x", { - startRule: "b" - }); - }).to.throw(); - expect$2(function () { - parser.parse("x", { - startRule: "c" - }); - }).to.throw(); - }); - }); - describe("when |allowedStartRules| is set", function () { - it("generated parser can start only from specified rules", function () { - var parser = peg_1.generate(grammar, { - optimize: "speed", - allowedStartRules: ["b", "c"] - }); - expect$2(function () { - parser.parse("x", { - startRule: "a" - }); - }).to.throw(); - expect$2(parser.parse("x", { - startRule: "b" - })).to.equal("x"); - expect$2(parser.parse("x", { - startRule: "c" - })).to.equal("x"); - }); - }); - }); - describe("when optimizing for code size", function () { - describe("when |allowedStartRules| is not set", function () { - it("generated parser can start only from the first rule", function () { - var parser = peg_1.generate(grammar, { - optimize: "size" - }); - expect$2(parser.parse("x", { - startRule: "a" - })).to.equal("x"); - expect$2(function () { - parser.parse("x", { - startRule: "b" - }); - }).to.throw(); - expect$2(function () { - parser.parse("x", { - startRule: "c" - }); - }).to.throw(); - }); - }); - describe("when |allowedStartRules| is set", function () { - it("generated parser can start only from specified rules", function () { - var parser = peg_1.generate(grammar, { - optimize: "size", - allowedStartRules: ["b", "c"] - }); - expect$2(function () { - parser.parse("x", { - startRule: "a" - }); - }).to.throw(); - expect$2(parser.parse("x", { - startRule: "b" - })).to.equal("x"); - expect$2(parser.parse("x", { - startRule: "c" - })).to.equal("x"); - }); - }); - }); - }); - describe("intermediate results caching", function () { - var grammar = "\n\n { var n = 0; }\n start = (a 'b') / (a 'c') { return n; }\n a = 'a' { n++; }\n\n "; - describe("when |cache| is not set", function () { - it("generated parser doesn't cache intermediate parse results", function () { - var parser = peg_1.generate(grammar); - expect$2(parser.parse("ac")).to.equal(2); - }); - }); - describe("when |cache| is set to |false|", function () { - it("generated parser doesn't cache intermediate parse results", function () { - var parser = peg_1.generate(grammar, { - cache: false - }); - expect$2(parser.parse("ac")).to.equal(2); - }); - }); - describe("when |cache| is set to |true|", function () { - it("generated parser caches intermediate parse results", function () { - var parser = peg_1.generate(grammar, { - cache: true - }); - expect$2(parser.parse("ac")).to.equal(1); - }); - }); - }); - describe("tracing", function () { - var grammar = "start = 'a'"; - describe("when |trace| is not set", function () { - it("generated parser doesn't trace", function () { - var parser = peg_1.generate(grammar); - var tracer = { - trace: sinon.spy() - }; - parser.parse("a", { - tracer: tracer - }); - expect$2(tracer.trace.called).to.equal(false); - }); - }); - describe("when |trace| is set to |false|", function () { - it("generated parser doesn't trace", function () { - var parser = peg_1.generate(grammar, { - trace: false - }); - var tracer = { - trace: sinon.spy() - }; - parser.parse("a", { - tracer: tracer - }); - expect$2(tracer.trace.called).to.equal(false); - }); - }); - describe("when |trace| is set to |true|", function () { - it("generated parser traces", function () { - var parser = peg_1.generate(grammar, { - trace: true - }); - var tracer = { - trace: sinon.spy() - }; - parser.parse("a", { - tracer: tracer - }); - expect$2(tracer.trace.called).to.equal(true); - }); - }); - }); - describe("output", function () { - var grammar = "start = 'a'"; - describe("when |output| is not set", function () { - it("returns generated parser object", function () { - var parser = peg_1.generate(grammar); - expect$2(parser).to.be.an("object"); - expect$2(parser.parse("a")).to.equal("a"); - }); - }); - describe("when |output| is set to |\"parser\"|", function () { - it("returns generated parser object", function () { - var parser = peg_1.generate(grammar, { - output: "parser" - }); - expect$2(parser).to.be.an("object"); - expect$2(parser.parse("a")).to.equal("a"); - }); - }); - describe("when |output| is set to |\"source\"|", function () { - it("returns generated parser source code", function () { - var source = peg_1.generate(grammar, { - output: "source" - }); - expect$2(source).to.be.a("string"); - expect$2(eval(source).parse("a")).to.equal("a"); - }); - }); - }); - describe("reserved words", function () { - var RESERVED_WORDS = peg_1.util.reservedWords; - describe("throws an exception on reserved JS words used as labels", function () { - var _iteratorNormalCompletion = true; - var _didIteratorError = false; - var _iteratorError = undefined; - - try { - var _loop = function _loop() { - var label = _step.value; - it(label, function () { - expect$2(function () { - peg_1.generate(["start = " + label + ":end", "end = 'a'"].join("\n"), { - output: "source" - }); - }).to.throw(peg_1.parser.SyntaxError); - }); - }; - - for (var _iterator = RESERVED_WORDS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { - _loop(); - } - } catch (err) { - _didIteratorError = true; - _iteratorError = err; - } finally { - try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); - } - } finally { - if (_didIteratorError) { - throw _iteratorError; - } - } - } - }); - describe("not throws an exception on reserved JS words used as rule name", function () { - var _iteratorNormalCompletion2 = true; - var _didIteratorError2 = false; - var _iteratorError2 = undefined; - - try { - var _loop2 = function _loop2() { - var rule = _step2.value; - it(rule, function () { - expect$2(function () { - peg_1.generate(["start = " + rule, rule + " = 'a'"].join("\n"), { - output: "source" - }); - }).to.not.throw(peg_1.parser.SyntaxError); - }); - }; - - for (var _iterator2 = RESERVED_WORDS[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { - _loop2(); - } - } catch (err) { - _didIteratorError2 = true; - _iteratorError2 = err; - } finally { - try { - if (!_iteratorNormalCompletion2 && _iterator2.return != null) { - _iterator2.return(); - } - } finally { - if (_didIteratorError2) { - throw _iteratorError2; - } - } - } - }); - }); - it("accepts custom options", function () { - peg_1.generate("start = 'a'", { - foo: 42 - }); - }); - }); - }); - - var util$1 = peg_1.util; - var expect$3 = chai$1.expect; - describe("PEG.js Utility API", function () { - describe("util.convertPasses", function () { - var passes = { - stage1: { - pass1: function pass1() {}, - pass2: function pass2() {}, - pass3: function pass3() {} - }, - stage2: { - pass1: function pass1() {}, - pass2: function pass2() {} - }, - stage3: { - pass1: function pass1() {} - } - }; - - function expectPasses(result) { - expect$3(result).to.be.an("object"); - expect$3(result.stage1).to.be.an("array").and.to.have.a.lengthOf(3); - expect$3(result.stage2).to.be.an("array").and.to.have.a.lengthOf(2); - expect$3(result.stage3).to.be.an("array").and.to.have.a.lengthOf(1); - } - - it("converts a map of stages containing a map of passes", function () { - expectPasses(util$1.convertPasses(passes)); - }); - it("converts a map of stages containing a list of passes", function () { - expectPasses(util$1.convertPasses({ - stage1: [passes.stage1.pass1, passes.stage1.pass2, passes.stage1.pass3], - stage2: passes.stage2, - stage3: [passes.stage3.pass1] - })); - }); - }); - describe("util.clone", function () { - var meta = { - name: "pegjs", - version: 0.11, - util: util$1 - }; - it("shallow clones an object", function () { - expect$3(util$1.clone(meta)).to.be.an("object").that.has.own.includes(meta); - }); - it("cloned properties refrence same value", function () { - expect$3(util$1.clone(meta)).to.haveOwnProperty("util").that.is.a("object").which.equals(util$1); - }); - }); - describe("util.each", function () { - it("should iterate over an objects properties", function () { - var size = Object.keys(util$1).length; - var entries = []; - util$1.each(util$1, function (value, key) { - entries.push({ - key: key, - value: value - }); - }); - expect$3(entries.length).to.equal(size); - entries.forEach(function (entry) { - expect$3(util$1).to.have.ownProperty(entry.key).which.equals(entry.value); - }); - }); - }); - describe("util.values", function () { - var map = { - a: 1, - b: 2, - c: 3 - }; - it("can extract values like Object.values", function () { - expect$3(util$1.values(map)).to.be.an("array").with.a.lengthOf(3).and.includes.members([1, 2, 3]); - }); - it("can take a transformer, like Array#map", function () { - expect$3(util$1.values(map, function (n) { - return String(n); - })).that.includes.members(["1", "2", "3"]); - }); - }); - describe("util.extend", function () { - var source = { - d: 4, - e: 5, - f: 6, - g: 7, - h: 8 - }; - it("extend an empty object", function () { - var target = {}; - expect$3(util$1.extend(target, source)).to.be.an("object").that.includes.keys(Object.keys(source)); - expect$3(util$1.values(target)).to.include.members([4, 5, 6, 7, 8]).and.have.a.lengthOf(5); - }); - it("extend an object", function () { - var target = util$1.extend({}, source); - var utils = Object.keys(util$1); - expect$3(util$1.extend(target, util$1)).to.include.keys(utils); - expect$3(util$1.values(target)).to.have.a.lengthOf(5 + utils.length); - }); - }); - describe("util.map", function () { - var object = { - a: 1, - b: 2, - c: 3, - d: 4 - }; - var result = util$1.map(object, String); - it("returns an object, and not an array, unlike Array#map", function () { - expect$3(result).to.be.an("object").that.includes.keys(Object.keys(object)); - }); - it("applies a transformation on each properties value", function () { - util$1.each(result, function (property) { - expect$3(property).to.be.a("string"); - }); - }); - }); - }); - - var expect$4 = chai$1.expect; - describe("plugin API", function () { - describe("use", function () { - var grammar = "start = 'a'"; - it("is called for each plugin", function () { - var pluginsUsed = [false, false, false]; - var plugins = [{ - use: function use() { - pluginsUsed[0] = true; - } - }, { - use: function use() { - pluginsUsed[1] = true; - } - }, { - use: function use() { - pluginsUsed[2] = true; - } - }]; - peg_1.generate(grammar, { - plugins: plugins - }); - expect$4(pluginsUsed).to.deep.equal([true, true, true]); - }); - it("receives configuration", function () { - var plugin = { - use: function use(config) { - expect$4(config).to.be.an("object"); - expect$4(config.parser).to.be.an("object"); - expect$4(config.parser.parse("start = 'a'")).to.be.an("object"); - expect$4(config.passes).to.be.an("object"); - expect$4(config.passes.check).to.be.an("array"); - config.passes.check.forEach(function (pass) { - expect$4(pass).to.be.a("function"); - }); - expect$4(config.passes.transform).to.be.an("array"); - config.passes.transform.forEach(function (pass) { - expect$4(pass).to.be.a("function"); - }); - expect$4(config.passes.generate).to.be.an("array"); - config.passes.generate.forEach(function (pass) { - expect$4(pass).to.be.a("function"); - }); - } - }; - peg_1.generate(grammar, { - plugins: [plugin] - }); - }); - it("receives options", function () { - var generateOptions = { - plugins: [{ - use: function use(config, options) { - expect$4(options).to.equal(generateOptions); - } - }], - foo: 42 - }; - peg_1.generate(grammar, generateOptions); - }); - it("can replace parser", function () { - var plugin = { - use: function use(config) { - config.parser = peg_1.generate("\n\n start = .* {\n return new ast.Grammar( void 0, [{\n type: \"rule\",\n name: \"start\",\n expression: {\n type: \"literal\",\n value: text(),\n ignoreCase: false\n }\n }] );\n }\n\n ", { - context: { - ast: peg_1.ast - } - }); - } - }; - var parser = peg_1.generate("a", { - plugins: [plugin] - }); - expect$4(parser.parse("a")).to.equal("a"); - }); - it("can change compiler passes", function () { - var plugin = { - use: function use(config) { - function pass(ast) { - ast.code = "exports.parse = function() { return 42; }"; - } - - config.passes.generate = [pass]; - } - }; - var parser = peg_1.generate(grammar, { - plugins: [plugin] - }); - expect$4(parser.parse("a")).to.equal(42); - }); - it("can change options", function () { - var grammar = "\n\n a = 'x'\n b = 'x'\n c = 'x'\n\n "; - var plugin = { - use: function use(config, options) { - options.allowedStartRules = ["b", "c"]; - } - }; - var parser = peg_1.generate(grammar, { - allowedStartRules: ["a"], - plugins: [plugin] - }); - expect$4(function () { - parser.parse("x", { - startRule: "a" - }); - }).to.throw(); - expect$4(parser.parse("x", { - startRule: "b" - })).to.equal("x"); - expect$4(parser.parse("x", { - startRule: "c" - })).to.equal("x"); - }); - }); - }); - - var expect$5 = chai$1.expect; - describe("generated parser behavior", function () { - function varyOptimizationOptions(block) { - var optionsVariants = [{ - cache: false, - optimize: "speed", - trace: false - }, { - cache: false, - optimize: "speed", - trace: true - }, { - cache: false, - optimize: "size", - trace: false - }, { - cache: false, - optimize: "size", - trace: true - }, { - cache: true, - optimize: "speed", - trace: false - }, { - cache: true, - optimize: "speed", - trace: true - }, { - cache: true, - optimize: "size", - trace: false - }, { - cache: true, - optimize: "size", - trace: true - }]; - optionsVariants.forEach(function (variant) { - describe("with options " + chai$1.util.inspect(variant), function () { - block(peg_1.util.clone(variant)); - }); - }); - } - - function withConsoleStub(block) { - if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") sinon.stub(console, "log"); - - try { - return block(); - } finally { - if ((typeof console === "undefined" ? "undefined" : _typeof(console)) === "object") console.log.restore(); - } - } - - function helpers(chai, utils) { - var Assertion = chai.Assertion; - Assertion.addMethod("parse", function (input, expected, options) { - var _this = this; - - options = typeof options !== "undefined" ? options : {}; - var result = withConsoleStub(function () { - return utils.flag(_this, "object").parse(input, options); - }); - - if (typeof expected !== "undefined") { - this.assert(utils.eql(result, expected), "expected #{this} to parse input as #{exp} but got #{act}", "expected #{this} to not parse input as #{exp}", expected, result, !utils.flag(this, "negate")); - } - }); - Assertion.addMethod("failToParse", function (input, props, options) { - var _this2 = this; - - options = typeof options !== "undefined" ? options : {}; - var passed, result; - - try { - result = withConsoleStub(function () { - return utils.flag(_this2, "object").parse(input, options); - }); - passed = true; - } catch (e) { - result = e; - passed = false; - } - - this.assert(!passed, "expected #{this} to fail to parse input but got #{act}", "expected #{this} to not fail to parse input but #{act} was thrown", null, result); - - if (!passed && typeof props !== "undefined") { - Object.keys(props).forEach(function (key) { - new Assertion(result).to.have.property(key).that.is.deep.equal(props[key]); - }); - } - }); - } - - beforeEach(function () { - chai$1.use(helpers); - }); - varyOptimizationOptions(function (options) { - describe("initializer", function () { - it("executes the code before parsing starts", function () { - var parser = peg_1.generate(["{ var result = 42; }", "start = 'a' { return result; }"].join("\n"), options); - expect$5(parser).to.parse("a", 42); - }); - describe("available variables and functions", function () { - it("|options| contains options", function () { - var parser = peg_1.generate(["{ var result = options; }", "start = 'a' { return result; }"].join("\n"), options); - expect$5(parser).to.parse("a", { - a: 42 - }, { - a: 42 - }); - }); - }); - }); - describe("rule", function () { - if (options.cache) { - it("caches rule match results", function () { - var parser = peg_1.generate(["{ var n = 0; }", "start = (a 'b') / (a 'c') { return n; }", "a = 'a' { n++; }"].join("\n"), options); - expect$5(parser).to.parse("ac", 1); - }); - } else { - it("doesn't cache rule match results", function () { - var parser = peg_1.generate(["{ var n = 0; }", "start = (a 'b') / (a 'c') { return n; }", "a = 'a' { n++; }"].join("\n"), options); - expect$5(parser).to.parse("ac", 2); - }); - } - - describe("when the expression matches", function () { - it("returns its match result", function () { - var parser = peg_1.generate("start = 'a'"); - expect$5(parser).to.parse("a", "a"); - }); - }); - describe("when the expression doesn't match", function () { - describe("without display name", function () { - it("reports match failure and doesn't record any expectation", function () { - var parser = peg_1.generate("start = 'a'"); - expect$5(parser).to.failToParse("b", { - expected: [{ - type: "literal", - text: "a", - ignoreCase: false - }] - }); - }); - }); - describe("with display name", function () { - it("reports match failure and records an expectation of type \"other\"", function () { - var parser = peg_1.generate("start 'start' = 'a'"); - expect$5(parser).to.failToParse("b", { - expected: [{ - type: "other", - description: "start" - }] - }); - }); - it("discards any expectations recorded when matching the expression", function () { - var parser = peg_1.generate("start 'start' = 'a'"); - expect$5(parser).to.failToParse("b", { - expected: [{ - type: "other", - description: "start" - }] - }); - }); - }); - }); - }); - describe("literal", function () { - describe("matching", function () { - it("matches empty literals", function () { - var parser = peg_1.generate("start = ''", options); - expect$5(parser).to.parse(""); - }); - it("matches one-character literals", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.parse("a"); - expect$5(parser).to.failToParse("b"); - }); - it("matches multi-character literals", function () { - var parser = peg_1.generate("start = 'abcd'", options); - expect$5(parser).to.parse("abcd"); - expect$5(parser).to.failToParse("efgh"); - }); - it("is case sensitive without the \"i\" flag", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.parse("a"); - expect$5(parser).to.failToParse("A"); - }); - it("is case insensitive with the \"i\" flag", function () { - var parser = peg_1.generate("start = 'a'i", options); - expect$5(parser).to.parse("a"); - expect$5(parser).to.parse("A"); - }); - }); - describe("when it matches", function () { - it("returns the matched text", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.parse("a", "a"); - }); - it("consumes the matched text", function () { - var parser = peg_1.generate("start = 'a' .", options); - expect$5(parser).to.parse("ab"); - }); - }); - describe("when it doesn't match", function () { - it("reports match failure and records an expectation of type \"literal\"", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("b", { - expected: [{ - type: "literal", - text: "a", - ignoreCase: false - }] - }); - }); - }); - }); - describe("character class", function () { - describe("matching", function () { - it("matches empty classes", function () { - var parser = peg_1.generate("start = []", options); - expect$5(parser).to.failToParse("a"); - }); - it("matches classes with a character list", function () { - var parser = peg_1.generate("start = [abc]", options); - expect$5(parser).to.parse("a"); - expect$5(parser).to.parse("b"); - expect$5(parser).to.parse("c"); - expect$5(parser).to.failToParse("d"); - }); - it("matches classes with a character range", function () { - var parser = peg_1.generate("start = [a-c]", options); - expect$5(parser).to.parse("a"); - expect$5(parser).to.parse("b"); - expect$5(parser).to.parse("c"); - expect$5(parser).to.failToParse("d"); - }); - it("matches inverted classes", function () { - var parser = peg_1.generate("start = [^a]", options); - expect$5(parser).to.failToParse("a"); - expect$5(parser).to.parse("b"); - }); - it("is case sensitive without the \"i\" flag", function () { - var parser = peg_1.generate("start = [a]", options); - expect$5(parser).to.parse("a"); - expect$5(parser).to.failToParse("A"); - }); - it("is case insensitive with the \"i\" flag", function () { - var parser = peg_1.generate("start = [a]i", options); - expect$5(parser).to.parse("a"); - expect$5(parser).to.parse("A"); - }); - }); - describe("when it matches", function () { - it("returns the matched character", function () { - var parser = peg_1.generate("start = [a]", options); - expect$5(parser).to.parse("a", "a"); - }); - it("consumes the matched character", function () { - var parser = peg_1.generate("start = [a] .", options); - expect$5(parser).to.parse("ab"); - }); - }); - describe("when it doesn't match", function () { - it("reports match failure and records an expectation of type \"class\"", function () { - var parser = peg_1.generate("start = [a]", options); - expect$5(parser).to.failToParse("b", { - expected: [{ - type: "class", - parts: ["a"], - inverted: false, - ignoreCase: false - }] - }); - }); - }); - }); - describe("dot", function () { - describe("matching", function () { - it("matches any character", function () { - var parser = peg_1.generate("start = .", options); - expect$5(parser).to.parse("a"); - expect$5(parser).to.parse("b"); - expect$5(parser).to.parse("c"); - }); - }); - describe("when it matches", function () { - it("returns the matched character", function () { - var parser = peg_1.generate("start = .", options); - expect$5(parser).to.parse("a", "a"); - }); - it("consumes the matched character", function () { - var parser = peg_1.generate("start = . .", options); - expect$5(parser).to.parse("ab"); - }); - }); - describe("when it doesn't match", function () { - it("reports match failure and records an expectation of type \"any\"", function () { - var parser = peg_1.generate("start = .", options); - expect$5(parser).to.failToParse("", { - expected: [{ - type: "any" - }] - }); - }); - }); - }); - describe("rule reference", function () { - describe("when referenced rule's expression matches", function () { - it("returns its result", function () { - var parser = peg_1.generate(["start = a", "a = 'a'"].join("\n"), options); - expect$5(parser).to.parse("a", "a"); - }); - }); - describe("when referenced rule's expression doesn't match", function () { - it("reports match failure", function () { - var parser = peg_1.generate(["start = a", "a = 'a'"].join("\n"), options); - expect$5(parser).to.failToParse("b"); - }); - }); - }); - describe("positive semantic predicate", function () { - describe("when the code returns a truthy value", function () { - it("returns |undefined|", function () { - var parser = peg_1.generate("start = &{ return true; } ''", options); - expect$5(parser).to.parse("", [void 0, ""]); - }); - }); - describe("when the code returns a falsey value", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = &{ return false; }", options); - expect$5(parser).to.failToParse(""); - }); - }); - describe("label variables", function () { - describe("in containing sequence", function () { - it("can access variables defined by preceding labeled elements", function () { - var parser = peg_1.generate("start = a:'a' &{ return a === 'a'; }", options); - expect$5(parser).to.parse("a"); - }); - it("cannot access variable defined by labeled predicate element", function () { - var parser = peg_1.generate("start = 'a' b:&{ return b === undefined; } 'c'", options); - expect$5(parser).to.failToParse("ac"); - }); - it("cannot access variables defined by following labeled elements", function () { - var parser = peg_1.generate("start = &{ return a === 'a'; } a:'a'", options); - expect$5(parser).to.failToParse("a"); - }); - it("cannot access variables defined by subexpressions", function () { - var testcases = [{ - grammar: "start = (a:'a') &{ return a === 'a'; }", - input: "a" - }, { - grammar: "start = (a:'a')? &{ return a === 'a'; }", - input: "a" - }, { - grammar: "start = (a:'a')* &{ return a === 'a'; }", - input: "a" - }, { - grammar: "start = (a:'a')+ &{ return a === 'a'; }", - input: "a" - }, { - grammar: "start = $(a:'a') &{ return a === 'a'; }", - input: "a" - }, { - grammar: "start = &(a:'a') 'a' &{ return a === 'a'; }", - input: "a" - }, { - grammar: "start = !(a:'a') 'b' &{ return a === 'a'; }", - input: "b" - }, { - grammar: "start = b:(a:'a') &{ return a === 'a'; }", - input: "a" - }, { - grammar: "start = ('a' b:'b' 'c') &{ return b === 'b'; }", - input: "abc" - }, { - grammar: "start = (a:'a' { return a; }) &{ return a === 'a'; }", - input: "a" - }, { - grammar: "start = ('a' / b:'b' / 'c') &{ return b === 'b'; }", - input: "b" - }]; - testcases.forEach(function (testcase) { - var parser = peg_1.generate(testcase.grammar, options); - expect$5(parser).to.failToParse(testcase.input); - }); - }); - }); - describe("in outer sequence", function () { - it("can access variables defined by preceding labeled elements", function () { - var parser = peg_1.generate("start = a:'a' ('b' &{ return a === 'a'; })", options); - expect$5(parser).to.parse("ab"); - }); - it("cannot access variable defined by labeled predicate element", function () { - var parser = peg_1.generate("start = 'a' b:('b' &{ return b === undefined; }) 'c'", options); - expect$5(parser).to.failToParse("abc"); - }); - it("cannot access variables defined by following labeled elements", function () { - var parser = peg_1.generate("start = ('a' &{ return b === 'b'; }) b:'b'", options); - expect$5(parser).to.failToParse("ab"); - }); - }); - }); - describe("initializer variables & functions", function () { - it("can access variables defined in the initializer", function () { - var parser = peg_1.generate(["{ var v = 42 }", "start = &{ return v === 42; }"].join("\n"), options); - expect$5(parser).to.parse(""); - }); - it("can access functions defined in the initializer", function () { - var parser = peg_1.generate(["{ function f() { return 42; } }", "start = &{ return f() === 42; }"].join("\n"), options); - expect$5(parser).to.parse(""); - }); - }); - describe("available variables & functions", function () { - it("|options| contains options", function () { - var parser = peg_1.generate(["{ var result; }", "start = &{ result = options; return true; } { return result; }"].join("\n"), options); - expect$5(parser).to.parse("", { - a: 42 - }, { - a: 42 - }); - }); - it("|location| returns current location info", function () { - var parser = peg_1.generate(["{ var result; }", "start = line (nl+ line)* { return result; }", "line = thing (' '+ thing)*", "thing = digit / mark", "digit = [0-9]", "mark = &{ result = location(); return true; } 'x'", "nl = '\\r'? '\\n'"].join("\n"), options); - expect$5(parser).to.parse("1\n2\n\n3\n\n\n4 5 x", { - start: { - offset: 13, - line: 7, - column: 5 - }, - end: { - offset: 13, - line: 7, - column: 5 - } - }); - expect$5(parser).to.parse("1\nx", { - start: { - offset: 2, - line: 2, - column: 1 - }, - end: { - offset: 2, - line: 2, - column: 1 - } - }); - expect$5(parser).to.parse("1\r\nx", { - start: { - offset: 3, - line: 2, - column: 1 - }, - end: { - offset: 3, - line: 2, - column: 1 - } - }); - }); - it("|offset| returns current start offset", function () { - var parser = peg_1.generate(["start = [0-9]+ val:mark { return val; }", "mark = 'xx' { return offset(); }"].join("\n"), options); - expect$5(parser).to.parse("0123456xx", 7); - }); - it("|range| returns current range", function () { - var parser = peg_1.generate(["start = [0-9]+ val:mark { return val; }", "mark = 'xx' { return range(); }"].join("\n"), options); - expect$5(parser).to.parse("0123456xx", [7, 9]); - }); - }); - }); - describe("negative semantic predicate", function () { - describe("when the code returns a falsey value", function () { - it("returns |undefined|", function () { - var parser = peg_1.generate("start = !{ return false; } ''", options); - expect$5(parser).to.parse("", [void 0, ""]); - }); - }); - describe("when the code returns a truthy value", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = !{ return true; }", options); - expect$5(parser).to.failToParse(""); - }); - }); - describe("label variables", function () { - describe("in containing sequence", function () { - it("can access variables defined by preceding labeled elements", function () { - var parser = peg_1.generate("start = a:'a' !{ return a !== 'a'; }", options); - expect$5(parser).to.parse("a"); - }); - it("cannot access variable defined by labeled predicate element", function () { - var parser = peg_1.generate("start = 'a' b:!{ return b !== undefined; } 'c'", options); - expect$5(parser).to.failToParse("ac"); - }); - it("cannot access variables defined by following labeled elements", function () { - var parser = peg_1.generate("start = !{ return a !== 'a'; } a:'a'", options); - expect$5(parser).to.failToParse("a"); - }); - it("cannot access variables defined by subexpressions", function () { - var testcases = [{ - grammar: "start = (a:'a') !{ return a !== 'a'; }", - input: "a" - }, { - grammar: "start = (a:'a')? !{ return a !== 'a'; }", - input: "a" - }, { - grammar: "start = (a:'a')* !{ return a !== 'a'; }", - input: "a" - }, { - grammar: "start = (a:'a')+ !{ return a !== 'a'; }", - input: "a" - }, { - grammar: "start = $(a:'a') !{ return a !== 'a'; }", - input: "a" - }, { - grammar: "start = &(a:'a') 'a' !{ return a !== 'a'; }", - input: "a" - }, { - grammar: "start = !(a:'a') 'b' !{ return a !== 'a'; }", - input: "b" - }, { - grammar: "start = b:(a:'a') !{ return a !== 'a'; }", - input: "a" - }, { - grammar: "start = ('a' b:'b' 'c') !{ return b !== 'b'; }", - input: "abc" - }, { - grammar: "start = (a:'a' { return a; }) !{ return a !== 'a'; }", - input: "a" - }, { - grammar: "start = ('a' / b:'b' / 'c') !{ return b !== 'b'; }", - input: "b" - }]; - testcases.forEach(function (testcase) { - var parser = peg_1.generate(testcase.grammar, options); - expect$5(parser).to.failToParse(testcase.input); - }); - }); - }); - describe("in outer sequence", function () { - it("can access variables defined by preceding labeled elements", function () { - var parser = peg_1.generate("start = a:'a' ('b' !{ return a !== 'a'; })", options); - expect$5(parser).to.parse("ab"); - }); - it("cannot access variable defined by labeled predicate element", function () { - var parser = peg_1.generate("start = 'a' b:('b' !{ return b !== undefined; }) 'c'", options); - expect$5(parser).to.failToParse("abc"); - }); - it("cannot access variables defined by following labeled elements", function () { - var parser = peg_1.generate("start = ('a' !{ return b !== 'b'; }) b:'b'", options); - expect$5(parser).to.failToParse("ab"); - }); - }); - }); - describe("initializer variables & functions", function () { - it("can access variables defined in the initializer", function () { - var parser = peg_1.generate(["{ var v = 42 }", "start = !{ return v !== 42; }"].join("\n"), options); - expect$5(parser).to.parse(""); - }); - it("can access functions defined in the initializer", function () { - var parser = peg_1.generate(["{ function f() { return 42; } }", "start = !{ return f() !== 42; }"].join("\n"), options); - expect$5(parser).to.parse(""); - }); - }); - describe("available variables & functions", function () { - it("|options| contains options", function () { - var parser = peg_1.generate(["{ var result; }", "start = !{ result = options; return false; } { return result; }"].join("\n"), options); - expect$5(parser).to.parse("", { - a: 42 - }, { - a: 42 - }); - }); - it("|location| returns current location info", function () { - var parser = peg_1.generate(["{ var result; }", "start = line (nl+ line)* { return result; }", "line = thing (' '+ thing)*", "thing = digit / mark", "digit = [0-9]", "mark = !{ result = location(); return false; } 'x'", "nl = '\\r'? '\\n'"].join("\n"), options); - expect$5(parser).to.parse("1\n2\n\n3\n\n\n4 5 x", { - start: { - offset: 13, - line: 7, - column: 5 - }, - end: { - offset: 13, - line: 7, - column: 5 - } - }); - expect$5(parser).to.parse("1\nx", { - start: { - offset: 2, - line: 2, - column: 1 - }, - end: { - offset: 2, - line: 2, - column: 1 - } - }); - expect$5(parser).to.parse("1\r\nx", { - start: { - offset: 3, - line: 2, - column: 1 - }, - end: { - offset: 3, - line: 2, - column: 1 - } - }); - }); - }); - }); - describe("group", function () { - describe("when the expression matches", function () { - it("returns its match result", function () { - var parser = peg_1.generate("start = ('a')", options); - expect$5(parser).to.parse("a", "a"); - }); - }); - describe("when the expression doesn't match", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = ('a')", options); - expect$5(parser).to.failToParse("b"); - }); - }); - }); - describe("optional", function () { - describe("when the expression matches", function () { - it("returns its match result", function () { - var parser = peg_1.generate("start = 'a'?", options); - expect$5(parser).to.parse("a", "a"); - }); - }); - describe("when the expression doesn't match", function () { - it("returns |null|", function () { - var parser = peg_1.generate("start = 'a'?", options); - expect$5(parser).to.parse("", null); - }); - }); - }); - describe("zero or more", function () { - describe("when the expression matches zero or more times", function () { - it("returns an array of its match results", function () { - var parser = peg_1.generate("start = 'a'*", options); - expect$5(parser).to.parse("", []); - expect$5(parser).to.parse("a", ["a"]); - expect$5(parser).to.parse("aaa", ["a", "a", "a"]); - }); - }); - }); - describe("one or more", function () { - describe("when the expression matches one or more times", function () { - it("returns an array of its match results", function () { - var parser = peg_1.generate("start = 'a'+", options); - expect$5(parser).to.parse("a", ["a"]); - expect$5(parser).to.parse("aaa", ["a", "a", "a"]); - }); - }); - describe("when the expression doesn't match", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = 'a'+", options); - expect$5(parser).to.failToParse(""); - }); - }); - }); - describe("text", function () { - describe("when the expression matches", function () { - it("returns the matched text", function () { - var parser = peg_1.generate("start = $('a' 'b' 'c')", options); - expect$5(parser).to.parse("abc", "abc"); - }); - }); - describe("when the expression doesn't match", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = $('a')", options); - expect$5(parser).to.failToParse("b"); - }); - }); - }); - describe("positive simple predicate", function () { - describe("when the expression matches", function () { - it("returns |undefined|", function () { - var parser = peg_1.generate("start = &'a' 'a'", options); - expect$5(parser).to.parse("a", [void 0, "a"]); - }); - it("resets parse position", function () { - var parser = peg_1.generate("start = &'a' 'a'", options); - expect$5(parser).to.parse("a"); - }); - }); - describe("when the expression doesn't match", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = &'a'", options); - expect$5(parser).to.failToParse("b"); - }); - it("doesn't discard any expectations recorded when matching the expression", function () { - var parser = peg_1.generate("start = 'a' / &'b' / 'c'", options); - expect$5(parser).to.failToParse("d", { - expected: [{ - type: "literal", - text: "a", - ignoreCase: false - }, { - type: "literal", - text: "b", - ignoreCase: false - }, { - type: "literal", - text: "c", - ignoreCase: false - }] - }); - }); - it("records expectations from right place", function () { - var parser = peg_1.generate("start = 'a' / &'b' .", options); - expect$5(parser).to.failToParse("d", { - expected: [{ - type: "literal", - text: "a", - ignoreCase: false - }, { - type: "literal", - text: "b", - ignoreCase: false - }] - }); - }); - }); - }); - describe("negative simple predicate", function () { - describe("when the expression matches", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = !'a'", options); - expect$5(parser).to.failToParse("a"); - }); - }); - describe("when the expression doesn't match", function () { - it("returns |undefined|", function () { - var parser = peg_1.generate("start = !'a' 'b'", options); - expect$5(parser).to.parse("b", [void 0, "b"]); - }); - it("resets parse position", function () { - var parser = peg_1.generate("start = !'a' 'b'", options); - expect$5(parser).to.parse("b"); - }); - it("inverts any expectations recorded when matching the expression", function () { - var parser = peg_1.generate("start = 'a' / !'b' / 'c'", options); - expect$5(parser).to.failToParse("b", { - expected: [{ - type: "literal", - text: "a", - ignoreCase: false - }, { - type: "not", - expected: { - type: "literal", - text: "b", - ignoreCase: false - } - }, { - type: "literal", - text: "c", - ignoreCase: false - }] - }); - }); - it("records expectations from right place", function () { - var parser = peg_1.generate("start = 'a' / !'b' .", options); - expect$5(parser).to.failToParse("b", { - expected: [{ - type: "literal", - text: "a", - ignoreCase: false - }, { - type: "not", - expected: { - type: "literal", - text: "b", - ignoreCase: false - } - }] - }); - }); - it("reports not inverted expectations when the expression inverted twice", function () { - var parser = peg_1.generate("start = !(!'a')", options); - expect$5(parser).to.failToParse("b", { - expected: [{ - type: "literal", - text: "a", - ignoreCase: false - }] - }); - }); - }); - }); - describe("label", function () { - describe("when the expression matches", function () { - it("returns its match result", function () { - var parser = peg_1.generate("start = a:'a'", options); - expect$5(parser).to.parse("a", "a"); - }); - }); - describe("when the expression doesn't match", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = a:'a'", options); - expect$5(parser).to.failToParse("b"); - }); - }); - }); - describe("sequence", function () { - describe("when all expressions match", function () { - function parser(description, edgecases) { - it(description, function () { - edgecases.forEach(function (_ref) { - var grammar = _ref.grammar, - input = _ref.input, - output = _ref.output; - var parser = peg_1.generate(grammar, options); - expect$5(parser).to.parse(input, output); - }); - }); - } - - parser("returns an array of their match results", [{ - grammar: "start = 'a' 'b' 'c'", - input: "abc", - output: ["a", "b", "c"] - }]); - parser("plucking a single value", [{ - grammar: "start = @'a'", - input: "a", - output: "a" - }, { - grammar: "start = @'a' / @'b'", - input: "a", - output: "a" - }, { - grammar: "start = @'a' / @'b'", - input: "b", - output: "b" - }, { - grammar: "start = 'a' @'b' 'c'", - input: "abc", - output: "b" - }, { - grammar: "start = 'a' ( @'b' 'c' )", - input: "abc", - output: ["a", "b"] - }, { - grammar: "start = 'a' @( 'b' @'c' 'd' )", - input: "abcd", - output: "c" - }, { - grammar: "start = 'a' ( @'b' 'c' ) @'d'", - input: "abcd", - output: "d" - }, { - grammar: "start = 'a' @'b' 'c' / 'd' 'e' @'f'", - input: "def", - output: "f" - }]); - parser("plucking multiple values", [{ - grammar: "start = 'a' @'b' @'c'", - input: "abc", - output: ["b", "c"] - }, { - grammar: "start = 'a' ( @'b' @'c' )", - input: "abc", - output: ["a", ["b", "c"]] - }, { - grammar: "start = 'a' @( 'b' @'c' @'d' )", - input: "abcd", - output: ["c", "d"] - }, { - grammar: "start = 'a' @( @'b' 'c' ) @'d' 'e'", - input: "abcde", - output: ["b", "d"] - }, { - grammar: "start = 'a' @'b' 'c' / @'d' 'e' @'f'", - input: "def", - output: ["d", "f"] - }]); - parser("plucking a value if a predicate doesnt fail", [{ - grammar: "start = @'a' &{ return true; }", - input: "a", - output: "a" - }, { - grammar: "start = @'a' !{ return false; }", - input: "a", - output: "a" - }, { - grammar: "start = @n:[0-9] &{ return n > 0; }", - input: "2", - output: "2" - }]); - }); - describe("when any expression doesn't match", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = 'a' 'b' 'c'", options); - expect$5(parser).to.failToParse("dbc"); - expect$5(parser).to.failToParse("adc"); - expect$5(parser).to.failToParse("abd"); - }); - it("resets parse position", function () { - var parser = peg_1.generate("start = 'a' 'b' / 'a'", options); - expect$5(parser).to.parse("a", "a"); - }); - }); - }); - describe("action", function () { - describe("when the expression matches", function () { - it("returns the value returned by the code", function () { - var parser = peg_1.generate("start = 'a' { return 42; }", options); - expect$5(parser).to.parse("a", 42); - }); - describe("label variables", function () { - describe("in the expression", function () { - it("can access variable defined by labeled expression", function () { - var parser = peg_1.generate("start = a:'a' { return a; }", options); - expect$5(parser).to.parse("a", "a"); - }); - it("can access variables defined by labeled sequence elements", function () { - var parser = peg_1.generate("start = a:'a' b:'b' c:'c' { return [a, b, c]; }", options); - expect$5(parser).to.parse("abc", ["a", "b", "c"]); - }); - it("cannot access variables defined by subexpressions", function () { - var testcases = [{ - grammar: "start = (a:'a') { return a; }", - input: "a" - }, { - grammar: "start = (a:'a')? { return a; }", - input: "a" - }, { - grammar: "start = (a:'a')* { return a; }", - input: "a" - }, { - grammar: "start = (a:'a')+ { return a; }", - input: "a" - }, { - grammar: "start = $(a:'a') { return a; }", - input: "a" - }, { - grammar: "start = &(a:'a') 'a' { return a; }", - input: "a" - }, { - grammar: "start = !(a:'a') 'b' { return a; }", - input: "b" - }, { - grammar: "start = b:(a:'a') { return a; }", - input: "a" - }, { - grammar: "start = ('a' b:'b' 'c') { return b; }", - input: "abc" - }, { - grammar: "start = (a:'a' { return a; }) { return a; }", - input: "a" - }, { - grammar: "start = ('a' / b:'b' / 'c') { return b; }", - input: "b" - }]; - testcases.forEach(function (testcase) { - var parser = peg_1.generate(testcase.grammar, options); - expect$5(parser).to.failToParse(testcase.input); - }); - }); - }); - describe("in outer sequence", function () { - it("can access variables defined by preceding labeled elements", function () { - var parser = peg_1.generate("start = a:'a' ('b' { return a; })", options); - expect$5(parser).to.parse("ab", ["a", "a"]); - }); - it("cannot access variable defined by labeled action element", function () { - var parser = peg_1.generate("start = 'a' b:('b' { return b; }) c:'c'", options); - expect$5(parser).to.failToParse("abc"); - }); - it("cannot access variables defined by following labeled elements", function () { - var parser = peg_1.generate("start = ('a' { return b; }) b:'b'", options); - expect$5(parser).to.failToParse("ab"); - }); - }); - }); - describe("initializer variables & functions", function () { - it("can access variables defined in the initializer", function () { - var parser = peg_1.generate(["{ var v = 42 }", "start = 'a' { return v; }"].join("\n"), options); - expect$5(parser).to.parse("a", 42); - }); - it("can access functions defined in the initializer", function () { - var parser = peg_1.generate(["{ function f() { return 42; } }", "start = 'a' { return f(); }"].join("\n"), options); - expect$5(parser).to.parse("a", 42); - }); - }); - describe("available variables & functions", function () { - it("|options| contains options", function () { - var parser = peg_1.generate("start = 'a' { return options; }", options); - expect$5(parser).to.parse("a", { - a: 42 - }, { - a: 42 - }); - }); - it("|text| returns text matched by the expression", function () { - var parser = peg_1.generate("start = 'a' { return text(); }", options); - expect$5(parser).to.parse("a", "a"); - }); - it("|location| returns location info of the expression", function () { - var parser = peg_1.generate(["{ var result; }", "start = line (nl+ line)* { return result; }", "line = thing (' '+ thing)*", "thing = digit / mark", "digit = [0-9]", "mark = 'x' { result = location(); }", "nl = '\\r'? '\\n'"].join("\n"), options); - expect$5(parser).to.parse("1\n2\n\n3\n\n\n4 5 x", { - start: { - offset: 13, - line: 7, - column: 5 - }, - end: { - offset: 14, - line: 7, - column: 6 - } - }); - expect$5(parser).to.parse("1\nx", { - start: { - offset: 2, - line: 2, - column: 1 - }, - end: { - offset: 3, - line: 2, - column: 2 - } - }); - expect$5(parser).to.parse("1\r\nx", { - start: { - offset: 3, - line: 2, - column: 1 - }, - end: { - offset: 4, - line: 2, - column: 2 - } - }); - }); - describe("|expected|", function () { - it("terminates parsing and throws an exception", function () { - var parser = peg_1.generate("start = 'a' { expected('a'); }", options); - expect$5(parser).to.failToParse("a", { - message: "Expected a but \"a\" found.", - expected: [{ - type: "other", - description: "a" - }], - found: "a", - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 1, - line: 1, - column: 2 - } - } - }); - }); - it("allows to set custom location info", function () { - var parser = peg_1.generate(["start = 'a' {", " expected('a', {", " start: { offset: 1, line: 1, column: 2 },", " end: { offset: 2, line: 1, column: 3 }", " });", "}"].join("\n"), options); - expect$5(parser).to.failToParse("a", { - message: "Expected a but \"a\" found.", - expected: [{ - type: "other", - description: "a" - }], - found: "a", - location: { - start: { - offset: 1, - line: 1, - column: 2 - }, - end: { - offset: 2, - line: 1, - column: 3 - } - } - }); - }); - }); - describe("|error|", function () { - it("terminates parsing and throws an exception", function () { - var parser = peg_1.generate("start = 'a' { error('a'); }", options); - expect$5(parser).to.failToParse("a", { - message: "a", - found: null, - expected: null, - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 1, - line: 1, - column: 2 - } - } - }); - }); - it("allows to set custom location info", function () { - var parser = peg_1.generate(["start = 'a' {", " error('a', {", " start: { offset: 1, line: 1, column: 2 },", " end: { offset: 2, line: 1, column: 3 }", " });", "}"].join("\n"), options); - expect$5(parser).to.failToParse("a", { - message: "a", - expected: null, - found: null, - location: { - start: { - offset: 1, - line: 1, - column: 2 - }, - end: { - offset: 2, - line: 1, - column: 3 - } - } - }); - }); - }); - }); - }); - describe("when the expression doesn't match", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = 'a' { return 42; }", options); - expect$5(parser).to.failToParse("b"); - }); - it("doesn't execute the code", function () { - var parser = peg_1.generate("start = 'a' { throw 'Boom!'; } / 'b'", options); - expect$5(parser).to.parse("b"); - }); - }); - }); - describe("choice", function () { - describe("when any expression matches", function () { - it("returns its match result", function () { - var parser = peg_1.generate("start = 'a' / 'b' / 'c'", options); - expect$5(parser).to.parse("a", "a"); - expect$5(parser).to.parse("b", "b"); - expect$5(parser).to.parse("c", "c"); - }); - }); - describe("when all expressions don't match", function () { - it("reports match failure", function () { - var parser = peg_1.generate("start = 'a' / 'b' / 'c'", options); - expect$5(parser).to.failToParse("d"); - }); - }); - }); - describe("error reporting", function () { - describe("behavior", function () { - it("reports only the rightmost error", function () { - var parser = peg_1.generate("start = 'a' 'b' / 'a' 'c' 'd'", options); - expect$5(parser).to.failToParse("ace", { - expected: [{ - type: "literal", - text: "d", - ignoreCase: false - }] - }); - }); - }); - describe("expectations reporting", function () { - it("reports expectations correctly with no alternative", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("ab", { - expected: [{ - type: "end" - }] - }); - }); - it("reports expectations correctly with one alternative", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("b", { - expected: [{ - type: "literal", - text: "a", - ignoreCase: false - }] - }); - }); - it("reports expectations correctly with multiple alternatives", function () { - var parser = peg_1.generate("start = 'a' / 'b' / 'c'", options); - expect$5(parser).to.failToParse("d", { - expected: [{ - type: "literal", - text: "a", - ignoreCase: false - }, { - type: "literal", - text: "b", - ignoreCase: false - }, { - type: "literal", - text: "c", - ignoreCase: false - }] - }); - }); - it("reports expectations correctly with look ahead", function () { - var parser = peg_1.generate(["Statement = '{' __ !Statement Statement __ '}'", "__ = [ ]*"].join("\n"), options); - expect$5(parser).to.failToParse("{x}", { - expected: [{ - type: "class", - parts: [" "], - inverted: false, - ignoreCase: false - }, { - type: "not", - expected: { - type: "literal", - text: "{", - ignoreCase: false - } - }, { - type: "literal", - text: "{", - ignoreCase: false - }] - }); - parser = peg_1.generate(["Start = Char+ End", "End = 'e'", "Char = !End [a-z]"].join("\n"), options); - expect$5(parser).to.failToParse("a", { - expected: [{ - type: "class", - parts: [["a", "z"]], - inverted: false, - ignoreCase: false - }, { - type: "literal", - text: "e", - ignoreCase: false - }] - }); - }); - it("reports expectations correctly with look ahead + grouped names", function () { - var parser = peg_1.generate(["Start = Char+ End", "End 'end' = 'e'", "Char = !End [a-z]"].join("\n"), options); - expect$5(parser).to.failToParse("a", { - expected: [{ - type: "class", - parts: [["a", "z"]], - inverted: false, - ignoreCase: false - }, { - type: "other", - description: "end" - }] - }); - }); - }); - describe("found string reporting", function () { - it("reports found string correctly at the end of input", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("", { - found: null - }); - }); - it("reports found string correctly in the middle of input", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("b", { - found: "b" - }); - }); - }); - describe("message building", function () { - it("builds message correctly with no alternative", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("ab", { - message: "Expected end of input but \"b\" found." - }); - }); - it("builds message correctly with one alternative", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("b", { - message: "Expected \"a\" but \"b\" found." - }); - }); - it("builds message correctly with multiple alternatives", function () { - var parser = peg_1.generate("start = 'a' / 'b' / 'c'", options); - expect$5(parser).to.failToParse("d", { - message: "Expected \"a\", \"b\", or \"c\" but \"d\" found." - }); - }); - it("builds message correctly at the end of input", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("", { - message: "Expected \"a\" but end of input found." - }); - }); - it("builds message correctly in the middle of input", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("b", { - message: "Expected \"a\" but \"b\" found." - }); - }); - it("removes duplicates from expectations", function () { - var parser = peg_1.generate("start = 'a' / 'a'", options); - expect$5(parser).to.failToParse("b", { - message: "Expected \"a\" but \"b\" found." - }); - }); - it("sorts expectations", function () { - var parser = peg_1.generate("start = 'c' / 'b' / 'a'", options); - expect$5(parser).to.failToParse("d", { - message: "Expected \"a\", \"b\", or \"c\" but \"d\" found." - }); - }); - }); - describe("position reporting", function () { - it("reports position correctly at the end of input", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("", { - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 0, - line: 1, - column: 1 - } - } - }); - }); - it("reports position correctly in the middle of input", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("b", { - location: { - start: { - offset: 0, - line: 1, - column: 1 - }, - end: { - offset: 1, - line: 1, - column: 2 - } - } - }); - }); - it("reports position correctly with trailing input", function () { - var parser = peg_1.generate("start = 'a'", options); - expect$5(parser).to.failToParse("aa", { - location: { - start: { - offset: 1, - line: 1, - column: 2 - }, - end: { - offset: 2, - line: 1, - column: 3 - } - } - }); - }); - it("reports position correctly in complex cases", function () { - var parser = peg_1.generate(["start = line (nl+ line)*", "line = digit (' '+ digit)*", "digit = [0-9]", "nl = '\\r'? '\\n'"].join("\n"), options); - expect$5(parser).to.failToParse("1\n2\n\n3\n\n\n4 5 x", { - location: { - start: { - offset: 13, - line: 7, - column: 5 - }, - end: { - offset: 14, - line: 7, - column: 6 - } - } - }); - expect$5(parser).to.failToParse("1\nx", { - location: { - start: { - offset: 2, - line: 2, - column: 1 - }, - end: { - offset: 3, - line: 2, - column: 2 - } - } - }); - expect$5(parser).to.failToParse("1\r\nx", { - location: { - start: { - offset: 3, - line: 2, - column: 1 - }, - end: { - offset: 4, - line: 2, - column: 2 - } - } - }); - }); - }); - }); - describe("complex examples", function () { - it("handles arithmetics example correctly", function () { - var parser = peg_1.generate(["Expr = Sum", "Sum = head:Product tail:(('+' / '-') Product)* {", " return tail.reduce(function(result, element) {", " if (element[0] === '+') { return result + element[1]; }", " if (element[0] === '-') { return result - element[1]; }", " }, head);", " }", "Product = head:Value tail:(('*' / '/') Value)* {", " return tail.reduce(function(result, element) {", " if (element[0] === '*') { return result * element[1]; }", " if (element[0] === '/') { return result / element[1]; }", " }, head);", " }", "Value = digits:[0-9]+ { return parseInt(digits.join(''), 10); }", " / '(' expr:Expr ')' { return expr; }"].join("\n"), options); - expect$5(parser).to.parse("0", 0); - expect$5(parser).to.parse("123", 123); - expect$5(parser).to.parse("(42+43)", 42 + 43); - expect$5(parser).to.parse("42", 42); - expect$5(parser).to.parse("42*43", 42 * 43); - expect$5(parser).to.parse("42*43*44*45", 42 * 43 * 44 * 45); - expect$5(parser).to.parse("42/43", 42 / 43); - expect$5(parser).to.parse("42/43/44/45", 42 / 43 / 44 / 45); - expect$5(parser).to.parse("42*43", 42 * 43); - expect$5(parser).to.parse("42*43+44*45", 42 * 43 + 44 * 45); - expect$5(parser).to.parse("42*43+44*45+46*47+48*49", 42 * 43 + 44 * 45 + 46 * 47 + 48 * 49); - expect$5(parser).to.parse("42*43-44*45", 42 * 43 - 44 * 45); - expect$5(parser).to.parse("42*43-44*45-46*47-48*49", 42 * 43 - 44 * 45 - 46 * 47 - 48 * 49); - expect$5(parser).to.parse("42+43", 42 + 43); - expect$5(parser).to.parse("(1+2)*(3+4)", (1 + 2) * (3 + 4)); - }); - it("handles non-context-free language correctly", function () { - var parser = peg_1.generate(["S = &(A 'c') a:'a'+ B:B !('a' / 'b' / 'c') { return a.join('') + B; }", "A = a:'a' A:A? b:'b' { return [a, A, b].join(''); }", "B = b:'b' B:B? c:'c' { return [b, B, c].join(''); }"].join("\n"), options); - expect$5(parser).to.parse("abc", "abc"); - expect$5(parser).to.parse("aaabbbccc", "aaabbbccc"); - expect$5(parser).to.failToParse("aabbbccc"); - expect$5(parser).to.failToParse("aaaabbbccc"); - expect$5(parser).to.failToParse("aaabbccc"); - expect$5(parser).to.failToParse("aaabbbbccc"); - expect$5(parser).to.failToParse("aaabbbcc"); - expect$5(parser).to.failToParse("aaabbbcccc"); - }); - it("handles nested comments example correctly", function () { - var parser = peg_1.generate(["C = begin:Begin ns:N* end:End { return begin + ns.join('') + end; }", "N = C", " / !Begin !End z:Z { return z; }", "Z = .", "Begin = '(*'", "End = '*)'"].join("\n"), options); - expect$5(parser).to.parse("(**)", "(**)"); - expect$5(parser).to.parse("(*abc*)", "(*abc*)"); - expect$5(parser).to.parse("(*(**)*)", "(*(**)*)"); - expect$5(parser).to.parse("(*abc(*def*)ghi(*(*(*jkl*)*)*)mno*)", "(*abc(*def*)ghi(*(*(*jkl*)*)*)mno*)"); - }); - }); - }); - }); - - let plugins = []; - - var chaiLike = function(_chai, utils) { - function isType(type, target) { - return utils.type(target).toUpperCase() === type.toUpperCase(); - } - - function like(object, expected) { - for (let validator of plugins) { - if (validator.match(object, expected)) { - return validator.assert(object, expected); - } - } - - // Early check for optimization and prevent recursion failures - if (object === expected) { - return true; - } - - if (isType('object', expected) && isType('object', object)) { - for (let key of Object.keys(expected)) { - if (!(key in object)) { - return false; - } - if (!like(object[key], expected[key])) { - return false; - } - } - return true; - } - - if (isType('array', expected) && isType('array', object)) { - if (object.length !== expected.length) { - return false; - } - for (let i = 0; i < expected.length; i++) { - if (!like(object[i], expected[i])) { - return false; - } - } - return true; - } - - // Special case for RegExps because literal regexp (/.../) not equal new RegExp(...) - if (isType('RegExp', object) && isType('RegExp', expected)) { - return object.toString() === expected.toString(); - } - - if (isType('Date', object) && isType('Date', expected)) { - return object.getTime() === expected.getTime(); - } - - // Do reflexed compare so primitives and object wrappers will be equal - if (isType('string', object) && isType('string', expected) - || isType('number', object) && isType('number', expected) - || isType('boolean', object) && isType('boolean', expected) - ) { - return object == expected; - } - - return false; - } - - _chai.Assertion.addMethod('like', function(expected) { - let object = utils.flag(this, 'object'); - this.assert( - like(object, expected), - 'expected #{this} to be like #{exp}', - 'expected #{this} to not like #{exp}', - expected, object, - _chai.config.showDiff - ); - }); - }; - - var extend$1 = function(plugin) { - plugins.push(plugin); - }; - - var clearPlugins = function() { - plugins = []; - }; - chaiLike.extend = extend$1; - chaiLike.clearPlugins = clearPlugins; - - var chaiLike$1 = chaiLike; - - var Session$1 = peg_1.compiler.Session; - - var helpers = function helpers(chai, utils) { - chai.use(chaiLike$1); - var Assertion = chai.Assertion; - - function parse(grammar, session, options) { - var ast = session.parse(grammar); - - if (!options.allowedStartRules) { - options.allowedStartRules = ast.rules.length > 0 ? [ast.rules[0].name] : []; - } - - return ast; - } - - Assertion.addMethod("changeAST", function (grammar, props, options, additionalRuleProps) { - options = typeof options !== "undefined" ? options : {}; - additionalRuleProps = typeof additionalRuleProps !== "undefined" ? additionalRuleProps : { - reportFailures: true - }; - var session = new Session$1({ - grammar: grammar - }); - var ast = parse(grammar, session, options); - ast.rules = ast.rules.map(function (rule) { - return Object.assign(rule, additionalRuleProps); - }); - utils.flag(this, "object")(ast, session, options); - new Assertion(ast).like(props); - }); - Assertion.addMethod("reportError", function (grammar, props, options) { - options = typeof options !== "undefined" ? options : {}; - var session = new Session$1({ - grammar: grammar - }); - var ast = parse(grammar, session, options); - var passed, result; - - try { - utils.flag(this, "object")(ast, session, options); - passed = true; - } catch (e) { - result = e; - passed = false; - } - - this.assert(!passed, "expected #{this} to report an error but it didn't", "expected #{this} to not report an error but #{act} was reported", null, result); - - if (!passed && typeof props !== "undefined") { - if (typeof props === "string") props = { - message: props - }; - Object.keys(props).forEach(function (key) { - new Assertion(result).to.have.property(key).that.is.deep.equal(props[key]); - }); - } - }); - Assertion.addMethod("reportWarning", function (grammar, warnings, options) { - var _this = this; - - warnings = Array.isArray(warnings) ? warnings : warnings == null ? [] : [warnings]; - options = typeof options !== "undefined" ? options : {}; - var messages = []; - - function warn(message) { - messages.push(message); - } - - var session = new Session$1({ - grammar: grammar, - warn: warn - }); - var ast = parse(grammar, session, options); - utils.flag(this, "object")(ast, session, options); - var messagesCount = messages.length; - var warningsCount = warnings.length; - if (warnings.length) this.assert(messagesCount === warningsCount, "expected #{this} to report ".concat(warningsCount, " warnings, but it reported ").concat(messagesCount, " warnings"), "expected #{this} to not report ".concat(warningsCount, " warnings"), warnings, messages); - warnings.forEach(function (warning) { - _this.assert(messages.indexOf(warning) !== -1, "expected #{this} to report the warning #{exp}, but it didn't", "expected #{this} to not report the warning #{exp}", warning); - }); - }); - }; - - var pass = peg_1.compiler.passes.generate.generateBytecode; - chai$1.use(helpers); - var expect$6 = chai$1.expect; - describe("compiler pass |generateBytecode|", function () { - function bytecodeDetails(bytecode) { - return { - rules: [{ - bytecode: bytecode - }] - }; - } - - function constsDetails(literals, classes, expectations, functions) { - return { - literals: literals, - classes: classes, - expectations: expectations, - functions: functions - }; - } - - describe("for grammar", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(["a = 'a'", "b = 'b'", "c = 'c'"].join("\n"), { - rules: [{ - bytecode: [23, 0, 18, 0, 2, 1, 22, 0, 3] - }, { - bytecode: [23, 1, 18, 1, 2, 1, 22, 1, 3] - }, { - bytecode: [23, 2, 18, 2, 2, 1, 22, 2, 3] - }] - }); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(["a = 'a'", "b = 'b'", "c = 'c'"].join("\n"), constsDetails(["a", "b", "c"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }, { - type: "literal", - value: "b", - ignoreCase: false - }, { - type: "literal", - value: "c", - ignoreCase: false - }], [])); - }); - }); - describe("for rule", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST("start = 'a'", bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3])); - }); - }); - describe("for named", function () { - var grammar1 = "start 'start' = ."; - var grammar2 = "start 'start' = 'a'"; - var grammar3 = "start 'start' = [a]"; - describe("when |reportFailures=true|", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar1, bytecodeDetails([23, 0, 28, 17, 2, 1, 21, 1, 3, 29])); - expect$6(pass).to.changeAST(grammar2, bytecodeDetails([23, 0, 28, 18, 0, 2, 1, 22, 0, 3, 29])); - expect$6(pass).to.changeAST(grammar3, bytecodeDetails([23, 0, 28, 20, 0, 2, 1, 21, 1, 3, 29])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar1, constsDetails([], [], [{ - type: "rule", - value: "start" - }], [])); - expect$6(pass).to.changeAST(grammar2, constsDetails(["a"], [], [{ - type: "rule", - value: "start" - }], [])); - expect$6(pass).to.changeAST(grammar3, constsDetails([], [{ - value: ["a"], - inverted: false, - ignoreCase: false - }], [{ - type: "rule", - value: "start" - }], [])); - }); - }); - describe("when |reportFailures=false|", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar1, bytecodeDetails([17, 2, 1, 21, 1, 3]), {}, { - reportFailures: false - }); - expect$6(pass).to.changeAST(grammar2, bytecodeDetails([18, 0, 2, 1, 22, 0, 3]), {}, { - reportFailures: false - }); - expect$6(pass).to.changeAST(grammar3, bytecodeDetails([20, 0, 2, 1, 21, 1, 3]), {}, { - reportFailures: false - }); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar1, constsDetails([], [], [], []), {}, { - reportFailures: false - }); - expect$6(pass).to.changeAST(grammar2, constsDetails(["a"], [], [], []), {}, { - reportFailures: false - }); - expect$6(pass).to.changeAST(grammar3, constsDetails([], [{ - value: ["a"], - inverted: false, - ignoreCase: false - }], [], []), {}, { - reportFailures: false - }); - }); - }); - }); - describe("for choice", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST("start = 'a' / 'b' / 'c'", bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3, 14, 23, 0, 6, 23, 1, 18, 1, 2, 1, 22, 1, 3, 14, 10, 0, 6, 23, 2, 18, 2, 2, 1, 22, 2, 3])); - }); - }); - describe("for action", function () { - describe("without labels", function () { - var grammar = "start = 'a' { code }"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 6, 0, 24, 1, 26, 0, 1, 0, 9])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }], [{ - predicate: false, - params: [], - body: " code " - }])); - }); - }); - describe("with one label", function () { - var grammar = "start = a:'a' { code }"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 7, 0, 24, 1, 26, 0, 1, 1, 0, 9])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }], [{ - predicate: false, - params: ["a"], - body: " code " - }])); - }); - }); - describe("with multiple labels", function () { - var grammar = "start = a:'a' b:'b' c:'c' { code }"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 41, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 25, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 9, 4, 24, 3, 26, 0, 4, 3, 2, 1, 0, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a", "b", "c"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }, { - type: "literal", - value: "b", - ignoreCase: false - }, { - type: "literal", - value: "c", - ignoreCase: false - }], [{ - predicate: false, - params: ["a", "b", "c"], - body: " code " - }])); - }); - }); - }); - describe("for sequence", function () { - var grammar = "start = 'a' 'b' 'c'"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 35, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 19, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 3, 4, 11, 3, 9, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a", "b", "c"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }, { - type: "literal", - value: "b", - ignoreCase: false - }, { - type: "literal", - value: "c", - ignoreCase: false - }], [])); - }); - it("generates correct plucking bytecode", function () { - expect$6(pass).to.changeAST("start = 'a' @'b' 'c'", bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 36, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 20, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 4, 4, 41, 4, 1, 1, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); - expect$6(pass).to.changeAST("start = 'a' @'b' @'c'", bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 37, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 21, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 5, 4, 41, 4, 2, 1, 0, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); - }); - }); - describe("for labeled", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST("start = a:'a'", bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3])); - }); - }); - describe("for text", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST("start = $'a'", bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 2, 1, 6, 12, 9])); - }); - }); - describe("for simple_and", function () { - var grammar = "start = &'a'"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 38, 23, 0, 18, 0, 2, 1, 22, 0, 3, 39, 0, 15, 3, 3, 6, 7, 1, 6, 6, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }], [])); - }); - }); - describe("for simple_not", function () { - var grammar = "start = !'a'"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 38, 23, 0, 18, 0, 2, 1, 22, 0, 3, 39, 1, 14, 3, 3, 6, 6, 1, 6, 7, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }], [])); - }); - }); - describe("for optional", function () { - var grammar = "start = 'a'?"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3, 14, 2, 0, 6, 2])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }], [])); - }); - }); - describe("for zero_or_more", function () { - var grammar = "start = 'a'*"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([4, 23, 0, 18, 0, 2, 1, 22, 0, 3, 16, 10, 10, 23, 0, 18, 0, 2, 1, 22, 0, 3, 6])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }], [])); - }); - }); - describe("for one_or_more", function () { - var grammar = "start = 'a'+"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([4, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 13, 3, 16, 10, 10, 23, 0, 18, 0, 2, 1, 22, 0, 3, 6, 6, 6, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }], [])); - }); - }); - describe("for group", function () { - var grammar = "start = ('a')"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }], [])); - }); - }); - describe("for semantic_and", function () { - describe("without labels", function () { - var grammar = "start = &{ code }"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([25, 26, 0, 0, 0, 13, 2, 2, 6, 1, 6, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], [{ - predicate: true, - params: [], - body: " code " - }])); - }); - }); - describe("with labels", function () { - var grammar = "start = a:'a' b:'b' c:'c' &{ code }"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 57, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 41, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 25, 4, 25, 26, 0, 0, 3, 2, 1, 0, 13, 2, 2, 6, 1, 6, 3, 15, 3, 4, 11, 4, 9, 8, 4, 7, 3, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a", "b", "c"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }, { - type: "literal", - value: "b", - ignoreCase: false - }, { - type: "literal", - value: "c", - ignoreCase: false - }], [{ - predicate: true, - params: ["a", "b", "c"], - body: " code " - }])); - }); - }); - }); - describe("for semantic_not", function () { - describe("without labels", function () { - var grammar = "start = !{ code }"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([25, 26, 0, 0, 0, 13, 2, 2, 6, 3, 6, 1])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], [{ - predicate: true, - params: [], - body: " code " - }])); - }); - }); - describe("with labels", function () { - var grammar = "start = a:'a' b:'b' c:'c' !{ code }"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([5, 23, 0, 18, 0, 2, 1, 22, 0, 3, 15, 57, 3, 23, 1, 18, 1, 2, 1, 22, 1, 3, 15, 41, 4, 23, 2, 18, 2, 2, 1, 22, 2, 3, 15, 25, 4, 25, 26, 0, 0, 3, 2, 1, 0, 13, 2, 2, 6, 3, 6, 1, 15, 3, 4, 11, 4, 9, 8, 4, 7, 3, 8, 3, 7, 3, 8, 2, 7, 3, 6, 7, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a", "b", "c"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }, { - type: "literal", - value: "b", - ignoreCase: false - }, { - type: "literal", - value: "c", - ignoreCase: false - }], [{ - predicate: true, - params: ["a", "b", "c"], - body: " code " - }])); - }); - }); - }); - describe("for rule_ref", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(["start = other", "other = 'other'"].join("\n"), { - rules: [{ - bytecode: [27, 1] - }, {}] - }); - }); - }); - describe("for literal", function () { - describe("when |reportFailures=true|", function () { - describe("empty", function () { - var grammar = "start = ''"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([0])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], [])); - }); - }); - describe("non-empty case-sensitive", function () { - var grammar = "start = 'a'"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 18, 0, 2, 1, 22, 0, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "a", - ignoreCase: false - }], [])); - }); - }); - describe("non-empty case-insensitive", function () { - var grammar = "start = 'A'i"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 19, 0, 2, 1, 21, 1, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [{ - type: "literal", - value: "A", - ignoreCase: true - }], [])); - }); - }); - }); - describe("when |reportFailures=false|", function () { - describe("empty", function () { - var grammar = "start = ''"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([0]), {}, { - reportFailures: false - }); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], []), {}, { - reportFailures: false - }); - }); - }); - describe("non-empty case-sensitive", function () { - var grammar = "start = 'a'"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([18, 0, 2, 1, 22, 0, 3]), {}, { - reportFailures: false - }); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [], []), {}, { - reportFailures: false - }); - }); - }); - describe("non-empty case-insensitive", function () { - var grammar = "start = 'A'i"; - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([19, 0, 2, 1, 21, 1, 3]), {}, { - reportFailures: false - }); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails(["a"], [], [], []), {}, { - reportFailures: false - }); - }); - }); - }); - }); - describe("for class", function () { - describe("when |reportFailures=true|", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST("start = [a]", bytecodeDetails([23, 0, 20, 0, 2, 1, 21, 1, 3])); - }); - describe("non-inverted case-sensitive", function () { - it("defines correct constants", function () { - expect$6(pass).to.changeAST("start = [a]", constsDetails([], [{ - value: ["a"], - inverted: false, - ignoreCase: false - }], [{ - type: "class", - value: ["a"], - inverted: false, - ignoreCase: false - }], [])); - }); - }); - describe("inverted case-sensitive", function () { - it("defines correct constants", function () { - expect$6(pass).to.changeAST("start = [^a]", constsDetails([], [{ - value: ["a"], - inverted: true, - ignoreCase: false - }], [{ - type: "class", - value: ["a"], - inverted: true, - ignoreCase: false - }], [])); - }); - }); - describe("non-inverted case-insensitive", function () { - it("defines correct constants", function () { - expect$6(pass).to.changeAST("start = [a]i", constsDetails([], [{ - value: ["a"], - inverted: false, - ignoreCase: true - }], [{ - type: "class", - value: ["a"], - inverted: false, - ignoreCase: true - }], [])); - }); - }); - describe("complex", function () { - it("defines correct constants", function () { - expect$6(pass).to.changeAST("start = [ab-def-hij-l]", constsDetails([], [{ - value: ["a", ["b", "d"], "e", ["f", "h"], "i", ["j", "l"]], - inverted: false, - ignoreCase: false - }], [{ - type: "class", - value: ["a", ["b", "d"], "e", ["f", "h"], "i", ["j", "l"]], - inverted: false, - ignoreCase: false - }], [])); - }); - }); - }); - describe("when |reportFailures=false|", function () { - it("generates correct bytecode", function () { - expect$6(pass).to.changeAST("start = [a]", bytecodeDetails([20, 0, 2, 1, 21, 1, 3]), {}, { - reportFailures: false - }); - }); - describe("non-inverted case-sensitive", function () { - it("defines correct constants", function () { - expect$6(pass).to.changeAST("start = [a]", constsDetails([], [{ - value: ["a"], - inverted: false, - ignoreCase: false - }], [], []), {}, { - reportFailures: false - }); - }); - }); - describe("inverted case-sensitive", function () { - it("defines correct constants", function () { - expect$6(pass).to.changeAST("start = [^a]", constsDetails([], [{ - value: ["a"], - inverted: true, - ignoreCase: false - }], [], []), {}, { - reportFailures: false - }); - }); - }); - describe("non-inverted case-insensitive", function () { - it("defines correct constants", function () { - expect$6(pass).to.changeAST("start = [a]i", constsDetails([], [{ - value: ["a"], - inverted: false, - ignoreCase: true - }], [], []), {}, { - reportFailures: false - }); - }); - }); - describe("complex", function () { - it("defines correct constants", function () { - expect$6(pass).to.changeAST("start = [ab-def-hij-l]", constsDetails([], [{ - value: ["a", ["b", "d"], "e", ["f", "h"], "i", ["j", "l"]], - inverted: false, - ignoreCase: false - }], [], []), {}, { - reportFailures: false - }); - }); - }); - }); - }); - describe("for any", function () { - describe("when |reportFailures=true|", function () { - var grammar = "start = ."; - it("generates bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([23, 0, 17, 2, 1, 21, 1, 3])); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails([], [], [{ - type: "any" - }], [])); - }); - }); - describe("when |reportFailures=false|", function () { - var grammar = "start = ."; - it("generates bytecode", function () { - expect$6(pass).to.changeAST(grammar, bytecodeDetails([17, 2, 1, 21, 1, 3]), {}, { - reportFailures: false - }); - }); - it("defines correct constants", function () { - expect$6(pass).to.changeAST(grammar, constsDetails([], [], [], []), {}, { - reportFailures: false - }); - }); - }); - }); - }); - - var pass$1 = peg_1.compiler.passes.generate.inferenceMatchResult; - chai$1.use(helpers); - var expect$7 = chai$1.expect; - describe("compiler pass |inferenceMatchResult|", function () { - it("calculate |match| property for |any| correctly", function () { - expect$7(pass$1).to.changeAST("start = . ", { - rules: [{ - match: 0 - }] - }, {}, {}); - }); - it("calculate |match| property for |literal| correctly", function () { - expect$7(pass$1).to.changeAST("start = '' ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = ''i ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = 'a' ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = 'a'i ", { - rules: [{ - match: 0 - }] - }, {}, {}); - }); - it("calculate |match| property for |class| correctly", function () { - expect$7(pass$1).to.changeAST("start = [] ", { - rules: [{ - match: -1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = []i ", { - rules: [{ - match: -1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [a] ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [a]i ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [a-b] ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [a-b]i ", { - rules: [{ - match: 0 - }] - }, {}, {}); - }); - it("calculate |match| property for |sequence| correctly", function () { - expect$7(pass$1).to.changeAST("start = 'a' 'b' ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = 'a' '' ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = '' 'b' ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = '' '' ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = 'a' [] ", { - rules: [{ - match: -1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [] 'b' ", { - rules: [{ - match: -1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [] [] ", { - rules: [{ - match: -1 - }] - }, {}, {}); - }); - it("calculate |match| property for |choice| correctly", function () { - expect$7(pass$1).to.changeAST("start = 'a' / 'b' ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = 'a' / '' ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = '' / 'b' ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = '' / '' ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = 'a' / [] ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [] / 'b' ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [] / [] ", { - rules: [{ - match: -1 - }] - }, {}, {}); - }); - it("calculate |match| property for predicates correctly", function () { - expect$7(pass$1).to.changeAST("start = &. ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = &'' ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = &[] ", { - rules: [{ - match: -1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = !. ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = !'' ", { - rules: [{ - match: -1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = ![] ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = &{ code } ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = !{ code } ", { - rules: [{ - match: 0 - }] - }, {}, {}); - }); - it("calculate |match| property for |text| correctly", function () { - expect$7(pass$1).to.changeAST("start = $. ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = $'' ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = $[] ", { - rules: [{ - match: -1 - }] - }, {}, {}); - }); - it("calculate |match| property for |action| correctly", function () { - expect$7(pass$1).to.changeAST("start = . { code }", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = '' { code }", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [] { code }", { - rules: [{ - match: -1 - }] - }, {}, {}); - }); - it("calculate |match| property for |labeled| correctly", function () { - expect$7(pass$1).to.changeAST("start = a:. ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = a:'' ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = a:[] ", { - rules: [{ - match: -1 - }] - }, {}, {}); - }); - it("calculate |match| property for |named| correctly", function () { - expect$7(pass$1).to.changeAST("start 'start' = . ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start 'start' = '' ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start 'start' = [] ", { - rules: [{ - match: -1 - }] - }, {}, {}); - }); - it("calculate |match| property for |optional| correctly", function () { - expect$7(pass$1).to.changeAST("start = .? ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = ''? ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = []? ", { - rules: [{ - match: 1 - }] - }, {}, {}); - }); - it("calculate |match| property for |zero_or_more| correctly", function () { - expect$7(pass$1).to.changeAST("start = .* ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = ''* ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = []* ", { - rules: [{ - match: 1 - }] - }, {}, {}); - }); - it("calculate |match| property for |one_or_more| correctly", function () { - expect$7(pass$1).to.changeAST("start = .+ ", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = ''+ ", { - rules: [{ - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = []+ ", { - rules: [{ - match: -1 - }] - }, {}, {}); - }); - it("calculate |match| property for |rule_ref| correctly", function () { - expect$7(pass$1).to.changeAST(["start = end", "end = . "].join("\n"), { - rules: [{ - match: 0 - }, { - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST(["start = end", "end = ''"].join("\n"), { - rules: [{ - match: 1 - }, { - match: 1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST(["start = end", "end = []"].join("\n"), { - rules: [{ - match: -1 - }, { - match: -1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = . start", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = '' start", { - rules: [{ - match: 0 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = [] start", { - rules: [{ - match: -1 - }] - }, {}, {}); - expect$7(pass$1).to.changeAST("start = . start []", { - rules: [{ - match: -1 - }] - }, {}, {}); - }); - }); - - var pass$2 = peg_1.compiler.passes.transform.removeProxyRules; - chai$1.use(helpers); - var expect$8 = chai$1.expect; - describe("compiler pass |removeProxyRules|", function () { - describe("when a proxy rule isn't listed in |allowedStartRules|", function () { - it("updates references and removes it", function () { - expect$8(pass$2).to.changeAST(["start = proxy", "proxy = proxied", "proxied = 'a'"].join("\n"), { - rules: [{ - name: "start", - expression: { - type: "rule_ref", - name: "proxied" - } - }, { - name: "proxied" - }] - }, { - allowedStartRules: ["start"] - }); - }); - }); - describe("when a proxy rule is listed in |allowedStartRules|", function () { - it("updates references but doesn't remove it", function () { - expect$8(pass$2).to.changeAST(["start = proxy", "proxy = proxied", "proxied = 'a'"].join("\n"), { - rules: [{ - name: "start", - expression: { - type: "rule_ref", - name: "proxied" - } - }, { - name: "proxy", - expression: { - type: "rule_ref", - name: "proxied" - } - }, { - name: "proxied" - }] - }, { - allowedStartRules: ["start", "proxy"] - }); - }); - }); - }); - - var pass$3 = peg_1.compiler.passes.check.reportDuplicateLabels; - chai$1.use(helpers); - var expect$9 = chai$1.expect; - describe("compiler pass |reportDuplicateLabels|", function () { - describe("in a sequence", function () { - it("reports labels duplicate with labels of preceding elements", function () { - expect$9(pass$3).to.reportError("start = a:'a' a:'a'", { - message: "Label \"a\" is already defined at line 1, column 9.", - location: { - start: { - offset: 14, - line: 1, - column: 15 - }, - end: { - offset: 19, - line: 1, - column: 20 - } - } - }); - }); - it("doesn't report labels duplicate with labels in subexpressions", function () { - expect$9(pass$3).to.not.reportError("start = ('a' / a:'a' / 'a') a:'a'"); - expect$9(pass$3).to.not.reportError("start = (a:'a' { }) a:'a'"); - expect$9(pass$3).to.not.reportError("start = ('a' a:'a' 'a') a:'a'"); - expect$9(pass$3).to.not.reportError("start = b:(a:'a') a:'a'"); - expect$9(pass$3).to.not.reportError("start = $(a:'a') a:'a'"); - expect$9(pass$3).to.not.reportError("start = &(a:'a') a:'a'"); - expect$9(pass$3).to.not.reportError("start = !(a:'a') a:'a'"); - expect$9(pass$3).to.not.reportError("start = (a:'a')? a:'a'"); - expect$9(pass$3).to.not.reportError("start = (a:'a')* a:'a'"); - expect$9(pass$3).to.not.reportError("start = (a:'a')+ a:'a'"); - expect$9(pass$3).to.not.reportError("start = (a:'a') a:'a'"); - }); - }); - describe("in a choice", function () { - it("doesn't report labels duplicate with labels of preceding alternatives", function () { - expect$9(pass$3).to.not.reportError("start = a:'a' / a:'a'"); - }); - }); - describe("in outer sequence", function () { - it("reports labels duplicate with labels of preceding elements", function () { - expect$9(pass$3).to.reportError("start = a:'a' (a:'a')", { - message: "Label \"a\" is already defined at line 1, column 9.", - location: { - start: { - offset: 15, - line: 1, - column: 16 - }, - end: { - offset: 20, - line: 1, - column: 21 - } - } - }); - }); - it("doesn't report labels duplicate with the label of the current element", function () { - expect$9(pass$3).to.not.reportError("start = a:(a:'a')"); - }); - it("doesn't report labels duplicate with labels of following elements", function () { - expect$9(pass$3).to.not.reportError("start = (a:'a') a:'a'"); - }); - }); - }); - - var pass$4 = peg_1.compiler.passes.check.reportDuplicateRules; - chai$1.use(helpers); - var expect$a = chai$1.expect; - describe("compiler pass |reportDuplicateRules|", function () { - it("reports duplicate rules", function () { - expect$a(pass$4).to.reportError(["start = 'a'", "start = 'b'"].join("\n"), { - message: "Rule \"start\" is already defined at line 1, column 1.", - location: { - start: { - offset: 12, - line: 2, - column: 1 - }, - end: { - offset: 23, - line: 2, - column: 12 - } - } - }); - }); - }); - - var expect$b = chai$1.expect, - use = chai$1.use; - var pass$5 = peg_1.compiler.passes.check.reportIncorrectPlucking; - use(helpers); - describe("compiler pass |reportIncorrectPlucking|", function () { - function reports(error, edgecases) { - it(error.slice(0, -1), function () { - edgecases.forEach(function (grammar) { - return expect$b(pass$5).to.reportError(grammar, error); - }); - }); - } - - reports("\"@\" cannot be used with an action block.", ["start1 = 'a' @'b' 'c' { /* empty action block */ }", "start2 = 'a' @('b' @'c' { /* empty action block */ })"]); - reports("\"@\" cannot be used on a semantic predicate.", ["start1 = 'a' @&{ /* semantic_and */ } 'c'", "start2 = 'a' @!{ /* semantic_not */ } 'c'"]); - it("allows valid plucking", function () { - expect$b(pass$5).not.to.reportError("\n\n start1 = @'1' // return '1'\n start2 = @'1' / @'2' // return '1' or '2'\n start2 = '1' @'2' '3' // return '2'\n start3 = '1' @b:'2' '3' // return '2', label \"b\" can be used in semantic predicates\n start4 = a:'1' @b:'2' '3' // return '2', labels \"a\" and \"b\" can be used in semantic predicates\n start5 = @'1' @'2' '3' // return ['1', '2']\n start6 = @'1' @b:'2' '3' // return ['1', '2'], label \"b\" can be used in semantic predicates\n start7 = a:'1' @'2' &{} // return '2' if the semantic predicate doesnt fail\n\n "); - }); - }); - - var pass$6 = peg_1.compiler.passes.check.reportInfiniteRecursion; - chai$1.use(helpers); - var expect$c = chai$1.expect; - describe("compiler pass |reportInfiniteRecursion|", function () { - it("reports direct left recursion", function () { - expect$c(pass$6).to.reportError("start = start", { - message: "Possible infinite loop when parsing (left recursion: start -> start).", - location: { - start: { - offset: 8, - line: 1, - column: 9 - }, - end: { - offset: 13, - line: 1, - column: 14 - } - } - }); - }); - it("reports indirect left recursion", function () { - expect$c(pass$6).to.reportError(["start = stop", "stop = start"].join("\n"), { - message: "Possible infinite loop when parsing (left recursion: start -> stop -> start).", - location: { - start: { - offset: 20, - line: 2, - column: 8 - }, - end: { - offset: 25, - line: 2, - column: 13 - } - } - }); - }); - describe("in sequences", function () { - it("reports left recursion if all preceding elements match empty string", function () { - expect$c(pass$6).to.reportError("start = '' '' '' start"); - }); - it("doesn't report left recursion if some preceding element doesn't match empty string", function () { - expect$c(pass$6).to.not.reportError("start = 'a' '' '' start"); - expect$c(pass$6).to.not.reportError("start = '' 'a' '' start"); - expect$c(pass$6).to.not.reportError("start = '' '' 'a' start"); - }); - it("reports left recursion when rule reference is wrapped in an expression", function () { - expect$c(pass$6).to.reportError("start = '' start?"); - }); - it("computes expressions that always consume input on success correctly", function () { - expect$c(pass$6).to.reportError(["start = a start", "a 'a' = ''"].join("\n")); - expect$c(pass$6).to.not.reportError(["start = a start", "a 'a' = 'a'"].join("\n")); - expect$c(pass$6).to.reportError("start = ('' / 'a' / 'b') start"); - expect$c(pass$6).to.reportError("start = ('a' / '' / 'b') start"); - expect$c(pass$6).to.reportError("start = ('a' / 'b' / '') start"); - expect$c(pass$6).to.not.reportError("start = ('a' / 'b' / 'c') start"); - expect$c(pass$6).to.reportError("start = ('' { }) start"); - expect$c(pass$6).to.not.reportError("start = ('a' { }) start"); - expect$c(pass$6).to.reportError("start = ('' '' '') start"); - expect$c(pass$6).to.not.reportError("start = ('a' '' '') start"); - expect$c(pass$6).to.not.reportError("start = ('' 'a' '') start"); - expect$c(pass$6).to.not.reportError("start = ('' '' 'a') start"); - expect$c(pass$6).to.reportError("start = a:'' start"); - expect$c(pass$6).to.not.reportError("start = a:'a' start"); - expect$c(pass$6).to.reportError("start = $'' start"); - expect$c(pass$6).to.not.reportError("start = $'a' start"); - expect$c(pass$6).to.reportError("start = &'' start"); - expect$c(pass$6).to.reportError("start = &'a' start"); - expect$c(pass$6).to.reportError("start = !'' start"); - expect$c(pass$6).to.reportError("start = !'a' start"); - expect$c(pass$6).to.reportError("start = ''? start"); - expect$c(pass$6).to.reportError("start = 'a'? start"); - expect$c(pass$6).to.reportError("start = ''* start"); - expect$c(pass$6).to.reportError("start = 'a'* start"); - expect$c(pass$6).to.reportError("start = ''+ start"); - expect$c(pass$6).to.not.reportError("start = 'a'+ start"); - expect$c(pass$6).to.reportError("start = ('') start"); - expect$c(pass$6).to.not.reportError("start = ('a') start"); - expect$c(pass$6).to.reportError("start = &{ } start"); - expect$c(pass$6).to.reportError("start = !{ } start"); - expect$c(pass$6).to.reportError(["start = a start", "a = ''"].join("\n")); - expect$c(pass$6).to.not.reportError(["start = a start", "a = 'a'"].join("\n")); - expect$c(pass$6).to.reportError("start = '' start"); - expect$c(pass$6).to.not.reportError("start = 'a' start"); - expect$c(pass$6).to.not.reportError("start = [a-d] start"); - expect$c(pass$6).to.not.reportError("start = . start"); - }); - }); - }); - - var pass$7 = peg_1.compiler.passes.check.reportInfiniteRepetition; - chai$1.use(helpers); - var expect$d = chai$1.expect; - describe("compiler pass |reportInfiniteRepetition|", function () { - it("reports infinite loops for zero_or_more", function () { - expect$d(pass$7).to.reportError("start = ('')*", { - message: "Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", - location: { - start: { - offset: 8, - line: 1, - column: 9 - }, - end: { - offset: 13, - line: 1, - column: 14 - } - } - }); - }); - it("reports infinite loops for one_or_more", function () { - expect$d(pass$7).to.reportError("start = ('')+", { - message: "Possible infinite loop when parsing (repetition used with an expression that may not consume any input).", - location: { - start: { - offset: 8, - line: 1, - column: 9 - }, - end: { - offset: 13, - line: 1, - column: 14 - } - } - }); - }); - it("computes expressions that always consume input on success correctly", function () { - expect$d(pass$7).to.reportError(["start = a*", "a 'a' = ''"].join("\n")); - expect$d(pass$7).to.not.reportError(["start = a*", "a 'a' = 'a'"].join("\n")); - expect$d(pass$7).to.reportError("start = ('' / 'a' / 'b')*"); - expect$d(pass$7).to.reportError("start = ('a' / '' / 'b')*"); - expect$d(pass$7).to.reportError("start = ('a' / 'b' / '')*"); - expect$d(pass$7).to.not.reportError("start = ('a' / 'b' / 'c')*"); - expect$d(pass$7).to.reportError("start = ('' { })*"); - expect$d(pass$7).to.not.reportError("start = ('a' { })*"); - expect$d(pass$7).to.reportError("start = ('' '' '')*"); - expect$d(pass$7).to.not.reportError("start = ('a' '' '')*"); - expect$d(pass$7).to.not.reportError("start = ('' 'a' '')*"); - expect$d(pass$7).to.not.reportError("start = ('' '' 'a')*"); - expect$d(pass$7).to.reportError("start = (a:'')*"); - expect$d(pass$7).to.not.reportError("start = (a:'a')*"); - expect$d(pass$7).to.reportError("start = ($'')*"); - expect$d(pass$7).to.not.reportError("start = ($'a')*"); - expect$d(pass$7).to.reportError("start = (&'')*"); - expect$d(pass$7).to.reportError("start = (&'a')*"); - expect$d(pass$7).to.reportError("start = (!'')*"); - expect$d(pass$7).to.reportError("start = (!'a')*"); - expect$d(pass$7).to.reportError("start = (''?)*"); - expect$d(pass$7).to.reportError("start = ('a'?)*"); - expect$d(pass$7).to.reportError("start = (''*)*"); - expect$d(pass$7).to.reportError("start = ('a'*)*"); - expect$d(pass$7).to.reportError("start = (''+)*"); - expect$d(pass$7).to.not.reportError("start = ('a'+)*"); - expect$d(pass$7).to.reportError("start = ('')*"); - expect$d(pass$7).to.not.reportError("start = ('a')*"); - expect$d(pass$7).to.reportError("start = (&{ })*"); - expect$d(pass$7).to.reportError("start = (!{ })*"); - expect$d(pass$7).to.reportError(["start = a*", "a = ''"].join("\n")); - expect$d(pass$7).to.not.reportError(["start = a*", "a = 'a'"].join("\n")); - expect$d(pass$7).to.reportError("start = ''*"); - expect$d(pass$7).to.not.reportError("start = 'a'*"); - expect$d(pass$7).to.not.reportError("start = [a-d]*"); - expect$d(pass$7).to.not.reportError("start = .*"); - }); - }); - - var pass$8 = peg_1.compiler.passes.check.reportUndefinedRules; - chai$1.use(helpers); - var expect$e = chai$1.expect; - describe("compiler pass |reportUndefinedRules|", function () { - it("reports undefined rules", function () { - expect$e(pass$8).to.reportError("start = undefined", { - message: "Rule \"undefined\" is not defined.", - location: { - start: { - offset: 8, - line: 1, - column: 9 - }, - end: { - offset: 17, - line: 1, - column: 18 - } - } - }); - }); - it("checks allowedStartRules", function () { - expect$e(pass$8).to.reportError("start = 'a'", { - message: "Start rule \"missing\" is not defined." - }, { - allowedStartRules: ["missing"] - }); - }); - }); - - var pass$9 = peg_1.compiler.passes.check.reportUnusedRules; - chai$1.use(helpers); - var expect$f = chai$1.expect; - describe("compiler pass |reportUnusedRules|", function () { - it("should report rules that are not referenced", function () { - expect$f(pass$9).to.reportWarning("\n start = .\n unused = .\n ", "Rule \"unused\" is not referenced."); - expect$f(pass$9).to.reportWarning("\n start = .\n unused = .\n used = .\n ", ["Rule \"used\" is not referenced.", "Rule \"unused\" is not referenced."]); - }); - it("does not report rules that are referenced", function () { - expect$f(pass$9).not.to.reportWarning("start = ."); - expect$f(pass$9).not.to.reportWarning("\n start = used\n used = .\n "); - }); - it("does not report any rules that the generated parser starts parsing from", function () { - expect$f(pass$9).not.to.reportWarning("\n a = \"x\"\n b = a\n c = .+\n ", null, { - allowedStartRules: ["b", "c"] - }); - }); - }); - - var parser$1 = peg_1.parser, - util$2 = peg_1.util, - ast$1 = peg_1.ast; - var expect$g = chai$1.expect; - chai$1.config.truncateThreshold = 0; - - function varyParserOptions(block) { - var optionsVariants = [{}, { - extractComments: false - }, { - extractComments: true - }]; - optionsVariants.forEach(function (variant) { - describe("with options " + chai$1.util.inspect(variant), function () { - return block(variant); - }); - }); - } - - describe("PEG.js grammar parser", function () { - var literalAbcd = { - type: "literal", - value: "abcd", - ignoreCase: false - }; - var literalEfgh = { - type: "literal", - value: "efgh", - ignoreCase: false - }; - var literalIjkl = { - type: "literal", - value: "ijkl", - ignoreCase: false - }; - var literalMnop = { - type: "literal", - value: "mnop", - ignoreCase: false - }; - var semanticAnd = { - type: "semantic_and", - code: " code " - }; - var semanticNot = { - type: "semantic_not", - code: " code " - }; - var optional = { - type: "optional", - expression: literalAbcd - }; - var zeroOrMore = { - type: "zero_or_more", - expression: literalAbcd - }; - var oneOrMore = { - type: "one_or_more", - expression: literalAbcd - }; - var textOptional = { - type: "text", - expression: optional - }; - var simpleNotAbcd = { - type: "simple_not", - expression: literalAbcd - }; - var simpleAndOptional = { - type: "simple_and", - expression: optional - }; - var simpleNotOptional = { - type: "simple_not", - expression: optional - }; - var labeledAbcd = { - type: "labeled", - label: "a", - expression: literalAbcd - }; - var labeledEfgh = { - type: "labeled", - label: "b", - expression: literalEfgh - }; - var labeledIjkl = { - type: "labeled", - label: "c", - expression: literalIjkl - }; - var labeledMnop = { - type: "labeled", - label: "d", - expression: literalMnop - }; - var labeledSimpleNot = { - type: "labeled", - label: "a", - expression: simpleNotAbcd - }; - var sequence = { - type: "sequence", - elements: [literalAbcd, literalEfgh, literalIjkl] - }; - var sequence2 = { - type: "sequence", - elements: [labeledAbcd, labeledEfgh] - }; - var sequence4 = { - type: "sequence", - elements: [labeledAbcd, labeledEfgh, labeledIjkl, labeledMnop] - }; - var groupLabeled = { - type: "group", - expression: labeledAbcd - }; - var groupSequence = { - type: "group", - expression: sequence - }; - var actionAbcd = { - type: "action", - expression: literalAbcd, - code: " code " - }; - var actionEfgh = { - type: "action", - expression: literalEfgh, - code: " code " - }; - var actionIjkl = { - type: "action", - expression: literalIjkl, - code: " code " - }; - var actionMnop = { - type: "action", - expression: literalMnop, - code: " code " - }; - var actionSequence = { - type: "action", - expression: sequence, - code: " code " - }; - var choice = { - type: "choice", - alternatives: [literalAbcd, literalEfgh, literalIjkl] - }; - var choice2 = { - type: "choice", - alternatives: [actionAbcd, actionEfgh] - }; - var choice4 = { - type: "choice", - alternatives: [actionAbcd, actionEfgh, actionIjkl, actionMnop] - }; - var named = { - type: "named", - name: "start rule", - expression: literalAbcd - }; - var ruleA = { - type: "rule", - name: "a", - expression: literalAbcd - }; - var ruleB = { - type: "rule", - name: "b", - expression: literalEfgh - }; - var ruleC = { - type: "rule", - name: "c", - expression: literalIjkl - }; - var ruleStart = { - type: "rule", - name: "start", - expression: literalAbcd - }; - var initializer = { - type: "initializer", - code: " code " - }; - - function oneRuleGrammar(expression) { - return { - type: "grammar", - initializer: null, - comments: null, - rules: [{ - type: "rule", - name: "start", - expression: expression - }] - }; - } - - function actionGrammar(code) { - return oneRuleGrammar({ - type: "action", - expression: literalAbcd, - code: code - }); - } - - function literalGrammar(value, ignoreCase) { - return oneRuleGrammar({ - type: "literal", - value: value, - ignoreCase: ignoreCase - }); - } - - function classGrammar(parts, inverted, ignoreCase) { - return oneRuleGrammar({ - type: "class", - parts: parts, - inverted: inverted, - ignoreCase: ignoreCase - }); - } - - function anyGrammar() { - return oneRuleGrammar({ - type: "any" - }); - } - - function ruleRefGrammar(name) { - return oneRuleGrammar({ - type: "rule_ref", - name: name - }); - } - - function commented(grammar, comments, options) { - function toObject(result, comment) { - result[comment.offset] = { - text: comment.text, - multiline: comment.multiline - }; - return result; - } - - grammar = util$2.clone(grammar); - grammar.comments = options.extractComments ? comments.reduce(toObject, {}) : null; - return grammar; - } - - var trivialGrammar = literalGrammar("abcd", false); - var twoRuleGrammar = { - type: "grammar", - initializer: null, - comments: null, - rules: [ruleA, ruleB] - }; - - var stripProperties = function () { - var strip; - - function stripLeaf(node) { - delete node.location; - } - - function stripExpression(node) { - delete node.location; - strip(node.expression); - } - - function stripChildren(property) { - return function (node) { - delete node.location; - node[property].forEach(strip); - }; - } - - strip = ast$1.visitor.build({ - grammar: function grammar(node) { - delete node.location; - delete node._alwaysConsumesOnSuccess; - - if (node.initializer) { - strip(node.initializer); - } - - if (node.comments) { - util$2.each(node.comments, stripLeaf); - } - - node.rules.forEach(strip); - }, - initializer: stripLeaf, - rule: stripExpression, - named: stripExpression, - choice: stripChildren("alternatives"), - action: stripExpression, - sequence: stripChildren("elements"), - labeled: stripExpression, - text: stripExpression, - simple_and: stripExpression, - simple_not: stripExpression, - optional: stripExpression, - zero_or_more: stripExpression, - one_or_more: stripExpression, - group: stripExpression, - semantic_and: stripLeaf, - semantic_not: stripLeaf, - rule_ref: stripLeaf, - literal: stripLeaf, - class: stripLeaf, - any: stripLeaf - }); - return strip; - }(); - - function helpers(chai, utils) { - var Assertion = chai.Assertion; - Assertion.addMethod("parseAs", function (expected, options) { - options = typeof options === "undefined" ? {} : options; - var result = parser$1.parse(utils.flag(this, "object"), options); - stripProperties(result); - this.assert(utils.eql(result, expected), "expected #{this} to parse as #{exp} but got #{act}", "expected #{this} to not parse as #{exp}", expected, result, !utils.flag(this, "negate")); - }); - Assertion.addMethod("failToParse", function (props) { - var passed, result; - - try { - result = parser$1.parse(utils.flag(this, "object")); - passed = true; - } catch (e) { - result = e; - passed = false; - } - - if (passed) { - stripProperties(result); - } - - this.assert(!passed, "expected #{this} to fail to parse but got #{act}", "expected #{this} to not fail to parse but it failed with #{act}", null, result); - - if (!passed && typeof props !== "undefined") { - Object.keys(props).forEach(function (key) { - new Assertion(result).to.have.property(key).that.is.deep.equal(props[key]); - }); - } - }); - } - - beforeEach(function () { - chai$1.use(helpers); - }); - it("parses Rule+", function () { - expect$g("start = a").to.parseAs(ruleRefGrammar("a")); - var grammar = ruleRefGrammar("a"); - grammar.initializer = { - "type": "initializer", - "code": "" - }; - expect$g("{}\nstart = a").to.parseAs(grammar); - expect$g("").to.failToParse(); - expect$g("{}").to.failToParse(); - }); - it("parses Grammar", function () { - expect$g("\na = 'abcd';\n").to.parseAs({ - type: "grammar", - comments: null, - initializer: null, - rules: [ruleA] - }); - expect$g("\na = 'abcd';\nb = 'efgh';\nc = 'ijkl';\n").to.parseAs({ - type: "grammar", - comments: null, - initializer: null, - rules: [ruleA, ruleB, ruleC] - }); - expect$g("\n{ code };\na = 'abcd';\n").to.parseAs({ - type: "grammar", - comments: null, - initializer: initializer, - rules: [ruleA] - }); - }); - it("parses Initializer", function () { - expect$g("{ code };start = 'abcd'").to.parseAs({ - type: "grammar", - comments: null, - initializer: initializer, - rules: [ruleStart] - }); - }); - it("parses Rule", function () { - expect$g("start\n=\n'abcd';").to.parseAs(oneRuleGrammar(literalAbcd)); - expect$g("start\n'start rule'\n=\n'abcd';").to.parseAs(oneRuleGrammar(named)); - }); - it("parses Expression", function () { - expect$g("start = 'abcd' / 'efgh' / 'ijkl'").to.parseAs(oneRuleGrammar(choice)); - }); - it("parses ChoiceExpression", function () { - expect$g("start = 'abcd' { code }").to.parseAs(oneRuleGrammar(actionAbcd)); - expect$g("start = 'abcd' { code }\n/\n'efgh' { code }").to.parseAs(oneRuleGrammar(choice2)); - expect$g("start = 'abcd' { code }\n/\n'efgh' { code }\n/\n'ijkl' { code }\n/\n'mnop' { code }").to.parseAs(oneRuleGrammar(choice4)); - }); - it("parses ActionExpression", function () { - expect$g("start = 'abcd' 'efgh' 'ijkl'").to.parseAs(oneRuleGrammar(sequence)); - expect$g("start = 'abcd' 'efgh' 'ijkl'\n{ code }").to.parseAs(oneRuleGrammar(actionSequence)); - }); - it("parses SequenceExpression", function () { - expect$g("start = a:'abcd'").to.parseAs(oneRuleGrammar(labeledAbcd)); - expect$g("start = a:'abcd'\nb:'efgh'").to.parseAs(oneRuleGrammar(sequence2)); - expect$g("start = a:'abcd'\nb:'efgh'\nc:'ijkl'\nd:'mnop'").to.parseAs(oneRuleGrammar(sequence4)); - }); - it("parses `@` (value plucking)", function () { - function $S() { - for (var _len = arguments.length, elements = new Array(_len), _key = 0; _key < _len; _key++) { - elements[_key] = arguments[_key]; - } - - return oneRuleGrammar({ - type: "sequence", - elements: elements - }); - } - - function $P(label, expression) { - return { - type: "labeled", - pick: true, - label: label, - expression: expression - }; - } - - expect$g("start = @'abcd'").to.parseAs($S($P(null, literalAbcd))); - expect$g("start = @a:'abcd'").to.parseAs($S($P("a", literalAbcd))); - expect$g("start = 'abcd' @'efgh'").to.parseAs($S(literalAbcd, $P(null, literalEfgh))); - expect$g("start = a:'abcd' @b:'efgh'").to.parseAs($S(labeledAbcd, $P("b", literalEfgh))); - expect$g("start = @'abcd' b:'efgh'").to.parseAs($S($P(null, literalAbcd), labeledEfgh)); - expect$g("start = a:'abcd' @'efgh' 'ijkl' @d:'mnop'").to.parseAs($S(labeledAbcd, $P(null, literalEfgh), literalIjkl, $P("d", literalMnop))); - }); - it("parses LabeledExpression", function () { - expect$g("start = a\n:\n!'abcd'").to.parseAs(oneRuleGrammar(labeledSimpleNot)); - expect$g("start = !'abcd'").to.parseAs(oneRuleGrammar(simpleNotAbcd)); - }); - it("parses PrefixedExpression", function () { - expect$g("start = !\n'abcd'?").to.parseAs(oneRuleGrammar(simpleNotOptional)); - expect$g("start = 'abcd'?").to.parseAs(oneRuleGrammar(optional)); - }); - it("parses PrefixedOperator", function () { - expect$g("start = $'abcd'?").to.parseAs(oneRuleGrammar(textOptional)); - expect$g("start = &'abcd'?").to.parseAs(oneRuleGrammar(simpleAndOptional)); - expect$g("start = !'abcd'?").to.parseAs(oneRuleGrammar(simpleNotOptional)); - }); - it("parses SuffixedExpression", function () { - expect$g("start = 'abcd'\n?").to.parseAs(oneRuleGrammar(optional)); - expect$g("start = 'abcd'").to.parseAs(oneRuleGrammar(literalAbcd)); - }); - it("parses SuffixedOperator", function () { - expect$g("start = 'abcd'?").to.parseAs(oneRuleGrammar(optional)); - expect$g("start = 'abcd'*").to.parseAs(oneRuleGrammar(zeroOrMore)); - expect$g("start = 'abcd'+").to.parseAs(oneRuleGrammar(oneOrMore)); - }); - it("parses PrimaryExpression", function () { - expect$g("start = 'abcd'").to.parseAs(trivialGrammar); - expect$g("start = [a-d]").to.parseAs(classGrammar([["a", "d"]], false, false)); - expect$g("start = .").to.parseAs(anyGrammar()); - expect$g("start = a").to.parseAs(ruleRefGrammar("a")); - expect$g("start = &{ code }").to.parseAs(oneRuleGrammar(semanticAnd)); - expect$g("start = (\na:'abcd'\n)").to.parseAs(oneRuleGrammar(groupLabeled)); - expect$g("start = (\n'abcd' 'efgh' 'ijkl'\n)").to.parseAs(oneRuleGrammar(groupSequence)); - expect$g("start = (\n'abcd'\n)").to.parseAs(trivialGrammar); - }); - it("parses RuleReferenceExpression", function () { - expect$g("start = a").to.parseAs(ruleRefGrammar("a")); - expect$g("start = a\n=").to.failToParse(); - expect$g("start = a\n'abcd'\n=").to.failToParse(); - }); - it("parses SemanticPredicateExpression", function () { - expect$g("start = !\n{ code }").to.parseAs(oneRuleGrammar(semanticNot)); - }); - it("parses SemanticPredicateOperator", function () { - expect$g("start = &{ code }").to.parseAs(oneRuleGrammar(semanticAnd)); - expect$g("start = !{ code }").to.parseAs(oneRuleGrammar(semanticNot)); - }); - it("parses WhiteSpace", function () { - expect$g("start =\t'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\v'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\f'abcd'").to.parseAs(trivialGrammar); - expect$g("start = 'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\xA0'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\uFEFF'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\u1680'abcd'").to.parseAs(trivialGrammar); - }); - it("parses LineTerminator", function () { - expect$g("start = '\n'").to.failToParse(); - expect$g("start = '\r'").to.failToParse(); - expect$g("start = '\u2028'").to.failToParse(); - expect$g("start = '\u2029'").to.failToParse(); - }); - it("parses LineTerminatorSequence", function () { - expect$g("start =\n'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\r\n'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\r'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\u2028'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\u2029'abcd'").to.parseAs(trivialGrammar); - }); - varyParserOptions(function (options) { - it("parses Comment", function () { - expect$g("start =// comment\n'abcd'").to.parseAs(commented(trivialGrammar, [{ - offset: 7, - text: " comment", - multiline: false - }], options), options); - expect$g("start =/* comment */'abcd'").to.parseAs(commented(trivialGrammar, [{ - offset: 7, - text: " comment ", - multiline: true - }], options), options); - }); - it("parses MultiLineComment", function () { - expect$g("start =/**/'abcd'").to.parseAs(commented(trivialGrammar, [{ - offset: 7, - text: "", - multiline: true - }], options), options); - expect$g("start =/*a*/'abcd'").to.parseAs(commented(trivialGrammar, [{ - offset: 7, - text: "a", - multiline: true - }], options), options); - expect$g("start =/*abc*/'abcd'").to.parseAs(commented(trivialGrammar, [{ - offset: 7, - text: "abc", - multiline: true - }], options), options); - expect$g("start =/**/*/'abcd'").to.failToParse(); - }); - it("parses MultiLineCommentNoLineTerminator", function () { - expect$g("a = 'abcd'/**/\r\nb = 'efgh'").to.parseAs(commented(twoRuleGrammar, [{ - offset: 10, - text: "", - multiline: true - }], options), options); - expect$g("a = 'abcd'/*a*/\r\nb = 'efgh'").to.parseAs(commented(twoRuleGrammar, [{ - offset: 10, - text: "a", - multiline: true - }], options), options); - expect$g("a = 'abcd'/*abc*/\r\nb = 'efgh'").to.parseAs(commented(twoRuleGrammar, [{ - offset: 10, - text: "abc", - multiline: true - }], options), options); - expect$g("a = 'abcd'/**/*/\r\nb = 'efgh'").to.failToParse(); - expect$g("a = 'abcd'/*\n*/\r\nb = 'efgh'").to.failToParse(); - }); - it("parses SingleLineComment", function () { - expect$g("start =//\n'abcd'").to.parseAs(commented(trivialGrammar, [{ - offset: 7, - text: "", - multiline: false - }], options), options); - expect$g("start =//a\n'abcd'").to.parseAs(commented(trivialGrammar, [{ - offset: 7, - text: "a", - multiline: false - }], options), options); - expect$g("start =//abc\n'abcd'").to.parseAs(commented(trivialGrammar, [{ - offset: 7, - text: "abc", - multiline: false - }], options), options); - expect$g("start =//\n>\n'abcd'").to.failToParse(); - }); - }); - it("parses Identifier", function () { - expect$g("start = a:'abcd'").to.parseAs(oneRuleGrammar(labeledAbcd)); - }); - it("parses IdentifierName", function () { - expect$g("start = a").to.parseAs(ruleRefGrammar("a")); - expect$g("start = ab").to.parseAs(ruleRefGrammar("ab")); - expect$g("start = abcd").to.parseAs(ruleRefGrammar("abcd")); - }); - it("parses IdentifierStart", function () { - expect$g("start = a").to.parseAs(ruleRefGrammar("a")); - expect$g("start = $").to.parseAs(ruleRefGrammar("$")); - expect$g("start = _").to.parseAs(ruleRefGrammar("_")); - expect$g("start = \\u0061").to.parseAs(ruleRefGrammar("a")); - }); - it("parses IdentifierPart", function () { - expect$g("start = aa").to.parseAs(ruleRefGrammar("aa")); - expect$g("start = a\u0300").to.parseAs(ruleRefGrammar("a\u0300")); - expect$g("start = a0").to.parseAs(ruleRefGrammar("a0")); - expect$g("start = a\u203F").to.parseAs(ruleRefGrammar("a\u203F")); - expect$g("start = a\u200C").to.parseAs(ruleRefGrammar("a\u200C")); - expect$g("start = a\u200D").to.parseAs(ruleRefGrammar("a\u200D")); - }); - it("parses LiteralMatcher", function () { - expect$g("start = 'abcd'").to.parseAs(literalGrammar("abcd", false)); - expect$g("start = 'abcd'i").to.parseAs(literalGrammar("abcd", true)); - }); - it("parses StringLiteral", function () { - expect$g("start = \"\"").to.parseAs(literalGrammar("", false)); - expect$g("start = \"a\"").to.parseAs(literalGrammar("a", false)); - expect$g("start = \"abc\"").to.parseAs(literalGrammar("abc", false)); - expect$g("start = ''").to.parseAs(literalGrammar("", false)); - expect$g("start = 'a'").to.parseAs(literalGrammar("a", false)); - expect$g("start = 'abc'").to.parseAs(literalGrammar("abc", false)); - }); - it("parses DoubleStringCharacter", function () { - expect$g("start = \"a\"").to.parseAs(literalGrammar("a", false)); - expect$g("start = \"\\n\"").to.parseAs(literalGrammar("\n", false)); - expect$g("start = \"\\\n\"").to.parseAs(literalGrammar("", false)); - expect$g("start = \"\"\"").to.failToParse(); - expect$g("start = \"\\\"").to.failToParse(); - expect$g("start = \"\n\"").to.failToParse(); - }); - it("parses SingleStringCharacter", function () { - expect$g("start = 'a'").to.parseAs(literalGrammar("a", false)); - expect$g("start = '\\n'").to.parseAs(literalGrammar("\n", false)); - expect$g("start = '\\\n'").to.parseAs(literalGrammar("", false)); - expect$g("start = '''").to.failToParse(); - expect$g("start = '\\'").to.failToParse(); - expect$g("start = '\n'").to.failToParse(); - }); - it("parses CharacterClassMatcher", function () { - expect$g("start = []").to.parseAs(classGrammar([], false, false)); - expect$g("start = [a-d]").to.parseAs(classGrammar([["a", "d"]], false, false)); - expect$g("start = [a]").to.parseAs(classGrammar(["a"], false, false)); - expect$g("start = [a-de-hi-l]").to.parseAs(classGrammar([["a", "d"], ["e", "h"], ["i", "l"]], false, false)); - expect$g("start = [^a-d]").to.parseAs(classGrammar([["a", "d"]], true, false)); - expect$g("start = [a-d]i").to.parseAs(classGrammar([["a", "d"]], false, true)); - expect$g("start = [\\\n]").to.parseAs(classGrammar([], false, false)); - }); - it("parses ClassCharacterRange", function () { - expect$g("start = [a-d]").to.parseAs(classGrammar([["a", "d"]], false, false)); - expect$g("start = [a-a]").to.parseAs(classGrammar([["a", "a"]], false, false)); - expect$g("start = [b-a]").to.failToParse({ - message: "Invalid character range: b-a." - }); - }); - it("parses ClassCharacter", function () { - expect$g("start = [a]").to.parseAs(classGrammar(["a"], false, false)); - expect$g("start = [\\n]").to.parseAs(classGrammar(["\n"], false, false)); - expect$g("start = [\\\n]").to.parseAs(classGrammar([], false, false)); - expect$g("start = []]").to.failToParse(); - expect$g("start = [\\]").to.failToParse(); - expect$g("start = [\n]").to.failToParse(); - }); - it("parses LineContinuation", function () { - expect$g("start = '\\\r\n'").to.parseAs(literalGrammar("", false)); - }); - it("parses EscapeSequence", function () { - expect$g("start = '\\n'").to.parseAs(literalGrammar("\n", false)); - expect$g("start = '\\0'").to.parseAs(literalGrammar("\x00", false)); - expect$g("start = '\\xFF'").to.parseAs(literalGrammar("\xFF", false)); - expect$g("start = '\\uFFFF'").to.parseAs(literalGrammar("\uFFFF", false)); - expect$g("start = '\\09'").to.failToParse(); - }); - it("parses CharacterEscapeSequence", function () { - expect$g("start = '\\n'").to.parseAs(literalGrammar("\n", false)); - expect$g("start = '\\a'").to.parseAs(literalGrammar("a", false)); - }); - it("parses SingleEscapeCharacter", function () { - expect$g("start = '\\''").to.parseAs(literalGrammar("'", false)); - expect$g("start = '\\\"'").to.parseAs(literalGrammar("\"", false)); - expect$g("start = '\\\\'").to.parseAs(literalGrammar("\\", false)); - expect$g("start = '\\b'").to.parseAs(literalGrammar("\b", false)); - expect$g("start = '\\f'").to.parseAs(literalGrammar("\f", false)); - expect$g("start = '\\n'").to.parseAs(literalGrammar("\n", false)); - expect$g("start = '\\r'").to.parseAs(literalGrammar("\r", false)); - expect$g("start = '\\t'").to.parseAs(literalGrammar("\t", false)); - expect$g("start = '\\v'").to.parseAs(literalGrammar("\v", false)); - }); - it("parses NonEscapeCharacter", function () { - expect$g("start = '\\a'").to.parseAs(literalGrammar("a", false)); - }); - it("parses HexEscapeSequence", function () { - expect$g("start = '\\xFF'").to.parseAs(literalGrammar("\xFF", false)); - }); - it("parses UnicodeEscapeSequence", function () { - expect$g("start = '\\uFFFF'").to.parseAs(literalGrammar("\uFFFF", false)); - }); - it("parses AnyMatcher", function () { - expect$g("start = .").to.parseAs(anyGrammar()); - }); - it("parses CodeBlock", function () { - expect$g("start = 'abcd' { code }").to.parseAs(actionGrammar(" code ")); - }); - it("parses Code", function () { - expect$g("start = 'abcd' {a}").to.parseAs(actionGrammar("a")); - expect$g("start = 'abcd' {abc}").to.parseAs(actionGrammar("abc")); - expect$g("start = 'abcd' {{a}}").to.parseAs(actionGrammar("{a}")); - expect$g("start = 'abcd' {{a}{b}{c}}").to.parseAs(actionGrammar("{a}{b}{c}")); - expect$g("start = 'abcd' {{}").to.failToParse(); - expect$g("start = 'abcd' {}}").to.failToParse(); - }); - it("parses __", function () { - expect$g("start ='abcd'").to.parseAs(trivialGrammar); - expect$g("start = 'abcd'").to.parseAs(trivialGrammar); - expect$g("start =\r\n'abcd'").to.parseAs(trivialGrammar); - expect$g("start =/* comment */'abcd'").to.parseAs(trivialGrammar); - expect$g("start = 'abcd'").to.parseAs(trivialGrammar); - }); - it("parses _", function () { - expect$g("a = 'abcd'\r\nb = 'efgh'").to.parseAs(twoRuleGrammar); - expect$g("a = 'abcd' \r\nb = 'efgh'").to.parseAs(twoRuleGrammar); - expect$g("a = 'abcd'/* comment */\r\nb = 'efgh'").to.parseAs(twoRuleGrammar); - expect$g("a = 'abcd' \r\nb = 'efgh'").to.parseAs(twoRuleGrammar); - }); - it("parses EOS", function () { - expect$g("a = 'abcd'\n;b = 'efgh'").to.parseAs(twoRuleGrammar); - expect$g("a = 'abcd' \r\nb = 'efgh'").to.parseAs(twoRuleGrammar); - expect$g("a = 'abcd' // comment\r\nb = 'efgh'").to.parseAs(twoRuleGrammar); - expect$g("a = 'abcd'\nb = 'efgh'").to.parseAs(twoRuleGrammar); - }); - it("parses EOF", function () { - expect$g("start = 'abcd'\n").to.parseAs(trivialGrammar); - }); - it("reports unmatched brace", function () { - var text = "rule = \n 'x' { y \n z"; - var errorLocation = { - start: { - offset: 13, - line: 2, - column: 6 - }, - end: { - offset: 14, - line: 2, - column: 7 - } - }; - expect$g(function () { - return parser$1.parse(text); - }).to.throw("Unbalanced brace.").with.property("location").that.deep.equals(errorLocation); - }); - }); - - exports.__moduleExports = generatedParserApi_spec; - - return exports; - -}({})); diff --git a/tools/pegjs.org/online.html b/tools/pegjs.org/online.html deleted file mode 100644 index 67bf7731..00000000 --- a/tools/pegjs.org/online.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - Online version » PEG.js – Parser Generator for JavaScript - - - - - - - - - -
-
Loading...
-
- -
- - - - - -
- - - - - - - -
-
- -
-
-
Loading...
-
-
- - - - - - - - - - -
-
- -
-
-
Parser not available.
-
-

Output

-
Output not available.
-
-
- - - - - - - -
- - - - \ No newline at end of file diff --git a/tools/pegjs.org/vendor/codemirror/codemirror.css b/tools/pegjs.org/vendor/codemirror/codemirror.css deleted file mode 100644 index 911556b6..00000000 --- a/tools/pegjs.org/vendor/codemirror/codemirror.css +++ /dev/null @@ -1 +0,0 @@ -.CodeMirror{font-family:monospace;height:300px;color:black}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes "blink"{0%{}50%{background-color:transparent;}100%{}}@-webkit-keyframes "blink"{0%{}50%{background-color:transparent;}100%{}}@keyframes "blink"{0%{}50%{background-color:transparent;}100%{}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:#f00}.cm-invalidchar{color:#f00}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:rgba(255, 150, 0, .3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll !important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;margin-bottom:-30px;*zoom:1;*display:inline}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none !important;border:none !important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper{-webkit-user-select:none;-moz-user-select:none;user-select:none}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line > span::selection,.CodeMirror-line > span > span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line > span::-moz-selection,.CodeMirror-line > span > span::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255, 255, 0, .4)}.CodeMirror span{*vertical-align:text-bottom}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none} \ No newline at end of file diff --git a/tools/pegjs.org/vendor/codemirror/codemirror.js b/tools/pegjs.org/vendor/codemirror/codemirror.js deleted file mode 100644 index a171fe19..00000000 --- a/tools/pegjs.org/vendor/codemirror/codemirror.js +++ /dev/null @@ -1,17 +0,0 @@ -/* CodeMirror - Minified & Bundled - Generated on 9/20/2015 with http://codemirror.net/doc/compress.html - Version: 5.6 - - CodeMirror Library: - - codemirror.js - Modes: - - javascript.js - - pegjs.js - */ - -!function(a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else{if("function"==typeof define&&define.amd)return define([],a);this.CodeMirror=a()}}(function(){"use strict";function v(a,b){if(!(this instanceof v))return new v(a,b);this.options=b=b?hg(b):{},hg(Ad,b,!1),I(b);var c=b.value;"string"==typeof c&&(c=new af(c,b.mode,null,b.lineSeparator)),this.doc=c;var g=new v.inputStyles[b.inputStyle](this),h=this.display=new w(a,c,g);h.wrapper.CodeMirror=this,E(this),C(this),b.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),b.autofocus&&!n&&h.input.focus(),M(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,selectingText:!1,draggingText:!1,highlight:new Yf,keySeq:null,specialChars:null};var i=this;d&&11>e&&setTimeout(function(){i.display.input.reset(!0)},20),pc(this),Bg(),Vb(this),this.curOp.forceUpdate=!0,ef(this,c),b.autofocus&&!n||i.hasFocus()?setTimeout(ig(Zc,this),20):$c(this);for(var j in Bd)Bd.hasOwnProperty(j)&&Bd[j](this,b[j],Dd);R(this),b.finishInit&&b.finishInit(this);for(var k=0;ke&&(h.gutters.style.zIndex=-1,h.scroller.style.paddingRight=0),f||a&&n||(h.scroller.draggable=!0),b&&(b.appendChild?b.appendChild(h.wrapper):b(h.wrapper)),h.viewFrom=h.viewTo=c.first,h.reportedViewFrom=h.reportedViewTo=c.first,h.view=[],h.renderedView=null,h.externalMeasured=null,h.viewOffset=0,h.lastWrapHeight=h.lastWrapWidth=0,h.updateLineNumbers=null,h.nativeBarWidth=h.barHeight=h.barWidth=0,h.scrollbarsClipped=!1,h.lineNumWidth=h.lineNumInnerWidth=h.lineNumChars=null,h.alignWidgets=!1,h.cachedCharWidth=h.cachedTextHeight=h.cachedPaddingH=null,h.maxLine=null,h.maxLineLength=0,h.maxLineChanged=!1,h.wheelDX=h.wheelDY=h.wheelStartX=h.wheelStartY=null,h.shift=!1,h.selForContextMenu=null,h.activeTouch=null,g.init(h)}function x(a){a.doc.mode=v.getMode(a.options,a.doc.modeOption),y(a)}function y(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null)}),a.doc.frontier=a.doc.first,ib(a,100),a.state.modeGen++,a.curOp&&ic(a)}function z(a){a.options.lineWrapping?(xg(a.display.wrapper,"CodeMirror-wrap"),a.display.sizer.style.minWidth="",a.display.sizerWidth=null):(wg(a.display.wrapper,"CodeMirror-wrap"),H(a)),B(a),ic(a),Fb(a),setTimeout(function(){N(a)},100)}function A(a){var b=Rb(a.display),c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/Sb(a.display)-3);return function(e){if(we(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;gb.maxLineLength&&(b.maxLineLength=c,b.maxLine=a)})}function I(a){var b=dg(a.gutters,"CodeMirror-linenumbers");-1==b&&a.lineNumbers?a.gutters=a.gutters.concat(["CodeMirror-linenumbers"]):b>-1&&!a.lineNumbers&&(a.gutters=a.gutters.slice(0),a.gutters.splice(b,1))}function J(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc.height+nb(a.display));return{clientHeight:b.scroller.clientHeight,viewHeight:b.wrapper.clientHeight,scrollWidth:b.scroller.scrollWidth,clientWidth:b.scroller.clientWidth,viewWidth:b.wrapper.clientWidth,barLeft:a.options.fixedGutter?c:0,docHeight:d,scrollHeight:d+pb(a)+b.barHeight,nativeBarWidth:b.nativeBarWidth,gutterWidth:c}}function K(a,b,c){this.cm=c;var f=this.vert=pg("div",[pg("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),g=this.horiz=pg("div",[pg("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");a(f),a(g),Jf(f,"scroll",function(){f.clientHeight&&b(f.scrollTop,"vertical")}),Jf(g,"scroll",function(){g.clientWidth&&b(g.scrollLeft,"horizontal")}),this.checkedOverlay=!1,d&&8>e&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}function L(){}function M(a){a.display.scrollbars&&(a.display.scrollbars.clear(),a.display.scrollbars.addClass&&wg(a.display.wrapper,a.display.scrollbars.addClass)),a.display.scrollbars=new v.scrollbarModel[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller),Jf(b,"mousedown",function(){a.state.focused&&setTimeout(function(){a.display.input.focus()},0)}),b.setAttribute("cm-not-content","true")},function(b,c){"horizontal"==c?Ic(a,b):Hc(a,b)},a),a.display.scrollbars.addClass&&xg(a.display.wrapper,a.display.scrollbars.addClass)}function N(a,b){b||(b=J(a));var c=a.display.barWidth,d=a.display.barHeight;O(a,b);for(var e=0;4>e&&c!=a.display.barWidth||d!=a.display.barHeight;e++)c!=a.display.barWidth&&a.options.lineWrapping&&$(a),O(a,J(a)),c=a.display.barWidth,d=a.display.barHeight}function O(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+"px",c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+"px",d.right&&d.bottom?(c.scrollbarFiller.style.display="block",c.scrollbarFiller.style.height=d.bottom+"px",c.scrollbarFiller.style.width=d.right+"px"):c.scrollbarFiller.style.display="",d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display="block",c.gutterFiller.style.height=d.bottom+"px",c.gutterFiller.style.width=b.gutterWidth+"px"):c.gutterFiller.style.display=""}function P(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop;d=Math.floor(d-mb(a));var e=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,f=lf(b,d),g=lf(b,e);if(c&&c.ensure){var h=c.ensure.from.line,i=c.ensure.to.line;f>h?(f=h,g=lf(b,mf(ff(b,h))+a.wrapper.clientHeight)):Math.min(i,b.lastLine())>=g&&(f=lf(b,mf(ff(b,i))-a.wrapper.clientHeight),g=i)}return{from:f,to:Math.max(g,f+1)}}function Q(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=T(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+"px",g=0;g=c.viewFrom&&b.visible.to<=c.viewTo&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo)&&c.renderedView==c.view&&0==oc(a))return!1;R(a)&&(kc(a),b.dims=aa(a));var e=d.first+d.size,f=Math.max(b.visible.from-a.options.viewportMargin,d.first),g=Math.min(e,b.visible.to+a.options.viewportMargin);c.viewFromg&&c.viewTo-g<20&&(g=Math.min(e,c.viewTo)),u&&(f=ue(a.doc,f),g=ve(a.doc,g));var h=f!=c.viewFrom||g!=c.viewTo||c.lastWrapHeight!=b.wrapperHeight||c.lastWrapWidth!=b.wrapperWidth;nc(a,f,g),c.viewOffset=mf(ff(a.doc,c.viewFrom)),a.display.mover.style.top=c.viewOffset+"px";var i=oc(a);if(!h&&0==i&&!b.force&&c.renderedView==c.view&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo))return!1;var j=ug();return i>4&&(c.lineDiv.style.display="none"),ba(a,c.updateLineNumbers,b.dims),i>4&&(c.lineDiv.style.display=""),c.renderedView=c.view,j&&ug()!=j&&j.offsetHeight&&j.focus(),rg(c.cursorDiv),rg(c.selectionDiv),c.gutters.style.height=c.sizer.style.minHeight=0,h&&(c.lastWrapHeight=b.wrapperHeight,c.lastWrapWidth=b.wrapperWidth,ib(a,400)),c.updateLineNumbers=null,!0}function X(a,b){for(var c=b.viewport,d=!0;(d&&a.options.lineWrapping&&b.oldDisplayWidth!=qb(a)||(c&&null!=c.top&&(c={top:Math.min(a.doc.height+nb(a.display)-rb(a),c.top)}),b.visible=P(a.display,a.doc,c),!(b.visible.from>=a.display.viewFrom&&b.visible.to<=a.display.viewTo)))&&W(a,b);d=!1){$(a);var e=J(a);db(a),Z(a,e),N(a,e)}b.signal(a,"update",a),(a.display.viewFrom!=a.display.reportedViewFrom||a.display.viewTo!=a.display.reportedViewTo)&&(b.signal(a,"viewportChange",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo)}function Y(a,b){var c=new U(a,b);if(W(a,c)){$(a),X(a,c);var d=J(a);db(a),Z(a,d),N(a,d),c.finish()}}function Z(a,b){a.display.sizer.style.minHeight=b.docHeight+"px";var c=b.docHeight+a.display.barHeight;a.display.heightForcer.style.top=c+"px",a.display.gutters.style.height=Math.max(c+pb(a),b.clientHeight)+"px"}function $(a){for(var b=a.display,c=b.lineDiv.offsetTop,f=0;fe){var i=g.node.offsetTop+g.node.offsetHeight;h=i-c,c=i}else{var j=g.node.getBoundingClientRect();h=j.bottom-j.top}var k=g.line.height-h;if(2>h&&(h=Rb(b)),(k>.001||-.001>k)&&(jf(g.line,h),_(g.line),g.rest))for(var l=0;l=b&&m.lineNumber;m.changes&&(dg(m.changes,"gutter")>-1&&(p=!1),ca(a,m,k,c)),p&&(rg(m.lineNumber),m.lineNumber.appendChild(document.createTextNode(S(a.options,k)))),h=m.node.nextSibling}else{var n=ka(a,m,k,c);g.insertBefore(n,h)}k+=m.size}for(;h;)h=i(h)}function ca(a,b,c,d){for(var e=0;ee&&(a.node.style.zIndex=2)),a.node}function ea(a){var b=a.bgClass?a.bgClass+" "+(a.line.bgClass||""):a.line.bgClass;if(b&&(b+=" CodeMirror-linebackground"),a.background)b?a.background.className=b:(a.background.parentNode.removeChild(a.background),a.background=null);else if(b){var c=da(a);a.background=c.insertBefore(pg("div",null,b),c.firstChild)}}function fa(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):Qe(a,b)}function ga(a,b){var c=b.text.className,d=fa(a,b);b.text==b.node&&(b.node=d.pre),b.text.parentNode.replaceChild(d.pre,b.text),b.text=d.pre,d.bgClass!=b.bgClass||d.textClass!=b.textClass?(b.bgClass=d.bgClass,b.textClass=d.textClass,ha(b)):c&&(b.text.className=c)}function ha(a){ea(a),a.line.wrapClass?da(a).className=a.line.wrapClass:a.node!=a.text&&(a.node.className="");var b=a.textClass?a.textClass+" "+(a.line.textClass||""):a.line.textClass;a.text.className=b||""}function ia(a,b,c,d){if(b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null),b.gutterBackground&&(b.node.removeChild(b.gutterBackground),b.gutterBackground=null),b.line.gutterClass){var e=da(b);b.gutterBackground=pg("div",null,"CodeMirror-gutter-background "+b.line.gutterClass,"left: "+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+"px; width: "+d.gutterTotalWidth+"px"),e.insertBefore(b.gutterBackground,b.text)}var f=b.line.gutterMarkers;if(a.options.lineNumbers||f){var e=da(b),g=b.gutter=pg("div",null,"CodeMirror-gutter-wrapper","left: "+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+"px");if(a.display.input.setUneditable(g),e.insertBefore(g,b.text),b.line.gutterClass&&(g.className+=" "+b.line.gutterClass),!a.options.lineNumbers||f&&f["CodeMirror-linenumbers"]||(b.lineNumber=g.appendChild(pg("div",S(a.options,c),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+d.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+a.display.lineNumInnerWidth+"px"))),f)for(var h=0;h1)if(va&&va.join("\n")==b){if(d.ranges.length%va.length==0){i=[];for(var j=0;j=0;j--){var k=d.ranges[j],l=k.from(),m=k.to();k.empty()&&(c&&c>0?l=oa(l.line,l.ch-c):a.state.overwrite&&!g&&(m=oa(m.line,Math.min(ff(f,m.line).text.length,m.ch+bg(h).length))));var n=a.curOp.updateInput,o={from:l,to:m,text:i?i[j%i.length]:h,origin:e||(g?"paste":a.state.cutIncoming?"cut":"+input")};hd(a.doc,o),Nf(a,"inputRead",a,o)}b&&!g&&ya(a,b),td(a),a.curOp.updateInput=n,a.curOp.typing=!0,a.state.pasteIncoming=a.state.cutIncoming=!1}function xa(a,b){var c=a.clipboardData&&a.clipboardData.getData("text/plain");return c?(a.preventDefault(),ua(b)||b.options.disableInput||cc(b,function(){wa(b,c,0,null,"paste")}),!0):void 0}function ya(a,b){if(a.options.electricChars&&a.options.smartIndent)for(var c=a.doc.sel,d=c.ranges.length-1;d>=0;d--){var e=c.ranges[d];if(!(e.head.ch>100||d&&c.ranges[d-1].head.line==e.head.line)){var f=a.getModeAt(e.head),g=!1;if(f.electricChars){for(var h=0;h-1){g=vd(a,e.head.line,"smart");break}}else f.electricInput&&f.electricInput.test(ff(a.doc,e.head.line).text.slice(0,e.head.ch))&&(g=vd(a,e.head.line,"smart"));g&&Nf(a,"electricInput",a,e.head.line)}}}function za(a){for(var b=[],c=[],d=0;de?i.map:j[e],g=0;ge?a.line:a.rest[e]),l=f[g]+d;return(0>d||h!=b)&&(l=f[g+(d?1:0)]),oa(k,l)}}}var d=a.text.firstChild,e=!1;if(!b||!tg(d,b))return Fa(oa(kf(a.line),0),!0);if(b==d&&(e=!0,b=d.childNodes[c],c=0,!b)){var f=a.rest?bg(a.rest):a.line;return Fa(oa(kf(f),f.text.length),e)}var g=3==b.nodeType?b:null,h=b;for(g||1!=b.childNodes.length||3!=b.firstChild.nodeType||(g=b.firstChild,c&&(c=g.nodeValue.length));h.parentNode!=d;)h=h.parentNode;var i=a.measure,j=i.maps,l=k(g,h,c);if(l)return Fa(l,e);for(var m=h.nextSibling,n=g?g.nodeValue.length-c:0;m;m=m.nextSibling){if(l=k(m,m.firstChild,0))return Fa(oa(l.line,l.ch-n),e);n+=m.textContent.length}for(var o=h.previousSibling,n=c;o;o=o.previousSibling){if(l=k(o,o.firstChild,-1))return Fa(oa(l.line,l.ch+n),e);n+=m.textContent.length}}function Ia(a,b,c,d,e){function i(a){return function(b){return b.id==a}}function j(b){if(1==b.nodeType){var c=b.getAttribute("cm-text");if(null!=c)return""==c&&(c=b.textContent.replace(/\u200b/g,"")),void(f+=c);var l,k=b.getAttribute("cm-marker");if(k){var m=a.findMarks(oa(d,0),oa(e+1,0),i(+k));return void(m.length&&(l=m[0].find())&&(f+=gf(a.doc,l.from,l.to).join(h)))}if("false"==b.getAttribute("contenteditable"))return;for(var n=0;n=0){var g=sa(f.from(),e.from()),h=ra(f.to(),e.to()),i=f.empty()?e.from()==e.head:f.from()==f.head;b>=d&&--b,a.splice(--d,2,new Ka(i?h:g,i?g:h))}}return new Ja(a,b)}function Ma(a,b){return new Ja([new Ka(a,b||a)],0)}function Na(a,b){return Math.max(a.first,Math.min(b,a.first+a.size-1))}function Oa(a,b){if(b.linec?oa(c,ff(a,c).text.length):Pa(b,ff(a,b.line).text.length)}function Pa(a,b){var c=a.ch;return null==c||c>b?oa(a.line,b):0>c?oa(a.line,0):a}function Qa(a,b){return b>=a.first&&b=f.ch:j.to>f.ch))){if(d&&(Lf(k,"beforeCursorEnter"),k.explicitlyCleared)){if(h.markedSpans){--i;continue}break}if(!k.atomic)continue;var l=k.find(0>g?-1:1);if(0==pa(l,f)&&(l.ch+=g,l.ch<0?l=l.line>a.first?Oa(a,oa(l.line-1)):null:l.ch>h.text.length&&(l=l.lineb&&(b=0),b=Math.round(b),d=Math.round(d),f.appendChild(pg("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px; top: "+b+"px; width: "+(null==c?i-a:c)+"px; height: "+(d-b)+"px"))}function k(b,c,d){function m(c,d){return Kb(a,oa(b,c),"div",f,d)}var k,l,f=ff(e,b),g=f.text.length;return Og(nf(f),c||0,null==d?g:d,function(a,b,e){var n,o,p,f=m(a,"left");if(a==b)n=f,o=p=f.left;else{if(n=m(b-1,"right"),"rtl"==e){var q=f;f=n,n=q}o=f.left,p=n.right}null==c&&0==a&&(o=h),n.top-f.top>3&&(j(o,f.top,null,f.bottom),o=h,f.bottoml.bottom||n.bottom==l.bottom&&n.right>l.right)&&(l=n),h+1>o&&(o=h),j(o,n.top,p-o,n.bottom)}),{start:k,end:l}}var d=a.display,e=a.doc,f=document.createDocumentFragment(),g=ob(a.display),h=g.left,i=Math.max(d.sizerWidth,qb(a)-d.sizer.offsetLeft)-g.right,l=b.from(),m=b.to();if(l.line==m.line)k(l.line,l.ch,m.ch);else{var n=ff(e,l.line),o=ff(e,m.line),p=se(n)==se(o),q=k(l.line,l.ch,p?n.text.length+1:null).end,r=k(m.line,p?0:null,m.ch).start;p&&(q.top0?b.blinker=setInterval(function(){b.cursorDiv.style.visibility=(c=!c)?"":"hidden"},a.options.cursorBlinkRate):a.options.cursorBlinkRate<0&&(b.cursorDiv.style.visibility="hidden")}}function ib(a,b){a.doc.mode.startState&&a.doc.frontier=a.display.viewTo)){var c=+new Date+a.options.workTime,d=Jd(b.mode,lb(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,a.display.viewTo+500),function(f){if(b.frontier>=a.display.viewFrom){var g=f.styles,h=f.text.length>a.options.maxHighlightLength,i=Ke(a,f,h?Jd(b.mode,d):d,!0);f.styles=i.styles;var j=f.styleClasses,k=i.classes;k?f.styleClasses=k:j&&(f.styleClasses=null);for(var l=!g||g.length!=f.styles.length||j!=k&&(!j||!k||j.bgClass!=k.bgClass||j.textClass!=k.textClass),m=0;!l&&mc?(ib(a,a.options.workDelay),!0):void 0}),e.length&&cc(a,function(){for(var b=0;bg;--h){if(h<=f.first)return f.first;var i=ff(f,h-1);if(i.stateAfter&&(!c||h<=f.frontier))return h;var j=Zf(i.text,null,a.options.tabSize);(null==e||d>j)&&(e=h-1,d=j)}return e}function lb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!0;var f=kb(a,b,c),g=f>d.first&&ff(d,f-1).stateAfter;return g=g?Jd(d.mode,g):Kd(d.mode),d.iter(f,b,function(c){Me(a,c.text,g);var h=f==b-1||f%5==0||f>=e.viewFrom&&f2&&f.push((i.bottom+j.top)/2-c.top)}}f.push(c.bottom-c.top)}}function tb(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure.cache};for(var d=0;dc)return{map:a.measure.maps[d],cache:a.measure.caches[d],before:!0}}function ub(a,b){b=se(b);var c=kf(b),d=a.display.externalMeasured=new gc(a.doc,b,c);d.lineN=c;var e=d.built=Qe(a,d);return d.text=e.pre,sg(a.display.lineMeasure,e.pre),d}function vb(a,b,c,d){return yb(a,xb(a,b),c,d)}function wb(a,b){if(b>=a.display.viewFrom&&b=c.lineN&&bb?(e=0,f=1,g="left"):j>b?(e=b-i,f=e+1):(h==a.length-3||b==j&&a[h+3]>b)&&(f=j-i,e=f-1,b>=j&&(g="right")),null!=e){if(d=a[h+2],i==j&&c==(d.insertLeft?"left":"right")&&(g=c),"left"==c&&0==e)for(;h&&a[h-2]==a[h-3]&&a[h-1].insertLeft;)d=a[(h-=3)+2],g="left";if("right"==c&&e==j-i)for(;hm;m++){for(;i&&og(b.line.text.charAt(g.coverStart+i));)--i;for(;g.coverStart+je&&0==i&&j==g.coverEnd-g.coverStart)l=h.parentNode.getBoundingClientRect();else if(d&&a.options.lineWrapping){var n=qg(h,i,j).getClientRects();l=n.length?n["right"==f?n.length-1:0]:zb}else l=qg(h,i,j).getBoundingClientRect()||zb;if(l.left||l.right||0==i)break;j=i,i-=1,k="right"}d&&11>e&&(l=Cb(a.display.measure,l))}else{i>0&&(k=f="right");var n;l=a.options.lineWrapping&&(n=h.getClientRects()).length>1?n["right"==f?n.length-1:0]:h.getBoundingClientRect()}if(d&&9>e&&!i&&(!l||!l.left&&!l.right)){var o=h.parentNode.getClientRects()[0];l=o?{left:o.left,right:o.left+Sb(a.display),top:o.top,bottom:o.bottom}:zb}for(var p=l.top-b.rect.top,q=l.bottom-b.rect.top,r=(p+q)/2,s=b.view.measure.heights,m=0;mc.from?g(a-1):g(a,d)}d=d||ff(a.doc,b.line),e||(e=xb(a,d));var i=nf(d),j=b.ch;if(!i)return g(j);var k=Yg(i,j),l=h(j,k);return null!=Xg&&(l.other=h(j,Xg)),l}function Mb(a,b){var c=0,b=Oa(a.doc,b);a.options.lineWrapping||(c=Sb(a.display)*b.ch);var d=ff(a.doc,b.line),e=mf(d)+mb(a.display);return{left:c,right:c,top:e,bottom:e+d.height}}function Nb(a,b,c,d){var e=oa(a,b);return e.xRel=d,c&&(e.outside=!0),e}function Ob(a,b,c){var d=a.doc;if(c+=a.display.viewOffset,0>c)return Nb(d.first,0,!0,-1);var e=lf(d,c),f=d.first+d.size-1;if(e>f)return Nb(d.first+d.size-1,ff(d,f).text.length,!0,1);0>b&&(b=0);for(var g=ff(d,e);;){var h=Pb(a,g,e,b,c),i=qe(g),j=i&&i.find(0,!0);if(!i||!(h.ch>j.from.ch||h.ch==j.from.ch&&h.xRel>0))return h;e=kf(g=j.to.line)}}function Pb(a,b,c,d,e){function j(d){var e=Lb(a,oa(c,d),"line",b,i);return g=!0,f>e.bottom?e.left-h:fq)return Nb(c,n,r,1);for(;;){if(k?n==m||n==$g(b,m,1):1>=n-m){for(var s=o>d||q-d>=d-o?m:n,t=d-(s==m?o:q);og(b.text.charAt(s));)++s;var u=Nb(c,s,s==m?p:r,-1>t?-1:t>1?1:0);return u}var v=Math.ceil(l/2),w=m+v;if(k){w=m;for(var x=0;v>x;++x)w=$g(b,w,1)}var y=j(w);y>d?(n=w,q=y,(r=g)&&(q+=1e3),l=v):(m=w,o=y,p=g,l-=v)}}function Rb(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==Qb){Qb=pg("pre");for(var b=0;49>b;++b)Qb.appendChild(document.createTextNode("x")),Qb.appendChild(pg("br"));Qb.appendChild(document.createTextNode("x"))}sg(a.measure,Qb);var c=Qb.offsetHeight/50;return c>3&&(a.cachedTextHeight=c),rg(a.measure),c||1}function Sb(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b=pg("span","xxxxxxxxxx"),c=pg("pre",[b]);sg(a.measure,c);var d=b.getBoundingClientRect(),e=(d.right-d.left)/10;return e>2&&(a.cachedCharWidth=e),e||10}function Vb(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Ub},Tb?Tb.ops.push(a.curOp):a.curOp.ownsGroup=Tb={ops:[a.curOp],delayedCallbacks:[]}}function Wb(a){var b=a.delayedCallbacks,c=0;do{for(;c=c.viewTo)||c.maxLineChanged&&b.options.lineWrapping,a.update=a.mustUpdate&&new U(b,a.mustUpdate&&{top:a.scrollTop,ensure:a.scrollToPos},a.forceUpdate)}function $b(a){a.updatedDisplay=a.mustUpdate&&W(a.cm,a.update)}function _b(a){var b=a.cm,c=b.display;a.updatedDisplay&&$(b),a.barMeasure=J(b),c.maxLineChanged&&!b.options.lineWrapping&&(a.adjustWidthTo=vb(b,c.maxLine,c.maxLine.text.length).left+3,b.display.sizerWidth=a.adjustWidthTo,a.barMeasure.scrollWidth=Math.max(c.scroller.clientWidth,c.sizer.offsetLeft+a.adjustWidthTo+pb(b)+b.display.barWidth),a.maxScrollLeft=Math.max(0,c.sizer.offsetLeft+a.adjustWidthTo-qb(b))),(a.updatedDisplay||a.selectionChanged)&&(a.preparedSelection=c.input.prepareSelection())}function ac(a){var b=a.cm;null!=a.adjustWidthTo&&(b.display.sizer.style.minWidth=a.adjustWidthTo+"px",a.maxScrollLeftf;f=e){var g=new gc(a.doc,ff(a.doc,f),f);e=f+g.size,d.push(g)}return d}function ic(a,b,c,d){null==b&&(b=a.doc.first),null==c&&(c=a.doc.first+a.doc.size),d||(d=0);var e=a.display;if(d&&cb)&&(e.updateLineNumbers=b),a.curOp.viewChanged=!0,b>=e.viewTo)u&&ue(a.doc,b)e.viewFrom?kc(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)kc(a);else if(b<=e.viewFrom){var f=mc(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):kc(a)}else if(c>=e.viewTo){var f=mc(a,b,b,-1);f?(e.view=e.view.slice(0,f.index),e.viewTo=f.lineN):kc(a)}else{var g=mc(a,b,b,-1),h=mc(a,c,c+d,1);g&&h?(e.view=e.view.slice(0,g.index).concat(hc(a,g.lineN,h.lineN)).concat(e.view.slice(h.index)),e.viewTo+=d):kc(a)}var i=e.externalMeasured;i&&(c=e.lineN&&b=d.viewTo)){var f=d.view[lc(a,b)];if(null!=f.node){var g=f.changes||(f.changes=[]);-1==dg(g,c)&&g.push(c)}}}function kc(a){a.display.viewFrom=a.display.viewTo=a.doc.first,a.display.view=[],a.display.viewOffset=0}function lc(a,b){if(b>=a.display.viewTo)return null;if(b-=a.display.viewFrom,0>b)return null;for(var c=a.display.view,d=0;db)return d}function mc(a,b,c,d){var f,e=lc(a,b),g=a.display.view;if(!u||c==a.doc.first+a.doc.size)return{index:e,lineN:c};for(var h=0,i=a.display.viewFrom;e>h;h++)i+=g[h].size;if(i!=b){if(d>0){if(e==g.length-1)return null;f=i+g[e].size-b,e++}else f=i-b;b+=f,c+=f}for(;ue(a.doc,c)!=c;){if(e==(0>d?0:g.length-1))return null;c+=d*g[e-(0>d?1:0)].size,e+=d}return{index:e,lineN:c}}function nc(a,b,c){var d=a.display,e=d.view;0==e.length||b>=d.viewTo||c<=d.viewFrom?(d.view=hc(a,b,c),d.viewFrom=b):(d.viewFrom>b?d.view=hc(a,b,d.viewFrom).concat(d.view):d.viewFromc&&(d.view=d.view.slice(0,lc(a,c)))),d.viewTo=c}function oc(a){for(var b=a.display.view,c=0,d=0;d400}var b=a.display;Jf(b.scroller,"mousedown",dc(a,uc)),d&&11>e?Jf(b.scroller,"dblclick",dc(a,function(b){if(!Pf(a,b)){var c=tc(a,b);if(c&&!Bc(a,b)&&!sc(a.display,b)){Df(b);var d=a.findWordAt(c);Ta(a.doc,d.anchor,d.head)}}})):Jf(b.scroller,"dblclick",function(b){Pf(a,b)||Df(b)}),s||Jf(b.scroller,"contextmenu",function(b){_c(a,b)});var c,f={end:0};Jf(b.scroller,"touchstart",function(a){if(!h(a)){clearTimeout(c);var d=+new Date;b.activeTouch={start:d,moved:!1,prev:d-f.end<=300?f:null},1==a.touches.length&&(b.activeTouch.left=a.touches[0].pageX,b.activeTouch.top=a.touches[0].pageY)}}),Jf(b.scroller,"touchmove",function(){b.activeTouch&&(b.activeTouch.moved=!0)}),Jf(b.scroller,"touchend",function(c){var d=b.activeTouch;if(d&&!sc(b,c)&&null!=d.left&&!d.moved&&new Date-d.start<300){var f,e=a.coordsChar(b.activeTouch,"page");f=!d.prev||i(d,d.prev)?new Ka(e,e):!d.prev.prev||i(d,d.prev.prev)?a.findWordAt(e):new Ka(oa(e.line,0),Oa(a.doc,oa(e.line+1,0))),a.setSelection(f.anchor,f.head),a.focus(),Df(c)}g()}),Jf(b.scroller,"touchcancel",g),Jf(b.scroller,"scroll",function(){b.scroller.clientHeight&&(Hc(a,b.scroller.scrollTop),Ic(a,b.scroller.scrollLeft,!0),Lf(a,"scroll",a))}),Jf(b.scroller,"mousewheel",function(b){Mc(a,b)}),Jf(b.scroller,"DOMMouseScroll",function(b){Mc(a,b)}),Jf(b.wrapper,"scroll",function(){b.wrapper.scrollTop=b.wrapper.scrollLeft=0}),b.dragFunctions={enter:function(b){Pf(a,b)||Gf(b)},over:function(b){Pf(a,b)||(Fc(a,b),Gf(b))},start:function(b){Ec(a,b)},drop:dc(a,Dc),leave:function(){Gc(a)}};var j=b.input.getField();Jf(j,"keyup",function(b){Wc.call(a,b)}),Jf(j,"keydown",dc(a,Uc)),Jf(j,"keypress",dc(a,Xc)),Jf(j,"focus",ig(Zc,a)),Jf(j,"blur",ig($c,a))}function qc(a,b,c){var d=c&&c!=v.Init;if(!b!=!d){var e=a.display.dragFunctions,f=b?Jf:Kf;f(a.display.scroller,"dragstart",e.start),f(a.display.scroller,"dragenter",e.enter),f(a.display.scroller,"dragover",e.over),f(a.display.scroller,"dragleave",e.leave),f(a.display.scroller,"drop",e.drop)}}function rc(a){var b=a.display;(b.lastWrapHeight!=b.wrapper.clientHeight||b.lastWrapWidth!=b.wrapper.clientWidth)&&(b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize())}function sc(a,b){for(var c=Hf(b);c!=a.wrapper;c=c.parentNode)if(!c||1==c.nodeType&&"true"==c.getAttribute("cm-ignore-events")||c.parentNode==a.sizer&&c!=a.mover)return!0}function tc(a,b,c,d){var e=a.display;if(!c&&"true"==Hf(b).getAttribute("cm-not-content"))return null;var f,g,h=e.lineSpace.getBoundingClientRect();try{f=b.clientX-h.left,g=b.clientY-h.top}catch(b){return null}var j,i=Ob(a,f,g);if(d&&1==i.xRel&&(j=ff(a.doc,i.line).text).length==i.ch){var k=Zf(j,j.length,a.options.tabSize)-j.length;i=oa(i.line,Math.max(0,Math.round((f-ob(a.display).left)/Sb(a.display))-k))}return i}function uc(a){var b=this,c=b.display;if(!(c.activeTouch&&c.input.supportsTouch()||Pf(b,a))){if(c.shift=a.shiftKey,sc(c,a))return void(f||(c.scroller.draggable=!1,setTimeout(function(){c.scroller.draggable=!0},100)));if(!Bc(b,a)){var d=tc(b,a);switch(window.focus(),If(a)){case 1:b.state.selectingText?b.state.selectingText(a):d?xc(b,a,d):Hf(a)==c.scroller&&Df(a);break;case 2:f&&(b.state.lastMiddleDown=+new Date),d&&Ta(b.doc,d),setTimeout(function(){c.input.focus()},20),Df(a);break;case 3:s?_c(b,a):Yc(b)}}}}function xc(a,b,c){d?setTimeout(ig(ta,a),0):a.curOp.focus=ug();var f,e=+new Date;wc&&wc.time>e-400&&0==pa(wc.pos,c)?f="triple":vc&&vc.time>e-400&&0==pa(vc.pos,c)?(f="double",wc={time:e,pos:c}):(f="single",vc={time:e,pos:c});var i,g=a.doc.sel,h=o?b.metaKey:b.ctrlKey;a.options.dragDrop&&Dg&&!ua(a)&&"single"==f&&(i=g.contains(c))>-1&&(pa((i=g.ranges[i]).from(),c)<0||c.xRel>0)&&(pa(i.to(),c)>0||c.xRel<0)?yc(a,b,c,h):zc(a,b,c,f,h)}function yc(a,b,c,g){var h=a.display,i=+new Date,j=dc(a,function(k){f&&(h.scroller.draggable=!1),a.state.draggingText=!1,Kf(document,"mouseup",j),Kf(h.scroller,"drop",j),Math.abs(b.clientX-k.clientX)+Math.abs(b.clientY-k.clientY)<10&&(Df(k),!g&&+new Date-200=p;p++){var r=ff(g,p).text,s=$f(r,m,f);m==o?e.push(new Ka(oa(p,s),oa(p,s))):r.length>s&&e.push(new Ka(oa(p,s),oa(p,$f(r,o,f))))}e.length||e.push(new Ka(c,c)),Za(g,La(j.ranges.slice(0,i).concat(e),i),{origin:"*mouse",scroll:!1}),a.scrollIntoView(b)}else{var t=h,u=t.anchor,v=b;if("single"!=d){if("double"==d)var w=a.findWordAt(b);else var w=new Ka(oa(b.line,0),Oa(g,oa(b.line+1,0)));pa(w.anchor,u)>0?(v=w.head,u=sa(t.from(),w.anchor)):(v=w.anchor,u=ra(t.to(),w.head))}var e=j.ranges.slice(0);e[i]=new Ka(Oa(g,u),v),Za(g,La(e,i),Wf)}}function r(b){var c=++q,e=tc(a,b,!0,"rect"==d);if(e)if(0!=pa(e,n)){a.curOp.focus=ug(),o(e);var h=P(f,g);(e.line>=h.to||e.linep.bottom?20:0;i&&setTimeout(dc(a,function(){q==c&&(f.scroller.scrollTop+=i,r(b))}),50)}}function s(b){a.state.selectingText=!1,q=1/0,Df(b),f.input.focus(),Kf(document,"mousemove",t),Kf(document,"mouseup",u),g.history.lastSelOrigin=null}var f=a.display,g=a.doc;Df(b);var h,i,j=g.sel,k=j.ranges;if(e&&!b.shiftKey?(i=g.sel.contains(c),h=i>-1?k[i]:new Ka(c,c)):(h=g.sel.primary(),i=g.sel.primIndex),b.altKey)d="rect",e||(h=new Ka(c,c)),c=tc(a,b,!0,!0),i=-1;else if("double"==d){var l=a.findWordAt(c);h=a.display.shift||g.extend?Sa(g,h,l.anchor,l.head):l}else if("triple"==d){var m=new Ka(oa(c.line,0),Oa(g,oa(c.line+1,0)));h=a.display.shift||g.extend?Sa(g,h,m.anchor,m.head):m}else h=Sa(g,h,c);e?-1==i?(i=k.length,Za(g,La(k.concat([h]),i),{scroll:!1,origin:"*mouse"})):k.length>1&&k[i].empty()&&"single"==d&&!b.shiftKey?(Za(g,La(k.slice(0,i).concat(k.slice(i+1)),0),{scroll:!1,origin:"*mouse"}),j=g.sel):Va(g,i,h,Wf):(i=0,Za(g,new Ja([h],0),Wf),j=g.sel);var n=c,p=f.wrapper.getBoundingClientRect(),q=0,t=dc(a,function(a){If(a)?r(a):s(a)}),u=dc(a,s);a.state.selectingText=u,Jf(document,"mousemove",t),Jf(document,"mouseup",u)}function Ac(a,b,c,d,e){try{var f=b.clientX,g=b.clientY}catch(b){return!1}if(f>=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&Df(b);var h=a.display,i=h.lineDiv.getBoundingClientRect();if(g>i.bottom||!Rf(a,c))return Ff(b);g-=i.top-h.viewOffset;for(var j=0;j=f){var l=lf(a.doc,g),m=a.options.gutters[j];return e(a,c,a,l,m,b),Ff(b)}}}function Bc(a,b){return Ac(a,b,"gutterClick",!0,Nf)}function Dc(a){var b=this;if(Gc(b),!Pf(b,a)&&!sc(b.display,a)){Df(a),d&&(Cc=+new Date);var c=tc(b,a,!0),e=a.dataTransfer.files;if(c&&!ua(b))if(e&&e.length&&window.FileReader&&window.File)for(var f=e.length,g=Array(f),h=0,i=function(a,d){var e=new FileReader;e.onload=dc(b,function(){if(g[d]=e.result,++h==f){c=Oa(b.doc,c);var a={from:c,to:c,text:b.doc.splitLines(g.join(b.doc.lineSeparator())),origin:"paste"};hd(b.doc,a),Ya(b.doc,Ma(c,bd(a)))}}),e.readAsText(a)},j=0;f>j;++j)i(e[j],j);else{if(b.state.draggingText&&b.doc.sel.contains(c)>-1)return b.state.draggingText(a),void setTimeout(function(){b.display.input.focus()},20);try{var g=a.dataTransfer.getData("Text");if(g){if(b.state.draggingText&&!(o?a.altKey:a.ctrlKey))var k=b.listSelections();if($a(b.doc,Ma(c,c)),k)for(var j=0;jj.clientWidth||g&&j.scrollHeight>j.clientHeight){if(g&&o&&f)a:for(var k=c.target,l=h.view;k!=j;k=k.parentNode)for(var m=0;mn?p=Math.max(0,p+n-50):q=Math.min(b.doc.height,q+n+50),Y(b,{top:p,bottom:q})}20>Jc&&(null==h.wheelStartX?(h.wheelStartX=j.scrollLeft,h.wheelStartY=j.scrollTop,h.wheelDX=e,h.wheelDY=g,setTimeout(function(){if(null!=h.wheelStartX){var a=j.scrollLeft-h.wheelStartX,b=j.scrollTop-h.wheelStartY,c=b&&h.wheelDY&&b/h.wheelDY||a&&h.wheelDX&&a/h.wheelDX;h.wheelStartX=h.wheelStartY=null,c&&(Kc=(Kc*Jc+c)/(Jc+1),++Jc)}},200)):(h.wheelDX+=e,h.wheelDY+=g))}}function Nc(a,b,c){if("string"==typeof b&&(b=Ld[b],!b))return!1;a.display.input.ensurePolled();var d=a.display.shift,e=!1;try{ua(a)&&(a.state.suppressEdits=!0),c&&(a.display.shift=!1),e=b(a)!=Uf}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function Oc(a,b,c){for(var d=0;de&&27==a.keyCode&&(a.returnValue=!1);var c=a.keyCode;b.display.shift=16==c||a.shiftKey;var f=Rc(b,a);i&&(Tc=f?c:null,!f&&88==c&&!Kg&&(o?a.metaKey:a.ctrlKey)&&b.replaceSelection("",null,"cut")),18!=c||/\bCodeMirror-crosshair\b/.test(b.display.lineDiv.className)||Vc(b)}}function Vc(a){function c(a){18!=a.keyCode&&a.altKey||(wg(b,"CodeMirror-crosshair"),Kf(document,"keyup",c),Kf(document,"mouseover",c))}var b=a.display.lineDiv;xg(b,"CodeMirror-crosshair"),Jf(document,"keyup",c),Jf(document,"mouseover",c)}function Wc(a){16==a.keyCode&&(this.doc.sel.shift=!1),Pf(this,a)}function Xc(a){var b=this;if(!(sc(b.display,a)||Pf(b,a)||a.ctrlKey&&!a.altKey||o&&a.metaKey)){var c=a.keyCode,d=a.charCode;if(i&&c==Tc)return Tc=null,void Df(a);if(!i||a.which&&!(a.which<10)||!Rc(b,a)){var e=String.fromCharCode(null==d?c:d);Sc(b,a,e)||b.display.input.onKeyPress(a)}}}function Yc(a){a.state.delayingBlurEvent=!0,setTimeout(function(){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1,$c(a))},100)}function Zc(a){a.state.delayingBlurEvent&&(a.state.delayingBlurEvent=!1),"nocursor"!=a.options.readOnly&&(a.state.focused||(Lf(a,"focus",a),a.state.focused=!0,xg(a.display.wrapper,"CodeMirror-focused"),a.curOp||a.display.selForContextMenu==a.doc.sel||(a.display.input.reset(),f&&setTimeout(function(){a.display.input.reset(!0)},20)),a.display.input.receivedFocus()),hb(a))}function $c(a){a.state.delayingBlurEvent||(a.state.focused&&(Lf(a,"blur",a),a.state.focused=!1,wg(a.display.wrapper,"CodeMirror-focused")),clearInterval(a.display.blinker),setTimeout(function(){a.state.focused||(a.display.shift=!1)},150))}function _c(a,b){sc(a.display,b)||ad(a,b)||a.display.input.onContextMenu(b)}function ad(a,b){return Rf(a,"gutterContextMenu")?Ac(a,b,"gutterContextMenu",!1,Lf):!1}function cd(a,b){if(pa(a,b.from)<0)return a;if(pa(a,b.to)<=0)return bd(b);var c=a.line+b.text.length-(b.to.line-b.from.line)-1,d=a.ch;return a.line==b.to.line&&(d+=bd(b).ch-b.to.ch),oa(c,d)}function dd(a,b){for(var c=[],d=0;d=0;--e)id(a,{from:d[e].from,to:d[e].to,text:e?[""]:b.text});else id(a,b)}}function id(a,b){if(1!=b.text.length||""!=b.text[0]||0!=pa(b.from,b.to)){var c=dd(a,b);sf(a,b,c,a.cm?a.cm.curOp.id:NaN),ld(a,b,c,fe(a,b));var d=[];df(a,function(a,c){c||-1!=dg(d,a.history)||(Cf(a.history,b),d.push(a.history)),ld(a,b,null,fe(a,b))})}}function jd(a,b,c){if(!a.cm||!a.cm.state.suppressEdits){for(var e,d=a.history,f=a.sel,g="undo"==b?d.done:d.undone,h="undo"==b?d.undone:d.done,i=0;i=0;--i){var l=e.changes[i];if(l.origin=b,k&&!gd(a,l,!1))return void(g.length=0);j.push(pf(a,l));var m=i?dd(a,l):bg(g);ld(a,l,m,he(a,l)),!i&&a.cm&&a.cm.scrollIntoView({from:l.from,to:bd(l)});var n=[];df(a,function(a,b){b||-1!=dg(n,a.history)||(Cf(a.history,l),n.push(a.history)),ld(a,l,null,he(a,l))})}}}}function kd(a,b){if(0!=b&&(a.first+=b,a.sel=new Ja(eg(a.sel.ranges,function(a){return new Ka(oa(a.anchor.line+b,a.anchor.ch),oa(a.head.line+b,a.head.ch))}),a.sel.primIndex),a.cm)){ic(a.cm,a.first,a.first-b,b);for(var c=a.cm.display,d=c.viewFrom;da.lastLine())){if(b.from.linef&&(b={from:b.from,to:oa(f,ff(a,f).text.length),text:[b.text[0]],origin:b.origin}),b.removed=gf(a,b.from,b.to),c||(c=dd(a,b)),a.cm?md(a.cm,b,d):Ye(a,b,d),$a(a,c,Vf)}}function md(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,i=f.line;a.options.lineWrapping||(i=kf(se(ff(d,f.line))),d.iter(i,g.line+1,function(a){return a==e.maxLine?(h=!0,!0):void 0})),d.sel.contains(b.from,b.to)>-1&&Qf(a),Ye(d,b,c,A(a)),a.options.lineWrapping||(d.iter(i,f.line+b.text.length,function(a){var b=G(a);b>e.maxLineLength&&(e.maxLine=a,e.maxLineLength=b,e.maxLineChanged=!0,h=!1)}),h&&(a.curOp.updateMaxLine=!0)),d.frontier=Math.min(d.frontier,f.line),ib(a,400);var j=b.text.length-(g.line-f.line)-1;b.full?ic(a):f.line!=g.line||1!=b.text.length||Xe(a.doc,b)?ic(a,f.line,g.line+1,j):jc(a,f.line,"text");var k=Rf(a,"changes"),l=Rf(a,"change");if(l||k){var m={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin};l&&Nf(a,"change",a,m),k&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(m)}a.display.selForContextMenu=null}function nd(a,b,c,d,e){if(d||(d=c),pa(d,c)<0){var f=d;d=c,c=f}"string"==typeof b&&(b=a.splitLines(b)),hd(a,{from:c,to:d,text:b,origin:e})}function od(a,b){if(!Pf(a,"scrollCursorIntoView")){var c=a.display,d=c.sizer.getBoundingClientRect(),e=null;if(b.top+d.top<0?e=!0:b.bottom+d.top>(window.innerHeight||document.documentElement.clientHeight)&&(e=!1),null!=e&&!l){var f=pg("div","\u200b",null,"position: absolute; top: "+(b.top-c.viewOffset-mb(a.display))+"px; height: "+(b.bottom-b.top+pb(a)+c.barHeight)+"px; left: "+b.left+"px; width: 2px;");a.display.lineSpace.appendChild(f),f.scrollIntoView(e),a.display.lineSpace.removeChild(f)}}}function pd(a,b,c,d){null==d&&(d=0);for(var e=0;5>e;e++){var f=!1,g=Lb(a,b),h=c&&c!=b?Lb(a,c):g,i=rd(a,Math.min(g.left,h.left),Math.min(g.top,h.top)-d,Math.max(g.left,h.left),Math.max(g.bottom,h.bottom)+d),j=a.doc.scrollTop,k=a.doc.scrollLeft;if(null!=i.scrollTop&&(Hc(a,i.scrollTop),Math.abs(a.doc.scrollTop-j)>1&&(f=!0)),null!=i.scrollLeft&&(Ic(a,i.scrollLeft),Math.abs(a.doc.scrollLeft-k)>1&&(f=!0)),!f)break}return g}function qd(a,b,c,d,e){var f=rd(a,b,c,d,e);null!=f.scrollTop&&Hc(a,f.scrollTop),null!=f.scrollLeft&&Ic(a,f.scrollLeft)}function rd(a,b,c,d,e){var f=a.display,g=Rb(a.display);0>c&&(c=0);var h=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:f.scroller.scrollTop,i=rb(a),j={};e-c>i&&(e=c+i);var k=a.doc.height+nb(f),l=g>c,m=e>k-g;if(h>c)j.scrollTop=l?0:c;else if(e>h+i){var n=Math.min(c,(m?k:e)-i);n!=h&&(j.scrollTop=n)}var o=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:f.scroller.scrollLeft,p=qb(a)-(a.options.fixedGutter?f.gutters.offsetWidth:0),q=d-b>p;return q&&(d=b+p),10>b?j.scrollLeft=0:o>b?j.scrollLeft=Math.max(0,b-(q?0:10)):d>p+o-3&&(j.scrollLeft=d+(q?0:10)-p),j}function sd(a,b,c){(null!=b||null!=c)&&ud(a),null!=b&&(a.curOp.scrollLeft=(null==a.curOp.scrollLeft?a.doc.scrollLeft:a.curOp.scrollLeft)+b),null!=c&&(a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+c)}function td(a){ud(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping||(c=b.ch?oa(b.line,b.ch-1):b,d=oa(b.line,b.ch+1)),a.curOp.scrollToPos={from:c,to:d,margin:a.options.cursorScrollMargin,isCursor:!0}}function ud(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;var c=Mb(a,b.from),d=Mb(a,b.to),e=rd(a,Math.min(c.left,d.left),Math.min(c.top,d.top)-b.margin,Math.max(c.right,d.right),Math.max(c.bottom,d.bottom)+b.margin);a.scrollTo(e.scrollLeft,e.scrollTop)}}function vd(a,b,c,d){var f,e=a.doc;null==c&&(c="add"),"smart"==c&&(e.mode.indent?f=lb(a,b):c="prev");var g=a.options.tabSize,h=ff(e,b),i=Zf(h.text,null,g);h.stateAfter&&(h.stateAfter=null);var k,j=h.text.match(/^\s*/)[0];if(d||/\S/.test(h.text)){if("smart"==c&&(k=e.mode.indent(f,h.text.slice(j.length),h.text),k==Uf||k>150)){if(!d)return;c="prev"}}else k=0,c="not";"prev"==c?k=b>e.first?Zf(ff(e,b-1).text,null,g):0:"add"==c?k=i+a.options.indentUnit:"subtract"==c?k=i-a.options.indentUnit:"number"==typeof c&&(k=i+c),k=Math.max(0,k); -var l="",m=0;if(a.options.indentWithTabs)for(var n=Math.floor(k/g);n;--n)m+=g,l+=" ";if(k>m&&(l+=ag(k-m)),l!=j)return nd(e,l,oa(b,0),oa(b,j.length),"+input"),h.stateAfter=null,!0;for(var n=0;n=0;b--)nd(a.doc,"",d[b].from,d[b].to,"+delete");td(a)})}function yd(a,b,c,d,e){function k(){var b=f+c;return b=a.first+a.size?j=!1:(f=b,i=ff(a,b))}function l(a){var b=(e?$g:_g)(i,g,c,!0);if(null==b){if(a||!k())return j=!1;g=e?(0>c?Sg:Rg)(i):0>c?i.text.length:0}else g=b;return!0}var f=b.line,g=b.ch,h=c,i=ff(a,f),j=!0;if("char"==d)l();else if("column"==d)l(!0);else if("word"==d||"group"==d)for(var m=null,n="group"==d,o=a.cm&&a.cm.getHelper(b,"wordChars"),p=!0;!(0>c)||l(!p);p=!1){var q=i.text.charAt(g)||"\n",r=lg(q,o)?"w":n&&"\n"==q?"n":!n||/\s/.test(q)?null:"p";if(!n||p||r||(r="s"),m&&m!=r){0>c&&(c=1,l());break}if(r&&(m=r),c>0&&!l(!p))break}var s=cb(a,oa(f,g),h,!0);return j||(s.hitSide=!0),s}function zd(a,b,c,d){var g,e=a.doc,f=b.left;if("page"==d){var h=Math.min(a.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);g=b.top+c*(h-(0>c?1.5:.5)*Rb(a.display))}else"line"==d&&(g=c>0?b.bottom+3:b.top-3);for(;;){var i=Ob(a,f,g);if(!i.outside)break;if(0>c?0>=g:g>=e.height){i.hitSide=!0;break}g+=5*c}return i}function Cd(a,b,c,d){v.defaults[a]=b,c&&(Bd[a]=d?function(a,b,d){d!=Dd&&c(a,b,d)}:c)}function Nd(a){for(var c,d,e,f,b=a.split(/-(?!$)/),a=b[b.length-1],g=0;g0||0==g&&f.clearWhenEmpty!==!1)return f;if(f.replacedWith&&(f.collapsed=!0,f.widgetNode=pg("span",[f.replacedWith],"CodeMirror-widget"),d.handleMouseEvents||f.widgetNode.setAttribute("cm-ignore-events","true"),d.insertLeft&&(f.widgetNode.insertLeft=!0)),f.collapsed){if(re(a,b.line,b,c,f)||b.line!=c.line&&re(a,c.line,b,c,f))throw new Error("Inserting collapsed marker partially overlapping an existing one");u=!0}f.addToHistory&&sf(a,{from:b,to:c,origin:"markText"},a.sel,NaN);var j,h=b.line,i=a.cm;if(a.iter(h,c.line+1,function(a){i&&f.collapsed&&!i.options.lineWrapping&&se(a)==i.display.maxLine&&(j=!0),f.collapsed&&h!=b.line&&jf(a,0),ce(a,new _d(f,h==b.line?b.ch:null,h==c.line?c.ch:null)),++h}),f.collapsed&&a.iter(b.line,c.line+1,function(b){we(a,b)&&jf(b,0)}),f.clearOnEnter&&Jf(f,"beforeCursorEnter",function(){f.clear()}),f.readOnly&&(t=!0,(a.history.done.length||a.history.undone.length)&&a.clearHistory()),f.collapsed&&(f.id=++Td,f.atomic=!0),i){if(j&&(i.curOp.updateMaxLine=!0),f.collapsed)ic(i,b.line,c.line+1);else if(f.className||f.title||f.startStyle||f.endStyle||f.css)for(var k=b.line;k<=c.line;k++)jc(i,k,"text");f.atomic&&ab(i.doc),Nf(i,"markerAdded",i,f)}return f}function Xd(a,b,c,d,e){d=hg(d),d.shared=!1;var f=[Vd(a,b,c,d,e)],g=f[0],h=d.widgetNode;return df(a,function(a){h&&(d.widgetNode=h.cloneNode(!0)),f.push(Vd(a,Oa(a,b),Oa(a,c),d,e));for(var i=0;i=b:f.to>b);(e||(e=[])).push(new _d(g,f.from,i?null:f.to))}}return e}function ee(a,b,c){if(a)for(var e,d=0;d=b:f.to>b);if(h||f.from==b&&"bookmark"==g.type&&(!c||f.marker.insertLeft)){var i=null==f.from||(g.inclusiveLeft?f.from<=b:f.from0&&h)for(var l=0;ll;++l)o.push(q);o.push(i)}return o}function ge(a){for(var b=0;b0)){var k=[i,1],l=pa(j.from,h.from),m=pa(j.to,h.to);(0>l||!g.inclusiveLeft&&!l)&&k.push({from:j.from,to:h.from}),(m>0||!g.inclusiveRight&&!m)&&k.push({from:h.to,to:j.to}),e.splice.apply(e,k),i+=k.length-1}}return e}function je(a){var b=a.markedSpans;if(b){for(var c=0;c=0&&0>=l||0>=k&&l>=0)&&(0>=k&&(pa(j.to,c)>0||i.marker.inclusiveRight&&e.inclusiveLeft)||k>=0&&(pa(j.from,d)<0||i.marker.inclusiveLeft&&e.inclusiveRight)))return!0}}}function se(a){for(var b;b=pe(a);)a=b.find(-1,!0).line;return a}function te(a){for(var b,c;b=qe(a);)a=b.find(1,!0).line,(c||(c=[])).push(a);return c}function ue(a,b){var c=ff(a,b),d=se(c);return c==d?b:kf(d)}function ve(a,b){if(b>a.lastLine())return b;var d,c=ff(a,b);if(!we(a,c))return b;for(;d=qe(c);)c=d.find(1,!0).line;return kf(c)+1}function we(a,b){var c=u&&b.markedSpans;if(c)for(var d,e=0;ee;e++){d&&(d[0]=v.innerMode(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw new Error("Mode "+a.name+" failed to advance stream.")}function Ie(a,b,c,d){function e(a){return{start:k.start,end:k.pos,string:k.current(),type:h||null,state:a?Jd(f.mode,j):j}}var h,f=a.doc,g=f.mode;b=Oa(f,b);var l,i=ff(f,b.line),j=lb(a,b.line,c),k=new Sd(i.text,a.options.tabSize);for(d&&(l=[]);(d||k.posa.options.maxHighlightLength?(h=!1,g&&Me(a,b,d,k.pos),k.pos=b.length,l=null):l=Fe(He(c,k,d,m),f),m){var n=m[0].name;n&&(l="m-"+(l?n+" "+l:n))}if(!h||j!=l){for(;ij;){var d=e[i];d>a&&e.splice(i,1,a,e[i+1],d),i+=2,j=Math.min(a,d)}if(b)if(h.opaque)e.splice(c,i-c,a,"cm-overlay "+b),i=c+2;else for(;i>c;c+=2){var f=e[c+1];e[c+1]=(f?f+" ":"")+"cm-overlay "+b}},f)}return{styles:e,classes:f.bgClass||f.textClass?f:null}}function Le(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=lb(a,kf(b)),e=Ke(a,b,b.text.length>a.options.maxHighlightLength?Jd(a.doc.mode,d):d);b.stateAfter=d,b.styles=e.styles,e.classes?b.styleClasses=e.classes:b.styleClasses&&(b.styleClasses=null),c===a.doc.frontier&&a.doc.frontier++}return b.styles}function Me(a,b,c,d){var e=a.doc.mode,f=new Sd(b,a.options.tabSize);for(f.start=f.pos=d||0,""==b&&Ge(e,c);!f.eol();)He(e,f,c),f.start=f.pos}function Pe(a,b){if(!a||/^\s*$/.test(a))return null;var c=b.addModeClass?Oe:Ne;return c[a]||(c[a]=a.replace(/\S+/g,"cm-$&"))}function Qe(a,b){var c=pg("span",null,null,f?"padding-right: .1px":null),e={pre:pg("pre",[c],"CodeMirror-line"),content:c,col:0,pos:0,cm:a,splitSpaces:(d||f)&&a.getOption("lineWrapping")};b.measure={};for(var g=0;g<=(b.rest?b.rest.length:0);g++){var i,h=g?b.rest[g-1]:b.line;e.pos=0,e.addToken=Se,Hg(a.display.measure)&&(i=nf(h))&&(e.addToken=Ue(e.addToken,i)),e.map=[];var j=b!=a.display.externalMeasured&&kf(h);We(h,e,Le(a,h,j)),h.styleClasses&&(h.styleClasses.bgClass&&(e.bgClass=yg(h.styleClasses.bgClass,e.bgClass||"")),h.styleClasses.textClass&&(e.textClass=yg(h.styleClasses.textClass,e.textClass||""))),0==e.map.length&&e.map.push(0,0,e.content.appendChild(Fg(a.display.measure))),0==g?(b.measure.map=e.map,b.measure.cache={}):((b.measure.maps||(b.measure.maps=[])).push(e.map),(b.measure.caches||(b.measure.caches=[])).push({}))}return f&&/\bcm-tab\b/.test(e.content.lastChild.className)&&(e.content.className="cm-tab-wrap-hack"),Lf(a,"renderLine",a,b.line,e.pre),e.pre.className&&(e.textClass=yg(e.pre.className,e.textClass||"")),e}function Re(a){var b=pg("span","\u2022","cm-invalidchar");return b.title="\\u"+a.charCodeAt(0).toString(16),b.setAttribute("aria-label",b.title),b}function Se(a,b,c,f,g,h,i){if(b){var j=a.splitSpaces?b.replace(/ {3,}/g,Te):b,k=a.cm.state.specialChars,l=!1;if(k.test(b))for(var m=document.createDocumentFragment(),n=0;;){k.lastIndex=n;var o=k.exec(b),p=o?o.index-n:b.length-n;if(p){var q=document.createTextNode(j.slice(n,n+p));d&&9>e?m.appendChild(pg("span",[q])):m.appendChild(q),a.map.push(a.pos,a.pos+p,q),a.col+=p,a.pos+=p}if(!o)break;if(n+=p+1," "==o[0]){var r=a.cm.options.tabSize,s=r-a.col%r,q=m.appendChild(pg("span",ag(s),"cm-tab"));q.setAttribute("role","presentation"),q.setAttribute("cm-text"," "),a.col+=s}else if("\r"==o[0]||"\n"==o[0]){var q=m.appendChild(pg("span","\r"==o[0]?"\u240d":"\u2424","cm-invalidchar"));q.setAttribute("cm-text",o[0]),a.col+=1}else{var q=a.cm.options.specialCharPlaceholder(o[0]);q.setAttribute("cm-text",o[0]),d&&9>e?m.appendChild(pg("span",[q])):m.appendChild(q),a.col+=1}a.map.push(a.pos,a.pos+1,q),a.pos++}else{a.col+=b.length;var m=document.createTextNode(j);a.map.push(a.pos,a.pos+b.length,m),d&&9>e&&(l=!0),a.pos+=b.length}if(c||f||g||l||i){var t=c||"";f&&(t+=f),g&&(t+=g);var u=pg("span",[m],t,i);return h&&(u.title=h),a.content.appendChild(u)}a.content.appendChild(m)}}function Te(a){for(var b=" ",c=0;cj&&m.from<=j)break}if(m.to>=k)return a(c,d,e,f,g,h,i);a(c,d.slice(0,m.to-j),e,f,null,h,i),f=null,d=d.slice(m.to-j),j=m.to}}}function Ve(a,b,c,d){var e=!d&&c.widgetNode;e&&a.map.push(a.pos,a.pos+b,e),!d&&a.cm.display.input.needsContentAttribute&&(e||(e=a.content.appendChild(document.createElement("span"))),e.setAttribute("cm-marker",c.id)),e&&(a.cm.display.input.setUneditable(e),a.content.appendChild(e)),a.pos+=b}function We(a,b,c){var d=a.markedSpans,e=a.text,f=0;if(d)for(var k,l,n,o,p,q,r,h=e.length,i=0,g=1,j="",m=0;;){if(m==i){n=o=p=q=l="",r=null,m=1/0;for(var s=[],t=0;ti||v.collapsed&&u.to==i&&u.from==i)?(null!=u.to&&u.to!=i&&m>u.to&&(m=u.to,o=""),v.className&&(n+=" "+v.className),v.css&&(l=v.css),v.startStyle&&u.from==i&&(p+=" "+v.startStyle),v.endStyle&&u.to==m&&(o+=" "+v.endStyle),v.title&&!q&&(q=v.title),v.collapsed&&(!r||ne(r.marker,v)<0)&&(r=u)):u.from>i&&m>u.from&&(m=u.from)}if(r&&(r.from||0)==i){if(Ve(b,(null==r.to?h+1:r.to)-i,r.marker,null==r.from),null==r.to)return;r.to==i&&(r=!1)}if(!r&&s.length)for(var t=0;t=h)break;for(var w=Math.min(h,m);;){if(j){var x=i+j.length;if(!r){var y=x>w?j.slice(0,w-i):j;b.addToken(b,y,k?k+n:n,p,i+y.length==m?o:"",q,l)}if(x>=w){j=j.slice(w-i),i=w;break}i=x,p=""}j=e.slice(f,f=c[g++]),k=Pe(c[g++],b.cm.options)}}else for(var g=1;gc;++c)f.push(new Ce(j[c],e(c),d));return f}var h=b.from,i=b.to,j=b.text,k=ff(a,h.line),l=ff(a,i.line),m=bg(j),n=e(j.length-1),o=i.line-h.line;if(b.full)a.insert(0,g(0,j.length)),a.remove(j.length,a.size-j.length);else if(Xe(a,b)){var p=g(0,j.length-1);f(l,l.text,n),o&&a.remove(h.line,o),p.length&&a.insert(h.line,p)}else if(k==l)if(1==j.length)f(k,k.text.slice(0,h.ch)+m+k.text.slice(i.ch),n);else{var p=g(1,j.length-1);p.push(new Ce(m+k.text.slice(i.ch),n,d)),f(k,k.text.slice(0,h.ch)+j[0],e(0)),a.insert(h.line+1,p)}else if(1==j.length)f(k,k.text.slice(0,h.ch)+j[0]+l.text.slice(i.ch),e(0)),a.remove(h.line+1,o);else{f(k,k.text.slice(0,h.ch)+j[0],e(0)),f(l,m+l.text.slice(i.ch),n);var p=g(1,j.length-1);o>1&&a.remove(h.line+1,o-1),a.insert(h.line+1,p)}Nf(a,"change",a,b)}function Ze(a){this.lines=a,this.parent=null;for(var b=0,c=0;bb||b>=a.size)throw new Error("There is no line "+(b+a.first)+" in the document.");for(var c=a;!c.lines;)for(var d=0;;++d){var e=c.children[d],f=e.chunkSize();if(f>b){c=e;break}b-=f}return c.lines[b]}function gf(a,b,c){var d=[],e=b.line;return a.iter(b.line,c.line+1,function(a){var f=a.text;e==c.line&&(f=f.slice(0,c.ch)),e==b.line&&(f=f.slice(b.ch)),d.push(f),++e}),d}function hf(a,b,c){var d=[];return a.iter(b,c,function(a){d.push(a.text)}),d}function jf(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height+=c}function kf(a){if(null==a.parent)return null;for(var b=a.parent,c=dg(b.lines,a),d=b.parent;d;b=d,d=d.parent)for(var e=0;d.children[e]!=b;++e)c+=d.children[e].chunkSize();return c+b.first}function lf(a,b){var c=a.first;a:do{for(var d=0;db){a=e;continue a}b-=f,c+=e.chunkSize()}return c}while(!a.lines);for(var d=0;db)break;b-=h}return c+d}function mf(a){a=se(a);for(var b=0,c=a.parent,d=0;d1&&!a.done[a.done.length-2].ranges?(a.done.pop(),bg(a.done)):void 0}function sf(a,b,c,d){var e=a.history;e.undone.length=0;var g,f=+new Date;if((e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&("+"==b.origin.charAt(0)&&a.cm&&e.lastModTime>f-a.cm.options.historyEventDelay||"*"==b.origin.charAt(0)))&&(g=rf(e,e.lastOp==d))){var h=bg(g.changes);0==pa(b.from,b.to)&&0==pa(b.from,h.to)?h.to=bd(b):g.changes.push(pf(a,b))}else{var i=bg(e.done);for(i&&i.ranges||vf(a.sel,e.done),g={changes:[pf(a,b)],generation:e.generation},e.done.push(g);e.done.length>e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift()}e.done.push(c),e.generation=++e.maxGeneration,e.lastModTime=e.lastSelTime=f,e.lastOp=e.lastSelOp=d,e.lastOrigin=e.lastSelOrigin=b.origin,h||Lf(a,"historyAdded")}function tf(a,b,c,d){var e=b.charAt(0);return"*"==e||"+"==e&&c.ranges.length==d.ranges.length&&c.somethingSelected()==d.somethingSelected()&&new Date-a.history.lastSelTime<=(a.cm?a.cm.options.historyEventDelay:500)}function uf(a,b,c,d){var e=a.history,f=d&&d.origin;c==e.lastSelOp||f&&e.lastSelOrigin==f&&(e.lastModTime==e.lastSelTime&&e.lastOrigin==f||tf(a,f,bg(e.done),b))?e.done[e.done.length-1]=b:vf(b,e.done),e.lastSelTime=+new Date,e.lastSelOrigin=f,e.lastSelOp=c,d&&d.clearRedo!==!1&&qf(e.undone)}function vf(a,b){var c=bg(b);c&&c.ranges&&c.equals(a)||b.push(a)}function wf(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+a.size,d),function(c){c.markedSpans&&((e||(e=b["spans_"+a.id]={}))[f]=c.markedSpans),++f})}function xf(a){if(!a)return null;for(var c,b=0;b-1&&(bg(h)[l]=j[l],delete j[l])}}}return e}function Af(a,b,c,d){c0}function Sf(a){a.prototype.on=function(a,b){Jf(this,a,b)},a.prototype.off=function(a,b){Kf(this,a,b)}}function Yf(){this.id=null}function $f(a,b,c){for(var d=0,e=0;;){var f=a.indexOf(" ",d);-1==f&&(f=a.length);var g=f-d;if(f==a.length||e+g>=b)return d+Math.min(g,b-e);if(e+=f-d,e+=c-e%c,d=f+1,e>=b)return d}}function ag(a){for(;_f.length<=a;)_f.push(bg(_f)+" ");return _f[a]}function bg(a){return a[a.length-1]}function dg(a,b){for(var c=0;c-1&&kg(a)?!0:b.test(a):kg(a)}function mg(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;return!0}function og(a){return a.charCodeAt(0)>=768&&ng.test(a)}function pg(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=c),d&&(e.style.cssText=d),"string"==typeof b)e.appendChild(document.createTextNode(b));else if(b)for(var f=0;f0;--b)a.removeChild(a.firstChild);return a}function sg(a,b){return rg(a).appendChild(b)}function ug(){for(var a=document.activeElement;a&&a.root&&a.root.activeElement;)a=a.root.activeElement;return a}function vg(a){return new RegExp("(^|\\s)"+a+"(?:$|\\s)\\s*")}function yg(a,b){for(var c=a.split(" "),d=0;d2&&!(d&&8>e))}var c=Eg?pg("span","\u200b"):pg("span","\xa0",null,"display: inline-block; width: 1px; margin-right: -1px");return c.setAttribute("cm-text",""),c}function Hg(a){if(null!=Gg)return Gg;var b=sg(a,document.createTextNode("A\u062eA")),c=qg(b,0,1).getBoundingClientRect();if(!c||c.left==c.right)return!1;var d=qg(b,1,2).getBoundingClientRect();return Gg=d.right-c.right<3}function Mg(a){if(null!=Lg)return Lg;var b=sg(a,pg("span","x")),c=b.getBoundingClientRect(),d=qg(b,0,1).getBoundingClientRect();return Lg=Math.abs(c.left-d.left)>1}function Og(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=!1,f=0;fb||b==c&&g.to==b)&&(d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?"rtl":"ltr"),e=!0)}e||d(b,c,"ltr")}function Pg(a){return a.level%2?a.to:a.from}function Qg(a){return a.level%2?a.from:a.to}function Rg(a){var b=nf(a);return b?Pg(b[0]):0}function Sg(a){var b=nf(a);return b?Qg(bg(b)):a.text.length}function Tg(a,b){var c=ff(a.doc,b),d=se(c);d!=c&&(b=kf(d));var e=nf(d),f=e?e[0].level%2?Sg(d):Rg(d):0;return oa(b,f)}function Ug(a,b){for(var c,d=ff(a.doc,b);c=qe(d);)d=c.find(1,!0).line,b=null;var e=nf(d),f=e?e[0].level%2?Rg(d):Sg(d):d.text.length;return oa(null==b?kf(d):b,f)}function Vg(a,b){var c=Tg(a,b.line),d=ff(a.doc,c.line),e=nf(d);if(!e||0==e[0].level){var f=Math.max(0,d.text.search(/\S/)),g=b.line==c.line&&b.ch<=f&&b.ch;return oa(c.line,g?0:f)}return c}function Wg(a,b,c){var d=a[0].level;return b==d?!0:c==d?!1:c>b}function Yg(a,b){Xg=null;for(var d,c=0;cb)return c;if(e.from==b||e.to==b){if(null!=d)return Wg(a,e.level,a[d].level)?(e.from!=e.to&&(Xg=d),c):(e.from!=e.to&&(Xg=c),d);d=c}}return d}function Zg(a,b,c,d){if(!d)return b+c;do b+=c;while(b>0&&og(a.text.charAt(b)));return b}function $g(a,b,c,d){var e=nf(a);if(!e)return _g(a,b,c,d);for(var f=Yg(e,b),g=e[f],h=Zg(a,b,g.level%2?-c:c,d);;){if(h>g.from&&h0==g.level%2?g.to:g.from);if(g=e[f+=c],!g)return null;h=c>0==g.level%2?Zg(a,g.to,-1,d):Zg(a,g.from,1,d)}}function _g(a,b,c,d){var e=b+c;if(d)for(;e>0&&og(a.text.charAt(e));)e+=c;return 0>e||e>a.text.length?null:e}var a=/gecko\/\d/i.test(navigator.userAgent),b=/MSIE \d/.test(navigator.userAgent),c=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),d=b||c,e=d&&(b?document.documentMode||6:c[1]),f=/WebKit\//.test(navigator.userAgent),g=f&&/Qt\/\d+\.\d+/.test(navigator.userAgent),h=/Chrome\//.test(navigator.userAgent),i=/Opera\//.test(navigator.userAgent),j=/Apple Computer/.test(navigator.vendor),k=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),l=/PhantomJS/.test(navigator.userAgent),m=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),n=m||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),o=m||/Mac/.test(navigator.platform),p=/win/i.test(navigator.platform),q=i&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);q&&(q=Number(q[1])),q&&q>=15&&(i=!1,f=!0);var r=o&&(g||i&&(null==q||12.11>q)),s=a||d&&e>=9,t=!1,u=!1;K.prototype=hg({update:function(a){var b=a.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;if(c){this.vert.style.display="block",this.vert.style.bottom=b?d+"px":"0";var e=a.viewHeight-(b?d:0);this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+e)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(b){this.horiz.style.display="block",this.horiz.style.right=c?d+"px":"0",this.horiz.style.left=a.barLeft+"px";var f=a.viewWidth-a.barLeft-(c?d:0);this.horiz.firstChild.style.width=a.scrollWidth-a.clientWidth+f+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedOverlay&&a.clientHeight>0&&(0==d&&this.overlayHack(),this.checkedOverlay=!0),{right:c?d:0,bottom:b?d:0}},setScrollLeft:function(a){this.horiz.scrollLeft!=a&&(this.horiz.scrollLeft=a)},setScrollTop:function(a){this.vert.scrollTop!=a&&(this.vert.scrollTop=a)},overlayHack:function(){var a=o&&!k?"12px":"18px";this.horiz.style.minHeight=this.vert.style.minWidth=a;var b=this,c=function(a){Hf(a)!=b.vert&&Hf(a)!=b.horiz&&dc(b.cm,uc)(a)};Jf(this.vert,"mousedown",c),Jf(this.horiz,"mousedown",c)},clear:function(){var a=this.horiz.parentNode;a.removeChild(this.horiz),a.removeChild(this.vert)}},K.prototype),L.prototype=hg({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},L.prototype),v.scrollbarModel={"native":K,"null":L},U.prototype.signal=function(a,b){Rf(a,b)&&this.events.push(arguments)},U.prototype.finish=function(){for(var a=0;a=9&&b.hasSelection&&(b.hasSelection=null),b.poll()}),Jf(g,"paste",function(a){return xa(a,c)?!0:(c.state.pasteIncoming=!0,void b.fastPoll())}),Jf(g,"cut",h),Jf(g,"copy",h),Jf(a.scroller,"paste",function(d){ -sc(a,d)||(c.state.pasteIncoming=!0,b.focus())}),Jf(a.lineSpace,"selectstart",function(b){sc(a,b)||Df(b)}),Jf(g,"compositionstart",function(){var a=c.getCursor("from");b.composing={start:a,range:c.markText(a,c.getCursor("to"),{className:"CodeMirror-composing"})}}),Jf(g,"compositionend",function(){b.composing&&(b.poll(),b.composing.range.clear(),b.composing=null)})},prepareSelection:function(){var a=this.cm,b=a.display,c=a.doc,d=eb(a);if(a.options.moveInputWithCursor){var e=Lb(a,c.sel.primary().head,"div"),f=b.wrapper.getBoundingClientRect(),g=b.lineDiv.getBoundingClientRect();d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-10,e.top+g.top-f.top)),d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,e.left+g.left-f.left))}return d},showSelection:function(a){var b=this.cm,c=b.display;sg(c.cursorDiv,a.cursors),sg(c.selectionDiv,a.selection),null!=a.teTop&&(this.wrapper.style.top=a.teTop+"px",this.wrapper.style.left=a.teLeft+"px")},reset:function(a){if(!this.contextMenuPending){var b,c,f=this.cm,g=f.doc;if(f.somethingSelected()){this.prevInput="";var h=g.sel.primary();b=Kg&&(h.to().line-h.from().line>100||(c=f.getSelection()).length>1e3);var i=b?"-":c||f.getSelection();this.textarea.value=i,f.state.focused&&cg(this.textarea),d&&e>=9&&(this.hasSelection=i)}else a||(this.prevInput=this.textarea.value="",d&&e>=9&&(this.hasSelection=null));this.inaccurateSelection=b}},getField:function(){return this.textarea},supportsTouch:function(){return!1},focus:function(){if("nocursor"!=this.cm.options.readOnly&&(!n||ug()!=this.textarea))try{this.textarea.focus()}catch(a){}},blur:function(){this.textarea.blur()},resetPosition:function(){this.wrapper.style.top=this.wrapper.style.left=0},receivedFocus:function(){this.slowPoll()},slowPoll:function(){var a=this;a.pollingFast||a.polling.set(this.cm.options.pollInterval,function(){a.poll(),a.cm.state.focused&&a.slowPoll()})},fastPoll:function(){function c(){var d=b.poll();d||a?(b.pollingFast=!1,b.slowPoll()):(a=!0,b.polling.set(60,c))}var a=!1,b=this;b.pollingFast=!0,b.polling.set(20,c)},poll:function(){var a=this.cm,b=this.textarea,c=this.prevInput;if(this.contextMenuPending||!a.state.focused||Jg(b)&&!c&&!this.composing||ua(a)||a.options.disableInput||a.state.keySeq)return!1;var f=b.value;if(f==c&&!a.somethingSelected())return!1;if(d&&e>=9&&this.hasSelection===f||o&&/[\uf700-\uf7ff]/.test(f))return a.display.input.reset(),!1;if(a.doc.sel==a.display.selForContextMenu){var g=f.charCodeAt(0);if(8203!=g||c||(c="\u200b"),8666==g)return this.reset(),this.cm.execCommand("undo")}for(var h=0,i=Math.min(c.length,f.length);i>h&&c.charCodeAt(h)==f.charCodeAt(h);)++h;var j=this;return cc(a,function(){wa(a,f.slice(h),c.length-h,null,j.composing?"*compose":null),f.length>1e3||f.indexOf("\n")>-1?b.value=j.prevInput="":j.prevInput=f,j.composing&&(j.composing.range.clear(),j.composing.range=a.markText(j.composing.start,a.getCursor("to"),{className:"CodeMirror-composing"}))}),!0},ensurePolled:function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},onKeyPress:function(){d&&e>=9&&(this.hasSelection=null),this.fastPoll()},onContextMenu:function(a){function o(){if(null!=h.selectionStart){var a=c.somethingSelected(),d="\u200b"+(a?h.value:"");h.value="\u21da",h.value=d,b.prevInput=a?"":"\u200b",h.selectionStart=1,h.selectionEnd=d.length,g.selForContextMenu=c.doc.sel}}function p(){if(b.contextMenuPending=!1,b.wrapper.style.position="relative",h.style.cssText=m,d&&9>e&&g.scrollbars.setScrollTop(g.scroller.scrollTop=k),null!=h.selectionStart){(!d||d&&9>e)&&o();var a=0,f=function(){g.selForContextMenu==c.doc.sel&&0==h.selectionStart&&h.selectionEnd>0&&"\u200b"==b.prevInput?dc(c,Ld.selectAll)(c):a++<10?g.detectingSelectAll=setTimeout(f,500):g.input.reset()};g.detectingSelectAll=setTimeout(f,200)}}var b=this,c=b.cm,g=c.display,h=b.textarea,j=tc(c,a),k=g.scroller.scrollTop;if(j&&!i){var l=c.options.resetSelectionOnContextMenu;l&&-1==c.doc.sel.contains(j)&&dc(c,Za)(c.doc,Ma(j),Vf);var m=h.style.cssText;if(b.wrapper.style.position="absolute",h.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(a.clientY-5)+"px; left: "+(a.clientX-5)+"px; z-index: 1000; background: "+(d?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",f)var n=window.scrollY;if(g.input.focus(),f&&window.scrollTo(null,n),g.input.reset(),c.somethingSelected()||(h.value=b.prevInput=" "),b.contextMenuPending=!0,g.selForContextMenu=c.doc.sel,clearTimeout(g.detectingSelectAll),d&&e>=9&&o(),s){Gf(a);var q=function(){Kf(window,"mouseup",q),setTimeout(p,20)};Jf(window,"mouseup",q)}else setTimeout(p,50)}},setUneditable:fg,needsContentAttribute:!1},Ba.prototype),Da.prototype=hg({init:function(a){function e(a){if(c.somethingSelected())va=c.getSelections(),"cut"==a.type&&c.replaceSelection("",null,"cut");else{if(!c.options.lineWiseCopyCut)return;var b=za(c);va=b.text,"cut"==a.type&&c.operation(function(){c.setSelections(b.ranges,0,Vf),c.replaceSelection("",null,"cut")})}if(a.clipboardData&&!m)a.preventDefault(),a.clipboardData.clearData(),a.clipboardData.setData("text/plain",va.join("\n"));else{var d=Ca(),e=d.firstChild;c.display.lineSpace.insertBefore(d,c.display.lineSpace.firstChild),e.value=va.join("\n");var f=document.activeElement;cg(e),setTimeout(function(){c.display.lineSpace.removeChild(d),f.focus()},50)}}var b=this,c=b.cm,d=b.div=a.lineDiv;d.contentEditable="true",Aa(d),Jf(d,"paste",function(a){xa(a,c)}),Jf(d,"compositionstart",function(a){var d=a.data;if(b.composing={sel:c.doc.sel,data:d,startData:d},d){var e=c.doc.sel.primary(),f=c.getLine(e.head.line),g=f.indexOf(d,Math.max(0,e.head.ch-d.length));g>-1&&g<=e.head.ch&&(b.composing.sel=Ma(oa(e.head.line,g),oa(e.head.line,g+d.length)))}}),Jf(d,"compositionupdate",function(a){b.composing.data=a.data}),Jf(d,"compositionend",function(a){var c=b.composing;c&&(a.data==c.startData||/\u200b/.test(a.data)||(c.data=a.data),setTimeout(function(){c.handled||b.applyComposition(c),b.composing==c&&(b.composing=null)},50))}),Jf(d,"touchstart",function(){b.forceCompositionEnd()}),Jf(d,"input",function(){b.composing||b.pollContent()||cc(b.cm,function(){ic(c)})}),Jf(d,"copy",e),Jf(d,"cut",e)},prepareSelection:function(){var a=eb(this.cm,!1);return a.focus=this.cm.state.focused,a},showSelection:function(a){a&&this.cm.display.view.length&&(a.focus&&this.showPrimarySelection(),this.showMultipleSelections(a))},showPrimarySelection:function(){var b=window.getSelection(),c=this.cm.doc.sel.primary(),d=Ga(this.cm,b.anchorNode,b.anchorOffset),e=Ga(this.cm,b.focusNode,b.focusOffset);if(!d||d.bad||!e||e.bad||0!=pa(sa(d,e),c.from())||0!=pa(ra(d,e),c.to())){var f=Ea(this.cm,c.from()),g=Ea(this.cm,c.to());if(f||g){var h=this.cm.display.view,i=b.rangeCount&&b.getRangeAt(0);if(f){if(!g){var j=h[h.length-1].measure,k=j.maps?j.maps[j.maps.length-1]:j.map;g={node:k[k.length-1],offset:k[k.length-2]-k[k.length-3]}}}else f={node:h[0].measure.map[2],offset:0};try{var l=qg(f.node,f.offset,g.offset,g.node)}catch(m){}l&&(b.removeAllRanges(),b.addRange(l),i&&null==b.anchorNode?b.addRange(i):a&&this.startGracePeriod()),this.rememberSelection()}}},startGracePeriod:function(){var a=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){a.gracePeriod=!1,a.selectionChanged()&&a.cm.operation(function(){a.cm.curOp.selectionChanged=!0})},20)},showMultipleSelections:function(a){sg(this.cm.display.cursorDiv,a.cursors),sg(this.cm.display.selectionDiv,a.selection)},rememberSelection:function(){var a=window.getSelection();this.lastAnchorNode=a.anchorNode,this.lastAnchorOffset=a.anchorOffset,this.lastFocusNode=a.focusNode,this.lastFocusOffset=a.focusOffset},selectionInEditor:function(){var a=window.getSelection();if(!a.rangeCount)return!1;var b=a.getRangeAt(0).commonAncestorContainer;return tg(this.div,b)},focus:function(){"nocursor"!=this.cm.options.readOnly&&this.div.focus()},blur:function(){this.div.blur()},getField:function(){return this.div},supportsTouch:function(){return!0},receivedFocus:function(){function b(){a.cm.state.focused&&(a.pollSelection(),a.polling.set(a.cm.options.pollInterval,b))}var a=this;this.selectionInEditor()?this.pollSelection():cc(this.cm,function(){a.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,b)},selectionChanged:function(){var a=window.getSelection();return a.anchorNode!=this.lastAnchorNode||a.anchorOffset!=this.lastAnchorOffset||a.focusNode!=this.lastFocusNode||a.focusOffset!=this.lastFocusOffset},pollSelection:function(){if(!this.composing&&!this.gracePeriod&&this.selectionChanged()){var a=window.getSelection(),b=this.cm;this.rememberSelection();var c=Ga(b,a.anchorNode,a.anchorOffset),d=Ga(b,a.focusNode,a.focusOffset);c&&d&&cc(b,function(){Za(b.doc,Ma(c,d),Vf),(c.bad||d.bad)&&(b.curOp.selectionChanged=!0)})}},pollContent:function(){var a=this.cm,b=a.display,c=a.doc.sel.primary(),d=c.from(),e=c.to();if(d.lineb.viewTo-1)return!1;var f;if(d.line==b.viewFrom||0==(f=lc(a,d.line)))var g=kf(b.view[0].line),h=b.view[0].node;else var g=kf(b.view[f].line),h=b.view[f-1].node.nextSibling;var i=lc(a,e.line);if(i==b.view.length-1)var j=b.viewTo-1,k=b.lineDiv.lastChild;else var j=kf(b.view[i+1].line)-1,k=b.view[i+1].node.previousSibling;for(var l=a.doc.splitLines(Ia(a,h,k,g,j)),m=gf(a.doc,oa(g,0),oa(j,ff(a.doc,j).text.length));l.length>1&&m.length>1;)if(bg(l)==bg(m))l.pop(),m.pop(),j--;else{if(l[0]!=m[0])break;l.shift(),m.shift(),g++}for(var n=0,o=0,p=l[0],q=m[0],r=Math.min(p.length,q.length);r>n&&p.charCodeAt(n)==q.charCodeAt(n);)++n;for(var s=bg(l),t=bg(m),u=Math.min(s.length-(1==l.length?n:0),t.length-(1==m.length?n:0));u>o&&s.charCodeAt(s.length-o-1)==t.charCodeAt(t.length-o-1);)++o;l[l.length-1]=s.slice(0,s.length-o),l[0]=l[0].slice(n);var v=oa(g,n),w=oa(j,m.length?bg(m).length-o:0);return l.length>1||l[0]||pa(v,w)?(nd(a.doc,l,v,w,"+input"),!0):void 0},ensurePolled:function(){this.forceCompositionEnd()},reset:function(){this.forceCompositionEnd()},forceCompositionEnd:function(){this.composing&&!this.composing.handled&&(this.applyComposition(this.composing),this.composing.handled=!0,this.div.blur(),this.div.focus())},applyComposition:function(a){a.data&&a.data!=a.startData&&dc(this.cm,wa)(this.cm,a.data,0,a.sel)},setUneditable:function(a){a.setAttribute("contenteditable","false")},onKeyPress:function(a){a.preventDefault(),dc(this.cm,wa)(this.cm,String.fromCharCode(null==a.charCode?a.keyCode:a.charCode),0)},onContextMenu:fg,resetPosition:fg,needsContentAttribute:!0},Da.prototype),v.inputStyles={textarea:Ba,contenteditable:Da},Ja.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(a){if(a==this)return!0;if(a.primIndex!=this.primIndex||a.ranges.length!=this.ranges.length)return!1;for(var b=0;b=0&&pa(a,d.to())<=0)return c}return-1}},Ka.prototype={from:function(){return sa(this.anchor,this.head)},to:function(){return ra(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var Qb,vc,wc,zb={left:0,right:0,top:0,bottom:0},Tb=null,Ub=0,Cc=0,Jc=0,Kc=null;d?Kc=-.53:a?Kc=15:h?Kc=-.7:j&&(Kc=-1/3);var Lc=function(a){var b=a.wheelDeltaX,c=a.wheelDeltaY;return null==b&&a.detail&&a.axis==a.HORIZONTAL_AXIS&&(b=a.detail),null==c&&a.detail&&a.axis==a.VERTICAL_AXIS?c=a.detail:null==c&&(c=a.wheelDelta),{x:b,y:c}};v.wheelEventPixels=function(a){var b=Lc(a);return b.x*=Kc,b.y*=Kc,b};var Pc=new Yf,Tc=null,bd=v.changeEnd=function(a){return a.text?oa(a.from.line+a.text.length-1,bg(a.text).length+(1==a.text.length?a.from.ch:0)):a.to};v.prototype={constructor:v,focus:function(){window.focus(),this.display.input.focus()},setOption:function(a,b){var c=this.options,d=c[a];(c[a]!=b||"mode"==a)&&(c[a]=b,Bd.hasOwnProperty(a)&&dc(this,Bd[a])(this,b,d))},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?"push":"unshift"](Rd(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;cc&&(vd(this,e.head.line,a,!0),c=e.head.line,d==this.doc.sel.primIndex&&td(this));else{var f=e.from(),g=e.to(),h=Math.max(c,f.line);c=Math.min(this.lastLine(),g.line-(g.ch?0:1))+1;for(var i=h;c>i;++i)vd(this,i,a);var j=this.doc.sel.ranges;0==f.ch&&b.length==j.length&&j[d].from().ch>0&&Va(this.doc,d,new Ka(f,j[d].to()),Vf)}}}),getTokenAt:function(a,b){return Ie(this,a,b)},getLineTokens:function(a,b){return Ie(this,oa(a),b,!0)},getTokenTypeAt:function(a){a=Oa(this.doc,a);var f,b=Le(this,ff(this.doc,a.line)),c=0,d=(b.length-1)/2,e=a.ch;if(0==e)f=b[2];else for(;;){var g=c+d>>1;if((g?b[2*g-1]:0)>=e)d=g;else{if(!(b[2*g+1]h?f:0==h?null:f.slice(0,h-1)},getModeAt:function(a){var b=this.doc.mode;return b.innerMode?v.innerMode(b,this.getTokenAt(a).state).mode:b},getHelper:function(a,b){return this.getHelpers(a,b)[0]},getHelpers:function(a,b){var c=[];if(!Id.hasOwnProperty(b))return c;var d=Id[b],e=this.getModeAt(a);if("string"==typeof e[b])d[e[b]]&&c.push(d[e[b]]);else if(e[b])for(var f=0;fe&&(a=e,c=!0),d=ff(this.doc,a)}else d=a;return Ib(this,d,{top:0,left:0},b||"page").top+(c?this.doc.height-mf(d):0)},defaultTextHeight:function(){return Rb(this.display)},defaultCharWidth:function(){return Sb(this.display)},setGutterMarker:ec(function(a,b,c){return wd(this.doc,a,"gutter",function(a){var d=a.gutterMarkers||(a.gutterMarkers={});return d[b]=c,!c&&mg(d)&&(a.gutterMarkers=null),!0})}),clearGutter:ec(function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){c.gutterMarkers&&c.gutterMarkers[a]&&(c.gutterMarkers[a]=null,jc(b,d,"gutter"),mg(c.gutterMarkers)&&(c.gutterMarkers=null)),++d})}),lineInfo:function(a){if("number"==typeof a){if(!Qa(this.doc,a))return null;var b=a;if(a=ff(this.doc,a),!a)return null}else{var b=kf(a);if(null==b)return null}return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=Lb(this,Oa(this.doc,a));var g=a.bottom,h=a.left;if(b.style.position="absolute",b.setAttribute("cm-ignore-events","true"),this.display.input.setUneditable(b),f.sizer.appendChild(b),"over"==d)g=a.top;else if("above"==d||"near"==d){var i=Math.max(f.wrapper.clientHeight,this.doc.height),j=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);("above"==d||a.bottom+b.offsetHeight>i)&&a.top>b.offsetHeight?g=a.top-b.offsetHeight:a.bottom+b.offsetHeight<=i&&(g=a.bottom),h+b.offsetWidth>j&&(h=j-b.offsetWidth)}b.style.top=g+"px",b.style.left=b.style.right="","right"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right="0px"):("left"==e?h=0:"middle"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+"px"),c&&qd(this,h,g,h+b.offsetWidth,g+b.offsetHeight)},triggerOnKeyDown:ec(Uc),triggerOnKeyPress:ec(Xc),triggerOnKeyUp:Wc,execCommand:function(a){return Ld.hasOwnProperty(a)?Ld[a].call(null,this):void 0},triggerElectric:ec(function(a){ya(this,a)}),findPosH:function(a,b,c,d){var e=1;0>b&&(e=-1,b=-b);for(var f=0,g=Oa(this.doc,a);b>f&&(g=yd(this.doc,g,e,c,d),!g.hitSide);++f);return g},moveH:ec(function(a,b){var c=this;c.extendSelectionsBy(function(d){return c.display.shift||c.doc.extend||d.empty()?yd(c.doc,d.head,a,b,c.options.rtlMoveVisually):0>a?d.from():d.to()},Xf)}),deleteH:ec(function(a,b){var c=this.doc.sel,d=this.doc;c.somethingSelected()?d.replaceSelection("",null,"+delete"):xd(this,function(c){var e=yd(d,c.head,a,b,!1);return 0>a?{from:e,to:c.head}:{from:c.head,to:e}})}),findPosV:function(a,b,c,d){var e=1,f=d;0>b&&(e=-1,b=-b);for(var g=0,h=Oa(this.doc,a);b>g;++g){var i=Lb(this,h,"div");if(null==f?f=i.left:i.left=f,h=zd(this,i,e,c),h.hitSide)break}return h},moveV:ec(function(a,b){var c=this,d=this.doc,e=[],f=!c.display.shift&&!d.extend&&d.sel.somethingSelected();if(d.extendSelectionsBy(function(g){if(f)return 0>a?g.from():g.to();var h=Lb(c,g.head,"div");null!=g.goalColumn&&(h.left=g.goalColumn),e.push(h.left);var i=zd(c,h,a,b);return"page"==b&&g==d.sel.primary()&&sd(c,null,Kb(c,i,"div").top-h.top),i},Xf),e.length)for(var g=0;g0&&h(c.charAt(d-1));)--d;for(;e.5)&&B(this),Lf(this,"refresh",this)}),swapDoc:ec(function(a){var b=this.doc;return b.cm=null,ef(this,a),Fb(this),this.display.input.reset(),this.scrollTo(a.scrollLeft,a.scrollTop),this.curOp.forceScroll=!0,Nf(this,"swapDoc",this,b),b}),getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Sf(v);var Ad=v.defaults={},Bd=v.optionHandlers={},Dd=v.Init={toString:function(){return"CodeMirror.Init"}};Cd("value","",function(a,b){a.setValue(b)},!0),Cd("mode",null,function(a,b){a.doc.modeOption=b,x(a)},!0),Cd("indentUnit",2,x,!0),Cd("indentWithTabs",!1),Cd("smartIndent",!0),Cd("tabSize",4,function(a){y(a),Fb(a),ic(a)},!0),Cd("lineSeparator",null,function(a,b){if(a.doc.lineSep=b,b){var c=[],d=a.doc.first;a.doc.iter(function(a){for(var e=0;;){var f=a.text.indexOf(b,e);if(-1==f)break;e=f+b.length,c.push(oa(d,f))}d++});for(var e=c.length-1;e>=0;e--)nd(a.doc,b,c[e],oa(c[e].line,c[e].ch+b.length))}}),Cd("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(a,b,c){a.state.specialChars=new RegExp(b.source+(b.test(" ")?"":"| "),"g"),c!=v.Init&&a.refresh()}),Cd("specialCharPlaceholder",Re,function(a){a.refresh()},!0),Cd("electricChars",!0),Cd("inputStyle",n?"contenteditable":"textarea",function(){throw new Error("inputStyle can not (yet) be changed in a running editor")},!0),Cd("rtlMoveVisually",!p),Cd("wholeLineUpdateBefore",!0),Cd("theme","default",function(a){C(a),D(a)},!0),Cd("keyMap","default",function(a,b,c){var d=Rd(b),e=c!=v.Init&&Rd(c);e&&e.detach&&e.detach(a,d),d.attach&&d.attach(a,e||null)}),Cd("extraKeys",null),Cd("lineWrapping",!1,z,!0),Cd("gutters",[],function(a){I(a.options),D(a)},!0),Cd("fixedGutter",!0,function(a,b){a.display.gutters.style.left=b?T(a.display)+"px":"0",a.refresh()},!0),Cd("coverGutterNextToScrollbar",!1,function(a){N(a)},!0),Cd("scrollbarStyle","native",function(a){M(a),N(a),a.display.scrollbars.setScrollTop(a.doc.scrollTop),a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)},!0),Cd("lineNumbers",!1,function(a){I(a.options),D(a)},!0),Cd("firstLineNumber",1,D,!0),Cd("lineNumberFormatter",function(a){return a},D,!0),Cd("showCursorWhenSelecting",!1,db,!0),Cd("resetSelectionOnContextMenu",!0),Cd("lineWiseCopyCut",!0),Cd("readOnly",!1,function(a,b){"nocursor"==b?($c(a),a.display.input.blur(),a.display.disabled=!0):(a.display.disabled=!1,b||a.display.input.reset())}),Cd("disableInput",!1,function(a,b){b||a.display.input.reset()},!0),Cd("dragDrop",!0,qc),Cd("cursorBlinkRate",530),Cd("cursorScrollMargin",0),Cd("cursorHeight",1,db,!0),Cd("singleCursorHeightPerLine",!0,db,!0),Cd("workTime",100),Cd("workDelay",100),Cd("flattenSpans",!0,y,!0),Cd("addModeClass",!1,y,!0),Cd("pollInterval",100),Cd("undoDepth",200,function(a,b){a.doc.history.undoDepth=b}),Cd("historyEventDelay",1250),Cd("viewportMargin",10,function(a){a.refresh()},!0),Cd("maxHighlightLength",1e4,y,!0),Cd("moveInputWithCursor",!0,function(a,b){b||a.display.input.resetPosition()}),Cd("tabindex",null,function(a,b){a.display.input.getField().tabIndex=b||""}),Cd("autofocus",null);var Ed=v.modes={},Fd=v.mimeModes={};v.defineMode=function(a,b){v.defaults.mode||"null"==a||(v.defaults.mode=a),arguments.length>2&&(b.dependencies=Array.prototype.slice.call(arguments,2)),Ed[a]=b},v.defineMIME=function(a,b){Fd[a]=b},v.resolveMode=function(a){if("string"==typeof a&&Fd.hasOwnProperty(a))a=Fd[a];else if(a&&"string"==typeof a.name&&Fd.hasOwnProperty(a.name)){var b=Fd[a.name];"string"==typeof b&&(b={name:b}),a=gg(b,a),a.name=b.name}else if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return v.resolveMode("application/xml");return"string"==typeof a?{name:a}:a||{name:"null"}},v.getMode=function(a,b){var b=v.resolveMode(b),c=Ed[b.name];if(!c)return v.getMode(a,"text/plain");var d=c(a,b);if(Gd.hasOwnProperty(b.name)){var e=Gd[b.name];for(var f in e)e.hasOwnProperty(f)&&(d.hasOwnProperty(f)&&(d["_"+f]=d[f]),d[f]=e[f])}if(d.name=b.name,b.helperType&&(d.helperType=b.helperType),b.modeProps)for(var f in b.modeProps)d[f]=b.modeProps[f];return d},v.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}}),v.defineMIME("text/plain","null");var Gd=v.modeExtensions={};v.extendMode=function(a,b){var c=Gd.hasOwnProperty(a)?Gd[a]:Gd[a]={};hg(b,c)},v.defineExtension=function(a,b){v.prototype[a]=b},v.defineDocExtension=function(a,b){af.prototype[a]=b},v.defineOption=Cd;var Hd=[];v.defineInitHook=function(a){Hd.push(a)};var Id=v.helpers={};v.registerHelper=function(a,b,c){Id.hasOwnProperty(a)||(Id[a]=v[a]={_global:[]}),Id[a][b]=c},v.registerGlobalHelper=function(a,b,c,d){v.registerHelper(a,b,d),Id[a]._global.push({pred:c,val:d})};var Jd=v.copyState=function(a,b){if(b===!0)return b;if(a.copyState)return a.copyState(b);var c={};for(var d in b){var e=b[d];e instanceof Array&&(e=e.concat([])),c[d]=e}return c},Kd=v.startState=function(a,b,c){return a.startState?a.startState(b,c):!0};v.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);if(!c||c.mode==a)break;b=c.state,a=c.mode}return c||{mode:a,state:b}};var Ld=v.commands={selectAll:function(a){a.setSelection(oa(a.firstLine(),0),oa(a.lastLine()),Vf)},singleSelection:function(a){a.setSelection(a.getCursor("anchor"),a.getCursor("head"),Vf)},killLine:function(a){xd(a,function(b){if(b.empty()){var c=ff(a.doc,b.head.line).text.length;return b.head.ch==c&&b.head.line0)e=new oa(e.line,e.ch+1),a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),oa(e.line,e.ch-2),e,"+transpose");else if(e.line>a.doc.first){var g=ff(a.doc,e.line-1).text;g&&a.replaceRange(f.charAt(0)+a.doc.lineSeparator()+g.charAt(g.length-1),oa(e.line-1,g.length-1),oa(e.line,1),"+transpose")}c.push(new Ka(e,e))}a.setSelections(c)})},newlineAndIndent:function(a){cc(a,function(){for(var b=a.listSelections().length,c=0;b>c;c++){var d=a.listSelections()[c];a.replaceRange(a.doc.lineSeparator(),d.anchor,d.head,"+input"),a.indentLine(d.from().line+1,null,!0),td(a)}})},toggleOverwrite:function(a){a.toggleOverwrite()}},Md=v.keyMap={};Md.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Md.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Md.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},Md.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace", -"Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Md["default"]=o?Md.macDefault:Md.pcDefault,v.normalizeKeyMap=function(a){var b={};for(var c in a)if(a.hasOwnProperty(c)){var d=a[c];if(/^(name|fallthrough|(de|at)tach)$/.test(c))continue;if("..."==d){delete a[c];continue}for(var e=eg(c.split(" "),Nd),f=0;f=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){return this.posb},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){var b=this.string.indexOf(a,this.pos);return b>-1?(this.pos=b,!0):void 0},backUp:function(a){this.pos-=a},column:function(){return this.lastColumnPos0?null:(f&&b!==!1&&(this.pos+=f[0].length),f)}var d=function(a){return c?a.toLowerCase():a},e=this.string.substr(this.pos,a.length);return d(e)==d(a)?(b!==!1&&(this.pos+=a.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}}};var Td=0,Ud=v.TextMarker=function(a,b){this.lines=[],this.type=b,this.doc=a,this.id=++Td};Sf(Ud),Ud.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;if(b&&Vb(a),Rf(this,"clear")){var c=this.find();c&&Nf(this,"clear",c.from,c.to)}for(var d=null,e=null,f=0;fa.display.maxLineLength&&(a.display.maxLine=i,a.display.maxLineLength=j,a.display.maxLineChanged=!0)}null!=d&&a&&this.collapsed&&ic(a,d,e+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&ab(a.doc)),a&&Nf(a,"markerCleared",a,this),b&&Xb(a),this.parent&&this.parent.clear()}},Ud.prototype.find=function(a,b){null==a&&"bookmark"==this.type&&(a=1);for(var c,d,e=0;ec;++c){var e=this.lines[c];this.height-=e.height,Ee(e),Nf(e,"delete")}this.lines.splice(a,b)},collapse:function(a){a.push.apply(a,this.lines)},insertInner:function(a,b,c){this.height+=c,this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(var d=0;da;++a)if(c(this.lines[a]))return!0}},$e.prototype={chunkSize:function(){return this.size},removeInner:function(a,b){this.size-=b;for(var c=0;ca){var f=Math.min(b,e-a),g=d.height;if(d.removeInner(a,f),this.height-=g-d.height,e==f&&(this.children.splice(c--,1),d.parent=null),0==(b-=f))break;a=0}else a-=e}if(this.size-b<25&&(this.children.length>1||!(this.children[0]instanceof Ze))){var h=[];this.collapse(h),this.children=[new Ze(h)],this.children[0].parent=this}},collapse:function(a){for(var b=0;b=a){if(e.insertInner(a,b,c),e.lines&&e.lines.length>50){for(;e.lines.length>50;){var g=e.lines.splice(e.lines.length-25,25),h=new Ze(g);e.height-=h.height,this.children.splice(d+1,0,h),h.parent=this}this.maybeSpill()}break}a-=f}},maybeSpill:function(){if(!(this.children.length<=10)){var a=this;do{var b=a.children.splice(a.children.length-5,5),c=new $e(b);if(a.parent){a.size-=c.size,a.height-=c.height;var e=dg(a.parent.children,a);a.parent.children.splice(e+1,0,c)}else{var d=new $e(a.children);d.parent=a,a.children=[d,c],a=d}c.parent=a.parent}while(a.children.length>10);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;da){var g=Math.min(b,f-a);if(e.iterN(a,g,c))return!0;if(0==(b-=g))break;a=0}else a-=f}}};var _e=0,af=v.Doc=function(a,b,c,d){if(!(this instanceof af))return new af(a,b,c,d);null==c&&(c=0),$e.call(this,[new Ze([new Ce("",null)])]),this.first=c,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.frontier=c;var e=oa(c,0);this.sel=Ma(e),this.history=new of(null),this.id=++_e,this.modeOption=b,this.lineSep=d,"string"==typeof a&&(a=this.splitLines(a)),Ye(this,{from:e,to:e,text:a}),Za(this,Ma(e),Vf)};af.prototype=gg($e.prototype,{constructor:af,iter:function(a,b,c){c?this.iterN(a-this.first,b-a,c):this.iterN(this.first,this.first+this.size,a)},insert:function(a,b){for(var c=0,d=0;d=0;f--)hd(this,d[f]);h?Ya(this,h):this.cm&&td(this.cm)}),undo:fc(function(){jd(this,"undo")}),redo:fc(function(){jd(this,"redo")}),undoSelection:fc(function(){jd(this,"undo",!0)}),redoSelection:fc(function(){jd(this,"redo",!0)}),setExtending:function(a){this.extend=a},getExtending:function(){return this.extend},historySize:function(){for(var a=this.history,b=0,c=0,d=0;d=a.ch)&&b.push(e.marker.parent||e.marker)}return b},findMarks:function(a,b,c){a=Oa(this,a),b=Oa(this,b);var d=[],e=a.line;return this.iter(a.line,b.line+1,function(f){var g=f.markedSpans;if(g)for(var h=0;hi.to||null==i.from&&e!=a.line||e==b.line&&i.from>b.ch||c&&!c(i.marker)||d.push(i.marker.parent||i.marker)}++e}),d},getAllMarks:function(){var a=[];return this.iter(function(b){var c=b.markedSpans;if(c)for(var d=0;da?(b=a,!0):(a-=e,void++c)}),Oa(this,oa(c,b))},indexFromPos:function(a){a=Oa(this,a);var b=a.ch;return a.lineb&&(b=a.from),null!=a.to&&a.toh||h>=b)return g+(b-f);g+=h-f,g+=c-g%c,f=h+1}},_f=[""],cg=function(a){a.select()};m?cg=function(a){a.selectionStart=0,a.selectionEnd=a.value.length}:d&&(cg=function(a){try{a.select()}catch(b){}});var qg,jg=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,kg=v.isWordChar=function(a){return/\w/.test(a)||a>"\x80"&&(a.toUpperCase()!=a.toLowerCase()||jg.test(a))},ng=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;qg=document.createRange?function(a,b,c,d){var e=document.createRange();return e.setEnd(d||a,c),e.setStart(a,b),e}:function(a,b,c){var d=document.body.createTextRange();try{d.moveToElementText(a.parentNode)}catch(e){return d}return d.collapse(!0),d.moveEnd("character",c),d.moveStart("character",b),d};var tg=v.contains=function(a,b){if(3==b.nodeType&&(b=b.parentNode),a.contains)return a.contains(b);do if(11==b.nodeType&&(b=b.host),b==a)return!0;while(b=b.parentNode)};d&&11>e&&(ug=function(){try{return document.activeElement}catch(a){return document.body}});var Eg,Gg,wg=v.rmClass=function(a,b){var c=a.className,d=vg(b).exec(c);if(d){var e=c.slice(d.index+d[0].length);a.className=c.slice(0,d.index)+(e?d[1]+e:"")}},xg=v.addClass=function(a,b){var c=a.className;vg(b).test(c)||(a.className+=(c?" ":"")+b)},Ag=!1,Dg=function(){if(d&&9>e)return!1;var a=pg("div");return"draggable"in a||"dragDrop"in a}(),Ig=v.splitLines=3!="\n\nb".split(/\n/).length?function(a){for(var b=0,c=[],d=a.length;d>=b;){var e=a.indexOf("\n",b);-1==e&&(e=a.length);var f=a.slice(b,"\r"==a.charAt(e-1)?e-1:e),g=f.indexOf("\r");-1!=g?(c.push(f.slice(0,g)),b+=g+1):(c.push(f),b=e+1)}return c}:function(a){return a.split(/\r\n?|\n/)},Jg=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(b){return!1}}:function(a){try{var b=a.ownerDocument.selection.createRange()}catch(c){}return b&&b.parentElement()==a?0!=b.compareEndPoints("StartToEnd",b):!1},Kg=function(){var a=pg("div");return"oncopy"in a?!0:(a.setAttribute("oncopy","return;"),"function"==typeof a.oncopy)}(),Lg=null,Ng={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};v.keyNames=Ng,function(){for(var a=0;10>a;a++)Ng[a+48]=Ng[a+96]=String(a);for(var a=65;90>=a;a++)Ng[a]=String.fromCharCode(a);for(var a=1;12>=a;a++)Ng[a+111]=Ng[a+63235]="F"+a}();var Xg,ah=function(){function c(c){return 247>=c?a.charAt(c):c>=1424&&1524>=c?"R":c>=1536&&1773>=c?b.charAt(c-1536):c>=1774&&2220>=c?"r":c>=8192&&8203>=c?"w":8204==c?"b":"L"}function j(a,b,c){this.level=a,this.from=b,this.to=c}var a="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",b="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",d=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,e=/[stwN]/,f=/[LRr]/,g=/[Lb1n]/,h=/[1n]/,i="L";return function(a){if(!d.test(a))return!1;for(var m,b=a.length,k=[],l=0;b>l;++l)k.push(m=c(a.charCodeAt(l)));for(var l=0,n=i;b>l;++l){var m=k[l];"m"==m?k[l]=n:n=m}for(var l=0,o=i;b>l;++l){var m=k[l];"1"==m&&"r"==o?k[l]="n":f.test(m)&&(o=m,"r"==m&&(k[l]="R"))}for(var l=1,n=k[0];b-1>l;++l){var m=k[l];"+"==m&&"1"==n&&"1"==k[l+1]?k[l]="1":","!=m||n!=k[l+1]||"1"!=n&&"n"!=n||(k[l]=n),n=m}for(var l=0;b>l;++l){var m=k[l];if(","==m)k[l]="N";else if("%"==m){for(var p=l+1;b>p&&"%"==k[p];++p);for(var q=l&&"!"==k[l-1]||b>p&&"1"==k[p]?"1":"N",r=l;p>r;++r)k[r]=q;l=p-1}}for(var l=0,o=i;b>l;++l){var m=k[l];"L"==o&&"1"==m?k[l]="L":f.test(m)&&(o=m)}for(var l=0;b>l;++l)if(e.test(k[l])){for(var p=l+1;b>p&&e.test(k[p]);++p);for(var s="L"==(l?k[l-1]:i),t="L"==(b>p?k[p]:i),q=s||t?"L":"R",r=l;p>r;++r)k[r]=q;l=p-1}for(var v,u=[],l=0;b>l;)if(g.test(k[l])){var w=l;for(++l;b>l&&g.test(k[l]);++l);u.push(new j(0,w,l))}else{var x=l,y=u.length;for(++l;b>l&&"L"!=k[l];++l);for(var r=x;l>r;)if(h.test(k[r])){r>x&&u.splice(y,0,new j(1,x,r));var z=r;for(++r;l>r&&h.test(k[r]);++r);u.splice(y,0,new j(2,z,r)),x=r}else++r;l>x&&u.splice(y,0,new j(1,x,l))}return 1==u[0].level&&(v=a.match(/^\s+/))&&(u[0].from=v[0].length,u.unshift(new j(0,0,v[0].length))),1==bg(u).level&&(v=a.match(/\s+$/))&&(bg(u).to-=v[0].length,u.push(new j(0,b-v[0].length,b))),2==u[0].level&&u.unshift(new j(1,u[0].to,u[0].to)),u[0].level!=bg(u).level&&u.push(new j(u[0].level,b,b)),u}}();return v.version="5.6.0",v}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";a.defineMode("javascript",function(b,c){function m(a){for(var c,b=!1,d=!1;null!=(c=a.next());){if(!b){if("/"==c&&!d)return;"["==c?d=!0:d&&"]"==c&&(d=!1)}b=!b&&"\\"==c}}function p(a,b,c){return n=a,o=c,b}function q(a,b){var c=a.next();if('"'==c||"'"==c)return b.tokenize=r(c),b.tokenize(a,b);if("."==c&&a.match(/^\d+(?:[eE][+\-]?\d+)?/))return p("number","number");if("."==c&&a.match(".."))return p("spread","meta");if(/[\[\]{}\(\),;\:\.]/.test(c))return p(c);if("="==c&&a.eat(">"))return p("=>","operator");if("0"==c&&a.eat(/x/i))return a.eatWhile(/[\da-f]/i),p("number","number");if(/\d/.test(c))return a.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),p("number","number");if("/"==c)return a.eat("*")?(b.tokenize=s,s(a,b)):a.eat("/")?(a.skipToEnd(),p("comment","comment")):"operator"==b.lastType||"keyword c"==b.lastType||"sof"==b.lastType||/^[\[{}\(,;:]$/.test(b.lastType)?(m(a),a.match(/^\b(([gimyu])(?![gimyu]*\2))+\b/),p("regexp","string-2")):(a.eatWhile(k),p("operator","operator",a.current()));if("`"==c)return b.tokenize=t,t(a,b);if("#"==c)return a.skipToEnd(),p("error","error");if(k.test(c))return a.eatWhile(k),p("operator","operator",a.current());if(i.test(c)){a.eatWhile(i);var d=a.current(),e=j.propertyIsEnumerable(d)&&j[d];return e&&"."!=b.lastType?p(e.type,e.style,d):p("variable","variable",d)}}function r(a){return function(b,c){var e,d=!1;if(f&&"@"==b.peek()&&b.match(l))return c.tokenize=q,p("jsonld-keyword","meta");for(;null!=(e=b.next())&&(e!=a||d);)d=!d&&"\\"==e;return d||(c.tokenize=q),p("string","string")}}function s(a,b){for(var d,c=!1;d=a.next();){if("/"==d&&c){b.tokenize=q;break}c="*"==d}return p("comment","comment")}function t(a,b){for(var d,c=!1;null!=(d=a.next());){if(!c&&("`"==d||"$"==d&&a.eat("{"))){b.tokenize=q;break}c=!c&&"\\"==d}return p("quasi","string-2",a.current())}function v(a,b){b.fatArrowAt&&(b.fatArrowAt=null);var c=a.string.indexOf("=>",a.start);if(!(0>c)){for(var d=0,e=!1,f=c-1;f>=0;--f){var g=a.string.charAt(f),h=u.indexOf(g);if(h>=0&&3>h){if(!d){++f;break}if(0==--d)break}else if(h>=3&&6>h)++d;else if(i.test(g))e=!0;else{if(/["'\/]/.test(g))return;if(e&&!d){++f;break}}}e&&!d&&(b.fatArrowAt=f)}}function x(a,b,c,d,e,f){this.indented=a,this.column=b,this.type=c,this.prev=e,this.info=f,null!=d&&(this.align=d)}function y(a,b){for(var c=a.localVars;c;c=c.next)if(c.name==b)return!0;for(var d=a.context;d;d=d.prev)for(var c=d.vars;c;c=c.next)if(c.name==b)return!0}function z(a,b,c,d,e){var f=a.cc;for(A.state=a,A.stream=e,A.marked=null,A.cc=f,A.style=b,a.lexical.hasOwnProperty("align")||(a.lexical.align=!0);;){var h=f.length?f.pop():g?L:K;if(h(c,d)){for(;f.length&&f[f.length-1].lex;)f.pop()();return A.marked?A.marked:"variable"==c&&y(a,d)?"variable-2":b}}}function B(){for(var a=arguments.length-1;a>=0;a--)A.cc.push(arguments[a])}function C(){return B.apply(null,arguments),!0}function D(a){function b(b){for(var c=b;c;c=c.next)if(c.name==a)return!0;return!1}var d=A.state;if(d.context){if(A.marked="def",b(d.localVars))return;d.localVars={name:a,next:d.localVars}}else{if(b(d.globalVars))return;c.globalVars&&(d.globalVars={name:a,next:d.globalVars})}}function F(){A.state.context={prev:A.state.context,vars:A.state.localVars},A.state.localVars=E}function G(){A.state.localVars=A.state.context.vars,A.state.context=A.state.context.prev}function H(a,b){var c=function(){var c=A.state,d=c.indented;if("stat"==c.lexical.type)d=c.lexical.indented;else for(var e=c.lexical;e&&")"==e.type&&e.align;e=e.prev)d=e.indented;c.lexical=new x(d,A.stream.column(),a,null,c.lexical,b)};return c.lex=!0,c}function I(){var a=A.state;a.lexical.prev&&(")"==a.lexical.type&&(a.indented=a.lexical.indented),a.lexical=a.lexical.prev)}function J(a){function b(c){return c==a?C():";"==a?B():C(b)}return b}function K(a,b){return"var"==a?C(H("vardef",b.length),fa,J(";"),I):"keyword a"==a?C(H("form"),L,K,I):"keyword b"==a?C(H("form"),K,I):"{"==a?C(H("}"),ba,I):";"==a?C():"if"==a?("else"==A.state.lexical.info&&A.state.cc[A.state.cc.length-1]==I&&A.state.cc.pop()(),C(H("form"),L,K,I,ka)):"function"==a?C(qa):"for"==a?C(H("form"),la,K,I):"variable"==a?C(H("stat"),W):"switch"==a?C(H("form"),L,H("}","switch"),J("{"),ba,I,I):"case"==a?C(L,J(":")):"default"==a?C(J(":")):"catch"==a?C(H("form"),F,J("("),ra,J(")"),K,I,G):"class"==a?C(H("form"),sa,I):"export"==a?C(H("form"),wa,I):"import"==a?C(H("form"),xa,I):B(H("stat"),L,J(";"),I)}function L(a){return N(a,!1)}function M(a){return N(a,!0)}function N(a,b){if(A.state.fatArrowAt==A.stream.start){var c=b?V:U;if("("==a)return C(F,H(")"),_(ga,")"),I,J("=>"),c,G);if("variable"==a)return B(F,ga,J("=>"),c,G)}var d=b?R:Q;return w.hasOwnProperty(a)?C(d):"function"==a?C(qa,d):"keyword c"==a?C(b?P:O):"("==a?C(H(")"),O,Da,J(")"),I,d):"operator"==a||"spread"==a?C(b?M:L):"["==a?C(H("]"),Ba,I,d):"{"==a?aa(Y,"}",null,d):"quasi"==a?B(S,d):C()}function O(a){return a.match(/[;\}\)\],]/)?B():B(L)}function P(a){return a.match(/[;\}\)\],]/)?B():B(M)}function Q(a,b){return","==a?C(L):R(a,b,!1)}function R(a,b,c){var d=0==c?Q:R,e=0==c?L:M;return"=>"==a?C(F,c?V:U,G):"operator"==a?/\+\+|--/.test(b)?C(d):"?"==b?C(L,J(":"),e):C(e):"quasi"==a?B(S,d):";"!=a?"("==a?aa(M,")","call",d):"."==a?C(X,d):"["==a?C(H("]"),O,J("]"),I,d):void 0:void 0}function S(a,b){return"quasi"!=a?B():"${"!=b.slice(b.length-2)?C(S):C(L,T)}function T(a){return"}"==a?(A.marked="string-2",A.state.tokenize=t,C(S)):void 0}function U(a){return v(A.stream,A.state),B("{"==a?K:L)}function V(a){return v(A.stream,A.state),B("{"==a?K:M)}function W(a){return":"==a?C(I,K):B(Q,J(";"),I)}function X(a){return"variable"==a?(A.marked="property",C()):void 0}function Y(a,b){return"variable"==a||"keyword"==A.style?(A.marked="property",C("get"==b||"set"==b?Z:$)):"number"==a||"string"==a?(A.marked=f?"property":A.style+" property",C($)):"jsonld-keyword"==a?C($):"["==a?C(L,J("]"),$):void 0}function Z(a){return"variable"!=a?B($):(A.marked="property",C(qa))}function $(a){return":"==a?C(M):"("==a?B(qa):void 0}function _(a,b){function c(d){if(","==d){var e=A.state.lexical;return"call"==e.info&&(e.pos=(e.pos||0)+1),C(a,c)}return d==b?C():C(J(b))}return function(d){return d==b?C():B(a,c)}}function aa(a,b,c){for(var d=3;d!?|~^]/,l=/^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/,u="([{}])",w={atom:!0,number:!0,variable:!0,string:!0,regexp:!0,"this":!0,"jsonld-keyword":!0},A={state:null,column:null,marked:null,cc:null},E={name:"this",next:{name:"arguments"}};return I.lex=!0,{startState:function(a){var b={tokenize:q,lastType:"sof",cc:[],lexical:new x((a||0)-d,0,"block",!1),localVars:c.localVars,context:c.localVars&&{vars:c.localVars},indented:0};return c.globalVars&&"object"==typeof c.globalVars&&(b.globalVars=c.globalVars),b},token:function(a,b){if(a.sol()&&(b.lexical.hasOwnProperty("align")||(b.lexical.align=!1),b.indented=a.indentation(),v(a,b)),b.tokenize!=s&&a.eatSpace())return null;var c=b.tokenize(a,b);return"comment"==n?c:(b.lastType="operator"!=n||"++"!=o&&"--"!=o?n:"incdec",z(b,c,n,o,a))},indent:function(b,f){if(b.tokenize==s)return a.Pass;if(b.tokenize!=q)return 0;var g=f&&f.charAt(0),h=b.lexical;if(!/^\s*else\b/.test(f))for(var i=b.cc.length-1;i>=0;--i){var j=b.cc[i];if(j==I)h=h.prev;else if(j!=ka)break}"stat"==h.type&&"}"==g&&(h=h.prev),e&&")"==h.type&&"stat"==h.prev.type&&(h=h.prev);var k=h.type,l=g==k;return"vardef"==k?h.indented+("operator"==b.lastType||","==b.lastType?h.info+1:0):"form"==k&&"{"==g?h.indented:"form"==k?h.indented+d:"stat"==k?h.indented+(Ea(b,f)?e||d:0):"switch"!=h.info||l||0==c.doubleIndentSwitch?h.align?h.column+(l?0:1):h.indented+(l?0:d):h.indented+(/^(?:case|default)\b/.test(f)?d:2*d)},electricInput:/^\s*(?:case .*?:|default:|\{|\})$/,blockCommentStart:g?null:"/*",blockCommentEnd:g?null:"*/",lineComment:g?null:"//",fold:"brace",closeBrackets:"()[]{}''\"\"``",helperType:g?"json":"javascript",jsonldMode:f,jsonMode:g}}),a.registerHelper("wordChars","javascript",/[\w$]/),a.defineMIME("text/javascript","javascript"),a.defineMIME("text/ecmascript","javascript"),a.defineMIME("application/javascript","javascript"),a.defineMIME("application/x-javascript","javascript"),a.defineMIME("application/ecmascript","javascript"),a.defineMIME("application/json",{name:"javascript",json:!0}),a.defineMIME("application/x-json",{name:"javascript",json:!0}),a.defineMIME("application/ld+json",{name:"javascript",jsonld:!0}),a.defineMIME("text/typescript",{name:"javascript",typescript:!0}),a.defineMIME("application/typescript",{name:"javascript",typescript:!0})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../javascript/javascript")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../javascript/javascript"],a):a(CodeMirror)}(function(a){"use strict";a.defineMode("pegjs",function(b){function d(a){return a.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)}var c=a.getMode(b,"javascript");return{startState:function(){return{inString:!1,stringType:null,inComment:!1,inChracterClass:!1,braced:0,lhs:!0,localState:null}},token:function(a,b){if(a&&(b.inString||b.inComment||'"'!=a.peek()&&"'"!=a.peek()||(b.stringType=a.peek(),a.next(),b.inString=!0)),b.inString||b.inComment||!a.match(/^\/\*/)||(b.inComment=!0),b.inString){for(;b.inString&&!a.eol();)a.peek()===b.stringType?(a.next(),b.inString=!1):"\\"===a.peek()?(a.next(),a.next()):a.match(/^.[^\\\"\']*/);return b.lhs?"property string":"string"}if(b.inComment){for(;b.inComment&&!a.eol();)a.match(/\*\//)?b.inComment=!1:a.match(/^.[^\*]*/);return"comment"}if(b.inChracterClass)for(;b.inChracterClass&&!a.eol();)a.match(/^[^\]\\]+/)||a.match(/^\\./)||(b.inChracterClass=!1);else{if("["===a.peek())return a.next(),b.inChracterClass=!0,"bracket";if(a.match(/^\/\//))return a.skipToEnd(),"comment";if(b.braced||"{"===a.peek()){null===b.localState&&(b.localState=c.startState());var e=c.token(a,b.localState),f=a.current();if(!e)for(var g=0;g' : '\n' : this.HTML ? ' ' : ' '; - }, - indent:function( extra ){// extra can be a number, shortcut for increasing-calling-decreasing - if( !this.multiline ) - return ''; - var chr = this.indentChar; - if( this.HTML ) - chr = chr.replace(/\t/g,' ').replace(/ /g,' '); - return Array( this._depth_ + (extra||0) ).join(chr); - }, - up:function( a ){ - this._depth_ += a || 1; - }, - down:function( a ){ - this._depth_ -= a || 1; - }, - setParser:function( name, parser ){ - this.parsers[name] = parser; - }, - // The next 3 are exposed so you can use them - quote:quote, - literal:literal, - join:join, - _depth_: 1, - // This is the list of parsers, to modify them, use jsDump.setParser - parsers:{ - window: '[Window]', - document: '[Document]', - error:'[ERROR]', //when no parser is found, shouldn't happen - unknown: '[Unknown]', - 'null':'null', - undefined:'undefined', - 'function':function( fn ){ - var ret = 'function', - name = 'name' in fn ? fn.name : (reName.exec(fn)||[])[1];//functions never have name in IE - if( name ) - ret += ' ' + name; - ret += '('; - ret = [ ret, this.parse( fn, 'functionArgs' ), '){'].join(''); - return join( ret, this.parse(fn,'functionCode'), '}' ); - }, - array: array, - nodelist: array, - arguments: array, - jquery:array, - object:function( map ){ - if (this._depth_ >= this.maxDepth) { - this._depth_ = 1; // Reset for future use - throw new Error("Object nesting exceeded jsDump.maxDepth (" + jsDump.maxDepth + ")"); - } - var ret = [ ]; - this.up(); - for( var key in map ) - ret.push( this.parse(key,'key') + ': ' + this.parse(map[key]) ); - this.down(); - return join( '{', ret, '}' ); - }, - node:function( node ){ - var open = this.HTML ? '<' : '<', - close = this.HTML ? '>' : '>'; - var tag = node.nodeName.toLowerCase(), - ret = open + tag; - for( var a in this.DOMAttrs ){ - var val = node[this.DOMAttrs[a]]; - if( val ) - ret += ' ' + a + '=' + this.parse( val, 'attribute' ); - } - return ret + close + open + '/' + tag + close; - }, - functionArgs:function( fn ){//function calls it internally, it's the arguments part of the function - var l = fn.length; - if( !l ) return ''; - var args = Array(l); - while( l-- ) - args[l] = String.fromCharCode(97+l);//97 is 'a' - return ' ' + args.join(', ') + ' '; - }, - key:quote, //object calls it internally, the key part of an item in a map - functionCode:'[code]', //function calls it internally, it's the content of the function - attribute:quote, //node calls it internally, it's an html attribute value - string:quote, - date:quote, - regexp:literal, //regex - number:literal, - 'boolean':literal - }, - DOMAttrs:{//attributes to dump from nodes, name=>realName - id:'id', - name:'name', - 'class':'className' - }, - HTML:false,//if true, entities are escaped ( <, >, \t, space and \n ) - indentChar:' ',//indentation unit - multiline:true, //if true, items in a collection, are separated by a \n, else just a space. - maxDepth:100 //maximum depth of object nesting - }; - -})(); - -if (typeof exports !== 'undefined') { - module.exports = jsDump; -} diff --git a/tools/pegjs.org/vendor/pegjs/peg.js b/tools/pegjs.org/vendor/pegjs/peg.js deleted file mode 100644 index 3d885162..00000000 --- a/tools/pegjs.org/vendor/pegjs/peg.js +++ /dev/null @@ -1,12 +0,0 @@ -/* - * PEG.js 0.10.0 - * - * http://pegjs.org/ - * - * Copyright (c) 2010-2016 David Majda - * Licensed under the MIT license. - */ -!function(u){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=u();else if("function"==typeof define&&define.amd)define([],u);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.peg=u()}}(function(){var define,module,exports;return function u(e,t,r){function n(s,i){if(!t[s]){if(!e[s]){var a="function"==typeof require&&require;if(!i&&a)return a(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=t[s]={exports:{}};e[s][0].call(p.exports,function(u){var t=e[s][1][u];return n(t?t:u)},p,p.exports,u,e,t,r)}return t[s].exports}for(var o="function"==typeof require&&require,s=0;s1?p([a.IF_ERROR],r([a.POP],t(u.slice(1),e)),[]):[])}return t(u.alternatives,e)},action:function(u,e){var n=o.clone(e.env),s="sequence"!==u.expression.type||0===u.expression.elements.length,i=d(u.expression,{sp:e.sp+(s?1:0),env:n,action:u}),c=t(o.keys(n),u.code);return s?r([a.PUSH_CURR_POS],i,p([a.IF_NOT_ERROR],r([a.LOAD_SAVED_POS,1],l(c,1,n,e.sp+2)),[]),[a.NIP]):i},sequence:function(u,e){function n(e,s){var i,c;return e.length>0?(i=u.elements.length-e.slice(1).length,r(d(e[0],{sp:s.sp,env:s.env,action:null}),p([a.IF_NOT_ERROR],n(e.slice(1),{sp:s.sp+1,env:s.env,action:s.action}),r(i>1?[a.POP_N,i]:[a.POP],[a.POP_CURR_POS],[a.PUSH_FAILED])))):s.action?(c=t(o.keys(s.env),s.action.code),r([a.LOAD_SAVED_POS,u.elements.length],l(c,u.elements.length,s.env,s.sp),[a.NIP])):r([a.WRAP,u.elements.length],[a.NIP])}return r([a.PUSH_CURR_POS],n(u.elements,{sp:e.sp+1,env:e.env,action:e.action}))},labeled:function(u,e){var t=o.clone(e.env);return e.env[u.label]=e.sp+1,d(u.expression,{sp:e.sp,env:t,action:null})},text:function(u,e){return r([a.PUSH_CURR_POS],d(u.expression,{sp:e.sp+1,env:o.clone(e.env),action:null}),p([a.IF_NOT_ERROR],r([a.POP],[a.TEXT]),[a.NIP]))},simple_and:function(u,e){return E(u.expression,!1,e)},simple_not:function(u,e){return E(u.expression,!0,e)},optional:function(u,e){return r(d(u.expression,{sp:e.sp,env:o.clone(e.env),action:null}),p([a.IF_ERROR],r([a.POP],[a.PUSH_NULL]),[]))},zero_or_more:function(u,e){var t=d(u.expression,{sp:e.sp+1,env:o.clone(e.env),action:null});return r([a.PUSH_EMPTY_ARRAY],t,f(t),[a.POP])},one_or_more:function(u,e){var t=d(u.expression,{sp:e.sp+1,env:o.clone(e.env),action:null});return r([a.PUSH_EMPTY_ARRAY],t,p([a.IF_NOT_ERROR],r(f(t),[a.POP]),r([a.POP],[a.POP],[a.PUSH_FAILED])))},group:function(u,e){return d(u.expression,{sp:e.sp,env:o.clone(e.env),action:null})},semantic_and:function(u,e){return C(u.code,!1,e)},semantic_not:function(u,e){return C(u.code,!0,e)},rule_ref:function(e){return[a.RULE,s.indexOfRule(u,e.name)]},literal:function(u){var t,r;return u.value.length>0?(t=e('"'+c.stringEscape(u.ignoreCase?u.value.toLowerCase():u.value)+'"'),r=e('peg$literalExpectation("'+c.stringEscape(u.value)+'", '+u.ignoreCase+")"),p(u.ignoreCase?[a.MATCH_STRING_IC,t]:[a.MATCH_STRING,t],u.ignoreCase?[a.ACCEPT_N,u.value.length]:[a.ACCEPT_STRING,t],[a.FAIL,r])):(t=e('""'),[a.PUSH,t])},class:function(u){var t,r,o,s;return t=u.parts.length>0?"/^["+(u.inverted?"^":"")+n.map(u.parts,function(u){return u instanceof Array?c.regexpClassEscape(u[0])+"-"+c.regexpClassEscape(u[1]):c.regexpClassEscape(u)}).join("")+"]/"+(u.ignoreCase?"i":""):u.inverted?"/^[\\S\\s]/":"/^(?!)/",r="["+n.map(u.parts,function(u){return u instanceof Array?'["'+c.stringEscape(u[0])+'", "'+c.stringEscape(u[1])+'"]':'"'+c.stringEscape(u)+'"'}).join(", ")+"]",o=e(t),s=e("peg$classExpectation("+r+", "+u.inverted+", "+u.ignoreCase+")"),p([a.MATCH_REGEXP,o],[a.ACCEPT_N,1],[a.FAIL,s])},any:function(){var u=e("peg$anyExpectation()");return p([a.MATCH_ANY],[a.ACCEPT_N,1],[a.FAIL,u])}});d(u)}var n=u("../../utils/arrays"),o=u("../../utils/objects"),s=u("../asts"),i=u("../visitor"),a=u("../opcodes"),c=u("../js");e.exports=r},{"../../utils/arrays":17,"../../utils/objects":19,"../asts":1,"../js":3,"../opcodes":4,"../visitor":13}],6:[function(require,module,exports){"use strict";function generateJS(ast,options){function indent2(u){return u.replace(/^(.+)$/gm," $1")}function indent6(u){return u.replace(/^(.+)$/gm," $1")}function indent10(u){return u.replace(/^(.+)$/gm," $1")}function generateTables(){return"size"===options.optimize?["peg$consts = [",indent2(ast.consts.join(",\n")),"],","","peg$bytecode = [",indent2(arrays.map(ast.rules,function(u){return'peg$decode("'+js.stringEscape(arrays.map(u.bytecode,function(u){return String.fromCharCode(u+32)}).join(""))+'")'}).join(",\n")),"],"].join("\n"):arrays.map(ast.consts,function(u,e){return"peg$c"+e+" = "+u+","}).join("\n")}function generateRuleHeader(u,e){var t=[];return t.push(""),options.trace&&t.push(["peg$tracer.trace({",' type: "rule.enter",'," rule: "+u+","," location: peg$computeLocation(startPos, startPos)","});",""].join("\n")),options.cache&&(t.push(["var key = peg$currPos * "+ast.rules.length+" + "+e+","," cached = peg$resultsCache[key];","","if (cached) {"," peg$currPos = cached.nextPos;",""].join("\n")),options.trace&&t.push(["if (cached.result !== peg$FAILED) {"," peg$tracer.trace({",' type: "rule.match",'," rule: "+u+","," result: cached.result,"," location: peg$computeLocation(startPos, peg$currPos)"," });","} else {"," peg$tracer.trace({",' type: "rule.fail",'," rule: "+u+","," location: peg$computeLocation(startPos, startPos)"," });","}",""].join("\n")),t.push([" return cached.result;","}",""].join("\n"))),t.join("\n")}function generateRuleFooter(u,e){var t=[];return options.cache&&t.push(["","peg$resultsCache[key] = { nextPos: peg$currPos, result: "+e+" };"].join("\n")),options.trace&&t.push(["","if ("+e+" !== peg$FAILED) {"," peg$tracer.trace({",' type: "rule.match",'," rule: "+u+","," result: "+e+","," location: peg$computeLocation(startPos, peg$currPos)"," });","} else {"," peg$tracer.trace({",' type: "rule.fail",'," rule: "+u+","," location: peg$computeLocation(startPos, startPos)"," });","}"].join("\n")),t.push(["","return "+e+";"].join("\n")),t.join("\n")}function generateInterpreter(){function u(u,e){var t=e+3,r="bc[ip + "+(t-2)+"]",n="bc[ip + "+(t-1)+"]";return["ends.push(end);","ips.push(ip + "+t+" + "+r+" + "+n+");","","if ("+u+") {"," end = ip + "+t+" + "+r+";"," ip += "+t+";","} else {"," end = ip + "+t+" + "+r+" + "+n+";"," ip += "+t+" + "+r+";","}","","break;"].join("\n")}function e(u){var e=2,t="bc[ip + "+(e-1)+"]";return["if ("+u+") {"," ends.push(end);"," ips.push(ip);",""," end = ip + "+e+" + "+t+";"," ip += "+e+";","} else {"," ip += "+e+" + "+t+";","}","","break;"].join("\n")}function t(){var u=4,e="bc[ip + "+(u-1)+"]";return["params = bc.slice(ip + "+u+", ip + "+u+" + "+e+");","for (i = 0; i < "+e+"; i++) {"," params[i] = stack[stack.length - 1 - params[i]];","}","","stack.splice("," stack.length - bc[ip + 2],"," bc[ip + 2],"," peg$consts[bc[ip + 1]].apply(null, params)",");","","ip += "+u+" + "+e+";","break;"].join("\n")}var r=[];return r.push(["function peg$decode(s) {"," var bc = new Array(s.length), i;",""," for (i = 0; i < s.length; i++) {"," bc[i] = s.charCodeAt(i) - 32;"," }",""," return bc;","}","","function peg$parseRule(index) {"].join("\n")),options.trace?r.push([" var bc = peg$bytecode[index],"," ip = 0,"," ips = [],"," end = bc.length,"," ends = [],"," stack = [],"," startPos = peg$currPos,"," params, i;"].join("\n")):r.push([" var bc = peg$bytecode[index],"," ip = 0,"," ips = [],"," end = bc.length,"," ends = [],"," stack = [],"," params, i;"].join("\n")),r.push(indent2(generateRuleHeader("peg$ruleNames[index]","index"))),r.push([" while (true) {"," while (ip < end) {"," switch (bc[ip]) {"," case "+op.PUSH+":"," stack.push(peg$consts[bc[ip + 1]]);"," ip += 2;"," break;",""," case "+op.PUSH_UNDEFINED+":"," stack.push(void 0);"," ip++;"," break;",""," case "+op.PUSH_NULL+":"," stack.push(null);"," ip++;"," break;",""," case "+op.PUSH_FAILED+":"," stack.push(peg$FAILED);"," ip++;"," break;",""," case "+op.PUSH_EMPTY_ARRAY+":"," stack.push([]);"," ip++;"," break;",""," case "+op.PUSH_CURR_POS+":"," stack.push(peg$currPos);"," ip++;"," break;",""," case "+op.POP+":"," stack.pop();"," ip++;"," break;",""," case "+op.POP_CURR_POS+":"," peg$currPos = stack.pop();"," ip++;"," break;",""," case "+op.POP_N+":"," stack.length -= bc[ip + 1];"," ip += 2;"," break;",""," case "+op.NIP+":"," stack.splice(-2, 1);"," ip++;"," break;",""," case "+op.APPEND+":"," stack[stack.length - 2].push(stack.pop());"," ip++;"," break;",""," case "+op.WRAP+":"," stack.push(stack.splice(stack.length - bc[ip + 1], bc[ip + 1]));"," ip += 2;"," break;",""," case "+op.TEXT+":"," stack.push(input.substring(stack.pop(), peg$currPos));"," ip++;"," break;",""," case "+op.IF+":",indent10(u("stack[stack.length - 1]",0)),""," case "+op.IF_ERROR+":",indent10(u("stack[stack.length - 1] === peg$FAILED",0)),""," case "+op.IF_NOT_ERROR+":",indent10(u("stack[stack.length - 1] !== peg$FAILED",0)),""," case "+op.WHILE_NOT_ERROR+":",indent10(e("stack[stack.length - 1] !== peg$FAILED")),""," case "+op.MATCH_ANY+":",indent10(u("input.length > peg$currPos",0)),""," case "+op.MATCH_STRING+":",indent10(u("input.substr(peg$currPos, peg$consts[bc[ip + 1]].length) === peg$consts[bc[ip + 1]]",1)),""," case "+op.MATCH_STRING_IC+":",indent10(u("input.substr(peg$currPos, peg$consts[bc[ip + 1]].length).toLowerCase() === peg$consts[bc[ip + 1]]",1)),""," case "+op.MATCH_REGEXP+":",indent10(u("peg$consts[bc[ip + 1]].test(input.charAt(peg$currPos))",1)),""," case "+op.ACCEPT_N+":"," stack.push(input.substr(peg$currPos, bc[ip + 1]));"," peg$currPos += bc[ip + 1];"," ip += 2;"," break;",""," case "+op.ACCEPT_STRING+":"," stack.push(peg$consts[bc[ip + 1]]);"," peg$currPos += peg$consts[bc[ip + 1]].length;"," ip += 2;"," break;",""," case "+op.FAIL+":"," stack.push(peg$FAILED);"," if (peg$silentFails === 0) {"," peg$fail(peg$consts[bc[ip + 1]]);"," }"," ip += 2;"," break;",""," case "+op.LOAD_SAVED_POS+":"," peg$savedPos = stack[stack.length - 1 - bc[ip + 1]];"," ip += 2;"," break;",""," case "+op.UPDATE_SAVED_POS+":"," peg$savedPos = peg$currPos;"," ip++;"," break;",""," case "+op.CALL+":",indent10(t()),""," case "+op.RULE+":"," stack.push(peg$parseRule(bc[ip + 1]));"," ip += 2;"," break;",""," case "+op.SILENT_FAILS_ON+":"," peg$silentFails++;"," ip++;"," break;",""," case "+op.SILENT_FAILS_OFF+":"," peg$silentFails--;"," ip++;"," break;",""," default:",' throw new Error("Invalid opcode: " + bc[ip] + ".");'," }"," }",""," if (ends.length > 0) {"," end = ends.pop();"," ip = ips.pop();"," } else {"," break;"," }"," }"].join("\n")),r.push(indent2(generateRuleFooter("peg$ruleNames[index]","stack[0]"))),r.push("}"),r.join("\n")}function generateRuleFunction(rule){function c(u){return"peg$c"+u}function s(u){return"s"+u}function compile(bc){function compileCondition(u,e){var t,r,n,o,s=e+3,i=bc[ip+s-2],a=bc[ip+s-1],c=stack.sp;if(ip+=s,t=compile(bc.slice(ip,ip+i)),n=stack.sp,ip+=i,a>0&&(stack.sp=c,r=compile(bc.slice(ip,ip+a)),o=stack.sp,ip+=a,n!==o))throw new Error("Branches of a condition must move the stack pointer in the same way.");parts.push("if ("+u+") {"),parts.push(indent2(t)),a>0&&(parts.push("} else {"),parts.push(indent2(r))),parts.push("}")}function compileLoop(u){var e,t,r=2,n=bc[ip+r-1],o=stack.sp;if(ip+=r,e=compile(bc.slice(ip,ip+n)),t=stack.sp,ip+=n,t!==o)throw new Error("Body of a loop can't move the stack pointer.");parts.push("while ("+u+") {"),parts.push(indent2(e)),parts.push("}")}function compileCall(){var u=4,e=bc[ip+u-1],t=c(bc[ip+1])+"("+arrays.map(bc.slice(ip+u,ip+u+e),function(u){return stack.index(u)}).join(", ")+")";stack.pop(bc[ip+2]),parts.push(stack.push(t)),ip+=u+e}for(var ip=0,end=bc.length,parts=[],value;ip peg$currPos",0);break;case op.MATCH_STRING:compileCondition(eval(ast.consts[bc[ip+1]]).length>1?"input.substr(peg$currPos, "+eval(ast.consts[bc[ip+1]]).length+") === "+c(bc[ip+1]):"input.charCodeAt(peg$currPos) === "+eval(ast.consts[bc[ip+1]]).charCodeAt(0),1);break;case op.MATCH_STRING_IC:compileCondition("input.substr(peg$currPos, "+eval(ast.consts[bc[ip+1]]).length+").toLowerCase() === "+c(bc[ip+1]),1);break;case op.MATCH_REGEXP:compileCondition(c(bc[ip+1])+".test(input.charAt(peg$currPos))",1);break;case op.ACCEPT_N:parts.push(stack.push(bc[ip+1]>1?"input.substr(peg$currPos, "+bc[ip+1]+")":"input.charAt(peg$currPos)")),parts.push(bc[ip+1]>1?"peg$currPos += "+bc[ip+1]+";":"peg$currPos++;"),ip+=2;break;case op.ACCEPT_STRING:parts.push(stack.push(c(bc[ip+1]))),parts.push(eval(ast.consts[bc[ip+1]]).length>1?"peg$currPos += "+eval(ast.consts[bc[ip+1]]).length+";":"peg$currPos++;"),ip+=2;break;case op.FAIL:parts.push(stack.push("peg$FAILED")),parts.push("if (peg$silentFails === 0) { peg$fail("+c(bc[ip+1])+"); }"),ip+=2;break;case op.LOAD_SAVED_POS:parts.push("peg$savedPos = "+stack.index(bc[ip+1])+";"),ip+=2;break;case op.UPDATE_SAVED_POS:parts.push("peg$savedPos = peg$currPos;"),ip++;break;case op.CALL:compileCall();break;case op.RULE:parts.push(stack.push("peg$parse"+ast.rules[bc[ip+1]].name+"()")),ip+=2;break;case op.SILENT_FAILS_ON:parts.push("peg$silentFails++;"),ip++;break;case op.SILENT_FAILS_OFF:parts.push("peg$silentFails--;"),ip++;break;default:throw new Error("Invalid opcode: "+bc[ip]+".")}return parts.join("\n")}var parts=[],code,stack={sp:-1,maxSp:-1,push:function(u){var e=s(++this.sp)+" = "+u+";";return this.sp>this.maxSp&&(this.maxSp=this.sp),e},pop:function(u){var e;return void 0===u?s(this.sp--):(e=arrays.map(arrays.range(this.sp-u+1,this.sp+1),s),this.sp-=u,e)},top:function(){return s(this.sp)},index:function(u){return s(this.sp-u)}};return code=compile(rule.bytecode),parts.push("function peg$parse"+rule.name+"() {"),options.trace?parts.push([" var "+arrays.map(arrays.range(0,stack.maxSp+1),s).join(", ")+","," startPos = peg$currPos;"].join("\n")):parts.push(" var "+arrays.map(arrays.range(0,stack.maxSp+1),s).join(", ")+";"),parts.push(indent2(generateRuleHeader('"'+js.stringEscape(rule.name)+'"',asts.indexOfRule(ast,rule.name)))),parts.push(indent2(code)),parts.push(indent2(generateRuleFooter('"'+js.stringEscape(rule.name)+'"',s(0)))),parts.push("}"),parts.join("\n")}function generateToplevel(){var u,e,t,r,n,o=[];return o.push(["function peg$subclass(child, parent) {"," function ctor() { this.constructor = child; }"," ctor.prototype = parent.prototype;"," child.prototype = new ctor();","}","","function peg$SyntaxError(message, expected, found, location) {"," this.message = message;"," this.expected = expected;"," this.found = found;"," this.location = location;",' this.name = "SyntaxError";',"",' if (typeof Error.captureStackTrace === "function") {'," Error.captureStackTrace(this, peg$SyntaxError);"," }","}","","peg$subclass(peg$SyntaxError, Error);","","peg$SyntaxError.buildMessage = function(expected, found) {"," var DESCRIBE_EXPECTATION_FNS = {"," literal: function(expectation) {",' return "\\"" + literalEscape(expectation.text) + "\\"";'," },","",' "class": function(expectation) {',' var escapedParts = "",'," i;",""," for (i = 0; i < expectation.parts.length; i++) {"," escapedParts += expectation.parts[i] instanceof Array",' ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1])'," : classEscape(expectation.parts[i]);"," }","",' return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";'," },",""," any: function(expectation) {",' return "any character";'," },",""," end: function(expectation) {",' return "end of input";'," },",""," other: function(expectation) {"," return expectation.description;"," }"," };",""," function hex(ch) {"," return ch.charCodeAt(0).toString(16).toUpperCase();"," }",""," function literalEscape(s) {"," return s"," .replace(/\\\\/g, '\\\\\\\\')"," .replace(/\"/g, '\\\\\"')"," .replace(/\\0/g, '\\\\0')"," .replace(/\\t/g, '\\\\t')"," .replace(/\\n/g, '\\\\n')"," .replace(/\\r/g, '\\\\r')"," .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })"," .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });"," }",""," function classEscape(s) {"," return s"," .replace(/\\\\/g, '\\\\\\\\')"," .replace(/\\]/g, '\\\\]')"," .replace(/\\^/g, '\\\\^')"," .replace(/-/g, '\\\\-')"," .replace(/\\0/g, '\\\\0')"," .replace(/\\t/g, '\\\\t')"," .replace(/\\n/g, '\\\\n')"," .replace(/\\r/g, '\\\\r')"," .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })"," .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });"," }",""," function describeExpectation(expectation) {"," return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);"," }",""," function describeExpected(expected) {"," var descriptions = new Array(expected.length),"," i, j;",""," for (i = 0; i < expected.length; i++) {"," descriptions[i] = describeExpectation(expected[i]);"," }",""," descriptions.sort();",""," if (descriptions.length > 0) {"," for (i = 1, j = 1; i < descriptions.length; i++) {"," if (descriptions[i - 1] !== descriptions[i]) {"," descriptions[j] = descriptions[i];"," j++;"," }"," }"," descriptions.length = j;"," }",""," switch (descriptions.length) {"," case 1:"," return descriptions[0];",""," case 2:",' return descriptions[0] + " or " + descriptions[1];',""," default:",' return descriptions.slice(0, -1).join(", ")',' + ", or "'," + descriptions[descriptions.length - 1];"," }"," }",""," function describeFound(found) {",' return found ? "\\"" + literalEscape(found) + "\\"" : "end of input";'," }","",' return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";',"};",""].join("\n")),options.trace&&o.push(["function peg$DefaultTracer() {"," this.indentLevel = 0;","}","","peg$DefaultTracer.prototype.trace = function(event) {"," var that = this;",""," function log(event) {"," function repeat(string, n) {",' var result = "", i;',""," for (i = 0; i < n; i++) {"," result += string;"," }",""," return result;"," }",""," function pad(string, length) {",' return string + repeat(" ", length - string.length);'," }","",' if (typeof console === "object") {'," console.log(",' event.location.start.line + ":" + event.location.start.column + "-"',' + event.location.end.line + ":" + event.location.end.column + " "',' + pad(event.type, 10) + " "',' + repeat(" ", that.indentLevel) + event.rule'," );"," }"," }",""," switch (event.type) {",' case "rule.enter":'," log(event);"," this.indentLevel++;"," break;","",' case "rule.match":'," this.indentLevel--;"," log(event);"," break;","",' case "rule.fail":'," this.indentLevel--;"," log(event);"," break;",""," default:",' throw new Error("Invalid event type: " + event.type + ".");'," }","};",""].join("\n")),o.push(["function peg$parse(input, options) {"," options = options !== void 0 ? options : {};",""," var peg$FAILED = {},",""].join("\n")),"size"===options.optimize?(u="{ "+arrays.map(options.allowedStartRules,function(u){return u+": "+asts.indexOfRule(ast,u)}).join(", ")+" }",e=asts.indexOfRule(ast,options.allowedStartRules[0]),o.push([" peg$startRuleIndices = "+u+","," peg$startRuleIndex = "+e+","].join("\n"))):(t="{ "+arrays.map(options.allowedStartRules,function(u){return u+": peg$parse"+u}).join(", ")+" }",r="peg$parse"+options.allowedStartRules[0],o.push([" peg$startRuleFunctions = "+t+","," peg$startRuleFunction = "+r+","].join("\n"))),o.push(""),o.push(indent6(generateTables())),o.push([""," peg$currPos = 0,"," peg$savedPos = 0,"," peg$posDetailsCache = [{ line: 1, column: 1 }],"," peg$maxFailPos = 0,"," peg$maxFailExpected = [],"," peg$silentFails = 0,",""].join("\n")),options.cache&&o.push([" peg$resultsCache = {},",""].join("\n")),options.trace&&("size"===options.optimize&&(n="["+arrays.map(ast.rules,function(u){return'"'+js.stringEscape(u.name)+'"'}).join(", ")+"]",o.push([" peg$ruleNames = "+n+",",""].join("\n"))),o.push([' peg$tracer = "tracer" in options ? options.tracer : new peg$DefaultTracer(),',""].join("\n"))),o.push([" peg$result;",""].join("\n")),"size"===options.optimize?o.push([' if ("startRule" in options) {'," if (!(options.startRule in peg$startRuleIndices)) {",' throw new Error("Can\'t start parsing from rule \\"" + options.startRule + "\\".");'," }",""," peg$startRuleIndex = peg$startRuleIndices[options.startRule];"," }"].join("\n")):o.push([' if ("startRule" in options) {'," if (!(options.startRule in peg$startRuleFunctions)) {",' throw new Error("Can\'t start parsing from rule \\"" + options.startRule + "\\".");'," }",""," peg$startRuleFunction = peg$startRuleFunctions[options.startRule];"," }"].join("\n")),o.push([""," function text() {"," return input.substring(peg$savedPos, peg$currPos);"," }",""," function location() {"," return peg$computeLocation(peg$savedPos, peg$currPos);"," }",""," function expected(description, location) {"," location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)",""," throw peg$buildStructuredError("," [peg$otherExpectation(description)],"," input.substring(peg$savedPos, peg$currPos),"," location"," );"," }",""," function error(message, location) {"," location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)",""," throw peg$buildSimpleError(message, location);"," }",""," function peg$literalExpectation(text, ignoreCase) {",' return { type: "literal", text: text, ignoreCase: ignoreCase };'," }",""," function peg$classExpectation(parts, inverted, ignoreCase) {",' return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };'," }",""," function peg$anyExpectation() {",' return { type: "any" };'," }",""," function peg$endExpectation() {",' return { type: "end" };'," }",""," function peg$otherExpectation(description) {",' return { type: "other", description: description };'," }",""," function peg$computePosDetails(pos) {"," var details = peg$posDetailsCache[pos], p;",""," if (details) {"," return details;"," } else {"," p = pos - 1;"," while (!peg$posDetailsCache[p]) {"," p--;"," }",""," details = peg$posDetailsCache[p];"," details = {"," line: details.line,"," column: details.column"," };",""," while (p < pos) {"," if (input.charCodeAt(p) === 10) {"," details.line++;"," details.column = 1;"," } else {"," details.column++;"," }",""," p++;"," }",""," peg$posDetailsCache[pos] = details;"," return details;"," }"," }",""," function peg$computeLocation(startPos, endPos) {"," var startPosDetails = peg$computePosDetails(startPos),"," endPosDetails = peg$computePosDetails(endPos);",""," return {"," start: {"," offset: startPos,"," line: startPosDetails.line,"," column: startPosDetails.column"," },"," end: {"," offset: endPos,"," line: endPosDetails.line,"," column: endPosDetails.column"," }"," };"," }",""," function peg$fail(expected) {"," if (peg$currPos < peg$maxFailPos) { return; }",""," if (peg$currPos > peg$maxFailPos) {"," peg$maxFailPos = peg$currPos;"," peg$maxFailExpected = [];"," }",""," peg$maxFailExpected.push(expected);"," }",""," function peg$buildSimpleError(message, location) {"," return new peg$SyntaxError(message, null, null, location);"," }",""," function peg$buildStructuredError(expected, found, location) {"," return new peg$SyntaxError("," peg$SyntaxError.buildMessage(expected, found),"," expected,"," found,"," location"," );"," }",""].join("\n")),"size"===options.optimize?(o.push(indent2(generateInterpreter())), -o.push("")):arrays.each(ast.rules,function(u){o.push(indent2(generateRuleFunction(u))),o.push("")}),ast.initializer&&(o.push(indent2(ast.initializer.code)),o.push("")),"size"===options.optimize?o.push(" peg$result = peg$parseRule(peg$startRuleIndex);"):o.push(" peg$result = peg$startRuleFunction();"),o.push([""," if (peg$result !== peg$FAILED && peg$currPos === input.length) {"," return peg$result;"," } else {"," if (peg$result !== peg$FAILED && peg$currPos < input.length) {"," peg$fail(peg$endExpectation());"," }",""," throw peg$buildStructuredError("," peg$maxFailExpected,"," peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,"," peg$maxFailPos < input.length"," ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)"," : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)"," );"," }","}"].join("\n")),o.join("\n")}function generateWrapper(u){function e(){return["/*"," * Generated by PEG.js 0.10.0."," *"," * http://pegjs.org/"," */"].join("\n")}function t(){return options.trace?["{"," SyntaxError: peg$SyntaxError,"," DefaultTracer: peg$DefaultTracer,"," parse: peg$parse","}"].join("\n"):["{"," SyntaxError: peg$SyntaxError,"," parse: peg$parse","}"].join("\n")}var r={bare:function(){return[e(),"(function() {",' "use strict";',"",indent2(u),"",indent2("return "+t()+";"),"})()"].join("\n")},commonjs:function(){var r=[],n=objects.keys(options.dependencies),o=arrays.map(n,function(u){return u+' = require("'+js.stringEscape(options.dependencies[u])+'")'});return r.push([e(),"",'"use strict";',""].join("\n")),o.length>0&&(r.push("var "+o.join(", ")+";"),r.push("")),r.push([u,"","module.exports = "+t()+";",""].join("\n")),r.join("\n")},amd:function(){var r=objects.values(options.dependencies),n=objects.keys(options.dependencies),o="["+arrays.map(r,function(u){return'"'+js.stringEscape(u)+'"'}).join(", ")+"]",s=n.join(", ");return[e(),"define("+o+", function("+s+") {",' "use strict";',"",indent2(u),"",indent2("return "+t()+";"),"});",""].join("\n")},globals:function(){return[e(),"(function(root) {",' "use strict";',"",indent2(u),"",indent2("root."+options.exportVar+" = "+t()+";"),"})(this);",""].join("\n")},umd:function(){var r=[],n=objects.values(options.dependencies),o=objects.keys(options.dependencies),s="["+arrays.map(n,function(u){return'"'+js.stringEscape(u)+'"'}).join(", ")+"]",i=arrays.map(n,function(u){return'require("'+js.stringEscape(u)+'")'}).join(", "),a=o.join(", ");return r.push([e(),"(function(root, factory) {",' if (typeof define === "function" && define.amd) {'," define("+s+", factory);",' } else if (typeof module === "object" && module.exports) {'," module.exports = factory("+i+");"].join("\n")),null!==options.exportVar&&r.push([" } else {"," root."+options.exportVar+" = factory();"].join("\n")),r.push([" }","})(this, function("+a+") {",' "use strict";',"",indent2(u),"",indent2("return "+t()+";"),"});",""].join("\n")),r.join("\n")}};return r[options.format]()}ast.code=generateWrapper(generateToplevel())}var arrays=require("../../utils/arrays"),objects=require("../../utils/objects"),asts=require("../asts"),op=require("../opcodes"),js=require("../js");module.exports=generateJS},{"../../utils/arrays":17,"../../utils/objects":19,"../asts":1,"../js":3,"../opcodes":4}],7:[function(u,e,t){"use strict";function r(u,e){function t(u){return"rule"===u.type&&"rule_ref"===u.expression.type}function r(u,e,t){var r=o.build({rule_ref:function(u){u.name===e&&(u.name=t)}});r(u)}var s=[];n.each(u.rules,function(o,i){t(o)&&(r(u,o.name,o.expression.name),n.contains(e.allowedStartRules,o.name)||s.push(i))}),s.reverse(),n.each(s,function(e){u.rules.splice(e,1)})}var n=u("../../utils/arrays"),o=u("../visitor");e.exports=r},{"../../utils/arrays":17,"../visitor":13}],8:[function(u,e,t){"use strict";function r(u){function e(u,e){t(u.expression,s.clone(e))}var t=i.build({rule:function(u){t(u.expression,{})},choice:function(u,e){o.each(u.alternatives,function(u){t(u,s.clone(e))})},action:e,labeled:function(u,e){if(e.hasOwnProperty(u.label))throw new n('Label "'+u.label+'" is already defined at line '+e[u.label].start.line+", column "+e[u.label].start.column+".",u.location);t(u.expression,e),e[u.label]=u.location},text:e,simple_and:e,simple_not:e,optional:e,zero_or_more:e,one_or_more:e,group:e});t(u)}var n=u("../../grammar-error"),o=u("../../utils/arrays"),s=u("../../utils/objects"),i=u("../visitor");e.exports=r},{"../../grammar-error":14,"../../utils/arrays":17,"../../utils/objects":19,"../visitor":13}],9:[function(u,e,t){"use strict";function r(u){var e={},t=o.build({rule:function(u){if(e.hasOwnProperty(u.name))throw new n('Rule "'+u.name+'" is already defined at line '+e[u.name].start.line+", column "+e[u.name].start.column+".",u.location);e[u.name]=u.location}});t(u)}var n=u("../../grammar-error"),o=u("../visitor");e.exports=r},{"../../grammar-error":14,"../visitor":13}],10:[function(u,e,t){"use strict";function r(u){var e=[],t=i.build({rule:function(u){e.push(u.name),t(u.expression),e.pop(u.name)},sequence:function(e){n.every(e.elements,function(e){return t(e),!s.alwaysConsumesOnSuccess(u,e)})},rule_ref:function(r){if(n.contains(e,r.name))throw e.push(r.name),new o("Possible infinite loop when parsing (left recursion: "+e.join(" -> ")+").",r.location);t(s.findRule(u,r.name))}});t(u)}var n=u("../../utils/arrays"),o=u("../../grammar-error"),s=u("../asts"),i=u("../visitor");e.exports=r},{"../../grammar-error":14,"../../utils/arrays":17,"../asts":1,"../visitor":13}],11:[function(u,e,t){"use strict";function r(u){var e=s.build({zero_or_more:function(e){if(!o.alwaysConsumesOnSuccess(u,e.expression))throw new n("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).",e.location)},one_or_more:function(e){if(!o.alwaysConsumesOnSuccess(u,e.expression))throw new n("Possible infinite loop when parsing (repetition used with an expression that may not consume any input).",e.location)}});e(u)}var n=u("../../grammar-error"),o=u("../asts"),s=u("../visitor");e.exports=r},{"../../grammar-error":14,"../asts":1,"../visitor":13}],12:[function(u,e,t){"use strict";function r(u){var e=s.build({rule_ref:function(e){if(!o.findRule(u,e.name))throw new n('Rule "'+e.name+'" is not defined.',e.location)}});e(u)}var n=u("../../grammar-error"),o=u("../asts"),s=u("../visitor");e.exports=r},{"../../grammar-error":14,"../asts":1,"../visitor":13}],13:[function(u,e,t){"use strict";var r=u("../utils/objects"),n=u("../utils/arrays"),o={build:function(u){function e(e){return u[e.type].apply(null,arguments)}function t(){}function o(u){var t=Array.prototype.slice.call(arguments,1);e.apply(null,[u.expression].concat(t))}function s(u){return function(t){var r=Array.prototype.slice.call(arguments,1);n.each(t[u],function(u){e.apply(null,[u].concat(r))})}}var i={grammar:function(u){var t=Array.prototype.slice.call(arguments,1);u.initializer&&e.apply(null,[u.initializer].concat(t)),n.each(u.rules,function(u){e.apply(null,[u].concat(t))})},initializer:t,rule:o,named:o,choice:s("alternatives"),action:o,sequence:s("elements"),labeled:o,text:o,simple_and:o,simple_not:o,optional:o,zero_or_more:o,one_or_more:o,group:o,semantic_and:t,semantic_not:t,rule_ref:t,literal:t,class:t,any:t};return r.defaults(u,i),e}};e.exports=o},{"../utils/arrays":17,"../utils/objects":19}],14:[function(u,e,t){"use strict";function r(u,e){this.name="GrammarError",this.message=u,this.location=e,"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,r)}var n=u("./utils/classes");n.subclass(r,Error),e.exports=r},{"./utils/classes":18}],15:[function(u,e,t){"use strict";function r(u,e){function t(){this.constructor=u}t.prototype=e.prototype,u.prototype=new t}function n(u,e,t,r){this.message=u,this.expected=e,this.found=t,this.location=r,this.name="SyntaxError","function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,n)}function o(u,e){function t(){return u.substring(Yo,Vo)}function r(){return l(Yo,Vo)}function o(u,e){throw e=void 0!==e?e:l(Yo,Vo),C(u,e)}function s(u,e){return{type:"literal",text:u,ignoreCase:e}}function i(u,e,t){return{type:"class",parts:u,inverted:e,ignoreCase:t}}function a(){return{type:"any"}}function c(){return{type:"end"}}function p(u){return{type:"other",description:u}}function A(e){var t,r=Wo[e];if(r)return r;for(t=e-1;!Wo[t];)t--;for(r=Wo[t],r={line:r.line,column:r.column};tXo&&(Xo=Vo,Jo=[]),Jo.push(u))}function C(u,e){return new n(u,null,null,e)}function f(u,e,t){return new n(n.buildMessage(u,e),u,e,t)}function F(){var u,e,t,r,n,o,s;if(u=Vo,e=ae(),e!==de)if(t=Vo,r=d(),r!==de?(n=ae(),n!==de?(r=[r,n],t=r):(Vo=t,t=de)):(Vo=t,t=de),t===de&&(t=null),t!==de){if(r=[],n=Vo,o=h(),o!==de?(s=ae(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),n!==de)for(;n!==de;)r.push(n),n=Vo,o=h(),o!==de?(s=ae(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);else r=de;r!==de?(Yo=u,e=De(t,r),u=e):(Vo=u,u=de)}else Vo=u,u=de;else Vo=u,u=de;return u}function d(){var u,e,t;return u=Vo,e=Eu(),e!==de?(t=pe(),t!==de?(Yo=u,e=Be(e),u=e):(Vo=u,u=de)):(Vo=u,u=de),u}function h(){var e,t,r,n,o,s,i,a;return e=Vo,t=U(),t!==de?(r=ae(),r!==de?(n=Vo,o=J(),o!==de?(s=ae(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),n===de&&(n=null),n!==de?(61===u.charCodeAt(Vo)?(o=ve,Vo++):(o=de,0===Zo&&E(me)),o!==de?(s=ae(),s!==de?(i=g(),i!==de?(a=pe(),a!==de?(Yo=e,t=be(t,n,i),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),e}function g(){var e,t,r,n,o,s,i,a;if(e=Vo,t=D(),t!==de){for(r=[],n=Vo,o=ae(),o!==de?(47===u.charCodeAt(Vo)?(s=xe,Vo++):(s=de,0===Zo&&E(Pe)),s!==de?(i=ae(),i!==de?(a=D(),a!==de?(o=[o,s,i,a],n=o):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de);n!==de;)r.push(n),n=Vo,o=ae(),o!==de?(47===u.charCodeAt(Vo)?(s=xe,Vo++):(s=de,0===Zo&&E(Pe)),s!==de?(i=ae(),i!==de?(a=D(),a!==de?(o=[o,s,i,a],n=o):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de);r!==de?(Yo=e,t=_e(t,r),e=t):(Vo=e,e=de)}else Vo=e,e=de;return e}function D(){var u,e,t,r,n;return u=Vo,e=B(),e!==de?(t=Vo,r=ae(),r!==de?(n=Eu(),n!==de?(r=[r,n],t=r):(Vo=t,t=de)):(Vo=t,t=de),t===de&&(t=null),t!==de?(Yo=u,e=ye(e,t),u=e):(Vo=u,u=de)):(Vo=u,u=de),u}function B(){var u,e,t,r,n,o;if(u=Vo,e=v(),e!==de){for(t=[],r=Vo,n=ae(),n!==de?(o=v(),o!==de?(n=[n,o],r=n):(Vo=r,r=de)):(Vo=r,r=de);r!==de;)t.push(r),r=Vo,n=ae(),n!==de?(o=v(),o!==de?(n=[n,o],r=n):(Vo=r,r=de)):(Vo=r,r=de);t!==de?(Yo=u,e=$e(e,t),u=e):(Vo=u,u=de)}else Vo=u,u=de;return u}function v(){var e,t,r,n,o,s;return e=Vo,t=N(),t!==de?(r=ae(),r!==de?(58===u.charCodeAt(Vo)?(n=Re,Vo++):(n=de,0===Zo&&E(ke)),n!==de?(o=ae(),o!==de?(s=m(),s!==de?(Yo=e,t=Se(t,s),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=m()),e}function m(){var u,e,t,r;return u=Vo,e=b(),e!==de?(t=ae(),t!==de?(r=x(),r!==de?(Yo=u,e=Ie(e,r),u=e):(Vo=u,u=de)):(Vo=u,u=de)):(Vo=u,u=de),u===de&&(u=x()),u}function b(){var e;return 36===u.charCodeAt(Vo)?(e=Oe,Vo++):(e=de,0===Zo&&E(je)),e===de&&(38===u.charCodeAt(Vo)?(e=Le,Vo++):(e=de,0===Zo&&E(we)),e===de&&(33===u.charCodeAt(Vo)?(e=Te,Vo++):(e=de,0===Zo&&E(Ne)))),e}function x(){var u,e,t,r;return u=Vo,e=_(),e!==de?(t=ae(),t!==de?(r=P(),r!==de?(Yo=u,e=Ue(e,r),u=e):(Vo=u,u=de)):(Vo=u,u=de)):(Vo=u,u=de),u===de&&(u=_()),u}function P(){var e;return 63===u.charCodeAt(Vo)?(e=He,Vo++):(e=de,0===Zo&&E(qe)),e===de&&(42===u.charCodeAt(Vo)?(e=ze,Vo++):(e=de,0===Zo&&E(Me)),e===de&&(43===u.charCodeAt(Vo)?(e=Ge,Vo++):(e=de,0===Zo&&E(Ve)))),e}function _(){var e,t,r,n,o,s;return e=X(),e===de&&(e=Q(),e===de&&(e=lu(),e===de&&(e=y(),e===de&&(e=$(),e===de&&(e=Vo,40===u.charCodeAt(Vo)?(t=Ye,Vo++):(t=de,0===Zo&&E(We)),t!==de?(r=ae(),r!==de?(n=g(),n!==de?(o=ae(),o!==de?(41===u.charCodeAt(Vo)?(s=Xe,Vo++):(s=de,0===Zo&&E(Je)),s!==de?(Yo=e,t=Ze(n),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)))))),e}function y(){var e,t,r,n,o,s,i,a;return e=Vo,t=U(),t!==de?(r=Vo,Zo++,n=Vo,o=ae(),o!==de?(s=Vo,i=J(),i!==de?(a=ae(),a!==de?(i=[i,a],s=i):(Vo=s,s=de)):(Vo=s,s=de),s===de&&(s=null),s!==de?(61===u.charCodeAt(Vo)?(i=ve,Vo++):(i=de,0===Zo&&E(me)),i!==de?(o=[o,s,i],n=o):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(Yo=e,t=Ke(t),e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function $(){var u,e,t,r;return u=Vo,e=R(),e!==de?(t=ae(),t!==de?(r=Eu(),r!==de?(Yo=u,e=Qe(e,r),u=e):(Vo=u,u=de)):(Vo=u,u=de)):(Vo=u,u=de),u}function R(){var e;return 38===u.charCodeAt(Vo)?(e=Le,Vo++):(e=de,0===Zo&&E(we)),e===de&&(33===u.charCodeAt(Vo)?(e=Te,Vo++):(e=de,0===Zo&&E(Ne))),e}function k(){var e;return u.length>Vo?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(ut)),e}function S(){var e,t;return Zo++,9===u.charCodeAt(Vo)?(e=tt,Vo++):(e=de,0===Zo&&E(rt)),e===de&&(11===u.charCodeAt(Vo)?(e=nt,Vo++):(e=de,0===Zo&&E(ot)),e===de&&(12===u.charCodeAt(Vo)?(e=st,Vo++):(e=de,0===Zo&&E(it)),e===de&&(32===u.charCodeAt(Vo)?(e=at,Vo++):(e=de,0===Zo&&E(ct)),e===de&&(160===u.charCodeAt(Vo)?(e=pt,Vo++):(e=de,0===Zo&&E(At)),e===de&&(65279===u.charCodeAt(Vo)?(e=lt,Vo++):(e=de,0===Zo&&E(Et)),e===de&&(e=xu())))))),Zo--,e===de&&(t=de,0===Zo&&E(et)),e}function I(){var e;return Ct.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(ft)),e}function O(){var e,t;return Zo++,10===u.charCodeAt(Vo)?(e=dt,Vo++):(e=de,0===Zo&&E(ht)),e===de&&(u.substr(Vo,2)===gt?(e=gt,Vo+=2):(e=de,0===Zo&&E(Dt)),e===de&&(13===u.charCodeAt(Vo)?(e=Bt,Vo++):(e=de,0===Zo&&E(vt)),e===de&&(8232===u.charCodeAt(Vo)?(e=mt,Vo++):(e=de,0===Zo&&E(bt)),e===de&&(8233===u.charCodeAt(Vo)?(e=xt,Vo++):(e=de,0===Zo&&E(Pt)))))),Zo--,e===de&&(t=de,0===Zo&&E(Ft)),e}function j(){var u,e;return Zo++,u=L(),u===de&&(u=T()),Zo--,u===de&&(e=de,0===Zo&&E(_t)),u}function L(){var e,t,r,n,o,s;if(e=Vo,u.substr(Vo,2)===yt?(t=yt,Vo+=2):(t=de,0===Zo&&E($t)),t!==de){for(r=[],n=Vo,o=Vo,Zo++,u.substr(Vo,2)===Rt?(s=Rt,Vo+=2):(s=de,0===Zo&&E(kt)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);n!==de;)r.push(n),n=Vo,o=Vo,Zo++,u.substr(Vo,2)===Rt?(s=Rt,Vo+=2):(s=de,0===Zo&&E(kt)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);r!==de?(u.substr(Vo,2)===Rt?(n=Rt,Vo+=2):(n=de,0===Zo&&E(kt)),n!==de?(t=[t,r,n],e=t):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;return e}function w(){var e,t,r,n,o,s;if(e=Vo,u.substr(Vo,2)===yt?(t=yt,Vo+=2):(t=de,0===Zo&&E($t)),t!==de){for(r=[],n=Vo,o=Vo,Zo++,u.substr(Vo,2)===Rt?(s=Rt,Vo+=2):(s=de,0===Zo&&E(kt)),s===de&&(s=I()),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);n!==de;)r.push(n),n=Vo,o=Vo,Zo++,u.substr(Vo,2)===Rt?(s=Rt,Vo+=2):(s=de,0===Zo&&E(kt)),s===de&&(s=I()),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);r!==de?(u.substr(Vo,2)===Rt?(n=Rt,Vo+=2):(n=de,0===Zo&&E(kt)),n!==de?(t=[t,r,n],e=t):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;return e}function T(){var e,t,r,n,o,s;if(e=Vo,u.substr(Vo,2)===St?(t=St,Vo+=2):(t=de,0===Zo&&E(It)),t!==de){for(r=[],n=Vo,o=Vo,Zo++,s=I(),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);n!==de;)r.push(n),n=Vo,o=Vo,Zo++,s=I(),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);r!==de?(t=[t,r],e=t):(Vo=e,e=de)}else Vo=e,e=de;return e}function N(){var u,e,t;return u=Vo,e=Vo,Zo++,t=G(),Zo--,t===de?e=void 0:(Vo=e,e=de),e!==de?(t=U(),t!==de?(Yo=u,e=Ot(t),u=e):(Vo=u,u=de)):(Vo=u,u=de),u}function U(){var u,e,t,r;if(Zo++,u=Vo,e=H(),e!==de){for(t=[],r=q();r!==de;)t.push(r),r=q();t!==de?(Yo=u,e=Lt(e,t),u=e):(Vo=u,u=de)}else Vo=u,u=de;return Zo--,u===de&&(e=de,0===Zo&&E(jt)),u}function H(){var e,t,r;return e=z(),e===de&&(36===u.charCodeAt(Vo)?(e=Oe,Vo++):(e=de,0===Zo&&E(je)),e===de&&(95===u.charCodeAt(Vo)?(e=wt,Vo++):(e=de,0===Zo&&E(Tt)),e===de&&(e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=cu(),r!==de?(Yo=e,t=Ht(r),e=t):(Vo=e,e=de)):(Vo=e,e=de)))),e}function q(){var e;return e=H(),e===de&&(e=M(),e===de&&(e=vu(),e===de&&(e=bu(),e===de&&(8204===u.charCodeAt(Vo)?(e=qt,Vo++):(e=de,0===Zo&&E(zt)),e===de&&(8205===u.charCodeAt(Vo)?(e=Mt,Vo++):(e=de,0===Zo&&E(Gt))))))),e}function z(){var u;return u=gu(),u===de&&(u=fu(),u===de&&(u=hu(),u===de&&(u=Fu(),u===de&&(u=du(),u===de&&(u=mu()))))),u}function M(){var u;return u=Bu(),u===de&&(u=Du()),u}function G(){var u;return u=V(),u===de&&(u=Y(),u===de&&(u=Xu(),u===de&&(u=W()))),u}function V(){var u;return u=Pu(),u===de&&(u=_u(),u===de&&(u=yu(),u===de&&(u=ku(),u===de&&(u=Su(),u===de&&(u=Iu(),u===de&&(u=Ou(),u===de&&(u=ju(),u===de&&(u=Lu(),u===de&&(u=Hu(),u===de&&(u=qu(),u===de&&(u=zu(),u===de&&(u=Mu(),u===de&&(u=Vu(),u===de&&(u=Yu(),u===de&&(u=Wu(),u===de&&(u=Ju(),u===de&&(u=Ku(),u===de&&(u=Qu(),u===de&&(u=ue(),u===de&&(u=te(),u===de&&(u=re(),u===de&&(u=ne(),u===de&&(u=oe(),u===de&&(u=se(),u===de&&(u=ie()))))))))))))))))))))))))),u}function Y(){var u;return u=$u(),u===de&&(u=Ru(),u===de&&(u=wu(),u===de&&(u=Tu(),u===de&&(u=Nu(),u===de&&(u=Gu(),u===de&&(u=Zu())))))),u}function W(){var u;return u=ee(),u===de&&(u=Uu()),u}function X(){var e,t,r;return Zo++,e=Vo,t=J(),t!==de?(105===u.charCodeAt(Vo)?(r=Yt,Vo++):(r=de,0===Zo&&E(Wt)),r===de&&(r=null),r!==de?(Yo=e,t=Xt(t,r),e=t):(Vo=e,e=de)):(Vo=e,e=de),Zo--,e===de&&(t=de,0===Zo&&E(Vt)),e}function J(){var e,t,r,n;if(Zo++,e=Vo,34===u.charCodeAt(Vo)?(t=Zt,Vo++):(t=de,0===Zo&&E(Kt)),t!==de){for(r=[],n=Z();n!==de;)r.push(n),n=Z();r!==de?(34===u.charCodeAt(Vo)?(n=Zt,Vo++):(n=de,0===Zo&&E(Kt)),n!==de?(Yo=e,t=Qt(r),e=t):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;if(e===de)if(e=Vo,39===u.charCodeAt(Vo)?(t=ur,Vo++):(t=de,0===Zo&&E(er)),t!==de){for(r=[],n=K();n!==de;)r.push(n),n=K();r!==de?(39===u.charCodeAt(Vo)?(n=ur,Vo++):(n=de,0===Zo&&E(er)),n!==de?(Yo=e,t=Qt(r),e=t):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;return Zo--,e===de&&(t=de,0===Zo&&E(Jt)),e}function Z(){var e,t,r;return e=Vo,t=Vo,Zo++,34===u.charCodeAt(Vo)?(r=Zt,Vo++):(r=de,0===Zo&&E(Kt)),r===de&&(92===u.charCodeAt(Vo)?(r=Nt,Vo++):(r=de,0===Zo&&E(Ut)),r===de&&(r=I())),Zo--,r===de?t=void 0:(Vo=t,t=de),t!==de?(r=k(),r!==de?(Yo=e,t=tr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=ru(),r!==de?(Yo=e,t=Ht(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=tu())),e}function K(){var e,t,r;return e=Vo,t=Vo,Zo++,39===u.charCodeAt(Vo)?(r=ur,Vo++):(r=de,0===Zo&&E(er)),r===de&&(92===u.charCodeAt(Vo)?(r=Nt,Vo++):(r=de,0===Zo&&E(Ut)),r===de&&(r=I())),Zo--,r===de?t=void 0:(Vo=t,t=de),t!==de?(r=k(),r!==de?(Yo=e,t=tr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=ru(),r!==de?(Yo=e,t=Ht(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=tu())),e}function Q(){var e,t,r,n,o,s;if(Zo++,e=Vo,91===u.charCodeAt(Vo)?(t=nr,Vo++):(t=de,0===Zo&&E(or)),t!==de)if(94===u.charCodeAt(Vo)?(r=sr,Vo++):(r=de,0===Zo&&E(ir)),r===de&&(r=null),r!==de){for(n=[],o=uu(),o===de&&(o=eu());o!==de;)n.push(o),o=uu(),o===de&&(o=eu());n!==de?(93===u.charCodeAt(Vo)?(o=ar,Vo++):(o=de,0===Zo&&E(cr)),o!==de?(105===u.charCodeAt(Vo)?(s=Yt,Vo++):(s=de,0===Zo&&E(Wt)),s===de&&(s=null),s!==de?(Yo=e,t=pr(r,n,s),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de)}else Vo=e,e=de;else Vo=e,e=de;return Zo--,e===de&&(t=de,0===Zo&&E(rr)),e}function uu(){var e,t,r,n;return e=Vo,t=eu(),t!==de?(45===u.charCodeAt(Vo)?(r=Ar,Vo++):(r=de,0===Zo&&E(lr)),r!==de?(n=eu(),n!==de?(Yo=e,t=Er(t,n),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),e}function eu(){var e,t,r;return e=Vo,t=Vo,Zo++,93===u.charCodeAt(Vo)?(r=ar,Vo++):(r=de,0===Zo&&E(cr)),r===de&&(92===u.charCodeAt(Vo)?(r=Nt,Vo++):(r=de,0===Zo&&E(Ut)),r===de&&(r=I())),Zo--,r===de?t=void 0:(Vo=t,t=de),t!==de?(r=k(),r!==de?(Yo=e,t=tr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=ru(),r!==de?(Yo=e,t=Ht(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=tu())),e}function tu(){var e,t,r;return e=Vo,92===u.charCodeAt(Vo)?(t=Nt,Vo++):(t=de,0===Zo&&E(Ut)),t!==de?(r=O(),r!==de?(Yo=e,t=Cr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ru(){var e,t,r,n;return e=nu(),e===de&&(e=Vo,48===u.charCodeAt(Vo)?(t=fr,Vo++):(t=de,0===Zo&&E(Fr)),t!==de?(r=Vo,Zo++,n=pu(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(Yo=e,t=dr(),e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=au(),e===de&&(e=cu()))),e}function nu(){var u;return u=ou(),u===de&&(u=su()),u}function ou(){var e,t;return 39===u.charCodeAt(Vo)?(e=ur,Vo++):(e=de,0===Zo&&E(er)),e===de&&(34===u.charCodeAt(Vo)?(e=Zt,Vo++):(e=de,0===Zo&&E(Kt)),e===de&&(92===u.charCodeAt(Vo)?(e=Nt,Vo++):(e=de,0===Zo&&E(Ut)),e===de&&(e=Vo,98===u.charCodeAt(Vo)?(t=hr,Vo++):(t=de,0===Zo&&E(gr)),t!==de&&(Yo=e,t=Dr()),e=t,e===de&&(e=Vo,102===u.charCodeAt(Vo)?(t=Br,Vo++):(t=de,0===Zo&&E(vr)),t!==de&&(Yo=e,t=mr()),e=t,e===de&&(e=Vo,110===u.charCodeAt(Vo)?(t=br,Vo++):(t=de,0===Zo&&E(xr)),t!==de&&(Yo=e,t=Pr()),e=t,e===de&&(e=Vo,114===u.charCodeAt(Vo)?(t=_r,Vo++):(t=de,0===Zo&&E(yr)),t!==de&&(Yo=e,t=$r()),e=t,e===de&&(e=Vo,116===u.charCodeAt(Vo)?(t=Rr,Vo++):(t=de,0===Zo&&E(kr)),t!==de&&(Yo=e,t=Sr()),e=t,e===de&&(e=Vo,118===u.charCodeAt(Vo)?(t=Ir,Vo++):(t=de,0===Zo&&E(Or)),t!==de&&(Yo=e,t=jr()),e=t)))))))),e}function su(){var u,e,t;return u=Vo,e=Vo,Zo++,t=iu(),t===de&&(t=I()),Zo--,t===de?e=void 0:(Vo=e,e=de),e!==de?(t=k(),t!==de?(Yo=u,e=tr(),u=e):(Vo=u,u=de)):(Vo=u,u=de),u}function iu(){var e;return e=ou(),e===de&&(e=pu(),e===de&&(120===u.charCodeAt(Vo)?(e=Lr,Vo++):(e=de,0===Zo&&E(wr)),e===de&&(117===u.charCodeAt(Vo)?(e=Tr,Vo++):(e=de,0===Zo&&E(Nr))))),e}function au(){var e,t,r,n,o,s;return e=Vo,120===u.charCodeAt(Vo)?(t=Lr,Vo++):(t=de,0===Zo&&E(wr)),t!==de?(r=Vo,n=Vo,o=Au(),o!==de?(s=Au(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),r=n!==de?u.substring(r,Vo):n,r!==de?(Yo=e,t=Ur(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function cu(){var e,t,r,n,o,s,i,a;return e=Vo,117===u.charCodeAt(Vo)?(t=Tr,Vo++):(t=de,0===Zo&&E(Nr)),t!==de?(r=Vo,n=Vo,o=Au(),o!==de?(s=Au(),s!==de?(i=Au(),i!==de?(a=Au(),a!==de?(o=[o,s,i,a],n=o):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de)):(Vo=n,n=de),r=n!==de?u.substring(r,Vo):n,r!==de?(Yo=e,t=Ur(r),e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function pu(){var e;return Hr.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(qr)),e}function Au(){var e;return zr.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(Mr)),e}function lu(){var e,t;return e=Vo,46===u.charCodeAt(Vo)?(t=Gr,Vo++):(t=de,0===Zo&&E(Vr)),t!==de&&(Yo=e,t=Yr()),e=t}function Eu(){var e,t,r,n;return Zo++,e=Vo,123===u.charCodeAt(Vo)?(t=Xr,Vo++):(t=de,0===Zo&&E(Jr)),t!==de?(r=Cu(),r!==de?(125===u.charCodeAt(Vo)?(n=Zr,Vo++):(n=de,0===Zo&&E(Kr)),n!==de?(Yo=e,t=Qr(r),e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),Zo--,e===de&&(t=de,0===Zo&&E(Wr)),e}function Cu(){var e,t,r,n,o,s;if(e=Vo,t=[],r=[],n=Vo,o=Vo,Zo++,un.test(u.charAt(Vo))?(s=u.charAt(Vo),Vo++):(s=de,0===Zo&&E(en)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),n!==de)for(;n!==de;)r.push(n),n=Vo,o=Vo,Zo++,un.test(u.charAt(Vo))?(s=u.charAt(Vo),Vo++):(s=de,0===Zo&&E(en)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);else r=de;for(r===de&&(r=Vo,123===u.charCodeAt(Vo)?(n=Xr,Vo++):(n=de,0===Zo&&E(Jr)),n!==de?(o=Cu(),o!==de?(125===u.charCodeAt(Vo)?(s=Zr,Vo++):(s=de,0===Zo&&E(Kr)),s!==de?(n=[n,o,s],r=n):(Vo=r,r=de)):(Vo=r,r=de)):(Vo=r,r=de));r!==de;){if(t.push(r),r=[],n=Vo,o=Vo,Zo++,un.test(u.charAt(Vo))?(s=u.charAt(Vo),Vo++):(s=de,0===Zo&&E(en)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de),n!==de)for(;n!==de;)r.push(n),n=Vo,o=Vo,Zo++,un.test(u.charAt(Vo))?(s=u.charAt(Vo),Vo++):(s=de,0===Zo&&E(en)),Zo--,s===de?o=void 0:(Vo=o,o=de),o!==de?(s=k(),s!==de?(o=[o,s],n=o):(Vo=n,n=de)):(Vo=n,n=de);else r=de;r===de&&(r=Vo,123===u.charCodeAt(Vo)?(n=Xr,Vo++):(n=de,0===Zo&&E(Jr)),n!==de?(o=Cu(),o!==de?(125===u.charCodeAt(Vo)?(s=Zr,Vo++):(s=de,0===Zo&&E(Kr)),s!==de?(n=[n,o,s],r=n):(Vo=r,r=de)):(Vo=r,r=de)):(Vo=r,r=de))}return e=t!==de?u.substring(e,Vo):t}function fu(){var e;return tn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(rn)),e}function Fu(){var e;return nn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(on)),e}function du(){var e;return sn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(an)),e}function hu(){var e;return cn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(pn)),e}function gu(){var e;return An.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(ln)),e}function Du(){var e;return En.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(Cn)),e}function Bu(){var e;return fn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(Fn)),e}function vu(){var e;return dn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(hn)),e}function mu(){var e;return gn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(Dn)),e}function bu(){var e;return Bn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(vn)),e}function xu(){var e;return mn.test(u.charAt(Vo))?(e=u.charAt(Vo),Vo++):(e=de,0===Zo&&E(bn)),e}function Pu(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===xn?(t=xn,Vo+=5):(t=de,0===Zo&&E(Pn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function _u(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===_n?(t=_n,Vo+=4):(t=de,0===Zo&&E(yn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function yu(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===$n?(t=$n,Vo+=5):(t=de,0===Zo&&E(Rn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function $u(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===kn?(t=kn,Vo+=5):(t=de,0===Zo&&E(Sn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Ru(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===In?(t=In,Vo+=5):(t=de,0===Zo&&E(On)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ku(){var e,t,r,n;return e=Vo,u.substr(Vo,8)===jn?(t=jn,Vo+=8):(t=de,0===Zo&&E(Ln)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Su(){var e,t,r,n;return e=Vo,u.substr(Vo,8)===wn?(t=wn,Vo+=8):(t=de,0===Zo&&E(Tn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Iu(){var e,t,r,n;return e=Vo,u.substr(Vo,7)===Nn?(t=Nn,Vo+=7):(t=de,0===Zo&&E(Un)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Ou(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===Hn?(t=Hn,Vo+=6):(t=de,0===Zo&&E(qn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ju(){var e,t,r,n;return e=Vo,u.substr(Vo,2)===zn?(t=zn,Vo+=2):(t=de,0===Zo&&E(Mn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Lu(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===Gn?(t=Gn,Vo+=4):(t=de,0===Zo&&E(Vn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function wu(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===Yn?(t=Yn,Vo+=4):(t=de,0===Zo&&E(Wn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Tu(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===Xn?(t=Xn,Vo+=6):(t=de,0===Zo&&E(Jn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Nu(){var e,t,r,n;return e=Vo,u.substr(Vo,7)===Zn?(t=Zn,Vo+=7):(t=de,0===Zo&&E(Kn)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Uu(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===Qn?(t=Qn,Vo+=5):(t=de,0===Zo&&E(uo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Hu(){var e,t,r,n;return e=Vo,u.substr(Vo,7)===eo?(t=eo,Vo+=7):(t=de,0===Zo&&E(to)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function qu(){var e,t,r,n;return e=Vo,u.substr(Vo,3)===ro?(t=ro,Vo+=3):(t=de,0===Zo&&E(no)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function zu(){var e,t,r,n;return e=Vo,u.substr(Vo,8)===oo?(t=oo,Vo+=8):(t=de,0===Zo&&E(so)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Mu(){var e,t,r,n;return e=Vo,u.substr(Vo,2)===io?(t=io,Vo+=2):(t=de,0===Zo&&E(ao)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Gu(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===co?(t=co,Vo+=6):(t=de,0===Zo&&E(po)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Vu(){var e,t,r,n;return e=Vo,u.substr(Vo,10)===Ao?(t=Ao,Vo+=10):(t=de,0===Zo&&E(lo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Yu(){var e,t,r,n;return e=Vo,u.substr(Vo,2)===Eo?(t=Eo,Vo+=2):(t=de,0===Zo&&E(Co)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Wu(){var e,t,r,n;return e=Vo,u.substr(Vo,3)===fo?(t=fo,Vo+=3):(t=de,0===Zo&&E(Fo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Xu(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===ho?(t=ho,Vo+=4):(t=de,0===Zo&&E(go)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Ju(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===Do?(t=Do,Vo+=6):(t=de,0===Zo&&E(Bo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Zu(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===vo?(t=vo,Vo+=5):(t=de,0===Zo&&E(mo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Ku(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===bo?(t=bo,Vo+=6):(t=de,0===Zo&&E(xo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function Qu(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===Po?(t=Po,Vo+=4):(t=de,0===Zo&&E(_o)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ue(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===yo?(t=yo,Vo+=5):(t=de,0===Zo&&E($o)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ee(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===Ro?(t=Ro,Vo+=4):(t=de,0===Zo&&E(ko)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function te(){var e,t,r,n;return e=Vo,u.substr(Vo,3)===So?(t=So,Vo+=3):(t=de,0===Zo&&E(Io)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function re(){var e,t,r,n;return e=Vo,u.substr(Vo,6)===Oo?(t=Oo,Vo+=6):(t=de,0===Zo&&E(jo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ne(){var e,t,r,n;return e=Vo,u.substr(Vo,3)===Lo?(t=Lo,Vo+=3):(t=de,0===Zo&&E(wo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function oe(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===To?(t=To,Vo+=4):(t=de,0===Zo&&E(No)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function se(){var e,t,r,n;return e=Vo,u.substr(Vo,5)===Uo?(t=Uo, -Vo+=5):(t=de,0===Zo&&E(Ho)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ie(){var e,t,r,n;return e=Vo,u.substr(Vo,4)===qo?(t=qo,Vo+=4):(t=de,0===Zo&&E(zo)),t!==de?(r=Vo,Zo++,n=q(),Zo--,n===de?r=void 0:(Vo=r,r=de),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e}function ae(){var u,e;for(u=[],e=S(),e===de&&(e=O(),e===de&&(e=j()));e!==de;)u.push(e),e=S(),e===de&&(e=O(),e===de&&(e=j()));return u}function ce(){var u,e;for(u=[],e=S(),e===de&&(e=w());e!==de;)u.push(e),e=S(),e===de&&(e=w());return u}function pe(){var e,t,r,n;return e=Vo,t=ae(),t!==de?(59===u.charCodeAt(Vo)?(r=Mo,Vo++):(r=de,0===Zo&&E(Go)),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,t=ce(),t!==de?(r=T(),r===de&&(r=null),r!==de?(n=O(),n!==de?(t=[t,r,n],e=t):(Vo=e,e=de)):(Vo=e,e=de)):(Vo=e,e=de),e===de&&(e=Vo,t=ae(),t!==de?(r=Ae(),r!==de?(t=[t,r],e=t):(Vo=e,e=de)):(Vo=e,e=de))),e}function Ae(){var e,t;return e=Vo,Zo++,u.length>Vo?(t=u.charAt(Vo),Vo++):(t=de,0===Zo&&E(ut)),Zo--,t===de?e=void 0:(Vo=e,e=de),e}function le(u){var e,t=[];for(e=0;e0?{type:"choice",alternatives:fe(u,e,3),location:r()}:u},ye=function(u,e){return null!==e?{type:"action",expression:u,code:e[1],location:r()}:u},$e=function(u,e){return e.length>0?{type:"sequence",elements:fe(u,e,1),location:r()}:u},Re=":",ke=s(":",!1),Se=function(u,e){return{type:"labeled",label:u,expression:e,location:r()}},Ie=function(u,e){return{type:Ko[u],expression:e,location:r()}},Oe="$",je=s("$",!1),Le="&",we=s("&",!1),Te="!",Ne=s("!",!1),Ue=function(u,e){return{type:Qo[e],expression:u,location:r()}},He="?",qe=s("?",!1),ze="*",Me=s("*",!1),Ge="+",Ve=s("+",!1),Ye="(",We=s("(",!1),Xe=")",Je=s(")",!1),Ze=function(u){return"labeled"===u.type||"sequence"===u.type?{type:"group",expression:u}:u},Ke=function(u){return{type:"rule_ref",name:u,location:r()}},Qe=function(u,e){return{type:us[u],code:e,location:r()}},ut=a(),et=p("whitespace"),tt="\t",rt=s("\t",!1),nt="\v",ot=s("\v",!1),st="\f",it=s("\f",!1),at=" ",ct=s(" ",!1),pt=" ",At=s(" ",!1),lt="\ufeff",Et=s("\ufeff",!1),Ct=/^[\n\r\u2028\u2029]/,ft=i(["\n","\r","\u2028","\u2029"],!1,!1),Ft=p("end of line"),dt="\n",ht=s("\n",!1),gt="\r\n",Dt=s("\r\n",!1),Bt="\r",vt=s("\r",!1),mt="\u2028",bt=s("\u2028",!1),xt="\u2029",Pt=s("\u2029",!1),_t=p("comment"),yt="/*",$t=s("/*",!1),Rt="*/",kt=s("*/",!1),St="//",It=s("//",!1),Ot=function(u){return u},jt=p("identifier"),Lt=function(u,e){return u+e.join("")},wt="_",Tt=s("_",!1),Nt="\\",Ut=s("\\",!1),Ht=function(u){return u},qt="‌",zt=s("‌",!1),Mt="‍",Gt=s("‍",!1),Vt=p("literal"),Yt="i",Wt=s("i",!1),Xt=function(u,e){return{type:"literal",value:u,ignoreCase:null!==e,location:r()}},Jt=p("string"),Zt='"',Kt=s('"',!1),Qt=function(u){return u.join("")},ur="'",er=s("'",!1),tr=function(){return t()},rr=p("character class"),nr="[",or=s("[",!1),sr="^",ir=s("^",!1),ar="]",cr=s("]",!1),pr=function(u,e,t){return{type:"class",parts:le(e),inverted:null!==u,ignoreCase:null!==t,location:r()}},Ar="-",lr=s("-",!1),Er=function(u,e){return u.charCodeAt(0)>e.charCodeAt(0)&&o("Invalid character range: "+t()+"."),[u,e]},Cr=function(){return""},fr="0",Fr=s("0",!1),dr=function(){return"\0"},hr="b",gr=s("b",!1),Dr=function(){return"\b"},Br="f",vr=s("f",!1),mr=function(){return"\f"},br="n",xr=s("n",!1),Pr=function(){return"\n"},_r="r",yr=s("r",!1),$r=function(){return"\r"},Rr="t",kr=s("t",!1),Sr=function(){return"\t"},Ir="v",Or=s("v",!1),jr=function(){return"\v"},Lr="x",wr=s("x",!1),Tr="u",Nr=s("u",!1),Ur=function(u){return String.fromCharCode(parseInt(u,16))},Hr=/^[0-9]/,qr=i([["0","9"]],!1,!1),zr=/^[0-9a-f]/i,Mr=i([["0","9"],["a","f"]],!1,!0),Gr=".",Vr=s(".",!1),Yr=function(){return{type:"any",location:r()}},Wr=p("code block"),Xr="{",Jr=s("{",!1),Zr="}",Kr=s("}",!1),Qr=function(u){return u},un=/^[{}]/,en=i(["{","}"],!1,!1),tn=/^[a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0529\u052B\u052D\u052F\u0561-\u0587\u13F8-\u13FD\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA699\uA69B\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793-\uA795\uA797\uA799\uA79B\uA79D\uA79F\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7B5\uA7B7\uA7FA\uAB30-\uAB5A\uAB60-\uAB65\uAB70-\uABBF\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A]/,rn=i([["a","z"],"µ",["ß","ö"],["ø","ÿ"],"ā","ă","ą","ć","ĉ","ċ","č","ď","đ","ē","ĕ","ė","ę","ě","ĝ","ğ","ġ","ģ","ĥ","ħ","ĩ","ī","ĭ","į","ı","ij","ĵ",["ķ","ĸ"],"ĺ","ļ","ľ","ŀ","ł","ń","ņ",["ň","ʼn"],"ŋ","ō","ŏ","ő","œ","ŕ","ŗ","ř","ś","ŝ","ş","š","ţ","ť","ŧ","ũ","ū","ŭ","ů","ű","ų","ŵ","ŷ","ź","ż",["ž","ƀ"],"ƃ","ƅ","ƈ",["ƌ","ƍ"],"ƒ","ƕ",["ƙ","ƛ"],"ƞ","ơ","ƣ","ƥ","ƨ",["ƪ","ƫ"],"ƭ","ư","ƴ","ƶ",["ƹ","ƺ"],["ƽ","ƿ"],"dž","lj","nj","ǎ","ǐ","ǒ","ǔ","ǖ","ǘ","ǚ",["ǜ","ǝ"],"ǟ","ǡ","ǣ","ǥ","ǧ","ǩ","ǫ","ǭ",["ǯ","ǰ"],"dz","ǵ","ǹ","ǻ","ǽ","ǿ","ȁ","ȃ","ȅ","ȇ","ȉ","ȋ","ȍ","ȏ","ȑ","ȓ","ȕ","ȗ","ș","ț","ȝ","ȟ","ȡ","ȣ","ȥ","ȧ","ȩ","ȫ","ȭ","ȯ","ȱ",["ȳ","ȹ"],"ȼ",["ȿ","ɀ"],"ɂ","ɇ","ɉ","ɋ","ɍ",["ɏ","ʓ"],["ʕ","ʯ"],"ͱ","ͳ","ͷ",["ͻ","ͽ"],"ΐ",["ά","ώ"],["ϐ","ϑ"],["ϕ","ϗ"],"ϙ","ϛ","ϝ","ϟ","ϡ","ϣ","ϥ","ϧ","ϩ","ϫ","ϭ",["ϯ","ϳ"],"ϵ","ϸ",["ϻ","ϼ"],["а","џ"],"ѡ","ѣ","ѥ","ѧ","ѩ","ѫ","ѭ","ѯ","ѱ","ѳ","ѵ","ѷ","ѹ","ѻ","ѽ","ѿ","ҁ","ҋ","ҍ","ҏ","ґ","ғ","ҕ","җ","ҙ","қ","ҝ","ҟ","ҡ","ң","ҥ","ҧ","ҩ","ҫ","ҭ","ү","ұ","ҳ","ҵ","ҷ","ҹ","һ","ҽ","ҿ","ӂ","ӄ","ӆ","ӈ","ӊ","ӌ",["ӎ","ӏ"],"ӑ","ӓ","ӕ","ӗ","ә","ӛ","ӝ","ӟ","ӡ","ӣ","ӥ","ӧ","ө","ӫ","ӭ","ӯ","ӱ","ӳ","ӵ","ӷ","ӹ","ӻ","ӽ","ӿ","ԁ","ԃ","ԅ","ԇ","ԉ","ԋ","ԍ","ԏ","ԑ","ԓ","ԕ","ԗ","ԙ","ԛ","ԝ","ԟ","ԡ","ԣ","ԥ","ԧ","ԩ","ԫ","ԭ","ԯ",["ա","և"],["ᏸ","ᏽ"],["ᴀ","ᴫ"],["ᵫ","ᵷ"],["ᵹ","ᶚ"],"ḁ","ḃ","ḅ","ḇ","ḉ","ḋ","ḍ","ḏ","ḑ","ḓ","ḕ","ḗ","ḙ","ḛ","ḝ","ḟ","ḡ","ḣ","ḥ","ḧ","ḩ","ḫ","ḭ","ḯ","ḱ","ḳ","ḵ","ḷ","ḹ","ḻ","ḽ","ḿ","ṁ","ṃ","ṅ","ṇ","ṉ","ṋ","ṍ","ṏ","ṑ","ṓ","ṕ","ṗ","ṙ","ṛ","ṝ","ṟ","ṡ","ṣ","ṥ","ṧ","ṩ","ṫ","ṭ","ṯ","ṱ","ṳ","ṵ","ṷ","ṹ","ṻ","ṽ","ṿ","ẁ","ẃ","ẅ","ẇ","ẉ","ẋ","ẍ","ẏ","ẑ","ẓ",["ẕ","ẝ"],"ẟ","ạ","ả","ấ","ầ","ẩ","ẫ","ậ","ắ","ằ","ẳ","ẵ","ặ","ẹ","ẻ","ẽ","ế","ề","ể","ễ","ệ","ỉ","ị","ọ","ỏ","ố","ồ","ổ","ỗ","ộ","ớ","ờ","ở","ỡ","ợ","ụ","ủ","ứ","ừ","ử","ữ","ự","ỳ","ỵ","ỷ","ỹ","ỻ","ỽ",["ỿ","ἇ"],["ἐ","ἕ"],["ἠ","ἧ"],["ἰ","ἷ"],["ὀ","ὅ"],["ὐ","ὗ"],["ὠ","ὧ"],["ὰ","ώ"],["ᾀ","ᾇ"],["ᾐ","ᾗ"],["ᾠ","ᾧ"],["ᾰ","ᾴ"],["ᾶ","ᾷ"],"ι",["ῂ","ῄ"],["ῆ","ῇ"],["ῐ","ΐ"],["ῖ","ῗ"],["ῠ","ῧ"],["ῲ","ῴ"],["ῶ","ῷ"],"ℊ",["ℎ","ℏ"],"ℓ","ℯ","ℴ","ℹ",["ℼ","ℽ"],["ⅆ","ⅉ"],"ⅎ","ↄ",["ⰰ","ⱞ"],"ⱡ",["ⱥ","ⱦ"],"ⱨ","ⱪ","ⱬ","ⱱ",["ⱳ","ⱴ"],["ⱶ","ⱻ"],"ⲁ","ⲃ","ⲅ","ⲇ","ⲉ","ⲋ","ⲍ","ⲏ","ⲑ","ⲓ","ⲕ","ⲗ","ⲙ","ⲛ","ⲝ","ⲟ","ⲡ","ⲣ","ⲥ","ⲧ","ⲩ","ⲫ","ⲭ","ⲯ","ⲱ","ⲳ","ⲵ","ⲷ","ⲹ","ⲻ","ⲽ","ⲿ","ⳁ","ⳃ","ⳅ","ⳇ","ⳉ","ⳋ","ⳍ","ⳏ","ⳑ","ⳓ","ⳕ","ⳗ","ⳙ","ⳛ","ⳝ","ⳟ","ⳡ",["ⳣ","ⳤ"],"ⳬ","ⳮ","ⳳ",["ⴀ","ⴥ"],"ⴧ","ⴭ","ꙁ","ꙃ","ꙅ","ꙇ","ꙉ","ꙋ","ꙍ","ꙏ","ꙑ","ꙓ","ꙕ","ꙗ","ꙙ","ꙛ","ꙝ","ꙟ","ꙡ","ꙣ","ꙥ","ꙧ","ꙩ","ꙫ","ꙭ","ꚁ","ꚃ","ꚅ","ꚇ","ꚉ","ꚋ","ꚍ","ꚏ","ꚑ","ꚓ","ꚕ","ꚗ","ꚙ","ꚛ","ꜣ","ꜥ","ꜧ","ꜩ","ꜫ","ꜭ",["ꜯ","ꜱ"],"ꜳ","ꜵ","ꜷ","ꜹ","ꜻ","ꜽ","ꜿ","ꝁ","ꝃ","ꝅ","ꝇ","ꝉ","ꝋ","ꝍ","ꝏ","ꝑ","ꝓ","ꝕ","ꝗ","ꝙ","ꝛ","ꝝ","ꝟ","ꝡ","ꝣ","ꝥ","ꝧ","ꝩ","ꝫ","ꝭ","ꝯ",["ꝱ","ꝸ"],"ꝺ","ꝼ","ꝿ","ꞁ","ꞃ","ꞅ","ꞇ","ꞌ","ꞎ","ꞑ",["ꞓ","ꞕ"],"ꞗ","ꞙ","ꞛ","ꞝ","ꞟ","ꞡ","ꞣ","ꞥ","ꞧ","ꞩ","ꞵ","ꞷ","ꟺ",["ꬰ","ꭚ"],["ꭠ","ꭥ"],["ꭰ","ꮿ"],["ff","st"],["ﬓ","ﬗ"],["a","z"]],!1,!1),nn=/^[\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA69C-\uA69D\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uA9E6\uAA70\uAADD\uAAF3-\uAAF4\uAB5C-\uAB5F\uFF70\uFF9E-\uFF9F]/,on=i([["ʰ","ˁ"],["ˆ","ˑ"],["ˠ","ˤ"],"ˬ","ˮ","ʹ","ͺ","ՙ","ـ",["ۥ","ۦ"],["ߴ","ߵ"],"ߺ","ࠚ","ࠤ","ࠨ","ॱ","ๆ","ໆ","ჼ","ៗ","ᡃ","ᪧ",["ᱸ","ᱽ"],["ᴬ","ᵪ"],"ᵸ",["ᶛ","ᶿ"],"ⁱ","ⁿ",["ₐ","ₜ"],["ⱼ","ⱽ"],"ⵯ","ⸯ","々",["〱","〵"],"〻",["ゝ","ゞ"],["ー","ヾ"],"ꀕ",["ꓸ","ꓽ"],"ꘌ","ꙿ",["ꚜ","ꚝ"],["ꜗ","ꜟ"],"ꝰ","ꞈ",["ꟸ","ꟹ"],"ꧏ","ꧦ","ꩰ","ꫝ",["ꫳ","ꫴ"],["ꭜ","ꭟ"],"ー",["゙","゚"]],!1,!1),sn=/^[\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0980\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA78F\uA7F7\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9E0-\uA9E4\uA9E7-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,an=i(["ª","º","ƻ",["ǀ","ǃ"],"ʔ",["א","ת"],["װ","ײ"],["ؠ","ؿ"],["ف","ي"],["ٮ","ٯ"],["ٱ","ۓ"],"ە",["ۮ","ۯ"],["ۺ","ۼ"],"ۿ","ܐ",["ܒ","ܯ"],["ݍ","ޥ"],"ޱ",["ߊ","ߪ"],["ࠀ","ࠕ"],["ࡀ","ࡘ"],["ࢠ","ࢴ"],["ऄ","ह"],"ऽ","ॐ",["क़","ॡ"],["ॲ","ঀ"],["অ","ঌ"],["এ","ঐ"],["ও","ন"],["প","র"],"ল",["শ","হ"],"ঽ","ৎ",["ড়","ঢ়"],["য়","ৡ"],["ৰ","ৱ"],["ਅ","ਊ"],["ਏ","ਐ"],["ਓ","ਨ"],["ਪ","ਰ"],["ਲ","ਲ਼"],["ਵ","ਸ਼"],["ਸ","ਹ"],["ਖ਼","ੜ"],"ਫ਼",["ੲ","ੴ"],["અ","ઍ"],["એ","ઑ"],["ઓ","ન"],["પ","ર"],["લ","ળ"],["વ","હ"],"ઽ","ૐ",["ૠ","ૡ"],"ૹ",["ଅ","ଌ"],["ଏ","ଐ"],["ଓ","ନ"],["ପ","ର"],["ଲ","ଳ"],["ଵ","ହ"],"ଽ",["ଡ଼","ଢ଼"],["ୟ","ୡ"],"ୱ","ஃ",["அ","ஊ"],["எ","ஐ"],["ஒ","க"],["ங","ச"],"ஜ",["ஞ","ட"],["ண","த"],["ந","ப"],["ம","ஹ"],"ௐ",["అ","ఌ"],["ఎ","ఐ"],["ఒ","న"],["ప","హ"],"ఽ",["ౘ","ౚ"],["ౠ","ౡ"],["ಅ","ಌ"],["ಎ","ಐ"],["ಒ","ನ"],["ಪ","ಳ"],["ವ","ಹ"],"ಽ","ೞ",["ೠ","ೡ"],["ೱ","ೲ"],["അ","ഌ"],["എ","ഐ"],["ഒ","ഺ"],"ഽ","ൎ",["ൟ","ൡ"],["ൺ","ൿ"],["අ","ඖ"],["ක","න"],["ඳ","ර"],"ල",["ව","ෆ"],["ก","ะ"],["า","ำ"],["เ","ๅ"],["ກ","ຂ"],"ຄ",["ງ","ຈ"],"ຊ","ຍ",["ດ","ທ"],["ນ","ຟ"],["ມ","ຣ"],"ລ","ວ",["ສ","ຫ"],["ອ","ະ"],["າ","ຳ"],"ຽ",["ເ","ໄ"],["ໜ","ໟ"],"ༀ",["ཀ","ཇ"],["ཉ","ཬ"],["ྈ","ྌ"],["က","ဪ"],"ဿ",["ၐ","ၕ"],["ၚ","ၝ"],"ၡ",["ၥ","ၦ"],["ၮ","ၰ"],["ၵ","ႁ"],"ႎ",["ა","ჺ"],["ჽ","ቈ"],["ቊ","ቍ"],["ቐ","ቖ"],"ቘ",["ቚ","ቝ"],["በ","ኈ"],["ኊ","ኍ"],["ነ","ኰ"],["ኲ","ኵ"],["ኸ","ኾ"],"ዀ",["ዂ","ዅ"],["ወ","ዖ"],["ዘ","ጐ"],["ጒ","ጕ"],["ጘ","ፚ"],["ᎀ","ᎏ"],["ᐁ","ᙬ"],["ᙯ","ᙿ"],["ᚁ","ᚚ"],["ᚠ","ᛪ"],["ᛱ","ᛸ"],["ᜀ","ᜌ"],["ᜎ","ᜑ"],["ᜠ","ᜱ"],["ᝀ","ᝑ"],["ᝠ","ᝬ"],["ᝮ","ᝰ"],["ក","ឳ"],"ៜ",["ᠠ","ᡂ"],["ᡄ","ᡷ"],["ᢀ","ᢨ"],"ᢪ",["ᢰ","ᣵ"],["ᤀ","ᤞ"],["ᥐ","ᥭ"],["ᥰ","ᥴ"],["ᦀ","ᦫ"],["ᦰ","ᧉ"],["ᨀ","ᨖ"],["ᨠ","ᩔ"],["ᬅ","ᬳ"],["ᭅ","ᭋ"],["ᮃ","ᮠ"],["ᮮ","ᮯ"],["ᮺ","ᯥ"],["ᰀ","ᰣ"],["ᱍ","ᱏ"],["ᱚ","ᱷ"],["ᳩ","ᳬ"],["ᳮ","ᳱ"],["ᳵ","ᳶ"],["ℵ","ℸ"],["ⴰ","ⵧ"],["ⶀ","ⶖ"],["ⶠ","ⶦ"],["ⶨ","ⶮ"],["ⶰ","ⶶ"],["ⶸ","ⶾ"],["ⷀ","ⷆ"],["ⷈ","ⷎ"],["ⷐ","ⷖ"],["ⷘ","ⷞ"],"〆","〼",["ぁ","ゖ"],"ゟ",["ァ","ヺ"],"ヿ",["ㄅ","ㄭ"],["ㄱ","ㆎ"],["ㆠ","ㆺ"],["ㇰ","ㇿ"],["㐀","䶵"],["一","鿕"],["ꀀ","ꀔ"],["ꀖ","ꒌ"],["ꓐ","ꓷ"],["ꔀ","ꘋ"],["ꘐ","ꘟ"],["ꘪ","ꘫ"],"ꙮ",["ꚠ","ꛥ"],"ꞏ","ꟷ",["ꟻ","ꠁ"],["ꠃ","ꠅ"],["ꠇ","ꠊ"],["ꠌ","ꠢ"],["ꡀ","ꡳ"],["ꢂ","ꢳ"],["ꣲ","ꣷ"],"ꣻ","ꣽ",["ꤊ","ꤥ"],["ꤰ","ꥆ"],["ꥠ","ꥼ"],["ꦄ","ꦲ"],["ꧠ","ꧤ"],["ꧧ","ꧯ"],["ꧺ","ꧾ"],["ꨀ","ꨨ"],["ꩀ","ꩂ"],["ꩄ","ꩋ"],["ꩠ","ꩯ"],["ꩱ","ꩶ"],"ꩺ",["ꩾ","ꪯ"],"ꪱ",["ꪵ","ꪶ"],["ꪹ","ꪽ"],"ꫀ","ꫂ",["ꫛ","ꫜ"],["ꫠ","ꫪ"],"ꫲ",["ꬁ","ꬆ"],["ꬉ","ꬎ"],["ꬑ","ꬖ"],["ꬠ","ꬦ"],["ꬨ","ꬮ"],["ꯀ","ꯢ"],["가","힣"],["ힰ","ퟆ"],["ퟋ","ퟻ"],["豈","舘"],["並","龎"],"יִ",["ײַ","ﬨ"],["שׁ","זּ"],["טּ","לּ"],"מּ",["נּ","סּ"],["ףּ","פּ"],["צּ","ﮱ"],["ﯓ","ﴽ"],["ﵐ","ﶏ"],["ﶒ","ﷇ"],["ﷰ","ﷻ"],["ﹰ","ﹴ"],["ﹶ","ﻼ"],["ヲ","ッ"],["ア","ン"],["ᅠ","ᄒ"],["ᅡ","ᅦ"],["ᅧ","ᅬ"],["ᅭ","ᅲ"],["ᅳ","ᅵ"]],!1,!1),cn=/^[\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]/,pn=i(["Dž","Lj","Nj","Dz",["ᾈ","ᾏ"],["ᾘ","ᾟ"],["ᾨ","ᾯ"],"ᾼ","ῌ","ῼ"],!1,!1),An=/^[A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u037F\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0528\u052A\u052C\u052E\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u13A0-\u13F5\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA698\uA69A\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA796\uA798\uA79A\uA79C\uA79E\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA-\uA7AD\uA7B0-\uA7B4\uA7B6\uFF21-\uFF3A]/,ln=i([["A","Z"],["À","Ö"],["Ø","Þ"],"Ā","Ă","Ą","Ć","Ĉ","Ċ","Č","Ď","Đ","Ē","Ĕ","Ė","Ę","Ě","Ĝ","Ğ","Ġ","Ģ","Ĥ","Ħ","Ĩ","Ī","Ĭ","Į","İ","IJ","Ĵ","Ķ","Ĺ","Ļ","Ľ","Ŀ","Ł","Ń","Ņ","Ň","Ŋ","Ō","Ŏ","Ő","Œ","Ŕ","Ŗ","Ř","Ś","Ŝ","Ş","Š","Ţ","Ť","Ŧ","Ũ","Ū","Ŭ","Ů","Ű","Ų","Ŵ","Ŷ",["Ÿ","Ź"],"Ż","Ž",["Ɓ","Ƃ"],"Ƅ",["Ɔ","Ƈ"],["Ɖ","Ƌ"],["Ǝ","Ƒ"],["Ɠ","Ɣ"],["Ɩ","Ƙ"],["Ɯ","Ɲ"],["Ɵ","Ơ"],"Ƣ","Ƥ",["Ʀ","Ƨ"],"Ʃ","Ƭ",["Ʈ","Ư"],["Ʊ","Ƴ"],"Ƶ",["Ʒ","Ƹ"],"Ƽ","DŽ","LJ","NJ","Ǎ","Ǐ","Ǒ","Ǔ","Ǖ","Ǘ","Ǚ","Ǜ","Ǟ","Ǡ","Ǣ","Ǥ","Ǧ","Ǩ","Ǫ","Ǭ","Ǯ","DZ","Ǵ",["Ƕ","Ǹ"],"Ǻ","Ǽ","Ǿ","Ȁ","Ȃ","Ȅ","Ȇ","Ȉ","Ȋ","Ȍ","Ȏ","Ȑ","Ȓ","Ȕ","Ȗ","Ș","Ț","Ȝ","Ȟ","Ƞ","Ȣ","Ȥ","Ȧ","Ȩ","Ȫ","Ȭ","Ȯ","Ȱ","Ȳ",["Ⱥ","Ȼ"],["Ƚ","Ⱦ"],"Ɂ",["Ƀ","Ɇ"],"Ɉ","Ɋ","Ɍ","Ɏ","Ͱ","Ͳ","Ͷ","Ϳ","Ά",["Έ","Ί"],"Ό",["Ύ","Ώ"],["Α","Ρ"],["Σ","Ϋ"],"Ϗ",["ϒ","ϔ"],"Ϙ","Ϛ","Ϝ","Ϟ","Ϡ","Ϣ","Ϥ","Ϧ","Ϩ","Ϫ","Ϭ","Ϯ","ϴ","Ϸ",["Ϲ","Ϻ"],["Ͻ","Я"],"Ѡ","Ѣ","Ѥ","Ѧ","Ѩ","Ѫ","Ѭ","Ѯ","Ѱ","Ѳ","Ѵ","Ѷ","Ѹ","Ѻ","Ѽ","Ѿ","Ҁ","Ҋ","Ҍ","Ҏ","Ґ","Ғ","Ҕ","Җ","Ҙ","Қ","Ҝ","Ҟ","Ҡ","Ң","Ҥ","Ҧ","Ҩ","Ҫ","Ҭ","Ү","Ұ","Ҳ","Ҵ","Ҷ","Ҹ","Һ","Ҽ","Ҿ",["Ӏ","Ӂ"],"Ӄ","Ӆ","Ӈ","Ӊ","Ӌ","Ӎ","Ӑ","Ӓ","Ӕ","Ӗ","Ә","Ӛ","Ӝ","Ӟ","Ӡ","Ӣ","Ӥ","Ӧ","Ө","Ӫ","Ӭ","Ӯ","Ӱ","Ӳ","Ӵ","Ӷ","Ӹ","Ӻ","Ӽ","Ӿ","Ԁ","Ԃ","Ԅ","Ԇ","Ԉ","Ԋ","Ԍ","Ԏ","Ԑ","Ԓ","Ԕ","Ԗ","Ԙ","Ԛ","Ԝ","Ԟ","Ԡ","Ԣ","Ԥ","Ԧ","Ԩ","Ԫ","Ԭ","Ԯ",["Ա","Ֆ"],["Ⴀ","Ⴥ"],"Ⴧ","Ⴭ",["Ꭰ","Ᏽ"],"Ḁ","Ḃ","Ḅ","Ḇ","Ḉ","Ḋ","Ḍ","Ḏ","Ḑ","Ḓ","Ḕ","Ḗ","Ḙ","Ḛ","Ḝ","Ḟ","Ḡ","Ḣ","Ḥ","Ḧ","Ḩ","Ḫ","Ḭ","Ḯ","Ḱ","Ḳ","Ḵ","Ḷ","Ḹ","Ḻ","Ḽ","Ḿ","Ṁ","Ṃ","Ṅ","Ṇ","Ṉ","Ṋ","Ṍ","Ṏ","Ṑ","Ṓ","Ṕ","Ṗ","Ṙ","Ṛ","Ṝ","Ṟ","Ṡ","Ṣ","Ṥ","Ṧ","Ṩ","Ṫ","Ṭ","Ṯ","Ṱ","Ṳ","Ṵ","Ṷ","Ṹ","Ṻ","Ṽ","Ṿ","Ẁ","Ẃ","Ẅ","Ẇ","Ẉ","Ẋ","Ẍ","Ẏ","Ẑ","Ẓ","Ẕ","ẞ","Ạ","Ả","Ấ","Ầ","Ẩ","Ẫ","Ậ","Ắ","Ằ","Ẳ","Ẵ","Ặ","Ẹ","Ẻ","Ẽ","Ế","Ề","Ể","Ễ","Ệ","Ỉ","Ị","Ọ","Ỏ","Ố","Ồ","Ổ","Ỗ","Ộ","Ớ","Ờ","Ở","Ỡ","Ợ","Ụ","Ủ","Ứ","Ừ","Ử","Ữ","Ự","Ỳ","Ỵ","Ỷ","Ỹ","Ỻ","Ỽ","Ỿ",["Ἀ","Ἇ"],["Ἐ","Ἕ"],["Ἠ","Ἧ"],["Ἰ","Ἷ"],["Ὀ","Ὅ"],"Ὑ","Ὓ","Ὕ","Ὗ",["Ὠ","Ὧ"],["Ᾰ","Ά"],["Ὲ","Ή"],["Ῐ","Ί"],["Ῠ","Ῥ"],["Ὸ","Ώ"],"ℂ","ℇ",["ℋ","ℍ"],["ℐ","ℒ"],"ℕ",["ℙ","ℝ"],"ℤ","Ω","ℨ",["K","ℭ"],["ℰ","ℳ"],["ℾ","ℿ"],"ⅅ","Ↄ",["Ⰰ","Ⱞ"],"Ⱡ",["Ɫ","Ɽ"],"Ⱨ","Ⱪ","Ⱬ",["Ɑ","Ɒ"],"Ⱳ","Ⱶ",["Ȿ","Ⲁ"],"Ⲃ","Ⲅ","Ⲇ","Ⲉ","Ⲋ","Ⲍ","Ⲏ","Ⲑ","Ⲓ","Ⲕ","Ⲗ","Ⲙ","Ⲛ","Ⲝ","Ⲟ","Ⲡ","Ⲣ","Ⲥ","Ⲧ","Ⲩ","Ⲫ","Ⲭ","Ⲯ","Ⲱ","Ⲳ","Ⲵ","Ⲷ","Ⲹ","Ⲻ","Ⲽ","Ⲿ","Ⳁ","Ⳃ","Ⳅ","Ⳇ","Ⳉ","Ⳋ","Ⳍ","Ⳏ","Ⳑ","Ⳓ","Ⳕ","Ⳗ","Ⳙ","Ⳛ","Ⳝ","Ⳟ","Ⳡ","Ⳣ","Ⳬ","Ⳮ","Ⳳ","Ꙁ","Ꙃ","Ꙅ","Ꙇ","Ꙉ","Ꙋ","Ꙍ","Ꙏ","Ꙑ","Ꙓ","Ꙕ","Ꙗ","Ꙙ","Ꙛ","Ꙝ","Ꙟ","Ꙡ","Ꙣ","Ꙥ","Ꙧ","Ꙩ","Ꙫ","Ꙭ","Ꚁ","Ꚃ","Ꚅ","Ꚇ","Ꚉ","Ꚋ","Ꚍ","Ꚏ","Ꚑ","Ꚓ","Ꚕ","Ꚗ","Ꚙ","Ꚛ","Ꜣ","Ꜥ","Ꜧ","Ꜩ","Ꜫ","Ꜭ","Ꜯ","Ꜳ","Ꜵ","Ꜷ","Ꜹ","Ꜻ","Ꜽ","Ꜿ","Ꝁ","Ꝃ","Ꝅ","Ꝇ","Ꝉ","Ꝋ","Ꝍ","Ꝏ","Ꝑ","Ꝓ","Ꝕ","Ꝗ","Ꝙ","Ꝛ","Ꝝ","Ꝟ","Ꝡ","Ꝣ","Ꝥ","Ꝧ","Ꝩ","Ꝫ","Ꝭ","Ꝯ","Ꝺ","Ꝼ",["Ᵹ","Ꝿ"],"Ꞁ","Ꞃ","Ꞅ","Ꞇ","Ꞌ","Ɥ","Ꞑ","Ꞓ","Ꞗ","Ꞙ","Ꞛ","Ꞝ","Ꞟ","Ꞡ","Ꞣ","Ꞥ","Ꞧ","Ꞩ",["Ɦ","Ɬ"],["Ʞ","Ꞵ"],"Ꞷ",["A","Z"]],!1,!1),En=/^[\u0903\u093B\u093E-\u0940\u0949-\u094C\u094E-\u094F\u0982-\u0983\u09BE-\u09C0\u09C7-\u09C8\u09CB-\u09CC\u09D7\u0A03\u0A3E-\u0A40\u0A83\u0ABE-\u0AC0\u0AC9\u0ACB-\u0ACC\u0B02-\u0B03\u0B3E\u0B40\u0B47-\u0B48\u0B4B-\u0B4C\u0B57\u0BBE-\u0BBF\u0BC1-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCC\u0BD7\u0C01-\u0C03\u0C41-\u0C44\u0C82-\u0C83\u0CBE\u0CC0-\u0CC4\u0CC7-\u0CC8\u0CCA-\u0CCB\u0CD5-\u0CD6\u0D02-\u0D03\u0D3E-\u0D40\u0D46-\u0D48\u0D4A-\u0D4C\u0D57\u0D82-\u0D83\u0DCF-\u0DD1\u0DD8-\u0DDF\u0DF2-\u0DF3\u0F3E-\u0F3F\u0F7F\u102B-\u102C\u1031\u1038\u103B-\u103C\u1056-\u1057\u1062-\u1064\u1067-\u106D\u1083-\u1084\u1087-\u108C\u108F\u109A-\u109C\u17B6\u17BE-\u17C5\u17C7-\u17C8\u1923-\u1926\u1929-\u192B\u1930-\u1931\u1933-\u1938\u1A19-\u1A1A\u1A55\u1A57\u1A61\u1A63-\u1A64\u1A6D-\u1A72\u1B04\u1B35\u1B3B\u1B3D-\u1B41\u1B43-\u1B44\u1B82\u1BA1\u1BA6-\u1BA7\u1BAA\u1BE7\u1BEA-\u1BEC\u1BEE\u1BF2-\u1BF3\u1C24-\u1C2B\u1C34-\u1C35\u1CE1\u1CF2-\u1CF3\u302E-\u302F\uA823-\uA824\uA827\uA880-\uA881\uA8B4-\uA8C3\uA952-\uA953\uA983\uA9B4-\uA9B5\uA9BA-\uA9BB\uA9BD-\uA9C0\uAA2F-\uAA30\uAA33-\uAA34\uAA4D\uAA7B\uAA7D\uAAEB\uAAEE-\uAAEF\uAAF5\uABE3-\uABE4\uABE6-\uABE7\uABE9-\uABEA\uABEC]/,Cn=i(["ः","ऻ",["ा","ी"],["ॉ","ौ"],["ॎ","ॏ"],["ং","ঃ"],["া","ী"],["ে","ৈ"],["ো","ৌ"],"ৗ","ਃ",["ਾ","ੀ"],"ઃ",["ા","ી"],"ૉ",["ો","ૌ"],["ଂ","ଃ"],"ା","ୀ",["େ","ୈ"],["ୋ","ୌ"],"ୗ",["ா","ி"],["ு","ூ"],["ெ","ை"],["ொ","ௌ"],"ௗ",["ఁ","ః"],["ు","ౄ"],["ಂ","ಃ"],"ಾ",["ೀ","ೄ"],["ೇ","ೈ"],["ೊ","ೋ"],["ೕ","ೖ"],["ം","ഃ"],["ാ","ീ"],["െ","ൈ"],["ൊ","ൌ"],"ൗ",["ං","ඃ"],["ා","ෑ"],["ෘ","ෟ"],["ෲ","ෳ"],["༾","༿"],"ཿ",["ါ","ာ"],"ေ","း",["ျ","ြ"],["ၖ","ၗ"],["ၢ","ၤ"],["ၧ","ၭ"],["ႃ","ႄ"],["ႇ","ႌ"],"ႏ",["ႚ","ႜ"],"ា",["ើ","ៅ"],["ះ","ៈ"],["ᤣ","ᤦ"],["ᤩ","ᤫ"],["ᤰ","ᤱ"],["ᤳ","ᤸ"],["ᨙ","ᨚ"],"ᩕ","ᩗ","ᩡ",["ᩣ","ᩤ"],["ᩭ","ᩲ"],"ᬄ","ᬵ","ᬻ",["ᬽ","ᭁ"],["ᭃ","᭄"],"ᮂ","ᮡ",["ᮦ","ᮧ"],"᮪","ᯧ",["ᯪ","ᯬ"],"ᯮ",["᯲","᯳"],["ᰤ","ᰫ"],["ᰴ","ᰵ"],"᳡",["ᳲ","ᳳ"],["〮","〯"],["ꠣ","ꠤ"],"ꠧ",["ꢀ","ꢁ"],["ꢴ","ꣃ"],["ꥒ","꥓"],"ꦃ",["ꦴ","ꦵ"],["ꦺ","ꦻ"],["ꦽ","꧀"],["ꨯ","ꨰ"],["ꨳ","ꨴ"],"ꩍ","ꩻ","ꩽ","ꫫ",["ꫮ","ꫯ"],"ꫵ",["ꯣ","ꯤ"],["ꯦ","ꯧ"],["ꯩ","ꯪ"],"꯬"],!1,!1),fn=/^[\u0300-\u036F\u0483-\u0487\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E3-\u0902\u093A\u093C\u0941-\u0948\u094D\u0951-\u0957\u0962-\u0963\u0981\u09BC\u09C1-\u09C4\u09CD\u09E2-\u09E3\u0A01-\u0A02\u0A3C\u0A41-\u0A42\u0A47-\u0A48\u0A4B-\u0A4D\u0A51\u0A70-\u0A71\u0A75\u0A81-\u0A82\u0ABC\u0AC1-\u0AC5\u0AC7-\u0AC8\u0ACD\u0AE2-\u0AE3\u0B01\u0B3C\u0B3F\u0B41-\u0B44\u0B4D\u0B56\u0B62-\u0B63\u0B82\u0BC0\u0BCD\u0C00\u0C3E-\u0C40\u0C46-\u0C48\u0C4A-\u0C4D\u0C55-\u0C56\u0C62-\u0C63\u0C81\u0CBC\u0CBF\u0CC6\u0CCC-\u0CCD\u0CE2-\u0CE3\u0D01\u0D41-\u0D44\u0D4D\u0D62-\u0D63\u0DCA\u0DD2-\u0DD4\u0DD6\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB-\u0EBC\u0EC8-\u0ECD\u0F18-\u0F19\u0F35\u0F37\u0F39\u0F71-\u0F7E\u0F80-\u0F84\u0F86-\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102D-\u1030\u1032-\u1037\u1039-\u103A\u103D-\u103E\u1058-\u1059\u105E-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108D\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17B4-\u17B5\u17B7-\u17BD\u17C6\u17C9-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193B\u1A17-\u1A18\u1A1B\u1A56\u1A58-\u1A5E\u1A60\u1A62\u1A65-\u1A6C\u1A73-\u1A7C\u1A7F\u1AB0-\u1ABD\u1B00-\u1B03\u1B34\u1B36-\u1B3A\u1B3C\u1B42\u1B6B-\u1B73\u1B80-\u1B81\u1BA2-\u1BA5\u1BA8-\u1BA9\u1BAB-\u1BAD\u1BE6\u1BE8-\u1BE9\u1BED\u1BEF-\u1BF1\u1C2C-\u1C33\u1C36-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE0\u1CE2-\u1CE8\u1CED\u1CF4\u1CF8-\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302D\u3099-\u309A\uA66F\uA674-\uA67D\uA69E-\uA69F\uA6F0-\uA6F1\uA802\uA806\uA80B\uA825-\uA826\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA951\uA980-\uA982\uA9B3\uA9B6-\uA9B9\uA9BC\uA9E5\uAA29-\uAA2E\uAA31-\uAA32\uAA35-\uAA36\uAA43\uAA4C\uAA7C\uAAB0\uAAB2-\uAAB4\uAAB7-\uAAB8\uAABE-\uAABF\uAAC1\uAAEC-\uAAED\uAAF6\uABE5\uABE8\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2F]/,Fn=i([["̀","ͯ"],["҃","҇"],["֑","ֽ"],"ֿ",["ׁ","ׂ"],["ׄ","ׅ"],"ׇ",["ؐ","ؚ"],["ً","ٟ"],"ٰ",["ۖ","ۜ"],["۟","ۤ"],["ۧ","ۨ"],["۪","ۭ"],"ܑ",["ܰ","݊"],["ަ","ް"],["߫","߳"],["ࠖ","࠙"],["ࠛ","ࠣ"],["ࠥ","ࠧ"],["ࠩ","࠭"],["࡙","࡛"],["ࣣ","ं"],"ऺ","़",["ु","ै"],"्",["॑","ॗ"],["ॢ","ॣ"],"ঁ","়",["ু","ৄ"],"্",["ৢ","ৣ"],["ਁ","ਂ"],"਼",["ੁ","ੂ"],["ੇ","ੈ"],["ੋ","੍"],"ੑ",["ੰ","ੱ"],"ੵ",["ઁ","ં"],"઼",["ુ","ૅ"],["ે","ૈ"],"્",["ૢ","ૣ"],"ଁ","଼","ି",["ୁ","ୄ"],"୍","ୖ",["ୢ","ୣ"],"ஂ","ீ","்","ఀ",["ా","ీ"],["ె","ై"],["ొ","్"],["ౕ","ౖ"],["ౢ","ౣ"],"ಁ","಼","ಿ","ೆ",["ೌ","್"],["ೢ","ೣ"],"ഁ",["ു","ൄ"],"്",["ൢ","ൣ"],"්",["ි","ු"],"ූ","ั",["ิ","ฺ"],["็","๎"],"ັ",["ິ","ູ"],["ົ","ຼ"],["່","ໍ"],["༘","༙"],"༵","༷","༹",["ཱ","ཾ"],["ྀ","྄"],["྆","྇"],["ྍ","ྗ"],["ྙ","ྼ"],"࿆",["ိ","ူ"],["ဲ","့"],["္","်"],["ွ","ှ"],["ၘ","ၙ"],["ၞ","ၠ"],["ၱ","ၴ"],"ႂ",["ႅ","ႆ"],"ႍ","ႝ",["፝","፟"],["ᜒ","᜔"],["ᜲ","᜴"],["ᝒ","ᝓ"],["ᝲ","ᝳ"],["឴","឵"],["ិ","ួ"],"ំ",["៉","៓"],"៝",["᠋","᠍"],"ᢩ",["ᤠ","ᤢ"],["ᤧ","ᤨ"],"ᤲ",["᤹","᤻"],["ᨗ","ᨘ"],"ᨛ","ᩖ",["ᩘ","ᩞ"],"᩠","ᩢ",["ᩥ","ᩬ"],["ᩳ","᩼"],"᩿",["᪰","᪽"],["ᬀ","ᬃ"],"᬴",["ᬶ","ᬺ"],"ᬼ","ᭂ",["᭫","᭳"],["ᮀ","ᮁ"],["ᮢ","ᮥ"],["ᮨ","ᮩ"],["᮫","ᮭ"],"᯦",["ᯨ","ᯩ"],"ᯭ",["ᯯ","ᯱ"],["ᰬ","ᰳ"],["ᰶ","᰷"],["᳐","᳒"],["᳔","᳠"],["᳢","᳨"],"᳭","᳴",["᳸","᳹"],["᷀","᷵"],["᷼","᷿"],["⃐","⃜"],"⃡",["⃥","⃰"],["⳯","⳱"],"⵿",["ⷠ","ⷿ"],["〪","〭"],["゙","゚"],"꙯",["ꙴ","꙽"],["ꚞ","ꚟ"],["꛰","꛱"],"ꠂ","꠆","ꠋ",["ꠥ","ꠦ"],"꣄",["꣠","꣱"],["ꤦ","꤭"],["ꥇ","ꥑ"],["ꦀ","ꦂ"],"꦳",["ꦶ","ꦹ"],"ꦼ","ꧥ",["ꨩ","ꨮ"],["ꨱ","ꨲ"],["ꨵ","ꨶ"],"ꩃ","ꩌ","ꩼ","ꪰ",["ꪲ","ꪴ"],["ꪷ","ꪸ"],["ꪾ","꪿"],"꫁",["ꫬ","ꫭ"],"꫶","ꯥ","ꯨ","꯭","ﬞ",["︀","️"],["︠","︯"]],!1,!1),dn=/^[0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]/,hn=i([["0","9"],["٠","٩"],["۰","۹"],["߀","߉"],["०","९"],["০","৯"],["੦","੯"],["૦","૯"],["୦","୯"],["௦","௯"],["౦","౯"],["೦","೯"],["൦","൯"],["෦","෯"],["๐","๙"],["໐","໙"],["༠","༩"],["၀","၉"],["႐","႙"],["០","៩"],["᠐","᠙"],["᥆","᥏"],["᧐","᧙"],["᪀","᪉"],["᪐","᪙"],["᭐","᭙"],["᮰","᮹"],["᱀","᱉"],["᱐","᱙"],["꘠","꘩"],["꣐","꣙"],["꤀","꤉"],["꧐","꧙"],["꧰","꧹"],["꩐","꩙"],["꯰","꯹"],["0","9"]],!1,!1),gn=/^[\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]/,Dn=i([["ᛮ","ᛰ"],["Ⅰ","ↂ"],["ↅ","ↈ"],"〇",["〡","〩"],["〸","〺"],["ꛦ","ꛯ"]],!1,!1),Bn=/^[_\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F]/,vn=i(["_",["‿","⁀"],"⁔",["︳","︴"],["﹍","﹏"],"_"],!1,!1),mn=/^[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/,bn=i([" "," "," ",[" "," "]," "," "," "],!1,!1),xn="break",Pn=s("break",!1),_n="case",yn=s("case",!1),$n="catch",Rn=s("catch",!1),kn="class",Sn=s("class",!1),In="const",On=s("const",!1),jn="continue",Ln=s("continue",!1),wn="debugger",Tn=s("debugger",!1),Nn="default",Un=s("default",!1),Hn="delete",qn=s("delete",!1),zn="do",Mn=s("do",!1),Gn="else",Vn=s("else",!1),Yn="enum",Wn=s("enum",!1),Xn="export",Jn=s("export",!1),Zn="extends",Kn=s("extends",!1),Qn="false",uo=s("false",!1),eo="finally",to=s("finally",!1),ro="for",no=s("for",!1),oo="function",so=s("function",!1),io="if",ao=s("if",!1),co="import",po=s("import",!1),Ao="instanceof",lo=s("instanceof",!1),Eo="in",Co=s("in",!1),fo="new",Fo=s("new",!1),ho="null",go=s("null",!1),Do="return",Bo=s("return",!1),vo="super",mo=s("super",!1),bo="switch",xo=s("switch",!1),Po="this",_o=s("this",!1),yo="throw",$o=s("throw",!1),Ro="true",ko=s("true",!1),So="try",Io=s("try",!1),Oo="typeof",jo=s("typeof",!1),Lo="var",wo=s("var",!1),To="void",No=s("void",!1),Uo="while",Ho=s("while",!1),qo="with",zo=s("with",!1),Mo=";",Go=s(";",!1),Vo=0,Yo=0,Wo=[{ -line:1,column:1}],Xo=0,Jo=[],Zo=0;if("startRule"in e){if(!(e.startRule in he))throw new Error("Can't start parsing from rule \""+e.startRule+'".');ge=he[e.startRule]}var Ko={$:"text","&":"simple_and","!":"simple_not"},Qo={"?":"optional","*":"zero_or_more","+":"one_or_more"},us={"&":"semantic_and","!":"semantic_not"};if(Fe=ge(),Fe!==de&&Vo===u.length)return Fe;throw Fe!==de&&Vo0){for(e=1,t=1;e